blog นี้จะกล่าวถึง Raspberry Pi Raspbian เป็นหลัก โดยจะอธิบายทั้งการใช้ windows และ Linux ในการเชื่อมต่อ วิธีอ่าน : ให้เริ่มอ่านตั้งแต่หัวข้อแรกๆขึ้นมา(ให้ดูที่ "คลังบทความ" ทางด้านขวามือ จะมี วัน-เวลา ไล่เรียงอยู่) ไม่งั้นอาจจะงงได้ สำหรับมือใหม่ หรือท่านใดที่ไม่เข้าใจ สามารถ mail มาถามกันได้ครับ ที่ kongimi1980@gmail.com หรือที่ line : 0814282425
วันพุธที่ 11 มกราคม พ.ศ. 2560
qt paint วาดวงกลม ระบายวงกลม วาดรูป
1. ใน mainwindow.h พิมพ์เพิ่มใน class MainWindow : public QMainWindow ดังนี้
protected:
void paintEvent(QPaintEvent *e);
2. ใน mainwindow.cpp ให้เพิ่ม #include <QPainter>
3. ใน mainwindow.cpp ให้เพิ่ม
void MainWindow::paintEvent(QPaintEvent *e){
QPen pen = QPen(Qt::black,2,Qt::PenStyle(Qt::SolidLine));
QRect rec(100,100,100,100);
QPainter p(this);
p.setPen(pen);
p.setBrush(Qt::cyan);
p.drawEllipse(rec);
p.drawArc(rec,0,360*16);
}
ถ้าต้องการให้รูปมีการเปลี่ยนแปลงให้ใช้คำสั่ง QWidget::update();
ที่มา
http://stackoverflow.com/questions/17375808/qt-drawing-a-circle
https://www.youtube.com/watch?v=xXV3_mktCmY
https://www.youtube.com/watch?v=-K-VU9I4ffY
วันอังคารที่ 10 มกราคม พ.ศ. 2560
qt สั่งเปิดโปรแกรม python
1. #include <QProcess> เพิ่มใน mainwindow.cpp
2. QProcess sysComm; (เอาไว้ใต้ include เพื่อให้สามารถใช้ได้ทั่วทุกฟังก์ชัน)
3. sysComm.start("python /home/pi/test.py"); สั่งเปิดโปรแกรม test.py ด้วย python
4. sysComm.waitForStarted();
5. sysComm.waitForFinished(); เพื่อรอให้โปรแกรมจบ
ลองเล่นกันดูครับ
วันพฤหัสบดีที่ 5 มกราคม พ.ศ. 2560
การใช้ qt serial port
ให้ทำดังต่อไปนี้
1. ไปที่ .pro แล้วพิมพ์เพิ่ม เป็น QT += core gui serialport
2. กดเมนู build เลือก run qmake
3. เข้าไฟล์ .cpp แล้ว include <QSerialPort>
4. ประกาศตัวแปร serial โดยพิมพ์เพิ่ม ใต้ include ดังนี้ QSerialPort *serial;
5. แล้วไปที่ตัว main เพื่อเริ่มกำหนดค่าต่างๆให้ serial ดังนี้
serial-> new QSerialPort(this);
serial->setPortName("/dev/ttyUSB0");
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
serial->open(QIODevice::ReadWrite);
serial->write("ok.");
6. พิมพ์เพิ่มในตอนปิดโปรแกรม ดังนี้
MainWindow::~MainWindow()
{
delete ui.
serial->close();
}
7.MainWindow.h ให้เพิ่มดังนี้
Private slots:
void serialReceive();
8. ใน MainWindow.cpp ให้พิมพ์ดังนี้
void MainWindow::serialReceive()
{
QByteArray ba;
ba = serial->readAll();
qDebug() << ba;
}
9. พิมพ์ต่อจาก serial->write("ok.")
connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceive()));
แล้วลองรันดู
โปรแกรมนี้จะส่ง "ok." ออกไป
และถ้าได้รับข้อมูลอะไรกลับมา ก็จะแสดงที่ qDebug
ตัวอย่าง การใช้งาน
https://github.com/kongimi/QrCodeSerialPortQtRpi
ที่มา
https://www.youtube.com/watch?v=UD78xyKbrfk
วันพุธที่ 28 ธันวาคม พ.ศ. 2559
qt serial non-standard baudrate example, custom speed example ตัวอย่าง
เวลาที่เราต้องการใช้ serial port และ ใช้ baudrate ไม่มาตรฐาน ( custom baudrate, custom speed, non-standard baurate, non-standard speed ) ถ้าเป็นเครื่อง pc ทั่วไป ที่มี comport ติดมากับ mainboard ก็สามารถใช้ library ที่ Qt มีมาให้ได้ทันที แต่พอเป็น usb serial ต้องใช้วิธีเขียนอีกแบบนึง จึงจะสามารถใช้งาน custom speed ได้
กว่าจะหาวิธีที่ทำให้ rpi + qt + usb serial สามารถสื่อสารโดย custom speed ได้ ค่อนข้างลำบาก (ข้อมูลค่อนข้างน้อย ใน google) ต้องรวบรวมข้อมูลจากหลายๆที่ แล้วมาทดลองทำดู ถึงจะได้ออกมา
ผู้เขียนเลือกใช้ usb serial ยี่ห้อ z-tek เวลาไปซื้อต้องบอกเจ้าของร้านว่าเอาของจริงเท่านั้น เพราะถ้าซื้อของปลอมมา จะใช้ไม่ได้ (ของปลอมทำเลียนแบบมีเยอะมาก และ ราคาก็ถูกกว่า) หรือถ้าใครมีความสามารถผลิต usb serial เองได้ โดยใช้ chipset ftdi ก็สามารถนำมาใช้ได้เหมือนกัน
มาดูตัวอย่าง code กันดีกว่า
#include <linux/serial.h>
#include <asm/termios.h>
#include <asm/ioctls.h>
#include <asm/termbits.h>
#include <stropts.h>
#include <QThread>
#include <fcntl.h> /* For O_RDWR */
#include <unistd.h> /* For open(), creat() */
main(){
int fd;
fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY);
struct termios2 tio;
ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = ความเร็วที่ต้องการ;
tio.c_ospeed = ความเร็วที่ต้องการ;
tio.c_cflag |= PARENB; // even parity
tio.c_cflag &= ~CSTOPB; // 1 stop bit
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;
tio.c_cc[VTIME]=10; // wait 10 deciseconds
tio.c_cc[VMIN]=0;
ioctl(fd, TCGETS2, &tio);
========================================
พอมาทำกับ rpi4 แล้วใช้ไม่ได้ จึงเปลี่ยนเป็นแบบนี้
struct termios2 tio;
ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 5760;
tio.c_ospeed = 5760;
tio.c_cflag |= PARENB; // even parity
ioctl(fd, TCSETS2, &tio);
========================================
char ping_cmd[] = {2,1};
char ping_rec[7];
write(fd, &ping_cmd, sizeof(ping_cmd) );
QThread::msleep(1000);
read(fd, &ping_rec, sizeof(ping_rec));
write(fd, &ping_rec, sizeof(ping_rec) );
}
เมื่อ compile ผ่านแล้ว เราก็ต่อสายสัญญาณ USB232 จาก rpi เข้ากับ RS232 ของ notebook โดยไขว้ขา 2 กับ 3 สลับกันไว้
แล้วก็เปิดโปรแกรมอะไรก็ได้ที่สามารถสื่อสารผ่าน comport ได้
ในที่นี้ผู้เขียนได้ตั้งโปรแกรม comport ที่เครื่อง notebook ไว้ว่า ถ้ามี 0x01 ผ่านเข้ามา ให้ส่ง 0x61 ออกไป ก็จะได้ผลดังรูปด้านล่าง
จอบอ
ที่มา
http://stackoverflow.com/questions/12646324/how-to-set-a-custom-baud-rate-on-linux
https://blog.mbedded.ninja/programming/operating-systems/linux/linux-serial-ports-using-c-cpp/
วันพุธที่ 21 ธันวาคม พ.ศ. 2559
qt checkbox ตัวอย่าง
แล้วลาก checkbox ลงมา สามารถลากลงมาได้หลายอัน ตามต้องการ โดยวางให้อยู่ใน GroupBox
เวลาเขียน code ก็พิมพ์ตามนี้
if(ui->radioButton->ischeck())
{
QmessageBox::infomation(0,"message1","message2");
}
โดย message1 คือ title ที่อยู่ข้างบน bar
และ message2 คือ ข้อความที่ต้องการโชว์
ที่มา
https://www.youtube.com/watch?v=0XuxnBqGpWI
qt เปิด window ใหม่, เปิดหน้าต่างใหม่
1. คลิกขวาที่โปรเจค กด add new
ฝั่งซ้าย เลือก qt , ฝั่งขวาเลือก qt designer from class แล้วกด choose
แล้วตั้งชื่อหน้าต่างใหม่ตามต้องการ ในที่นี้ตั้งชื่อว่า SecDialog
จะมีหน้าต่างใหม่ขึ้นมา กด Diaglog without button กด next
2. ใน mainwindow.cpp ให้เพิ่ม #include "SecDialog.h"
3. ไปที่ mainwindow.h เพิ่ม #include "SecDialog.h"
4. mainwindow.h ตรง private: ให้เพิ่ม SecDialog *secdialog;
5. แล้วก็ไปที่ mianwindow.ui ให้คลิกขวาที่ปุ่มที่ต้องการให้เปิดหน้าต่างใหม่ เลือกไปที่ go to slot, click() แล้วพิมพ์ดังนี้
secdialog = new SecDialog(this);
secdialog-> show();
จบ
ที่มา https://www.youtube.com/watch?v=tP70B-pdTH0
qt วาดภาพ ตัวอย่าง
เราจึงต้องเขียน code เพื่อวาดภาพเอง
ทำดังนี้
1. ใน main.h ให้เพิ่ม code เข้าไปใน class
protected:
void paintEvent(QPaintEvent *e);
2. ใน mainwindow.cpp ให้เพิ่ม #include <QtGui>
และเพิ่มฟังก์ชัน
void mainwindow::paintEvent(QPaintEvent *e)
{
QPainter p;
p.begin(this);
p.drawrect(0,0,50,50);
หรืออยากวาดอะไรก็วาดไปได้เลย
}
ที่มา
https://www.youtube.com/watch?v=xXV3_mktCmY
วันอาทิตย์ที่ 18 ธันวาคม พ.ศ. 2559
qt sleep ตัวอย่าง
และตอนใช้ ก็ใช้แบบนี้
QThread::sleep(xx); โดย xx คือ ตัวเลข ในหน่วยวินาที
หรือ
QThread::msleep(xx); โดย xx คือ ตัวเลข ในหน่วยมิลลิวินาที 1,000 มิลลิวินาที = 1 วินาที
หรือ
QThread::usleep(xx); โดย xx คือ ตัวเลข ในหน่วยไมโครวินาที 1,000,000 มิลลิวินาที = 1 วินาที





