Ciao a tutti.
Sto ultimando un progetto che prevede un master e diversi slave.
Gli slave vengono riconosciuti grazie ad un ID univoco numerico progressivo che parte da 1 e arriva a N, senza buchi in mezzo.
Per le prove ho assegnato manualmente un ID diverso da skecth, ma in vista della realizzazione pratica vorrei evitare di dover caricare sketch diversi sui vari slave.
Quindi mi servirebbe un modo "hardware" per assegnare questo ID.
L'unica idea che mi è venuta è usare dei dip-switch e impostare l'ID con le varie combinazioni delle levette.
In sé non è difficile ma mi costringe a sacrificare alcuni pin (inizialmente 3 pin per avere almeno 8 ID possibili).
A qualcuno viene in mente qualcosa di diverso?
Ciao.
Non ti capisco bene perché non fornisci dati sufficienti, né l'hardware né il software. Ma presumo che le exclaves siano anche Arduino.
Se è così: inizializzandoli con wire.begin (indirizzo), non vedo come il programma exclave sia complicato per mantenere una comunicazione I2C.
Farlo tramite hardware, penso che lo complicherebbe ancora di più e sarebbe più costoso da costruire
Saluti.
@gonpezzi : dai per scontato cose che l'utente NON ha detto ... chi ha detto che usa o può usare I2C per connettere le varie unità? Non sta mica parlando di sensori, sta parlando di un Arduino master che colloquia con più Arduino slave sparsi chissà dove e connessi con chissà quale modalità ... ![]()
E comunque, anche ammesso che potesse usare il bus I2C ... come assegnerebbe l'indirizzo? A lui serve un "indirizzo" fissato da hardware NON da impostare nel software (cosa che già fa) ...
Se non sei sicuro della logica del progetto, evita suggerimenti fuorvianti, grazie.
Guglielmo
@fratt : ci sono vari metodi per fare quello che chiedi ...
... uno è quello che hai indicato, ma che ovviamente richiede un po' di pin, un altro è usare semplici ed economici chip hardware che forniscono un identificativo univoco come il DS2401 un altro metodo ancora, in funzione del tipo di MCU usata, è quello di usare una caratteristisca NON documentata ... un loro numero seriale, univoco per ogni MCU ... c'è una libreria che lo va a leggere e te lo restituisce ... QUESTA e la installi anche dal library manager di Arduino ![]()
Ovvio che sono numeri NON progressivi come hai ora e più articolati, ma magari puoi adattarli alle tue necessità ![]()
Guglielmo
Altrimenti, se vuoi usare un dipswitch ma NON occupare troppi pin, potresti pensare ad un multiplexer collegato sul I2C (se lo hai disponibile ed utilizzabile) con cui leggi i vari pin del suddetto dipswitch e hai il tuo identificativo di scheda.
Occhio perché, mentre gli altri metodi che ti ho indicato, sono sicuramente univoci (nascono con quello scopo), con il dipswitch è sempre possibile, per errore, assegnare due ID uguali ...
Guglielmo
Mi è venuta in mente ancora una possibilità che ti impegna solo un pin analogico ...
... usare il dipswitch per attivare ogni volta una serie di resistenze su un partitore resistivo e leggere la tensione risultante. Se dividi l'intervallo in modo corretto hai una scala di possibili valori che ti possono indicare l'identificativo della scheda. Non è il massimo, ma si usa ... ![]()
Se hai ancora l'ABC di Pighixxx ricordo che c'era una scheda dedicata ad una serie di pulsanti (si chiamava "Multiple Pushbuttons") su un pin analogico ... e comunque se ne è parlato anche in altri thread.
Guglielmo
Altra possibilità mettere l' ID in EEPROM con un comando di configurazione iniziale (ad esempio via seriale). Lo sketch rimane uguale, e l'invio del comando (manuale) prende il posto del settaggio (sempre manuale) dei dip switch.
In hardware invece per quanto riguarda il numero di pin, usandone solo tre si può anche usare uno (o più) shift register.
Intanto grazie a tutti.
Mi rileggo tutto con più calma al pc (da cell ancora ci capisco poco).
L'ID univoco del chip è sicuramente la soluzione più "elegante", però dovresti prevedere una sorta di "accoppiamento" iniziale per fare in modo che il master memorizzi questo codice quando colleghi uno slave sul bus.
Una cosa tipo l'accoppiamento dei device bluetooth o come il pulsante WPS dei router WiFi
Grazie anche a te.
Spiego un po' meglio...
Master e slave comunicano tramite HC12.
Per avere meno vincoli possibili, ho cercato di strutturare tutto in modo indipendente dal numero di slave. In teoria, il sistema funziona allo steso modo da 1 a 255 slave (limite dato più che altro dal tipo di variabile utilizzata per momorizzare l'ID).
Ovviamente non avrò mai così tanti slave, diciamo che in condizioni reali 10 / 12 potrebbe essere già un buon numero.
Sempre nell'ottica di avere meno vincoli possibili, ho preferito non mappare a priori gli ID e usare un numero progressivo, così all'accensione il master fa una scansione partendo da 1 e fermandosi al primo slave che non risponde.
In questo modo, se per esempio ho 8 slave e mi si rompe il primo, basta che imposto l'ottavo con l'ID del primo e tutto il sistema funziona con 7 slave senza nessuna modifica software.
Per questo chiedevo un sistema hardware per impostare l'ID.
Il discorso dell'ID univoco del chip mi afascina, ma temo dovrei modificare troppe cose nel progetto.
Ho in casa dei dip-switch. Stasera provo col sistema resistenze / pin analogico che diceva Guglielmo.
Gli altri componenti hardware suggeriti non li ho al momento, quindi lascio le prove per una fase successiva.
Ovviamente resto aperto ad altri suggerimenti.
Hai ritovato la pagina di Pighixxx? Era con i pulsanti, ma con i dipswitch cambia poco
... te la metto qui sotto:
Guglielmo
Grazie.
Dovrei avere un po' di roba di Pighi salvata. Mi salvo comunque anche questa.
Occhio, se devi prevedere di poterne attivare più di uno simultaneamente, per evitare confusioni, ciascuna resistenza dovrebbe essere il doppio della precedente ... es: 1K, 2K, 4K, 8K, 16K, 32K ecc.
Cerca anche su Google "multiple buttons using analog pin" ... troverai un'infinità di informazioni.
Guglielmo
In effetti volevo usare il dip-switch come un "numero binario"...
Quindi se uso un dip a 3 vie, avrei 8 possibili valori. E mi pare di capire che ricadrei nel caso che dici tu... dovrei avere i valori di resistenza che servono, stasera controllo.
Grazie
Io scriverei l'indirizzo in eeprom.
Ovviamente inizialmente l'indirizzo sarà 00000 per tutti, poi con apposito comando via i2c può essere cambiato.
Servirà anche un pulsante di reset tipo se all'acensione é premuto il pulsante per tot. secondi allora rimposta l'indirizzo a 000000.
Questo sistema ha il vantaggio di creare tutto moduli e sketch uguali, ha lo svantaggio che i vari slave devono essere collegati uno alla volta, o comunque programmati via i2c prima di essere messi in utilizzo.
Grazie della risposta, ma come scrivevo sopra, preferirei un sistema completamente hardware per impostare / cambiare gli ID, per poterlo fare anche "sul campo" senza un pc.
Almeno un pulsante ci vuole
All'accensione dei varii slave fai controllare se hai un ID in eeprom
Se si lo usi, se no ti metti in attesa
E "batti" il numero sul pulsante, ad esempio conti gli impulsi
A questo punto lo salvi in eeprom
Magari un po' più complicato perché dovrebbe prevedere anche la riprogrammazione della scheda già programmata ... nulla di che, magari una pressione prolungata del pulsante può significare "azzera ID" e poi lo deve riprogrammare ... ![]()
Guglielmo
Grazie anche a te.
Quella del pulsante è una delle opzioni che avevo valutato, ma l'ho accantonata perché dovrei prevedere anche una sequenza (long-press o altro) per fare il reset dell'ID anche se lo trovo memorizzato.
Azz... Guglielmo ci ha messo meno di me per dire la stessa cosa...
Comunque sempre cosa abbastanza semplice è
Si può pure prevedere che il master confermi l'assenza di erronei doppioni, ma sempre poca cosa
