การใช้งาน GPIO บอร์ด Nvidia Jetson Nano

Krittinunt Chobtrong
Super AI Engineer
Published in
3 min readJan 23, 2021

ในงาน AI บางครั้งต้อง Deploy ระบบลงมาทำงานในระบบสมองกลฝังตัว (Embedded system) บอร์ดที่เป็นที่นิยมส่วนใหญ่จะเป็น Raspberry Pi เนื่องจากราคาไม่แพงและมีผู้ใช้งานกันมาก แต่งาน AI นั้น ต้องการ CPU ที่มีความเร็ว และสามารถคํานวณทศนิยมได้ดี ซึ่ง Raspberry Pi ไม่ตอบโจทย์ปัญหานี้ ทางเลือกถัดมาคือบอร์ด Nvidia jetson nano รูปร่างใหญ่กว่า และมีราคาแพงกว่า Raspberry Pi ประมาณ 2.5 เท่าตัว จึงเป็นคำตอบสำหรับการทำ AI ขนาดเล็กๆ ที่สามารถทำงานในระบบสมองกลฝังตัวได้ทันตามเวลา

ข้อดีของบอร์ด Raspberry Pi และ Nvidia jetson nano คือมีขาสัญญาณที่สามารถเชื่อมต่อออกมาใช้งานได้ ทำให้ software ที่เราเขียนนั้น สามารถติดต่อและควบคุม อ่านค่าสัญญาณไฟฟ้าเพื่อเชื่อมต่อไปยังอุปกรณ์อื่นๆ ที่เชื่อมต่ออยู่ในระบบควบคุมได้ ทั้งนี้ทั้งนั้น ผู้ใช้ควรระวังเรื่องการเชื่อมต่อด้วย เนื่องจากระดับสัญญาณของบอร์ด Nvidia jetson nano จะมีระดับ logic แบบ LVTTL คือ 0V ถึง 3.3V หากต้องนำไปเชื่อมต่อกับอุปกรณ์อื่น ควรจะแปลงระดับแรงดันให้อยู่ในมาตรฐานเดียวกันเสียก่อน เช่นผ่านวงจร logic level shifter เป็นต้น

เพื่อให้สามารถควบคุมระดับ logic ที่ขาสัญญาณของบอร์ด Nvidia jetson nano ได้ ต้องเริ่มมาจากการติดตั้ง Library และการ config ตั้งค่าใช้งาน และเขียนโปรแกรมควบคุมตามลำดับ

ขั้นตอนการติดตั้งและตั้งค่า Library Jetson GPIO

การติดตั้งและตั้งค่า Libraray Jetson GPIO ให้ดาวน์โหลดไฟล์ติดตั้งจาก https://github.com/NVIDIA/jetson-gpio แล้วใช้คำสั่ง setup.py เพื่อติดตั้งดังนี้ (แนะนำให้ใช้วิธีนี้ในการติดตั้ง Library Jetson GPIO)

sudo python3 setup.py install

เมื่อติดตั้ง Library Jetson GPIO เสร็จเรียบร้อยแล้ว ขั้นตอนถัดมาคือการตั้งค่า Permissions ของผู้ใช้งาน โดยเริ่มจากการสร้าง Group ผู้ใช้งาน

sudo groupadd -f -r gpio
sudo usermod -a -G gpio ชื่อผู้ใช้งาน

เพิ่มกฏ udev โดยคัดลอกไฟล์ the 99-gpio.rules จากการติดตั้ง Library Jetson GPIO มาใส่ไว้ในไดเรกทอรี rules.d ด้วยคำสั่ง

sudo cp lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger

เมื่อเสร็จเรียบร้อย ให้ทำการ Reboot เพื่อเริ่มต้นใช้งาน

ทดสอบการใช้งาน GPIO

หลังจากติดตั้ง Library Jetson GPIO เป็นที่เรียบร้อยแล้ว เรามาทำการทดสอบการใช้งาน Library กันก่อนโดยเขียน code ตามนี้

อธิบาย code เล็กน้อย
บรรทัดที่ 1 import Jetson.GPIO as GPIO คือการเรียนใช้ Library Jetson GPIO ในชื่อ GPIO

บรรทัดที่ 4 เลือกการอ้างอิงชื่อขาสัญญาณ ในบนความนี้จะเลือกใช้แบบ BOARD

บรรทัดที่ 5 ปิดการแจ้งเตือนที่เกี่ยวกับขา GPIO หากต้องการเปิดการแจ้งเตือนให้เปลี่ยนค่าพารามิเตอร์จาก False เป็น True

บรรทัดที่ 9–15 ปกติแล้ว ในงานควบคุมอุปกรณ์ไฟฟ้า มักใช้การวนลูปแบบไม่รู้จบ แต่หากต้องการหยุดการทำงานของโปรแกรม โปรแกรมก็ควรคืนอุปกรณ์ที่ควบคุมอยู่กับมาให้ระบบ ซึ่งนั้นก็คือขาสัญญาณ GPIO ต่างๆ ที่ถูกควบคุมอยู่นั้นเอง จึงต้องใช้ try และ while True เพื่อวนลูปแบบไม่รู้จบ
กรณีต้องการหยุดการทำงานของโปรแกรม ให้กด Ctrl+c เพื่อหยุดการทำงานของโปรแกรม โปรแกรมจะวิ่งเข้าไปทำงานที่ finally ก่อนจบการทำงาน โดยจะเรียนใช้งาน API ชื่อ GPIO.cleanup() เพื่อคืนการควบคุมขาสัญญาณ GPIO กลับไปให้ระบบ

หากทดสอบแล้วไม่มี error ใดๆ ก็สามารถทำขั้นตอนต่อไปได้

ชื่อขาสัญญาณ

ขาสัญญาณของ Nvidia jetson nano นั้นสามารถเลือกการอ้างอิงได้หลายแบบเช่น

GPIO.setmode(GPIO.BOARD)
# หรือ
GPIO.setmode(GPIO.BCM)
# หรือ
GPIO.setmode(GPIO.CVM)
# หรือ
GPIO.setmode(GPIO.TEGRA_SOC)

ผู้เขียนบทความขออธิบายสองแบบที่นิยมใช้งานคือการอ้างอิงแบบ BOARD และแบบ BCM
- แบบ BOARD จะอ้างอิงตามชื่อขาสัญญาณ
- แบบ BCM จะอ้างอิงตามบริษัท Broadcom

ภาพจาก https://www.element14.com/community/community/designcenter/single-board-computers/blog/2019/05/21/nvidia-jetson-nano-developer-kit-pinout-and-diagrams?epik=dj0yJnU9R0FIZF84d1JHZUlvTHBzbnlKMWEzZFB4dFJkQXNHZGgmcD0wJm49Wld3RjhMcTVwenJfVTNoVFo0eE5LUSZ0PUFBQUFBR0FMMi1V

จากรูปแสดงขาสัญญาณของบอร์ด Jetson nano จะมีขาสัญญาณทั้งหมด 40 ขา เพื่อทำความเข้าใจวิธีอ้างอิงชื่อขาแบบต่างๆ จะยกตัวอย่างดังนี้

ตัวอย่างที่ 1
หากต้องการใช้ขาสัญญาณตำแหน่งที่ 12 ของบอร์ด Nvidia jetson nano
การอ้างอิงขาสัญญาณแบบ BOARD คือขา 12
การอ้างอิงขาสัญญาณแบบ BCM คือขา 18

ตัวอย่างที่ 2
หากต้องการใช้ขาสัญญาณตำแหน่งที่ 33 ของบอร์ด Nvidia jetson nano
การอ้างอิงขาสัญญาณแบบ BOARD คือขา 33
การอ้างอิงขาสัญญาณแบบ BCM คือขา 13

ตัวอย่างที่ 3
หากต้องการใช้ขาสัญญาณตำแหน่งที่ 16 ของบอร์ด Nvidia jetson nano
การอ้างอิงขาสัญญาณแบบ BOARD คือขา 16
การอ้างอิงขาสัญญาณแบบ BCM คือขา 23

ตัวอย่างการใช้งาน GPIO เป็น OUTPUT เพื่อควบคุม LED

เพื่อความปลอดภัย ปิดเครื่องให้เรียบร้อยก่อนต่อวงจรนะครับ
สิ่งที่ต้องเตรียมสำหรับการทดลองนี้ เริ่มจาก LED สีแดง 1 ตัว ตัวต้านทาน 1 ตัวค่าความต้านทานคำนวณดังนี้ R=(V(power)-V(led))/I(led)
จะได้ R = (3.3V–1.7V)/10mA
ตัวต้านทาน R จะเท่ากับ 160 ohm นั้นเอง หากตัวต้านทาน 160 ohm หาซื้อยาก หรือหาซื้อไม่ได้ สามารถใช้ค่าความต้านทานที่มากกว่าได้ เช่น 180 ohm
บางคนอาจจะงงงง ว่า 3.3V มาจากไหน นั้นคือแหล่งจ่ายไฟ 3.3V ภายในบอร์ด Jetson nano จากขาสัญญาณที่ 1 หรือ 17 ก็ได้ ส่วนค่า 10mA นั้นเอามาจาก LED สีแดงจะทำงานได้ดีที่กระแส 20mA แต่ขอสัญญาณของ Nvidia jetson nano จะรับกระแสได้ไม่มาก คือไม่ควรเกิน 10mA ดังนั้นเราใช้เพียงครี่งเดียวพอคือ10mA เพื่อทดสอบการทำงานของขาสัญญาณ

ต่อวงจรตามรูป

จากขาสัญญาณตำแหน่งที่ 1 เป็นแหล่งจ่ายไฟ 3.3V ออกมาเข้า ตัวต้านทาน 180 ohm และเข้า LED ที่ขา Anode จากนั้นจากขา Cathode กลับไปยังขาสัญญาณที่ 12 ของบอร์ด Jetson nano

พร้อมแล้ว…. ตรวจสอบวงจรให้ดี เปิดเครื่องได้

เขียนโปรแกรมเพื่อควบคุม LED ดังนี้

มาดูบรรทัดที่เพิ่มเข้ามาครับ
บรรทัดที่ 2 import time เพื่อเรียกใช้ Library time

บรรทัดที่ 10 GPIO.setup คือเป็นการเลือกกำหนดว่าขาสัญญาณที่เราจะควบคุม เป็นขาสัญญาณใด และจะให้ทำงานเป็น input หรือ output
โดยพารามิเตอร์แรก คือชื่อขาสัญญาณ ในที่นี้คือตัวแปร LED_Pin คือค่าขาสัญญาณที่ 12 (ตามการอ้างอิงขาสัญญาณแบบ BOARD)
พารามิเตอร์ต่อมาคือรูปแบบ ว่าจะให้เป็น input หรือ output ในที่นี้กำหนดให้เป็น output จะใช้ GPIO.OUT
พารามิเตอร์หลังสุดจะใช้สำหรับขาสัญญาณเป็น output เท่านั้น initial=GPIO.LOW คือกำหนดให้ระดับ logic ที่ขาสัญญาณมีระดับ logic LOW หากต้องการใช้ระดับ logic ขณะเริ่มทำงานมีระดับ logic HIGH ต้องกำหนดค่าให้เป็น GPIO.HIGH

บรรทัดที่ 16 และ 18 จะเป็นการกำหนดสถานะ logic ที่ขาสัญญาณ 12

บรรทัดที่ 17 และ 19 จะเป็นการหน่วงเวลาทำงาน 1 วินาที

เป็นอย่างไรบ้างครับ ง่ายดีไหม สำหรับการควบคุม GPIO ของบอร์ด Nvidia jetson nano เป็น output บทความถัดไปจะเป็นการอ่านค่า logic ที่ขาสัญญาณของบอร์ด Nvidia jetson nano มาใช้งานต่อไป

--

--