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

บทความการพัฒนาโปรแกรมบน Raspberry Pi ด้วย Qt
ตอนที่ 6 ตัวอย่างการเขียนโปรแกรมรับ-ส่งข้อมูลผ่านทาง UART ด้วย QtserialPort

078

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

ติดตั้ง QtSerialPort
– เปิดโปรแกรม LXTerminal 
– พิมพ์คำสั่ง git clone -b old/5.1  git://gitorious.org/qt/qtserialport.git เพื่อโหลดซอร์สโค้ดของไลบรารี่

2014-09-01-105852 1280x1024 scrot

– เมื่อโหลดเสร็จจะได้ไดเรกทอรี่ของ qtserialport เพิ่มเข้ามา
– เปิดโปรแกรม Qt Creator พิมพ์คำสั่ง sudo qtcreator
– เปิดไฟล์ Project ใน qtserialport/qtserialport.pro

059
060

– ไปที่โหมด Project 

– คลิก Add Build

062

– คลิก Configure Project

– โปรแกรมจะเข้าไปที่หน้า Edit ให้กลับไปที่หน้า Project

064

– คลิก Add Build Step

065

– เลือก Make

066

– เพิ่ม Make arguments ว่า “install”

067

– ไปที่เมนู Build เลือก Rebuild All แล้วรอให้คอมไพล์จนเสร็จ

068

วิธีการปิด Serial Console ของบอร์ด Raspberry Pi
         บอร์ด Raspberry Pi เปิดใช้งาน Serial Port (ttyAMA0) เป็น Console สำหรับติดต่อกับตัวบอร์ด ซึ่งในการทดลองนี้จำเป็นจะต้องใช้ Serial Port เช่นกัน จำเป็นต้องปิดการใช้งาน Serial Console บนบอร์ดเสียก่อน ไม่ให้แย่งกันใช้ Serial Port ระหว่าง Shell ของ Linux กับ Application ที่เราเขียนขึ้น และอาจทำให้บอร์ด Error ได้
– เปิดโปรแกรม LXTerminal 
– พิมพ์คำสั่ง sudo vi /etc/inittab เปิดไฟล์ inittab เพื่อแก้ไข

069

– กด Enter

070

– เลื่อนเคอร์เซอร์ลงไปบรรทัดที่มีข้อความ T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

071

– กดตัว i (insert เข้าสู่โหมดการพิมพ์แทรก) บน keyboard เพื่อเพิ่มตัวอักษร 
– เพิ่มเครื่องหมาย # หน้าบรรทัด #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

072

– กดปุ่ม Esc เพื่อออกจากโหมดการพิมพ์ ตามด้วย :wq เพื่อบันทึก (write) และปิด (quit) แล้วกด Enter

073

– ปิด Bootup Info พิมพ์คำสั่ง sudo leafpad /boot/cmdline.txt

074

– แก้ข้อความจาก ttyAMA0 ให้เป็น tty1

075

– ไปที่เมนู File เลือก Save แล้วปิดโปรแกรม

076

– Reboot บอร์ด โดยพิมพ์คำสั่ง sudo reboot

077

ทดลองเขียนโปรแกรม รับ/ส่ง Data กับ Computer ผ่านทาง Serial Port ด้วย QtserialPort
– ต่อบอร์ด RaspberryPi กับ USB to Serial และเชื่อมต่อ USB to Serial กับคอมพิวเตอร์ดังรูป


– เปิดโปรแกรม LXTerminal แล้วเปิดโปรแกรม Qt Creator ด้วยคำสั่ง sudo qtcreator
– สร้าง Project ใหม่ชื่อ serial
– เปิดไฟล์ serial.pro แล้วเพิ่มโค้ด

CONFIG += serialport

079

– ออกแบบหน้าตาโปรแกรมให้มี Widget ดังนี้ 
  o Pushbutton 3 อัน โดยแสดงข้อความบน Button ดังนี้
       “Open”
       “Close”
       “Send”

คลิกขวาที่ PushButton ทีละอัน แล้วสร้าง Slot เลือก Signal = clicked ให้ครบทั้ง 3 อัน

080

o Combo Box 1 อัน
  o Text Edit 1 อัน
  o Line Edit 1 อัน

081

ภาพรวมของหน้าตาโปรแกรม

– ไปที่ไฟล์ mainwindows.cpp

082

– เพิ่ม include ไฟล์ QSerialPort กับ QSerialPortInfo และประกาศตัวแปล QSerialPort serial;
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
QSerialPort serial;

083

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

084

 บรรทัดที่ 14 เมื่อโปรแกรมถูกเปิดขึ้นให้วนรอบอ่านข้อมูลของ Serial Port ทั้งหมดที่เชื่อมต่ออยู่กับ RaspberryPi
         บรรทัดที่ 16 นำเอาชื่อของ Serial Port มาเพิ่มเข้าไปใน Combo Box
– เพิ่มโค้ดลงในฟังก์ชั่น void MainWindow::on_pushButton_clicked()ดังนี้

085

 บรรทัดที่ 29 นำเอารายชื่อ Serial Port ที่อยู่ใน Combo Box มาใช้งาน
         บรรทัดที่ 30 กำหนด Baud Rate = 9600 bps
         บรรทัดที่ 31 กำหนด Data Bits = 8 bits
         บรรทัดที่ 32 กำหนดให้ไม่ใช้งาน Parity Bit
         บรรทัดที่ 33 กำหนด Stop Bit = 1 bit
         บรรทัดที่ 34 กำหนดให้ไม่ใช้ Flow Control
         บรรทัดที่ 35 กำหนด Signal และ Slot เมื่อมีข้อมูลเข้ามาจากฟังก์ชั่น readyRead() ให้เข้าไปทำงานในฟังก์ชั่น readData()
         บรรทัดที่ 36 เปิดใช้งาน Serial Port แล้วตรวจสอบเงื่อนไข
         บรรทัดที่ 38 หากสามารถเปิดใช้งาน Serial Port สำเร็จ ให้เคลียร์ข้อความทั้งหมดใน Text Edit ด้วยฟังก์ชั่น clear();
         บรรทัดที่ 39 ให้แสดงข้อความ “Open Port Success” ใน Text Edit
         บรรทัดที่ 44 หากไม่สามารถเปิดใช้งาน Serial Port สำเร็จ ให้แสดงข้อความ “Unable to Open Comm Port” ใน Text Edit 
– สร้างฟังก์ชั่น readData() โดยเขียน Code ดังนี้

086

  บรรทัดที่ 50 อ่านค่าที่ได้รับมาจาก Serial Port ด้วยฟังก์ชั่น readAll() มาเก็บในตัวแปร QByteArray ชื่อ data
          บรรทัดที่ 51 แปลงตัวแปร data จาก QByteArray ให้เป็น QString และนำไปข้อความ ไปแสดงต่อจากข้อความเดิม ใน Text Edit 
– ประกาศชื่อฟังก์ชั่น readData() ใน mainwindows.h
  o ไปที่ไฟล์ mainwindows.h

087

o เพิ่มชื่อฟังก์ชั่น void readData(); วางไว้ภายใต้ private slots;

088

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

089

 บรรทัดที่ 56 ปิดการใช้งาน Serial Port

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

090

 บรรทัดที่ 61 แปลงตัวอักษรใน Line Edit เป็น UTF8 และส่งออกไปทาง Serial Port
– ทดลอง Run โปรแกรม
  o เปิดโปรแกรม Putty บนเครื่องคอมพิวเตอร์ หากไม่มีสามารถ Download ได้ที่
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

091

o หน้าแรกในหัวข้อ Session เลือก Connect Type เป็น Serial
  o จากนั้นเลือกหัวข้อ Connection > Serial แล้วกำหนดค่าต่างๆ
      ตั้ง Serial line to connect ให้ตรงกับชื่อ COM Port ของ USB to Serial
      ตั้ง Speed (baud)=9600 
      Data bits=8 
      Stop bits=1 
      Parity=None
      Flow control=None
  o คลิกปุ่ม Open บน PuTTY

092

 o คลิกปุ่ม Open ในโปรแกรมที่เราสร้างขึ้นบนบอร์ด Raspberry Pi
  o ทดสอบพิมพ์ข้อความ ThaiEasyElec ใน Line Edit และกดปุ่ม Send ข้อความใน Line Edit จะถูกส่งไปแสดงในโปรแกรม Putty ผ่านทาง Serial Port
  o ทดสอบพิมพ์ข้อความ www.ThaiEasyElec.com ในโปรแกรม Putty ข้อความจะถูกนำไปแสดงใน Text Edit ผ่านทาง Serial Port

093