การใช้ Bluetooth module HC-05 สื่อสารระหว่าง RaspberryPI กับ Arduino ภาค 2

ในภาคแรกผมได้สร้าง Master กับ Slave Bluetooth เรียบร้อย มาภาคนี้จะเป็นนำมาทดลองใช้งานกัน โดย ผมจะใช้ Master ต่อกับ Raspberry PI แล้ว Slave ต่อกับ Arduino Nano ที่ให้ Master อยุ่ที่ Raspberry PI ก็เพื่อที่จะได้เขียนโปรแกรมควบคุมตัว Arduino ผ่าน Bluetooth ได้ง่ายครับ การสร้างระบบนี้ผมใช้ Raspberry PI ที่ติดตั้ง Rasbian ครับ (distro อื่นอาจมีรายละเอียดต่างออกไปบ้างแต่หลักการยังคงเหมือนกัน)





Raspberry PIHC-05
Pin 8 (TX)RX
Pin 10 (RX)TX
Pin 6 (GRD)GRD
Pin 1 (3.3V)VCC


Arduino NanoHC-05
Pin 1 (TX)RX
Pin 2 (RX) TX
GRDGRD
3.3VVCC


ในกรณีนี้ผมเลือกใช้ pin TX,RX เพราะผมต้องการใช้ Hardware Serial หากท่านต้องการใช้ SoftwareSerial ก็ใช้ได้ครับ (ศึกษาต่อได้ที่ [1])

เตรียม Raspberry PI

การนำเอา HC-05 มาต่อกับ Raspberry PI  เสร็จแล้วจะยังไม่สามารถใช้งานได้ทันทีต้องทำการเปลี่ยนแปลงบางอย่างก่อนเพราะค่าที่ตั้งมาครั้งแรกจะไม่อนุญาตให้ Raspbery PI สื่อสารแบบ Serial ผ่าน GPIO

เปิดทางให้ GPIO [2]


1. แก้ไข /boot/cmdline.txt โดยการนำเอาข้อความนี้ออกไป

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

ผมแนะนำคือการลอกคำสั่งเดิมมาทั้งหมดก่อน แล้วทำ remark ไว้ แก้ไขตัวสำเนา แล้วบันทึกลงไปอีกบรรทัดหนึ่ง จะปลอดภัยกว่า และใน Rasbian รุ่นใหม่ ข้อความ kgdboc=ttyAMA0, 115200 จะไม่มีแล้ว

2. แก้ไข /etc/inittab
ทำการ remark บรรทัดนี้ครับ

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
 

3.sudo reboot

 หลายท่านคงทราบแล้วว่า การใช้งาน Bluetooth ด้วย Python เรานิยมใช้ BlueZ [2] แต่ในกรณีนี้ python bluez จะใช้ไม่ได้ครับ เพราะ python bluez จะหาตัว Bluetooth ไม่พบ (เราต่อผ่าน GPIO ไม่ใช่ Bluetooth dongle) ดังนั้นเราจะใช้งาน pyserial แทนครับ

ติดตั้ง pyserial

1. ท่านสามารถใช้คำสั่ง sudo apt-get update แล้วตามด้วย sudo apt-get upgrade แล้วระบบก็จะทำการติดตั้ง pyserial และ update ส่วนอื่น ๆ ไปพร้อมกัน หรือ

2. ติดตั้งตามขั้นตอนนี้ [3]

 

สร้าง python code


import serial
import time

hc_05 = serial.Serial('/dev/ttyAMA0',9600,timeout=3)
hc_05.open()

try:
  while True:
     txt = raw_input("Enter your message :")
     hc_05.write(txt)
     resp=hc_05.readline()
     print resp
except KeyboardInterrupt:
  hc_05.close()


ตัวอย่างนี้เป็นโปรแกรมสำหรับทดสอบโดยการส่งข้อความออกไป รอ echo ข้อความกลับมา แล้วพิมพ์บนหน้าจอ และไม่ได้มีส่วนป้องกันข้อผิดพลาด (error detection)


hc_05 = serial.Serial('/dev/ttyAMA0',9600,timeout=3)

สร้างตัวแปร hc_05 สำหรับสื่อสารผ่าน serial port ผ่าน file device  /dev/ttyAMA0 โดยมี baudrate ที่ 9600 และ timeout ในการพยายาม establish การติดต่อเป็น 3 วินาที



เตรียม Arduino

 ทาง Arduino นี้จะเป็นการรับข้อความเข้ามาผ่าน Serial.read() แล้วนำไปสร้างเป็น String จากนั้นก็นำส่งกลับไปยังผู้ส่งด้วยคำสั่ง Serial.print() ใน code นี้ผมได้สร้างเงื่อนไขเพื่อให้ Arduino ทราบว่าจะหยุดการอ่านได้เมื่อไหร่โดยการกำหนดให้อ่านไปจนกว่าจะพบ '!' (ท่านอาจจะไม่ต้องทำแบบนี้ก็ได้)


String cmd="";

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly: 

  if(Serial.available()){
    char c = Serial.read();
    while(c != '!'){
      cmd+=c;
      c=Serial.read();
    }
    Serial.print(cmd);
    cmd="";
 }
 
 delay(100);
}

การเรียกใช้งานโปรแกรม

เราสามารถเรียกใช้งานฝั่งไหนก่อนก็ได้ โดยฝั่ง Arduino ผมใช้ Serial Monitor ของ Arduino IDE มาช่วย และการเรียกใช้งานฝั่ง Raspberry PI เราจำเป็นต้องใช้ศักดิ์เป็น root (เพราะยังไม่ได้ add user pi ให้ใช้งาน Serial port ได้)

 


 

 

สิ่งที่ควรทราบก่อน

1. HC-05 จะทำการ Bind กันเองทันทีเมื่อได้รับพลังงานหรือไฟเลี้ยงโดยอัตโนมัติ ซึ่งเราต้องสังเกตุจากการกระพริบของ LED บน HC-05 จะเป็นจังหวะดังภาพ หากยังไม่มีการ Binding เกิดขึ้น LED จะกระพริบถี่มากกว่านี้




2. โปรแกรมนี้จะทำงานได้ก็ต้องให้ Bluetooth ทั้งสอง ทำการ Bind กันให้เรียบร้อยเสียก่อนเท่านั้น

3. อ้างจากข้อมูลผู้ผลิต HC-05 มี range of connection ไม่เกิน 33 ฟุต (เวลาใช้งานจริงอาจจะน้อยกว่านี้ เพราะอาจมีสิ่งกีดขวางทำให้ประสิทธิภาพการส่งคลื่นลดลงได้)

4. หลักการนี้น่าจะใช้ได้กับ HC-06 หรือ model อื่น ๆ ได้เช่นกัน

5. การสร้างระบบแบบนี้จะเป็นผูก Mac Address ของ Bluetooth เข้าไว้ที่ Master ดังนั้นชิ้นที่เป็น Master จะไม่สามารถนำไปใช้ติดต่อกับ Bluetooth อื่นได้อีก นอกจากจะไปแก้ด้วย AT- Commmandที่ตัว Master

6. วิธีการนี้ไม่สามารถทดแทน Bluetooth Dongle ได้ทุกกรณี เพราะเราจะไม่สามารถใช้ Service อื่นที่ Bluetooth รองรับ เช่น การ share File  เป็นต้น



7. HC-06  จะเป็น Slave ได้อย่างเดียว ไม่สามารถทำเป็น Master ได้
 

ความคิดเห็น