Go Down

Topic: Lire les E/S dans un programme compilé (Visual) (Read 1 time) previous topic - next topic

uglyredjoe

Dec 09, 2010, 06:37 pm Last Edit: Dec 09, 2010, 06:42 pm by uglyredjoe Reason: 1
Bonjour,

J'ai utilisé une arduino avec Max/MSP dernièrement et j'aimerais aujourd'hui piloter les Entrées/Sorties de ma carte avec un programme en C++, écrit et compilé avec Visual Studio. Grosso-modo, je veux interroger les E/S de la carte à partir d'un programme compilé en C++  ::) !

J'essaye d'utiliser la même méthode que sous Max/MSP, cad, charger le standard Firmata sur la carte et ensuite communiquer avec en C++ mais je n'arrive pas à mes fins.

Tout d'abord, est-ce la bonne façon de faire ?
Dois-je compiler firmata pour obtenir une lib ? j'en suis là aujourd'hui mais la compile de firmata sous Visual me balance une tonne d'erreurs (dans avr...)...

Pouvez-vous 'aider, me guider, me remettre sur le bon chemin ???

Merci à vous tout.
Joe.

Ps: je vais aller voir dans la section C/C++  8-) !

B@tto

Moi j'utilise une méthode peut-être pas très évoluée mais c'est celle utilisée par beaucoup de personnes : programme simplement ton arduino pour répondre à des mots clés via le port série, et côté soft tu as juste à gérer les envois de mots clés et la réception des données. Tu peux même encore simplifier les choses en faisant en sorte que l'arduino envoi en permanence une trame contenant l'état de toutes les sorties et tu as juste à écouter côté soft  ;)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

uglyredjoe

#3
Dec 09, 2010, 07:16 pm Last Edit: Dec 09, 2010, 07:24 pm by uglyredjoe Reason: 1
Salut,

Merci beaucoup pour ta réponse.

Peux-tu me donner, stp,  un petit exemple de code arduino pour l'écoute de mots clés ainsi qu'un exemple de code C++ Visual qui envoie ces mots clés ?
Comment communiques-tu (quel protocole) alors entre le prog C++ et la board ?

Merci encore.
Joe.

B@tto

Côté arduino (je le fais à la volée donc je ne sais pas s'il fonctionne à 100%):


void setup() {

Serial.begin(9600);
for (i=24;i<54;i++) pinMode(i,INPUT);

}

void loop(){

if (serial.available()>0) {
delay(20);
if (serial.read()=='S')

for (i=24;i<54;i++) serial.print(digitalRead(i));
serial.println("");

}

Dans ce code, la réception d'un S via le port série lance la lecture des pins 24 à 53 et envoi une trame genre 1001010110100101010 ....

Côté soft je connais pas le C++, mais le VB.net, mais la logique est la même quelque soit le language, il suffit simplement de bien configuré le port série (même baudrate, ASCII ...) et d'envoyé le caractère S sur le port série. En vb c'est Portserie.write('S') par exemple.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

uglyredjoe

Merci pour ces infos,

Ca sera plus simple effectivement. je voulais charger firmata dans la board et utiliser également firmata sur mon PC et compiler un prog qui utilise cette lib pour envoyer des données à la carte mais c'est une vraie mayonnaise. Impossible d'arriver à mes fins !

Dans mon cas, j'aimerais surtout que la board envoie en permanence l'état d'un bouton (ON/OFF) donc pas sorcier, je pense si je pars de ton sketch...

Si d'autres idées jaillissent de vos beaux cerveaux, je veux bien les prendre aussi.

Je suis déçu que l'on ne trouve pas facilement la possibilité de piloter la board en C++ (idéalement Visual Studio) sous Windows. je pensais vraiment que cela avait déjà été fait et mis en tuto par exemple....

On creuse  ;D ! Merci encore.
Joe.

B@tto

http://webhole.net/2010/05/01/arduino-visual-c-plus-plus-tutorial/
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

uglyredjoe

;D ;) :) :D!

Merci, cela semble très très TRES  ::) prometteur !!!!!

Je regarde ça. Merci beaucoup du soutien :) !
Joe.

uglyredjoe

#8
Dec 10, 2010, 05:07 pm Last Edit: Dec 10, 2010, 09:48 pm by uglyredjoe Reason: 1
Salut,

Voilà j'ai obtenu (grâce à vous  ;D) une communication entre un prog C++ et la board. Voici mes codes:

* sketch board:
Code: [Select]
#define ESC 0x1B

void setup() {
 Serial.begin(115200);
 pinMode(13, OUTPUT);
 digitalWrite(13, HIGH);  
}

void loop() {
 int data;
 char escCar;
 
 escCar=0x1B;
 
 if (Serial.available()>0) {
   delay(20);
   Serial.print("/data ");
   data=Serial.read();
       
   if (data=='S') {
     digitalWrite(13, LOW);  
     Serial.print("Data=");
     Serial.println(data);
   }
   
   if (data=='U') {
     digitalWrite(13, HIGH);  
   }
   
   if (data=='X') {
     digitalWrite(13, LOW);  
     Serial.println(escCar);
   }
 }
}


Prog sous Visual:
Code: [Select]
#include <iostream>
using namespace std;

#include "windows.h"

#define QUIT 27

int main(int argc, char *argv[])
{
     DWORD error;

     cout << "Hello adruino World.... Forza !!!" << endl;

     // On déclare un port série et on l'ouvre.
     HANDLE serialPort;                                          // Handle du port.
     char serialName[20];
     strcpy(serialName, "COM4");                              // On définit le port série et on l'ouvre.
     serialPort=CreateFileA((LPCSTR) serialName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
     
     // On vérifie la bonne ouverture.
     if (serialPort==INVALID_HANDLE_VALUE) {
           error=GetLastError();

           switch (error) {
                 case ERROR_ACCESS_DENIED:
                       cout << "... Acces denied sur" << serialName << ". Port dejà ouvert..." << endl;
                       exit (-11);
                 break;

                 case ERROR_FILE_NOT_FOUND:
                       cout << "... Le port série " << serialName << " n'existe pas" << endl;
                       exit (-11);
                 break;
           }
     }

     // On paramètre le port série.
     DCB serialParams={0};
     serialParams.DCBlength=sizeof(serialParams);

     // On récupère l'état du port.
     if (!GetCommState(serialPort, &serialParams)) {
           // Error getting...

           // On ferme le port série.
           CloseHandle(serialPort);

           exit(-2);
     }

     // On modifie les paramètres.
     serialParams.BaudRate=CBR_115200;                              // Vitesse.
     serialParams.ByteSize=8;                                          // 8
     serialParams.Parity=NOPARITY;                                    // n
     serialParams.StopBits=ONESTOPBIT;                              // 1

     // On modifie les paramètres
     if (!SetCommState(serialPort, &serialParams)) {
           // Error setting...

           // On ferme le port série.
           CloseHandle(serialPort);

           exit(-3);
     }

     // Mise en place du timeout.
     COMMTIMEOUTS timeouts={0};
     timeouts.ReadIntervalTimeout=50;
     timeouts.ReadTotalTimeoutConstant=50;
     timeouts.WriteTotalTimeoutMultiplier=10;
     timeouts.WriteTotalTimeoutConstant=50;
     timeouts.WriteTotalTimeoutMultiplier=10;

     if (!SetCommTimeouts(serialPort, &timeouts)) {
           // timeout error...

           // On ferme le port série.
           CloseHandle(serialPort);
           exit(-4);
     }

     // On envoie le 'S'.
     char sendData[40];
     char receiveData[40];
     char charToSend;

     DWORD bytesSent, bytesRead;

     sendData[0]='S';
     receiveData[0]=0;

     while (receiveData[0]!=QUIT) {
           cin >> charToSend;

           sendData[0]=charToSend;

           if (!WriteFile(serialPort, sendData, 1, &bytesSent, NULL)) {
                 // Error sending data...

                 // On ferme le port série.
                 CloseHandle(serialPort);

                 exit(-5);
           }

           if (!ReadFile(serialPort, receiveData, 40, &bytesRead, NULL)) {
                 // Error readding data...

                 // On ferme le port série.
                 CloseHandle(serialPort);

                 exit(-5);
           }

           if (bytesRead) {
                 receiveData[bytesRead]=0;
                 strcpy(receiveData, receiveData+6);
                 cout << "Car recu <" << receiveData << ">" << endl;
           }
     }

     // On ferme le port série.
     CloseHandle(serialPort);

     return(0);
}


On tape S, la board éteint sa led et envoie S (83),
On tape U, on rallume la led,
On tape X, la board renvoie le code ESC et le prog C++ quitte...

Voilà, merci encore  ;D!
Joe.

Go Up