วันนี้มาเล่าเรื่องการใช้ General Purpose Input Output (GPIO) ของ Raspberry Pi ให้อ่านกันครับ
สำหรับผู้เริ่มต้นใช้งาน หรือ คนที่มาในแนว Software อาจจะไม่ได้เคยสนใจ หรือ ลองใช้ GPIO นี้เพื่อติดต่อ Hardware ภายนอกกันนะครับ เพราะเรื่องของ Software ก็น่าสนใจและหาอ่านกันได้ไม่รู้จบแล้ว แต่ GPIO นี้เป็นอีกส่วนประกอบหนึ่งที่สำคัญของการใช้งานแบบ Embeded Systems กันเลย เพราะว่าเป็นช่องทางในการติดต่อสื่อสาร (ที่นอกเหนือไปจาก USB) ทั้งขาเข้าและออก กับโลกภายนอกบอร์ด หรือ RPi เช่น การอ่านค่าจากอุปกรณ์ที่สื่อสารด้วย I2C, SPI, หรือ แม้แต่ Analog sensor ต่างๆ หรืออาจจะใช้ติดต่อสื่อสารกับ Arduino Board ก็ยังได้ครับ
ก่อนที่จะเข้าสู่วิธีการใช้งานและตัวอย่างนะครับ ผมขอเริ่มที่ข้อจำกัด ข้อควรระวัง และ สิ่งที่ต้องใช้ก่อน
ข้อจำกัดที่สำคัญ และผมต้องย้ำกันหลายครั้งก็คือ การใช้งาน GPIO ของ RPi นั้น ให้ระวังเรื่องระดับแรงดันของอุปกรณ์ที่มาต่อให้ดีนะครับ RPi นั้นใช้ระดับแรงดัน 3.3 V เท่านั้น ถ้าเผลอไปที่ 5 V ก็ตัวใครตัวมันนะครับ ดังนั้นการใช้งาน Sensor บางชนิดที่ใช้ระดับแรงดันสูงสุดที่ 5 V ก็ต้องมีการแปลงนิดหน่อย เช่น การใช้ Resistive Voltage Divider หรือ อุปกรณ์ประเภท Level Converter นะครับ
อีกเรื่องที่ต้องบอกกันก่อนคือเรื่องการจ่ายกระแสของ RPi เนื่องจาก RPi ไม่ได้ออกแบบมาให้จ่ายกระแสได้เยอะๆ (สูงสุดที่จ่ายได้คือ 120 - 200 MA เท่านั้น) ทั้งที่ USB Port และ ที่ GPIO ดังนั้น การใช้ RPi ไปขับดีซีมอเตอร์ หรือ เซอร์โวมอเตอร์ ถึงแม้ว่าจะมีขนาดเล็ก และ ใช้กับ Arduino board ได้ ผมว่าก็ไม่ควรเสี่ยงนะครับ ไม่คุ้มแน่ๆ โชคดีหน่อยก็ทำงานแบบติดๆดับๆ หรือ หนักหน่อยก็กับบ้านเก่าได้
หลายครั้งที่พบว่าผู้ใช้งานเอา RPi ไปต่อกับ Adaptor ขนาดเล็กเกินไป เช่น จ่ายกระแสได้ 1 A ก็จะพบว่า RPi อาจจะทำงานแบบติดๆดับๆ บางทีก็แฮงค์ไปเลย วิธีแก้คือให้ใช้ Apdator ขนาดพิกัดกระแสมากหน่อยขนาด 1.2 A ขึ้นไป นอกจากนี้การต่ออุปกรณ์ผ่าน USB Port หลายชิ้น (มากกว่า 1 ชิ้นขึ้นไป) ควรใช้ USB Hub ชนิดที่มีแหล่งจ่ายแรงดันแยกนะครับ แล้วต่อ Adaptor ให้มันด้วยครับ มีลูกค้าของเราโทรมาแจ้งว่า RPi ที่ซื้อไปใช้แล้วติดๆดับๆ ทั้งที่ต่อ Adaptor ขนาด 2 A แล้ว พอสอบถามกันไปมาก็พบว่า ถึงแม้ว่าจะต่อแบบ 2 A ก็จริงอยู่ แต่ใช้กับอุปกรณ์ต่อผ่าน USB hub โดยไม่ได้เสียบ Adaptor เลี้ยงที่ USB hub แบบนี้ก็ไม่ได้นะครับ ต้องต่อเลี้ยง USB hub ด้วยครับ
ดังนั้นจะเห็นว่าสายมันก็ระโยงกันไปมาหลายเส้นมาก วิธีแก้ไขเหรอครับ ให้ต่อแบบ Remote Desktop ไปเลย ถ้าใช้วิธีนี้เราจะไม่ต้องต่อ USB Keyboard, Mouse และไม่ต้องใช้ USB Hub ให้ยุ่งยาก ต่อแค่ RPi กับ Wifi USB และ USB Adaptor เลี้ยงตัว RPi ขนาดเล็กๆ ก็พอ
มาถึง Pin Layout ของ GPIO ที่อยู่บนตัว RPi กันบ้างครับ หน้าตาก็แบบรูปด้านล่างครับ จะเห็นว่ามีการสื่อสารหลักที่เขียนกำหนดไว้คือ Serial communication (TX, RX) และ Serial Peripheral Interface (SPI -- SDA SCL MOSI MISO) เป็นหลัก นอกนั้นก็จะเป็น Input/Ouput Pin กับไฟเลี้ยงและกราวด์
ถ้าอยากได้ Raspbery Leaf ของ Dr. Monk ก็ตามลิงค์นี้นะครับ พิมพ์ออกมาใส่กระดาษ จะได้ขนาดที่เท่ากับของจริงบนบอร์ด เอาไปวางซ้อนได้เลย
https://github.com/simonmonk/wiki_images/raw/master/raspberry%20leaf%20r2.pdf
ตามไปดูรายละเอียดได้ที่นี่ครับ
http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html
หลังจากที่ได้ลง Raspbian OS กันแล้ว ก็เริ่มกันได้เลยครับ
1. Update กันซักนิดครับ ไปที่ LXTerminal
~$ sudo apt-get update
ตามด้วย install
~$ sudo apt-get install
2. ลง RPi.GPIO
$ wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.1.0.tar.gz
$ tar zxf RPi.GPIO-0.1.0.tar.gz
$ cd RPi.GPIO-0.1.0
$ sudo python setup.py install
ลิงค์มันยาวใช่มั้ยครับ ลองเปิดด้วย RPi web browser อย่่าง Midori ดูนะครับ จะสามารถ copy and paste ได้ครับ
ถึงตรงนี้แปลว่าเราพร้อมที่จะ run โปรแกรม python เพื่่อเรียก GPIO กันแล้วครับ
3. คราวนี้ลองต่อ LED หรือ Buzzer กันเพื่อลองควบคุมกันซะหน่อยครับ อย่าลืมนะครับ ถ้าใช้ LED ให้ต่อระหว่าง GPIO PIN ที่ต้องการใช้ ไปผ่านตัวต้านทานซัก 330 - 470 โอห์มซะก่อนแล้วค่อยไปที่ LED นะครับ ถ้าลืม RPi ของคุณจะลัดวงจร
ถ้าตามรูปนี้ก็คือเราต่อแรงดัน 3.3 V ไปผ่านตัวต้านทาน LED และลง GND นะครับ โดยใช้ PIN ที่ 17
หรือจะต่อโดยใช้ T Cobber ก็ได้ครับ
4. คราวนี้ลองสั่งผ่าน Python กันครับ
ก่อนอื่นต้องเข้าใจนิดครับว่า GPIO ของ Raspberry Pi นั้นต้องสั่งการโดย Superuser เท่านั้น ดังนั้นต้องสังผ่าน LXTerminal ด้วยคำสั่งที่ขึ้นต้นด้วย sudo หรือ ถ้าจะใช้ Python IDLE ก็ต้องเปิดด้วย sudo idle ใน LXTerminal นะครับ ไม่สามารถเรียกโดยการดับเบิ้ลคลิกที่หน้า Desktop
ทีนี้ลองใช้ LXTerminal กันครับ
$ sudo python
>>> import RPi.GPIO as GPIO # import library ของ GPIO
>>> GPIO.setup(17, GPIO.OUT) # เปิด Port 17 เป็น Port Output
>>> GPIO.output(17, True) # กำหนดให้ logic ที่ Port 17 เป็น High หรือ 3.3 V
ถ้าต้องการปิด LED ก็
>>> GPIO.output(17, False)
ทีนี้ถ้ามี Berry Clip ก็ง่ายหน่อยครับ ไม่ต้องมาต่อให้ยุ่งยาก ติดต่อกับ GPIO เพื่อเปิด Green LED Pin 7 ก็ตามนี้ครับ
>>> import RPi.GPIO as GPIO # import library ของ GPIO
>>> GPIO.setup(7, GPIO.OUT) # เปิด Port 17 เป็น Port Output
>>> GPIO.output(7, True) # กำหนดให้ logic ที่ Port 17 เป็น High หรือ 3.3 V
ถ้าต้องการปิด LED ก็
>>> GPIO.output(7, False)
หรือถ้าจะลองกับ Buzzer ก็เปลี่ยนเป็นเลข 24 นะครับ
หรือถ้าอยากจะใช้ IDLE ก็เรียกขึ้นมาจาก LXTerminal นะครับ (ใช้ IDLE version 2 นะครับ Version ใหม่อย่าง Version 3 ยังไม่ support GPIO นะครับ)
จากนั้นก็เขียนบน Editor ของ Python แล้วก็ Run ด้วย F5 ครับ
Link อื่นที่น่าสนใจ
https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/
วันนี้พอแค่นี้ครับ ถ้ามีข้อสงสัย เสนอแนะ หรือ คำถามก็ยินดีนะครับ
โดย Mountain A
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,375,832 ครั้ง |
ผู้ชมทั้งหมด | 5,878,910 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 6 ก.ย. 2568 |