HC06 เป็นโมดูล Bluetooth ที่ใช้งานในการเชื่อมต่อกับสมาร์ทดีไวซ์ต่างๆ ให้สมาร์ทดีไวซ์สามารถสื่อสารกับไมโครคอนโทรเลอร์ (Arduino AVR PIC etc.) ได้ ผ่าน Serial port โมดูลรุ่น HC06 สามารถตั้งให้ใช้งานเป็นได้ทั้งโหมด Master (ให้อุปกรณ์อื่นมาเชื่อมต่อ) และโหมด Slave (เชื่อมต่อกับอุปกรณ์อื่น) การตั้งค่าต่างๆ เช่น ชื่ออุปกรณ์ รหัสผ่าน ทำได้ผ่าน AT Command ซึ่งจะต้องมีการต่อขาพิเศษเพื่อให้โมดูลเข้าโหมดการตั้งค่า หรือกดปุ่มบนโมดูลค้างไว้
HC06 เป็นโมดูล Bluetooth ที่รองรับกับอุปกรณ์ส่วนใหญ่ในปัจจุบัน (05/08/2558) มีเพียง IPhone ที่ไม่สามารถใช้งานได้ เนื่องจาก IPhone ใช้ Bluetooth เวอร์ชั่น 4.0 ต้องใช้งานโมดูล HM-10 แทน ซึ่งเป็นโมดูล Bluetooth 4.0 จึงจะสามารถนำมาใช้งานกับ IPhone ได้
เริ่มต้นใช้งาน HC05 จะแบ่งออกเป็น 2 ส่วน คือ
โมดูล HC05 ใช้การสื่อสารผ่าน Serial port กรณีที่มีโมดูล USB TTL to UART อยู่แล้ว สามารถนำมาต่อใช้งานเข้ากับโมดูลได้เลย โดยโมดูลใช้แหล่งจ่ายไฟที่ 5V แต่ขา Tx ของโมดูล USB TTL to UART จะต้องมีการต่อวงจรเพื่อดรอปแรงดันลง เนื่องจากโมดูล HC05 ทำงานที่แรงดันไฟฟ้า 3.3V แต่ขา Tx ของโมดูล USB TTL to UART มีแรงดันไฟฟ้าที่ 5V หากนำมาเชื่อมต่อกันโดยตรงอาจทำให้โมดูลพังเสียหายได้
#include
SoftwareSerial mySerial(0, 1); // RX, TX
void setup()
{
Serial.begin(38400);
while (!Serial) ;
mySerial.begin(38400);
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
การใชังานร่วมกับ Appinventor
#define DL1 8
#define DL2 7
#define PWML 6
#define DR1 9
#define DR2 4
#define PWMR 5
/////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600); ///////// อ่านซีเรียลมอนิเตอร์ ที่ 9600
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(PWML, OUTPUT);
pinMode(DR1, OUTPUT);
pinMode(DR2, OUTPUT);
pinMode(PWMR, OUTPUT);
}
/////////////////////////////////////////////////////////////////////////////////
void loop()
{
if(Serial.available()>0);
{ char x = Serial.read();
if (x == 'F') {run(100,100);} /// รับค่าคำสั่ง F เดินหน้า
if (x == 'B'){run(-100,-100);} /// รับค่าคำสั่ง B ถอยหลัง
if (x == 'R') {run(100,-100);} /// รับค่าคำสั่ง R เลี้ยวขวา
if (x == 'L') {run(-100,100);} /// รับค่าคำสั่ง L เลี้ยวซ้าย
if (x == 'S') {run(0,0);} /// รับค่าคำสั่ง S หยุด
}}
/////////////////////////////////////////////
void run(int spl,int spr)
{
if(spl>0)
{
digitalWrite(DL1, LOW);
digitalWrite(DL2, HIGH);
analogWrite(PWML, spl);
}
else if(spl<0)
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, LOW);
analogWrite(PWML, -spl);
}
else
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, HIGH);
analogWrite(PWMR, -255);
}
///////////////////
if(spr>0)
{
digitalWrite(DR1, LOW);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, spr);
}
else if(spr<0)
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, LOW);
analogWrite(PWMR, -spr);
}
else
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, -255);
}
}
/////// motor R //////// LookBas (TKL SHOP)
#define DR2 7 ///
#define DR1 8 ///
#define PWMR 6 ///
/////// motor L ////////
#define DL2 4 ///
#define DL1 9 ///
#define PWML 5 ///
#include <Servo.h>
///////////////ตั้งพอร์ตเซอร์โว////////////////////////////////
int servo1 = 10; // เปิดใช้งาน s1 ที่พอร์ต 10 zackrobot & 7 kruroRobot
int servo2 = 3; // เปิดใช้งาน s1 ที่พอร์ต 11 & 8
Servo sv1; // ประกาศการใช้งาน sv1
Servo sv2; // ประกาศการใช้งาน sv2
#define SERVO1min 0
#define SERVO1max 80
#define SERVO2min 60
#define SERVO2max 140
int V_SERVO1 = 0;
int V_SERVO2 = 120;
////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600); ///////// อ่านซีเรียลมอนิเตอร์ ที่ 9600
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(PWML, OUTPUT);
pinMode(DR1, OUTPUT);
pinMode(DR2, OUTPUT);
pinMode(PWMR, OUTPUT);
///////////// ตั้งพอร์ตเซอร์โว////////////
sv1.attach(servo1); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv1
sv2.attach(servo2); // เรียกใช้งานเตรียมตอบสนองเซอร์โว sv2
sv1.write(V_SERVO1);
sv2.write(V_SERVO2);
}
/////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (Serial.available() > 0);
{ char x = Serial.read();
if (x == 'F') {
run(200, 200); /// รับค่าคำสั่ง F เดินหน้า
}
if (x == 'T') {
run(150, 150); /// รับค่าคำสั่ง T เดินหน้า
}
if (x == 'B') {
run(-130, -130); /// รับค่าคำสั่ง B ถอยหลัง
}
if (x == 'R') {
run(130, -130); /// รับค่าคำสั่ง R เลี้ยวขวา
}
if (x == 'L') {
run(-150, 150); /// รับค่าคำสั่ง L เลี้ยวซ้าย
}
if (x == 'S') {
run(0, 0); /// รับค่าคำสั่ง S หยุด
}
//////////////////////////////////ฟังชั่นเสริม/////////////////////////////////////////
if(x == 'U') { ///ยก
if (V_SERVO1>SERVO1max) {sv1.write(SERVO1max);}
else { V_SERVO1=V_SERVO1+20 ;
sv1.write(V_SERVO1); }
}
if(x == 'D') { ///วาง
if (V_SERVO1<SERVO1min) {sv1.write(SERVO1min);}
else { V_SERVO1=V_SERVO1-20 ;
sv1.write(V_SERVO1); }
}
/////////////////////////////////////////////////////////////////////////////////////
if(x == 'P') { ///ปล่อย
if (V_SERVO2>SERVO2max) {sv2.write(SERVO2max);}
else { V_SERVO2=V_SERVO2+13 ;
sv2.write(V_SERVO2); }
}
if(x == 'K') { ///คีบ
if (V_SERVO2<SERVO2min) {sv2.write(SERVO2min);}
else { V_SERVO2=V_SERVO2-13;
sv2.write(V_SERVO2); }
}
}
}
/////////////////////////////////////////////
void run(int spl, int spr)
{
if (spl > 0)
{
digitalWrite(DL1, LOW);
digitalWrite(DL2, HIGH);
analogWrite(PWML, spl);
}
else if (spl < 0)
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, LOW);
analogWrite(PWML, -spl);
}
else
{
digitalWrite(DL1, HIGH);
digitalWrite(DL2, HIGH);
analogWrite(PWMR, -255);
}
/////////////////////////////////////////////
if (spr > 0)
{
digitalWrite(DR1, LOW);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, spr);
}
else if (spr < 0)
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, LOW);
analogWrite(PWMR, -spr);
}
else
{
digitalWrite(DR1, HIGH);
digitalWrite(DR2, HIGH);
analogWrite(PWMR, -255);
}
}
App Inventor เป็นเครื่องมือที่ใช้สำหรับสร้างแอพพลิเคชันสำหรับสมาร์ทโฟนและแท็บเล็ตที่เป็นระบบปฏิบัติการ Android ซึ่งบริษัท Google ร่วมมือกับ MIT พัฒนาโปรแกรม App inventor ขึ้น ต่อมา Google ถอนตัวออกมาและยกให้ MIT พัฒนาต่อเอง (โดยเน้นกลุ่มผู้ใช้ด้านการศึกษามากกว่า) ในนาม MIT App inventor
App inventor ใช้หลักการคล้ายๆ กับ Scratch แต่ซับซ้อนกว่า โดยลักษณะการเขียนโปรแกรมแบบ Visual Programming คือ เขียนโปรแกรมด้วยการต่อบล็อกคำสั่ง เน้นการออกแบบเพื่อแก้ปัญหา (problem solving) ด้วยการสร้างโปรแกรมที่ผู้เรียนสนใจ บนโทรศัพท์มือถือสมาร์ทโฟน (สมัยนี้สมาร์ทโฟนใช้กันทั่วไปอยู่แล้ว โดยเฉพาะเด็กวัยรุ่น)
App inventor จึงเป็นอีกโปรแกรมหนึ่ง ที่เหมาะสำหรับใช้ในการสอนเขียนโปรแกรม ให้นักเรียนในระดับมัธยมปลาย หรือระดับมหาวิทยาลัย โดยเฉพาะผู้ที่ไม่เคยเขียนโปรแกรมมาก่อนหรือไม่ได้เรียนอยู่ในสายคอมพิวเตอร์
การเขียนโปรแกรมบนสมาร์ทโฟนและแท็บเล็ต Android ด้วย App inventor ในภาพรวมแสดงได้ตามรูปล่างนี้
App Inventor servers เป็นเครื่องที่ให้บริการและเก็บงานโปรเจกต่างๆ ที่ผู้ใช้สร้างขึ้นมา ผู้ใช้พัฒนาโปรแกรมมือถือ Android โดยสร้างโปรเจกและเขียนโปรแกรมบนเว็บเบราว์เซอร์ ที่เชื่อมต่อไปยัง App Inventor servers เมื่อได้โปรแกรมมา ก็สามารถทดสอบกับโปรแกรมมือถือจำลอง (Android emulator) หรือโทรศัพท์มือถือ Android จริงๆ ก็ได้
ขั้นตอนการสร้างโปรแกรม (ตามภาพ) เริ่มจากออกแบบหน้าตาโปรแกรมบนมือถือ ด้วยโปรแกรม App Inventor Designer ซึ่งใช้สำหรับสร้างส่วนโปรแกรมต่างๆ (components) เพื่อใช้งานในโปรแกรมมือถือที่จะสร้างขึ้น
จากนั้นเขียนโปรแกรมให้แต่ละส่วนโปรแกรม ด้วยโปรแกรม App Inventor Blocks Editor ซึ่งใช้วิธีการต่อบล็อกคำสั่ง เพื่อให้ส่วนโปรแกรมนั้นๆ ทำหน้าที่ของมัน ตามที่ออกแบบเอาไว้
ระหว่างเขียนโปรแกรม อาจมีการแก้ไข เพิ่มเติม หรือลบบางส่วนโปรแกรมออกไป ทำให้ต้องแก้ไขโปรแกรม (debug) จนกว่าจะได้โปรแกรมตามที่ออกแบบไว้ เมื่อทุกส่วนโปรแกรมถูกสร้างเสร็จแล้ว ก็ได้เวลาทดสอบการใช้งาน โดยการติดตั้งโปรแกรมลงไปบนมือถือ Android แล้วทดสอบการใช้งานผ่านมือถือจริงๆ แต่ถ้าไม่มีมือถือ ก็ยังสามารถทดสอบได้ ผ่านโปรแกรมมือถือจำลอง (Android emulator) ในคอมพิวเตอร์แทน