esiste qualche documentazione/schema elettrico/libreria che permetta di trasferire delle informazioni da un Arduino UNO ad un altro?
Potrebbe andare bene una lettura dello stato HIGH/LOW su diversi PIN, ma sarebbe anche meglio se si riuscisse con un unico PIN a dare diverse indicazioni (è possibile, ad esempio, passare un valore analog con 255 possibili stati, o digital con 1024?).
Salve SmallG, dipende da che tipo di dato devi trasmettere, esistono molti protocolli di trasmissione che possono fare al caso tuo e altrettante maniere per realizzare una trasmissione.
Esistono dei moduli wireless che permettono la trasmissione tra due Arduino, per esempio i moduli nRF24L01 o MX-05V, MX-FS-03V o xBee.
Altrimenti c'è una trasmissione con fili molto semplice ma funzionale, devi implementare la libreria Wire.h ma ti posso aiutare!
Questo non è altro che il semplice cablaggio che devi effettuare:
Il funzionamento è semplice, il Master richiede un byte allo Slave, quando lo slave riceve la richiesta legge lo stato del pulsante e se è premuto invia "a" altrimenti invia "s". Il master leggerà il byte ricevuto, in caso esso fosse "a" un diodo LED viene acceso, in caso contrario se "s" è il byte ricevuto non verrà accesso il diodo LED.
Il diodo led è collegato a un Arduino e il pulsante all'altro. A4 e A5 dei due Arduino sono interconnessi in modo da avere la comunicazione tramite il protocollo/bus I2C, sono necessarie due resistenze di pull-up del valore di 4.7k ohm per evitare che il segnale resti fluttuante alterando quindi i dati.
Dovrai poi caricare questo nell'Arduino che deciderai di usare come Master
#include <Wire.h> /* Questa libreria è già presente in Arduino IDE (il software di programmazione) non dovrai scaricarla */
void setup()
{
Wire.begin(); // Con questo comando inizializziamo il bus i2c
pinMode (2,OUTPUT);
}
void loop()
{
Wire.requestFrom(2, 1); // Richiediamo un byte al dispositivo presente all'indirizzo 2.
String b = "";
char c = Wire.read(); // Leggiamo il byte ricevuto
b = b + c;
delay (100);
if (b == "a")
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
delay(10);
}
Fatto ciò manca soltanto la programmazione dello Slave, che è la seguente:
#include <Wire.h>
void setup()
{
pinMode(2, INPUT);
pinMode(13,OUTPUT);
Wire.begin(2); // Inizializza il bus I2C all'indirizzo 2
Wire.onRequest(requestEvent); // Esegue la funzione sottoscritta quando ha una richiesta
}
void loop()
{
delay(100);
}
void requestEvent()
{
if (digitalRead(2) == HIGH){
Wire.write("a"); // Se il pulsante è premuto invia il carattere "a"
digitalWrite(13,HIGH);
}
else
{
Wire.write("s"); // Altrimenti invia il carattere "s"
digitalWrite(13,LOW);
}
}
Se hai qualche problema scrivi pure qui, spero di aver centrato la tua domanda, cordiali saluti.
il mio problema è sorto perché ho un modulo wi fi esp8266 e 3 moduli rfid rdm6300. Ho notato che i codici dei singoli sensori vanno bene in sketch separati, ma quando li unisco danno problemi. Il problema inizia dove inizializzo i Serial, quindi credo che lì fanno interferenza (ho provato a cambiare l'ordine, in alcuni casi va solo il wi-fi, in altri il serial non mostra più nulla e quindi non è utilizzabile).
Per questo volevo usare il wi-fi su un altro arduino restituendo solo il risultato che mi serve (che sono 1 variabile 0 o 1 e un altra 0, 1 o 2, che potrei gestire anche con un solo valore creando delle combinazioni)
00
01
02
10
11
12
Altra questione, riesco alimentando solo il master a far alimentare anche l'altro arduino o gli serve un alimentazione a parte?
Il master è alimentato tramite l'usb-b /usb-a su trasformatore 5v 1A.
Ho anche 4 batterie per un totale di 6v che alimentano solo un motore dal master (e non continuamente).
uhmm il problema è che funziona una sola SoftwareSerial alla volta, quindi solo quella che è in listen().
Tutte le altre NON ricevono i dati mentre un'altra lavora.
Quindi se tu passi una card mentre sta' colloquiando con l'ESP , dato che ci mette un tempo lunghissimo, è come se non la vedesse
Mi sa' che devi passare a una scheda con multiseriale, come ad esempio la Mega2560, che ne ha 4
Ho rivisto tutto lo sketch provando prima solo con 2 RFID e poi aggiungendo il WiFi. Con qualche millis credo di aver risolto:
Il wi fi lo userò una volta ogni 30/60 minuti, ma anche nelle prove in cui aggiorno ogni 10 secondi ora va abbastanza decentemente.
Un breve delay l'ho messo non prima di listen() ma subito dopo (e prima del codice che utilizza quel seriale), credo che così ha un po' di tempo per utilizzare al meglio la porta voluta.
I lettori RFID non ci prendono sempre, a volte mi danno letture vuote.. Ho risolto considerando per X secondi l'ultimo valore letto, in modo che non lo considero più sol se effettivamente il tag è stato rimosso per almeno X secondi (in genere sbaglia al massimo 2-3 letture consecutive e così evito che mi si spenga/accenda il led relativo ogni mezzo secondo).
Il MEGA è sicuramente un opzione che permette maggiore stabilità e meno compromessi, lo tengo a mente se mi serve fare qualcosa di più serio. Per ora così ho risolto. Grazie per l'indicazione sul listen(), non l'avrei mai trovato da solo.