IOT RPI DAY2 - Burapha Universitynutthanon/... · แนว‡ดในการ…ฒนา...
Transcript of IOT RPI DAY2 - Burapha Universitynutthanon/... · แนว‡ดในการ…ฒนา...
What is Raspberry PI ? ราสเบอรี่ไพ (Raspberry PI) คอมพิวเตอร์จิ๋วที่หลายคนรู้จัก เนื่องด้วยประสิทธิภาพของมันเทียบกับราคาบวกกับแรงผลักดันจากวงการ IT และการพูดถึงของบริษัทยักใหญ่ มีการซื้อแจกให้วงการศึกษา รวมไปถึงถูกนำไปสร้างเป็นโปรเจคออกมามากมาย ทำให้บอร์ดราสเบอรี่ไพ ดังถล่มทลาย ด้วยว่าเจ้าคอมพิวเตอร์จิ๋วราสเบอรี่ไพ มีอินเทอร์เฟซที่เหมาะสมกับการทำคอมพิวเตอร์ขนาดเล็กอยู่แล้ว ทำให้หลายที่นำมาใช้เป็นสื่อการเรียนการสอนด้านคอมพิวเตอร์ จากระดับล่างจนถึงระดับสูง
Raspberry PI 2 Model B ?
•A 900MHz quad-core ARM Cortex-A7 CPU (~6x performance) •1GB LPDDR2 SDRAM (2x memory) •Complete compatibility with Raspberry Pi 1
Raspberry PI 2 Model B ?
เพราะอัพเดตุ สถาปัตยกรรมเป็น ARMv7 จึงให้ให้การเลือกซอฟต์แวร์ติดตั้งมีตัวเลือกมากขึ้นเช่น Ubuntu, Snappy Ubuntu หรือแม้แต่ Window 10
ข้อดีของบอร์ด Raspberry PI
- ราคาถูก - ติดตั้งง่าย - หาซื้อได้ง่าย - เรียนรู้ Embedded Linux ได้ง่ายเนื่องจากมี Resource เยอะ - ซอฟต์แวร์มีการอัพเดตุตลอดเวลา และบางส่วนสเถียรภาพสูงมาก - เป็นบอร์ดที่มีประสิทธิภาพในการเล่นวีดีโอได้ถึง 1080p@30fps ที่ราคาถูกที่สุดในท้องตลอด
ข้อเสียของบอร์ด Raspberry PI
- Broadcom ไม่เปิด datasheet
- ตัวบอร์ดใช้ SD Card เป็น media ในการ boot อาจจะไม่เหมาะกับงานที่ต้องการความ stable สูง
- community ปลูกฝังให้เริ่มต้นง่ายๆ แต่ขัดกับหลักการนำออกไปสร้างผลิตภัณฑ์จริงหลายอย่าง
SOC (System On Chip)is defined as integration of several Architectural level systems into a single chip !หัวใจสำคัญของ Raspberry PI คือ SoC ในที่นี้ ใช้ของบริษัท Broadcom
ทำไมต้อง Linux ในปัจจุบันการพัฒนางานทางด้าน Embedded System เพื่อให้ได้สำเร็จตามจุดมุ่งหมายและทำชิ้นงานให้เสร็จทันในเวลาที่มีการแข่งขันกันสูง รวมถึงเทคโนโลยีที่มีความก้าวหน้าไป ทุกวันเป็นเหตุจำเป็นให้ ความสำคัญของ Embedded Linux มีมากขึ้น เรื่อยๆ Linux ด้วยความที่เป็น Open source หมายความว่าเราสามารถปรับแต่แก้ไขซอฟแวร์ขนาดไหนก็ได้ และใช้ภายใต้เงื่อนไขของ GPL และด้วยความช่วยเหนือจาก community ทั่วโลกทำให้ภายในเวลาที่จำกัดเราจะสามารถได้ผลิตภัณฑ์ที่เทียบเท่าระดับสากลได้ในราคาซอฟแวร์ที่ฟรี ที่ Linux เป็นที่นิยมสำหรับระบบปฏิบัติการ Embedded System สาเหตุที่สำคัญอีกข้อหนึ่งมากจาก ดีไวซ์ไดรเวอร์ที่สามารถใช้กับอุปกรณ์ส่วนใหญ่ได้ง่าย เวลามีการย้ายผ่าน ซอฟแวร์จาก แพลตฟอร์มหนึ่งไปยังอีกแพลตฟอร์มหนึ่งกระทำได้โดยง่าย กว่าการเขียนเฟริมแวร์ตั้งแต่เริ่มต้น
สถาปัตยกรรมเบื้องต้นของ Embedded Linux
โดยทั่วไปสถาปัตยกรรมของ Embedded Linux จะเหมือน Linux ครับแต่แตกต่างกันที่การ custom เพื่อให้เหมาะสมกับระบบนั้นๆ ใน Embedded Linux เราจะใช้ซอฟแวร์น้อยแต่เพื่อให้เกิดประโยชน์สูงสุด
สถาปัตยกรรม Linuxโดยปกติจะแบ่งออกได้หลายแบบแล้วแต่มุมมองของผู้แบ่งลำดับชั้นของสถาปัตยกรรม แต่ในคอร์สนี้เราขอแบ่งเป็นสามส่วนหลักๆ เราเรียกว่าส่วนของ 1. User Space
User Space คือส่วนที่เราจะพัฒนาซอฟแวร์ระดับ Application เพื่อใช้งานเช่น GUI หรือระบบ ควบคุมต่างๆ จะกระทำที่ UserSpace ทั้งหมดโดยที่ User Space สามารถไปควบคุมการ ทำงานของ Device Driver ที่อยู่ใน Linux Kernel ได้อีกทีผ่าน system call interface 2. Linux Kernel หัวใจที่สำคัญที่สุดของระบบปฏิบัติการ Linux โดยจะมีหน้า ที่ในการควบคุมดีไวซ์ไดรเวอร์ แกนกลางของระบบปฏิบัติการ และคอยควบคุมการทำงานของ User Space 3. Hardware ฮาร์ดแวร์ต่างๆ ที่ถูกควบคุมด้วย Linux Kernel อีกทีเช่น GPIO, USB, ETHERNET ....
Distribution ที่แนะนำสำหรับ Raspberry PIเป็น Official support จาก Raspberry PI ครับมีชื่อว่า Raspbain OS
Image ที่ใช้วันนี้ Download ได้ที่www.raspberrypi.org
Tool ที่ใช้ติดตั้งระบบปฏิบัติการของ Raspberry PI บน Window มีชื่อว่า Win32 Disk Imager
1. เลือก Image ของ Raspberry PI 2. เลือก Device ที่ต้องการจะลง 3. กด Write
Tool ที่ใช้ติดตั้งระบบปฏิบัติการของ Raspberry PI บน Window มีชื่อว่า Win32 Disk Imager
1. เลือก Image ของ Raspberry PI 2. เลือก Device ที่ต้องการจะลง 3. กด Write
แนวคิดในการพัฒนา Raspberry PI คอร์สนี้
เริ่มจาก configuration static IP ให้กับ Raspberry PI ก่อนเพื่อรู้ IP ที่แน่นอน และจะเข้าไปตั้งค่า Raspberry PI ได้ตามที่ต้องการ
192.168.10.50192.168.10.1
Config IP address for Raspberry PI
• โดยปกติ Raspberry PI จะได้รับ IP address ผ่าน DHCP Protocol ซึ่งเป็นค่า default จากระบบปฏิบัติการ
• แต่วันนี้เราจะตั้งค่า static ip ให้กับบอร์ด เพื่อความสะดวกในการพัฒนา
ต่อมาเราต้องตั้งค่า IP address ให้ Raspberry PI
IP ADDRESS192.168.10.10
IP ADDRESS 192.168.10.50
** ตัวอย่าง IP Address ที่มีแนวคิดจะใช้เท่านั้น
วิธีการตั้งค่า IP Address บน Raspberry PI มีวิธีอะไรบ้าง ตัวอย่างเช่น
- การนำ Raspberry PI เสียบคีย์บอร์ดเสียบจอแล้วคอนฟิก IP- Config โดยการต่อ Usb to Serial ไปที่ Raspberry PI- แก้ไขไฟล์ System ตรงๆผ่าน SD Card โดยใช้ Linux Host- แก้ไขไฟล์ cmdline.txt บน SD Card< - เราจะใช้วิธีนี้กันครับ
วิธีแก้โดยการใส่ ip address ไปที่ cmdline.txt• เสียบ SD Card ไปบนคอมพิวเตอร์
• เปิดไฟล์ cmdline.txt
• ใส่ IP ADDRESS ต่อไปนี้ต่อท้ายข้อมูลเก่าตัวอย่างเช่น elevator=deadline rootwait ip=192.168.10.50
วิธีแก้โดยการใส่ ip address ไปที่ cmdline.txt
ข้อควรระวังบน Window ไม่ควรใช้ notepad แก้เพราะมีปัญหาเรื่อง การเว้นบรรทัดให้ใช้ editor ตัวอื่นเช่น notepad++
ทดลอง Boot Raspberry PI กันเลย
- นำ SD Card ที่เปลี่ยน IP Address แล้วติดตั้งไปที่ Raspberry PI - เสียบสาย Micro USB เพื่อจ่ายพลังงานให้กับ Raspberry PI - ทดลอง PING ไปที่ Ip address ของ Raspberry PI เพื่อเป็นการยืนยัน ว่าการแก้ไข ip address ของเราถูกต้อง
การเข้าหน้า console ของ Raspberry PI
ในการจัดการระบบปฏิบัติการ Linux การทำงานผ่านหน้า console โดยการใช้ command line เป็นวิธีการที่ สะดวกรวดเร็ว การเชื่อมต่อ Raspberry PI จะกระทำผ่าน โพรโตคอลที่เรียกว่า Secure Shell V2 หรือเรียกตัวย่อว่า SSH
การเข้าหน้า console ของ Raspberry PI
การเชื่อมต่อ Raspberry PI จะกระทำผ่านโพรโตคอลที่เรียกว่า Secure Shell V2 หรือเรียกตัวย่อว่า SSH
mRemote NG Software สำหรับ access raspberry PI
ในกรณีที่ไม่สามารถติดตั้ง mRemoteNG ได้ให้ใช้ ซอฟแวร์ putty.exe ที่ทางเราเตรียมไว้ให้แทน
SSH เข้าไปที่ Raspberry PI บน Window โดยใช้ mRemote NG
1. เมื่อเปิดโปรแกรมขึ้นมา ให้สร้าง Connection ขึ้นมาใหม่ โดยกดที่ icon “New connection”
SSH เข้าไปที่ Raspberry PI บน Window โดยใช้ mRemote NG
2. ตั้งค่าในหน้าต่าง Config โดยให้ HostnameIP เป็น IP ของ Raspberry Pi Username: pi และ Password : raspberry และเลือก Protocol เป็น SSH version 2
How to console RPI With Mac or Linux
ssh 192.168.10.50 -l pi บน Mac นั้นจะมีโปรแกรม ssh ฝังอยู่ใน Terminal อยู่แล้วสามารถเรียกใช้งานได้เลย โดย เปิด Terminal และ ใช้คำสั่ง ssh 192.168.10.50 -l pi หลังจาก นั้น Raspberry pi จะขึ้นมาให้ใส่ Password จึงใส่ “raspberry” โดยตอนใส่ password จะไม่มีการแสดงตัวหนังสือใดๆ เมื่อสามารถ เข้า console ของ Raspberry pi ได้สำเร็จ จะแสดงผลดังนี้
ทดลองพิมพ์คำสั่งแรกบน Raspberry PI
df -h
ลองดูขนาดของ rootfs แล้วลองดูว่าครั้งแรกหลังจากลงระบบปฏิบัติการบน Raspberry PI SD Card จะเหลือ ขนาดเท่าไร ?
Expand FileSystem
สังเกตุว่าขนาดของ พื้นที่น้อยกว่า ขนาดของ SD card เราสามารถทำการ Expand ขนาดของพื้นที่ให้เต็มความจุของ SD card ได้ โดย พิมพ์คำสั่ง sudo raspi-config และเลือกที่หัวข้อ Expand Filesystem จากนั้น เลื่อนไปที่ <Finish> Raspberry pi จะทำการ reboot ใหม่
ในกรณีที่ต้องการเปลี่ยน IP address ของ Raspberry PI แบบถาวรละ ? ก่อนอื่นต้องลบ ip address ที่ใส่ใน cmdline.txt ก่อนครับแล้วเปิดไป slide หน้าต่อไป ->
Config static IP แบบถาวร
sudo nano /etc/network/interfaces
การตั้งค่า IP Address บน file system ย่อมดีกว่าการตั้งค่าบน cmdline.txt
** trip nano เป็น editor สามารถออกได้โดยการกด Ctrl
+ x พร้อม save โดยการกด yes
Config static IP
iface eth0 inet staticaddress 192.168.10.50netmask 255.255.255.0
หลังจากเปิดไฟล์แล้วให้หาบรรทัดที่เขียนว่า iface eth0 inet dhcp
แล้วจัดการใส่ # ด้านหน้าบรรทัดเพื่อคอมเมนท์หลังจากนั้นใส่ข้อมูลด้านล่างลงไป
Basic Linux command Lineคำสั่ง หน้าที่ รายละเอียด
ls List file แสดงรายชื่อไฟล์และไดเรคทอรี่
cp copy file สำเนาไฟล์
mv Move file เหมือน Ctrl + X แล้ว Ctrl+V
rm Delete files ลบไฟล์
cd Change directory ย้ายไปไดเรคทอรี่ที่ต้องการ
pwd Print current directory name แสดงชื่อไดเรคทอรี่ปัจจุบัน
mkdir Create directory สร้างไดเรคทอรี่
rmdir Delete directory ลบไดเรคทอรี่
cat view file ดูเนื้อหาของ text file
scp SSH transfer protocol ทรานเฟอร์ข้อมูล ผ่าน SSH
tar read/write type archives จัดเก็บไฟล์แบบ compress หรือแตกไฟล์ออกมา
sudo Super user do super user ทำ
chmod Change file protections เปลี่ยนระดับ permission ของไฟล์
vi vi editor ชื่อ VI
nano nano editor ชื่อ nano
GPIO คืออะไร ?
GPIO ย่อมาจาก general purpose input/output คือขาอิสระสามารถเลือกหน้าที่เป็น Input หรือ Output ก็ได้ ถ้าต้องการควบคุม Logic ที่ปล่อยออกไปภายนอกให้เลือกโหมดเป็น Output แต่ถ้าต้องการอ่านค่าของ Logic ที่เข้ามาให้เลือกเป็น Input โหมด
บน Raspberry pi นั้น จะใช้แรงดัน 0V แทน Logic 0 และใช้แรงดัน 3.3V แทน Logic 1 โดยที่ Raspberry Pi นั้น จะมีแรงดันที่เข้าขา GPIO ได้มากที่สุด คือ 3.3V เท่านั้น หากแรงดันมีค่าเกินกว่านี้อาจจะทำให ้Raspberry pi เสียหายได้
Control GPIO via Raspberry PI ทดสอบควบคุม GPIO บน Raspberry pi ด้วยการควบคุมการเปิดปิดหลอด LED โดยต่อวงจร LED กับ GPIO4(pin7) เบื้องต้นได้ตามวงจรนี้
Control GPIO via CLI
// คำสั่งสำหรับบอก Raspberry PI ว่าให้ pin ไหนเป็น GPIOecho "4" > /sys/class/gpio/export // ตั้งค่าให้ GPIO4 เป็น GPIO ตรงนี้ทำครั้งเดียว echo "out" > /sys/class/gpio/gpio4/direction // จัด direction ให้เป็น output ตรงนี้ทำครั้งเดียว// คำสั่งสำหรับส่งค่า value ไปที่ gpio ของ Raspberry PI เช่น logic 1 หรือ 0 echo "1" > /sys/class/gpio/gpio4/value // จ่าย output 1 ออกไปที่ pin echo "0" > /sys/class/gpio/gpio4/value // จ่าย output 0 ออกไปที่ pin // ยกเลิกการใช้งาน GPIO echo "4" > /sys/class/gpio/unexport // ปล่อย GPIO4 ทำต่อเมื่อยกเลิกการใช้งาน
อ่านค่า GPIO Input Raspberry PI ด้วย Command line
ทดสอบอ่านค่า GPIO Input บน Raspberry pi ด้วยการทดลองอ่านค่าจาก สวิทซ์ เบื้องต้น โดยต่อวงจร Switch กับ GPIO17 ได้ตามวงจรนี้
จากวงจรนี้เมื่อมีหลักการทำงานคือ กด Switch Logicที่เข้ามาใน Pin จะเป็น Logic 0 ปล่อย Switch Logicที่เข้ามาใน Pin จะเป็น Logic 1
GPIO Input via CLI
echo "17" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio17/direction // กำหนด pin 17เป็น input
cat /sys/class/gpio/gpio17/value // อ่านค่า value ที่ pin 17 echo "17" > /sys/class/gpio/unexport
python เป็นภาษา script และเป็นภาษาที่ Raspberry PI แนะนำให้ใช้ด้วย สังเกตุได้ว่ามีไลบรารี่ในการเชื่อมต่อฮาร์ดแวร์ออกมามาก และตัวอย่างหลายๆ ตัวบน Raspberry PI ก็มัก จะเป็น Python
+, -, *, /
ชุดคำสั่งทางคณิตศาสตร์ของ Python เบื้องต้น ไล่จากซ้าย บวก ลบ คูณ หาร
a = a + 1 b = 20 - 10 c = 1 * 5d = 4 / 2
ตัวอย่าง
==, >=, >, <, <=
สัญลักษณ์ในการตัดสินใจเบื้องต้น
== เท่ากับ >= มากกว่าหรือเท่ากับ > มากกว่า < น้อยกว่า <= น้อยกว่าหรือเท่ากับ
วิธีการสร้างไฟล์ Python• nano helloworld.py
เปิดไฟล์เพื่อ edit และเขียนโค้ด
• python helloworld.py เป็นการรันไฟล์โปรแกรมด้วย python interpreter
• sudo python helloworld.py เวลา access hardware หรือกระทำกับไฟล์ที่มี permission ให้รัน python ด้วย sudo
การ setup python IDE eclipse IDE นั้นจำเป็นต้องรันโดยใช้ java ขึ้นตอนแรกทำการติดตั้ง java Runtime โดยสามารถติดตั้งได้ที่ http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
@
และติดตั้ง python โดยสามารถ ดาวน์โหลด ตัวติดตั้ง ทั้งบน Mac/Window ได้จาก https://www.python.org/downloads/
ดาวน์โหลด eclipse IDE for JAVA ได้ที่ www.eclipse.org/downloads/ โดยเลือก ตัวลงให้ตรงกับ OS ที่ใช้
@
การติดตั้ง Plugin บน Eclipse เมื่อ Extract file แล้ว ทำการ รัน โปรแกรม eclipse และกดที่ Workbench
@
ติดตั้ง Plugin เพิ่มเติม โดยเลือกที ่Help>install New Software
@
ติดตั้ง Plugin pydev ซึ่งเป็น plugin เพิ่มเติม กดปุ่ม Add และใส ่Name: pydev และ Location เป็น http://pydev.org/updates
@
หาก url ถูกต้อง eclipse จะทำแสดง packet ที่จะติดตั้ง ของ pydev กด Next เพื่อติดตั้ง
@ หลังจากติดตั้ง plug in สำเร็จ eclipse จำเป็นจะต้อง Restart โปรแกรม หนึ่งครั้ง
เมื่อทำการติดตั้ง สำเร็จ ต้องทำการตั้งค่า Eclipse ให้สามารถคอมไพล์ python ได้ โดยต้องทำการติดตั้ง python version 2.7 หรือ สูงกว่าไว้ โดย Mac และ window จะมีข้อแตกต่างกันเล็กน้อย ดังนี้
วิธีบน Window เลือกไปที่ window>Preferences
/
เลือก Pydev>interpreter>Python interpreters ในแถบด้านข้าง และกดปุ่ม New
/
เลือก path ของ python.exe
/
วิธีบน Mac OSX ตั้งค่า Eclipse ด้วยการ เลือกไปที่ Eclipse > Preferences
/
เลือกไปที่ Pydev>interpreter>Python interpreters โดย สามารถ เลือก “Quick Auto-config” และกด Apply > OK
/
การ Remote file Raspberry pi บน Eclipse
ติดตั้ง Plugin สำหรับ Remote เพิ่มเติม โดย eclipse จะมี plugin สำหรับ remote ให้ดาวน์โหลดติดตั้งได ้จากทาง official โดยเข้าไปที่ Help>install new software และ เลือก Work with : ให้เป็น “All Available Site” และพิมพ์ “remote” ในช่องค้นหา เมื่อ ค้นหา packet สำเร็จ ให้เลือกในแถบ “General Purpose Tools ” แล้วติ๊กเลือก “Remote System Explorer End-User Runtime” “Remote System Explorer User Actions”
@ กด Apply และ กดNext จะแสดง packet และ version ที่จะติดตั้ง
@
เริ่มใช้งาน Tool ในการ Remote ด้วยการเลือกไปที่ Window>Open Perspective> Other
@
เลือก Tools “Remote System Exploree “
@
สร้าง Connction ใหม่
@
เลือก SSH Only
@ ใส่ Host name เป็น IP Address ของ Raspberry Pi และ Connection name เป็นชื่ออะไรก็ได้
@
แถบ Remote System จะปรากฏด้านข้าง เลือกไปที ่Directory Root
@
ใส่ user : Pi และ Password : raspberry
@
เมื่อสามารถ SSH เข้าไปได้ จะสามารถเห็น ไดเรคอทอรี ่ภายใน Raspberry pi
@
สามารถเปิด Terminal SSH ไปยัง Raspberry pi ได้การเลือกไปที่ Ssh Terminals>Lunch Terminal
@
สร้างไฟล์ python ภายใน Raspberry pi ได้เลย โดยสร้างที่ directory /home/pi
@
GPIO blinking with Raspberry PIimport RPi.GPIO as GPIO import time
GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT)
while 1 : GPIO.output(18, True) time.sleep(1) GPIO.output(18, False) time.sleep(1)
GPIO blinking with Raspberry PI
import RPi.GPIO as GPIO # เรียกโมดูล GPIOimport time # เรียก time โมดูล
GPIO.setmode(GPIO.BCM) # ตั้งค่าโหมดของ pin เป็นแบบ BCMGPIO.setup(18, GPIO.OUT) # ตั้งค่าพิน 18 เป็น OUTPUT while 1 : GPIO.output(18, True) # จ่าย Logic 1 ไปที่ pin 18 time.sleep(1) # หลับ 1 วินาที GPIO.output(18, False) # จ่าย Logic 0 ไปที่ pin 18 time.sleep(1)
GPIO Mode on RPi.GPIO
GPIO.setmode(GPIO.BCM) == ใช้การกำหนดเลข pin ตามชิบ BCM
GPIO.setmode(GPIO.BOARD) == ใช้การกำหนดเลข pin ตามการนับขาของ Raspberry PI ข้อดีคือถ้า บอร์ด Raspberry PI เปลี่ยน version และมีการเปลี่ยน pin ก็ไม่ต้องเปลี่ยนซอฟแวร์
GPIO Read Digital Input API
GPIO.setup(17, GPIO.IN)
input_value = GPIO.input(17) # ใช้ในการรับค่าจาก Button# โดยจะ return มาเป็น 0 หรือ 1
การ Transfer file จากคอมพิวเตอร ์ไปยัง Raspberry pi บน MAC
การ Transfer file จากคอมพิวเตอร์ไปยัง Raspberry PI นั้นมีหลายวิธีมาก ในหนังสือนี้จะ ใช ้Protocol SCP (Secure copy Protocol ) สำหรับการ Transfer file โดย วิธีบน mac และ window นั้นแตกต่างกัน
MAC/Linux บน Mac หรือ Linux สามารถใช้ซอฟแวร์อย่าง filezilla หรือ ซอฟแวร์ตัวอื่นที่ทำ SFTP ได้แต่ถ้าใช้ command line บน Terminal ให้ใช้คำสั่ง scp -r </path/file> [email protected]:/home/pi
ตัวอย่างเช่น
scp -r /home/myfile [email protected]:/home/pi
ในฝั่ง window จะใช้ โปรแกรม winscp สำหรับการ Transfer เมื่อเปิดโปรแกรมมาแล้ว เลือกโปรโตคอล SFTP และใส่ Hostname เป็น IP ของ Raspberry pi ใส่ username: pi และ password:raspberry เสร็จแล้วกดปุ่ม Login
การ Transfer file จากคอมพิวเตอร ์ไปยัง Raspberry pi บน WINDOW
การ Transfer file จากคอมพิวเตอร ์ไปยัง Raspberry pi บน WINDOW
ในหน้าต่างโปรแกรม ทางด้านขวาจะเป็น Directory ของคอมพิวเตอร์เรา และทางด้านซ้าย จะเป็น directory ของ Raspberry pi ซึ่งการ Transfer สามารถทำได้ด้วยการลาก ไฟล์ที่จะ Transfer จาก คอมพิวเตอร์ ไป Raspberry pi ไปคอมพิวเตอร์ หรือ จาก คอมพิวเตอร์มา Raspberry pi ก็ได้
การติดต่อสื่อสารด้วย SPI : Serial Peripheral Interface
spi (Serial Peripheral Interface) คือการสื่อสาร ข้อมูลแบบดิจิตอลระหว่างอุปกรณ์ ส่งข้อมูลแบบ synchronous หรือ การใช้สัญญาณ clock เป็นตัวกำหนดจังหวะการทำงาน โดยการสื่อสารนี้ เป็นรูปแบบ Full dulex หรือ สามารถสื่อสารกันได้ต่อเนื่อง โดยโปรโตคอลนี้จะ ใช้ bus สื่อสารกันทั้งหมด 4 เส้น คือ SCLK ,MOSI, SCLK, SS
R
การทำงาน ของ SPI นั้นจะมีแบ่งเป็นสองฝั่งคือ SPI Master และ SPI slave โดยจะมีตัว master เพียงตัวเดียว ตัว slave มีกี่ตัวก็ได้ ซึ่ง master จะมีหน้าที่ควบคุมการส่ือสาร โดยจะเป็นตัวเลือกว่าจะติดต่อกับ slave ตัวไหน master จะจ่ายสัญญาณที่ขา SS (Slave select) เป็น Low เพื่อคุยกับ slave ตัวนั้นๆ
R
การใช้งาน SPI บน Raspberry Pi 2
การเปิดใช้งาน module SPI บน Raspberry pi นั้นสามารถทำได้โดยการตั้งค่าใน system file • แก้ไขไฟล์ config.txt ด้วยสิทธ์ ของ root ด้วยคำสั่ง sudo nano /boot/config.txt • เพิ่มบรรทัดล่างสุดของไฟล์ dtparam=spi=on
R
• ทำการ reboot ด้วยคำสั่ง sudo reboot • และทำการเช็คว่า ได้ติดตั้ง module spi แล้ว ด้วยคำสั่ง lsmod | grep spi ถ้าพบ
spi_bcm2708 แสดงว่าสามารถติดตั้งได้สำเร็จ •
R
SPI Programming บน Raspberry pi
ทำการติดตั้ง Library python สำหรับ module spi โดยย้ายไฟล์ python-dev-installer.tar
R ติดตั้ง module spi ของ python โดยสามารถ download ได้จาก https://github.com/Gadgetoid/py-spidev/archive/master.zip หรือ ติดตั้งจาก ไฟล์ที่ได้เตรียมไว้ให้ ทำการติดตั้งโดยย้ายไฟล์ py-spidev.zip ไปไว้ใน Raspberry pi
R
tar -xvzf python-dev-installer.tar cd python-dev-installer sudo ./python-dev-installer
unzip py-spidev.zip cd py-spidev-master sudo python setup.py install
LAB 1: SPI Programming
แลปนี้จะใช้ Raspberry pi สื่อสารกับ IC MCP3008 ผ่าน SPI โดย ในแลปนี้เราจะอ่านค่าแสงจาก LDR ด้วยการอ่านแรงดันที่ตกคร่อม LDR ด้วย IC MCP3008 IC MCP3008 : การใช้งาน IC MCP3008 ซึ่งเป็น IC ที่มีหน้าที่ แปลงสัญญาณ อะนาลอกเป็นข้อมูลดิจิตอล 10 bit และส่งกลับ ผ่าน bus SPI โดย IC นี้มี Port ADC ทั้งหมด 8 Port
R ขาสัญญาณ ชื่อ การทำงาน
SCLK Serial Clock สัญญาณ clock ในการสื่อสารจาก masterMOSI master output slave input สัญญาณ Output จาก masterMISO master input slave output สัญญาณ Output จาก slaveSS Slave Select เลือก slave ที่จะสื่อสารด้วย (Active Low)
ขาใช้งานของ MCP3008
PIN Description PIN Description
CH0-CH7 Analog input Vdd ไฟเลี้ยง IC 2.7V-5.5V
DGND Digital Ground Vref แรงดันอ้างอิง ของ ADC
CLK SPI Clock AGND Analog Ground
Dout SPI data out Din SPI data in
CS/SHDN Chip select
LDR : LDR เป็นตัวต้านทานที่สามารถเปลี่ยนสภาพความนำไฟฟ้าได้ เมื่อมีแสงมาตกกระทบ โดย นิยมนำมาใช้เป็น Sensor วัดแสง โดยการต่อวงจรใช้งานเบื้องต้น สามารถต่อได้ ตามรูป
! !
วงจรทดลอง การต่อใช้งาน ic MCP3008 เพื่อวัดแรงดัน Analog
R
\
ทดสอบรัน โค้ด import spidev import time import os
spi = spidev.SpiDev() spi.open(0,0)
def ReadChannel(channel): adc = spi.xfer2([1,(0x08+channel)<<4,0]) #function ส่งข้อมูล SPI data = ((adc[1]&0x03) << 8) + adc[2] #อ่านข้อมูล adc 10 bit return data
def ConvertVolts(data,places): volts = (data * 3.3) / float(1023) #ทําการแปลงค่าADC10bitเป็นโวลต ์ volts = round(volts,places) return volts
while True: read_adc = ReadChannel(7) LDR_volt= ConvertVolts(read_adc,2) print "LDR volt:"+str(LDR_volt) time.sleep(1)
www.deaware.com �133 �
อธิบายโปรแกรม : โปรแกรมจะเริ่มอ่านค่าด้วย function ReadChannal() ด้วยการคุยกับ IC mcp3008 ผ่าน bus SPI โดยจะต้องทำการส่งข้อมูลทั้งหมด 3 Byte เพื่อทำการอ่านค่ากลับด้วยคำสั่ง spi.xfer2() โดย ทั้ง 3 Byte เร่ิมต้น มีหน้าที่ดังนี้
ไบท์แรก (0b000000001) เป็นการเริ่มต้นการสื่อสารของ SPI
R และ ไบท์ที่สอง จะเป็นการเลือกที่จะอ่านค่า ADC โดยจะใช้เพียงสี่บิทเริ่มต้นเท่านั้น บิทที่ 7 (SGL/Diff) หากเลือกเป็น 1 นั้นจะเป็นการอ่านค่า ADC จาก Channel โดยตรง หากเลือกเป็น 0 จะเป็นการอ่านค่าผลต่าง ระหว่าง ADC Channel ต่างๆ ซึ่งจะกำหนด Channel ADC จากบิท D2,D1,D0
R ในระหว่างที่ส่งข้อมูลไปนั้น SPI จะทำการตอบกลับด้วยไปพร้อมกัน เนื่องจากข้อมูล ADC ที่ส่งกลับมานั้นเป็นข้อมูล 10 bit (B9-B0) ดังนั้นจึงต้องส่งข้อมูลใน Byte ที่สามให้มีขนาดเท่ากัน ดังภาพ
R จากในภาพ ไบท์ข้อมูลที่รับได้เป็นข้อมูลจำนวน 2 byte จะต้องนำมาแปลงเป็นข้อมูล 10 bit (B9-B0) ด้วยคำสั่ง data = ((adc[1]&3) << 8) + adc[2]
ตัวอย่างการอ่านค่า ADC ที่ CH7 : จากคำสั่ง adc = spi.xfer2([1,(8+channel)<<4,0]) ในไบท์ที่สองนั้นจะถูกนำมาบวกกันแบบเลขฐานสอง โดย 8 แปลงเป็นฐานสองได้คือ 1000 และ 7 แปลงเป็นฐานสองได้ 0111 เมื่อนำมาบวกกันจะได้ 1000+0111= 1111 และ ถูกชิพบิทอีก 4 บิท (8+channel)<<4) จะได้เป็น 11110000 ดังนั้น ค่าที่ส่งผ่าน spi จะเป็น [00000001,11110000,00000000]
i2c คือ อะไร ?
I2C Bus ย่อมาจาก Inter Integrate Circuit Bus (IIC) นิยมเรียกสั้นๆว่า BUS (ไอ-แสคว-ซี-บัส) เป็นการสื่อสารอนุกรม แบบซิงโครนัส (Synchronous) เพื่อใช้ ติดต่อสื่อสาร ระหว่าง ไมโครคอนโทรลเลอร ์(MCU) กับอุปกรณ์ภายนอก ซึ่งถูกพัฒนาขึ้นโดยบริษัท Philips Semiconductors โดยใช้สายสัญญาณเพียง 2 เส้นเท่านั้น คือ serial data (SDA) และสาย serial clock (SCL) ซึ่งสามารถ เชื่อมต่ออุปกรณ์ จำนวนหลายๆ ตัว เข้าด้วยกันได้ โดย อุปกรณ์ที่อยู่บนบัสนั้นจะมี Address ที่ไม่ซ้ำกัน
R โดยการสื่อสาร บน i2c ของ mcp23017 อุปกรณ์ที่ส่งข้อมูล (master) จะต้องเลือก Address ของอุปกรณ์ตัวที่จะรับข้อมูล (slave) และ เลือก address ของ register address ภายใน เพื่อทำการเขียน ข้อมูลลงไป และ ในทำนองเดียวกัน เมื่อจะอ่านข้อมูล (master) จะต้องเลือก address ของ slave และ register address ที่จะอ่าน เช่นกัน
การใช้งาน i2c บน Raspberry pi เปิดการใช้งาน I2C จาก raspi-config
• sudo raspi-config
• เลือกหัวข้อที่ 8 Advanced Options • เลือกหัวข้อ A7 I2C • เลือก YES เพื่อ enable i2c • terminal จะถามว่า ให้ Load module ตอนเรื่มต้นboot ให้ตอบ OK • เลือก Finish • แก้ไขไฟล์ sudo nano /etc/modules • เพิ่ม i2c-bcm2708 และ i2c-dev ต่อท้ายไฟล์
• ย้ายไฟล์ i2c-tools_3.1.0-2_armhf.deb ไปไว้ใน Raspberry Pi • ติดตั้งด้วยคำสั่ง sudo dpkg -i i2c-tools_3.1.0-2_armhf.deb • sudo reboot
LAB2: i2c Programming แลปนี้จะใช้ Raspberry pi สื่อสารกับ IC MCP23017 ผ่าน bus i2c ซึ่ง ic mcp23017 เป็น ic ขยาย port GPIO 16bit โดยจะแปลงข้อมูลที่อ่านจาก port input GPA และ GPB และ ส่งข้อมูลผ่าน bus i2c หมายความว่าเราจะมี GPIO ที่สั่ง input/output ได้เพิ่มขึ้นมา โดยในแลปนี้จะให้ทำการสั่ง GPIO ควมคุมหลอด LED และ สวิทซ์ผ่านทาง bus i2c
IC mcp23017 การทำงานของไอซี MCP23017 ขึ้นอยู่กับการกำหนดค่าในรีจิสเตอร์ภายใน เช่น รีจิสเตอร์ IODIRA, IODIRB ใช้สำหรับกำหนดทิศทางของขา I/O สำหรับ Port A และ B ตามลำดับ รีจิสเตอร์ GPIOA, GPIOB ใช้สำหรับอ่านค่าลอจิกของขา I/O จาก Port A และ B ตามลำดับ ในกรณีที่ขาถูกใช้เป็นอินพุต และรีจิสเตอร ์OLATA, OLATB สำหรับกำหนดค่าลอจิกให้ขา I/O ของ Port A และ B ตามลำดับ ในกรณีที่ขาถูกใช้เป็นเอาต์พุต
R
ขาต่อใช้งานของ MCP23017
GPB0-GPB7 ขา I/O ของ PORT B GPA0-GPA7 ขา I/O ของ PORT A
VDD ไฟเลี้ยง IC 3.3V INTA ขา interrupt จาก port A
VSS Ground INTB ขา interrupt จาก port B
SCL ขา bus i2c RESET ขา RESET จำเป็นต้องต่อ ไฟเลี้ยง ไว้SCA ขา bus i2c A2,A1,A0 ขาตั้ง Address ของ i2c
ทดลองพิมพ์คำสั่ง sudo i2cdetect -y 1 หากตรวจพบอุปกรณ ์i2c จะแสดงตัวเลขขึ้นมา
R
อุปกรณ์ i2c ต่างๆนั้นจะมี Register ภายในที่ทำหน้าที่ตั้งค่าต่างๆ โดย IC MCP23017 นั้นจะมี Registor ที่สำคัญๆ ดังตารางนี ้
ทดลองสั่งงาน LED ด้วยคำสั่ง
R
ในคำสั่งแรก “sudo i2cset -y 1 0x24 0x00 0x00 ” นั้น คำสั่ง i2cset จะเป็นคำสั่งที่ใช้ในการตั้งค่า Registor ของ อุปกรณ์ i2c ต่างๆ โดยพารามิเตอร์แรก เป็นการเลือก Address ของ device i2c คือ (0x24) และ พารามิเตอร์ที่สองเป็นการเลือก Address ของ Registor IODIRA ที่อยู่ภายใน IC MCP23017 คือ (0x00) เพื่อตั้งค่า Direction ของ GPA7-GPA0 ให้เป็น output หรือ input ด้วยการตั้งค่าในพารามิเตอร์ที่สาม ตัวอย่างนี้ตั้งค่าเป็น (0x00) คือ สั่งให้ GPA7-GPA0 เป็น output ทั้งหมด
MCP23017 Register
register Address Description
IODIRA 0x00 ตั้ง direction ของขา IO ของ GPA0-GPA7 โดย 1 เป็น input และ 0 เป็น output
IODIRB 0x01 ตั้ง direction ของขา IO ของ GPB0-GPB7 โดย 1 เป็น input และ 0 เป็น output
GPIOA 0x12 อ่านค่า GPA0-GPA7
GPIOB 0x13 อ่านค่า GPB0-GPB7
OLATA 0x14 Register ที่มีหน้าที่ตั้งค่า output GPA0-GPA7
OLATB 0x15 Register ที่มีหน้าที่ตั้งค่า output GPB0-GPB7
sudo i2cset -y 1 0x24 0x00 0x00 sudo i2cset -y 1 0x24 0x14 0x80
และในคำสั่งถัดมา “sudo i2cset -y 1 0x24 0x14 0x80” เป็นการเซต Registor OLATA (Address 0x14) ซึ่งเป็นการ สั่งให ้GPA จ่าย output ออกไปหรือไม ่โดยแทนค่า output ของ GPA7-GPA0 ด้วยเลขฐานสอง จำนวน 8 bit ในตัวอย่างนี้ได้ เซ็ตค่าไว้ คือ 0x80 หรือ แปลงให้อยู่ในรูปเลขฐานสอง คือ 10000000 ที่ขา GPA7 ได้จ่าย output ออกมา ดังนั้น หลอด LED จะติดขึ้นมา
ทดลองต่อวงจรเพิ่มเติม โดยต่อขา GPB0 และ GPB1 เข้ากับไฟ 3.3V เพื่อเป็นการจ่าย Input ให้ GPB0 และ GPB1
R
R
ทดลองพิมพ์คำสั่ง
R ในคำสั่งแรก “sudo i2cset -y 1 0x24 0x01 0xff ” เป็นการ Set ค่าของ IODIRB (Address 0x01) ซึ่งเป็น Registor ที่มีหน้าที ่ควบคุม Direction ของ GPB7- GPB0 โดยในตัวอย่างนี้ตั้งค่าเป็น 0xFF หรือก็คือ ตั้งให้ GPB7-GPB0 เป็น input ทั้งหมด ในคำสั่งถัดมา “sudo i2cget -y 1 0x24 0x13” เป็นการอ่านค่าจาก Register Address 0x13 คือ register GPIOB ซึ่งมีหน้าที่เก็บค่าของ GPB7-GPB0 โดยผลลัพธ์ที่ได้นั้นจะเป็นดังภาพ
R สาเหตุที่ผลลัพธ์ออกมาเป็น 0x03 นั้น เพราะว่า ต่อ input 1 ไว้ที่ ขา GPB1 และ GPB0 ซึ่งค่าที่อ่านได้จาก Register GPIOB ก็คือ 00000011 เมื่อ print ออกมาทาง console จะถูกแปลงค่าเป็น เลขฐาน 16 คือ 0x03
i2cdump : เราสามารถอ่านค่า Register ทั้งหมด ของ i2c ได้ด้วยคำสั่ง
R
R
sudo i2cset -y 1 0x24 0x01 0xff sudo i2cget -y 1 0x24 0x13
sudo i2cdump -y 1 0x24
เขียนโปรแกรม i2c บน Raspberry pi ด้วย python
ใช้วงจร เดิมจากด้านบน เพื่อทำการทดลอง ขั้นแรก ทำการติดตั้ง Library smbus ซึ่งเป็น Library ที่ใช้ติดต่อระหว่าง i2c และ python ทำการย้ายไฟล์ python-smbus_3.1.0-2_armhf.deb เข้าไปใน Raspberry pi และ รันคำสั่งติดตั้ง
R
lab_i2c1.py ทดลองสั่ง GPiO Output
จากวงจรเดิม นำมาทดลองเขียนโปรแกรมไฟกระพริบด้วยโปรแกรมด้านล่าง
! อธิบายโปรแกรม : เมื่อเริ่มต้นโปรแกรม สร้าง object ของ I2c ด้วยคำสั่ง bus = smbus.SMBus(1) และ สั่งให้เขียน Register OLATA ให้เป็น 1 และเป็น 0 สลับกันไปมา ด้วยคำสั่ง
bus.write_byte_data(DEVICE,OLATA,0x80)
โดยที่ผลลัพธ์ของโปรแกรมนี้จะได้เป็นไฟกระพริบติดและดับสลับกัน
sudo dpkg -i python-smbus_3.1.0-2_armhf.deb
import smbus import time
bus = smbus.SMBus(1) #กําหนดใช ้i2c ch1 DEVICE = 0x24 IODIRA = 0x00 GPIOA = 0x12 OLATA = 0x14
bus.write_byte_data(DEVICE,IODIRA,0x00) #กําหนด GPA0-GPA7เป็นoutput
while True: bus.write_byte_data(DEVICE,OLATA,0x80) #สั่ง GPA7 ให้จ่าย high time.sleep(1) bus.write_byte_data(DEVICE,OLATA,0x00) #สั่ง GPA7 ให้จ่าย Low time.sleep(1)
lab_i2c2.py ทดลองอ่านค่าจาก i2c bus
! อธิบายโปรแกรม : เมื่อเริ่มต้นโปรแกรม สร้าง object ของ I2c ด้วยคำสั่ง bus = smbus.SMBus(1) และ Register GPIOB เก็บไว้ในตัวแปร data และ print แสดงผลออกมาในรูปแบบ binary
import smbus import time
bus = smbus.SMBus(1)
DEVICE = 0x24 IODIRB = 0x00 GPIOB = 0x12
bus.write_byte_data(DEVICE,IODIRB,0x03) data = bus.read_byte_data(DEVICE,GPIOB) print bin(data)
ifconfig
คำสั่งสำหรับตรวจสอบ
เมื่อพิมพ์แล้วควรจะเห็น wlan0 หลังจากเสียบ wifi dongleแต่ถ้าไม่เห็นอาจจะเป็นเพราะ Raspberry PI ไม่ได้ถูกติดตั้ง firmware อย่างถูกต้อง
วิธีการติดตั้ง firmware usb wifi 8188cu
นำไฟล์ firmware rtl8188eufw.bin ไปวางบนบอร์ด Raspberry PI
cp rtl8188eufw.bin /lib/firmware/rtlwifi/
วิธีการติดตั้ง USB-WIFI
79
sudo nano /etc/network/interfaces
เริ่มต้นแก้ไขไฟล์ interfaces ภายใต้ Directory
วิธีการติดตั้ง USB-WIFI
81
แก้ไขข้อมูลเพื่อให้ usb wifi เชื่อมต่อไปที่ router โดยตรงเช่นauto lo
iface lo inet loopback iface eth0 inet static
#allow-hotplug wlan0
auto wlan0 iface wlan0 inet static wpa-ssid "DEAWARE_FRONT" wpa-psk "DEAW1234567890" address 10.244.212.10 netmask 255.255.255.0 gateway 10.244.212.191
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf