Tp feux de carrefour

Bonjour, je suis nouveau sur le forum alors excusez moi d'avance si le sujet n'est pas au bonne endroit .

Voilà mon problème, je débute en arduino et j'ai un tp à faire pour les cours qui est à rendre mercredi 7 octobre.

Le tp consiste à réaliser un programme qui gère 2 feux tricolore et 1 feux piéton avec bouton.

Ce que le prof veut absolument c'est 2 cartes arduino :

  • une pour les feux tricolore (6 leds)
  • l'autre pour le feux piéton avec le bouton (2 leds et un bouton)

La condition est que quand on appuie sur le bouton, il faut qui se créer une interruption sur la carte avec les feux tricolore. C'est la que sa coince, le programme pour les feux tricolore est fait mais l'interruption je ne comprends pas.

Désolé si il y a des faute d'orthographe et merci d'avance pour votre aide.

Je te conseille d'aller faire un tour sur le site d'eskimon.fr et de lire son excellent tuto, particulièrement la partie sur les interruptions.

http://eskimon.fr/96-arduino-204-un-simple-bouton#542918

Kmb53:
...
Voilà mon problème, je débute en arduino et j'ai un tp à faire pour les cours qui est à rendre mercredi 7 octobre.

Bonsoir
... et ce que tu dois faire et rendre le 7/10, tu le sais depuis quand ?
10 minutes ?
Ici "on" a assez l'habitude des lyceens qui se reveillent une semaine avant l'examen, mais pas encore (sauf erreur de ma part) de la demande pour rendre un TP à moins de 48H

tic...
tac...
tic...
tac...

Sur le principe je suis d'accord avec Artouste et je plussoie au conseil de Jambe sur le tuto d'Eskimon.

Mais on ne va pas le facher trop fort .
On a un lycéen qui dit bonjour, qui dit merci, qui s'exprime en français, qui s'excuse pour le cas où il aurait mal posté et pour ses éventuelles fautes d'orthographe. Nous sommes tombé sur un cas exceptionnel, franchement on n'en a pas l'habitude.

Bon il n'empèche KmB53 qu'un professeur ne donne pas un sujet la veille pour le lendemain.
Tu as sans doute reçu des cours sur les interruptions et tu as sans doute cherché avant de venir ici.

Il se trouve qu'ici on n'aide pas ceux qui ne font pas d'effort, c'est clairement indiqué dans le message d'accueil, personne n'est pris par surprise.
Pourquoi ne pas avoir joint tes essais de codage même et surtout si cela ne marche pas, tu aurais assurément obtenu de l'aide mais là "pas de code pas de chocolat".
Pense s'y la prochaine fois.

68tjs:
Sur le principe je suis d'accord avec Artouste et je plussoie au conseil de Jambe sur le tuto d'Eskimon.

Mais on ne va pas le facher trop fort .
On a un lycéen qui dit bonjour, qui dit merci, qui s'exprime en français, qui s'excuse pour le cas où il aurait mal posté et pour ses éventuelles fautes d'orthographe. Nous sommes tombé sur un cas exceptionnel, franchement on n'en a pas l'habitude.

...
Bonsoir 68tjs
C'est aussi pour (tout) ça , que ma réponse aura été très délicate ... et aussi très mesurée :grin:

Merci de vos réponses
Cela fait 9h que je bosse sur le tp et n'ayant pas réussi j'ai voulu demander de l'aide.
Si je n'ai pas mis de photo du code et du câblage c'est parce que j'ai posté le message avec mon téléphone et je n'avais pas les photos.

Voici le code de la première carte avec les 2 feux tricolore.

int feu_1_rouge = 10;  //Désignation des pins par leur appélation, ici la pin 10 par "feu_1_rouge".
int feu_1_orange = 9;
int feu_1_vert = 8;

int feu_2_rouge = 7;
int feu_2_orange = 6;
int feu_2_vert = 5;



void setup() {
  pinMode(feu_2_vert, OUTPUT);  //Déclaration des pins en sortie.
  pinMode(feu_2_orange, OUTPUT);
  pinMode(feu_2_rouge, OUTPUT);
  pinMode(feu_1_vert, OUTPUT);
  pinMode(feu_1_orange, OUTPUT);
  pinMode(feu_1_rouge, OUTPUT);
}

void loop() {

    digitalWrite(feu_1_rouge, HIGH);  //Mettre la pin 10 à l'état HAUT (+5V) durant 3000 cycles machine (fréquence d'horloge.
    digitalWrite(feu_2_rouge, HIGH);
    delay(3000);
    digitalWrite(feu_1_rouge, LOW);  //Mettre la pin 10 à l'état BAS (0V) durant 3000 cycles machine (fréquence d'horloge).
    digitalWrite(feu_1_vert, HIGH);
    delay(3000);
    digitalWrite(feu_1_vert, LOW);
    digitalWrite(feu_1_orange, HIGH);
    delay(1000);
    digitalWrite(feu_1_orange, LOW);
    digitalWrite(feu_1_rouge, HIGH);
    delay(3000);
    digitalWrite(feu_2_rouge, LOW);
    digitalWrite(feu_2_vert, HIGH);
    delay(3000);
    digitalWrite(feu_2_vert, LOW);
    digitalWrite(feu_2_orange, HIGH);
    delay(1000);
    digitalWrite(feu_2_orange, LOW);
    digitalWrite(feu_2_rouge, HIGH);
    delay(300);
}

Et la deuxième carte avec le bouton et le feux piéton.

int bouton = 0;
int feux_rouge_pieton = 7;
int feux_vert_pieton = 6;
volatile int etat = LOW;


void setup() {
  pinMode(feux_rouge_pieton, OUTPUT);
  pinMode(feux_vert_pieton, OUTPUT);
  attachInterrupt(bouton, Change_etat, CHANGE);

}

void loop() {
  if(bouton == HIGH)
  {
    digitalWrite(feux_vert_pieton, HIGH);
  }
  else
  {
    digitalWrite(feux_rouge_pieton, HIGH);
  }
}

void Change_etat() {
  etat = !etat;
  digitalWrite(3, HIGH);
}

Le câblage que j'ai fait.

Je rappelle la première carte contient les 2 feux tricolore. Et la deuxième carte contient le feux piéton avec le bouton qui doit faire une interruption sur la première carte.
C'est sur l'interruption que je bloque.

Euh le code pas en photo stp mais entre les balises code voir le 2eme message épinglé.

bonjour,
déjà il manque une connexion entre les cartes.

elle est ou l'instruction sur la 1ere carte pour dire de mettre en route les feux via la 2eme?

sur la deuxième

void Change_etat() {
  etat = !etat;
  digitalWrite(3, HIGH);
}

ca sera toujours en HIGH, ca serait pas un truc de ce genre?

void Change_etat() {
  etat = !etat;
  digitalWrite(3, etat);
}

mais bon, passer 9h pour faire un code comme ca sur la 1ere carte, heuuuu no comment.

Tu as des difficultées avec l'interruption.

Et au lieu de nous dire que tu n'a pas compris, ce qui n'est pas très efficace, si tu nous disais ce que tu as compris du fonctionnement de l'interruption ?
Parce que tu as forcément compris quelque chose même si c'est insuffisant.
Je sais cela fait scolaire et ce n'est peut-être pas le plus agréable.
Cela nous permettra de t'aider plus facilement et le fait d'expliquer à d'autres ce qu'on n'a pas compris est très efficace et permet souvent de trouver soit même l'endroit du blocage et par conséquent la solution.

Schéma :
A titre personnel je déteste, je hais, Fritzing mais bon je conçois que pour débuter cela aide.
Mais de grâce ne donne pas cette œuvre d'art de schéma de cablâge, fort belle, mais incompréhenssible.
Ce qu'il faut c'est un vrai schéma électrique avec des symbôles normalisés compréhenssible par tout le monde.

Fritzing permet de le faire, pourquoi s'en priver ?
Dans les menus il y a une possibilité de générer le schéma électrique à partir du schéma de cablâge, c'est ce schéma électrique qu'il nous faut.
Cerise sur le gâteau sur le schéma de cablâge tu aura du mal à trouver le fil qui manque indiqué par Infobarquee alors que sur le schéma électrique (normalement) il te sautera aux yeux.

D'une manière générale je n'ai jamais essayé des fonctions blocantes comme delay() avec des interruptions.
Intuitivement je pense que cela ne fait pas bon ménage. Confirmation ?

moi j'ai appris un truc c'est que Fritzing permettait de faire des schémas ... :slight_smile:

on peut faire aussi sans interruption à moins que se soit demandé par ton prof.

J'avais fait une page avec la gestion d'un feu piéton par interruption ici

Bonjour,

A mon avis la gestion du bouton par interruption est le moindre des problèmes (d'ailleurs on peut se passer de la gestion des interruptions)
Le problème est relativement complexe.

Il faut

  • synchroniser les deux feux entre eux (simple)
  • synchroniser le feu piéton avec un des deux feux (d'ailleurs pourquoi il n'y a pas deux feux piéton). La carte qui gère les feux doit envoyer des messages pour commander la carte qui gère le feux piéton (là ça commence à se compliquer un peu)
  • quand on appuie sur le bouton (qu'on le gère en interruption ou pas), la carte des feux piéton doit envoyer un message à la carte des feux pour détourner son cycle normal, faire passer le feu à l'orange (si le feu n'est pas déjà rouge) et au rouge et envoyer la commande du feu piéton comme précédemment.

Comme on voit ce n'est pas simple (et encore j'ai passé sous silence la gestion des tempos de sécurité).

j'avais un code de feux tricolore j'ai essayé de l'adapter à ton tp si ça peux t'aider, je sais j'ai une façon un peu tordu de programmer .. par contre la carte avec le feu piéton je n'ai pas réfléchi au problème
les tableaux feu1[] et feu2[] servent de table de vérité pour allumer ou éteindre les feux, ça allège le code ça le complique un poil.

const int feu_1_rouge = 10;  
const int feu_1_orange = 9;
const int feu_1_vert = 8;

const int feu_2_rouge = 7;
const int feu_2_orange = 6;
const int feu_2_vert = 5;

const byte feu[12]={0,1,2,0,0,0,  0,0,0,0,1,2};    // cycle de fonctionnement des feux 0=rouge, 1=vert, 2=orange 2*6 étapes en tout
    
int temps=0;
byte etape=-1;

void setup() {
  pinMode(feu_2_vert,   OUTPUT);  
  pinMode(feu_2_orange, OUTPUT);
  pinMode(feu_2_rouge,  OUTPUT);
  pinMode(feu_1_vert,   OUTPUT);
  pinMode(feu_1_orange, OUTPUT);
  pinMode(feu_1_rouge,  OUTPUT);
  pinMode(2,INPUT);              // si l'entrée est active le feu passe a l'orange et au rouge
 }

void loop() {
  int ct=2000;  // temps  orange et des deux rouge en meme temps 2s

  delay(1);   // attend 1ms
  temps++;  // incrémente temps toute les milisecondes
  
  if (digitalRead(2)) {  // si l'entrée 2 est active
     if (!feu[etape]-1) {etape=2; temps=0;}

  }
  if (etape==1 || etape==4 ) ct=10000;  // quand un des feux est vert on attend 10s 
 
  if (temps >= ct) { // au bout d'un certain temps ...
    etape++;   // on change d'étape
    temps=0;   // remet à 0 la tempo
    if (etape >=6) etape=0;  // si les 6 étapes sont réalisées on recommence  
   }
    digitalWrite(feu_1_rouge,  !feu[etape]);      // alume ou eteint feu_1_rouge si un "0" est trouvé dans le tableau feu1[]
    digitalWrite(feu_1_orange, !(feu[etape]-2));  // alume ou eteint feu_1_orange si un "2" est trouvé dans le tableau feu1[]
    digitalWrite(feu_1_vert,   !(feu[etape]-1));  // alume ou eteint feu_1_vert si un "1" est trouvé dans le tableau feu1[]
    digitalWrite(feu_2_rouge,  !feu[etape+6]);      // alume ou eteint feu_2_rouge si un "0" est trouvé dans le tableau feu2[]
    digitalWrite(feu_2_orange, !(feu[etape+6]-2));  // alume ou eteint feu_2_orange si un "2" est trouvé dans le tableau feu2[]
    digitalWrite(feu_2_vert,   !(feu[etape+6]-1));  // alume ou eteint feu_2_vert si un "1" est trouvé dans le tableau feu2[]
 }

C'est pour un travail scolaire qui sera noté.

On aide, on explique, on met sur la voie, mais jamais on propose des solutions clé en main, surtout quand elles ne sont pas expressément demandées.

Merci.

68tjs:
C'est pour un travail scolaire qui sera noté.

c'était ...

Kmb53:
j'ai un tp à faire pour les cours qui est à rendre mercredi 7 octobre.

Exact.

L'échéance est dépassée, et quand on voit le fossé qui sépare le code qui était proposé par l'étudiant à J-1 soir de l'échéance, et les difficultés à résoudre fort justement soulignées par kamill, l'objectif à atteindre était mort depuis longtemps.

Le seul service qui reste à rendre à kmb53, c'est de l'aider à réaliser à quel point il était loin de l'objectif fixé par son prof. A lui de comprendre ce qui l'a amené dans cette situation, et d'en tirer les conséquences.

Après, le petit rappel de 68tjs sur la bonne manière d'aider les élèves, n'est pas forcément inutile.

Perso dans mon milieu professionnel, je n'ai aucune envie de voir arriver de jeunes diplômés qui ont des lacunes énormes dans ce qu'ils sont censés maîtriser, et qui ont eu leur diplôme par assistanat.