Управление Arduino с помощью USB-интерфейса через Qt приложение


В связи с тем что намечаю создание собственного робота управляемого через 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 приложение”»

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение