Besoin d'aide SVP ! (projet RFID)

Portrait de TANG35

Bonjour,

J'ai créé un distributeur de croquettes à détection RFID comme ce produit commercialisé :
https://www.youtube.com/watch?v=yTy9OH-mlhM
La différence résulte dans le volume du distributeur.
dsc_0138.jpeg

La partie hardware (conception mécanique et électronique) j'ai géré :
Carte Arduino Uno, motorisation de lecteur CD, capteurs de fin de course, circuit L293D, module RFID (antenne "maison").
dsc_0179.jpeg

Mon gros soucis est le programme...
J'ai beau essayer et essayer, je ne pige pas.

Schéma de câblage :

fritzing_-_gamelle.png

Principe en résumé :
_ Etat initial (mise sous tension) : le moteur est à l'arrêt, la trappe est fermée ("trappe fermée" = 1), sinon la trappe se ferme jusqu'à "trappe fermée" = 1, et le moteur stoppe.
_ Lecture permanente (en boucle) du module RFID (attente d'un tag).
_ Un chat se présente devant l'antenne RFID.
_ Détection "chat autorisé" = 1.
_ Le trappe s'ouvre jusqu'au capteur "trappe ouverte" = 1.
_ Le moteur stoppe.
_ Détection "chat autorisé" = 0.
_ Délai = 3 secondes.
_ Le trappe se ferme.
_ Le moteur stoppe SI détection "chat autorisé" (retour étape "chat autorisé" = 1), OU SI détection "trappe fermée" = 1.
_ Retour à l'état initial.

J'aimerais ajouté un mode d'ouverture et fermeture manuel (switch auto/manu ; poussoir ouverture/fermeture).

Est-ce que quelqu'un pourrait m'aider ?
Un collègue de taf a déjà entamé un bout de programme mais pas terminé (et avec erreurs de compilation).

Merci.

Tanguy.

Portrait de TANG35

Ci-joint un dossier ZIP avec les librairies nécessaires, et le bout de programme.

Portrait de Anonyme

J'ai lu ton code, il est super compliqué pour pas grand chose !!

Il y a moyen de faire beaucoup plus simple, par contre je n'ai pas le lecteur de puce que tu possèdes, je devrais le recevoir dimanche soir. mais en attendant je te propose le début de code suivant sachant que tu devras raccorder les fin de courses entre les entrées déclarées et GND et non +5 V pour éviter de mettre des résistances de PULL UP !

Comme je n'ai pas encore le lecteur je l'ai replacé ( provisoirement ) par un bouton poussoir qui simule la présence d'un chat autorisé devant le distributeur.

Le programme est testé il fonctionne !

int MoteurEna = 6 ;
int MoteurFerme = 7;
int MoteurOuvre = 5 ;
int TrappeOuverte = 11;
int TrappeFermee = 12;
int PresenceChat = 13;
unsigned long Tempo , DelaisAutorise = 5; //Délais en secondes que tu peux modifier selon les essais

void setup() {
  Serial.begin(9600);
  pinMode(MoteurEna, OUTPUT);
  pinMode(MoteurFerme, OUTPUT);
  pinMode(MoteurOuvre, OUTPUT);
  pinMode(PresenceChat, INPUT_PULLUP);// Brancher le BP entre la masse (GND) et la pin 13
  pinMode(TrappeFermee, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 12
  pinMode(TrappeOuverte, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 11
  FermeTrappe();
}

void loop() {

  if (!digitalRead(PresenceChat)) {
    Tempo = millis() + DelaisAutorise * 1000;
    OuvreTrappe();
    while (Tempo > millis()) {
      if (!digitalRead(PresenceChat)) {
        Tempo = millis() + DelaisAutorise * 1000;
      }

    }
    FermeTrappe();
  }

}

void FermeTrappe() {
  Serial.println("Ferme");
  digitalWrite(MoteurEna, HIGH);
  while (digitalRead(TrappeFermee)) {
    digitalWrite(MoteurFerme, HIGH);
  }
  digitalWrite(MoteurFerme, LOW);
  digitalWrite(MoteurEna, LOW);
}

void OuvreTrappe() {
  digitalWrite(MoteurEna, HIGH);
  while (digitalRead(TrappeOuverte)) {
    digitalWrite(MoteurOuvre, HIGH);
  }
  digitalWrite(MoteurOuvre, LOW);
  digitalWrite(MoteurEna, LOW);
  Tempo = millis() + DelaisAutorise * 1000;
}

bool ChatAutorise() {
  // Attente de reception du lecteur
}

Portrait de Anonyme

Voilà j'ai enfin reçu le lecteur de puce RFID 125 KHz et j'ai pu testé mon code !

Cette fois le code est déverminé testé et fonctionnel !

int MoteurEna = 6 ;
int MoteurFerme = 7;
int MoteurOuvre = 5 ;
int TrappeOuverte = 11;
int TrappeFermee = 12;
int PresenceChat = 13;
bool Autorise;
int tagChat1[14] = {2, 54, 68, 48, 48, 57, 48, 51, 48, 49, 54, 68, 66, 3}; // "blue" tag for cat N°1
int tagChat2[14] = {2, 48, 50, 48, 48, 56, 50, 65, 67, 48, 56, 50, 52, 3}; // "red" tag for cat N°2
unsigned long Tempo , DelaisAutorise = 5; //Délais en secondes que tu peux modifier selon les essais
#include <SoftwareSerial.h>
SoftwareSerial rfid(3, 2);

void setup() {
  Serial.begin(115200);
  rfid.begin(9600);
  pinMode(MoteurEna, OUTPUT);
  pinMode(MoteurFerme, OUTPUT);
  pinMode(MoteurOuvre, OUTPUT);
  pinMode(PresenceChat, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 13
  pinMode(TrappeFermee, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 12
  pinMode(TrappeOuverte, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 11
  FermeTrappe();
}

void loop() {
  ChatAutorise();
  if (Autorise) {
    Autorise = false;
    Tempo = millis() + (DelaisAutorise * 1000);
    OuvreTrappe();
    while (Tempo > millis()) {
      ChatAutorise();
      if (Autorise) {
        Tempo = millis() + (DelaisAutorise * 1000);
      }
      Autorise = false;
    }
    FermeTrappe();
  }
}

void FermeTrappe() {
  Serial.println("Fermeture Trappe");
  digitalWrite(MoteurEna, HIGH);
  while (digitalRead(TrappeFermee)) {
    digitalWrite(MoteurFerme, HIGH);
  }
  Serial.println("Trappe Fermee");
  digitalWrite(MoteurFerme, LOW);
  digitalWrite(MoteurEna, LOW);
  Tempo = 0;
}

void OuvreTrappe() {
  Serial.println("Ouverture Trappe");
  digitalWrite(MoteurEna, HIGH);
  while (digitalRead(TrappeOuverte)) {
    digitalWrite(MoteurOuvre, HIGH);
  }
  Serial.println("Trappe Ouverte");
  digitalWrite(MoteurOuvre, LOW);
  digitalWrite(MoteurEna, LOW);
  Tempo = millis() + DelaisAutorise * 1000;
}

void ChatAutorise() {
  int TagLU[14] = {0, 0};
  if (rfid.available() > 0) {
    for (int n = 0 ; n < 14 ; n++) {
      TagLU[n] = rfid.read();
      Serial.print(TagLU[n]);
      Serial.print(",");
    }
    Serial.println();
    rfid.flush();
    Autorise = true;
    for (int N = 0; N < 14; N++) {
      if ((tagChat1[N] != TagLU[N]) && (tagChat2[N] != TagLU[N])) {
        Autorise = false;
      }
    }
    if (Autorise)
    Serial.println("Chat Autorise");
    else
    Serial.println("Chat Inconnu");
  }
}

Portrait de TANG35

Whouah génial !
Merci pour ta rapidité !

Je n'ai pas vu ton mlessage plus tôt, il était dans mes Spams (lol).
Je me suis aperçu de mon erreur de câblage ce week-end concernant les fins de course.
J'ai ajouté une résistance de "pull up" pour faire un essai pour un autre programme test plus simple.

Du coup ce soir je dessoude mes résistances, et place les fin de courses comme tu m'as dit : entre le GND et les entrées déclarées.

Par contre, je ne change rien pour le module RFID ?
Sinon je ne comprend pas le câblage de ton module par rapport au mien.
Tu peux me le dessiner vite fait ?

Portrait de TANG35

Je viens d'essayer ton 1er programme en mettant un poussoir en direct....top, ça fonctionne !

Par contre lorsque je mets le module, ça ne fonctionne pas.
La LED du module clignote bien lorsqu'on approche un tag, mais rien indiqué sur le moniteur série (chat autorisé, non autorisé, numéro du tag...).

Peut-être un pb de câblage à ce niveau ?

Portrait de TANG35

Voici une partie du nouveau Fritzing avec les fins de course au GND.
La broche Tx du module RFID va sur l'entrée 2.

Tu l'as branché ainsi ? (mise à part la borne 13)

Portrait de Anonyme

Tu as du branché TX et RX à l'envers, inverse ces connexions et cela devrait fonctionné. Pourquoi mettre des résistances ?? Qui t'as dit d'en mettre ?

Portrait de TANG35

Merci c'est top,
Je vais tester ça ce soir.

Portrait de TANG35

Les résistances c'était pour éviter les "rebonds".
La carte voyait bien un +5V lorsque le capteur était appuyé.
Mais lorsqu'il était ouvert, l'entrée était "en l'air", j'ai fait un branchement pour que la carte voit bien le GND une fois le capteur ouvert.
Bref, en tout cas avec ton code ça fonctionne sans :D.

Portrait de Anonyme

Mais tu n'a rien compris !

la commande " pinMode( X , INPUT_PULLUP); " indique au processeur de mettre une résistance interne entre le + et l'entrée déclarée  X ! De ce fait lorsque le FdC est ouvert l'entrée correspondante X est HIGH (état haut ou +5V ou encore Vcc ) et lorsque le FdC est appuyé l'entrée correspondante X est à l'état LOW (état Bas, ou 0 V ou encore GND).

Donc câble les FdC comme je te l'ai demandé et supprime les résistances qui n'évitent aucun rebond !!!!

Les éventuels rebonds ici non aucune importance, et je ne vois pas comment une résistance pourrait éviter des rebonds ????
Pour les éviter quand c'est nécessaire on utilise le soft en cas de besoin ce qui encore une fois n'est pas utile dans cette application !

Par exemple ;

If (digitalRead(X) ==  LOW){
  Action();
  delay(100);
}

ici tous les rebonds qui on lieu pendant 100 ms sont transparents puisque le processeur ne fait plus rien durant ce laps de temps qui peu être réduit au besoin !!!!

Portrait de TANG35

Hihi si si j'ai bien compris.

Ce que j'explique plus haut, c'est ce que j'ai fait avant de voir tes explications et ton programme :D

Portrait de TANG35

C'est cool de m'aider en tout cas ;-)
Je teste tout ca ce soir, je te tiens au courant.

Portrait de TANG35

Bon ben c'est super chouette ça fonctionne nickel !!! :D
Encore un grand merci pour ton aide, tu m'a enlevé une belle épine du pied.

J'ai vu que la vitesse moteur tu as mis HIGH ou LOW (MoteurEna).
Moi je pouvais faire varier de 0 à 255.
Je n'arrive pas à remettre cette variation de vitesse.
Y aurait moyen que tu m'expliques ? (encore...)

Portrait de Anonyme

Pas de soucis c'est super facile mais pas avant demain j'ai des invités là !

Portrait de Anonyme

Voici le code avec possibilité de faire varier la vitesse de 0 à 100%

int MoteurEna = 6 ;
int MoteurFerme = 7;
int MoteurOuvre = 5 ;
int TrappeOuverte = 11;
int TrappeFermee = 12;
int PresenceChat = 13;
bool Autorise;
int VitesseOuverture  = 128 ;// ici 50% de la vitesse que tu peux faire varier ce 0 à 255, 255 étant 100%
int VitesseFermeture  = 128 ;// ici 50% de la vitesse que tu peux faire varier ce 0 à 255, 255 étant 100%

int tagChat1[14] = {2, 54, 68, 48, 48, 57, 48, 51, 48, 49, 54, 68, 66, 3}; // "blue" tag for cat N°1
int tagChat2[14] = {2, 50, 68, 48, 48, 69, 57, 70, 68, 68, 57, 69, 48, 3}; // "red" tag for cat N°2
unsigned long Tempo , DelaisAutorise = 5; //Délais en secondes que tu peux modifier selon les essais
#include <SoftwareSerial.h>
SoftwareSerial rfid(3, 2);

void setup() {
  Serial.begin(115200);
  rfid.begin(9600);
  pinMode(MoteurEna, OUTPUT);
  pinMode(MoteurFerme, OUTPUT);
  pinMode(MoteurOuvre, OUTPUT);
  pinMode(PresenceChat, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 13
  pinMode(TrappeFermee, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 12
  pinMode(TrappeOuverte, INPUT_PULLUP);// Brancher le Fin de course entre la masse (GND) et la pin 11
  FermeTrappe();
}

void loop() {
  ChatAutorise();
  if (Autorise) {
    Autorise = false;
    Tempo = millis() + (DelaisAutorise * 1000);
    OuvreTrappe();
    while (Tempo > millis()) {
      ChatAutorise();
      if (Autorise) {
        Tempo = millis() + (DelaisAutorise * 1000);
      }
      Autorise = false;
    }
    FermeTrappe();
  }
}

void FermeTrappe() {
  Serial.println("Fermeture Trappe");
  analogWrite(MoteurEna, VitesseFermeture);
  while (digitalRead(TrappeFermee)) {
    digitalWrite(MoteurFerme, HIGH);
  }
  Serial.println("Trappe Fermee");
  digitalWrite(MoteurFerme, LOW);
  digitalWrite(MoteurEna, LOW);
  Tempo = 0;
}

void OuvreTrappe() {
  Serial.println("Ouverture Trappe");
  analogWrite(MoteurEna, VitesseOuverture);
  while (digitalRead(TrappeOuverte)) {
    digitalWrite(MoteurOuvre, HIGH);
  }
  Serial.println("Trappe Ouverte");
  digitalWrite(MoteurOuvre, LOW);
  digitalWrite(MoteurEna, LOW);
  Tempo = millis() + DelaisAutorise * 1000;
}

void ChatAutorise() {
  int TagLU[14] = {0, 0};
  if (rfid.available() > 0) {
    for (int n = 0 ; n < 14 ; n++) {
      TagLU[n] = rfid.read();
      Serial.print(TagLU[n]);
      Serial.print(",");
    }
    Serial.println();
    rfid.flush();
    Autorise = true;
    for (int N = 0; N < 14; N++) {
      if ((tagChat1[N] != TagLU[N]) && (tagChat2[N] != TagLU[N])) {
        Autorise = false;
      }
    }
    if (Autorise)
    Serial.println("Chat Autorise");
    else
    Serial.println("Chat Inconnu");
  }
}

C'était tellement facile que j'ai pris deux minutes pour le faire. Je t'ai même mis une vitesse pour l'ouverture et une seconde pour la fermeture (elles peuvent être égales)

Portrait de TANG35

Mais bien sûr !

"Analog" au lieu de "Digital" !

Quel flan.... XD

Portrait de Anonyme

Faut pas te dénigrer