Bonjour à tous, je cherche depuis un moment sur google mais je ne trouve pas ce que je veux.
je voudrais une approche simple pour pouvoir envoyer des données, de mon PC vers l'arduino.
Exemple, je rentre dans un terminal : var = 5 et dans l'arduino var prend la valeur 5.
Et si vous aviez le tuto pour faire une interface graphique, meme ultra moche, ça serait le pied!!
merci
Il y plein de tuto sur le site Arduino avec qui utilise Processing coté PC.
Sinon, tu peux faire des programmes en C# en utilisant la version gratuite de Visual C#
Après il faut que tu utilises la liaison série pour échanger des messages (voir mon tuto sur les protocoles de communication dans la section Tutoriaux du forum) avec l'Arduino.
Ok, je vais chercher sur les tutos du site et regarder les tiens, même si je suis pas certain d'avoir une "prise" pour les liaisons series sur mon arduino XD
( précision : je suis un gros noob, et je n'ai même pas la prétention d'un jour ne plus l’être, alors je fais de la "....." mais ça me plait donc soyez indulgents )
J'ai qu'un seul tuto qui s'appelle "Implementer un protocole de communication"
Désole, je suis sur mon téléphone je ne peut pas chercher et te donner le lien direct.
La liaison série c'est le lien de communication que tu utilises avec ton Arduino quand tu la relie au PC.
Sur ton Arduino il y a un composant qui fait l'interface en USB et la liaison série du chip Arduino. Quand tu fait un Serial.println(), tu utilise la liaison série pour envoyer le message au PC.
Sur le PC, Windows (ou Linux) détecte l'interface USB comme une interface série et crée un port COMx qui est celui que choisit dans les menu de l'IDE Arduino.
En c#, pour utiliser la liaison série, il existe une classe SerialPort. Il suffit de créer un objet de cette classe genre :
SerialPort serial("COM1", 9600)
pour en suite pouvoir faire comme sur l'Arduino des serial.write() ou serial.read()
Bien sur les fonctions C# sur l'utilisation du port série sont sensiblement différentes dans leur syntaxe que celle de l'Arduino mais c'est en gros le même principe.
Si tu débute et que tu veut faire un interface graphique je te conseille (au choix) :
le C# (langage ~ C/C++) -> plein de truc tout prêt pour faire des interfaces graphiques
le VB.net (langage type basic) -> comme le C# mais en langage basic
C'est nettement plus simple que d'utiliser processing (dans le cadre d'un gui).
Si tu veut vraiment faire tes gui avec processing -> menu -> examples -> ouvre les rubriques -> gui
Pour le protocole tu peut prendre exemple sur le tutoriel de barbudor (voir dans la section tuto du forum).
J'ai aussi fait un systéme avec des commandes reprenant la mise en forme d'une trame nmea :
héhé sympa pour tous ces tuyaux !!
je vais essayer de me débrouiller avec tout ça !
enfait je pensais qu'il y aurait une petite interface toute faite existante sur le logiciel d'arduino.
mais ça aurait été sans doutes trop simple !
Je vous dis ce qu'il en suit ! et merci !
J'ai bien lu ce que Barbudor m'a expliqué et j'ai visité le SiteduZero et j'ai compris que je n'avait pas besoin d'aller si loin que ce dont vous me parler pour le moment
Enfait je peux modifier la valeur d'une variable sur mon arduino depuis mon PC et ce grace au "serial monitor" d'après ce que j'ai compris.
cependant lors de mes essais.. devinez quoi ? Ca marche pas
const int ledPin=2;
int valPc = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
if (valPc = 1)
{
Serial.println(valPc,DEC);
digitalWrite (ledPin, HIGH);
delay(5000);
}
}
Bon, normalement si j'entre la valeur 1 dans le serial monitor, la led devrait s'allumer pendant 5sec, jusqu'a que j'entre une valeur différente, comme "4" par exemple.
Mais le serial moniteur m'envoit du :
-1
1
-1
ET lorsque je rentre un chiffre :
s4
En effet, une erreur de ma part !
Mais ça ne fonctionne toujours pas..
Le serial monitor continu de m'envoyer des series de -1 et 1 sans que j'entre de valeur.
On dirait qu'il m'envoit la valeur du nombre de données contenues dans le buffer de l'arduino.
et que cette valeur oscillerait de -1 à 1.
Je ne comprend pas bien ce qu'il se passe.
Ahhh, je crois avoir compris mon erreur, il faut lui parler en octets ?
j'essaie et je vois
Edit : bon j'ai essayé.. c'est la misère.
J'ai honteusement plagié un programme qui me renvoi juste l'octet reçut. rien de bien compliqué.
Je remarque que si je tape un caractère et que je l'envois depuis le serial monitor, l'arduino me renvoi la valeur décimal ascii du caractère, jusque là, normal c'est ce qu'on lui demande.
Mais lorsque je veux taper un caractère comme le 0, le caractère correspondant c'est "NUL".
Du coup.. ça marche pas.
Je ne sais pas si je suis bien clair, alors un exemple.
Le code de arduino.cc :
int incomingByte = 0; // variable pour lecture de l'octet entrant
void setup() {
Serial.begin(9600); // ouvre le port série et fixe le débit à 9600 bauds
}
void loop() {
// envoie une donnée sur le port série seulement quand reçoit une donnée
if (Serial.available() > 0) { // si données disponibles sur le port série // lit l'octet entrant
incomingByte = Serial.read();
Maintenant admettons que j'entre dans le serial monitor le caractère "a", il me retourne : 97, et c'est bien normal !
Mais si je veux qu'il me retourne 0 par exemple, je devrais entrer "NUL" en suivant cette logique, mais là.. il me retourne : 78 puis 85 puis 76, soit la valeur décimal des caractères N puis U puis L ..
Ahlalaa tout ça parceque je veux changer une variable sur l'arduino,pendant qu'il tourne depuis mon PC...
Comme je le dis dans mon tuto, il y a 2 type de protocoles :
ASCII
Binaires
Quand tu tapes "4" dans ton Serial monitor, tu tape en ASCII et le Serial monitor envoie sur la liaison série les octets 0x34 ("4") puis 0x0D (touche return).
Quand tu écris dans ton code val = Serial.read(); tu lis un octet. C'est à dire que tu considère que le protocole est binaire.
Si tu exécutes le code posté par Kira juste au dessus, tu verras s'afficher le code ASCII correspondant à l avaleur des octets envoyés par le Serial monitor.
Petit programme pour allumer / éteindre une LED depuis le port série du PC
Juste une LED entre la Pin 13 et le Gnd
// Jour / Nuit (Hahaha :-)
// Allumage / Extinction d'une LED via liaison série
// (C) MD 06/07/12
int LED = 13;
int reception;
void setup()
{
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// --- Attend de recevoir 'j' ou 'n' sur le porte série
// (remet la saisie en majuscule)
if (Serial.available())
{
int reception = toUpperCase( Serial.read() );
if (reception == 'J') { digitalWrite(LED, HIGH); }
if (reception == 'N') { digitalWrite(LED, LOW ); }
}
}
Tu tapes J ou N dans ton terminal et ça s'allume et s'éteint
Pour un supplément modique, je te fais l'interface graphique en PureBasic avec bouton Jour / Nuit
C'est vrai que j'utilise peu le système switch /case quand il y a peu de conditions
Vieille habitude de l'époque des pc peu puissants et des astuces d'optimisation: on indiquait qu'un compilateur (ou interpréteur) a moins de "boulot" pour traiter une succession de IF plutôt que SWITCH / CASE. Est-ce encore vrai ?
C'est moins beau comme code, mais le prog n'a qu'une seule instruction à traiter: IF (condition non remplie ? bye!) pas besoin d'attendre le BREAK et les autres instructions de fermeture C'est bref comme un opérateur ternaire.
Les afficionados de l’assembleur avaient fait une demo du pourquoi, c'est vieux, mais c'était convaincant. Bon, c'est vrai que maintenant vu la puissance des cpu... et « l'horribilité » de la machine Java, le bidouillage en vue d'optimisation passe inaperçu XD
Marc56:
indiquait qu'un compilateur (ou interpréteur) a moins de "boulot" pour traiter une succession de IF plutôt que SWITCH / CASE. Est-ce encore vrai ?
C'est complètement faux, et çà l'a toujours été.
Si tes cases sont des valeurs consécutives, le compilateur optimise en utilisant une table de saut ce qui est plus rapide.
Dans le cas contraire il implémente cela de la même manière que des if successifs.
Il y a pas 50 façon de le faire donc des if() seront toujours au mieux équivalent ou moins bon qu'un switch/case.