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.
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
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
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.
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.
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 ?
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[]
}
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.