Débutant total en besoin pressant d'aide

Bonjour à tous,

Je suis en classe préparatoire et je fais actuellement face au langage Arduino, dont je n'ai jamais fait usage.

Je souhaite réaliser un programme simple, or je n'ai aucune idée de l'architecture que celui-ci doit suivre.

Il me faut en effet être capable de donner une commande suite à la réception d'une information codée sur 2 bits (reçue a priori par bluetooth mais la transmission passe après le programme question priorités).

L'idée est que l'information codée sur 2 bits, issue d'un programme tiers (Python en l’occurrence) soit en mesure d'être traduite en l'activation d'une LED (par exemple).

En fait, je travaille sur un projet de reconnaissance gestuelle. Pour simplifier, l'étude est restreinte à la description d'un rond (00), d'un triangle (01) et d'un carré (11) via un smartphone dans la main de l'utilisateur. Le programme Python reconnaît, au moyen de données accélérométriques de quel mouvement il s'agit et donne alors l'information codée sur 2 bits. Une fois l'information transmise, j'aimerai être en mesure, au moyen d'Arduino, de donner un rendu visuel du projet : par exemple, une LED rouge qui s'allume pour montrer que le geste détecté est un rond, une LED verte pour un triangle, etc..

Encore une fois je n'ai jamais touché au langage Arduino, qui semble être relativement éloigné du langage Python (assez simpliste)

Merci d'avance pour vos proposition,

Un galérien en détresse

Ne zappez pas la base ou vous allez galèrer

commencez par le début et faites les premiers tutos d'eskimon pour découvrir l'engin et le langage C/C++ - vous verrez que les structures de base (tests, boucles etc) ressemble à ce que vous connaissez (faudra rajouter un peu de parenthèses, accolades et points virgules ici et là)

par exemple en Python

if poids > 50:
     print("votre valise est lourde.")

deviendra

if (poids > 50) {
   Serial.println("votre valise est lourde.");
}

(bon comme on a une seule expression dans le if on pourrait éviter les accolades mais c'est pour l'idée)

si vous savez recevoir vos 2 bits dans un octet, il suffira de tester si vous avez reçu 0, 1, 2 ou 3 en décimal puisque c'est ce que vos 2 bits vont représenter

si vous recevez des chaines de caractères en ASCII alors il faudra utiliser les fonction de comparaison de chaîne de caractère genre strcmp() (cf la liste non complète dans stdlib.h et string.h)

Si vos données arrivent sur le port série, il est bon de lire ce tuto en anglais : Serial Input Basics

bon courage

Bonjour,

Je sais, ça ne va pas beaucoup t'aider mais il faut savoir que le

broapapapap:
langage Arduino

n'existe pas. C'est du C/C++.

Bonsoir,

Merci 3Sigma pour ta précision.

Merci également à J-M-L pour votre réponse rapide. J'ai lu ces dernières heures quelques tutos réalisés par eskimon, relativement bien faits.

J'ai aussi cherché à droite/à gauche quelques topics concernant l'implémentation du module bluetooth.

Après compilation, il m'est retourné un message d'erreur que je n'arrive pas à identifier : voyez-vous ce qui m'a échappé? :

const int triPin = 12;
const int carPin = 11;
const int ronPin = 10;
int tri = true;
int car = false;
int ron = false;
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8,9);

void setup() 
{
  //initialisation module bleutooth
  Serial.begin(9600);
  mySerial.begin(9600);
  
  // initialisation en sortie de toutes les broches
  pinMode(triPin,OUTPUT);
  pinMode(carPin,OUTPUT);
  pinMode(ronPin,OUTPUT);

  // initialisation des niveaux des variables
  digitalWrite(triPin,LOW);
  digitalWrite(carPin,LOW);
  digitalWrite(ronPin,LOW);
}

void loop() 
{
  //
  if (mySerial.available());
    {
      char retour = mySerial.read();
    }

  if (retour == tri);
    {
      digitalWrite(triPin,HIGH);
      delay(1000);
      digitalWrite(triPin,LOW);
      delay(1000);
      digitalWrite(triPin,HIGH);
      delay(1000);
      digitalWrite(triPin,LOW);
    }
  else if(retour == car);
    {
      digitalWrite(carPin,HIGH);
      delay(1000);
      digitalWrite(carPin,LOW);
      delay(1000);
      digitalWrite(carPin,HIGH);
      delay(1000);
      digitalWrite(carPin,LOW);
    }
  else if(retour == ron);
    {
      digitalWrite(ronPin,HIGH);
      delay(1000);
      digitalWrite(ronPin,LOW);
      delay(1000);
      digitalWrite(ronPin,HIGH);
      delay(1000);

Le message d'erreur concerne le dernier test booléen avec le else, me disant que 'retour' was not declared in this scope..

Merci d'avance encore une fois!

  if (mySerial.available()) {
    char retour = mySerial.read();
  }

--> retour ne va être connu que dans ce if (lire des choses sur la portée des variables)

il faut mettre char retour; en variable globale par exemple et lui donner une valeur par défaut qui vous convient pour faire quelque chose de cohérent tant que vous n'avez pas reçu de commande

Aussi virez les ; à la fin des if partout

  else if(retour == ron)[color=red];[/color]
int tri = true;
int car = false;
int ron = false;

ce sont des booléens ou des entiers (int) ? ? ?

enfin  if (retour == tri) {--> vous pensez que ça fait quoi comme test?

pepe:
Si « false » est toujours égal à 0, « true » est égal à une valeur entière non nulle dont il est préférable de ne pas préjuger, car elle peut varier d'un système à l'autre

Non non, en fait le standard C++ définit une conversion automatique (allez voir le chapitre 4.7 Integral conversions, point 4)

C++ standard: "If the source type is bool, the value false is converted to zero and the value true is converted to one."

et 4.12 dit aussi

4.12 Boolean conversions [conv.bool]
1 A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. For direct-initialization (8.5), a prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

c'est pour cela qu'on peut écrire

 if (pointeur) {...}

au lieu de faire

 if (pointeur != NULL) {...}

c'est dans la spec !!

OK oui - de manière générale, ne pas prendre de raccourcis en pensant être plus malin.. Laisser le compilateur faire son boulot et rester sémantiquement correct est important

oui c'était sans rapport, juste pour le plaisir :slight_smile: (NULL est sémantiquement un pointeur cependant)

Merci pour vos réponses! j'ai pu avancer dans mon apprentissage du langage.

J'ai maintenant droit à cela :

Arduino : 1.8.2 (Windows 10), Carte : "Arduino/Genuino Uno"

Le croquis utilise 3508 octets (10%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 297 octets (14%) de mémoire dynamique, ce qui laisse 1751 octets pour les variables locales. Le maximum est de 2048 octets.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x88
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x88
Problème de téléversement vers la carte. Voir http://www.arduino.cc/en/Guide/Troubleshooting#upload pour suggestions.

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

J'ai ajouté quelques lignes afin de tester rapidement le matériel avec la LED. Mais impossible de téléverser le script. Je remets une version de mon script mis à jour :

const int led = 13;
const int triPin = 12;
const int carPin = 11;
const int ronPin = 10;
int tri = 1;
int car = 2;
int ron = 3;
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8,9);

void setup() 
{
  //initialisation module bluetooth
  Serial.begin(9600);
  mySerial.begin(9600);

  pinMode(led,OUTPUT);
  digitalWrite(led,LOW);
  
  // initialisation en sortie de toutes les broches
  pinMode(triPin,OUTPUT);
  pinMode(carPin,OUTPUT);
  pinMode(ronPin,OUTPUT);

  // initialisation des niveaux des variables
  digitalWrite(triPin,LOW);
  digitalWrite(carPin,LOW);
  digitalWrite(ronPin,LOW);
}

void loop() 
{
  // test disponibilité du module bluetooth
  if (mySerial.available())
        {
              char retour = mySerial.read();
              if (retour == tri);
                    {
                    digitalWrite(triPin,HIGH);
                    delay(1000);
                    digitalWrite(triPin,LOW);
                    delay(1000);
                    digitalWrite(triPin,HIGH);
                    delay(1000);
                    digitalWrite(triPin,LOW);
                    }
              if(retour == car);
                    {
                    digitalWrite(carPin,HIGH);
                    delay(1000);
                    digitalWrite(carPin,LOW);
                    delay(1000);
                    digitalWrite(carPin,HIGH);
                    delay(1000);
                    digitalWrite(carPin,LOW);
                    }
              if(retour == ron);
                    {
                    digitalWrite(ronPin,HIGH);
                    delay(1000);
                    digitalWrite(ronPin,LOW);
                    delay(1000);
                    digitalWrite(ronPin,HIGH);
                    delay(1000);
                    digitalWrite(ronPin,LOW);
                    }
  digitalWrite(led,HIGH);
  delay(1000);
  digitalWrite(led,LOW);
  delay(1000);
  digitalWrite(led,HIGH);
  delay(1000);
  digitalWrite(led,LOW);
        }
}

Maintenant, plus de problème ou de message d'erreur a priori, jusqu'au moment du téléversement donc.

Merci encore!

Un tutoriel Sparkfun qui pourrait être bien utile:

https://learn.sparkfun.com/tutorials/using-the-bluesmirf

J'ai ajouté quelques lignes afin de tester rapidement le matériel avec la LED. Mais impossible de téléverser le script. Je remets une version de mon script mis à jour :

je mets mon billet que ca vient du fait que tu as connecté tri à la pin 1
donc sur la pin tx de la carte

int tri = 1;
..
..
..
 pinMode(triPin,OUTPUT);

change de pin et ca ira mieux ou vire la connexion sur cette pin pour téléverser le code

Bonjour infobarquee,

Le problème ne vient pas d'ici car j'ai bien assigné (et branché) la pin de la LED au numéro 13.

Je rencontre également le même problème avec un programme exemple (BlinkWithoutDelay).

Le montage est le suivant : (Arduino Mega 2560)

Pin 13 en série avec une résistance de 220 Ohm (comme préconisé sur un tuto issu du site Arduino) , elle même en série avec une LED, en série également avec le GND de la carte.

Je ne vois donc pas d'où provient le problème, et j'avoue que je ne comprends pas grand chose à la situation.

Le message d'erreur demeure le même, à savoir un temps de transfert trop long, ce qui semble avorter le téléversement.

Merci encore!

ce que dit infobarquee c'est d'enlever le bout de fil qui est branché sur la pin 1 --> virez le

si ça ne marche pas, au moment où l'IDE dit qu'il va télécharger, appuyez sur le bouton reset de votre arduino.

Rien n'est branché sur la pin 1. J'ai également essayé de reset la carte comme vous me l'avez proposé, le résultat reste le même.

alors il faut essayer les techniques standard que vous trouverez sur le web

à couper des étapes vous avez peut-être aussi grillé votre arduino ou les pin 0 ou 1

Je ne pense pas que la carte soit en cause pour ce problème: j'ai pu essayé une autre carte (Uno) et le problème était le même (avec un test sur le programme exemple "Blink"). J'ai également essayé en changeant de câble, rien n'y fait. J'ai même désinst/réinst le tout, pas de changement, et même chose après avoir désinst/réinst les pilotes en lien au COM3. Je pense que j'irai essayer sur un autre PC, voir si le problème vient du mien, ce que je ne comprendrai pas..

Et vous êtes sûr que c'est la bonne carte choisie dans l'IDE

Absolument, une Mega 2560 dans l'IDE et c'est bien ce qu'il est écrit sur la carte

ma question portait sur l'autre test -->

'ai pu essayé une autre carte (Uno) et le problème était le même

vous aviez bien changé la carte ?

Oui j'avais bien prêté attention à ce détail. J'ai pu prendre une 3ème carte (Mega) et le téléversement à réussi. J'ai donc eu la chance de tester deux cartes grillées à la suite!

En tout cas un grand merci pour votre aide!