Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/ognigiorno.com/wp-content/plugins/math-comment-spam-protection/math-comment-spam-protection.php:1) in /var/www/html/ognigiorno.com/wp-includes/feed-rss2.php on line 8 i2c – OgniGiorno.com https://www.ognigiorno.com insieme tutti i giorni Tue, 24 Apr 2012 08:34:41 +0000 en-US hourly 1 https://wordpress.org/?v=5.8.9 Come pilotare i servo con i PIC https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html#respond Thu, 30 Apr 2009 23:22:53 +0000 http://www.ognigiorno.com/?p=337 Read More »Come pilotare i servo con i PIC]]> futaba_s3003_servoI servomotori (o servo) sono dei dispositivi molto utili per chi si diletta nella costruzione di robot e più in generale per tutte le realizzazioni che uniscono meccanica ed elettronica (spesso chiamata meccatronica o cibernetica). Si tratta in effetti di motori di precisione controllabili elettronicamente. Vediamo in questo articolo come funzionano e come fare per controllarli tramite microcontrollori.

Cosa sono i servomotori

In un piccolissimo contenitore racchiudono un motore, un riduttore ed il circuito che lo controlla. Il riduttore serve per aumentare la potenza disponibile. Il circuito permette di controllare la posizione del servo tramite impulsi inviati su un singolo filo.

I servo hanno infatti tre soli fili di collegamento. Si tratta di positivo e negativo di alimentazione e del filo di controllo (spesso erroneamente indicato come PWM).

Il rotore che esce dal corpo del servo (che può essere di plastica o metallico) ha collegata una croce che permette di utilizzarlo nelle costruzioni. Hanno solitamente liberta di movimento limitata a 180 gradi (mezzo giro). Smontandoli è possibile modificarli per eliminare questa limitazione e renderlo libero di girare 360 gradi come un motore normale.

Come si controllano

L’impulso di controllo serve per controllare la posizione, cioè per far muovere il rotore fino a che non raggiunge l’angolazione desiderata.

Il controllo è un segnale alto che si ripete a distanza di 20 ms, seguito dal livello basso. In base alla durata dell’impulso 1, il servo si posiziona tra 0 e 180 gradi.

Nel disegno è illustrato il meccanismo e la tabella di seguito riporta alcuni esempi (ogni costruttore porta delle leggere differenze)

sheetservo

Impulso di controllo Cavi di collegamento
Costruttore min. centro. max Hz + batt -batt impulso
Futaba 0.9 1.5 2.1 50 rosso nero bianco
Hitech 0.9 1.5 2.1 50 rosso nero giallo
Graupner/Jr 0.8 1.5 2.2 50 rosso marrone arancio
Multiplex 1.05 1.6 2.15 40 rosso nero giallo
Robbe 0.65 1.3 1.95 50 rosso nero bianco
Simprop 1.2 1.7 2.2 50 rosso azzurro nero

Le caratteristiche

Coppia: la forza che è in grado di esercitare. È espressa in kg/cm e indica quanti chili il servo è in grado di muovere per ogni cm di lunghezza del braccio (a partire dal perno di rotazione)

Velocità di rotazione. Espressa solitamente in gradi (o secondi) al secondo

Angolo di rotazione. Più diffusi servo che ruotano 180, ma ce ne sono che limitano a 90 o estendono a 270 il loro movimento

Tipo di ingranaggi: plastica o metallo. È indice della robustezza

]]>
https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html/feed 0
Digitalizzare il plastico del trenino https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html#respond Thu, 23 Apr 2009 11:04:38 +0000 http://www.ognigiorno.com/?p=330 Read More »Digitalizzare il plastico del trenino]]> Un progetto dedicato agli appassionati di modellismo ferroviario che permette di digitalizzare il controllo di scambi, segnali e altri dispositivi presenti nel plastico.
scambiomarklin

Il circuito presentato è studiato per trenini Märklin, ma modificabile per adattarlo a tipologie diverse. Come vedremo, la parte di alimentazione è pensata per la corrente alternata, la modifica per adattarla a corrente continua richiede poco e, anzi, permette di ridurre le dimensioni ed il numero di componenti.


Il vantaggio che deriva da questo progetto lo si vede principalmente nel numero di cavi con cui abbiamo a che fare nel cablaggio dell’impianto. A differenza del metodo tradizionale, per cui dobbiamo prevedere 3 fili dalla centrale di comando ad ogni dispositivo (eventualmente riducibile a 2), con un circuito digitale riusciamo ad utilizzare tre soli fili comuni a tutti i dispositivi controllati. Oltre ai due di alimentazione, il terzo filo è quello su cui viaggiano i dati.

Il formato in cui vengono trasmessi i dati prevede di inviare le informazioni relative a quale operazione e quale dispositivo è chiamato a reagire.

Il funzionamento
Il controllo avviene tramite una centralina a disposizione dell’operatore (il modellista che si diverte con locomotive e trenini vari).
Ogni dispositivo viene poi controllato direttamente da un decodificatore. Il decodificatore è collegato in ingresso al BUS di comunicazione (i tre fili che partono dalla centralina) e in uscita direttamente allo scambio da controllare.
Siccome tutti i decoder sono collegati insieme, deve essere individuato un sistema per fare in modo che ciascuno riconosca il comando a cui deve rispondere. Per questo ad ogni decodificatore verrà assegnato un codice (indirizzo). Parliamo poi di “comando” per identificare l’azione che vogliamo controllare. Usando sempre lo scambio come esempio, i comandi sono due: dritto e storto.
Quando l’operatore decide di girare uno scambio, dalla centralina parte un messaggio (che arriva a tutti contemporaneamente) che contiene l’indirizzo ed il comando. In questo modo il decoder confronta l’indirizzo con il proprio e, in caso di corrispondenza, esegue il comando.
Nella realizzazione qui descritta ho implementato un protocollo seriale che prevede un solo byte per l’indirizzo. Questo significa che si possono controllare fino a 255 dispositivi differenti. In caso non siano sufficienti, si può modificare il protocollo. 2 byte estendono a 65535 il numero di dispositivi.

La centralina
La centralina è costituita da una tastiera numerica ed un display a 4 cifre. Ho utilizzato display a 7 segmenti per rendere il numero più visibile e sicuramente più “in stile” con il plastico di come sarebbe stato con un LCD, ma nessuno impedisce di fare diversamente. In questo modo va interpretata la lettura nel modo seguente: le prime tre cifre rappresentano l’indirizzo, la quarta il comando.
centralina_blocchi

Esempio: se chiamiamo 1 il comando “dritto” e 7 “storto”, per raddrizzare lo scambio identificato dell’indirizzo 56, dovremo visualizzare 0561 sul display (056 indirizzo + 1 comando). Visualizzato il numero corretto, si preme “invia” e il messaggio parte dalla centralina.
Nella foto è visibile lo schema a blocchi della centralina. Oltre a quanto descritto, vi è solo l’alimentatore.

Il decodificatore
Lo schema elettrico del decodificatore è visibile qui sotto. La scelta è stata quella di dotare ogni decodificatore di un alimentatore in grado di abbassare a 5v la tensione per il microcontrollore. In questo modo si riescono ad utilizzare solo i tre fili, due dei quali sono comuni con le alimentazioni delle bobine degli scambi. Da 16 a 5 si ottiene una buona stabilizzazione per il PIC anche semplicemente alimentando tramite diodo zener e condensatore il controllore.
Siccome le dimensioni del decodificatore sono davvero contenute (tutto realizzato con componenti SMD), l’aggiunta di 3 componenti non crea grossi problemi. In alternativa, per ridurre ulteriormente le dimensioni, si può prevedere un’uscita a 5v dalla centralina e aggiungere un filo al BUS.
Il jumper serve per l’assegnamento dell’indirizzo. Il decoder funziona normalmente a contatto aperto (senza jumper). Quando presente, il decoder risponde come se avesse indirizzo 0. Dalla centralina è possibile mandare il comando 0 all’indirizzo N, che vene trasmesso come comando N all’indirizzo 0 e interpretato dal decoder che risponde a 0 come comando di assegnamento indirizzo. L’indirizzo viene memorizzato in EEPROM, quindi mantenuto anche a circuito non alimentato.

decoder_schema
A circuito nuovo, va quindi fatto un lavoro di assegnamento indirizzo a tutti i decodificatori. Per comodità si può eseguire questa operazione non necessariamente con i decodificatori montati sul plastico, ma tenerceli comodamente a portata di mano (è più facile mettere e togliere il jumper). Rispetto alla soluzione spesso adottata dei DIP switch, questo metodo permette di ridurre dimensioni e costi del decoder. Visto che ormai il 12F519 costa circa 20 centesimi ed è dotato di memoria Eprom, si riesce a realizzare il decoder con i pochissimi componenti come mostrato nello schema per un costo totale inferiore all’euro!
Idee aggiuntive.
Vediamo ora alcuni spunti per ulteriori implementazioni o estensioni del dispositivo.
Si possono costruire decodificatori destinati a controllare altri dispositivi, in modo per esempio di controllare tramite relè l’illuminazione del plastico, o azionare automatismi come i motorini che muovono gru, piattaforme o altro.
In alternativa al PIC 12F519, per il decodificatore si può utilizzare un controllore con più piedini di uscita, in modo da controllare più di uno scambio con lo stesso decoder.

]]>
https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html/feed 0
Backpane per il bus I2C https://www.ognigiorno.com/2009/04/18/backpane-per-il-bus-i2c.html https://www.ognigiorno.com/2009/04/18/backpane-per-il-bus-i2c.html#respond Fri, 17 Apr 2009 23:04:51 +0000 http://www.ognigiorno.com/?p=307 Read More »Backpane per il bus I2C]]> Dotando le schede basate sul protocollo I2c di un connettore standard, può venir comodo realizzare un circuito stampato come quello presentato in foto.

bus-i2c

Si tratta di una striscia che porta in parallelo i 5 contatti, utilizzabili per il BUS i2c e per l’alimentazione.
Oltre a SDA e SCL utilizzati dal protocollo e con le resistenze di pull-up, per evitare di doverle prevedere in tutte le realizzazioni, la basetta porta altre 3 linee, utilizzate per +5V, +12V e massa.
I 12V possono essere comodi nel caso in cui il circuito debba pilotare relè o per altri impieghi per cui i 5V non bastano. In assenza questa necessità, può essere impiegata come linea di interrupt o busy, al fine di arbitrare il BUS.

]]>
https://www.ognigiorno.com/2009/04/18/backpane-per-il-bus-i2c.html/feed 0
Routine I2C per controllori PIC implementate in C https://www.ognigiorno.com/2009/03/28/routine-i2c-per-controllori-pic-implementate-in-c.html https://www.ognigiorno.com/2009/03/28/routine-i2c-per-controllori-pic-implementate-in-c.html#respond Fri, 27 Mar 2009 23:08:42 +0000 http://www.ognigiorno.com/?p=245 Read More »Routine I2C per controllori PIC implementate in C]]> Lavorando con i PIC possiamo aver bisogno di utilizzare il protocollo I2C dovendolo implementare a basso livello in C o in assembler (bit banging). Questo capita se lavoriamo con un controllore di fascia base che non offre nativamente tale funzionalità.

Purtroppo mi sono trovato in questa necessità e le routine fornite di esempio con il compilatore PICC di Hitech (il compilatore che utilizzo di solito) non sono riuscito a farle funzionare. Non so se perché errate, o se per colpa dell’ottimizzazione che nella versione freeware non è garantita.

Lavorando a basso livello è infatti avere la massima ottimizzazione.
Pazienza: dovendo lavorare con il 16F506 per il mio progetto, le ho dovute riscrivere. Il file i2c.h è scaricabile qui e contiene il codice che implementa le funzioni di base in linguaggio C.
Va notato l’utilizzo del registro TRIS. Essendo un registro in sola scrittura nel 16F506, per valorizzarlo ho utilizzato una variabile di appoggio in cui memorizzo il valore (m_TRIS). Con processori differenti è necessario modificare la gestione del registro. Per questo motivo nel file si trova nella parte iniziale e modificabile agendo sulle definizioni di SCL_IN, SCL_OUT, SDA_IN e SDA_OUT.
Ecco un esempio di come utilizzare la libreria:
i2c_init();

i2c_start();
i2c_tx(0xA2);
i2c_tx(0x02);
i2c_tx(0x00);
i2c_stop();

L’esempio riportato mostra come scrivere un valore nella EEPROM. La lettura avviene in modo analogo:
i2c_start();
i2c_tx(0xA2);
i2c_tx(0x02);

i2c_start();
i2c_tx(0xA3);
Putch (i2c_rx(1));
Putch (i2c_rx(1));
Putch (i2c_rx(0));
i2c_stop();

Questo codice invece legge dalla memoria e trasmette i valori letti sulla seriale utilizzando le librerie RS232 qui descritte

Con questa libreria è possibile quindi controllare tutti i dispositivi I2C (RTC, memorie EEPROM, …)

]]>
https://www.ognigiorno.com/2009/03/28/routine-i2c-per-controllori-pic-implementate-in-c.html/feed 0