Go Down

Topic: Arduino et visual studio (Read 9946 times) previous topic - next topic

Michel_B

Code: [Select]
Peux-tu préciser ce a quoi tu voudrais arriver afin que je t'orientes correctement.
Bonsoir,
Je garde mes projets sous le coude, pour le moment je fais quelques manip pour me familiariser.

J'ai donc modifié le projet, maintenant arduino attend les ordres de vb pour envoyer la valeur d'une entrée ou bien actionner une sortie, cela fonctionne parfaitement.

J'essaye maintenant d'utiliser comme suggéré le timer pour envoyer régulièrement la valeur en entrée tant que je ne clique pas sur stop.
Pour le moment je n'y suis pas arrivé.

J'ai activé et réglé l'interval du timer lors de l'appui sur le bouton on
Ensuite j'ai mis la commande à exécuter dans "Private Sub Timer1_Tick" mais cela ne marche pas.

Tu vois ou est le pb ?

Merci

a+

Fredo59

#31
Jan 27, 2012, 09:59 am Last Edit: Jan 27, 2012, 10:55 am by Fredo59 Reason: 1
Bonjour,

Par exemple :

Dans le timer:
Code: [Select]
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Dim ExempleTrame As String

       ExempleTrame = "Go." 'toujours le point pour correspondre a notre partie Arduino
       mySerialPort.Write(ExempleTrame)
   End Sub


Dans le bouton Start:
Code: [Select]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
       Timer1.Interval = 1000 ' en ms
       Timer1.Enabled = True
   End Sub


Côté Arduino, analyser la trame, dès que le point '.' arrive, gérer le trame, si c'est "Go" alors envoyer les infos.

Bien sûr en plus sérieux il faudrait être sûr que l'arduino a fini d'envoyer avant de renvoyer des commande, mais nous n'en sommes pas là.
Donc vaut mieu mettre 1000ms ou + dans le timer cela evitera les problème.

Je n'ai pas testé ce que je t'ai mis mais si vraiment tu as des soucis, je fait comme d'hab, une petite archive...

A+

PS: Vérifer que le timer soit inactif par défaut ou alors le rendre inactif a l'ouverture du programme
Bon amusement
L'expérience est une longue suite de bêtises...

Michel_B

Ma programmation semble identique à la tienne, la seule chose que je n'ai pas fait c'est de mettre à OFF le timer au démarrage. Je regarde cela de plus près ce soir...

A+

Michel_B

Cela fonctionne maintenant, j'avais oublié d'envoyer la commande de lecture à arduino.  :smiley-red:
Le timer est presque au point ;) J'arrive à le démarrer mais pas à le stopper.
Si je rajoute Timer1.Enabled = False dans le bouton 14 il ne démarre plus du tout.

Mon code VB :

Code: [Select]

    Private Sub Button13_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button13.Click
        Dim Tag As String = CType(CType(sender, Button).Tag, String)

        Timer1.Interval = 1000
        Timer1.Enabled = True
       
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        mySerialPort.Write(Button13.Tag & ",")  'pour demander à arduino l'envoi d'une valeur d'entrée
        capteur = mySerialPort.ReadExisting   'lecture de la valeur d'entrée
        TextBox3.Text = capteur  ' affichage de cette valeur

    End Sub


    Private Sub Button14_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button13.Click

        '    Timer1.Enabled = False

    End Sub


Mon code arduino pour me donner ton avis :

Code: [Select]
void loop() {
  // Action qui s'effectue quand la transmission est finie
  if (activerSorties) {
   
    sortieTxt = inputString.substring(0,1);  // Je récupère le 1er caractèere de la chaine de reception
    int sortie = sortieTxt.toInt(); // je la convertie en Int pour la commande digitalWrite
     
    etat = inputString.substring(1,3); // je récupère les 2 caractère qui me diront si on demande un "ON"
   
    if (etat=="ON"){
     digitalWrite(sortie,1);
    }
    else {
     digitalWrite(sortie,0);
    }
     
    inputString = "";
    activerSorties = false;
  }
  if (activerEntrees) {
  valeurCapteur = analogRead(analogInPin); 
   Serial.println(valeurCapteur);                       
         digitalWrite(2,1); // J'allume toutes les leds juste pour savoir que arduino
         digitalWrite(3,1); // A bien reçu la commande
         digitalWrite(4,1);
         digitalWrite(5,1);
         digitalWrite(6,1);
inputString = "";
activerEntrees=false;  }

   
    }
 
/*
  Evénement qui se déclenche lorsque le port série reçoit
  des informations.
*/
void serialEvent() {
  while (Serial.available()) {
    // récupère le nouveau byte:
    char inChar = (char)Serial.read();
    // le rajoute a ceux existants:
    inputString += inChar;
    // Si le caractère "." arrive sur le port com 'caractere choisi au pif !'
    // on indique que la ligne de transmission est effectuée et Arduino peut traiter la commande
    if (inChar == '.')
      activerSorties = true;
    if (inChar ==',') // Le caractère "," active la lecture d'une entrée
      activerEntrees = true ;
   }
  }


C'est où que sa cloche ?

++ et merci d'avance ;)

Fredo59

Bonsoir,

Dans ton Timer il ne faut mettre que l'envoie de ta commande.

les envoies de l'Arduino seront automatiquement détectés dans le VB par l'événement que j'avais créé si tu a reprit le même code.

Donc pour résumer :

1.Chaque seconde le timer envoie une demande mais ne dois rien faire d'autre.
2.Quand Arduino répond, cela crée un evenement dans VB qui traite la commande.

C'est important de laisser traiter l'événement dans VB car il démarre un Thread (genre de 2eme programme indépendant) ce qui évite de bloquer le Thread principal comme ça tu peux encore effectuer des actions indépendamment de la réception : tel un stop par exemple.

Je vais vite faire un essai , parce que ce soir je ne serai pas dispo (demain oui) si ça marche je te poste les résultats.

A+
L'expérience est une longue suite de bêtises...

Fredo59

Aussitôt dit, aussitôt fait  :D

Je te mets l'archive comme d'habitude.
Les réponses se feront a l'endroit ou il indique "Pret a recevoir" d'habitude, j'ai mis un multiligne comme ça tu vois les réponses arriver.

Biensûr j'ai fait vite et l'arduino m'envoir la même réponse toute les secondes, tu auras vite fait de remplacer la commande par l'envoie de la lecture des tes données.
et dans ce cas, au lieu de les faire arriver avec des saut a la ligne, il faudra juste rafraichir l'entrée afin de voir varier la mesure (analogique) ou l'entrée (digital) sur VB.

Dans mon cas j'étais obligé d'aller a la ligne afin que tu vois que l'Arduino réponde ^^

http://perso.numericable.fr/tchonordiste/Arduino/VBetArduinoV3.zip

Amuse toi bien  ;)
N'hésites pas poser des questions, car ça me motive a faire des tests également !! :smiley-eek-blue:

@++
L'expérience est une longue suite de bêtises...

Michel_B

Merci pour le zip.

J'ai trouvé du coup l'erreur dans mon code, c'était ici :

Private Sub Button14_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button13.Click

           Timer1.Enabled = False

   End Sub

J'ai remplacé par 14 et sa roule !

Bonne soirée !

Michel_B

Continuons...

Ce matin histoire que mon timer me fasse afficher quelque chose d'interessant, j'ai cablé un capteur de température 18B20. Pas de problème particulier, j'ai bien la lecture en continu si je l'active sur vb grâce au timer.

Par contre je ne me rapelle plus qu'elle T° il faisait ce matin à 8h ? XD
il va faloir que tout ça se sauvegarde dans une base et que je puisse par exemple afficher un graphique de l'évolution de la journée ;)

Voila la prochaine étape :)

++

Fredo59

Mais oui biensûr, il faudrait que tu me donnes ton adresse pour que je t'envoie tes 100balles et ton mars  ]:D

Non, je rigole bien sûr !

Alors pour les base de données c'est comme tu veux, moi je travaille toujours avec des bases du type access en *.mdb
Je les crées avec ADOX.dll et je travaille dessus avec ADODB.dll

Je peux dans un premier temps te faire un prog tout simple qui créera une base, dans la quelle tu pourras ajouter, modifier et supprimer des enregistrements.
Ensuite nous l'intègrerons a notre prog actuel...

Mais les base de données sont vastes et peut-être préfèrerais-tu travailler avec quelque chose d'autre (mySQL,Sql, Oracle).

L'avantage avec ce que je te propose, c'est que tout est inclus dans vb, tu es autonome, tu crées, tu remplis, tu modifies, tu effaces. (tout y est !) :smiley-mr-green:

Dis-moi si ça te vas et on attaque.... :smiley-eek-blue:

@+
L'expérience est une longue suite de bêtises...

Fredo59

#39
Jan 28, 2012, 04:15 pm Last Edit: Jan 28, 2012, 04:19 pm by Fredo59 Reason: 1
Voilà, je te poste une archive toute fraîche. Dans le programme pour le moment je te montre comment :
1° Créer la base de données (MaBase.mdb)
2° Créer une table (Copain) et y créer des champs (Nom, Prenom)
3° Contrôler qu'elle existe
4° Ajouter des enregistrements
5° les afficher dans une grille

Le programme ne te permets pas les effacements pour le moment (allons y doucement) donc si tu veux "voir" où se trouve ta base pour l'effacer manuellement, elle se trouvera dans le même répertoire que l'application soit :
Repertoire ou tu a mis l'archive\BaseDeDonnees\BaseVB\BaseVB\bin\Debug\   ==> si tu essaie le programme a partir de VB express (en debug)
Repertoire ou tu a mis l'archive\BaseDeDonnees\Executable\                       ==> si tu lance directement l'executable

Je t'ai mis aussi les 2 DLL necessaire au programme : Repertoire ou tu a mis l'archive\BaseDeDonnees\BaseVB\
Il faut savoir qu'il faut "integrer" les dll au projet, si tu ne sait pas comment, dis le moi, je te ferai des screenshoot pour t'expliquer (ultra simple).
Pour l'instant, pas d'inquiétude, dans le projet de cette archive c'est déjà fait.... :smiley-mr-green:

je te mets aussi un lien vers une super page internet qui regroupe tout le vocabulaire qu'il faut savoir pour employer les commande SQL (elle nous servirons pour nos requetes dans la base)
http://sql.1keydata.com/fr/

Pour le moment les champs que je t'ai mis sont du type "texte" mais plus tard on verra les autres (integer, long, Decimal,....)

Si tu as des bug dis le moi , je l'ai testé mais on ne sait jamais. :smiley-eek-blue:

L'archive :
http://perso.numericable.fr/tchonordiste/Arduino/BaseDeDonnees.zip

@++
Bon amusement...

PS: J'espère que les modérateurs ne sanctionnerons pas le fait que nous dérivions sur du VB et que nous délaissions quelque peu l'Arduino...

L'expérience est une longue suite de bêtises...

Michel_B

#40
Jan 28, 2012, 04:22 pm Last Edit: Jan 28, 2012, 04:46 pm by Michel_B Reason: 1
Quote
Mais oui biensûr, il faudrait que tu me donnes ton adresse pour que je t'envoie tes 100balles et ton mars

80 cela suffira et plutôt un bounty, je ne voudrais pas abuser...  :smiley-red:

Par contre avant d'aller plus loin, j'ai comme tu le disais, vu que je n'ai pas crée de thread dans mon programme, une latence avant que la sortie réagisse à ma commande quand le timer est lancé.
J'ai donc essayé ton programme mais il ne marche pas chez moi, j'ai repris des parties de ton code dans le mien mais c'est pareil, au lancement du timer l'application se fige et ne répond plus.

Pour la base si le type access est le plus pratique pour commencer no problem. A terme elle sera sur un serveur pour être consultée à distance

++

EDIT : Ton prg fonctionne, c'est moi qui bug  :~

Fredo59

Quote
J'ai donc essayé ton programme mais il ne marche pas chez moi,.....

Quand tu l'ouvre dans vb et que tu l'essaie quelle erreur as -tu ?
Il faut mettre également le Prog dans l'Arduino car je l'ai modifié.

Je pense qu'il faut d'abord faire tourner mon code car chez moi il fonctionne, ensuite tu le modifie a ta sauce.
Car je déclare parfois des choses tout au début du programme et si tu ne les reprends pas cela ne fonctionnera pas.

Ou alors, poste ton code que j'essaie de voir si je remarque quelque chose de bizarre....

Je connais le VB depuis des années (d'abord Turbo Basic, VB3,4,6, VB.net) mais je t'avoue que les Thread sont très récents pour moi, je les ai découvert en commençant mes tests avec l'Arduino. Le code d'ailleurs est parfaitement expliqué dans le fichier PDF (qui n'est pas de moi ...) que j'ai joins a toutes mes archives.

Donc j'évite les acrobatie avec ce type de code car je ne le maitrise pas encore tout a fait  :smiley-red:

C'est pour cela que je t'envoie toujours des exemples qui fonctionnent chez moi pour que tu partes sur une base fonctionnelle, si ensuite ça ne marche plus tu es sur comme ça que cela vient de toi.

Tiens moi au courant
@+

L'expérience est une longue suite de bêtises...

Michel_B

Quote
...si ensuite ça ne marche plus tu es sur comme ça que cela vient de toi.


Cela vient de moi effectivement.
j'essaye de faire fonctionner tout ça avant de passer à la base de données.
Au passage on peut eviter que les modifications d'un prg vb soient automatiquement sauvegardées ?
C'est ce qui c'est passé avec ton code, j'ai du faire une boulette et hop sauvegardé !  :0

Fredo59

Alors, je viens de me rendre compte que la V3 de mon archive ne contenait pas le bon executable , sinon le projet, lui, est bon.

je te remets le link pour l'archive corrigée (pense a aussi mettre le prog dans l'Arduino). Désolé, hier j'ai voulu aller trop vite.... :smiley-red:
http://perso.numericable.fr/tchonordiste/Arduino/VBetArduinoV3.zip

Pour la sauvegarde automatique, je t'avoue que je n'ai jamais regardé car chez moi cela ne le fait pas. :smiley-eek-blue:

++

L'expérience est une longue suite de bêtises...

Michel_B

#44
Jan 29, 2012, 11:31 am Last Edit: Jan 29, 2012, 11:39 am by Michel_B Reason: 1
Ca avance bien, grâce à ton exemple toutes les X secondes je relève la température du DALLAS 18B20 et je sauvegarde cette donnée dans la base en ajoutant la date et l'heure de la mesure.




J'essaye maintenant de lire les données de la base pour afficher un graphique de la T°.

++

Go Up