blog นี้จะกล่าวถึง Raspberry Pi Raspbian เป็นหลัก โดยจะอธิบายทั้งการใช้ windows และ Linux ในการเชื่อมต่อ วิธีอ่าน : ให้เริ่มอ่านตั้งแต่หัวข้อแรกๆขึ้นมา(ให้ดูที่ "คลังบทความ" ทางด้านขวามือ จะมี วัน-เวลา ไล่เรียงอยู่) ไม่งั้นอาจจะงงได้ สำหรับมือใหม่ หรือท่านใดที่ไม่เข้าใจ สามารถ mail มาถามกันได้ครับ ที่ kongimi1980@gmail.com หรือที่ line : 0814282425
วันพฤหัสบดีที่ 12 กรกฎาคม พ.ศ. 2561
qt load font
ในตอนแรกเขียน code แบบนี้
QFont myFont("font1name", 30);
ซึ่งก็ใช้ได้ผลดี ในตอนทดสอบ, โดยการเรียกจาก Terminal (./myApp -platform xcb)
แต่... หลังจากที่ทดลอง restart rpi แล้ว และโปรแกรมถูกเรียกโดยสคริปท์ autorun ปรากฎว่า font ที่เราโหลดไว้ ไม่ยอมแสดง, แสดงเป็น font อื่นซะงั้น
จึงได้ไปลอง post ถามในกลุ่ม raspberry pi thailand ดู ซึ่งก็ได้คนใจดี มาช่วยตอบคำถามให้ โดยบอกว่าให้ลองใช้ QFontDatabase และ copy font ไปไว้ใน folder เดียวกันกับ Application ของเรา
ก็เลยไปค้นหาดูว่า QFontDatabase เขาใช้กันยังไง ก็ได้มาแบบนี้
#include <QFontDatabase>
.
.
.
QString myFont;
int loadedFontID = QFontDatabase::addApplicationFont("./fontFile.ttf");
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID);
if(!loadedFontFamilies.empty())
myFont = loadedFontFamilies.at(0);
QFont P(myFont, 90, QFont::Normal, false);
myLabel->setFont(P);
ก็ลองทดสอบ reboot ดู Font ก็แสดงออกมาได้อย่างถูกต้อง
ต้องขอขอบคุณผู้มีน้ำใจช่วยเหลือ ถึงแม้ว่าจะไม่รู้จักกันมาก่อนก็ตามที
วันศุกร์ที่ 6 กรกฎาคม พ.ศ. 2561
php set max file size
มีการใช้ upload file ด้วย ซึ่งตอนแรกไม่รู้ว่า php มีการจำกัดขนาดไฟล์ไว้ด้วย และไฟล์ที่เราจะ upload ก็ใหญ่ จึงทำยังไงก็ไม่ได้ จนมีคนมาบอก ถึงใช้งานได้
วิธีกำหนดขนาดไฟล์ ที่จะ upload ดังนี้
1.เข้าไปที่ /etc/php5/apache2/php.ini
2.ให้มองหาคำว่า post_max_size แล้วแก้ไขตัวเลข ขนาดไฟล์ตามต้องการ
ตัวเลขนี้ คือตัวเลขที่จะทำการ upload ใน 1 ครั้ง จะกี่ไฟล์ก็ได้ แต่ขนาดไฟล์รวมกันทั้งหมด ต้องไม่เกินที่เรากำหนด
3.ให้มองหาคำว่า upload_max_filesize
ตัวเลขนี้ คือขนาดของไฟล์ 1 ไฟล์ ที่ต้องการ upload
ถ้าเราจะ upload file หลายๆไฟล์ ก็ให้มองหาคำว่า max_file_uploads
แก้ไขเสร็จแล้ว ให้ Restart Rpi หรือ sudo /etc/init.d/apache2 restart
วันพุธที่ 20 มิถุนายน พ.ศ. 2561
autorun gui application
ได้มีโอกาสทำ application ที่ต้องแสดงบนหน้าจอ ( GUI Application )
และต้อง auto run เมื่อเปิดขึ้นมาใหม่
วิธีการทำ auto run มีดังนี้
sudo nano /home/pi/.config/lxsession/LXDE/autostartหรือถ้าในนี้ไม่มี ก็อาจจะไปอยู่ที่/etc/xdg/lxsession/LXDE-pi/autostart
และเพิ่มบรรทัดสุดท้ายเข้าไป ยกตัวอย่าง เช่น
โปรแกรมของเรา ชื่อ myApp อยู่ใน folder /home/pi/ ก็ให้เพิ่มเข้าไปดังนี้
@/home/pi/myApp
เสร็จแล้ว ง่ายๆ แต่หาให้เจอว่าทำยังไง มันยาก 555
ที่มา
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/auto-running-programs-gui
https://learn.sparkfun.com/tutorials/how-to-run-a-raspberry-pi-program-on-startup/all
วันศุกร์ที่ 30 มีนาคม พ.ศ. 2561
LCD20*4 i2c c qt
โดยผมใช้ ภาษา C Qt Creator cross-compile บน linux ubuntu16.04 กับ rpi-3b และต่อ LCD ด้วย I2C
//============== mylcd.h =================//
#ifndef MYLCD_H
#define MYLCD_H
#define I2C_ADDR_LCD1 0x26 // LCD I2C Address
#define LCD_CHR 1 // Mode sending data
#define LCD_CMD 0 // Mode sending command
#define LINE1 0x80 // 1st line
#define LINE2 0xc0 // 2nd line
#define LINE3 0x94 // 1st line
#define LINE4 0xd4 // 2nd line
#define LCD_BACKLIGHT 0x08 // on
//#define LCD_BACKLIGHT 0x00 // off
#define ENABLE 0b00000100 // enable bit
void typeInt(int i);
void typeFloat(float myFloat);
void lcdLoc(int line); // move cursor
void ClrLcd(void); // clr LCD return home
void typeln(const char *s);
void typeChar(char val);
void lcd_init(void);
void lcd_byte(int bits, int mode);
void lcd_toggle_enable(int bits);
int fd;
#endif // MYLCD_H
//============== main.c =================//
#include <QCoreApplication>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <stdlib.h>
#include <stdio.h>
#include <mylcd.h>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if(wiringPiSetup()==-1){
qDebug() << "can't open wiring pi";
}
else
{
qDebug() << "open wiring pi!!!";
}
fd = wiringPiI2CSetup(I2C_ADDR_LCD1);
lcd_init();
char array1[] = "Hello world!";
while(1)
{
ClrLcd();
lcdLoc(LINE1);
typeln("Using wiringPi");
lcdLoc(LINE2);
typeln("Niran editor");
lcdLoc(LINE3);
typeln("I2c programmed");
lcdLoc(LINE4);
typeln("In C not python");
delay(2000);
ClrLcd();
lcdLoc(LINE1);
typeln(array1);
delay(2000);
ClrLcd();
typeln("Int ");
int value = 20125;
typeInt(value);
delay(2000);
lcdLoc(LINE2);
typeln("Float ");
float Floatvalue = 10045.25989;
typeFloat(Floatvalue);
}
return a.exec();
}
void typeln(const char *s){
while(*s){
lcd_byte(*(s++), LCD_CHR);
}
}
// float to string
void typeFloat(float myFloat){
char buffer[20];
sprintf(buffer,"%4.2f", myFloat);
typeln(buffer);
}
// int to string
void typeInt(int i){
char array1[20];
sprintf(array1,"%d", i);
typeln(array1);
}
void ClrLcd(void){
lcd_byte(0x01,LCD_CMD);
lcd_byte(0x02,LCD_CMD);
}
void lcdLoc(int line){
lcd_byte(line, LCD_CMD);
}
void typeChar(char val){
lcd_byte(val,LCD_CHR);
}
void lcd_byte(int bits, int mode){
int bits_high;
int bits_low;
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT;
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT;
wiringPiI2CReadReg8(fd,bits_high);
lcd_toggle_enable(bits_high);
wiringPiI2CReadReg8(fd,bits_low);
lcd_toggle_enable(bits_low);
}
void lcd_toggle_enable(int bits){
delay(10);
wiringPiI2CReadReg8(fd,(bits|ENABLE));
delay(10);
wiringPiI2CReadReg8(fd,(bits|~ENABLE));
delay(10);
}
void lcd_init(){
lcd_byte(0x33,LCD_CMD);
lcd_byte(0x32,LCD_CMD);
lcd_byte(0x06,LCD_CMD);
lcd_byte(0x0C,LCD_CMD);
lcd_byte(0x28,LCD_CMD);
lcd_byte(0x01,LCD_CMD);
delay(500);
}
วันอังคารที่ 14 มีนาคม พ.ศ. 2560
raspberry pi ฟอนต์ไทย, add font thai, thai font, เปลี่ยนเป็นภาษาไทย
1. หาฟอนต์มา เวปไหนก็ได้ที่ให้ดาวน์โหลดฟรี ตัวอย่างเช่น
http://www.f0nt.com/author/bangli-ko-sa-na/
2. ทำการ add font ตามนี้
ให้ copy file.ttf ที่ donwload มา ใส่ใน /usr/share/fonts/truetype
3. เปลี่ยน keyboard layout ตามนี้
3.1 sudo nano /etc/default/keyboard
3.2 แก้ไขไฟล์ ตามนี้
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us,th"
XKBVARIANT=""
XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll us,th"
BACKSPACE="guess"
4. reboot
ถ้าต้องการเปลี่ยนภาษา ให้กด alt + shift
ที่มา
http://www.f0nt.com/author/bangli-ko-sa-na/
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/gui/fonts-2
http://www.mindphp.com/forums/viewtopic.php?f=215&t=34602
มีอีกวิธีนึง
https://opensource.cc.psu.ac.th/%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B8%9F%E0%B8%AD%E0%B8%99%E0%B8%95%E0%B9%8C%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B8%9A%E0%B8%99_ubuntu_16.04_server
ทำเสร็จแล้วก็ reboot
วันพุธที่ 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