Go Down

Topic: Communication Ordi-Arduino (Read 1 time) previous topic - next topic

Pop360

Apr 20, 2011, 11:33 am Last Edit: Apr 20, 2011, 11:38 am by Pop360 Reason: 1
Bonjour,  j'ai fait quelques recherches sur des sites et forums relatifs à Arduino, mais je n'ai toujours pas trouvé comment faire pour communiquer avec un PC.
La console d'Arduino (SerialMonitor) fonctionne et on peut lire les données dedans, j'ai aussi fait un test avec Processing qui marche, mais je n'arrive pas avec d'autres libraires à lire ces données.

Dans mon branchement j'ai juste la carte Arduino Uno reliée par USB à l'ordinateur et 2 boutons poussoirs connectés au broches 2 et 3.
(schéma joint avec le post)

Ce que j'aimerais faire c'est pouvoir lire les états de ces boutons envoyés par Serial de l'arduino avec une autre application que je programme.

J'essai de récupérer ces informations avec QextSerialPort pour l'intéger dans une interface Qt, mais la connexion pose toujours problème :
Code: [Select]


   port = new QextSerialPort("COM17"); // je le mets sur COM17 comme le SerialMonitor
   port->open(QIODevice::WriteOnly);

   if(!port->isOpen())
   {
QMessageBox::critical(this, "Erreur", "Erreur le port COM17 n'est pas connecté"); // ce message s'affiche toujours alors que le SerialMonitor affiche tout correctement
   }

   else
   {
port->setBaudRate(BAUD9600);
port->setFlowControl(FLOW_XONXOFF); // là aussi je ne suis pas sûre
port->setParity(PAR_MARK); // idem
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);

   
   
Du coté de l'arduino j'ai ceci :

Code: [Select]

void setup()
{
 
 Serial.begin(9600);
 pinMode(2, INPUT);
 pinMode(3, INPUT);
 
 
}

void loop()
{

   int boutonA = digitalRead(2);
   int boutonB = digitalRead(3);
   
   Serial.print(boutonA);
Serial.print(boutonB);
 
}



D'après certains sites j'ai cru comprendre que pour communiquer entre Arduino et PC comme ceci il fallait utiliser les broches Tx et Rx, est-ce bien cela ? Si oui quels branchements faut-il effectuer ? Et que doit-je rajouter dans mon programme ?

klgui4

Attention : ce que je vais dire n'est peut être pas bon je ne suis pas un spécialiste :)
D'après ce que j'ai pu voir sur la communication avec le port série il n'y a pas besoin de communiquer avec rx et tx, il me semble qu'envoyer des valeurs sur le port avec la fonction "serial.println" (pas sur du nom) suffit pour faire ce que tu souhaites.

Pop360

J'ai remplacer print par println, mais toujours pas moyen de faire comprendre à Qt que quelque chose est branché  =(
Merci quand même pour ton aide.
Sinon, sais-tu si le code Qt est bon ?

fdufnews

Quote
if(!port->isOpen())
    {
   QMessageBox::critical(this, "Erreur", "Erreur le port COM17 n'est pas connecté"); // ce message s'affiche toujours alors que le SerialMonitor affiche tout correctement
    }


Si j'ai bien interprété ton commentaire dans le code, tu ne peux pas avoir en même temps le serial monitor et un autre flux ouvert sur le même port com.
Si tu regardes le message d'erreur retourné par ton port->open(QIODevice::WriteOnly) il doit te dire que le port n'est pas disponible.

karistouf

dans ton script arduino, écrit sur le port série UNIQUEMENT quand un des boutons a un changement d 'état Cela te permettra d'éviter en premier l eceuil d'un overflow de ton api.

perso je suis passé par C-Serial, qui fonctionne tres bien et s'intègre très facilement
http://www.codeproject.com/KB/system/serial.aspx

Pop360

J'ai testé sans lancer le logiciel Arduino, et j'ai mis le code suivant à la place.

Code: [Select]

    if(!port->isOpen())
    {
QMessageBox::critical(this, "Erreur", "Erreur le port COM17 est indisponnible : <br />" + port->errorString());
    }


Mais j'ai "Erreur le port COM17 est indisponnible : unknow error", j'en sais toujours pas plus... :smiley-sad-blue:

Pop360

Quote
dans ton script arduino, écrit sur le port série UNIQUEMENT quand un des boutons a un changement d 'état Cela te permettra d'éviter en premier l eceuil d'un overflow de ton api.



En fait c'est déjà le cas, mais c'est pour simplifier que j'avais mis ça , sinon merci pour le lien.

Voici le script complet : (les deux boutons sont censés simuler des capteurs, c'est pour compter des entrée et sorties)

Code: [Select]

bool CptS = false;
bool CptE = false;
bool quitte = false;
int premierActif = 0;
int premierInactif = 0;
bool procedure= false;
int wSortie = 1, wEntree = 2;
int compteur = 0;

void setup()
{
 
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
 
}

void loop()
{

    int aCptE = digitalRead(2);
    int aCptS = digitalRead(3);
   
    if (aCptE != 0)
    {
     CptE = true;
    }
    else
    {
     CptE = false;
    }
    if (aCptS!= 0)
    {
     CptS = true;
    }
    else
    {
     CptS = false;
    }
   
   
        if (!procedure)
        {
            if (CptS && !CptE)
            {
                premierActif = wSortie;
            }
            else if (CptE && !CptS)
            {
                premierActif = wEntree;
            }
            else if (CptS && CptE)
            {
                procedure = true;
                //Serial.print("\nProcedure\n");
            }
        }
        else
        {
            if (CptS && !CptE)
            {
                premierInactif = wEntree;
            }
            else if (!CptS && CptE)
            {
                premierInactif = wSortie;
            }
            else if (!CptS && !CptE)
            {
                if (premierActif == wSortie && premierInactif == wSortie)
                {
                    Entree();
                }
                else if (premierActif == wEntree && premierInactif == wEntree)
                {
                    Sortie();
                }
                else
                {
                    Serial.print("\nAnnulation");
                }
                procedure = false;
            }
        }

 
}


void Entree()
{
    if (compteur < 150)
    {
        compteur ++;
        Serial.print("\nEntree -> ");
        Serial.print("Compteur = ");
        Serial.print(compteur, DEC);
        Serial.print("\n");
    }
    else
    {
        Serial.print("\nCompteur au maximum ! (150)\n");
    }
}


void Sortie()
{
    if (compteur > 0)
    {
        compteur --;
        Serial.print("\nSortie -> ");
        Serial.print("Compteur = ");
        Serial.print(compteur, DEC);
        Serial.print("\n");
    }
    else
    {
        Serial.print("\nCompteur au minimum ! (0)\n");
    }
}





karistouf

regardes plutot avec High et Low comme valeurs .

Pop360

ça marche pas mieux
Je comprends pas c'est quoi qui marche pas  :(

taddot

un problème de configuration des trames série (7/8bit / parité/ etc...)

Par contre, com17 : es-tu sur du port (ne serait-ce pas USB17  ou /dev/tty17 par exemple) ? Est-ce bien la bonne écriture (Com17 ou com17 au lieu COM17 par exemple)
pas taper... sauf application de l'article 35 ...

karistouf


Pop360

Ok, merci pour les conseils, je vais tester tous ça. Je marquerai résolu si ça marche :)

karistouf

tu es sous quelle plateforme ?

fdufnews


un problème de configuration des trames série (7/8bit / parité/ etc...)

Par contre, com17 : es-tu sur du port (ne serait-ce pas USB17  ou /dev/tty17 par exemple) ? Est-ce bien la bonne écriture (Com17 ou com17 au lieu COM17 par exemple)


En principe ce devrait être le même nom de port que celui qui apparait dans l'IDE arduino

taddot


En principe ce devrait être le même nom de port que celui qui apparait dans l'IDE arduino

Oui, je suis d'accord, mais j'ai déjà été emm**dé avec ce genre de truc en développant des petits soft sous Qt. Donc ça coute rien de vérifier
pas taper... sauf application de l'article 35 ...

Go Up