====== 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 : sudo apt-get install -y qtcreator && git clone https://code.google.com/p/qextserialport/ && cd qextserialport && qmake && make && sudo make install === 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 : #include 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); } } === 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 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 usb_servo.h #ifndef USB_SERVO_H #define USB_SERVO_H #include #include #include 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 usb_servo.cpp #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 } } Branchez l'Arduino si ce n'est pas déjà fait et lancez la commande suivante dans un terminal : ls /dev/ | grep USB 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.