Création d'un système d'aiguillage autonome pour une piste de slot avec trajectoire idéale

c'est avec une neuve

Avez-vous changé le type de carte et le port auquel elle se connecte dans l'IDE ? et enfin pour nano vous avez l'option nouveau ou ancien bootloader.
Et quant à la fumée... Attention, le schéma que vous avez placé peut être trompeur, il devrait être ainsi :
error

Si çà a "fumé" au niveau USB vérifier le câble/port connecteurs USB

sous windows USBDEVview un bon utilitaire USB

c'est bien ainsi que je l'ai brancher
pour être précis et pour répondre a @Artouste je n'avais pas encore branché la carte au port USB
de plus si le port USB avais souffert je ne pourrais pas utiliser non plus la carte Mēga hors j'arrive a telecharger sur la mega
j'ai bien changer la carte dans l'IDE et j'ai essayé les deux version

Pour info, j'ai eu un montage avec une alim 12V, et je ne sais pas comment ni pourquoi (le montage me semblait bon), j'ai fait cramer le régulateur. Mais la carte fonctionne avec l'USB.

bon ce matin le problème de téléversement est résolu.
après un redémarrage du PC tout est rentré dans l'ordre
pour le moment je passe par le câble USB pour alimenter la carte .
reste a savoir si je peut alimenter la carte en 5V depuis la source PC, ou descendre les 12 V de la source a 9V comme je l'ai lu sur un autre post.
concernant le codage , il ne semble pas conforme.
quand je passe en C1 cela devrait fermer l'aiguille , et ne ce fermer que au passage de C2 ou après 2 seconde de temps écoulé
et en réalité seul la lumière du mofset s'éteint, au passage de C1 et l'aiguille se ferme au passage de C2.
la il faut que j'aille bosser donc je reprendrais ca ce soir

Vu que l'on a le 5V sur l'alim, autant s'en servir pour les arduinos et les capteurs.

Pas bien clair. La led du Moasfet est-elle conforme à la position de l'aiguille (allumée = aiguille fermée)?

Salut les gars je viens de recevoir un TB6612FNG et je pense le torturer tout l'après-midi pour voir ce qu'il fait
@alfagtv916, je ne sais pas quel code vous utilisez, mais utilisez le suivant, (contempler quelques suggestions de @vileroi, et qui en principe je pense répond à toutes les possibilités de votre post # 224 au moins pour l'aiguille A1.

#define c100 A2
#define c101 A3
#define c1 A0
#define c2 A1
#define c3 A5
#define c5 A4

int zoneA; // zone anti-collision de l'aiguille A1
int zoneB; //zone de dépassement de l'aiguille A1
int zoneC; //zone de dépassement de l'aiguille A2
int zoneD; // zone anti-collision de l'aiguille A2

bool Flag1 = false;
bool CapteurC1 = false;
bool CapteurC2 = false;
bool CapteurC3 = false;
bool CapteurC5 = false;
bool CapteurC100 = false;
bool CapteurC101 = false;


void setup() {
  pinMode (c100 , INPUT);
  pinMode (c101 , INPUT);
  pinMode (c1 , INPUT);
  pinMode (c2 , INPUT);
  pinMode (c3 , INPUT);
  pinMode (c5 , INPUT);
  pinMode (2 , OUTPUT);
  digitalWrite (2, LOW);
}

void loop() {
  // la zone anti-collision de A1 est remplie

  
  if ((digitalRead (c1) == HIGH) && (CapteurC1 == false)) {
    //anti-rebond por hardware o software 
    zoneA ++;
    CapteurC1 == true;
  }
  if ((digitalRead(c1) == LOW)) {
    CapteurC1 == false;
  }

  
  // vide la zone anti-collision de A1
  if ((digitalRead (c2) == HIGH) && (CapteurC2 == false)) {
    //anti-rebond por hardware o software 
    //digitalWrite (A1.1, polarité);La polarité de l'aiguille A1.1 est modifiée
    zoneA --;
    zoneC ++;    
    CapteurC2 == true;
  }
  if ((digitalRead(c2) == LOW)) {
    CapteurC2 == false;
  }
  if (zoneA > 0) {
    Flag1 = true; // anti-collision l'aiguille A1
  }
  else {
    Flag1 = false; // dépassement l'aiguille A1
  }
  //C100 détecte une première voiture
  //C100 détecte une deuxième voiture avant que C101 détecte la première voiture
  if ((digitalRead (c100) == HIGH) && (CapteurC100 == false)) {
    zoneB ++;
  }
  if ((digitalRead(c100) == LOW)) {
    //anti-rebond por hardware o software 
    CapteurC100 == false;
  }

  switch (Flag1) {
    case false:  // anti-collision de l'aiguille A1
      if ((digitalRead (c101) == HIGH) && (CapteurC100 == false)) {
        //anti-rebond por hardware o software 
        digitalWrite (2, HIGH);
        zoneB--;
      }
      if ((digitalRead(c101) == LOW)) {
        CapteurC101 == false;
      }
      break;

    case true:  //dépassement de l'aiguille A1
      if ((digitalRead (c101) == HIGH) && (CapteurC100 == false)) {
        //anti-rebond por hardware o software 
        zoneB--;
      }
      if ((digitalRead(c101) == LOW)) {
        CapteurC101 == false;
      }
      //C3 détecte la première voiture et ferme l'aiguillage (électrifié) Permet de dépassement.
      if (digitalRead (c3) == HIGH) {
        //anti-rebond por hardware o software 
        digitalWrite (2, HIGH);
        //digitalWrite (A1.1, polarrité);La polarité de l'aiguille A1.1 est modifiée
      }
      break;
  }

  //C5 détecte la deuxième voiture et ouvre l'aiguille (repos , pas d'électrification)
  if (digitalRead (c5) == HIGH) {
    //anti-rebond por hardware o software 
    digitalWrite (2, LOW);
  }
  //ne reste plus de voitures et ouvre l'aiguille (repos , pas d'électrification)
  if (zoneB == 0) {
    digitalWrite (2, LOW);
  }
}

Salut à tous

Pd : il n'envisage pas de situations possibles comme celles qui sont arrivées à Hamilton.

non il ne faut pas.... c'est tous ce qu'il faut éviter.

le post 224 c'est le dépassement et j'ai essayé l'anticollision

je fais un essaie video pour vous montrer

bon et bien l'un comme l'autre ne fonctionne pas

je voudrais faire un test tout simple....
pouvez vous me corriger svp

#define c1 A0
#define c2 A1
#define c100 A2
#define c101 A3
#define c5 A4
#define c3 A5

void setup() {
  pinMode (c1 , INPUT);
  pinMode (c2 , INPUT);
  pinMode (c100 , INPUT);
  pinMode (c101 , INPUT);
  pinMode (c3 , INPUT);
  pinMode (c5 , INPUT);
  pinMode (2 , OUTPUT);
}
// ****** anti-collision aiguille A1 *********

if (digitalRead(Capteur 1) low){ // capteur 1 detecte une voiture
digitalWrite (aiguille 1,HIGHT); //et ferme la trajectoire ideale
delay(2000); //temps de fermeture 2 secondes
||if(digitaleRead(capteur2) low // capteur 2 detecte une voiture
digitalWrite (aiguille 1,low)
}

pouvez vous me dire ce que vous en pensez ?

Ce code ne se compile pas ou ne fonctionne pas pour vous et également lorsque la voiture passe, il donne une impulsion élevée. D'après les définitions données avant l'setup, ce code devrait ressembler à ceci.

#define c1 A0
#define c2 A1
#define c100 A2
#define c101 A3
#define c5 A4
#define c3 A5

void setup() {
  pinMode (c1 , INPUT);
  pinMode (c2 , INPUT);
  pinMode (c100 , INPUT);
  pinMode (c101 , INPUT);
  pinMode (c3 , INPUT);
  pinMode (c5 , INPUT);
  pinMode (2 , OUTPUT);
}
// ****** anti-collision aiguille A1 *********

if (digitalRead(c1 == HIGH){ // capteur 1 detecte une voiture
digitalWrite (2,HIGH); //et ferme la trajectoire ideale
delay(2000); //temps de fermeture 2 secondes
if(digitaleRead(c2) LOW // capteur 2 detecte une voiture
digitalWrite (2,LOW)
}

Faites attention à l'orthographe et à la majuscule pour HIGH et LOW.

bonsoir @gonpezzi
j'ai testé votre proposition et j'ai un message d'erreur

aiguille_A1:19:1: error: expected unqualified-id before 'if'
 if (digitalRead(c1 == HIGH){ // capteur 1 detecte une voiture
 ^~
exit status 1
expected unqualified-id before 'if'

ce soir je manque de temps car demain j'embauche tres tot
je vais me pencher sur "arduino pour les nuls" si je suis pas trop cassé a mon retour.

J'ai écrit ça ?. ! Quelle honte. Oubliez ce petit code et essayez ce que je vous dis dans le post #330 Les salutations.

bonjour @gonpezzi
il ne marche pas non plus
je l'avais déjà testé.
aucune réaction sur l'anticollision, C1 et C2
mauvaise réaction sur le dépassement C101 ferme l'aiguille et C5 l'ouvre

C1 devrait fermer et C2 ouvrir
2xC100 avant C101 , C3 devrait fermer l'aiguille et C5 l'ouvrir

bonne journée

Je suis de nouveau peu joignable (en principe seulement le soir et quand je m'arrête dans un endroit ou il y a du réseau). Voici le bilan que je fais:

Mesure du temps de commutation des aiguilles mobiles:: Le temps de fermeture d'une aiguille est une mesure à faire ainsi que le temps d'ouverture qui risque de poser plus de problèmes car le ressort de rappel est moins puissant que électroaimant. Je reste persuadé qu'il faut mesurer le temps entre l'ordre de changement de position et la fin des rebonds. Si une voiture passe et est dans la période des rebonds, les coupures d'alimentations peuvent être prises pour des bursts de commandes.

C'est important de faire cette mesure car si le temps est trop long, la suite ne fonctionnera pas.

Essai des aiguilles avec les capteurs:
Tous les programmes comporteront trois parties:

  • déclarations des variables et des macros
  • le sertup
  • le loop

Pour éviter de tout remettre à chaque fois et tant que l'on fait des essais sur un seul aiguillage, ce serait bien que l'on se fixe les déclaration et le setup. Si par la suite, on devait rajouter un capteur, il n'y aurait pas d'ambiguité, ce serait la même écriture à rajouter en changeant juste un 2 en 3 (capteur2 devient capteur3...). Du coup on ne se préoccupe plus en général de loop que l'on peut remettre dans les posts à chaque fois.

Comme cela ne fonctionne pas et que je n'ai pas bien compris ce qui ne fonctionne pas, il faut revenir à une commande plus basique. Ce n'est pas la peine de tester l’anti-collision si l'aiguille ne fait déjà pas son travail de base. Je ne vois pas l'intérêt pour l'instant de compter combien de voitures sont dans une zone si avant le programme plus simple ne fonctionne pas.

Quand je reprends le comptage des voitures (pour moi ce sera dans un avenir lointain), la déclaration des variables est:

int zoneA; // zone anti-collision de l'aiguille A1
int zoneB; //zone de dépassement de l'aiguille A1
int zoneC; //zone de dépassement de l'aiguille A2
int zoneD; // zone anti-collision de l'aiguille A2
bool Flag1 = false;

De toutes façon on n'aura jamais plus de 8 voitures, un byte au lieu d'un int suffit. d'autre part il n'y a pas vraiment de rapport entre le nom de la variable et l'utilisation (commentaire associé ici. Je n'ai pas rajouté Flag1 par la suite, n'ayant pas compris à qui il sert et je ne peux donc pas lui donner un nom explicite.
Les premières lignes deviendraient:

byte comptageZoneAntiCollisionAiguille1
byte comptageZoneDéplacementAiguille1

Je propose pour l'instant d'utiliser déclaration+set up suivant:

// Les capteurs permettant de voir la position des voitures
#define brocheCapteur1 A0 // Ici commentaire possible sur la position du capteur...
#define capteur1 digitalRead(brocheCapteur1) 
#define brocheCapteur2 A1
#define capteur2 digitalRead(brocheCapteur2) 
#define brocheCapteur3 A5
#define capteur3 digitalRead(brocheCapteur3) 
#define brocheCapteur5 A4
#define capteur5 digitalRead(brocheCapteur5) 
#define brocheCapteur100 A2 //
#define capteur100 digitalRead(brocheCapteur100) 
#define brocheCapteur101 A3 // Juste avant l'aiguille 1
#define capteur101 digitalRead(brocheCapteur101) 

// Pour tous les capteurs
#define VOITURE LOW
#define PAS_DE_VOITURE HIGH

// Pour toutes les aiguilles
#define OUVERTURE LOW // trajectoire ideale ouverte
#define FERMETURE HIGH // trajectoire ideale fermé

// Les aiguilles
#define brocheAiguille1 2
#define ouvertureAiguille1 digitalWrite(brocheAiguille1, OUVERTURE)
#define fermetureAiguille1 digitalWrite(brocheAiguille1, FERMETURE)

// Les temporisations
#define temps2s 2000

// Temporisation pour l’anti-collision de l'aiguille 1
bool antiCollisionAiguille1 = false; // true si la temporisation est en cours
unsigned long tempsAntiCollisionAiguille1;

// Comptage des voitures
byte comptageZoneAntiCollisionAiguille1 = 0;
byte comptageZoneDéplacementAiguille1 = 0;

void setup() {
  pinMode (brocheCapteur1 , INPUT);
  pinMode (brocheCapteur2 , INPUT);
  pinMode (brocheCapteur100 , INPUT);
  pinMode (brocheCapteur101 , INPUT);
  pinMode (brocheCapteur3 , INPUT);
  pinMode (brocheCapteur5 , INPUT);
  pinMode (brocheAiguille1 , OUTPUT);
}

Bien entendu, si par la suite on rajoute un capteur ou une aiguille, ce n'est pas indispensable de tout remettre pour un changement d'indice. Une solution pour ne pas répéter ce code à chaque fois et le retrouver facilement est de le mettre dans le post #1 et d'éditer ce post à chaque modification. Ainsi chaque loop serait du style

// Déclarations, voir post #1  

void loop()
{
...
}

Pour ce qui est de la fonction loop, il faut se fixer un objectif, exprimer en français les conditions que l'on veut réunir et écrire le code.

Dans un premier temps, je suggère de tester uniquement le fonctionnement de l’aiguille 1, genre
le capteur 1 ferme l'aiguille 1
le capteur 2 ouvre l'aiguille 1

C'est une raison suffisante pour inclure l'amortissement des rebonds.

C'est une simple manip à mettre en place ( d'autant que tu a fourni le prog) qui aurait déjà du etre faite depuis longtemps ,mais qui semble rebuter alfagtv916 qui la renvoie aux calendes grecques . :smiley:
C'est pourtant une donnée primordiale qui conditionne énormément de choses

Chers @Artouste et @vileroi, ces rebonds ne font pas partie du code et vous ne pouvez pas les éliminer, ce sont des mécaniques matérielles. Je ne sais pas si je m'explique, je vais donner un exemple
J'ai un arduino connecté au port usb.
Comment éliminer par code les rebonds qui se produisent lors du branchement de la prise d'alimentation 5 mm ?
Je pense que la seule façon de les éliminer serait d'électrifier les aiguilles mobiles comme nous le faisons avec les fixes.
Je termine les tests du TB6612 que je publierai sous peu.
Salutations.

Bonsoir @gonpezzi

Je suis à peu prés certain qu'autant @vileroi que moi-même connaissons parfaitement la nature des "rebonds électriques" :boom:

Le problème là n'est tant de savoir/connaitre si il y en a et si oui combien/durée , mais de connaitre le temps mini de transfert des aiguilles entre commande et amortissement .
cette notion est très importante (et simple à établir) et conditionne beaucoup de points du projet.

Là IRL nous n'avons strictement aucune idée des temps réels de transfert , est ce que c'est : 10µs 100µs 1 ms 10 ms 20ms
500 ms ... 1s 1 mn 1 heure ? :grinning:

Jusque là , la seule réponse apportée par @alfagtv916 est en gros : "çà va vite" et çà c'est une réponse dont un ingé sérieux ne peut pas se satisfaire.

Bonjour,

Peut être une nouvelle unité de mesure après le "viron" :slight_smile: