Pages: [1]   Go Down
Author Topic: Communication Série Arduino - Visual Studio "PROJET"  (Read 1469 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, je vous solicite car je débute dans la programmation, language C++ et j'aurais aimé avoir un petit peu d'aide de votre part pour mener à bien mon projet de fin d'année.

Je dois concevoir un genre de Question Pour Un Champion, ce qui signifie récupérer plusieurs signaux venant des LEDS et des Boutons.
Je ne sais pas comment m'y prendre pour effectuer une communication série entre ma carte Arduino Uno et un programme C++ sous Visual Studio pour ensuite récupérer les changements d'états.

Avez vous une petite idée?

Je vous remercie.
« Last Edit: February 25, 2013, 03:37:52 am by Thomas25 » Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Avec ou sans la librairie .net ?
Avec : http://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1
Sans : http://www.codeproject.com/Articles/2682/Serial-Communication-in-Windows
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Avec la librairie .Net.
J'ai regarder plusieurs Tuto, exemples sur le net mais à chaque fois c'est pour de la saisie de caractère, alors que moi c'est avec une impulsion sur un bouton poussoir.
Logged

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

Bah oui : si appuie sur le bouton, alors envoi d'un certain caractère ou d'une chaine de caractère ou d'un nombre.
Logged


France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un appui sur un bouton côté arduino ou côté ordinateur ?
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui effectivement, la traduction du signal envoyé par le Bouton en caractère [côté Arduino], et ensuite traiter le caractère côté Projet Visual et renvoyé un caractère de réponse à la carte qui elle traitera à nouveau le signal pour allumer la LED ou non.

Il faut que j'utilise la librairie SerialDumper, en réutilisant l'exemple "CmdMessengerExample.pde"?
Logged

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

Pour quelque chose d'aussi simple je vois pas l'utilité d'une librairie :

Arduino  : Si appui sur un bouton => émission d'un caractère puis attente du caractère de réponse
PC : si caractère reçu sur le port série => caractère OK ? => Envoi du caractère de réponse
Arduino : caractère de réponse OK => allumage LED
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis d'accord sur ta Logique B@tto, mais pour quelqu'un qui débute, l'appliquer sous forme d'un Code Foncionnel ce n'est pas facile, surtout quand tu as du mal avec l'environnement de développement.

En plus l'IDE Arduino ne fonctionne plus ... Certaine la cause du à Java 7u15.

Je vois très bien ce qu'il faut faire, mais je n'arrive pas à l'exprimer sous forme de Code, avez vous une piste? ...

Logged

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

Il n'y a qu'à manipuler le port série :
- Côté Arduino : Serial.print() pour envoyer et Serial.read() pour recevoir.
- Côté PC : se servir de l'évènement DataReceived pour déclencher une lecture du port serie avec la méthode ReadChar (si on part du principe que tu envois un caractère depuis l'Arduino) et utiliser la méthode Write pour renvoyer un caractère en réponse. Si ça peut t'aider, un projet que j'avais fait sous VB.NET : http://arduino.cc/forum/index.php/topic,136009.0.html

La syntaxe n'est pas exactement la même mais comme ça utilise .NET donc les méthodes sont les mêmes.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voici ce que j'ai fais du coté Arduino pour le moment.
Normalement le traitement est bon.

Mais coté Pc, je ne vois pas trop comment se Servir, ou du moins comment développer la Comm Série avec DataReceiver et ReadChar pour lire le caractère envoyé par l'Arduino.
Faut-il que je fasse une interface comme B@tto à fais dans son Projet Publier dans un Post précedent.

Merci pour votre aide.

* Traitement_Signaux_Arduino.ino (4.22 KB - downloaded 11 times.)
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 0
Posts: 273
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour un tel besoin moi j'utiliserais ça:
http://www.acraigie.com/programming/firmatavb/default.html

Aucun code nécessaire côté Arduino (juste upload du sketch Firmata standard fourni avec l'IDE Arduino).

Mais bon si le but c'est d'apprendre à développer côté Arduino c'est pas vraiment la solution.
En tout cas je bénis tous les jours l'auteur de Firmata tellement ça m'a aidé à résoudre mes problèmes d'entrée/sortie sur mon projet actuel  smiley-mr-green
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci d'avoir répondu patg_, mais je ne sais pas si le sketch firmata standart m'aidera.

Car pour ce qu'il est du Sketch Arduino, je les déjà fais.
En pièce jointe post précédent.

Mon soucis est que je n'arrive pas à récupérer le caractère coté PC envoyé par l'Arduino.
Et l'Arduino envoie en permanence des caractère alors que j'ai besoin qu'il envoie un seul caractère.

Logged

69100 (France)
Offline Offline
Jr. Member
**
Karma: 0
Posts: 80
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour.

Côté Arduino, tu peux puiser des idées dans mon appli qui fait dialoguer Arduino avec Visual Basic :

http://arduino.cc/forum/index.php/topic,134797.0.html

Logged

*** Micol *** Des milliers de Français seraient capable de créer une entreprise, mais les mêmes sont aussi capables de calculer qu'il ont in

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Micol, Merci pour ta réponse. Mais mon problème actuel, est que je n'arrive pas à traiter le caractère du côté Pc.

Car j'arrive bien à l'envoyer depuis l'Arduino, en ayant quand même un problème, c'est que sa m'envoie des caractère à la chaine, alors que j'aimerais simplement en envoyé un.

Voila ce que j'ai fais du coté arduino :

Code:
// Poste BOUTON/LED Utilisateur 1

const int BP1 = 2;

const int LED1 = 8;



// Poste BOUTON/LED Utilisateur 2

const int BP2 = 3;

const int LED2 = 9;


// Poste BOUTON/LED Utilisateur 3

const int BP3 = 4;

const int LED3 = 10;


// Poste BOUTON/LED Utilisateur 4

const int BP4 = 5;

const int LED4 = 11;


// Poste ANIMATEUR (Bouton 1 et 2)

const int BP5 = 6;  //Validation

const int BP6 = 7;  // RAZ

//

Etat des contacts lors de l'appuie puis l'etat précédent avant le nouvelle appuie

int etatBP1 = 0;

int MemBP1 = 0;


int etatBP2 = 0;

int MemBP2 = 0;


int etatBP3 = 0;

int MemBP3 = 0;


int etatBP4 = 0;

int MemBP4 = 0;


int etatBP5 = 0;

int MemBP5 = 0;


int etatBP6 = 0;

int MemBP6 = 0;


int MIPC = 0;




void setup() {

Serial.begin(115200);


// Déclaration de l'état des contacts
 
pinMode(LED1, OUTPUT);
 
pinMode(BP1, INPUT);
 
 
pinMode(LED2, OUTPUT);
 
pinMode(BP2, INPUT);
 
 
pinMode(LED3, OUTPUT);
 
pinMode(BP3, INPUT);
 
 
pinMode(LED4, OUTPUT);
 
pinMode(BP4, INPUT);
 
 
pinMode(BP5, INPUT);
 
pinMode(BP6, INPUT);

}



void CondInitial()
{
//Initialisation des variables
 
etatBP1 = 0;
 
etatBP2 = 0;
 
etatBP3 = 0;
 
etatBP4 = 0;
 
etatBP5 = 0;
 
etatBP6 = 0;
 
digitalWrite(LED1, LOW);
 
digitalWrite(LED2, LOW); 

digitalWrite(LED3, LOW);
 
digitalWrite(LED4, LOW);
 
MemBP1 = 0;
 
MemBP2 = 0;
 
MemBP3 = 0;
 
MemBP4 = 0;
 

}



void loop(){
 
   
CondInitial();  //Appel de la fonction d'initialisation 
   
   
etatBP1 = digitalRead(BP1);  //Recuperer le changement d'état du bouton.
   
etatBP2 = digitalRead(BP2);
   
etatBP3 = digitalRead(BP3);   
   
etatBP4 = digitalRead(BP4);
   
etatBP5 = digitalRead(BP5);
   
etatBP6 = digitalRead(BP6);


if(etatBP1 == HIGH && MemBP1 == 0 && MIPC == 0){     
//Traitement du signal lorsque qu'on sur BP1
     
MemBP1 = 1;  //Mise à 1 de sa mémoire et on force les autres mémoire à 0;
     
MemBP2 = 0;
     
MemBP3 = 0;
     
MemBP4 = 0;
   
MIPC = 1;
     
digitalWrite(LED1, HIGH);//On allume la LED
           
     

if(etatBP5 == HIGH && MemBP1 == 1 && MIPC == 1){    //Traitement du signal si réponse juste. Valider
       
digitalWrite(LED1, LOW);
       
MemBP1 = 0;
       
MIPC = 0;
       
Serial.print("a");        //Envoie d'un caractère pour incrémentation du Barre-Graph => PC
       
delay(2000);              //Delai d'attente avant de reprendre pour voir s'il prend bien en compte le caractère
     
}       
else if(etatBP6 == HIGH && MemBP1 == 1 && MIPC == 1){  //Traitement du signal si réponse fausse. RAZ
       
digitalWrite(LED1, LOW);
       
MIPC = 0;
        MemBP1 = 1;
     
}
   
}
 
else if(etatBP2 == HIGH && MemBP2 == 0 && MIPC == 0){
     
MemBP1 = 0;
     
MemBP2 = 1;
     
MemBP3 = 0;
     
MemBP4 = 0;
     
MIPC = 1;
     
digitalWrite(LED2, HIGH);
 
   

        if(etatBP5 == HIGH && MemBP2 == 1 && MIPC == 1){
        digitalWrite(LED2, LOW);
       
MemBP2 = 0;
       
MIPC = 0;   
       
Serial.print("b");
       
delay(2000);
     
}
else if(etatBP6 == HIGH && MemBP2 == 1 && MIPC == 1){
       
digitalWrite(LED2, LOW);
       
MIPC = 0;
       
MemBP2 = 1;
     
}
   
}
   

else if(etatBP3 == HIGH && MemBP3 == 0 && MIPC == 0){
     
MemBP1 = 0;
     
MemBP2 = 0;
     
MemBP3 = 1;
     
MemBP4 = 0;
     
MIPC = 1;
     
digitalWrite(LED3, HIGH);
 

if(etatBP5 == HIGH && MemBP3 == 1 && MIPC == 1){

        digitalWrite(LED3, HIGH);
       
MemBP3 = 0;
       
MIPC = 0;   
       
Serial.print("c");
       
delay(2000);
     
}
     
else if(etatBP6 == HIGH && MemBP3 == 1 && MIPC == 1){
       
digitalWrite(LED3, HIGH);
       
MIPC = 0;
       
MemBP3 = 1;
     
}
   
}
   
else if(etatBP4 == HIGH && MemBP4 == 0 && MIPC == 0){
     
MemBP1 = 0;
     
MemBP2 = 0;
     
MemBP3 = 0;
     
MemBP4 = 1;
     
MIPC = 1;
     
digitalWrite(LED4, HIGH);
     


if(etatBP5 == HIGH && MemBP4 == 1 && MIPC == 1){
       
digitalWrite(LED4, LOW);
       
MemBP4 =0;
       
MIPC = 0;
       
Serial.print("d");
       
delay(2000);
     
}

else if(etatBP6 == HIGH && MemBP4 == 1 && MIPC == 1){
       
digitalWrite(LED4, LOW);
        MIPC = 0;
        MemBP4 = 1;
     
}
   
}

 
}
   


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et voila du côté PC ce que j'ai atcuellement, pour ouvrir le port Série, et essayer de lire mon caractère ... Avez vous une idée de mon problème? ...

Code:
Form1(void)
{
InitializeComponent();

HANDLE hSerial;
hSerial = CreateFile(TEXT("COM3"),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if( hSerial == INVALID_HANDLE_VALUE ){
printf("Erreur d'initialisation");
}
else{
DCB dcb = {0};

dcb.DCBlength = sizeof(dcb);

if( !GetCommState(hSerial, &dcb)){
printf("Erreur de paramêtrage");

FillMemory(&dcb, sizeof(dcb), 0);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;

if( !SetCommState(hSerial, &dcb)){
printf("Erreur de Port");
}

COMMTIMEOUTS timeouts = {0};

timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;

if( !SetCommTimeouts(hSerial, &timeouts)){
printf("Erreur paramètrage timeouts");
}

char szBuff[5] = "";
DWORD dwBytesRead = 0;
int i = 0;
char test[] = "B\n";
int maxSamples = 10;
DWORD dwCommStatus;

ReadFile(hSerial, LPVOID(szBuff), 4, &dwBytesRead, nullptr);
if(szBuff == "a"){

}

}
CloseHandle(hSerial);
}


}

Et enfaite j'arrive pas à lire mon caractère "a" envoyé depuis l'Arduino ...
Logged

Pages: [1]   Go Up
Jump to: