Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tutoriels:informatique:qtduino [2013/03/30 14:51] vlamoine [Matériel] |
tutoriels:informatique:qtduino [2016/02/21 21:50] qcarlier Page name changed from tutoriels:informatique:accueil to tutoriels:informatique:qtduino |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Contrôler un Arduino grâce à Qt Creator ====== | ====== Contrôler un Arduino grâce à Qt Creator ====== | ||
- | |||
**Tout ces documents sont sous licence CC BY-NC-SA :** | **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. | 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 ==== | ==== 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 ! | 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 ==== | ==== Objectif ==== | ||
- | |||
On va contrôler un servomoteur grâce a une application Qt. La communication se fait par le câble USB | 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]] | [[http://vicopsp.free.fr/tyfab/qtservo.m4v|Voir la vidéo]] | ||
- | |||
==== Matériel ==== | ==== Matériel ==== | ||
* Un Arduino (j'utilise un Arduino Nano 3.0) | * Un Arduino (j'utilise un Arduino Nano 3.0) | ||
Ligne 54: | Ligne 52: | ||
=== Projet Qt Creator === | === Projet Qt Creator === | ||
- | Ouvrir le [[http://vicopsp.free.fr/tyfab/usb_servo.zip|projet Qt Creator]] : double clic sur le .PRO | + | 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) | ||
- | Branchez l'Arduino si ce n'est pas déjà fait et lancez la commande suivante : | + | Aller dans formulaires, et créer les éléments suivants : |
- | <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. | + | **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 ==== | ==== Problèmes ==== | ||
Chez moi le programme Qt a parfois du mal a ouvrir le port, débrancher et rebrancher l'Arduino si cela arrive. | Chez moi le programme Qt a parfois du mal a ouvrir le port, débrancher et rebrancher l'Arduino si cela arrive. |