====== 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.