Programme fonctionne à moitié sur tinkercad

bonjours, étant novice et manquant de finance je me suis tourné vers tinkercad pour voir si mes montages tienne la route sans devoir investir trop vite.
Ce montage est une gestion des aiguillages par une série de poussoir. quand je lance le programme pour un aiguillage pas de problème ça fonctionne bien mais quand je continue le scribe pour les autres aiguillages, le premier aiguillage fonctionne toujours mais les autres rien ne se passe, comme si il ne les connaissait pas. serait il possible que ce soit un défaut de ce simulateur? car j'ai beau tout vérifier les commande son identique pour chaque moteur.

Bonsoir

Serait il possible que ce soit un défaut de ce simulateur?

Tout est possible ..... et avec les infos que tu donnes difficile d'être plus précis......

quand je lance le programme pour un aiguillage pas de problème ça fonctionne bien mais quand je continue le scribe pour les autres aiguillages, le premier aiguillage fonctionne toujours mais les autres rien ne se passe,

On peut imaginer tout un tas de choses avec cette description..... des bonnes et des moins bonnes....

Bonjour thierryddd

Il faut rendre ton projet publique, dans modifier la visibilité/confidentialité = public et partages le lien.

A+
Cordialement
jpbbricole

ou postez le code ici avec une description du circuit (cf "Les bonnes pratiques du Forum Francophone” pour poster correctement avec les balises de code etc)

désolé au départ je voulais juste savoir si c'etait un problème connu.
voici le code

// C++ code
//
#include <Servo.h>
/* Clavier est un programme qui affiche la touche activée d'un clavier matriciel dans le moniteur série */


#include <Keypad.h>                      // appel de la bibliothèque

#define L1 2                                    // affectation des broches
#define L2 3
#define L3 4
#define C1 5
#define C2 6
#define C3 7

const byte lignes = 3;                    // 3 lignes
const byte colonnes = 3;               // 3 colonnes

char code[lignes][colonnes] = {   // code des touches
  {'1','V6','V5'},
  {'T','V4','V3'},
  {'S','V2','V1'},
};

byte broches_lignes[lignes] = {L1, L2, L3};                   // connexion des lignes
byte broches_colonnes[colonnes] = {C1, C2, C3};              // connexion des colonnes

char touche;
Keypad clavier = Keypad( makeKeymap(code), broches_lignes, broches_colonnes, lignes, colonnes);              // création de l'objet clavier


Servo servo_8;

Servo servo_9;

Servo servo_10;

Servo servo_11;

Servo servo_12;

Servo servo_13;

void setup()
{
  servo_8.attach(8, 500, 2500);
  servo_9.attach(9, 500, 2500);
  servo_10.attach(10, 500, 2500);
  servo_11.attach(11, 500, 2500);
  servo_12.attach(12, 500, 2500);
  servo_13.attach(13, 500, 2500);
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
  
  servo_8.write(0);
  servo_9.write(0);
  servo_10.write(0);
  servo_11.write(0);
  servo_12.write(0);
  servo_13.write(0);
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
}

void loop()
{
  
  touche = clavier.getKey();          // acquisition de la touche
  
  if(touche != NO_KEY) // si une touche a été frappée -- gestion de la touche appuyée 
  if(touche == 'T')
  {digitalWrite(1, LOW);
    digitalWrite(0, HIGH);
    servo_8.write(45);}
    
  if(touche == 'S')
  {digitalWrite(0, LOW);
    digitalWrite(1, HIGH);
    servo_8.write(0);} 
  
  if(touche == 'V1')
  {digitalWrite(A0, HIGH);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    servo_9.write(00);}
  
  if(touche == 'V2')
  {digitalWrite(A0, LOW);
    digitalWrite(A1, HIGH);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    servo_9.write(45);
    servo_10.write(00);}
    
  if(touche == 'V3')
  {digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, HIGH);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    servo_9.write(45);
    servo_10.write(45);
    servo_11.write(00);}
  
  if(touche == 'V4')
  {digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, HIGH);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    servo_9.write(45);
    servo_10.write(45);
    servo_11.write(45);
    servo_12.write(00);}
  
  if(touche == 'V5')
  {digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, HIGH);
    digitalWrite(A5, LOW);
    servo_9.write(45);
    servo_10.write(45);
    servo_11.write(45);
    servo_12.write(45);
    servo_13.write(00);}
  
  if(touche == 'V6')
  {digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, HIGH);
    servo_9.write(45);
    servo_10.write(45);
    servo_11.write(45);
    servo_12.write(45);
    servo_13.write(45);}
   // Delay a little bit to improve simulation performance

}

je voulais poster une image du cablage mais je ne trouve pas comment faire.
par contre voici le lien pour voir la conception sur tinkercad

comme expliqué avant, c'est une gare de triage comprenant 6 voies V1 à V6 une voie tiroir T et une voie de sortie S.
chaque action sur les poussoirs font déplacer des servos en fonction du trajet du train.

mon problème les poussoirs S et T fonctionne correctement, mais les poussoirs V ne fonctionnent pas du tout.

merci de vous pencher sur mon problème .

Il ne manquerait pas une accolade ici pour exécuter les lignes suivantes si et seulement si une touche est appuyée?

Autrement je ne connais pas trop la library keypad mais si j'en crois cette déclaration

char code[lignes][colonnes] = {

le tableau devrait contenir des car pas des chaines donc quand tu mets 'V6','V5' en fait c'est interprété comme étant 'V','V' donc ça ne peut pas marcher. Il faudrait par exemple remplacer
'V6','V5' par '6', '5'

merci, ca fonctionne parfaitement.

pour l'accolade, visiblement ce n'est pas nécessaire, cette partie vient d'un programme trouvé sur le net que j'ai un peu transformé.
l'utilisation des V était bien une erreur, c'était juste pour me facilité la vie .

encore merci

Dans ce cas le

n'est pas nécessaire non plus, car il ne fait rien.

Bonjour thierryddd

Ce peut être "piégeux", dans le cas d'un if sans accolade, seule la ligne de code suivante cet if est concernée par la condition. S'il vient l'idée d'ajouter une action à cette condition, sans l'ajout des accolades, cette action ne sera jamais concernée.

Cordialement
jpbbricole

oui en fait ici le if(touche != NO_KEY) ne sert absolument à rien car le reste de la boucle fait tous les tests, que l'on ait reçu quelque chose ou pas.

le plus simple aurait été d'utiliser un switch et de faire des fonctions pour séparer les cas. Un truc du genre

#include <Servo.h>
#include <Keypad.h>
byte brochesLignes[]   = {2, 3, 4}; // les broches des lignes
byte brochesColonnes[] = {5, 6, 7}; // les broches de colonnes
const byte lignes = sizeof brochesLignes;
const byte colonnes = sizeof brochesColonnes;;

char code[lignes][colonnes] = {
  {'1', '6', '5'},
  {'T', '4', '3'},
  {'S', '2', '1'},
};

Keypad clavier = Keypad( makeKeymap(code), brochesLignes, brochesColonnes, lignes, colonnes);              // création de l'objet clavier
Servo servos[6];
const byte nbServos = sizeof servos / sizeof * servos;

void toucheT() {
  digitalWrite(1, LOW);
  digitalWrite(0, HIGH);
  servos[0].write(45);
}

void toucheS() {
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  servos[0].write(0);
}

void v1() {
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
  servos[1].write(00);
}

void v2() {
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
  servos[1].write(45);
  servos[2].write(00);
}

void v3() {
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, HIGH);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
  servos[1].write(45);
  servos[2].write(45);
  servos[3].write(00);
}

void v4() {
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
  servos[1].write(45);
  servos[2].write(45);
  servos[3].write(45);
  servos[4].write(00);
}

void v5() {
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, HIGH);
  digitalWrite(A5, LOW);
  servos[1].write(45);
  servos[2].write(45);
  servos[3].write(45);
  servos[4].write(45);
  servos[5].write(00);
}

void v6() {
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
  digitalWrite(A4, LOW);
  digitalWrite(A5, HIGH);
  servos[1].write(45);
  servos[2].write(45);
  servos[3].write(45);
  servos[4].write(45);
  servos[5].write(45);
}


void setup()
{
  for (byte brocheServo = 0; brocheServo < nbServos; brocheServo++) servos[brocheServo].attach(8 + brocheServo, 500, 2500);

  pinMode(0, OUTPUT);   digitalWrite(0, LOW);
  pinMode(1, OUTPUT);   digitalWrite(1, HIGH);
  pinMode(A0, OUTPUT);  digitalWrite(A0, HIGH);
  pinMode(A1, OUTPUT);  digitalWrite(A1, LOW);
  pinMode(A2, OUTPUT);  digitalWrite(A2, LOW);
  pinMode(A3, OUTPUT);  digitalWrite(A3, LOW);
  pinMode(A4, OUTPUT);  digitalWrite(A4, LOW);
  pinMode(A5, OUTPUT);  digitalWrite(A5, LOW);
  for (auto& s : servos) s.write(0);
}

void loop() {
  switch (clavier.getKey()) {
    case 'T': toucheT(); break;
    case 'S': toucheS(); break;
    case '1': v1(); break;
    case '2': v2(); break;
    case '3': v3(); break;
    case '4': v4(); break;
    case '5': v5(); break;
    case '6': v6(); break;
  }
}

PS: comme les servo sont dans un tableau maintenant on pourrait éviter de faire

  servos[1].write(45);
  servos[2].write(45);
  servos[3].write(45);
  servos[4].write(45);
  servos[5].write(00);

et faire une boucle sur les indices. Attention aussi à l'écriture 00 qui est de la base 8. là ce n'est pas un souci car 00 c'est 0 en base 8 comme en base 10, mais 08 par exemple serait un bug...

On évite aussi d'utiliser les broches 0 et 1 sur un UNO qui sont utilisées pour le port Série mais là vous êtes un peu coincé par le besoin en nombre de broches

Je ne suis pas du tout d'accord avec vous :slight_smile:

le if ne sert pas à rien et il manque des accolades,mais le if est peut utile :rofl:
le If, avec les accolades qui vont avec, permet de ne pas exécuter la tripoté de if suivant, qui sont inutile puisque dans le cas ou touche est égale à NO_KEY
Je chipote je suis complétement d'accord :slight_smile:

Personnellement je préfère la forme avec le "switch" que je trouve plus lise.

@thierryddd c'est vrai que V1, V2, ... peut être plus sympa, dans ce cas utilise un "define" pour définir V1 au caractère 1( #define V1 '1')

ce qu'on dit c'est TEL QU'IL EST tel qu'il est il ne sert à rien.

oui il faudrait des accolades et tant qu'on y est aussi des else entre les if parce que si on a trouvé la bonne touche ça ne sert à rien de tester les autres

comme il y a de nombreux cas, un switch() semble de toutes façons plus lisible...

Dans ce cas tel qu'il est il sert à ne pas faire le if sur la touche T :face_with_peeking_eye:
Ce qui n'a pas de sens, donc j'émet l'hypothèse, qu'il manque des accolades :joy:

J'ai oublié de dire que je chipotais ? :frowning:
Comme tu mets des caractères en gras pour parler fort, je pensais que les émoticones était assez significatifs, que je plaisantais et que je ne prenais pas ca au sérieux et n'étais pas un réel reproche.

Sinon je suis complétement d'accord avec toi sur la deuxième partis de ton message :laughing:

c'est vrai s'il n'y a pas d'appui donc il sert un peu effectivement

désolé pour le gras, j'ai vu ensuite que vous chipotiez pour le plaisir

Pas de soucis, je voulais juste être sûre qu'il n'y ait pas de mauvaise interprétation sur une boutade qui elle ne sert à rien :face_with_hand_over_mouth:.

non - j'ai passé l'age de m'énerver :slight_smile:

merci à tous, ne connaissant pas grand chose dans le langage C, (quand j'était ado en 86 je trifouillait en basic avec beaucoup de if dans les programmes que je voyait) je regarde à droite à gauche sur le net et adapte à mon utilisation. donc il y a forcement des erreurs . r la ligne
J-M-L merci pour avoir simplifier le programme je n'en demandais pas tant, ça me fait plaisir.
que veut dire sizoef ?

ça demande au compilateur de calculer le nombre d'octets utilisés par un type ou une variable

ok merci .

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.