Приведен пример использования кросс платформенной библиотеки QT5 в работе с платой Arduino для управления серво приводом Tower Pro Micro Servo 9g.
#include
String readString;
Servo myservo;
int servo1pos;
void setup() {
Serial.begin(9600);
myservo.attach(9);
// Вернем серву в начальную позицию.
// В ноль почему те не возвращается.
// Механические ограничения, поэтому 6
myservo.write(6);
}
void loop() {
while (Serial.available()) {
delay(3); //delay to allow buffer to fill
if (Serial.available() >0) {
char c = Serial.read(); //gets one byte from serial buffer
readString += c; //makes the string readString
}
}
if (readString.length() >0)
{
Serial.println(readString); //see what was received
int commaIndex = readString.indexOf(' ');
String firstValue = readString.substring(0, commaIndex);
servo1pos = firstValue.toInt();
if ((servo1pos > 0) & (servo1pos < 180)) {
myservo.write(servo1pos);
delay(15);
}
}
//очистим строку
readString = "";
}
Код формы
MainWindow
0
0
285
183
MainWindow
10
30
261
91
Servo1
220
20
31
16
max
210
40
41
21
170
10
20
31
16
min
10
40
41
21
6
110
20
41
16
cur
Qt::AlignCenter
10
60
241
22
Qt::Horizontal
10
0
261
26
0
0
285
22
Действия
TopToolBarArea
false
Connect
Disconnect
readData()
#include "mainwindow.h"
#include "ui_mainwindow.h"
int servo1pos;
QString gstr;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
serial = new QSerialPort(this);
connect(ui->actionConnect, SIGNAL(triggered()), this, SLOT(openSerialPort()));
connect(ui->actionDisconnect, SIGNAL(triggered()), this, SLOT(closeSerialPort()));
connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this,
SLOT(handleError(QSerialPort::SerialPortError)));
connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(writeData()));
servo1pos = ui->horizontalSlider->value();
ui->label_3->setText(QString::number(servo1pos));
//установим границы horizontalSlider
ui->horizontalSlider->setMinimum(ui->lineEdit_3->text().toInt());
ui->horizontalSlider->setMaximum(ui->lineEdit_2->text().toInt());
ui->serialPortInfoListBox->clear();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QStringList list;
list << info.systemLocation();
ui->serialPortInfoListBox->addItem(list.first(), list);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::openSerialPort()
{
serial->setPortName(ui->serialPortInfoListBox->currentText());
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
if (serial->open(QIODevice::ReadWrite)) {
ui->actionConnect->setEnabled(false);
ui->actionDisconnect->setEnabled(true);
qDebug() << "\nPort settings successfully";
} else {
QMessageBox::critical(this, tr("Error"), serial->errorString());
qDebug() << "\nPort settings failed";
}
}
void MainWindow::closeSerialPort()
{
if (serial->isOpen())
serial->close();
ui->actionConnect->setEnabled(true);
ui->actionDisconnect->setEnabled(false);
}
void MainWindow::writeData()
{
serial->write(gstr.toLocal8Bit());
}
void MainWindow::handleError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError) {
QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
closeSerialPort();
}
}
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
ui->label_3->setText(QString::number(position));
servo1pos = position;
gstr = QString::number(servo1pos) + ":";
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void openSerialPort();
void closeSerialPort();
void writeData();
void handleError(QSerialPort::SerialPortError error);
void on_horizontalSlider_sliderMoved(int position);
private:
Ui::MainWindow *ui;
QSerialPort *serial;
};
#endif // MAINWINDOW_H
Все исходные коды доступны на https://github.com/dmitryzakharov1/QT5_Arduino_servo_usb
Как обычно, демонстрация работы