จากตอนที่แล้ว (คลิก) เราสามารถที่จะติดต่อ และเข้าใช้ Raspberry Pi ผ่านทาง Serial Communication ของ บอร์ด Raspberry Pi แล้ว ซึ่งในการพัฒนาโปรแกรม บางครั้งเราจะต้องทำการติดต่อกับอุปกรณ์ภายนอกบอร์ด Raspberry Pi ผ่านทาง Serial Communication เช่น ถ้าเราต้องการให้ Raspberry Pi ทำการอ่านค่า GPS module ซึ่งต้องการ การสื่อสารผ่าน UART นั้น เราก็จำเป็นที่จะต้องพัฒนาโปรแกรมให้เรียกความสามารถของ Serial Port มาใช้งาน
สำหรับระบบ Device File (ถ้ามีโอกาสจะได้มาอธิบายอีกที) ของ Raspberry Pi แล้ว Serial Port ของมันจะมองเป็น /dev/ttyAMA0 นั่นเป็นตำแหน่งไฟล์ที่จัดการเกี่ยวกับการรับส่งข้อมูล แบบ Serial Communication ถ้าจะเปรียบเทียบกับ windows แล้ว /dev/ttyAMA0 ก็เปรียบเสมือน COM1, COM2,.... นั่นเอง ซึ่งเรามักใช้เป็นตัวอ้างอิงในการติดต่อสื่อสารแบบ Serial Communiction แบบ Asyncronous หรือที่เราเข้าใจว่า ติดต่อแบบ RS232 นั่นแหละ
อ้างอิงกลับไปตอนที่แล้ว เราสามารถเรียกใช้งาน console ผ่าน Serial Port ของ raspberry Pi ได้ ซึ่งหากเราต้องการที่จะใช้ Serial Port ของ Raspberry Pi เพื่อไปติดต่อ รับส่งข้อมูล กับ Device อื่นๆ เช่น GPS module หรือบอร์ดไมโครคอนโทรลเลอร์ Arduino (ซึ่งจะได้ทดลองต่อไปในอนาคต) เราจะต้องทำการปิดช่องทางการ login ผ่าน serial port ตัวนี้เสียก่อน โดยเข้าไปแก้ไขไฟล์ /etc/inittab
คำสั่ง sudo nano /etc/inittab
จากนั้นมองหาบรรทัดล่างสุดที่เขียนว่า T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 ให้ทำการคอมเม้นต์ด้วยเครื่องหมาย "#" จะได้
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
ขอบคุณแหล่งข้อมูลจาก http://codeandlife.com
ทำการบันทึกไฟล์ และ reboot ระบบก่อน 1 คร้่ง (ด้วยคำสั่ง sudo reboot)
เมื่อเราทราบตำแหน่งที่จะติดต่อกับ Raspberry Pi แบบ Serial แล้ว ต่อไป เราก็ต้องมองหา library หรือภาษาที่จะใช้พัฒนาโปรแกรม ในทีนี้ ผมจะขอยกตัวอย่างการใช้ python package ตัวหนึ่ง ซึ่งชื่อ python-serial ในการพัฒนาโปรแกรมสำหรับติดต่อกับ Serial Port ซึ่งสำหรับ Debian แล้ว เราสามารถติดตั้ง package นี้ ได้ด้วยคำสั่ง
sudo apt-get install python-serial
รอสักครู่จนโปรแกรมติดตั้งเสร็จ จากนั้น ตรวจสอบว่า python ของเรา สามารถที่จะเรียก package นี้เข้ามาทำงานได้จริง โดยเราจะทดสอบด้วยการเรียก python interpreter แล้วจึงทำการ import serial package เข้ามาร่วมด้วย
เรียก python interpreter ด้วยคำสั่ง
sudo python
>>>import serial
>>>dir(serial)
ถ้า python แสดงรายละเอียดของ package นี้ได้ ก็แสดงว่าเราสามารถเรียกใช้ python-serial ได้ แล้วก็จะสามารถพัฒนาโปรแกรมสำหรับติดต่อ Serial Port ของ Raspberry Pi ได้เช่นกัน (ขึ้นอยู่กับความสามารถทาง Python Programming ของเราแล้วหล่ะ)
ต่อมา เราก็มาทำการทดสอบโปรแกรมง่ายๆ เพื่อติดต่อสื่อสารผ่าน Serial Port ของ Raspberry Pi ด้วยภาษาไพธอนก่อน จากตอนที่แล้ว ผมได้ใช้ UCON-UART ของบริษัท Inex ในการติดต่อสื่อสารแบบ RS232 ไปแล้ว (หากมีโอกาส จะได้ลองติดต่อกับ GPS module ต่อไป) มาในตอนนี้ ก็ยังน่าจะใช้ UCON-UART เหมือนเดิม เพื่อให้เกิดความแน่ใจก่อนว่า python-serial สามารถที่จะส่งข้อมูลออกทาง Serial Port ของ Raspberry Pi ได้จริง ทำการต่อวงจรเหมือนเดิมครับ
ใช้คำสั่ง nano rs232.py เพื่อสร้างไฟล์โค๊ด python ของเรา
#! /usr/bin/python
import serial
import string
ser = serial.Serial('/dev/ttyAMA0',115200,timeout=1)
ser.open()
ser.write('What do you want to send\n')
def readLine(ser):
str = ""
while 1:
ch = ser.read(1)
if(ch == '\n' or ch == '\r' or ch == ''):
break
str += ch
#"print "str = " + str
return str
while True:
line = readLine(ser)
try:
if line == 'stop':
print 'stop communication'
print 'Good bye!!!'
ser.close()
break
else:
if len(line) > 0:
ser.write(line + '\n')
line = ''
except KeyboardInterrupt:
ser.close()
print 'Good bye!!!'
raise
บันทึกไฟล์แล้วแล้วเปลี่ยนโหมดให้สามารถ execute ได้ด้วยคำสั่ง sudo chmod 755 rs232.py
ทางฝั่งคอมพิวเตอร์ของเรา มองหาโปรแกรมที่รับส่งข้อมูลผ่าน Serial Communication ในที่นี้ ผมใช้ Serial Monitor ที่ติดมากับ Arduino IDE กำหนด BaudRate 115200 แล้วกำหนดให้มีการส่ง newline แนบท้ายข้อความที่เราส่งไปด้วย จากนั้น กลับที่ Raspberry Pi แล้วรันโปรแกรมที่เราได้พิมพ์ไป ด้วยคำสั่ง sudo ./rs232.py
ทางฝั่ง Raspberry Pi จะรอรับตัวอักษรจากคอมพิวเตอร์ของเรา
ส่วนทางฝั่งคอมพิวเตอร์จะปรากฏข้อความ "What do you want to send" ที่ Serial Monitor
ทดลองพิมพ์ข้อความจาก Serial Monitor ไปหา Raspberry Pi จากนั้นจะปรากฏข้อความที่เราพิมพ์ไปแล้วกลับมาที่ Serial Monitor (ฝั่งรับข้อมูล) หากต้องการหยุดการสื่อสาร Serial Communication ให้เราพิมพ์คำว่า stop โปรแกรมทางฝั่ง Raspberry Pi จะหยุดการเชื่อมต่อ และปิด serial port
จากตัวอย่างนี้ เราสามารถนำไปประยุกต์เพื่อให้ Raspberry Pi ติดต่อกับ Device อื่นๆ ที่มีรูปแบบการสื่อสารแบบ UART ได้
สำหรับวันนี้ สวัสดีครับ
2 ความคิดเห็น:
สวัสดีครับ พอดีผมอยากจะให้ Raspberry pi ติดต่อกับตัว gps ตัวนี้ครับ http://www.spelecshop.com/1402480/324729/GPS-Module-SKM55.html
ซึ่งตัวนี้ผมได้ตัดหัว ps2 ออกทางเว็บบอกว่าสามารถติดต่อได้ทาง ttl แะล rs232 ผมเองได้ทำการเลือก ttl และทำการต่อสายเข้าที่ gpio ของ raspberry pi แล้วทำการเรียกผ่าน /dev/ttyAMA0 โดยทำตาม Tutorial นี้http://blog.retep.org/2012/06/18/getting-gps-to-work-on-a-raspberry-pi/ แต่มันก็ขึ้นแบบนี้ครับ
$ cgps
┌───────────────────────────────────────────┐┌─────────────────────────────────┐
│ Time: n/a ││PRN: Elev: Azim: SNR: Used: │
│ Latitude: n/a ││ │
│ Longitude: n/a ││ │
│ Altitude: n/a ││ │
│ Speed: n/a ││ │
│ Heading: n/a ││ │
│ Climb: n/a ││ │
│ Status: NO FIX (0 secs) ││ │
│ Longitude Err: n/a ││ │
│ Latitude Err: n/a ││ │
│ Altitude Err: n/a ││ │
│ Course Err: n/a ││ │
│ Speed Err: n/a ││ │
│ Time offset: n/a ││ │
│ Grid Square: n/a ││ │
└───────────────────────────────────────────┘└─────────────────────────────────┘
{"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,"scaled":false,"timing":false}
cgps: GPS timeout
ขึ้นแบบนี้ตลอดเลยครับ
ผมว่า อันดับแรก ลองให้มั่นใจก่อนว่า GPS ที่ว่านี้ทำงานได้จริง ลองทำบน windows ก่อนครับ ถ้ามันส่งข้อมูลออกมาจริง ที่เหลือก็ไม่ยากครับ
Post a Comment