บทความการพัฒนาโปรแกรมบน Raspberry Pi ด้วย Qt ตอนที่ 5

บทความการพัฒนาโปรแกรมบน Raspberry Pi ด้วย Qt
ตอนที่ 5 แนะนำให้รู้จักไลบรารี่ WiringPi, วิธีการติดตั้ง
พร้อมตัวอย่างการเขียนโปรแกรมควบคุมฮาร์ดแวร์ด้วยไลบรารี่ WiringPi

036

โดยเนื้อหาหลักๆ จะประกอบด้วยหัวข้อดังนี้

การเขียนโปรแกรมควบคุมฮาร์ดแวร์ด้วยไลบรารี่ 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 แล้วรอจนอัพเดทเสร็จ

018

 o พิมพ์คำสั่ง sudo apt-get upgrade แล้วรอจนอัพเกรดเสร็จ

019

– พิมพ์คำสั่ง sudo apt-get install git-core เพื่อติดตั้ง Git Core

020

– พิมพ์คำสั่ง sudo apt-get install libi2c-dev เพื่อติดตั้งไลบรารี่ของ I2C

021

– พิมพ์คำสั่ง git clone git://git.drogon.net/wiringPi เพื่อสร้างลิงค์ WiringPi จาก Git

022

– พิมพ์คำสั่ง cd wiringPi กด Enter

023


– พิมพ์คำสั่ง git pull origin เพื่อดึงซอร์สโค้ดมาจากต้นทาง

024

– พิมพ์คำสั่ง ./build เพื่อคอมไพล์ WiringPi

025

– ทดสอบการติดตั้ง WiringPi พิมพ์คำสั่ง gpio –v จะปรากฏข้อความดังภาพ


พิมพ์คำสั่ง gpio readall จะปรากฏตาราง GPIO ดังภาพ

027

ติดตั้ง C library for Broadcom BCM2835

– พิมพ์คำสั่ง cd กลับไปที่ Home Directory
– พิมพ์คำสั่ง sudo wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.36.tar.gz เพื่อดาวน์โหลดไฟล์ไลบรารี่จากลิงค์

028

– พิมพ์คำสั่ง tar xvfz bcm2835-1.36.tar.gz เพื่อแตกไฟล์ที่บีบอัดมา

029

– พิมพ์คำสั่ง cd bcm2835-1.36 เปลี่ยนไดเรกทอรี่เข้าไปที่ bcm2835-1.36

– พิมพ์คำสั่ง ./configure เพื่อโหลดค่าคอนฟิก

พิมพ์คำสั่ง make เพื่อสร้างไฟล์ติดตั้ง

032

– พิมพ์คำสั่ง make check เพื่อตรวจสอบไฟล์

033

– พิมพ์คำสั่ง sudo make install เพื่อติดตั้ง

034

WiringPi Pin

           เนื่องจาก Pin บนคอนเน็คเตอร์สำหรับใช้งาน GPIO ของ RaspberryPi แต่ละ Pin ค่อนข้างจะอยู่กระจายกันทำให้มีโอกาสสับสนได้ง่ายในการใช้งาน WiringPi จึงได้กำหนดชื่อของ Pin ขึ้นมาใหม่ทำให้ผู้ใช้เรียกใช้ในการเขียนโปรแกรมได้ง่ายขึ้น สามารถดูความแตกต่างได้ดังภาพ

035

ทดสอบใช้งาน WiringPi จาก Code ตัวอย่าง Blink.c

– ต่อวงจร Raspberry Pi กับ LED ดังรูป

036

– เปิดโปรแกรม LXTerminal 

– พิมพ์คำสั่ง cd กลับไปที่ Home Directory

– พิมพ์คำสั่ง cd wiringPi/examples เปลี่ยนไปยังไดเรกทอรี่ examples ภายใต้ wiringPi

037

– พิมพ์คำสั่ง gcc -Wall -o blink blink.c –lwiringPi เพื่อคอมไพล์ตัวอย่างโปรแกรม blink.c

038

– พิมพ์คำสั่ง sudo ./blink เพื่อรันโปรแกรม

039

– จะพบว่า LED ที่ต่อไว้ที่ GPIO0 กระพริบทุกๆ 500 ms

– หากต้องการหยุดการทำงานของโปรแกรมให้กด Ctrl + z

เขียนโปรแกรมควบคุม LED ด้วย Qt

   ในส่วนนี้จะเป็นการเขียนควบคุม On/Off LED เหมือนเนื้อหาที่ผ่านมาแต่จะนำเอาไลบรารี่ WiringPi เข้ามาใช้งานซึ่งทำให้การเขียนโปรแกรมควบคุม GPIO ทำได้ง่ายขึ้น
ขั้นตอนการทดลอง
– ต่อวงจร Raspberry Pi กับ LED ดังรูป

040

– เปิดโปรแกรม LXTerminal แล้วเปิดโปรแกรม Qt Creator พิมพ์คำสั่ง sudo qtcreator

– สร้าง Project ใหม่ชื่อ GPIO ให้ลองตั้งค่าต่างๆ โดยย้อนไปดูตัวอย่างในส่วนที่ผ่านมา

041

– เปิดไฟล์ gpio.pro

– เพิ่มไลบรารี่และ Include path โดยเพิ่มโค้ดลงไปในไฟล์ gpio.pro ดังนี้

LIBS += -L/usr/local/lib -lwiringPi -lwiringPiDev

INCLUDEPATH += /usr/local/include

– เปิดไฟล์ mainwindows.ui

044

– สร้างปุ่มแบบ PushButton จำนวน 2 ปุ่ม ชื่อ LED On และ LED Off

045

– คลิกขวาที่ปุ่มทั้งสองแล้วเลือก Go to slot เลือก Signal เป็น clicked

046

– เปิดไฟล์ mainwindows.cpp

047

– เพิ่ม #include <wiringPi.h> และประกาศตัวแปร int led = 0 (LED ต่ออยู่ที่ GPIO0)

048

– เพิ่มโค้ดลงในฟังก์ชั่น MainWindow::MainWindow(QWidget *parent):QMainWindow (parent),ui(new Ui::MainWindow) ดังนี้

049

บรรทัดที่ 11 ตั้งค่าเริ่มต้นให้ใช้โครงสร้าง Pin ในรูปแบบของ WiringPi 

        บรรทัดที่ 12 กำหนดโหมดทิศทางให้กับ GPIO0 เป็น Output

– เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_clicked()

050

  บรรทัดที่ 22 กำหนด Output เป็น High ที่ GPIO0

– เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_2_clicked()

051

    บรรทัดที่ 27 กำหนด Output เป็น Low ที่ GPIO0
– ทดลอง Run โปรแกรม

เขียนโปรแกรมรับ Digital Input จาก Switch ด้วย Qt

ในการทดลองนี้จะใช้ Qtimer ซึ่งเป็น Timer ของ Qt มาวนรอบอ่านค่า อินพุตจาก GPIO7
และแสดงผลผ่านทางกรอบ Line Edit บนหน้าต่างโปรแกรม
ขั้นตอนการทดลอง
– ต่อวงจร Raspberry Pi กับ Switch แบบกดติดปล่อยดับดังรูป

052

– เปิดโปรแกรม LXTerminal แล้วเปิดโปรแกรม Qt Creator ด้วยคำสั่ง sudo qtcreator

– สร้าง Project ใหม่ชื่อ input
– เปิดไฟล์ input.pro แล้วเพิ่มไลบรารี่และ Include path โดยเพิ่มโค้ดลงไปในไฟล์ input.pro ดังนี้

LIBS += -L/usr/local/lib -lwiringPi -lwiringPiDev

INCLUDEPATH += /usr/local/include

– เปิดไฟล์ mainwindows.ui สร้าง Line Edit แล้วปรับแต่งหน้าตาโปรแกรมตามความเหมาะสม

053

– เปิดไฟล์ mainwindow.cpp เพิ่ม #include <qtimer.h> #include <wiringPi.h> และประกาศตัวแปร int intput_pin=7 ให้รับ Digital Input จาก GPIO7

– เพิ่มโค้ดลงไปในฟังก์ชั่น MainWindow::MainWindow(QWidget *parent):QMainWindow (parent),ui(new Ui::MainWindow) ดังนี้

054

บรรทัดที่ 13 ตั้งค่าเริ่มต้นให้ใช้โครงสร้าง Pin ในรูปแบบของ WiringPi

      บรรทัดที่ 14 กำหนด Direction ให้กับ GPIO0 เป็น Input
      บรรทัดที่ 16 สืบทอดคลาส Qtimer โดยตั้งชื่อว่า timer
      บรรทัดที่ 17 สร้าง Signal และ Slot ให้ timer เมื่อครบเวลาตามกำหนดในฟังก์ชั่น timeout() จะเกิด Signal ให้เข้าไปทำงาน Slot ที่ได้สร้างฟังก์ชั่น interval() มารองรับ ผลคือ เมื่อครบเวลาตามกำหนดจะมีการกระโดดเข้ามาทำงานในฟังก์ชั่น interval() ทุกครั้ง
      บรรทัดที่ 18 เริ่มให้ timer ทำงานและกำหนดเวลาไว้ที่ 100 ms

– สร้างฟังก์ชั่น แล้วกำหนดการทำงาน interval ดังนี้

055

  บรรทัดที่ 26 อ่านค่าอินพุต GPIO7 จากวงจรที่เราต่อแบบ Pull Up ในสถานะที่ยังไม่มีการกดสวิตช์จึงมีไฟ 3.3V หรือ Logic 1 (High) เข้ามาที่ GPIO7 ตลอดเวลา และเมื่อเรากดสวิตช์จะทำให้กระแสไหลผ่านตัวต้านทานลงกราวด์ที่ GPIO7 จึงเป็น 0V หรือ Logic 0 (Low)

      บรรทัดที่ 27 หากมีการกดสวิตช์จะขึ้นข้อความบน Line Edit ว่า “Input Low”
      บรรทัดที่ 29 หากไม่มีการกดสวิตช์จะขึ้นข้อความบน Line Edit ว่า “Input High”

– ประกาศชื่อฟังก์ชั่น interval() ไว้ใน mainwindows.h

      o เปิดไฟล์ mainwindows.h

056

    o เพิ่มโค้ดในไฟล์ mainwindows.h ดังนี้

057

– ทดลอง Run โปรแกรม