Riconoscimento Locomotive con RFID

Il sistema digitale (DCC) applicato al modellismo ferroviario.

Moderatore: roy67

Rispondi
Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Riconoscimento Locomotive con RFID

Messaggio da ho_master » gio gen 12, 2017 1:09 pm

Sul Plastico di Fossacesia abbiamo bisogno di riconoscere quale convoglio stia entrando in stazione, anche se condotto in manuale per cui ho testato questa soluzione basata su Arduino con ottimi risultati.

( tratto da https://github.com/rocrail/Arduino )

Il circuito:

Immagine:
Immagine
57,53 KB

lo sketch

Codice: Seleziona tutto

/" Typical pin layout used:
 " ---------------------------------------
 " "             MFRC522      Arduino UNO
 "             Reader/PCD
 " Signal      Pin          Pin
 " ----------------------------------------
 " RST/Reset   RST          9
 " SPI SS      SDA(SS)      10
 " SPI MOSI    MOSI         11
 " SPI MISO    MISO         12
 " SPI SCK     SCK          13
 "/

// rev1.00 07.02.2016
// configure Rocrail with INTER-10 command station, settings see Wiki 
// http://forum.rocrail.net/viewtopic.php?f=47&t=11300&start=15#p111849

// For any reason it does only work with Arduino UNO.
// With my genue Arduino Micro nothing is send to Rocrail, but putput to terminal works fine.

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN   9
#define SS_PIN    10
#define FBAdr     1     //feedback adress in Rocrail
boolean debug = false;  //false: prepare output for RR, true:huaman readable outputp for terminal window

//"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
// no more user settings after this line 

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

char SerialReceive;
void setup() {
  Serial.begin(19200);
    Serial.flush();
  SPI.begin();
  mfrc522.PCD_Init();   // Init MFRC522
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
}

String oldRFID = "";
String RFID = "";
int sendEndCount = 3;
int Intervall = 0;

void loop() {
  
   if (Serial.available() >= 1) {
    SerialReceive = Serial.read();
    if (debug) Serial.println(SerialReceive);
    
    if (SerialReceive == 0x25) {      //80msec Interval
      Serial.flush();
      mfrc522.PCD_Init();   // Init MFRC522
      mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
      Intervall = 80;
    }
    if (SerialReceive == 0x20) {      //2sec interval, onyl for compatibillity, I guess Rocrail does not support this
      Serial.flush();
      mfrc522.PCD_Init();   // Init MFRC522
      mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
      Intervall = 2000;
    }
  }

  sendEndCount++;

  if (sendEndCount == 3) {  // tag was removed from reader
    if (debug) {
      Serial.print ("0x80 ");
      Serial.println ("FBAdr ");
               }
    else {
      Serial.write(0x80);
      Serial.write(FBAdr);
         }
    oldRFID = "";
  }


  if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  if (mfrc522.PICC_ReadCardSerial()) {
    RFID = mkString(mfrc522.uid.uidByte, mfrc522.uid.size);
    if (RFID == oldRFID) {
      if (debug) {
      //  Serial.print ("0x70 ");
      //  Serial.println ("FBAdr ");
      }
      else {        // due to bug in RR library this must not be send, otherwise RR get out of sync
        //          Serial.write(0x70);
        //          Serial.write(FBAdr);
      }

    }

    if (RFID != oldRFID)
    // some of my tag has only 4Byte UID, 
      if (mfrc522.uid.size = 4) {
        oldRFID = RFID;
        if (debug) {
          Serial.print ("FBAdr ");
          Serial.println(RFID);
          Serial.write(0x00);
                   }
        else {
          Serial.write(FBAdr);
          Serial.write(mfrc522.uid.uidByte, 4);
          Serial.write(0x00);
          
        }
      }
    // others has 7Byte UID, in this case cut the LSB 
      if (mfrc522.uid.size > 4) {
        oldRFID = RFID;
        if (debug) {
          Serial.print ("FBAdr ");
          Serial.println(RFID);
                   }
        else {
          Serial.write(FBAdr);
          Serial.write(mfrc522.uid.uidByte, 5);
             }
      }
    sendEndCount = 0;
  }
  delay(Intervall);
}

// convert Binary data to huaman readable HEX format
String mkString(byte "buffer, byte bufferSize) {
  String UID = "";
  for (byte i = 0; i < bufferSize; i++) {
    if (buffer[i] == 0) {
      UID = UID + "00";
    }
    else {
      UID = UID + String(buffer[i], HEX);
    }
  }
  return UID;
}

Il collegamento con il PC su cui gira Rocrail avviene tramite porta USB.

Su Rocrail ho configurato un controller di tipo INTER-10 legato alla porta assegnata da sistema alla USB: attenti alla velocita' di trasmissione da settare a 19200 Baud.

Uso dei tag autoadesivi spessore 1 mm e diametro 15-20 mm: ad ogni passaggio del sensore vicino all'antenna del sistema leggo sul server il codice del tag in decimale.

Con un semplice script deduco quale locomotiva sta passando e compio l'azione conseguente ( annuncio di stazione, ad esempio)

Codice: Seleziona tutto

<xmlscript>
  <switch var="%lcid%">
    <case val="252.91.27.219.0">
      <ext  cmd="suona.bat sounds\444.wav" />
    </case>
    <case val="180.170.35.84.0">
      <ext  cmd="suona.bat sounds\646.wav" />
    </case>
    <case val="42.246.35.84.0">
      <ext  cmd="suona.bat sounds\626.wav" />
    </case>
  </switch>
</xmlscript>
E' possibile usare l'accrocco anche in impianti analogici scrivendosi un programmino che legga la seriale e faccia qualcosa a seconda della locomotiva che passa

Antonello

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » gio gen 12, 2017 2:07 pm

Molto interessante, ho usato quel sistema per apertura porte ed è molto efficace, non avevo ancora pensato a questo utilizzo :cool:
Domanda: dove hai posizionato il sensore e i tag adesivi.
Ciao, Salvatore

Avatar utente
matteob
Messaggi: 895
Iscritto il: ven giu 12, 2015 12:06 pm
Nome: matteo
Regione: Veneto
Città: San Bonifacio
Età: 41
Stato: Non connesso

Messaggio da matteob » gio gen 12, 2017 2:07 pm

Bella idea! Quel sensore sarebbe un lettore badge? L'avete collocato, sotto il plastico ed eseguito un foro?
Matteo

Avatar utente
buddacedcc
Messaggi: 473
Iscritto il: mar dic 04, 2012 9:37 pm
Nome: Epifanio
Regione: Piemonte
Città: Torino
Età: 42
Stato: Non connesso
Contatta:

Messaggio da buddacedcc » gio gen 12, 2017 2:27 pm

matteob ha scritto:

Bella idea! Quel sensore sarebbe un lettore badge? L'avete collocato, sotto il plastico ed eseguito un foro?

Perdonatemi.....ma non si fa prima a leggere i dati trasmessi da decoder senza aggiungere altro ?
Nuccio - Visita DCCWorld, il primo ed unico sito italiano dedicato al digitale.

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Messaggio da ho_master » gio gen 12, 2017 3:19 pm

@buddacedcc

Sul nostro plastico possono venire a 'giocare' tutti i Soci e non c'e' uniformita' di decoder e non siamo in grado di leggere i dati trasmessi.

Come dicevo il sistema puo' essere utilizzato anche quando si va in analogico.

Ho privilegiato velocita' di realizzazione e spesa contenuta ( 13-15 Euro in tutto )

Inoltre si possono mettere i 'tag' in carri e carrozze per identificare il convoglio indipendentemente dalla loco.


Antonello

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Messaggio da ho_master » gio gen 12, 2017 3:22 pm

@matteob

Il sensore e' posto in orizzontale sotto il binario (privato delle traversine) all'uscita di una galleria; il 'tag' RFID e' appiccicato al carrello della loco.

Sto testando sull'altra galleria il sensore in verticale e il tag all'interno di un carro o della loco in verticale.

Antonello

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » gio gen 12, 2017 6:15 pm

@ Antonello
Continuo ad essere sempre più incuriosito da questo sistema, io vado in analogico, dici di poter attivare gli annunci in base al treno che viene rilevato, utilizzi arduino o altro sistema, io ho cercato senza successo su arduino di poter selezionare su una sd il brano che desideravo, ma non sono mai riuscito a realizzarlo, le varie schede che ci sono danno poche possibilità: riproduzione casuale, ripetitiva o in sequenza.
Ciao, Salvatore

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Messaggio da ho_master » gio gen 12, 2017 11:14 pm

Io ha avuto gli stessi problemi con varie schede e con un riproduttore di mp3 modificato. Attualmente i messaggi li riproduco da PC o da una schedina Raspberry.

Il Raspberry e' in grado di leggere le uscite di Arduino e di far andare un brano a seconda della combinazione che ritrova sul GPIO ( il connettore per i dati ).

Appena ho un attimo presento una versione su Arduino non legata a Rocrail

Antonello

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » gio gen 12, 2017 11:25 pm

Grazie per la risposta era poi quello che temevo che con arduino ci sono problemi per riprodurre file audio, stavo valutando una schedina di registrazione audio , ne ho vista una con 10 sec di registrazione ed un altra che è più capiente ma necessita un circuito con amplificatore audio e connessioni con arduino.
Volevo anche chiederti se hai testato la lettura anche a varie velocità, cioè se andando a velocità sostenuta il sensore riesce a leggere il tag.
Ciao, Salvatore

Avatar utente
ho_master
Messaggi: 597
Iscritto il: mar nov 06, 2012 6:58 am
Nome: Antonello
Regione: Abruzzo
Città: Pescara
Età: 70
Stato: Non connesso
Contatta:

Messaggio da ho_master » lun gen 16, 2017 9:11 am

@Salvatore

Conosci o hai provato questa schedina ? clicca qui


Immagine:
Immagine
137,78 KB

Appena mi arriva provo a fare un circuitino autonomo.

Nel frattempo sto lavorando con una Rasberry e un rivelatore RFID:
in questo caso il RasPI farebbe tutto da solo senza schedine aggiuntive oltre all'antennina RFID.

Antonello

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » lun gen 16, 2017 9:49 am

Interessante il programma, me lo guardo bene e cerco di capire che cosa fa, io tempo fa ho preso questo WTV020-SD v.1.00
http://www.sgbotic.com/products/datashe ... Module.pdf
non so se è lo stesso chip, perchè sapevo che non leggeva direttamente gli Mp3 ma bisognava convertirli in formato dac, per poter essere letti, con un programmino che si scaricava, avevo trovato sketch che potevano solamente leggere in sequenza e attivarli da pulsanti non che si potevano selezionare via software.
Ciao, Salvatore

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » gio feb 23, 2017 5:36 pm

Stuzzicato, e non poco, da questa idea del riconoscimento convogli sul plastico a mezzo Arduino e Rfid, ho acquistato dei modulini NCF adesivi rettangolari 12x19, misura idonea da inserire sotto una loco o un vagone

Immagine

acquistati sulla Baia
http://www.ebay.it/itm/111917374902?_tr ... EBIDX%3AIT
provati con il ricevitore Rfid, sono perfettamente riconoscibili, adesso non mi resta che provare sul campo.
Ciao, Salvatore

Avatar utente
Glifos
Messaggi: 15
Iscritto il: mer apr 20, 2016 6:39 pm
Nome: ULIVIERO
Regione: Liguria
Città: CEPARANA
Età: 65
Stato: Non connesso

Messaggio da Glifos » mer mar 01, 2017 11:57 am

Io ho risolto con le schede registrazione vocale isd 1820 da 10sec. e la 1700 da 60sec, attivate da Arduino,entrabe dotate di microfono.
La prima la uso solo su PL ,10 sec di suono di "lecca lecca",attivata da Arduino.
La seconda, piu' performante, 60 sec di registrazione, sulla quale sono riuscito a salvare 13 annunci selezionati da Arduino Mega nell'ambito della programmazione della stazione principale del mio costruendo plastico a pannelli.
Sul primo l'attivazione è banale ,basta mettere a massa il play, pin 5 P-E.
Per la seconda ,la storia e' piu' complessa.
Studiando il modulo, mi sono accorto che ,all'accensione, lui punta sempre sull'ultimo annuncio, nel mio caso il 13esimo.
Non disponendo di un reset, mi sono creato un enable con un transistor in emitter follower,il quale alimenta il modulo.
Tutti i pulsanti del modulo sono attivi verso massa quindi,Arduino a programma, muovera' i vari pinout di comando in attivo basso tramite un diodo tipo 4148.
La sequenza ,quindi,sara':1) interrompo l'alimentazione per un sec.,lui si posiziona sul 13esimo,2)un ciclo for da 1 a 13 (se voglio il 5°lo fermo a 5) seleziona l'annuncio sul pin FWD,3)attivazione del play e l'annuncio voluto viene eseguito.
Il tempo di attivo basso puo' andare bene da 700millisecondi a un sec.
Il tutto funziona bene,e la spesa è circa 6€.
Uliviero
Uliviero

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » mer mar 01, 2017 12:57 pm

Con la schedina da 10 sec sono riuscitio a farla funzionare, anche se l'audio è molto debole e penso che necessiti di un piccolo amplificatore, nell'altra da 60 sec non avendo trovato nessuna argomentazione per farle riprodurre il file che desidero, ho tralasciato, e mi sono concentrato si una schedina Mp3 su SD, ho trovato alcuni sketch idonei e li sto valutando, ma ancora senza ritultati.
Ciao, Salvatore

Avatar utente
sal727
Messaggi: 3448
Iscritto il: dom apr 26, 2015 5:22 pm
Nome: Salvatore
Regione: Emilia Romagna
Città: Bologna
Ruolo: Moderatore
Età: 63
Stato: Non connesso

Messaggio da sal727 » dom mar 05, 2017 11:05 pm

Sono andato avanti con le mie prove, e sono finalmente riuscito a far parlare Arduino :cool: , ho utilizzato la schedina con MicroSD che avevo già preso tempo fa, WTV020-SD

Immagine

questa schedina purtroppo non legge i file Mp3 e bisogna convertirli in formato ad4, c'è un programmino apposta che li converte, inoltre la schedina SD deve essere al max di 2 Gb per essere formattata in Fat16 (questa per fortuna l'avevo in casa, comunque se ne trovano ancora sulla baia), al momento ho verificato uno sketch che legge la schedina e può selezionare il file che si desidera, usando semplicemente i numeri della tastiera, poi cercherò invece di azionarlo attraverso il rilevamento dei sensori Rfid, che riconoscendo il convoglio aziona il file idoneo, l'intenzione è di far sentire gli annunci in stazione in base al convoglio che arriva.
Lo schema di connessione con arduino è il seguente

Immagine

l'altoparlante si collega direttamente alla schedina, ci vorrebbe un 4 Ohm, ma di piccole dimensioni si fatica a trovarli, io ho usato un 8 Ohm, l'audio è più basso, volendo con un piccolo amplificatore si risolve il problema. I file audio li ho realizzati personalmente con un semplice programmino free che da un file di testo produce l'audio con voce femminile o maschile ( DSpeech ), e una volta salvato in Mp3 si converte per essere utilizzato sulla schedina.
Ciao, Salvatore

Rispondi

Torna a “DIGITALE”