ตอนที่ 5 แนะนำให้รู้จักไลบรารี่ WiringPi, วิธีการติดตั้ง
พร้อมตัวอย่างการเขียนโปรแกรมควบคุมฮาร์ดแวร์ด้วยไลบรารี่ WiringPi
การเขียนโปรแกรมควบคุมฮาร์ดแวร์ด้วยไลบรารี่ WiringPi
WiringPi คือ กลุ่มของไลบรารี่ที่พัฒนาโดย http://wiringpi.com สำหรับเข้าถึงการใช้งาน GPIO ของชิพ BCM2835 ที่เป็นชิพประมวลผลหลักของบอร์ด Raspberry Pi ซึ่งสามารถใช้งานได้จากภาษา C/C++ และภาษาอื่นๆ อีกหลากหลายภาษาที่ WiringPi ออกแบบชุดคำสั่งให้มีลักษณะคล้ายกับการใช้งานภาษา Wiring ทำให้ผู้ที่เคยใช้งานบอร์ด Arduino รู้สึกคุ้นเคยกับรูปแบบชุดคำสั่งและทำให้การควบคุมฮาร์ดแวร์ของบอร์ด Raspberry Pi สามารถทำได้ง่ายขึ้น
วิธีติดตั้ง WiringPi ของบอร์ด Raspberry Pi- เชื่อมต่อบอร์ด Raspberry Pi กับ Internet
- เปิดโปรแกรม LXTerminal
- ในขั้นตอนการใช้คำสั่ง update และ upgrade จะใช้เวลาในการค่อนข้างนาน หากเคย update และ upgrade ไปแล้ว อาจทดลองใช้คำสั่ง git clone git://git.drogon.net/wiringPi ในหัวข้อถัดไปดูก่อน แล้วหากไม่ Error ก็สามารถข้ามขั้นตอนนี้ไปได้
o พิมพ์คำสั่ง sudo apt-get update แล้วรอจนอัพเดทเสร็จ
o พิมพ์คำสั่ง sudo apt-get upgrade แล้วรอจนอัพเกรดเสร็จ
- พิมพ์คำสั่ง sudo apt-get install git-core เพื่อติดตั้ง Git Core
- พิมพ์คำสั่ง sudo apt-get install libi2c-dev เพื่อติดตั้งไลบรารี่ของ I2C
- พิมพ์คำสั่ง git clone git://git.drogon.net/wiringPi เพื่อสร้างลิงค์ WiringPi จาก Git
- พิมพ์คำสั่ง cd wiringPi กด Enter
- พิมพ์คำสั่ง git pull origin เพื่อดึงซอร์สโค้ดมาจากต้นทาง
- พิมพ์คำสั่ง ./build เพื่อคอมไพล์ WiringPi
- ทดสอบการติดตั้ง WiringPi พิมพ์คำสั่ง gpio –v จะปรากฏข้อความดังภาพ
- พิมพ์คำสั่ง gpio readall จะปรากฏตาราง GPIO ดังภาพ
ติดตั้ง C library for Broadcom BCM2835
- พิมพ์คำสั่ง cd กลับไปที่ Home Directory
- พิมพ์คำสั่ง sudo wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.36.tar.gz เพื่อดาวน์โหลดไฟล์ไลบรารี่จากลิงค์
- พิมพ์คำสั่ง tar xvfz bcm2835-1.36.tar.gz เพื่อแตกไฟล์ที่บีบอัดมา
- พิมพ์คำสั่ง cd bcm2835-1.36 เปลี่ยนไดเรกทอรี่เข้าไปที่ bcm2835-1.36
- พิมพ์คำสั่ง ./configure เพื่อโหลดค่าคอนฟิก
- พิมพ์คำสั่ง make เพื่อสร้างไฟล์ติดตั้ง
- พิมพ์คำสั่ง make check เพื่อตรวจสอบไฟล์
- พิมพ์คำสั่ง sudo make install เพื่อติดตั้ง
WiringPi Pin
เนื่องจาก Pin บนคอนเน็คเตอร์สำหรับใช้งาน GPIO ของ RaspberryPi แต่ละ Pin ค่อนข้างจะอยู่กระจายกันทำให้มีโอกาสสับสนได้ง่ายในการใช้งาน WiringPi จึงได้กำหนดชื่อของ Pin ขึ้นมาใหม่ทำให้ผู้ใช้เรียกใช้ในการเขียนโปรแกรมได้ง่ายขึ้น สามารถดูความแตกต่างได้ดังภาพ
- ต่อวงจร Raspberry Pi กับ LED ดังรูป
- พิมพ์คำสั่ง cd กลับไปที่ Home Directory
- พิมพ์คำสั่ง cd wiringPi/examples เปลี่ยนไปยังไดเรกทอรี่ examples ภายใต้ wiringPi
- พิมพ์คำสั่ง gcc -Wall -o blink blink.c –lwiringPi เพื่อคอมไพล์ตัวอย่างโปรแกรม blink.c
- พิมพ์คำสั่ง sudo ./blink เพื่อรันโปรแกรม
- จะพบว่า LED ที่ต่อไว้ที่ GPIO0 กระพริบทุกๆ 500 ms
- หากต้องการหยุดการทำงานของโปรแกรมให้กด Ctrl + z
เขียนโปรแกรมควบคุม LED ด้วย Qt
ในส่วนนี้จะเป็นการเขียนควบคุม On/Off LED เหมือนเนื้อหาที่ผ่านมาแต่จะนำเอาไลบรารี่ WiringPi เข้ามาใช้งานซึ่งทำให้การเขียนโปรแกรมควบคุม GPIO ทำได้ง่ายขึ้น
ขั้นตอนการทดลอง
- ต่อวงจร Raspberry Pi กับ LED ดังรูป
- เปิดโปรแกรม LXTerminal แล้วเปิดโปรแกรม Qt Creator พิมพ์คำสั่ง sudo qtcreator
- สร้าง Project ใหม่ชื่อ GPIO ให้ลองตั้งค่าต่างๆ โดยย้อนไปดูตัวอย่างในส่วนที่ผ่านมา
LIBS += -L/usr/local/lib -lwiringPi -lwiringPiDev
INCLUDEPATH += /usr/local/include
บรรทัดที่ 12 กำหนดโหมดทิศทางให้กับ GPIO0 เป็น Output
- เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_clicked()
- เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_2_clicked()
- ทดลอง Run โปรแกรม
เขียนโปรแกรมรับ Digital Input จาก Switch ด้วย Qt
ในการทดลองนี้จะใช้ Qtimer ซึ่งเป็น Timer ของ Qt มาวนรอบอ่านค่า อินพุตจาก GPIO7
และแสดงผลผ่านทางกรอบ Line Edit บนหน้าต่างโปรแกรม
ขั้นตอนการทดลอง
- ต่อวงจร Raspberry Pi กับ Switch แบบกดติดปล่อยดับดังรูป
- สร้าง Project ใหม่ชื่อ input
- เปิดไฟล์ input.pro แล้วเพิ่มไลบรารี่และ Include path โดยเพิ่มโค้ดลงไปในไฟล์ input.pro ดังนี้
LIBS += -L/usr/local/lib -lwiringPi -lwiringPiDev
INCLUDEPATH += /usr/local/include
- เปิดไฟล์ mainwindows.ui สร้าง Line Edit แล้วปรับแต่งหน้าตาโปรแกรมตามความเหมาะสม
- เพิ่มโค้ดลงไปในฟังก์ชั่น MainWindow::MainWindow(QWidget *parent):QMainWindow (parent),ui(new Ui::MainWindow) ดังนี้
บรรทัดที่ 14 กำหนด Direction ให้กับ GPIO0 เป็น Input
บรรทัดที่ 16 สืบทอดคลาส Qtimer โดยตั้งชื่อว่า timer
บรรทัดที่ 17 สร้าง Signal และ Slot ให้ timer เมื่อครบเวลาตามกำหนดในฟังก์ชั่น timeout() จะเกิด Signal ให้เข้าไปทำงาน Slot ที่ได้สร้างฟังก์ชั่น interval() มารองรับ ผลคือ เมื่อครบเวลาตามกำหนดจะมีการกระโดดเข้ามาทำงานในฟังก์ชั่น interval() ทุกครั้ง
บรรทัดที่ 18 เริ่มให้ timer ทำงานและกำหนดเวลาไว้ที่ 100 ms
- สร้างฟังก์ชั่น แล้วกำหนดการทำงาน interval ดังนี้
บรรทัดที่ 27 หากมีการกดสวิตช์จะขึ้นข้อความบน Line Edit ว่า “Input Low”
บรรทัดที่ 29 หากไม่มีการกดสวิตช์จะขึ้นข้อความบน Line Edit ว่า “Input High”
- ประกาศชื่อฟังก์ชั่น interval() ไว้ใน mainwindows.h
o เปิดไฟล์ mainwindows.h
ไม่มีความคิดเห็น:
แสดงความคิดเห็น