วันนี้เราจะมาคุยกันเรื่องการเชื่อมต่อระหว่าง Raspberry Pi กับ Arduino กันครับ
เริ่มต้นกันที่ Raspberry Pi กับ บอร์ด Arduino มันต่างกันอย่างไรนะครับ Raspberry Pi คือ คอมพิวเตอร์ราคาประหยัดที่รัฐบาลและบริษัทเอกชนในสหราชอาณาจักร หรือ ประเทศอังกฤษ ออกแบบขึ้นเพื่อให้มีการเรียนรู้การเขียนโปรแกรมบนคอมพิวเตอร์กันมากๆ เพราะเชื่อกันว่าเทคโนโลยีทั้งหลายในโลกอนาคตเป็นกุญแจสำคัญในการพัฒนาประเทศ การพัฒนาเยาวชนให้ฝึกฝนการเขียนโปรแกรมเป็นพื้นฐานที่เขาให้ความสำคัญครับ นีจึงเป็นที่มาของคอมพิวเตอร์ราคาประหยัดที่มีเป้าหมายให้เข้าถึงคนที่ต้องการใช้งานให้ได้มากที่สุด เน้นที่ราคาประหยัด ใครจะคิดครับว่าคอมพิวเตอร์เครื่องนึงราคาแค่ พันกว่าบาท สามารถทำงานได้เหมือนคอมพิวเตอร์ที่เป็น Windows based หรือ Mac OS
อย่างที่ว่าครับ Raspberry Pi ก็น้องๆ PC ละครับ แต่ใช้ OS ที่มีการพัฒนาต่อมาจาก Linux ก็เลยเรียกว่า Raspbian ครับ เจ้า Raspbian ก็อย่างที่เขียนบทความไปก่อนหน้านี้ครับ สามารถใช้ชุดโปรแกรมภาษา Python C++ Arduino IDE มีชุดโปรแกรมที่คล้าย Office มี internet browser มีช่องต่อ USB เพื่อใช้งานต่อกับอุปกรณ์ภายนอก มี Port GPIO ช่องต่อ HDMI และที่สำคัญคือ Software และ OS ต่างๆ ฟรี!!!
ทีนี้ Arduino ละครับ มันคือ Microcontroller ที่ทำงานได้เฉพาะอย่างตามโปรแกรมที่เราเขียนไว้ ไม่มี OS ในตัว ออกแบบมาให้มีราคาประหยัด ขนาดเล็ก ไม่ต้องการอุปกรณ์เพิ่มเติมที่ใช้ในการ Upload Sketch นอกจากนี้ยังมี Port ที่ใช้ติดต่อกับ Sensor ต่างๆ ภายนอกจำนวนมาก (มากกว่า RPi) มีโปรโตคอลต่างๆ ที่เป็นมาตรฐานในการติดต่อกับ Hardware ภายนอก เช่น I2C SPI UART มาให้ครบ มีทั้ง Digital และ Analog Port ที่สำคัญคือทำงานเฉพาะอย่างแบบซ้ำได้เร็วกว่า RPi ครับ ยกตัวอย่างเช่นการควบคุมแบบตามเวลาจริง (Real Time Control) แบบนี้ Arduino จะเหมาะสมกว่า RPi ครับ เพราะแต่ละรอบที่ทำงานจะเร็วกว่า RPi อยู่พอสมควร นอกจากนี้ยังออกแบบมาให้มีระบบป้องกันการการจ่ายกระแสเกิน แรงดันเกินได้ดีกว่า RPi (เรียกว่าทนทานกว่าว่างั้น)
ตอนแรกที่ Raspberry Pi ออกมา ก็นึกกันไปว่า Arduino จะสูณพันธ์ุซะแล้ว แต่เวลาผ่านไปทุกๆคนในวงการก็รู้แล้วครับว่ามันคนละประเภทการใช้งาน เปรียบเทียบกันยากแบบที่ฝรั่งชอบบอกว่า Apple and Orange นั่นแหละครับ
ข้อเด่นที่สำคัญอีกอย่างของ Arduino ก็คือการมีคนสนใจมากมายทั่วโลก ทำให้มีผู้ผลิตสารพัด Shield ออกมาให้ใช้ (คิดว่าคงเป็นพันแบบแล้วครับ)
" คำถามครับ ผมอยากเขียนโปรแกรมด้วย Python บน Raspberry Pi แถมต้องการเอาสัญญาณ Analog มาใช้ด้วย แถมอยากจะใช้สารพัด Shield ของ Arduino เช่น GSM Shiedl, GPS Shield, Bluetooth/Xbee จะทำยังไง!!! "
คนที่อยากใช้ RPi แต่ก็อยากใช้ Shield สารพัดที่ว่าของ Arduino ก็เลยปิ๊งไอเดียนี้ขึ้นมาครับ "Raspberry Pi to Arduino Shield"
ต้นตำหรับของอุปกรณ์ตัวนี้ Raspberry Pi to Arduino Shield คือ Cooking Hacks ครับ แต่ก็มีหลายๆ เจ้าเอาไปผลิตโดยใช้ไอเดียคล้ายกัน ทำให้ราคาลดลงมาอีกเกือบครึ่ง และวันนี้เราจะมาสาธิตการใช้งานกันแบบเบื้องต้นกันครับ (มันเป็นเรื่องค่อนข้างยาว ก็เลยจะแบบเป็นหลายๆตอนนะครับ) ก็จะเกี่ยวกับอุปกรณ์ที่ต้องใช้ การลงโปรแกรมที่จำเป็น การ Compile และการ run โปแกรมเบื้องต้นที่เขียนขึ้นมา
เริ่มจากอุปกรณ์ที่ใช้กันก่อนครับ
1. Raspberry Pi (Element14 made in UK Version 2) Model B
ในเว็บของ Cooking Hacks เข้าเขียนให้ข้อมูลว่า ArduPi library ของเขาจะใช้กับ Raspberry Pi Board Version 1.0 หรือ 2.0 ก็ได้ครับ แต่ผมจะเขียนสาธิตการใช้ Board Version 2.0 นะครับ โดยมีข้อสังเกตตามรูปครับ คือ มีรูเจาะเพื่อใช้กรณีต้องการยึดให้แน่น มีคำว่า P5 ใต้บอร์ด ข้างๆ ช่อง SD card และเขียนว่า Made in UK ถ้าใช้ Board ที่ต่างจากนี้ก็ลองถามหาคนขายดูครับ ว่าจะใช้กันได้รึเปล่ากับ Raspberry Pi 2 Arduino Shield
2. USB Adapterแบบ 1.2 A ขึ้นไปนะครับ อย่างที่เน้นกันทุกครั้งว่าขอ Adapter แบบแรงๆ หน่อยครับ ถ้าใช้แบบขนาดจิ๋วๆ หรือแบบที่ไม่ได้คุณภาพ อาจจะส่งผลต่อการทำงานของ RPi เดี่ยวติด เดี๋ยวดับได้
3. USB Wifi dongle เพื่อใช้ต่อเข้า Internet เพื่อใช้ Update หรือ Download โปรแกรมที่จำเป็นและใช้แบบ Remote Desktop (ถ้าต้องการ) หรือจะใช้แบบสาย LAN ก็ได้นะครับ Model A ใช้ไม่ได้นะครับ ไม่มีช่องต่อ Internet
เอาละครับ คราวนี้ก็ต้องเดือดร้อนไปหา USB Hub แบบมีช่องให้ต่อ Power supply อีกครับ แต่ผมมีวิธีใหม่มานำเสนอ (ขอขายของนิดนึง)
เราสามารถใช้ USB Port ทีมีแค่ 2 port เท่านั้นก็เพียงพอครับ ถ้าใช้กับ Wireless Keyboard และ Mouse ตัวนี้ มีภาษาไทยด้วยนะ แถมเอาไปใช้งานกับระบบ Windows MacOS เวลานำเสนองาน หรือใช้กับ Android box ก็ได้ครับ
5. แน่นอนครับต้องมี Raspberry Pi to Arduino Shield จะเห็นว่าหน้าตาจริงๆแล้วก็คล้ายๆ Shield ทั่วๆไปของ Arduino รุ่น UNO R3 โดยเราสามารถเอา Shield อื่นๆมาซ้อนขึ้นไปเป็นชั้นๆ ได้เพื่อติดต่อกับ RPi ครับ
6. ถ้าสังเกตในรูปแรกสุด จะไม่เห็น SD Card ที่ใช้กับ Raspberry Pi ใช่มั้ยครับ จริงๆ แล้วเราใช้ MicroSD card คู่กับ MicroSD Card Adapter ใช้ตัวนี้แล้วจะไม่เห็น SD Card ยื่นออกมาจากตัว Raspberry Pi ครับ เวลาติดตั้งหน้างานจะเรียบร้อย สมเป็นมืออาชีพขึ้นหน่อย
คราวนี้มาดูวิธีการติดตั้งกันครับ
1. เริ่มต้นจากการลง Raspbian OS กันนนะครับ ที่ใช้ในการสาธิตนี้ผมใช้ Raspbian Version 1.3.4 โดยใช้คู่กับการทำ Remote Desktop ซึ่งติดตั้งตามบทความครั้งก่อนที่เขียนไว้ในเว็บ Arduitronics.com ครับ
2. Download Library arduPi_rev2 -- การติดต่อกับ Shield ของ Arduino จาก Raspberry Pi นั้น รายละเอียดจากนี้ไป จะเห็นว่าเราเขียนโปรแกรมผ่าน Editor ที่มีมาให้กับ Raspbian ชื่อ Leafpad นะครับ โดยจะเป็นการแทรก Sketch ทั้งหมดที่เขียนบน Arduino IDE มาไว้ในไฟล์โปรแกรม .cpp แล้วค่อย complie โดยทั้งหมดนี้จะใช้ Library ที่ชื่อ arduPi_rev2 มาเพื่ออ่าน Sketch ของ Arduino ทำให้ผู้ใช้งานไม่ต้องเขียน Sketch ใหม่บน Raspberry Pi
อย่างที่บอกครับตัว Raspberry Pi ที่ขายในร้าน Arduitronics ของเราเป็น Version 2.0 ทดสอบการใช้งานแล้วว่าเข้ากันได้กับ Library arduPi 2.0 ให้ Download จากที่นี่ เลยครับ (การใช้งานบอร์ดที่แตกต่างจากนี้ อาจจะต้องใช้ Library อื่นๆครับ)
Download มาแล้วก็ unzip แล้วเก็บไฟล์ไว้ใน folder เดียวกันนะครับ โดยผมเก็บไว้บน Desktop เลยจะได้หาง่ายๆ เริ่มต้นจะมีไฟล์มาให้ 3 ไฟล์ ได้แก่ arduPi.cpp , arduPi_template.cpp และ arduPi.h
3. จากนั้นเราต้องมา Enable UART Port กันก่อน เนื่องจาก Raspberry Pi to Arduino Shield ตัวนี้สื้่อสารกันด้วย UART ของ Raspberry Pi ครับ ขั้นตอนจะยุ่งหน่อยนะครับ แต่ถ้าใครเปิด Web Arduitronics ของเราหน้านี้บน Browser ที่มีบน Raspbian เลยก็จะสามารถ Copy ไปวางได้เลยครับ
ทุกอย่างที่เป็นการพิมพ์คำสั่งต่อไปนี้ ให้ทำบน LXTerminal นะครับ โดยต้องใช้ Sudo นำหน้า เพราะเราต้องติดต่อกับ Hardware ภายนอก และแก้ไขไฟล์สำคัญในระบบปฏิบัติการ
3.1 เริ่มจากการแก้ไขไฟล์ cmdline กันก่อน แต่ก่อนอื่น ไฟล์นี้เป็นไฟล์ที่สำคัญครับ เราจึงแนะนำให้ สร้างไฟล์ backup ไว้ก่อน
sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
3.2 เปิดไฟล์ cmdline.txt โดยใช้ nano
sudo nano /boot/cmdline.txt
จะเห็นข้อความประมาณแบบนี้ครับ
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mcblk0p6 rootfstype=ext4 elevator=deadline rootwait
ให้แก้ไขโดยลบเฉพาะ console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 ทิ้งซึ่งส่วนที่ลบไปนี้เป็นการประกาศใช้ UART tty0 (เราจะใช้ tty1 ครับ) โดยจะเหลือ
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mcblk0p6 rootfstype=ext4 elevator=deadline rootwait
แก้เสร็จแล้วกด crtl+x เพื่อ save และออกจากโปรแกรมนะครับ
3.3 จากนั้นเปิดอีกไฟล์ด้วยคำสั่งนี้ครับ
sudo nano /etc/inittab
จะเห็นข้อความหลายบรรทัดเลยครับ ให้ไปบรรทัดสุดท้ายเลย แล้วใส่ Comment โดยใช้ # เพิ่มไว้ที่เริ่มต้นของบรรทัดแบบนี้ครับ
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
เสร็จแล้วกด crtl+x เพื่อ save และออกจากโปรแกรมนะครับ
3.4 จบตรงนี้ให้ reboot ครับ
sudo reboot
คราวนี้มาถึงขั้นตอนการเขียนโปรแกรม การ compile และการสั่ง run โปรแกรมละครับ
เริ่มต้นจากการย้าย directory ไปที่ folder arduPi ที่เรา download มาครับ อันนี้แล้วแต่ที่ตำแหน่งของ Folder นะครับ ใช้คำสั่ง cd Desktop/ardupi_rev2 ก็หมายถึงให้ย้าย directory ไปที่ Desktop/ardupi_rev2 ครับ
จากนั้นสร้างไฟล์ที่ใช้ในการ run เพื่อเรียก Library กันก่อน ด้วยคำสั่ง
g++ -c arduPi.cpp -o arduPi.o
ซึ่งจะสร้างไฟล์ arduPi.o ไว้ใน folder เดียวกันครับ
ทีนี้มาถึงการเขียนโปรแกรมกันละครับ
อย่างที่บอกไปตอนแรกครับ การใช้ Raspberry Pi to Arduino Shield นั้น เราจะเขียนโปรแกรมบน Raspbian นะครับ โดยเอา Sketch ที่เรามีอยู่แล้วใน Arduino IDE ไปแทรกในไฟล์ ซึ่งโครงสร้างของตัวโปรแกรมที่จะต้อง Run บน Raspbian เพื่อใช้งาน Raspberry Pi to Arduino Shield หน้าตาจะเป็นแบบนี้ครับ
|
เวลาเราเขียนโปรแกรม ก็จะแทรกไว้ที่ตำแหน่งที่ Highlight สีเหลืองครับ ส่วนอื่นๆ ห้ามลบเลยนะครับ เพราะเป็นองค์ประกอบสำคัญที่ใช้เรียก Library ของ arduPi_rev2
ตัวอย่างนี้เราต้องการใช้ blink.ino ใน Arduino มา Run ด้วย Raspberry Pi to Arduino Shield นะครับ ก็ง่ายๆ ครับ copy มาเลยจาก blink ใน Arduino IDE
//Include arduPi library#include "arduPi.h"//Needed for Serial communicationSerialPi Serial;//Needed for accesing GPIO (pinMode, digitalWrite, digitalRead, i2C functions)WirePi Wire;//Needed for SPISPIPi SPI;//*********************************************************int led = 8;// the setup routine runs once when you press reset:void setup() {// initialize the digital pin as an output.pinMode(led, OUTPUT);}// the loop routine runs over and over again forever:void loop() {digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)delay(1000); // wait for a seconddigitalWrite(led, LOW); // turn the LED off by making the voltage LOWdelay(1000); // wait for a second}//********************************************************int main (){setup();while(1){loop();}return (0);} |
ทีนี้ให้สังเกตนะครับ ว่าส่วนที่ High light ไว้คือตัว Sketch ที่มาจาก Arduino Sketch เลย นี่หมายความว่าเราไม่ต้องเขียนโปรแกรมใหม่ทั้งหมด (อย่างน้อยก็ไม่ต้องเริ่มต้นจากศูนย์ในกรณีที่เราเคยเขียนบน Arduino IDE แล้ว) สำหรับโปรแกรมด้านบนก็เป็นเพียงการสั่งให้ LED ที่ PIN 8 ติดดับสลับกันทุกๆ 1000 ms ครับ
ให้สังเกตนะครับว่าการใช้งาน Digital in/out Pin นั้นจะใช้งานได้ตั้งแต่ D2 - D9 นะครับ สำหรับ D10 D-13 จะใช้ในการสื่อสารแบบ SPI ทำให้ไม่สามารถเรียกใช้งานได้ตามแบบที่ Arduino UNO R3 สามารถทำได้ ตรงนี้ทำให้จำนวน PIN ลดลงครับ
อย่างไรก็ตามมันก็ยังมีข้อจำกัดครับ ไม่ใช่ว่าจะเอามาแล้วใช้ได้ทุกอย่าง ตัว Library ของ Raspberry Pi to Arduino Shield ที่ชื่อ arduPi_rev2 นั้นมีคำสั่งที่ Raspberry เข้าใจและใช้งานได้ทันทีตามรายการต่อไปนี้ครับ
General Arduino functions:
[*] We can detect RISING and FALLING interrupts. Any digital pin (from 2 to 13) can be used in attachInterrupt(). So for example if we want to be aware of RISING events on pin 6 we can do attachInterrupt(6,function_to_call,RISING).
จะเห็นว่าเป็นคำสั่งพิ้นฐานที่จำเป็นต้องมีสำหรับการเขียนโปรแกรมใช้งานทั่วไป แต่ทางผู้เขียน Library ก็มีการพัฒนาต่อเนื่องให้มีฟังก์ชั่นให้ใช้ได้มากขึ้นนะครับ อันนี้ต้องคอย update version กันเรื่อยๆ
ก่อนที่จะไป Run Program กัน เราลองใช้ LED กับตัวต้านทาน มาต่อเพื่อทดสอบการสั่งงาน Digital IN/OUT Pin กันครับ ตรงนี้ก็ไม่มีอะไรซับซ้อน แค่เอา LED มาต่ออนุกรมกับตัวต้านทานซัก 500 - 1k โอห์ม กันครับ อย่าลืมต่อตัวต้านทานนะครับ อาจจะทำให้ไม่บอร์ดก็ RPi พังไดั เนื่องจากจ่ายกระแสเกิน
ถ้าจำไม่ได้ว่าตัวต้านทานมีแถบสีอะไรบ้าง ลองดูเว็บนี้ครับ
http://www.csgnetwork.com/resistcolcalc.html
เสร็จแล้วสำหรับตัว Program ที่จะใช้นะครับ ต่อไปเราก็ต้องมา Compile และ Run กัน
วิธีสร้าง executable file นะครับ
ให้ใช้คำสั่งตามนี้เพื่อสร้าง executable file
g++ -lrt -lpthread my_program.cpp arduPi.o -o my_program
ตรงที่ High light ไว้ให้เปลี่ยนเป็นชื่อไฟล์ที่ตั้งไว้ตอนเขียนโปรแกรมนะครับ ส่วน Output ของการ Compile ก็เปลี่ยนเป็นชื่ออื่นๆ ก็ได้ครับ
ถ้าทุกอย่างถูกต้อง เขียนโปรแกรมแล้วไม่มี error ก็จะได้ไฟล์ออกมาเป็น executable file ซึ่งเราจะใช้เรียกตอน Run ครับ
จากนั้นลอง Run Program ดูด้วยคำสั่ง
sudo ./my_program
อย่าลืมนะครับ ว่าตอนนี้เราเปิดสั่งการทำงานบน LXTerminal โดยเปลียนไปที่ Directory ที่เก็บไฟล์ทั้งหมดไว้ด้วยกัน
เรียบร้อยครับ ถ้า LED กระพริบก็เป็นอันว่าเสร็จสมบูรณ์ แต่ถ้าไม่ ลองตรวจสอบดังต่อไปนี้ครับ
1. การแก้ไขไฟล์ที่มีระบุไว้ข้างต้น ได้เขียนอย่างถูกต้องรึเปล่า มีสะกดผิดรึเปล่า และได้ Save ไว้แล้ว รึยัง
2. LED ที่ต่อกลับด้านรึเปล่า มีค่าความต้านทานเยอะไปรึเปล่า หรือว่าเสียบถูก Pin รึเปล่า
3. เลือก Swtich ทีอยู่บนบอร์ดไปด้าน Inside รึยัง (เพราะว่าเราไม่ได้จ่ายแรงดันภายนอกนะครับ)
เสร็จแล้วครับ สำหรับสัปดาห์นี้ ผมต้องขอออกตัวอีกครั้งนะครับ เดี๋ยวจะหาว่าเขียนแต่เรื่องง่ายๆ เราจะเริ่มต้นด้วยพื้นฐานการติดต่อกับ Digital Pin กันก่อน จากนั้นอาจจะค่อยๆ ขยับไปที่การใช้งาน Analog Input ของตัวบอร์ดกันครับ เนื่องจาก Raspberry Pi ไม่มี Analog Pin ก็เลยต้องมีอุปกรณ์เสริมกันหน่อยครับ
วันนี้พอแค่นี้ครับ ถ้ามีข้อสงสัย เสนอแนะ หรือ คำถามก็ยินดีนะครับ
Link อื่นที่น่าสนใจ
http://www.cooking-hacks.com/blog/raspberry-pi-to-arduino-shields-connection-bridge-review
โดย Mountain A
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,375,832 ครั้ง |
ผู้ชมทั้งหมด | 5,878,910 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 6 ก.ย. 2568 |