Projet

Salut tout le monde ;D !
Tout d'abord merci de prendre le temps de lire mon sujet :wink:

Alors je travaille actuellement sur un projet interdisciplinaire (projet que l'on réalise dans le cadre des Sciences de l'Ingénieur en Terminale) qui pourrait m'amener aux Olympiades académiques.

Je ne vais pas vous présenter mon projet (car d'autres pourraient reprendre mon idée :stuck_out_tongue: ) mais le fonctionnement que j'aurai voulu réaliser ne fonctionne pas avec le code que j'ai créé :confused: . Il faut savoir que j'ai découvert Arduino lors de la création de mon projet, j'ai donc vu quelques tutoriels (Openclassroom, le blog d'Eskimon...).

Je dispose d'une carte Arduino Uno et d'un "Starter Shield" de seeed studio dont voici le lien :

J'aurai donc aimé simuler le système avec le shield que j'ai.

Si vous n'avez pas regardé le shield, il y a 3 boutons "K1", K2" et "K3" reliés respectivement sur D9, D10 et D11.
Le K1 serait le "Reset",
K2 serait "On" et
K3 serait le capteur.
La LED1 simule le moteur et LED2 le buzzer

Le fonctionnement serait le suivant :

-Si Reset est appuyé : la LED1 s'allume jusqu'à ce qu'on appui sur le capteur
-Sinon
-Si On est appuyé : La LED1 s'allume jusqu'à ce que l'on appuie 30 fois sur le capteur puis s'arrête. Là
LED2 s'allume pendant 1seconde puis s'arrête. Et ce fonctionnement continu jusqu'à ce que l'on ré-appuie sur
le bouton On.

Voici ce que j'ai réalisé pour le moment :confused:

const int brocheMoteur = 3;//commande moteur sur 3
const int on = 11;//bouton K3 branché sur 11
const int reset = 10;//bouton K2 branché sur 10
const int capteur = 9;//bouton K1 branché sur 9
const int buzzer = 2;//meme si c'est 6 sur le shield, on prend une LED comme exemple
boolean etatAllumage;
boolean etatOn;

int compteurTours = 0;



void setup() {
  // put your setup code here, to run once:
  pinMode(brocheMoteur, OUTPUT);
  pinMode(on, INPUT);
  pinMode(reset, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(capteur, INPUT);
  Serial.begin(9600);
  etatAllumage=0;
  etatOn = HIGH;
}

void loop() {
  //put your main code here, to run repeatedly:
  boolean etatReset = digitalRead(reset);
  boolean etatCapteur = digitalRead(capteur);
  if (etatReset == LOW)//Si reset est appuyé
  {
    while (etatCapteur != LOW)  //Tant que le capteur de position initiale n'est pas détecté
    {
      digitalWrite(brocheMoteur,LOW);
      etatCapteur = digitalRead(capteur); //on fait fonctionner la LED ou moteur
    }
    analogWrite(brocheMoteur,HIGH); //on l'arrête
  }
  else//Si reset n'est pas appuyé
  {
    etatOn = digitalRead(on);
    if (etatOn == LOW) //si le bouton "on" est appuyé
    {
      if (etatAllumage == 1) //le bouton devient interrupteur
      {
        etatAllumage=0;
      }
      else
      {
        etatAllumage=1;
      }
    }
    etatCapteur = digitalRead(capteur);
    if (etatAllumage == 1)
    {
      digitalWrite(brocheMoteur,LOW);
      if (etatCapteur == 1) //si le capteur est appuyé, comment mettre un front montant ?
      {
        compteurTours = compteurTours + 1;
        delay(1000);
        if (compteurTours == 30)//si le capteur est détecté 30 fois
        {
          digitalWrite(brocheMoteur, HIGH);//le moteur s'arrete
          digitalWrite(buzzer, LOW);//buzzer s'allume
          delay(1000);
          digitalWrite(buzzer, HIGH);//puis s'arrete après 1sec
          compteurTours = 0;//reset du compteur
        }
      }
    }
    else
    {
      digitalWrite(brocheMoteur,HIGH);
    }
    
  }
  delay(200);

}

Merci d'avoir pris le temps de me lire :slight_smile:
Des bisous :-*

C'est intéressant, mais quelle est ta question ?

Tu devrais étudier un peu le sujet des machines à états : si tu penses qu'il s'adapte bien à ton projet, il te simplifiera la vie, car il existe des bibliothèques très puissantes sur Arduino pour les mettre en oeuvre.

Et bonne chance pour les Olympiades !

  boolean etatReset = digitalRead(reset);

if (etatReset == LOW)//Si reset est appuyé

pour que ton code soit cohérent avec ton commentaire, il faut avoir déclaré:

  pinMode(reset, INPUT_PULLUP); // et non pas INPUT

et monté ton bouton poussoir entre la broche reset et la masse.
De plus digitalRead() ne retourne pas un booléen, mais un int.
Et un booléen ne vaut pas HIGH ou LOW, mais true ou false.

lesept:
C'est intéressant, mais quelle est ta question ?

Tu devrais étudier un peu le sujet des machines à états : si tu penses qu'il s'adapte bien à ton projet, il te simplifiera la vie, car il existe des bibliothèques très puissantes sur Arduino pour les mettre en oeuvre.

Et bonne chance pour les Olympiades !

J'aurai aimé savoir pourquoi mon programme ne fonctionne pas et surtout comprendre mes erreurs. :cry:
Quant aux machines à états, je ne pense pas pouvoir les utiliser car j'utilise un capteur cardiaque (non présent dans mon code) qui, je pense, n'est pas compatible.
:confused:

biggil:
Et un booléen ne vaut pas HIGH ou LOW, mais true ou false.

Il est possible que cela soit une erreur mais selon Openclassroom c'est comme ceci que cela fonctionne car "le type boolean est tout à fait approprié pour la variable état bouton qui ne prend que les valeurs 1 ou 0 (HIGH ou LOW)"

biggil:
pour que ton code soit cohérent avec ton commentaire, il faut avoir déclaré:

  pinMode(reset, INPUT_PULLUP); // et non pas INPUT

et monté ton bouton poussoir entre la broche reset et la masse.
De plus digitalRead() ne retourne pas un booléen, mais un int.

De même, sur l'exercice nommé "Programme Jour/Nuit", ils ont écrit "pinMode(pinBouton, INPUT);"

Je vous met le lien :https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-bouton-poussoir

Merci de m'avoir répondu et de m'aider :wink:
PS: Merci pour tes encouragements lesept :slight_smile:

Kwx7as:
De même, sur l'exercice nommé "Programme Jour/Nuit", ils ont écrit "pinMode(pinBouton, INPUT);"

Oui, mais ... tu as mal lu ... ou mal recopié ?
La seule possibilité pour que digitalRead(...)==LOW indique un appui est d'avoir installé un pull-up.

biggil:
Oui, mais ... tu as mal lu ... ou mal recopié ?
La seule possibilité pour que digitalRead(...)==LOW indique un appui est d'avoir installé un pull-up.

Tu as en effet raison :sweat_smile: , j'ai négligé une part quand j'ai relu l'exercice où il est bien précisé que le bouton est monté avec une résistance en pull-down.
Merci ^^ pour ton aide

En prenant compte de tes remarques, j'ai ré-écris le code ce qui m'as donné ceci :

const int brocheMoteur = 3;//commande moteur sur 3
const int on = 11;//bouton K3 branché sur 11
const int reset = 10;//bouton K2 branché sur 10
const int capteur = 9;//bouton K1 branché sur 9
const int buzzer = 2;//meme si c'est 6 sur le shield, on prend une LED comme exemple
boolean etatAllumage;
boolean etatOn;

int compteurTours = 0;



void setup() {
  // put your setup code here, to run once:
  pinMode(brocheMoteur, OUTPUT);
  pinMode(on, INPUT);
  pinMode(reset, INPUT_PULLUP);
  pinMode(buzzer, OUTPUT);
  pinMode(capteur, INPUT);
  Serial.begin(9600);
  etatAllumage=0;
  etatOn = HIGH;
}

void loop() 
{
  //put your main code here, to run repeatedly:
  boolean etatReset = digitalRead(reset);
  if (etatReset == true)//Si reset est appuyé
  {
    boolean etatCapteur = digitalRead(capteur);
    while (etatCapteur == false)  //Tant que le capteur de position initiale n'est pas détecté
    {
      digitalWrite(brocheMoteur, HIGH);
      boolean etatCapteur = digitalRead(capteur); //on fait fonctionner la LED ou moteur
    }
    analogWrite(brocheMoteur,LOW); //on l'arrête
  }
  else//Si reset n'est pas appuyé
  {
    boolean etatOn = digitalRead(on);
    if (etatOn == false) //si le bouton "on" est appuyé
    {
      etatAllumage = 1;
    }
  }
    while (etatAllumage == 1)
    {
      digitalWrite(brocheMoteur,HIGH);
      boolean etatCapteur = digitalRead(capteur);
      if (etatCapteur == true) //si le capteur est appuyé, comment mettre un front montant ?
      {
        compteurTours = compteurTours + 1;
        delay(1000);//remplace le front montant pour le moment
        if (compteurTours == 30)//si le capteur est détecté 30 fois
        {
          digitalWrite(brocheMoteur, HIGH);//le moteur s'arrete
          digitalWrite(buzzer, HIGH);//buzzer s'allume
          delay(1000);
          digitalWrite(buzzer, LOW);//puis s'arrete après 1sec
          compteurTours = 0;//reset du compteur
        }
        boolean etatOn = digitalRead(on);
        if (etatOn == true) //si le bouton "on" est appuyé
        {
          etatAllumage = 0;
        }
      }
    }
    digitalWrite(brocheMoteur,LOW);
  delay(200);
}

et mon montage donne cela (voir image associée).
Cependant, cela ne fonctionne toujours pas, en simulant sur le site TinkerCAD, les variables etatReset et etatCapteur ne changent pas de valeur.
Serait-il possible que vous me montriez mes erreurs car je ne comprends pas pourquoi mon programme ne fonctionne pas.
Merci de m'accorder de votre temps :slight_smile:

Tu n'as pas de montage pour tester ?
Je ne connais pas TinkerCAD, et je ne sais pas s'il peut simuler un appui long sur un bouton, ce qui est peut-être une source de ton problème.

En tout cas, pour déboguer, il faut faire afficher des choses : rien de plus difficile à comprendre qu'un code muet...
Donc, ajouter des Serial.println par endroits pour afficher des variables et voir si tu passes bien aux endroits que tu espères.

Bonjour

En général je ne réponds jamais aux messages où le montage est décrit par un dessin de câblage Fritzing
Je fuis ces toiles d'araignées bariolées.....et ne prend en compte que les schémas (composants représentés par des symboles)

içi ,au premier coup d'oeil il semble que les fils allant aux broches 9,10,11 soit reliés en permanence au +5V.
Comment les variables associées pourraient changer de valeur ?

Montage d'un bouton poussoir avec PULL-UP:

broche digitale arduino <---> bouton poussoir < --- > Masse
(pas besoin de résistance)

init: pinMode ( broche, INPUT_PULLUP );

utilisation:

int etat = digitalRead ( broche );

si etat == LOW -> bouton appuyé
si etat == HIGH -> bouton relâché

Bonjour,

Sur ton schéma, il y a bien un pulldown sur les deuxième et troisième boutons, mais il n'y a pas de pulldown sur le premier bouton.
Il manque les résistances de limitation pour les leds.

Merci pour vos remarques, je tiens compte de vos réponses. :slight_smile:

Bonjour tous

Je ne connais pas TinkerCAD

Lesept, tu dois connaître Tinkercad sous son ancienne version, c'est le simulateur de circuits.

C'est super ce truc, mais il manque énormément de composants, on peut les modéliser soi-même, mais j'ai pas le niveau.

Quand je disais "je ne connais pas", c'était plutôt "je n'ai jamais utilisé". Je sais qu'il existe, j'ai jeté un œil mais n'en ayant pas eu besoin je ne suis pas allé plus loin. Il est quelque part dans mes favoris :slight_smile:

J'ai essayé, surtout pour apprendre (j'ai suivi les videos de Monsieurs Francois pour comrpendre les bases). Ca aide beaucoup d'avoir un circuit et de faire le code en même temps, le souci c'est que je n'y retrouve qu'une partie de nos composants et modules...

lesept:
Tu n'as pas de montage pour tester ?
Je ne connais pas TinkerCAD, et je ne sais pas s'il peut simuler un appui long sur un bouton, ce qui est peut-être une source de ton problème.

En tout cas, pour déboguer, il faut faire afficher des choses : rien de plus difficile à comprendre qu'un code muet...
Donc, ajouter des Serial.println par endroits pour afficher des variables et voir si tu passes bien aux endroits que tu espères.

Malheureusement, je suis scolarisé en internat loin de chez moi et en période de vacance donc je n'ai pas pu emporter tous les éléments dont j'avais besoin car je ne les connaissais pas encore. :confused:
Je vous présente mes excuses pour ma réponse tardive (absence de réseau).

N'ayant pas encore le matériel, je ne peux donc pas rajouter de "Serial.println".

De plus, il est vrai que je ne sais pas non plus si TinkedCAD possède la simulation appui long, il n'y a pas non plus de raccourcis clavier pour activer les boutons, cela peut donc être la source de mon problème.

J'ai donc réécris un code en prenant compte de vos remarques mais je ne peux pas encore le tester.

Merci de m'avoir accordé votre temps et votre aide.

Sur TinkerCad tu cliques à la souris, donc oui, on peut faire un appui long, du moins, je le crois.

On trouve pas tous les composants, mais ça peut aider à matérialiser une idée. Facile à prendre en mains, on code en même temps qu'on bricole sur la breadboard.

Limité, mais très bien au début. Après, c'est vrai que ... bon... c'est pas non plus l'Amérique.