Ci-dessous, les différences entre deux révisions de la page.
tutoriels:informatique:qtduino [2013/04/04 07:32] vlamoine modif projet Qt Creator |
tutoriels:informatique:qtduino [2017/03/19 14:56] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Contrôler un Arduino grâce à Qt Creator ====== | ||
- | **Tout ces documents sont sous licence CC BY-NC-SA :** | ||
- | Cette licence permet aux autres de remixer, arranger, et adapter votre œuvre à des fins non commerciales tant qu'on vous crédite en citant votre nom et que les nouvelles œuvres sont diffusées selon les mêmes conditions. | ||
- | Ce projet a été initié par Victor Lamoine | ||
- | |||
- | ==== Introduction ==== | ||
- | Pré-requis : Aucun ! Tout est expliqué et détaillé, aucune connaissance particulière n'est nécessaire. C'est réalisable par tout le monde ! | ||
- | |||
- | ==== Objectif ==== | ||
- | On va contrôler un servomoteur grâce a une application Qt. La communication se fait par le câble USB | ||
- | |||
- | <<http://vicopsp.free.fr/tyfab/qtservo.m4v|Voir la vidéo>> | ||
- | |||
- | ==== Matériel ==== | ||
- | * Un Arduino (j'utilise un Arduino Nano 3.0) | ||
- | * Un PC, s'il n'est pas sous Linux il faudra adapter le code Qt (le mien est sous Ubuntu 12.04.2 desktop (64 bits)) | ||
- | * Un servomoteur | ||
- | |||
- | ==== Installation ==== | ||
- | Il faut installer Qt Creator et compiler ExtSerialPort : | ||
- | |||
- | <code>sudo apt-get install -y qtcreator && git clone https://code.google.com/p/qextserialport/ && cd qextserialport && qmake && make && sudo make install</code> | ||
- | |||
- | === Arduino === | ||
- | On branche l'Arduino sur l'USB après avoir branché le servomoteur :\\ | ||
- | Rouge : 5V\\ | ||
- | Marron : GND\\ | ||
- | Jaune : D9\\ | ||
- | |||
- | Démarrer un projet Arduino et compiler/transférer ce code : | ||
- | <code>#include <Servo.h> | ||
- | |||
- | Servo srv; | ||
- | int incomingByte = 0; | ||
- | |||
- | void setup() | ||
- | { | ||
- | Serial.begin(9600); // on defini le baud-rate | ||
- | srv.attach(9); // on attache un servo en D9 | ||
- | } | ||
- | |||
- | void loop() | ||
- | { | ||
- | if (Serial.available() > 0) | ||
- | { | ||
- | // lecture des bytes arrivant : | ||
- | incomingByte = Serial.read(); | ||
- | srv.write(incomingByte); // on écrit la valeur recue sur le servo | ||
- | //Serial.print(incomingByte); | ||
- | } | ||
- | }</code> | ||
- | |||
- | === Projet Qt Creator === | ||
- | Créez un projet Qt Creator: Projet Qt Widget : Application graphique Qt | ||
- | Nommer le projet "USB_servo" et le nom de la classe "USB_servo" (laisser le reste par défaut) | ||
- | |||
- | Aller dans formulaires, et créer les éléments suivants : | ||
- | |||
- | **Widget - Nom**\\ | ||
- | Qdial - "dial"\\ | ||
- | Qslider - "slider"\\ | ||
- | Qlcdnumber - "lcd"\\ | ||
- | |||
- | Une fois les éléments crées appuyer sur F4 pour éditer les signaux/slots (ou cliquer en haut sur l'icône "Editer signaux/slots) | ||
- | Créer les signaux suivants : | ||
- | |||
- | **Emetteur - Signal - Receveur - Slot**\\ | ||
- | dial - sliderMoved(int) - lcd - display(int)\\ | ||
- | dial - sliderMoved(int) - slider - setValue(int)\\ | ||
- | slider - sliderMoved(int) - dial - setValue(int)\\ | ||
- | slider - sliderMoved(int) - lcd - display(int)\\ | ||
- | |||
- | Modifier le contenu des fichiers suivants comme suit : | ||
- | |||
- | USB_servo.pro | ||
- | <code>QT += core gui | ||
- | |||
- | TARGET = USB_servo | ||
- | TEMPLATE = app | ||
- | |||
- | #add qExtSerialPort libs | ||
- | CONFIG += extserialport | ||
- | |||
- | SOURCES += main.cpp\ | ||
- | usb_servo.cpp | ||
- | |||
- | HEADERS += usb_servo.h | ||
- | |||
- | FORMS += usb_servo.ui | ||
- | </code> | ||
- | |||
- | usb_servo.h | ||
- | <code>#ifndef USB_SERVO_H | ||
- | #define USB_SERVO_H | ||
- | |||
- | #include <QMainWindow> | ||
- | #include <QtGui> | ||
- | #include <qextserialport.h> | ||
- | |||
- | namespace Ui { | ||
- | class USB_servo; | ||
- | } | ||
- | |||
- | class USB_servo : public QMainWindow | ||
- | { | ||
- | Q_OBJECT | ||
- | | ||
- | public: | ||
- | explicit USB_servo(QWidget *parent = 0); | ||
- | void init_port(); // initialisation du port | ||
- | ~USB_servo(); | ||
- | |||
- | public slots: | ||
- | void transmitCmd(int value); // fonction d'envoi | ||
- | | ||
- | private: | ||
- | Ui::USB_servo *ui; | ||
- | QextSerialPort *port; | ||
- | }; | ||
- | |||
- | #endif // USB_SERVO_H | ||
- | </code> | ||
- | |||
- | usb_servo.cpp | ||
- | <code>#include "usb_servo.h" | ||
- | #include "ui_usb_servo.h" | ||
- | |||
- | USB_servo::USB_servo(QWidget *parent) : | ||
- | QMainWindow(parent), | ||
- | ui(new Ui::USB_servo) | ||
- | // Création de l'intefarce ("formulaires") | ||
- | { | ||
- | init_port(); //initiation of the port | ||
- | ui->setupUi(this); | ||
- | connect(ui->dial, SIGNAL(sliderMoved(int)), this, SLOT(transmitCmd(int))); | ||
- | // On connecte le mouvement du bouton a l'envoi de la commande | ||
- | connect(ui->slider, SIGNAL(sliderMoved(int)), this, SLOT(transmitCmd(int))); | ||
- | // On connecte le mouvement du slider a l'envoi de la commande | ||
- | transmitCmd(90); | ||
- | // On initialise le servo à 90° | ||
- | } | ||
- | |||
- | USB_servo::~USB_servo() | ||
- | { | ||
- | delete ui; | ||
- | } | ||
- | |||
- | void USB_servo::init_port(void) | ||
- | { | ||
- | QString dev_port = "/dev/ttyUSB0"; | ||
- | port = new QextSerialPort(dev_port); //on ouvre le port | ||
- | // ls /dev/ | grep USB << Permet de donner la liste des périphériques USB | ||
- | |||
- | port->open(QIODevice::ReadWrite | QIODevice::Unbuffered); | ||
- | if(!port->isOpen()) | ||
- | { | ||
- | QMessageBox::warning(this, "Impossible d'ouvrir le port", dev_port); | ||
- | } | ||
- | |||
- | // On parametre la liaison : | ||
- | port->setBaudRate(BAUD9600); | ||
- | port->setFlowControl(FLOW_OFF); | ||
- | port->setParity(PAR_NONE); | ||
- | port->setDataBits(DATA_8); | ||
- | port->setStopBits(STOP_1); | ||
- | } | ||
- | |||
- | void USB_servo::transmitCmd(int value) | ||
- | { | ||
- | QByteArray byte; //byte a envoyer | ||
- | qint64 bw = 0; //bytes really writen | ||
- | |||
- | byte.clear(); // on efface le contenu de byte | ||
- | byte.append(value); // on ajoute "value" a byte | ||
- | |||
- | if(port != NULL){ // on vérifie que le port existe toujours | ||
- | bw = port->write(byte); // on écrit les byte | ||
- | //(bw récupere le nombre de byte écris) | ||
- | qDebug() << bw << "byte(s) written | Value sent:" << value << "(dec)"; | ||
- | port->flush(); // on attend la fin de la transmission | ||
- | } | ||
- | |||
- | } | ||
- | </code> | ||
- | |||
- | Branchez l'Arduino si ce n'est pas déjà fait et lancez la commande suivante dans un terminal : | ||
- | <code>ls /dev/ | grep USB</code> | ||
- | |||
- | Le résultat devrait être ttyUSB0 par exemple. Modifier ligne 21 de usb_servo.cpp pour que le périphérique corresponde. | ||
- | Pour exécuter le programme : Ctrl + R ou clic sur la flèche “lecture” verte en bas à gauche. | ||
- | ==== Problèmes ==== | ||
- | Chez moi le programme Qt a parfois du mal a ouvrir le port, débrancher et rebrancher l'Arduino si cela arrive. |