นอกจากเจ้าบอร์ด Raspberry Pi ของเราจะมี Port ต่างๆให้ใช้งานแล้ว ไม่ว่าจะเป็น Port USB , Port Network , Port Audio เป็นต้นแล้ว พอร์ตต่างๆ พวกนี้ ล้วนต่อเข้ากับซีฟไอซีเบอร์ BCM2835 ARM pheriperal ซึ่งทำหน้าที่เป็นแขน เป็นขา เป็นหูเป็นตา เอาไว้ใช้งานของเจ้า CPU แล้ว ที่ไอซีเบอร์นี้ ยังมีช่อง GPIO เหลือ จากการต่อกับพอร์ตเหล่านั้น มาให้เราใช้งานอีก ซึ่งเค้าเหลือไว้สำหรับให้เราเอาไปใช้งานอะไรก็ได้ ตามแต่เราจะนึกอยากใช้ จะสังเกตเห็น Pin ตัวผู้ เรียงเป็นแถวคู่ 2 แถวนั่นแหละครับ เป็นแนว PIN GPIO
GPIO ย่อมาจาก General Purpose Input/Output นั่นก็แปลว่า ขา pin เหล่านี้ มีไว้ใช้ในงานทั่วๆ ไป โดยควบคุมผ่านซอร์ฟแวร์ โดยในที่นี้ เราจะมาดูขา GPIO ของเจ้าบอร์ด Raspberry Pi ของเรานะครับ ส่วนถ้าเป็นบอร์ดอื่นๆ ก็ค่อยมาว่ากันต่อไป ดูรูปข้างล่าง แล้วเทียบกับบอร์ดจริงนะครับ
ถึงแม้ที่ขั้วต่อ P1 ตำแหน่งที่ P1-02 มีแรงดัน 5 Vdc นั่นก็ไม่ได้หมายความว่า ขา GPIO ที่เหลือจะรับแรงดันได้ 5 Vdc นะครับ ทุกขาของ GPIO สามารถรับแรงดัน หรือจ่ายแรงดันไฟตรง ได้ไม่เกิน 3.3 Vdc เท่านั้น ตรงนี้ ต้องระวังให้ดี เพราะถ้าดูจากลายวงจรของบอร์ดแล้วหล่ะก็ จะพบว่า ตำแหน่งขั้วต่อ P1 นั้น ต่อตรงเข้าไปที่ chip ของ ARM Processor เลย นอกจากเรื่องแรงดันไฟกระแสตรง ที่เราต้องระวังไม่ให้รับไฟเกินแล้ว เรายังต้องระวังเรื่องของไฟฟ้าสถิตย์ที่อยู่รอบๆ ตัวเรา จะชาร์ตเข้าไปที่ขาดังกล่าวด้วย วิธิป้องกัน ก็พยายามสัมผัสที่ขั้วพวกนี้ ให้น้อย หรือไม่ก็ทำขั้วต่อออกมา เป็นพวกสายแพร ที่มีขั้วต่อเป็นแบบพลาสติก เพื่อป้องกันการสัมผัสจากตัวเราไปโดนที่ขาเหล่านี้โดยตรง (หลีกเลี่ยงให้มากที่สุด ว่างั้นเหอะ)
ในบางตำแหน่ง pin สามารถทำงานในอีกฟังก์ชั่นหนึ่ง สังเกตจากตาราง ที่ช่อง Alt 0 Function จะพบนอกจากจะทำหน้าที่เป็น GPIO แล้ว ยังทำหน้าที่อื่นได้อีกด้วย เช่น I2C , SPI , UART แต่ไม่มีขาไหนทำหน้าที่ ADC เพื่อรับสัญญาณ Analog เลย เราคงต้องต่อไอซีเพิ่ม หากต้องการอ่านค่าจาก Sensor หรือจาก output ของอุปกรณ์ใดๆ ที่ให้สัญญาณ Analog เข้ามาที่บอร์ด Raspberry Pi
ทั้งหมดนั่นเป็น GPIO ที่ Raspberry Pi เหลือไว้ให้เราใช้ จริงๆ มันมี GPIO มากกว่านี้ แต่มันถูกนำไปใช้อ่าน SD-Card บ้าง ใช้ทำ HDMI บ้าง ใช้ต่อกับอุปกรณ์อื่นๆ เช่น Port Network , Audio out บ้าง ทำให้เหลือ GPIO ให้เราใช้เพียงเท่านี้ แต่นั่นก็เพียงพอ แล้วหล่ะผมว่านะ ถ้าใครต้องการ GPIO เพิ่มมากกว่านี้ ก็อาจจะใส่ไอซีขยายพอร์ต ที่สื่อสารผ่าน I2C หรือ SPI ก็ได้ เพราะเรามี GPIO พวกที่ติดต่อผ่าน Protocal พวกนี้ได้อยู่แล้ว
ในการพัฒนาโปรแกรม เพื่อเรียกใช้ GPIO นั้น ตอนนี้ ก็มีหลายๆ คนใช้ภาษา GCC ก็มี ใช้ Python ก็มี หรือแม้แต่จะใช้ความสามารถของ Shell ที่มีอยู่แล้ว คู่กับ Linux มาก็ได้ ในการติดต่อกับ GPIO พวกนี้ ไม่ว่าจะใช้ภาษาใดก็ตาม สุดท้ายแล้ว เรากำลังเล่นกับ Filesystem ที่ชื่อ sysfs ที่อยู่ใน memory ซึ่งเป็นส่วนที่ไว้ติดต่อกับ Kernel ของ Linux นั่นเอง ศึกษาเพิ่มเติมได้จาก "การใช้งาน GPIO บน Embedded Linux" ของท่าน atlantaman ครับ
ในตอนนี้ ผมจะทดสอบการติดต่อกับ GPIO7 ด้วยคำสั่ง Shell นี่แหละครับ เพื่อให้เกิดความเข้าใจกันก่อน ซึ่งในตอนต่อไป เราคงจะไปเรียกใช้ Lib ที่มีคนทำไว้แล้ว มาใช้งาน น่าจะสะดวกกว่า
ซึ่งเจ้า sysfs ที่ติดต่อกับ GPIO นั่น จะอยู่ใน folder /sys/class/gpio ใน folder นี้ จะเป็นของ root ครับ เราจะต้องแปลงร่างตัวเองให้กลายเป็น root ก่อน โดยใช้คำสั่ง
su root
จากนั้นก็ใส่ password ของ root เข้าไป หากจำไม่ได้ หรือยังไม่ได้เปลี่ยน ก็ให้เปลี่ยน password root ซะ ด้วยคำสั่ง
sudo passwd root
แล้วก็เปลี่ยนตัวเองให้กลายเป็น root สังเกตว่า จะเปลี่ยนจาก $ กลายเป็น # แสดงว่าเรากลายเป็น root แล้ว
เราอาาจะต้องลง package tree เพื่อเรียกใช้คำสั่ง tree เพื่อเอาไว้ดูว่าโครงสร้าง folder เป็นอย่างไร อันนี้จะลง หรือไม่ลง ก็ไม่เกี่ยวกับการสั่ง GPIO นะครับ เพียงแต่มันทำให้เราเห็นโครงสร้าง folder หรือ link file เท่านั้นเอง
ติดตั้ง tree package ใช้คำสั่ง
apt-get install tree (ถ้าเราเป็น root อยู่แล้ว) หรือใช้คำสั่ง
sudo apt-get install tree (หากเราไม่ได้เป็น root ครับ )
เปลี่ยนตัวเองเป็น root แล้วเข้าไปที่
cd /sys/class/gpio
แล้วลองเรียกใช้คำสั่ง tree gpiochip0 ดู ผลลัพธ์ แล้วศึกษาตามลิ้งค์ที่ให้ไปครับ ว่าคล้ายกันไหม
เราจำเป็นต้องสร้าง link file ก่อนครับ เพื่อให้ link file ที่เราสร้าง เชื่อมโยงกับ GPIO7 ก่อน ด้วยคำสั่ง
echo 7 > export
เมื่อเราใช้คำสั่ง ls -la เราจะพบว่า เกิด link file เกิดขึ้น ชื่อ gpio7
ต่อไป ก็กำหนดให้ GPIO7 ทำหน้าที่เป็น output pin ซะ ด้วยคำสั่ง
echo out > gpio7/direction
ตอนนี้ gpio7 ของเรากลายเป็น output pin แล้ว ที่เหลือก็สั่งให้เกิด logic 1,0 เพื่อให้เกิดสัญญาณดิจิตอลที่ขา GPIO7 ด้วยคำสั่ง
echo 1 > gpio7/value
echo 0 > gpio7/value
สังเกตที่บอร์ดของเรา ที่เราได้ต่อ LED อนุกรมกับ R ค่าสักประมาณ 330 - 560 โอห์ม กับหลอด LED ที่หลอดนี้ จะติดดับตามคำสั่งของเรา
0 ความคิดเห็น:
Post a Comment