Arduino - MCP23017 - Servo

Ciao a tutti,

ho un problema che non riesco a risolvere... ho un Arduino UNO R3 e dei MCP23017. Ho capito che questo è un expander di porte, però io vorrei connettere un servo a una delle porte dell'MCP23017.

E' possibile comunicare con il server? Come indico al server che è connesso al chip anziché ad Arduino?

Purtroppo non sono riuscito a trovare molte info.

Ulteriore domanda... e scusate se sembrano stupide... però proprio non ho trovato info....
Come faccio a indicare il pin1 dell'MCP23017 con addr 0x00 e un altro pin1 di un altro MCP23017 con addr diverso?

Grazie di tutte le info che potete darmi!

Buonasera e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Sarà il caso che ti studi come funziona il bus I2C ... QUI un piccolo tutorial e QUI uno un po' più completo.

Guglielmo

Scusami se non mi ero presentato prima, però ho subito rimediato!

Grazie per i link! Inizierò sicuramente da li!

Però una domanda te la faccio uguale... pensi che posso comandare un servo da un MCP23017?

Se si, allora non mi a capofitto a studiare! Altrimenti cerco altre soluzioni... però non vorrei acquistare cose mezze fatte come quelle di Adafruit...

Il MCP23017 è solo un port expander, NON mi risulta in grado di generare segnali PPM per pilotare un servo.

Quella di adafriuit NON è una cosa mezza fatta, è solo una breakout board che ti evita di dover fare il circuito stampato e di saldare integrati che non tutti sono in grado di saldare. La board che puoi prendere è QUESTA che, come vedi, è esattamente ciò che ti ho descritto.

Guglielmo

Premetto che non ho mai nemmeno tenuto in mano un servo, mi sono solo documentato in merito.

Ho capito che si pilotano col PWM, ma mi pare anche di capire che la libreria Servo di Arduino funziona su qualunque pin (altrimenti come potrebbe pilotarne fino a 12 su una Uno?), per cui evidentemente fa PWM in software.

Immagino quindi che non ci siano grossi problemi a farlo anche con un MCP, all'eventuale costo di dover lavorare a basso livello per rispettare il timing. Quel che @Arduino85 forse vuole sapere è come passare il "pin virtuale" della libreria MCP alla libreria Servo. Beh, non c'è modo. Devi o cercare una libreria dedicata allo scopo (pilotare servo con quel ben preciso port expander), oppure provare a modificare la Servo. Non dovrebbe essere troppo complicato, ma non so se usi le funzioni di alto livello o manipoli direttamente i registri, cosa che complica sicuramente le cose al novizio.

Quanto a come gestire i servo su 2 expander diversi, avrai 2 istanze della libreria MCP. Se la passi come parametro alla libreria che andrai a modificare, potrai istanziare 2 volte anche questa, e quindi agire su una o sull'altra indipendentemente.

Perché vuoi collegare un servo al MCP23017?
Non hai abbastanza piedini per farlo?

Ciao Uwe

SukkoPera:
Ho capito che si pilotano col PWM, ma mi pare anche di capire che la libreria Servo di Arduino funziona su qualunque pin (altrimenti come potrebbe pilotarne fino a 12 su una Uno?), per cui evidentemente fa PWM in software.

... se ti piglia Astro ti strozza :smiley: :smiley: :smiley:

Ha più volte spiegato che i servo si pilotano in PPM ...

In PWM l'informazione è veicolata dal rapporto tra parte bassa e parte alta del segnale, in PPM l'informazione può essere veicolata in due modi, sia dalla durata della sola parte alta, o parte bassa, del segnale, che dalla posizione dell'impulso se è un treno d'impulsi componente un pacchetto di dati.

Guglielmo

gpb01:
Ha più volte spiegato che i servo si pilotano in PPM ...

Esatto il controllo è in PPM, il PWM è una cosa diversa anche se a livello di singolo impulso di controllo, il PPM può comandare più device all'interno di un singolo frame, come aspetto sono identici, però cambia il modo di veicolare l'informazione.
E' praticamente impossibile generare impulsi PPM per i servo tramite un I2C expander, questo perché richiede un controllo dei periodi al singolo us, incompatibile con il clock a 400 kHz della I2C, e andrebbe a creare un lavoro immenso sulla mcu per gestire la I2C.
La soluzione è usare generatori PWM, ad alta risoluzione, I2C come quello di Adafruit che è in grado sia di produrre segnali PWM che PPM per i servo senza caricare il bus I2C di extra lavoro salvo quello per comunicare le posizioni dei servo.

Beh ok, come detto non mi sono mai interessato di servo. Però è dunque emerso che quello che si vuole fare qua non è fattibile. Suggerisco dunque di pilotare i servo direttamente da Arduino e di usare l'MCP per periferiche meno "impegnative".

Ma usare quanto al mio post #4 no ? ? ? :smiling_imp:

Guglielmo

Certo, ma magari si può ovviare senza comprare hardware aggiuntivo. Non Sappiamo cosa deve collegare per avere tutti i pin occupati...

SukkoPera:
Certo, ma magari si può ovviare senza comprare hardware aggiuntivo.

Se vuoi comandare dei servo tramite seriale/I2C/spi, etc, serve per forza del hardware specifico aggiuntivo.

Sì, ma magari può usare i pin normali per i servo e spostare il resto sull'MCP...

Grazie a tutti per le risposte.

Grazie soprattutto ad Astrobeed per avermi spiegato il perché con l'MCP23017 non è fattibile... in poche parole ho un piccolo progetto dove avrei dovuto pilotare 68 servi da 68 potenziometri... solo che quando ho cercato informazioni... mi mancavano proprio le basi dell'I2C e di quello a cui serviva l'MCP...

Ora ho capito perché non è il caso di usare questo expander! Vorrà dire che mi butto su quello di Adafruit...

Per rispondere a SukkoPera: sicuramente potrei usare i piedini di Arduino, ma solo per il prototipo con pochi servi... più che altro ormai ho già 2 Arduino UNO R3... e non volevo comprare altre schede come la Mega... anche se alla fine comprerò qualcosa del genere e vedrò se meccanicamente posso ridurre a 52 i servi.

Grazie a tutti!

Arduino85:
in poche parole ho un piccolo progetto dove avrei dovuto pilotare 68 servi da 68 potenziometri... solo che quando ho cercato informazioni... mi mancavano proprio le basi dell'I2C e di quello a cui serviva l'MCP...

Di problemi ne hai due, il primo sono i servo, questo lo risolvi con cinque schede di Adafruit, dato che hanno l'address I2C programmabile ne puoi collegare fino a 62 sullo stesso bus I2C.
Però c'è problema dei 68 potenziometri che non puoi collegare direttamente a nessun modello di Arduino, in questo caso ci sono due soluzioni possibili, usare dei moduli ADC esterni, anche questi su bus I2C, però non credo che troverai delle breakout idonee, oppure usare un multiplexer analogico che ti permette di moltiplicare gli ingressi ADC di Arduino, questa soluzione è sicuramente meno costosa e maggiormente fattibile, per contro è molto più complessa dal punto di vista hardware.
Dato che sei obbligato a lavorare in multiplexing sia per il controllo servo che per la lettura dei potenziometri difficilmente riuscirai ad aggiornare la posizione dei servo più di 10-15 volte al secondo, cosa che potrebbe avere un impatto negativo sulla fluidità dei movimenti, se quest'ultima non è importante per il progetti che devi realizzare allora la cosa non crea problemi.

Grazie Astro!

Diciamo che il fatto che il movimento sia poco fluido... qualche problema me lo darebbe... e se utilizzassi un arduino per comandare i servi, e più di un arduino per i potenziometri e quindi inviare l'informazione all'arduino che comanda i servi?

Scusami per le domande... in effetti da problema software è diventato hardware...

Io userei due MEGA2560

Una possibile soluzione per la lettura dei potenziometri è usare nove MCP3208, è un ADC a 8 canali su bus SPI, disponibile anche in case pdip, dato che la SPI è 10 volte più veloce della I2C dovresti riuscire a fare il refresh di tutti i servo 50 volte al secondo, tipico del loro frame dati, ottenendo movimenti fluidi, ovviamente nei limiti del tipo di servo che andrai ad utilizzare.
Ovviamente dipende anche da cosa deve fare Arduino oltre a leggere i potenziometri e aggiornare la posizione dei servo, se devi fare altre cose, sopratutto se gravose come tempo cpu, conviene delegarle ad un altro Arduino.
Un conto veloce del pin impegnati, la I2C ne richiede 2, la SPI 3 più un pin per ogni device connesso, in totale sono 12 (3+9), pertanto hai 14 pin impegnati per i servo e i potenziometri, se vuoi lasciare libera la UART per l'eventuale comunicazione con un pc, un secondo Arduino, o semplicemente per la programmazione di Arduino, ti rimangono liberi 4 pin da usare per altre cose.
Altra considerazione, 68 servo possono richiedere una corrente enorme, dipende dal tipo e dal carico meccanico, anche decine di Ampere, pertanto serve un idoneo alimentatore e un buon cablaggio elettrico per la distribuzione della potenza.

Brunello:
Io userei due MEGA2560

In effetti non è male come soluzione, più semplice da implementare e sicuramente più economica visto che una Mega2560 compatibile, di quelle buone, costa meno di 20E.