В связи с тем что намечаю создание собственного робота управляемого через XBee, мозгом которого будет является компьютер, возникла надобность освоить заранее управление Arduino с помощью USB-интерфейса.
В результате будет создана программа управляющая светодиодом имеющая 4 режима — светиться, не светиться, помигать, помигать n раз.
Будет использоваться русская Qt библиотека qserialdevice. Скачать её можно здесь: qserialdevice
Просто введите в консоль git clone http://gitorious.org/qserialdevice и она появится в текущей папке. Далее следуйте инструкциям в файле Readme_ru.txt.
Сразу стоит сказать что Arduino имеет встроенный преобразователь USB-UART FT232R который обеспечивает виртуальный COM-порт, поэтому управлять платой не сложно. Всю сложную работу по коммутации ПК->Arduino за вас сделает преобразователь и драйвер для него, который обычно уже есть на вашей ОС.
Ещё стоит наверное знать что если вы используете Linux вы можете посылать данные следующим образом: echo _SIGNAL_DATA_ >> /dev/ttyUSB0
Начнём создавать Qt приложение. Сперва нужно создать интерфейс, оболочку и потом реализация посылки данных в Arduino по запросу пользователя.
Заметка для пользователей Linux
1. В файл проекта [project name].pro нужно будет дописать: LIBS += -lqserialdevice
Если при компиляции библиотека не будет найдена тогда зайдите в директорию библиотеки qserialdevice через терминал qserialdevice/src/build/release и скопируйте в папку с библиотеками /usr/lib/: sudo cp libqserialdevice.a /usr/lib
2. Файлы заголовков тоже нужно скопировать. Создайте директорию sudo mkdir /usr/include/qserialdevice . Зайдите в /qserialdevice/src/qserialdevice и скопируйте в /usr/include/: sudo cp * /usr/include/qserialdevice
Потом переходите на уровень выше и копируете другой важный файл: cd .. && sudo cp qserialdevice_global.h /usr/include/
Теперь можно полноценно использовать библиотеку.
Создаём Qt GUI проект обычным методом без формы. В конструктор MainWindow пишем:
widget = new QWidget(); grid = new QGridLayout(); button_show = new QPushButton("Show"); button_hide = new QPushButton("Hide"); button_blink = new QPushButton("Blink"); button_blink_n = new QPushButton("Blink 0"); editLine = new QLineEdit("0"); connect(editLine, SIGNAL(textChanged(QString)), this, SLOT(setButtonBlinkN(QString))); editLine->setInputMask("9"); grid->addWidget(button_show, 0, 0); grid->addWidget(button_hide, 0, 1); grid->addWidget(button_blink, 0, 2); grid->addWidget(editLine, 0, 3); grid->addWidget(button_blink_n, 0, 4); widget->setLayout(grid); setCentralWidget(widget);
Будем считать GUI готовым. Весь код целиком с комментариями доступен по этой ссылке:
Теперь пора реализовывать работу с USB-интерфейсом. Сначала я хотел сделать для работы свой класс-обёртку, но библиотека qserialdevice и так достаточно абстрагирована поэтому нужды в этом нет.
Начнём с создания функции инициализации initSerial():
AbstractSerial* serial; ... bool MainWindow::initSerial(QString dev, int baudRate) { serial = new AbstractSerial(); serial->setDeviceName(dev); if(serial->open(AbstractSerial::ReadWrite)) { serial->setBaudRate(baudRate); } else { return false; } return true; }
Функция инициализирует объект AbstractSerial — указывается устройство dev, скорость baudRate. В случае успеха возвращает — true, иначе — false.
Использование функции в конструкторе MainWindow выглядит так:
if(initSerial(tr("/dev/ttyUSB0"), 9600) == false) { qDebug() << "Error initSerial"; exit(-1); }
Далее создаём функцию для отправки данных.
void MainWindow::send(QByteArray &ba) { serial->write(ba); }
Очень простая функция. Всего-то навсего отправляет массив байтов QByteArray на порт. Массив данных QByteArray - очень удобный класс. Имеет много удобных методов для работы с байтовыми массивами - clear, resize и т.д.
Теперь осталось только сделать обработчики нажатий на кнопки(слоты) и соединить их с кнопками.
/* Not Light :) */ void MainWindow::ShowLigth() { ba[0] = 'S'; send(ba); } void MainWindow::HideLigth() { ba[0] = 'H'; send(ba); } void MainWindow::Blink() { ba[0] = 'B'; send(ba); } void MainWindow::BlinkN() { ba[0] = 'N'; send(ba); ba[0] = (char)editLine->text().toLocal8Bit().at(0); send(ba); }
ShowLigth - включить светодиод, HideLigth - выключить, Blink - дать команду помигать(да, эта функция у меня реализована в самом arduino, но это не важно, каждый сам выбирает способ реализации), BlinkN - дать команду на мигание и послать требуемое количество миганий.
Соединение кнопок с обработчиками в конструкторе MainWindow:
connect(button_show, SIGNAL(clicked()), this, SLOT(ShowLigth())); connect(button_hide, SIGNAL(clicked()), this, SLOT(HideLigth())); connect(button_blink, SIGNAL(clicked()), this, SLOT(Blink())); connect(button_blink_n, SIGNAL(clicked()), this, SLOT(BlinkN()));
Всё, теперь желаемая функциональность программы реализована!
http://www.youtube.com/watch?v=Drf-hAPUkMY
Теперь в качестве бонуса я создам обработчик получения данных и вывода их в терминал.
Создаём слот для получения данных:
void MainWindow::ReadData() { qDebug() << serial->readAll(); }
Опять же очень просто. Я использовал функцию qDebug(), у неё немного специфический вывод, но для демонстрации подойдёт.
Связываем слот с событием в функции initSerial:
connect(serial, SIGNAL(readyRead()), this, SLOT(ReadData()));
Вот и всё! Теперь вы можете создавать полноценные Qt приложения которые могут иметь возможность связи с вашей Arduino платой либо другим устройством.
Стоит выразить уважение создателю qserialdevice т.к. на самом деле очень удобная и простая библиотека.
Скачать исходный код Qt приложения можно здесь: http://narod.ru/disk/15839336001/ArduinoLigth4.tar.gz.html
Скачать qserialdevice: http://gitorious.org/qserialdevice
Скачать прошивку которую я использовал для arduino: http://narod.ru/disk/15839579001/Blink_serial.pde.html
Видео демонстрация на youtube: http://www.youtube.com/watch?v=Drf-hAPUkMY
Мой блог: http://hacking-root.blogspot.com/
0 комментариев на «“Управление Arduino с помощью USB-интерфейса через Qt приложение”»
Отличная работа!
сам всё хочу Qt освоить, да всё некогда 🙂