Arduino Nano+RFID125 +Bluetooth H06

Buongiorno a tutti!

sto facendo un apriporta , che aprirà cancello elettrico con tag rfid e con bluetooth da cellulare!

vorrei utilizzare un ARDUINO NANO (328 -5 v) , la domanda è questa... siccome devo collegare 2 seriali ( una del RFID e l'altra del BT ) ad arduino ... vorrei utilizzare la libreria SOFTWARE SERIAL , ma non funziona! si possono utilizzare 2 seriali con la software serial oppure una sola!!

softwareserial RFID (2,3); softwareserial BT (4,5) ;

resto in attesa

buona giornata massibal

Se ti studi bene la documentazione ed i metodi della SoftwareSerial scoprirai che, mentre puoi sempre trasmettere da entrambe, puoi ricevere (alternativamente) solo da una delle due ... a te selezionare di volta in volta quale è attiva in ricezione.

In pratica, con il metodo listen() dici quale delle sue seriali è in ricezione.

Dovrai avere quindi un qualche cosa che non trasmette di sua iniziativa, ma solo su tua richiesta, perché, se tu sei impegnato a ricevere su una seriale, quello che arriva sull'altra va perso.

Guglielmo

grazie!

quindi mi confermi che tecnicamente posso utilizzare i pin 2,3 e 4,5 del mio arduino nano con la sofwareserial ?

io ho fatto un programma che usa il listen ... ma è come se i comandi BT.listen() e RIFD.listen() non venissero considerati!!

bisogna anche chiudere in qualche modo il listen ???

grazie massibal

Arduino Nano monta un ATmega328P quindi è come un Arduino UNO e non ci sono limitazioni sui pin che si utilizzano con la SoftwareSerial.

Non c’è modo di chiudere un listen(), si seleziona su quale porta ascoltare e, automaticamente, l’altra viene disabilitata.

Ricontrolla i collegamenti (TX → RX e RX ← TX) e le masse siano in comune, perché deve funzionare :wink:

Guglielmo

grazie !
ti inoltro il mio sketch… se hai tempo e voglia di darci un’occhiata!!

fammi sapere!

[code]
#include <SPI.h>
#include <SoftwareSerial.h>

SoftwareSerial BT(4, 5);
SoftwareSerial RFID(2, 3);


int rele = 11;
byte val = 0;

String IdTest ;
String IDOK [2] = {"xxxxxxxxxxx", "xxxxxxxxxx"};

char data [14];

String message;
long lastTagReading = 0;

void setup ()
{
  Serial.begin(9600);
  BT.begin(9600);
  RFID.begin (9600);
  SPI.begin();
  pinMode (rele, OUTPUT);
  digitalWrite (rele , LOW);
  Serial.println("Ingresso ");
  Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
  Serial.println("In attesa di lettura tag/bluetooth");
}
void loop ()
{
  BT.listen();
  
  while (BT.available()) {
    message += char(BT.read());
  }
  if (!BT.available())
  { if (message != "") 
    {
      if (message == "1") {
        digitalWrite(rele, LOW);
        Serial.println("Accesso Bluetooth attivato");
        delay(20);
        Serial.println("rele ON"); 
        delay(20);
        message = ""; 
      }
      if (message == "0") {
        digitalWrite(rele, HIGH);
        Serial.println("rele OFF");
        delay(20);
        message = ""; 

      }
      if (message == "3") {
        digitalWrite(rele, LOW);
        Serial.println("Relè ON");
        delay(1000);
        digitalWrite(rele, HIGH);
        Serial.println("Relè OFF");
        delay(20);
        message = ""; 
      }

      RFID.listen();
      delay(200);
      String IdTest = "";
      if (RFID.available () > 0)
      {
        for (int u = 0; u < 14; u ++)

        {

          data [u] = RFID.read ();
          //Serial.println(u);

        }
        for (int i = 1; i < 11; i ++)
        {
          char d = data [i];
          IdTest += d;
          Serial.println(IdTest);
        }
        if (((lastTagReading + 5000) < millis()))
        {
          lastTagReading = millis();
          Serial.print("RFID tag rivelato --> ");
          Serial.println(IdTest);
          Serial.println("");

          if (control() == 1)
          {
            opendoor();
          }
          else Chiudi();
        }
      }
    }
  }
}

int control()
{
  int i;

  for (i = 0; i < sizeof(IDOK); ++i) {
    if (IDOK [i] = IdTest )
    {
      return 1;
    }
  }
  return 0;
}


void opendoor ()
{
  digitalWrite (rele, HIGH);
  tone (8, 1700, 300);
  delay (300);
  tone (8, 1900, 400);
  Serial.println("Rele ON");
  delay (1000);
  digitalWrite (rele, LOW);
  Serial.println("Rele OFF");
}

void Chiudi()
{
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
  delay(300);
  tone(8, 1200, 150);
}

[/code]

Come ti dicevo NON puoi usare le due seriali se i devices trasmettono di loro iniziativa visto che, mentre tu sei su una, i dati sull'altra vanno persi.

In quel loop() tu non sai mai chi deve trasmettere e il loop è talmente veloce che come sai quando andare a leggere da BT e quando da RFID ?

Si possono usare le due SoftwareSerial solo con devices che TU interroghi ... ... selezioni device 1 ... gli chiedi se ha qualche cosa da darti, se SI, gli dici di trasmettere e tu ricevi ... selezioni device 2 ... gli chiedi se ha qualche cosa da darti, se SI, gli dici di trasmettere e tu ricevi e ricominci da capo.

Non è invece utilizzabile con devices che trasmettono quando vogliono visto che tu NON sai su quale seriale devi stare in ascolto o verificare se c'è qualche cosa.

Nel tuo caso ti serve una MCU che ha almeno 2 vere seriali HW dove collegare il BT e il RFID e che devono lavorare in contemporanea.

Guglielmo

ti ringrazio , quindi mi confermi che non posso fare nulla via SOFTWARE per risolvere il mio problema..

non si possono collegare 2 device seriali ad arduino uno o nano.

l'unica è utilizzare il MEGA ??

grazie massibal

Si possono collegare anche più di due devices seriali, ma ... devono essere devices che NON trasmettono quando pare a loro, ma [u]quando lo vuoi tu[/u] ... tutto li è il problema.

Se invece a te serve di ricevere da qualche cosa che non sai quando può trasmettere ... beh, ti servono per forza delle potre seriali HW. Arduino MEGA, con le sue 4 porte seriali e sicuramente una validissima soluzione.

Guglielmo

ma allora non posso via software dare dei tempi fissi alle due seriali , per esempio dare un tempo ai due listen() ??

grazie

Certo, metti un LED rosso e uno verde ... accendi il rosso e abiliti la porta BT per X secondi e tu puoi trasmettere dal BT SOLO ED ESCLUSIVAMENTE in quel tempo, poi spegni il led rosso e accendi il led verde ... acceso il verde abiliti il RFID per Y secondi e tu puoi passare carte sul RFID SOLO ED ESCLUSIVAMNETE in quel tempo, dopo di che ricominci da capo.

Ho detto LED rosso e LED verde per dare un indicazione luminosa di cosa è attivo così da non sbagliare ... ma ovviamente puoi scegliere altri tipi di indicazione che ti dicano COSA è attivo e cosa quindi tu puoi usare ...

Detto fra noi mi sembra una soluzione "farraginosa" e estremamente poco pratica ... ... pigliati 'sta MEGA e fai una cosa fatta come si deve :D

Guglielmo

P.S.: Ma non potevi prendere un lettore RFID con collegamento SPI come sono normalmente quelli per Arduino ?

grazie Guglielmo , tutto chiaro!

si ho anche un RFID RC522 , ma poi legge un tag posto al di fuori di una porta metallica ????

grazie

massibal: ... ma poi legge un tag posto al di fuori di una porta metallica ????

Non credo proprio ;)

Guglielmo

già, sempre sperando che il rfid 125 Khz , riesca a farcela!

ma se usassi il RFID RC522 , dovrei usare una sola Softwareserial per il bluetooth e basta ?

grazie

massibal: ma se usassi il RFID RC522 , dovrei usare una sola Softwareserial per il bluetooth e basta ?

Se è un RFID su SPI ... ovviamente SI ... il BT sulla seriale ed il modulo RFID sulla SPI. Occhio però alla lunghezza dei fili, il bus SPI è molto permaloso e già andare oltre i 10 cm. può essere problematico.

Guglielmo

grazie mille!

adesso vedo che strada percorrere!

buona serata

massibal

buongiorno, ho provato a fare alcune prove , ma preferirei utilizzare un arduino con almeno 3 uart...

mi potete consigliare cosa e dove acquistare ( arduino mega escluso per chè troppo grande non mi sta allocato nello spazio che ho disponibile

grazie

massi

Prova a guardare QUESTE … sono delle mini MEGA :smiley:

Guglielmo

grazie ...

posso programmarle come un Mega 2560 originale ?

dove e se posso acquistarle in italia^?

grazie massi

Le programmi come normali MEGA, ma acquistarle … ho idea che le devi acquistare da loro, o … chiedigli se hanno distributori in Europa :wink:

Guglielmo