IOT RPI DAY2 - Burapha Universitynutthanon/... · แนว‡ดในการ…ฒนา...

112
IoT IoT Day 2 : Basic Raspberry PI Hardware interface and Introduction to IoT

Transcript of IOT RPI DAY2 - Burapha Universitynutthanon/... · แนว‡ดในการ…ฒนา...

IoTIoT Day 2 : Basic Raspberry PI Hardware interface and Introduction to IoT

อะไรคือ ราสเบอรี่ไพ ( Raspberry PI )

What is Raspberry PI ? ราสเบอรี่ไพ (Raspberry PI) คอมพิวเตอร์จิ๋วที่หลายคนรู้จัก เนื่องด้วยประสิทธิภาพของมันเทียบกับราคาบวกกับแรงผลักดันจากวงการ IT และการพูดถึงของบริษัทยักใหญ่ มีการซื้อแจกให้วงการศึกษา รวมไปถึงถูกนำไปสร้างเป็นโปรเจคออกมามากมาย ทำให้บอร์ดราสเบอรี่ไพ ดังถล่มทลาย ด้วยว่าเจ้าคอมพิวเตอร์จิ๋วราสเบอรี่ไพ มีอินเทอร์เฟซที่เหมาะสมกับการทำคอมพิวเตอร์ขนาดเล็กอยู่แล้ว ทำให้หลายที่นำมาใช้เป็นสื่อการเรียนการสอนด้านคอมพิวเตอร์ จากระดับล่างจนถึงระดับสูง

What is Raspberry PI ?

Raspberry PI 2 Model B

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 ที่ราคาถูกที่สุดในท้องตลอด

nonthanut
Highlight

ข้อเสียของบอร์ด Raspberry PI

- Broadcom ไม่เปิด datasheet

- ตัวบอร์ดใช้ SD Card เป็น media ในการ boot อาจจะไม่เหมาะกับงานที่ต้องการความ stable สูง

- community ปลูกฝังให้เริ่มต้นง่ายๆ แต่ขัดกับหลักการนำออกไปสร้างผลิตภัณฑ์จริงหลายอย่าง

nonthanut
Highlight

SoC ( System On Chip )คืออะไร

SOC (System On Chip)is defined as integration of several Architectural level systems into a single chip !หัวใจสำคัญของ Raspberry PI คือ SoC ในที่นี้ ใช้ของบริษัท Broadcom

Raspberry PI SoC ?

ใช้ของบริษัทอะไร

ทำไมต้อง 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 Image ด้วย Mac Os

แนวคิดในการพัฒนา 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

การเข้าหน้า 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

ติดตั้งลงไปบนระบบปฏิบัติการ Window เท่านั้นครับ

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

SSH เข้าไปที่ Raspberry PI บน Window โดยใช้ mRemote NG

3. กดปุ่ม Connect

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

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 เสียหายได้

nonthanut
Highlight

GPIO บน Raspberry PI 2

GPIO บน Raspberry PI 2

Control GPIO via Raspberry PI ทดสอบควบคุม GPIO บน Raspberry pi ด้วยการควบคุมการเปิดปิดหลอด LED โดยต่อวงจร LED กับ GPIO4(pin7) เบื้องต้นได้ตามวงจรนี้

สังเกตุขั้ว LED จากรอยบากหรือขนาดโลหะด้านใน

ต่อวงจร LED ตามรูปด้านล่าง

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 Raspberry PI ด้วย Command line

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

เรียนแบบ 10 นาทีสไตล์

python เป็นภาษา script และเป็นภาษาที่ Raspberry PI แนะนำให้ใช้ด้วย สังเกตุได้ว่ามีไลบรารี่ในการเชื่อมต่อฮาร์ดแวร์ออกมามาก และตัวอย่างหลายๆ ตัวบน Raspberry PI ก็มัก จะเป็น Python

print “helloWorld”

คำสั่งในการแสดงผลของ Python

var_int = 10var_float = 20.00var_str = “hellopython”

Python ไม่ต้องประกาศ Type หน้าตัวแปร

data = 10 print data

คำสั่ง print สามารถใช้กับตัวแปรได้ด้วย

+, -, *, /

ชุดคำสั่งทางคณิตศาสตร์ของ Python เบื้องต้น ไล่จากซ้าย บวก ลบ คูณ หาร

a = a + 1 b = 20 - 10 c = 1 * 5d = 4 / 2

ตัวอย่าง

==, >=, >, <, <=

สัญลักษณ์ในการตัดสินใจเบื้องต้น

== เท่ากับ >= มากกว่าหรือเท่ากับ > มากกว่า < น้อยกว่า <= น้อยกว่าหรือเท่ากับ

x = 10

if x > 10 : print “x is too small”

else :print “x is too big”

if, else และการตัดสินใจ

x = 0

while x < 10 :print “helloWorld”x = x + 1

while loop เพื่อใช้ในการวนลูป

def plus_function(n1, n2) :return n1 + n2

print plus_function(2,3)

ฟังก์ชันและการใช้งานเบื้องต้น

วิธีการสร้างไฟล์ Python• nano helloworld.py

เปิดไฟล์เพื่อ edit และเขียนโค้ด

• python helloworld.py เป็นการรันไฟล์โปรแกรมด้วย python interpreter

• sudo python helloworld.py เวลา access hardware หรือกระทำกับไฟล์ที่มี permission ให้รัน python ด้วย sudo

วิธีการสร้างไฟล์ Python

ทดลองเขียนโปรแกรมให้ปริ้นคำว่า

HelloWorld Python

บน Raspberry PI 5 ครั้ง

ติดตั้ง Eclipse IDE สำหรับพัฒนา Python แบบสะดวกๆ

การ 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

/

Eclipse จะติดตั้ง Library ให้โดยอัตโนมัติเลือก OK

/

กด Apply เป็นอันเสร็จสิ้น

/

วิธีบน 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

@

ตั้งชื่อไฟล์

@

เสร็จสิ้นสำหรับการ Setup python IDE

@

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

LAB: Control LED and Button

ทดลองควบคุม Button ให้กดแล้ว LED กระพริบพอปล่อยปุ่มแล้ว LED หยุด

การ 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

nonthanut
Text Box
MCP3008 = A 2 D

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

Register Address ของ MCP23017

R

ทดลองต่อวงจรใช้งาน MCP23017 กับ Raspberry pi โดยต่อ R 330 และ LED ที่ขา GPA7

R

R

ทดลองพิมพ์คำสั่ง 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

nonthanut
Text Box
wrong pictures, look at hardcopy

ทดลองพิมพ์คำสั่ง

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)

Raspberry PI USB WiFi Client Mode

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

80

แก้ไขข้อมูลเพื่อให้ usb wifi เชื่อมต่อไปที่ router โดยตรงเช่น

วิธีการติดตั้ง 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

วิธีการติดตั้ง USB-WIFI

82

sudo reboot

reboot เพื่อเริ่มต้นใช้ WiFi

IoTIoT Day 2 : Basic Raspberry PI Hardware interface and Introduction to IoT

The end !!