Pages: [1]   Go Down
Author Topic: Lire les E/S dans un programme compilé (Visual)  (Read 1080 times)
0 Members and 1 Guest are viewing this topic.
France - Burgundy
Offline Offline
Newbie
*
Karma: 0
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++  :smiley !

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-) !
« Last Edit: December 09, 2010, 12:42:04 pm by uglyredjoe » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3650
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Logged


Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Et avec Processing, ça n'irait pas ?
Logged

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

France - Burgundy
Offline Offline
Newbie
*
Karma: 0
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: December 09, 2010, 01:24:15 pm by uglyredjoe » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3650
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


France - Burgundy
Offline Offline
Newbie
*
Karma: 0
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3650
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://webhole.net/2010/05/01/arduino-visual-c-plus-plus-tutorial/
Logged


France - Burgundy
Offline Offline
Newbie
*
Karma: 0
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 ;D smiley-wink smiley smiley-grin!

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

Je regarde ça. Merci beaucoup du soutien smiley !
Joe.
Logged

France - Burgundy
Offline Offline
Newbie
*
Karma: 0
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

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

* sketch board:
Code:
#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:
#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.
« Last Edit: December 10, 2010, 03:48:56 pm by uglyredjoe » Logged

Pages: [1]   Go Up
Jump to: