Arduino et visual studio

Bonjour, j'utilise visual studio pour programmer mon arduino.
J'ai réalisé un programme en guise de test pour allumer et éteindre une led. Maintenant je voudrais réaliser une form avec deux boutons on/off pour commander cette led, mais je ne sais pas comment faire.

Merci d'avance pour votre aide.

Salut,

Comment-fais tu pour faire la liaison entre l'Arduino et le programme que tu fais avec Visual Studio ? Ca m'interesse de savoir... Merci.

Bonjour,

tu trouveras des infos ici : http://www.visualmicro.com/

Après si tu as des infos pour faire ce que je souhaite avec un autre programme je suis preneur.

A+

Michel_B:
Bonjour,

tu trouveras des infos ici : http://www.visualmicro.com/

Après si tu as des infos pour faire ce que je souhaite avec un autre programme je suis preneur.

A+

Ah tiens je connaissais pas ça, c'est intéressant... Cependant je suis pas sur de bien comprendre.

J'ai plutôt l'impression que dans ce cas Visual Studio permet de jouer le rôle de l'IDE de l'Arduino et faire l'upload... et moi je croyais plutôt que c'était une librairie qui permettait de créer une application finale qui puisse communiquer avec l'Arduino sans passer par l'IDE. Une sorte de logiciel pour piloter l'Arduino.

Donc non je vais pas pouvoir t'aide du coup, par contre je suis preneur sur des infos pour réaliser un logiciel pour piloter l'Arduino... :slight_smile:

EDOT : J'ai trouvé un tuto pas mal : Arduino Serial Communication With C++ Tutorial

bonjour,

Avr Studio 5 est basé sur visual studio 2010, regarde le topic de jean-Marie sur le sujet :wink:
~~[Résolu] Intégration du langage Arduino dans AVR Studio 5 - #28 by Jean-Marie - Tutoriels et cours - Arduino Forum

Edit : Je crois avoir mal compris la question, en faite il n'est pas question de compiler un sketch arduino avec Visual Studio mais juste faire une application sous Visual Studio communicant avec l'arduino ?

Avec Visual Studio tu as le choix, C#, VB.net, ou C++, sous quelle langage veut tu faire ton application ?
-> Arduino Playground - InterfacingWithSoftware

Avec Visual Studio tu as le choix, C#, VB.net, ou C++, sous quelle langage veut tu faire ton application ?
-> Arduino Playground - InterfacingWithSoftware

Oui le problème c'est que je n'y arrive pas. J'ai essayé C++ avec libserial, VB et firmata, python.... mais je n'arrive pas à dialoguer avec l'arduino.
Je ne comprends pas trop également quel prog je dois mettre dans l'Arduino. Si tu as un exemple à me faire passer....

Merci

Michel_B:
Oui le problème c'est que je n'y arrive pas. J'ai essayé C++ avec libserial, VB et firmata, python.... mais je n'arrive pas à dialoguer avec l'arduino.
Je ne comprends pas trop également quel prog je dois mettre dans l'Arduino. Si tu as un exemple à me faire passer....

Regarde du coté de ce topic, tu aura une moitié de réponse :wink:
http://arduino.cc/forum/index.php/topic,85310.0.html

Aprés coté PC c'est de la prog pc ... tu doit d'abord concevoir un protocole puis le mettre en place coté arduino et coté pc, vu que c'est toi qui décide du protocole tu est libre de faire ce que tu veut.

Exemple de protocole simple :
A1 -> allume led 1
E1 -> éteint la led 1
etc etc ... c'est toi qui décide !

arduimat:
J'ai trouvé un tuto pas mal : Arduino Serial Communication With C++ Tutorial

Tu devrais essayer ça, j'ai réussi à le faire fonctionner en 5 minutes... Avec Visual Studio en C++.

Je fais mes applis PC sur VB6 (de la suite Visual Studio 6.0) qui communiquent avec l'arduino via le port série. Vu l'implémentation de Arduino dans VS 2010, je vais peut-être changer de version, mais c'est dommage quand on commence à maîtriser un soft qui marche encore très bien de changer...)

Le plus dur étant de dire à l'arduino d'envoyer des octets (byte) et non des caractères : Serial.print(0x65) envoie trois octets (49, 48 et 49 : "101") au lieu de la valeur sur un seul octet ( 101 ou caractère "A"). il faut utiliser Serial.write(data) avec data comme byte, sinon, ça ne marche pas bien (un int en paramètre risque d'être traité comme une chaine de deux caractères).

Ensuite, côté VB, le port série est lui aussi orienté chaine de caractères, donc il faut lui dire d'envoyer des octets un par un (à partir d'un tableau à 1 case).

C'est un peu de la bidouille, mais ça a finit par marcher. Reste le côté "événement" qui n'est pas facile, sur l'arduino, il faut pouvoir réagir à tout moment à la réception de données pour répondre si c'est une demande de lecture de données par exemple. Pour VB, pareil, il faut pouvoir traiter les données reçues quand elles arrivent.

Un exemple des codes que j'utilise, côté arduino :

byte data, d0, d1, d2;

loop(){
  if (Serial.available()) {  // scruter en continu l'arrivée de commandes via le port série et les traiter.
    data = Serial.read();  // réception d'une commande :
    Switch (data){
      case 0x55 :          // code 0x55 = "Bonjour, tu vas bien?"
        Serial.write(0xAA);     // Réponse 0xAA = "Bonjour aussi! Oui, je vais bien!"
        Break;
      case 0x24 :          // code 0x24 = commande éclairage
        While(!Serial.available());   // attente des données suivantes
        d0 = Serial.read();  // d0 contient le  numéro de la lampe sur laquelle on doit agir
        While(!Serial.available());   // attente des données suivantes
        d1 = Serial.read();  // d1 contient la valeur d'éclairage (pour PWM par exemple)
        lampe_eclaire(d0, d1);      // appel d'une procédure qui allume la lampe demandée à la valeur demandée
        Serial.write(0xAA);     // Réponse 0xAA = "Bien reçu, commande traitée"
        Break;
      (...)   // la suite du traitement des commandes...  
    }
  }
}

Dans cet exemple,
si on reçoit 0x55, l'émetteur attend en retour 0xAA ou un code d'erreur.
si on reçoit 0x24, c'est une commande suivie de deux octets de paramètes, il faut donc attendre d'avoir reçu les deux octetc suivants pour traiter la commande

Côté VB :

un timer à 100ms qui fait comme sur l'arduino (if serial.available()...), car j'ai jamais réussi à utiliser le handler du port série. Je ne sais pas pourquoi, mais voilà quoi...
un timer lancé dans la proc de lecture (pour retrouver une fonction similaire à While (Serial.available()); data = Serial.read(); de l'arduino avec une gestion de Time_Out, car ce n'est pas prévu dans VB et c'est très gênant en cas de plante lors du développement :

Private Sub Timer_TimeOut_Timer()  ' procédure appelée par le timer
  Time_Out = True
  Timer_TimeOut.Enabled = False
End Sub

Function Data_Read() As Byte            ' Fonction qui renvoie un octet du buffer série INPUT
  Dim Data As Byte
  
  Time_Out = False
  Timer_TimeOut.Interval = 3000  ' timeout = 3s
  Timer_TimeOut.Enabled = True
  While (Not Time_Out) And (Serial.InBufferCount = 0)
    DoEvents                             ' permet le traitement des autres évènements
  Wend
  Timer_TimeOut.Enabled = False
  If Time_Out Then
'    MsgBox ("TIME OUT port série!")
    Data_Read = 0
  Else
    Data_Read = Asc(Serial.Input)
  End If
End Function

Sub Data_Write(Data As Byte)         ' envoie un octet dans le série OUT
  Dim Data_out(0) As Byte         ' Obligation de passer par un tableau, sinon Serial.Output ne marche pas
  
  Data_out(0) = Data
  If Serial.PortOpen Then Serial.Output = Data_out
End Sub

Sub Data_Write_16(Data As Integer)         ' envoie un word (16 bits) dans le série OUT
  Dim Data_out(0 To 1) As Byte   
  
  Data_out(0) = Data And 255
  Data_out(1) = (Data And 65280) \ 256
  If Serial.PortOpen Then Serial.Output = Data_out
End Sub

Private Sub Command_Eclairage_Click()   ' commande l'éclairage de la lampe 1 en fonction de la position du scrollbar.
  Data_Write(&H24)                ' code d'éclairage
  Data_Write(1)                   ' lampe N°1
  Data_Write(ScrollBar1.Value)  ' valeur d'éclairage
  if Data_Read = &HAA then             ' si tout s'est bien passé, l'arduino a renvoyé le code de confirmation (&HAA)
    MsgBox("Commande bien traitée par l'arduino")
  else
    MsgBox ("Commande non traitée par l'arduino")
End Sub

Vous remarquerez le Data_Read = Asc(Serial.Input), car Serial.Input renvoie un caractère!

De plus, il faut initialiser Serial.InputLen = 1 : on reçoit les octets un par un.

J'ai tellement galéré à faire marcher ça, que je vous donne mes codes, si ça peut aider. Il faut bien sûr avoir des prérequis sur le composant MSComm de VB, car il est assez compliqué et peu documenté.

Merci de ton aide,
j'ai essayé de mettre ton prog dans l'arduino, j'obtient une erreur :

sketch_jan18a:2: error: ISO C++ forbids declaration of 'loop' with no type
sketch_jan18a.cpp: In function 'int loop()':
sketch_jan18a:2: error: new declaration 'int loop()'
C:\Arduino3\hardware\arduino\cores\arduino/wiring.h:129: error: ambiguates old declaration 'void loop()'
sketch_jan18a:5: error: 'Switch' was not declared in this scope
sketch_jan18a:5: error: expected `;' before '{' token

Quel est le problème ?
Il y a surement quelque chose que je fais mal...

Merci

Tu devrais essayer ça, j'ai réussi à le faire fonctionner en 5 minutes... Avec Visual Studio en C++.

Ok merci Arduimat, je teste ce soir et je te tiens au courant !

Michel_B:
Quel est le problème ?
Il y a surement quelque chose que je fais mal...

Rajoute void devant loop(), commente (ajoute // devant) (...) et rajoute la partie setup() :wink:

void setup() {
  Serial.begin(9600);
}

Rajoute void devant loop(), commente (ajoute // devant) (...) et rajoute la partie setup()

On va y arriver :wink: , maintenant j'obtient :

9: error: 'Switch' was not declared in this scope
10: error: expected `;' before '{' token

Michel_B:
On va y arriver :wink: , maintenant j'obtient :

9: error: 'Switch' was not declared in this scope
10: error: expected `;' before '{' token

switch (sans S majuscule) :wink:

switch (sans S majuscule)

Ok pas facile au début tout ça. J'ai corrigé les erreurs suivantes mais sur celle la je sèche :

"error: 'lampe_eclaire' was not declared in this scope"

C'est rien pour toi :wink:

Michel_B:
Ok pas facile au début tout ça. J'ai corrigé les erreurs suivantes mais sur celle la je sèche :

"error: 'lampe_eclaire' was not declared in this scope"

C'est rien pour toi :wink:

Ralala ct'espéce de voyou, Super_Cinci t'as donnait un morceau de code en vrac :grin:
Des B majuscules sur les break, des W majuscule sur les while, ralala! :grin:

byte data, d0, d1, d2;

void setup() {
  Serial.begin(9600);
}

void loop(){
  if (Serial.available()) {  // scruter en continu l'arrivée de commandes via le port série et les traiter.
    data = Serial.read();  // réception d'une commande :
    switch (data){
      case 0x55 :          // code 0x55 = "Bonjour, tu vas bien?"
        Serial.write(0xAA);     // Réponse 0xAA = "Bonjour aussi! Oui, je vais bien!"
        break;
      case 0x24 :          // code 0x24 = commande éclairage
        while(!Serial.available());   // attente des données suivantes
        d0 = Serial.read();  // d0 contient le  numéro de la lampe sur laquelle on doit agir
        while(!Serial.available());   // attente des données suivantes
        d1 = Serial.read();  // d1 contient la valeur d'éclairage (pour PWM par exemple)
        //lampe_eclaire(d0, d1);      // appel d'une procédure qui allume la lampe demandée à la valeur demandée
        Serial.write(0xAA);     // Réponse 0xAA = "Bien reçu, commande traitée"
        break;
      //(...)   // la suite du traitement des commandes...  
    }
  }
}

(ça compile mais je sait pas si ça marche :wink: faut demander à Super_Cinci)

Ralala ct'espéce de voyou, Super_Cinci t'as donnait un morceau de code en vrac
Des B majuscules sur les break, des W majuscule sur les while, ralala!

Ce doit être mon bisutage ^^
Effectivement cela compile, merci. Maintenant c'est la partie VB qui me pose problème :~.
Mes derniers développements en VB étaient sous VB3 et win 3.1 :slight_smile:

Michel_B:
Ce doit être mon bisutage ^^
Effectivement cela compile, merci. Maintenant c'est la partie VB qui me pose problème :~.
Mes derniers développements en VB étaient sous VB3 et win 3.1 :slight_smile:

Pour VB moi je suis sous VS 2010, donc les sources en basic pro 6 compile pas une fois sur deux :stuck_out_tongue_closed_eyes:
En plus VB6 c'était du code natif au final le .exe, maintenant c'est du MSIL (même principe que java et la JVM).
Tout ça pour dire que je peut aider pour la partie C# ou VB mais que si c'est du .net sous VS 2010 :wink:

J'ai trouvé un tuto pas mal : Arduino Serial Communication With C++ Tutorial
Tu devrais essayer ça, j'ai réussi à le faire fonctionner en 5 minutes... Avec Visual Studio en C++.

Effectivement Arduimat, cela fonctionne. Reste à le modifier et commander la sortie en cliquant sur un bouton ON et un OFF, après je serais comblé...(de travail :wink: )

Sinon j'ai essayé ce code en vb mais cela ne marche pas chez moi : http://www.instructables.com/id/Using-Visual-Basic-to-control-Arduino-Uno/

Bonsoir,
J'ai parcouru ce post car je programme pas mal en VB.net
Je suis sur Visual Basic 2010 express (cette version est gratuite).http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express

Je me suis amusé a commander une sortie a partir de VB en passant par la communication série.
(un programme tout léger a la va vite mais fonctionnel, c'était surtout pour tester)
Cela fonctionne parfaitement et si on sait commander une sortie, on peux faire le reste sans soucis !

J'ai été grandement aidé par un fichier pdf très bien expliqué dont je ne sais plus la provenance et qui explique comment utiliser la classe "Ports" de VB.net

Je me suis permis de vous linker une archive contenant toutes mes sources, l’exécutable et le prog pour l'Arduino afin de tester.
Je ne sais pas si cela vous intéressera mais on sait jamais...

Pour l’exécutable, si vous n'avez pas visual studio, il faut avoir au préalable installé le Framework 4 ou supérieur :http://www.microsoft.com/downloads/fr-fr/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992

Voici le lien de l'archive : http://perso.numericable.fr/tchonordiste/Arduino/VBetArduino.zip
Pour l’exécutable, c'est dans le répertoire "VB_executable" il faut lancer : "NieuwSerialArdiuino.exe"
Le programme de l'arduino est dans "Partie Arduino" (c'est juste une adaptation de l'exemple de communication donné avec l'EDI) car si je me débrouille bien en VB, je suis débutant en Arduino :roll_eyes:

L'autre répertoire contient toutes les sources
J'ai mis également le fichier PDF

En espérant pouvoir vous donner des idées.
A bientôt