การใช้งาน GPIO ของ Raspberry Pi

Suttipong Tanuphone
4 min readJan 1, 2024

--

ตัว Raspberry Pi นั้น มีขา GPIO หลายขาให้เราใช้งาน ในบทความนี้จะเป็นเรื่องของการนำ GPIO นี้มาทำเป็น Port Output ไปเปิด/ปิด หรือจ่ายไฟให้กับอุปกรณ์อื่น ๆ ซึ่งเราสามารถสั่งการได้โดยตรงจาก Command Line ของ Raspberry Pi หรืออาจจะทำเป็นหน้าเว็บในการสั่งการก็ได้ ซึ่งไม่ว่าจะเป็น Raspberry Pi 2,3,4,5 หรือแม้กระทั่ง Raspberry Pi zero W หรือ 2W ก็จะมีขา GPIO ที่เหมือนกัน

ภาพตัวอย่าง 40 Pins ขาต่าง ๆ ของ Raspberry Pi
ภาพตำแหน่งขาต่อไฟและหมายเลข GPIO ต่าง ๆ ของ Raspberry Pi

เริ่มใช้งานขา GPIO

สำหรับการใช้งานขา GPIO บน Raspberry Pi นั้น จะต้องมีคำสั่งให้เริ่มใช้ขา GPIO หมายเลขนั้น ๆ ก่อน วิธีง่าย ๆ ที่จะตรวจสอบว่ามีการประกาศใช้ขา GPIO แล้วหรือยังโดยพิมพ์คำสั่ง


ls -l /sys/class/gpio

คำสั่ง ls -l /sys/class/gpio ก็คือเป็นการเรียกรายชื่อไฟล์ในระบบ GPIO ออกมา ซึ่งจะได้ผลลัพธ์ดังนี้

ภาพตัวอย่างหลังจากการใช้คำสั่ง ls -l /sys/class/gpio

จะเห็นว่ายังไม่มีการประกาศรายการ GPIO ใช้งานอยู่ เราสามารถเริ่มใช้งานขา GPIO ได้ง่าย ๆ เช่น หากต้องการเริ่มใช้งาน GPIO23 ก็ให้ใช้คำสั่ง และทำการเรียกดูสถานะขา GPIO อีกครั้ง

echo 23 > /sys/class/gpio/export
ls -l /sys/class/gpio
ภาพตัวอย่างหลังจากใช้คำสั่งเพื่อเริ่มใช้งานขา GPIO23

หลังจากที่ใช้คำสั่ง ls -l /sys/class/gpio อีกครั้ง เราจะเห็นว่ามีรายชื่อ gpio23 เพิ่มขึ้นมาซึ่งเป็น Symbol Link ไปยังระบบ GPIO ซึ่งหากเราต้องการใช้ GPIO ขาไหนก็ให้ทำเช่นเดียวกัน

กำหนดทิศทางการใช้งานของขา GPIO

หลังจากที่เราได้มีการเปิดใช้งานขา GPIO แล้ว ต่อไปจะต้องเป็นการกำหนดทิศทางของการใช้งานว่าเป็น in หรือ out ซึ่ง in ก็หมายถึงขา GPIO นี้เราจะใช้งานเป็น Input Port เพื่อรับข้อมูลเข้า และถ้าเป็น out ก็หมายถึงขา GPIO นี้เราจะใช้งานเป็น Output Port เพื่อส่งข้อมูลออกไปให้กับอุปกรณ์อื่น ซึ่งเป็น LED หรือ Relay ก็ได้

ภาพตัวอย่างการต่อใช้งาน GPIO23 กับบอร์ด Relay 1 Channel

การกำหนดให้ขา GPIO เป็น in หรือ out ก็ทำได้ง่าย ๆ โดยใช้คำสั่ง echo ส่งค่า in หรือ out ไปให้ Direction ของขา GPIO

หากต้องการให้ GPIO23 ใช้งานเป็น Input ให้สั่ง
echo in >/sys/class/gpio/gpio23/direction
หากต้องการให้ GPIO23 ใช้งานเป็น Input ให้สั่ง
echo out >/sys/class/gpio/gpio23/direction

และสามารถตรวจสอบสถานะของขา GPIO ว่าทำงานเป็น in หรือ out ได้โดยใช้คำสั่ง cat เพื่อสั่ง print out สถานะของ Direction ของขา GPIO

ตัวอย่าง ต้องการดูสถานะของ GPIO23 ว่าสถานะเป็น in หรือ out
cat /sys/class/gpio/gpio23/direction
ภาพตัวอย่างการใช้คำสั่งกำหนด Direction ให้กับขา GPIO และการเรียกดูสถานะ

การกำหนดค่าให้กับขา GPIO

หลังจากที่เราได้กำหนด Direction แล้ว ต่อไปเป็นการส่งค่าให้ GPIO ตามหมายเลขที่ต้องการมีสถานะเป็น 0 หรือ 1 (0=OFF, 1=ON) ซึ่งก็ทำได้ง่าย ๆ เช่นกันโดยใช้คำสั่ง echo เพื่อส่งค่า 0 หรือ 1 ไปให้ขา GPIO นั้น ๆ

ตัวอย่างต้องการกำหนดให้ขา GPIO23 มีสถานะเป็น 1 หรือ ON
echo 1 > /sys/class/gpio/gpio23/value
และหากต้องการกำหนดให้มีสถานะเป็น 0 หรือ OFF ก็ให้ส่งค่า 0 เข้าไป
echo 0 > /sys/class/gpio/gpio23/value

และเราสามารถตรวจสอบสถานะของ GPIO ได้ด้วยคำสั่ง cat ไปที่ value ของขา GPIO นั้น ๆ

ตัวอย่าง ต้องการดูสถานะของ GPIO23 ว่าเป็น 0 หรือ 1
cat /sys/class/gpio/gpio23/value
ภาพตัวอย่างการใช้คำสั่ง cat เพื่อดูค่าของ GPIO และใช้คำสั่ง echo ส่งค่าเข้าไป

จากภาพตัวอย่างจะเห็นว่าก่อนส่งค่า 1 เข้าไปให้ GPIO23 ค่าเดิมจะเป็น 0 และเมื่อเราส่งค่า 1 ไปที่ value ของ GPIO23 ก็จะเปลี่ยนค่าเป็น 1 ซึ่งเราสามารถนำค่าส่งต่อไปให้อุปกรณ์ต่าง ๆ ได้

กำหนดให้เปิดใช้งาน GPIO โดยอัตโนมัติเมื่อเริ่มระบบ

สำหรับ GPIO ต่าง ๆ นั้น หากมีการเริ่มระบบขึ้นมาค่าปกติจะไม่ได้เปิดการใช้งานไว้ ซึ่งหากเราต้องการที่จะให้มีการเปิดใช้งาน GPIO เอง หรืออาจจะกำหนดค่าเริ่มต้นของแต่ละ GPIO ว่าให้มี Direction เป็น in หรือ out และค่าเริ่มต้นเป็น 0 หรือ 1 ก็สามารถนำคำสั่งต่าง ๆ ที่ผ่านมาไปใส่ไว้ในไฟล์ /etc/rc.local

สำหรับคำสั่งในการแก้ไขไฟล์ /etc/rc.local นั้นจะต้องใช้สิทธิ์ของ Super User ในการแก้ไขนะครับ ถ้าหากเรา Login ด้วย User ธรรมดาเราก็ต้องใส่ sudo นำหน้าก่อน

sudo pico /etc/rc.local

ทำการใส่ค่าต่าง ๆ ไปก่อนบรรทัด exit 0

# Declare GPIO
/usr/bin/echo 23 > /sys/class/gpio/export
/usr/bin/echo 24 > /sys/class/gpio/export
# Set GPIO direction
/usr/bin/echo out > /sys/class/gpio/gpio23/direction
/usr/bin/echo out > /sys/class/gpio/gpio24/direction
# Set GPIO value
/usr/bin/echo 0 > /sys/class/gpio/gpio23/value
/usr/bin/echo 0 > /sys/class/gpio/gpio24/value
ภาพตัวอย่างการเพิ่มคำสั่งไปในไฟล์ /etc/rc.local

หลังจากที่เพิ่มข้อมูลเข้าไปในไฟล์ /etc/rc.local แล้วก็ให้กดบันทึกด้วย Ctrl+O และกด Ctrl+X เพื่อออกจากการแก้ไข และทดสอบการใช้งานโดยการสั่ง reboot ระบบ หลังจากที่เริ่มระบบใหม่แล้วก็ให้ทดสอบใช้คำสั่งเพื่อเรียกดูสถานะต่าง ๆ ของ GPIO

ภาพตัวอย่างการใช้คำสั่งเพื่อเรียกดูสถานะต่าง ๆ ของ GPIO23 และ GPIO24

จากภาพตัวอย่างจะเห็นว่าหลังจากเราเริ่มต้นระบบเข้ามาใหม่ สถานะของ GPIO จะเปิดการใช้งานแล้ว และมีสถานะเป็น out ตามที่กำหนด และค่าเริ่มต้นเป็น 0 หรือ OFF

ตัวอย่างการนำไปใช้งานจริงโดยควบคุมผ่าน Web Server

ในการใช้งานจริงนั้นหากจะให้สั่งผ่าน Command Line คงเป็นเรื่องที่ทำได้ยาก ตัวอย่างในบทความนี้จะทำเป็น Web Server และมีปุ่มเพื่อกดเพื่อ ปิด/เปิด GPIO ตามหมายเลขที่ต้องการ ซึ่งอันดับแรกหากไม่มี package ของ HTTP Webserver อยู่ใน Raspberry Pi ก็ให้ทำการติดตั้งเข้าไปก่อน ให้ทำการ update ระบบและทำการ install package ที่จำเป็นเข้าไปตามคำสั่งด้านล่าง

sudo apt-get update
sudo apt-get -y install apache2 php php-cli php-curl curl
ภาพตัวอย่างการใช้คำสั่ง update ระบบและติดตั้ง package เพิ่มเติม

สำหรับการที่จะให้ Web Server สามารถเรียกใช้งาน GPIO ได้นั้น จะต้องมีการกำหนดให้ Web Server นั้นอยู่ในกลุ่มของ GPIO ก่อน เพื่อจะมีสิทธิ์ในการอ่านและเขียนไปที่ GPIO ของ Raspberry Pi

คำสั่งเพื่อเพิ่ม Web Server ให้อยู่ในกลุ่มของ gpio
sudo usermod -a -G gpio www-data

เริ่มเขียนคำสั่งที่ Web Server ด้วยภาษา HTML และ JavaScript

ในบทความนี้เราจะใช้คำสั่งง่าย ๆ ของ HTML + JavaScript เพื่อทำหน้าเว็บขึ้นมาเพื่อรับคำสั่งควบคุม GPIO และส่งต่อให้กับภาษา PHP เพื่อส่งค่าไปให้กับ GPIO ตามที่กำหนด โดยเขียนโปรแกรมไว้ที่ /var/www/html/index.php ถ้าหากเดิมมีไฟล์ index.html อยู่แล้วก็ให้ลบออกก่อน เนื่องจาก Web Server จะไปเรียกไฟล์ index.html มาแสดงก่อนจึงต้องลบออกไป แล้วสร้างเป็นไฟล์ index.php ขึ้นใหม่ ด้วยคำสั่ง pico

sudo rm /var/www/html/index.php
sudo pico /var/www/html/index.html

จากนั้นใส่ code ตัวอย่างไปในไฟล์ index.html

ในบรรทัดที่ 11–18 เป็นการสร้างปุ่ม ON/OFF ให้กับ GPIO23
บรรทัดที่ 20–31 เป็นส่วนของปุ่ม Toggle Switch ของ GPIO24
และในบรรทัดที่ 33–46 เป็นการเรียกสถานะของ GPIO23 และ GPIO24 ขึ้นมาแสดง แต่ต้องมีการกด refresh หน้าเว็บเพื่อโหลดค่าใหม่ด้วย

จากนั้นบันทึกไฟล์โดยการกด Ctrl+O และกด Ctrl+X เพื่อออกจากการแก้ไข แล้วทดสอบเรียกหน้าเว็บตามหมายเลข IP ของ Raspberry Pi เช่น Raspberry Pi ของผมได้ IP : 192.168.77.196

ภาพตัวอย่างการเปิดหน้าเว็บของ Raspberry Pi ที่เราได้ทำการเขียนโปรแกรมไว้

จะเห็นว่ามีปุ่มคำสั่งของ ON/OFF ของ GPIO23 และปุ่ม GPIO24 อยู่แล้ว แต่จะยังไม่สามารถควบคุมการทำงานได้เนื่องจากจะต้องมีไฟล์ภาษา PHP อีก 1 ไฟล์ในการส่งค่าไปให้ GPIO ให้ทำการสร้างไฟล์ gpio.php ด้วยคำสั่ง pico เพื่อสร้างหรือแก้ไขไฟล์ gpio.php

sudo pico /var/www/html/gpio.php
<?php
$gpio = $_GET['gpio'];
$value = $_GET['value'];

if ($value == '2') {
$output = shell_exec("/usr/bin/cat /sys/class/gpio/gpio" . $gpio . "/value");
if ($output == 0) {
$output = shell_exec("/usr/bin/echo 1 > /sys/class/gpio/gpio" . $gpio . "/value");
} else {
$output = shell_exec("/usr/bin/echo 0 > /sys/class/gpio/gpio" . $gpio . "/value");
}
} else {
$output = shell_exec("/usr/bin/echo " . $value . " > /sys/class/gpio/gpio" . $gpio . "/value");
}
?>

ตัวอย่างนี้ผมทำไฟล์ภาษา PHP แบบง่าย ๆ โดยให้เรียกคำสั่ง shell_exec เพื่อไป run คำสั่งที่ Command Line ของ Raspberry Pi และส่งต่อค่าไปให้กับ GPIO ตามที่กำหนดไว้ โดยมีการตรวจสอบค่าที่ส่งมาคือถ้าเป็น 0 หรือ 1 ก็เป็น GPIO แบบกดปุ่ม ON และกดอีกปุ่มเพื่อ OFF และถ้าส่งค่า 2 ก็เป็น GPIO แบบกดติด/กดดับ หรือเป็น Toggle Switch นั่นเอง

มาถึงตอนนี้คงนำไปปรับใช้ให้เข้ากับงานของตัวเองได้แล้วนะครับ ซึ่งหากมีคำถามหรือข้อสงสัยเพิ่มเติมสามารถสอบถามมาได้ที่ LINE ID : aisfttx ครับ

--

--

Suttipong Tanuphone
Suttipong Tanuphone

Written by Suttipong Tanuphone

Tel. 081–7587999, LINE ID : aisfttx

No responses yet