Outils pour utilisateurs

Outils du site


tutoriels:informatique:qtduino

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

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.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);     
 }
}

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

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.

tutoriels/informatique/qtduino.txt · Dernière modification : 2024/04/26 14:48 de 127.0.0.1