<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6659201995721258273</id><updated>2012-02-20T10:55:22.183+01:00</updated><category term='serial'/><category term='elettronica'/><category term='mikroc'/><category term='protocol'/><category term='stabilizzato'/><category term='connection'/><category term='pic16f887'/><category term='usb'/><category term='onda quadra'/><category term='motion sensor'/><category term='PWM'/><category term='interfacing'/><category term='faxe cantenna direzionale antenna wifi wireless aircrack airodump'/><category term='treno impulsi'/><category term='robot'/><category term='asus'/><category term='oscilloscopio'/><category term='pic kit 2'/><category term='progetti'/><category term='hacking'/><category term='displacement'/><category term='16f628'/><category term='16F628A'/><category term='seriale'/><category term='eeepc'/><category term='lm2940'/><category term='alimentatore da banco'/><category term='lm317'/><category term='BIpolar stepper motor arduino robotics'/><category term='controller'/><category term='mouse'/><category term='alimentatore'/><category term='antenna'/><category term='sensors'/><category term='tester'/><category term='external antenna'/><category term='duty cycle'/><category term='pic'/><category term='usb mouse interfacing pic pic16f887 pic16f877'/><category term='robotics robot'/><category term='regolatore'/><category term='pic16f877'/><category term='breadboard'/><category term='demoboard'/><category term='collegare'/><category term='WL0025 Alfa Network 500mA'/><title type='text'>Ferret Robotics</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-8994986867627631727</id><published>2011-05-03T22:31:00.002+02:00</published><updated>2011-05-03T22:33:55.801+02:00</updated><title type='text'>Polifemo / monocular</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9NMn0wivfSA/TcBfH0NSjmI/AAAAAAAAABQ/iemYbaky3Po/s1600/monocular.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-9NMn0wivfSA/TcBfH0NSjmI/AAAAAAAAABQ/iemYbaky3Po/s400/monocular.png" width="250" /&gt;&lt;/a&gt;&lt;/div&gt;Dopo un periodo di lunga assenza, oggi vorrei descrivere un progetto che ho realizzato nei ritagli di tempo (che sono veramente pochi ultimamente). Siccome il progetto è stato riadattato per un esame universitario, quella che segue è una relazione molto "accademica".&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Lo scopo del progetto è stato elaborare e costruire hardware e software per muovere automaticamente una webcam, in modo che essa segua lo spostamento di un oggetto.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Il funzionamento è il seguente: il computer riceve un fotogramma dalla webcam ed elabora l'immagine per risalire all'eventuale posizione dell'oggetto da inseguire. Data la posizione nel fotogramma, elabora gli opportuni comandi di movimento e li invia ad una scheda di controllo, che ha il compito di controllare la posizione del motore su cui è montata la webcam.&lt;/div&gt;&lt;br /&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;I servomotori sono una tipologia di attuatori alimentati in corrente continua. In questo progetto si utilizza un servomotore per far ruotare la webcam che si trova montata su di esso.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;b&gt;Un servomotore&lt;/b&gt; presenta un connettore a tre fili:  due per l'alimentazione e uno per il trasporto dei segnali di controllo. Questi ultimi sono  segnali impulsivi periodici che trasmettono informazioni variando la durata dei propri impulsi. Prendono il nome di ''segnali PWM'', dove PWM è l'acronimo di Pulse-Width Modulation (Modulazione a Durata di Impulso). &lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Il servomotore associa alla durata degli impulsi la propria  escursione motoria: l'elettronica di controllo riceve il segnale e, confrontando la posizione ad esso associata con quella attualmente assunta dal servo, pilota il movimento del motore.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;b&gt;La scheda di collegamento&lt;/b&gt; tra il computer e il servomotore che regola la posizione della webcam è basata su un microcontrollore programmabile della serie PIC 16F628-A.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;La funzione principale di questa scheda è fornire, in modo continuativo, il segnale periodico necessario al servomotore per mantenere la sua posizione. Infatti, per il corretto funzionamento del servomotore, è necessario inviare un treno di impulsi e non un singolo segnale, che provocherebbe, invece, solo uno spostamento parziale del motore.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;Complicare l'hardware inserendo questa scheda è stata una scelta progettuale che ha portato ad una semplificazione in fase di scrittura del codice di elaborazione delle immagini: in questo modo, il computer deve occuparsi solo di elaborare un fotogramma e inviare i comandi di movimento al servomotore, senza preoccuparsi di inviare anche il segnale periodico per mantenere la posizione raggiunta.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7Vaa4FQ3Ihg/TcBc_rNDa1I/AAAAAAAAABE/8YEB5ARsNVQ/s1600/schedaControllo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-7Vaa4FQ3Ihg/TcBc_rNDa1I/AAAAAAAAABE/8YEB5ARsNVQ/s320/schedaControllo.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fuu6D_A91eY/TcBdA9ZClvI/AAAAAAAAABI/dQX1X4aNGjQ/s1600/schemaSchedaControllo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://1.bp.blogspot.com/-fuu6D_A91eY/TcBdA9ZClvI/AAAAAAAAABI/dQX1X4aNGjQ/s400/schemaSchedaControllo.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Il firmware&lt;/b&gt;, ossia il software memorizzato all'interno del microcontrollore, offre essenzialmente un'interfaccia con il servomotore. &lt;br /&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Per la stesura del codice è stato utilizzato MikroC, un IDE prodotto dalla mikroElektronika che fornisce un compilatore in linguaggio C.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Il firmware può essere suddiviso in tre blocchi: ''inizializzazione'', ''generazione degli impulsi e del ritardo'' e  ''interrupt''. Di seguito si trova il codice e la spiegazione delle singole fasi.&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;char buffer[3];&lt;br /&gt;int posizione;&lt;br /&gt;int cursore_buffer;&lt;br /&gt;char car_letto;&lt;br /&gt;&lt;br /&gt;void interrupt(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Uart1_data_ready()){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; car_letto=Uart1_Read();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(car_letto!=0x0D &amp;amp;&amp;amp; car_letto!=0x0A){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[cursore_buffer]=car_letto;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(cursore_buffer==2){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[2]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posizione=atoi(buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void main(){&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISA=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISB=0x00001000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CMCON=0x07;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.GIE=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIE1.RCIE=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.PEIE=1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1_Init(9600);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posizione=22;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RB3_bit=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0;i&amp;lt;posizione;i++) Delay_us(10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RB3_bit=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} &lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;b&gt;La fase di inizializzazione&lt;/b&gt; si occupa di configurare l'hardware del PIC e le variabili di sistema.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;b&gt;La fase di generazione degli impulsi e del ritardo&lt;/b&gt; è la fase principale del programma e consiste in un ciclo infinito. Ogni iterazione genera un impulso seguito da una pausa di circa 20 ms, in modo da produrre una frequenza di invio degli impulsi di circa 50Hz.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;b&gt;La fase di elaborazione dei comandi seriali&lt;/b&gt; è associata all'arrivo di un interrupt generato dal modulo USART del PIC a seguito della ricezione di dati dalla porta seriale. I comandi supportati dalla scheda sono tutti costituiti da un numero prefissato di caratteri. Nello specifico, la scheda si aspetta di ricevere due interi seguiti dal carattere&amp;nbsp; \t  . &lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;b&gt;Il computer richiede alla webcam un singolo fotogramma&lt;/b&gt;, e in base alle elaborazioni su tale immagine ricava la nuova posizione che dovrà assumere il servomotore. Questo processo è totalmente indipendente dalla scheda di controllo, che serve solamente per inviare comandi al servomotore.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Nelle seguenti sezioni sarà analizzato il codice che permette alla webcam di ruotare, inseguendo un fissato pattern di pixel. Il codice utilizzato si basa sulle librerie OpenCV, che forniscono numerose funzioni già implementate.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;b&gt;Inseguire un punto luminoso blu&lt;/b&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;In questo caso, l'obiettivo è inseguire un LED blu: l'algoritmo cercherà di muovere la webcam in modo da posizionare il punto luminoso al centro del fotogramma, e quindi davanti alla webcam. &lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;b&gt;Dato che si deve riconoscere un semplice LED blu&lt;/b&gt;, per rendere più efficiente l'elaborazione si estrarrà dai fotogrammi solo il canale blu. Il pattern da inseguire sarà, quindi, il punto a intensità maggiore all'interno dell'immagine.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Ovviamente, non ci si può aspettare che l'unico oggetto ad avere dei pixel sul terzo canale sia proprio il LED da seguire, ma sicuramente tale oggetto avrà una forte componente cromatica blu. &lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Questo introduce uno dei principali problemi riscontrati: se il LED si trova su uno sfondo molto luminoso verrà "confuso" con lo sfondo. La soluzione implementata prevede quindi la sottrazione del background, attraverso un metodo della libreria OpenCV: la funzione cvAbsDiff , che viene utilizzata nel codice per calcolare la differenza, in termini di pixel, tra il fotogramma appena ricevuto dalla webcam e il background.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Viene poi estratto il punto di massima intensità, che corrisponde al punto &lt;i&gt;più blu&lt;/i&gt; all'interno del fotogramma. Se questa intensità è sufficientemente elevata, viene richiamata la routine che si occupa della rotazione della webcam.&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;b&gt;Inseguire un fissato pattern di pixel&lt;/b&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;L'obiettivo rimane sempre inseguire un oggetto, ma in questo caso l'approccio è diverso: per stabilire la posizione dell'oggetto, bisogna prima procedere al campionamento dello stesso in un template che verrà poi utilizzato in fase di ricerca.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Si fa quindi ricorso al template matching, che consiste nel far scorrere un template sull'immagine da analizzare, per poi stimare la similarità tra template e sotto-immagine corrente.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Rispetto al metodo illustrato in precedenza, quindi, cambia il metodo utilizzato per stimare la posizione dell'oggetto da inseguire, ma l'algoritmo è praticamente uguale, anche se in questo caso non c'è bisogno di ricorrere alla sottrazione del background.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;La funzione della libreria OpenCV, usata per effettuare il template matching,  è la \verb cvMatchTemplate  .&amp;nbsp;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;Nell'immagine è riportato il risultato dell'applicazione della funzione ad un'immagine di esempio. La presenza dell'oggetto in un'area è più probabile quanto più l'intensità della zona si avvicina allo zero, ossia dove l'immagine risultato presenta punti scuri. E' poi possibile, utilizzando la funzione \verb cvMaxMinLoc , trovare la zona che presenta l'intensità minima all'interno del fotogramma, così da avere una buona approssimazione della posizione dell'oggetto che si sta cercando.&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RiTjU58xBGU/TcBesVBGyBI/AAAAAAAAABM/USx3XOTl5GY/s1600/risultatoMatching.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://4.bp.blogspot.com/-RiTjU58xBGU/TcBesVBGyBI/AAAAAAAAABM/USx3XOTl5GY/s400/risultatoMatching.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;Gli oggetti di cui sono stati campionati i template sono due: un quadrato fatto in cartoncino rosso e lo stesso LED usato in precedenza. &lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;La prima soluzione funziona molto bene in ambienti con poca luce, mentre il cartoncino viene rilevato all'interno delle immagini solo se la luce ambientale è sufficiente.&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9NMn0wivfSA/TcBfH0NSjmI/AAAAAAAAABQ/iemYbaky3Po/s1600/monocular.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-9NMn0wivfSA/TcBfH0NSjmI/AAAAAAAAABQ/iemYbaky3Po/s640/monocular.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;Dal link qui sotto potete scaricare il codice "lato computer" che è scritto velocemente ma rende l'idea di cosa deve fare. Ah si dovrebbe anche vedere un video.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;https://rapidshare.com/files/460463115/ledblu.zip &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/m_C6O2hh7kE?hl=it&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/m_C6O2hh7kE?hl=it&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-8994986867627631727?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/8994986867627631727/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/05/polifemo-monocular.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8994986867627631727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8994986867627631727'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/05/polifemo-monocular.html' title='Polifemo / monocular'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9NMn0wivfSA/TcBfH0NSjmI/AAAAAAAAABQ/iemYbaky3Po/s72-c/monocular.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-7640068390599806170</id><published>2011-03-20T12:09:00.001+01:00</published><updated>2011-10-01T17:46:57.229+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pic'/><category scheme='http://www.blogger.com/atom/ns#' term='controller'/><category scheme='http://www.blogger.com/atom/ns#' term='robot'/><category scheme='http://www.blogger.com/atom/ns#' term='interfacing'/><category scheme='http://www.blogger.com/atom/ns#' term='collegare'/><category scheme='http://www.blogger.com/atom/ns#' term='protocol'/><category scheme='http://www.blogger.com/atom/ns#' term='mouse'/><category scheme='http://www.blogger.com/atom/ns#' term='connection'/><category scheme='http://www.blogger.com/atom/ns#' term='serial'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><title type='text'>Interfaccia mouse ottico e PIC</title><content type='html'>&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;se volete linkare, copiare, usare ecc ecc quello che c'è scritto in questo articolo potete farlo, ma citando l'autore.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;non mi assumo responsabilità per danni a mouse, robot o alle vostre persone XD &lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" alt="" border="0" height="216" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" width="400" /&gt;&lt;/a&gt;&lt;span style="font-size: medium;"&gt;e &lt;/span&gt;&lt;span style="font-size: medium;"&gt;SI, sono io che ho pubblicato questo articolo anche su grix, quindi non l'ho copiato, è roba mia!&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;OK, COMINCIAMO! :)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per un robot che sto costruendo avevo  bisogno di un sensore di movimento preciso ed economico... cosa meglio  di un mouse ottico? solo che il pic che stavo usando non ha controller  usb...&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Per cominciare, un po' di teoria del funzionamento di un mouse ottico.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per trovare un mouse adatto ho passato  le ultime settimane smontando mouse di amici e parenti, il risultato è  che mi sono fatto un'idea di come funzionano le cose: ultimamente i  mouse economici e "cinesi" utilizzano un integrato che si "appoggia" sul  pc per funzionare, questi mouse NON vanno bene (ovviamente). Quello che  uso nel seguito l'ho pagato 3€ su una bancarella dell'usato.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;I mouse che ho provato e che mi hanno dato buoni risultati sono basati su integrati ADNS2051 e ADNS2610. &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;/div&gt;&lt;div style="clear: left; color: white; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/2051pinout.png" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/2051pinout.png" width="293" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/Adns2610_pinout.jpg" alt="" height="248" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/Adns2610_pinout.jpg" width="334" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Immagino che altri chip usino lo  stesso protocollo (o molto simile), ma io questi ho provato e questi vi  riporto. Nel seguito dell'articolo, se non diversamente specificato,  farò riferimento al ADNS2610 per le spiegazioni.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Un piccolo inciso:&lt;/span&gt;&lt;span style="font-size: medium;"&gt;  mi preme far notare che questi chip sono estremamente sensibili  all'inversione di polarità, purtroppo ho bruciato un mouse collegandolo  male, quindi bisogna fare estremo affidamento ai datasheet e controllare  più volte i fili.&lt;br /&gt;&lt;br /&gt;Tornando al discorso: gli integrati possono essere alimentati fino a 5v  utilizzando i piedini VDD e GND, saldando direttamente dei fili sui  piedini e permettendo una facile riconversione a mouse "normale" (il  resto del mouse non viene toccato o modificato in nessun modo).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Il protocollo utilizzato per la  comunicazione è di tipo seriale, bi-direzionale, half-duplex e basato su  un clock condiviso tra mouse e PIC (generato da quest'ultimo). Quindi  per il collegamento al PIC bastano due fili, da collegare ai pin SCK (il  clock) e SDIO (la linea dati), per un totale di 4 fili da saldare  sull'integrato (2 di alimentazione e 2 di comunicazione).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: left;"&gt;&lt;span style="font-size: medium;"&gt;Il mouse che ho utilizzato dopo la modifica si presenta come in foto:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/mouseMod.jpg" alt="" height="400" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/mouseMod.jpg" width="340" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Il funzionamento - in teoria&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Finora ho descritto i collegamenti, passiamo adesso alla vera e propria teoria.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Un mouse ottico è  basato su quella che viene definita "tecnologia di navigazione ottica",  ossia rileva lo spostamento attraverso l'acquisizione sequenziale di  immagini (attraverso un modulo chiamato IAS &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: medium;"&gt;Image Acquisition System&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: medium;"&gt;) e il confronto matematico di questi (attuato da un DSP, &lt;i&gt;Digital Signal Processor&lt;/i&gt;).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Nella prossima immagine  è schematizzato il funzionamento dell'integrato, dove DSP e IAS sono  integrati in quello che viene chiamato &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: medium;"&gt;"IMAGE PROCESSOR"&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/chipsensore.jpg" alt="" height="279" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/chipsensore.jpg" width="414" /&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: medium;"&gt;Nell'esploso seguente si nota il chip/sensore con il led di illuminazione e la lente di collimazione sottostante.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/esploso.jpg" alt="" height="334" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/esploso.jpg" width="391" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-size: medium;"&gt;Lo spostamento è  memorizzato (in modo automatico, quindi) nei registri interni del chip,  l'unica difficoltà è recuperare questo dato.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Il protocollo di comunicazione&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Inizialmente utilizzavo un mouse basato su &lt;/span&gt;&lt;span style="font-size: medium;"&gt;ADNS2051,  leggermente più difficile da utilizzare perché richiede una prima fase  di inizializzazione e un controllo di un registro di stato prima di ogni  lettura dei dati di spostamento. Visto che non posso fare più  esperimenti con questo mouse (causa rottura), parlerò solo del (MOLTO)  più semplice &lt;/span&gt;&lt;span style="font-size: medium;"&gt;ADNS2610, a chi è interessato posso comunque fornire il codice necessario al corretto funzionamento dei sensori come il &lt;/span&gt;&lt;span style="font-size: medium;"&gt;ADNS2051 (comunque una volta capito il funzionamento del protocollo è facilissimo implementare altre routine).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; La comunicazione  seriale è utilizzata per leggere e scrivere parametri sui registri del  mouse e per la lettura delle informazioni di spostamento (quello che  interessa a noi).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;A iniziare la comunicazione è sempre il microcontrollore:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;/div&gt;&lt;div style="color: white; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/read.jpg" alt="" height="83" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/read.jpg" width="400" /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;La lettura dello  spostamento consiste in 2 byte di dati scambiati: nel primo (il tempo  nella figura va da sinistra a destra) il PIC invia 1 byte di  informazioni, con 0 nel MSB per indicare la direzione dei dati, seguìto  dall'indirizzo del registro che vuole leggere. Il chip sul mouse  risponde con 1 byte di dati in complemento a 2, quindi il primo bit  codifica il segno e i restanti lo spostamento &lt;u&gt;rispetto all'ultima lettura&lt;/u&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;NB: se 1bit va per il  segno ci sono 7bit rimanenti, il massimo spostamento tra una lettura e  l'altra è quindi 2^7=128 (in modulo ovviamente). Come detto in  precedenza la comunicazione è sincronizzata con il clock, nello  specifico si commuta la linea dati sul fronte discendente e si legge sul  fronte ascendente (ma questo sarà molto più chiaro guardando il  codice). Come specificato sul datasheet del &lt;/span&gt;&lt;span style="font-size: medium;"&gt;ADNS2610,  bisogna attendere almeno 100uS tra l'invio del primo byte e la  ricezione delle informazioni, per permettere la preparazione dei dati  (nell'immagine precedente è indicata con una "spaccatura" tra il ciclo 8  e 9).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;A titolo di esempio, questi sono i registri presenti su &lt;/span&gt;&lt;span style="font-size: medium;"&gt;ADNS2610:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/registri.jpg" alt="" height="372" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/registri.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Particolarmente  interessante è il contenuto del registro 0x08, che permette di leggere i  pixel "visti" dal sensore, attraverso 324 letture consecutive (che  tornano l'intensità del pixel) con il seguente schema:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/pixel.jpg" alt="" height="400" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/pixel.jpg" width="391" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;conto di approfondire l'argomento in futuro, magari in un prossimo articolo, se interessa.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Un po' di pratica - il circuito&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Lo schema elettrico è molto semplice, è un  semplice PIC 16F877 clockato a 4Mhz. Ho usato la porta E per il  collegamento al mouse e la porta B per un LCD 16x2. Il tutto ovviamente a  5v.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;img alt="Image Hosted by ImageShack.us" height="321" src="http://img209.imageshack.us/img209/1576/schemas.jpg" width="400" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;realizzazione:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: medium; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/picrealizzaz.jpg" alt="" height="337" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/picrealizzaz.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Un po' di pratica - il codice&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-size: medium;"&gt;Il codice che presento è  sempre scritto in MikroC e lo trovate allegato, so che molti sono  affezionati all'ASM ma questo rende la lettura molto più semplice e  immediata. Nel seguito presento e commento un codice semplificato basato  su quello che allego.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: medium;"&gt;Questo che espongo è un po' l'"hello world" del mio progetto, ossia come ottenere le coordinate lette dal mouse&lt;/span&gt;&lt;span style="font-size: medium;"&gt;. Da qui poi è facile modificare il codice.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Cominciamo con il  main() che semplicemente legge i valori nei registri e li scrive su LCD  ciclicamente (dopo aver inizializzato le porte e il display LCD).  Ricordo che il registro contiene un valore in complemento a 2, quindi  basta sommare sempre il valore di ritorno (positivo o negativo non  importa, è solo uno spostamento dall'ultima lettura).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;void main(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_LCD_PIC(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(;;) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x += readRegister(DX); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y += readRegister(DY); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LCDWriteResult(x,y); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Come avviene la lettura dei registri è presto detto (anzi scritto):&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;span style="font-size: medium;"&gt;signed short readRegister(const unsigned short int address){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; signed short output = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DIRDATA = OUT; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //scrivi l'indirizzo del registro da leggere &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=7;i!=-1;i--){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_DATA = 1 &amp;amp;&amp;amp; ((address &amp;amp; (1&amp;lt;&amp;lt;i))&amp;gt;0); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //preparati a leggere i dati inviati &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DIRDATA=IN; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //aspetta che siano pronti &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_us(100); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=8;i!=0;i--)&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output |= MOUSE_DATA &amp;lt;&amp;lt; i-1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return output; &lt;br /&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;Spiegazione: DIRDATA codifica lo stato di ricezione o invio di dati sulla seriale. Il primo &lt;i&gt;for&lt;/i&gt;  invia il primo byte di dati al mouse, utilizzando il clock come  sincronia. Qui l'unica cosa da capire è il booleano risultante da: &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: medium;"&gt;1 &amp;amp;&amp;amp; ((address &amp;amp; (1&amp;lt;&amp;lt;i))&amp;gt;0)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per semplicità divido l'espressione:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;i&gt;&lt;span style="font-size: medium;"&gt;address &amp;amp; (1&amp;lt;&amp;lt;i)&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: medium;"&gt; fa un semplice&lt;/span&gt;&lt;span style="font-size: medium;"&gt; OR bitwise tra una maschera a singolo 1 e tutti 0 e la variabile "address".&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Il problema sorge  quando l'indirizzo del registro ha più di un bit a 1: è questo il caso,  ad esempio, del registro 0x03 (00000011 in binario) torna "2" con una  maschera come 00000010. Se si prova a scrivere "2" su &lt;/span&gt;&lt;span style="font-size: medium;"&gt;MOUSE_DATA  (che corrisponde ad UN SINGOLO bit sulla PORT del PIC) si ottiene...  niente! e quindi l'AND binario tra 1 e il risultato dell'espressione  precedente serve a tornare "1" quando l'or bitwise della maschera con  l'indirizzo del registro è maggiore o uguale a 1. Facile no? XD &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Il secondo for "compone" bit per bit il numero risultato, leggendo (sul fronte di salita del clock) i dati dal mouse. &lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;Foto del risultato:&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" alt="" height="216" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Conclusioni&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center style="color: white;"&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/ccebebWv_fI" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;div style="color: white;"&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Ho mostrato come sia possibile leggere  le coordinate di spostamento del mouse, ma questa è solo una possibile  applicazione...&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;è consentito qualsiasi uso non a scopo di lucro del codice, ma per favore citate l'autore (e possibilmente linkate questo sito) &lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Spero di non aver dimenticato  niente... per qualsiasi commento o critica (possibilmente entrambi  costruttivi...) sono a vostra disposizione.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://myfreefilehosting.com/f/f0cb9fab0d_0.1MB"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://myfreefilehosting.com/f/f0cb9fab0d_0.1MB"&gt;FILE SORGENTE ZIPPATO&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-7640068390599806170?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/7640068390599806170/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/interfacciare-un-mouse-ottico-con-un.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/7640068390599806170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/7640068390599806170'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/interfacciare-un-mouse-ottico-con-un.html' title='Interfaccia mouse ottico e PIC'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ccebebWv_fI/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-8522729178377168835</id><published>2011-03-14T11:14:00.001+01:00</published><updated>2012-02-20T10:54:12.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='motion sensor'/><category scheme='http://www.blogger.com/atom/ns#' term='pic'/><category scheme='http://www.blogger.com/atom/ns#' term='interfacing'/><category scheme='http://www.blogger.com/atom/ns#' term='robotics robot'/><category scheme='http://www.blogger.com/atom/ns#' term='mouse'/><category scheme='http://www.blogger.com/atom/ns#' term='pic16f887'/><category scheme='http://www.blogger.com/atom/ns#' term='usb mouse interfacing pic pic16f887 pic16f877'/><category scheme='http://www.blogger.com/atom/ns#' term='sensors'/><category scheme='http://www.blogger.com/atom/ns#' term='usb'/><category scheme='http://www.blogger.com/atom/ns#' term='displacement'/><category scheme='http://www.blogger.com/atom/ns#' term='pic16f877'/><title type='text'>Interfacing an optical mouse (USB) with a PIC (which doesn't have USB CONTROLLER!)</title><content type='html'>&lt;div style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;   &lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" alt="" border="0" height="216" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt; se preferite la versione in italiano la trovate nel post precedente :p&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;if you want to copy, share, use etc. etc. all or part of this article you CAN DO IT, BUT please cite me and share the link to this article.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;I'm not taking any responsibility for any kind of damage to your mouse, your PIC or yourselves XD&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;and yes, I posted this article on grix.com too (written in Italian).&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;OK, LET'S GO! :)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;I needed a cheap (and accurate) motion sensor... &lt;/span&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;&lt;span style="font-family: Arial,serif;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span lang="en-US"&gt;What could be&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: small;"&gt; better than an optical mouse for the job? BUT... my PIC doesn't have a usb controller (and I'm cheap, so I don't want to buy a new one :p ) so I had to do things my way... :)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;let's start with... “an optical mouse, how does it work????”&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;finding a useful mouse could be a bit hard: I've spent weeks trying to open up all the mice I could find (kindly offered by friends, parents etc. etc.), so I learnt what kind of chips you can get from a usb optical mouse:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;the “made in china” mice contain chips that use the computer for motion processing... that kind of mouse doesn't work well with my code, but you can find a good mouse in second-hand shops or places like that.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The mice I've tried, with good results, are based on ADNS2051 and ADNS2610 chips.&lt;/span&gt;&lt;/div&gt;&lt;div style="clear: left; color: white; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/2051pinout.png" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/2051pinout.png" width="293" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/Adns2610_pinout.jpg" alt="" height="248" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/Adns2610_pinout.jpg" width="334" /&gt;&lt;/span&gt; &lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;I think that there are probably other mice using the same protocol (or quite similar), but I only tried with those two chips. For the purposes of this article, I shall illustrate how to use the ADNS2610 chip.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;these chips are EXTREMELY sensitive to the polarity inversion: I broke a mouse just because I messed up with the polarity, so CHECK THE DATASHEET BEFORE YOU START! And check and re-check all the wires!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;You can supply the chips with VDD – GND pins by soldering the wires directly on to the pins: in that way you can easily re-convert the sensor to a “common mouse” because this is the only modification that you have to make to the mouse itself.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The protocol used for the mouse-pc communication is a serial, bi-directional, half-duplex clock driven (the clock is generated by the PIC and shared both by the mouse and the PIC). Then, for the connection, you can use two wires: SCK pin (the clock) and SDIO pin (data line). So you have to solder just 4 wires in total: 2 for supply and 2 for communication.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;This is a picture of the mouse that I used, after the mod:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/mouseMod.jpg" alt="" height="400" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/mouseMod.jpg" width="340" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;how it works: theory of operation&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;After the connection phase, let's see how the mouse works.&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;An optical mouse is based on “Optical Navigation Technology”: it contains an Image Acquisition System (IAS) and a Digital Signal Processor (DSP).&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;A mouse reads any motion by acquiring sequential images by IAS module and mathematically confronting these images to determin the displacement (by DSP module). &lt;/span&gt; &lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;In the next image you can see the logical architecture, where DSP and IAS are both integrated in the  &lt;i&gt;"IMAGE PROCESSOR".&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/chipsensore.jpg" alt="" height="279" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/chipsensore.jpg" width="414" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;div align="left"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The next diagram is of the inside of the mouse: &lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/esploso.jpg" alt="" height="334" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/esploso.jpg" width="391" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The displacement data is automatically stored in the registers of the chip... but how can we retrieve this data?&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Communication protocol&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The protocol used by ADNS2051 is harder to understand than the one used by ADNS2610 this is because it requires an initialization phase and a check on a state register before every reading. &lt;/span&gt; &lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The communication protocol is quite similar in every chip I've seen, so if you can understand the theory of operation you will be able to use any kind of mouse chip.&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;A serial communication is used for the read/write operations on the registers of the mouse chip and to read displacement informations (this is what we are interested in). &lt;/span&gt; &lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The communication is always initiated by the microcontroller.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/mouse/read.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/read.jpg" alt="" border="0" height="82" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/read.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;A read operation, meaning data that is going from the ADNS-2610 to the microcontroller, is always initiated by the microcontroller and consists of two bytes. The first byte that contains the address is written by the microcontroller and has a “0” as its MSB to indicate data direction. The second byte contains the data and is driven by the &lt;/span&gt;mouse chip. This is a byte of data (two's complemented), in which the first bit is coding the sign and the other seven bits encode the displacement data &lt;u&gt;since the last reading&lt;/u&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The maximum amount of displacement that a mouse can “feel” from reading to reading is formed by 7 bits (8 in total, but one of them is just for the sign) so 2^7=128.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;The transfer is synchronized by &lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;b&gt;SCK&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;span style="font-weight: normal;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;b&gt;SDIO &lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;span style="font-weight: normal;"&gt;is changed on falling edges of &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;b&gt;SCK &lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;span style="font-weight: normal;"&gt;and read on every rising edge of &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;b&gt;SCK&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: MyriadPro-Regular;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt; (look at the code below, it's simpler!). T&lt;span style="font-family: MyriadPro-Regular;"&gt;here are minimum timing requirements between read and write commands on the serial port: &lt;/span&gt;we have to &lt;span style="font-family: MyriadPro-Regular;"&gt;ensure that the ADNS-2610 has at least 100 μs to prepare the requested data.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;In the following image you can see the ADNS2610 registers:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/registri.jpg" alt="" height="372" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/registri.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The 0x08 register is quite interesting and useful since you can read the pixel seen by the mouse sensor by means 324 consecutive reading according to the following table. (the return value will represents the pixel intensity) &lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/pixel.jpg" alt="" height="400" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/pixel.jpg" width="391" /&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Practice – the circuit&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The table basically shows a 16F877 PIC clocked at 4Mhz. I used the E-port for the mouse connection and the B-port for a 16x2 characters LCD (everything works fine at 5v).&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;img alt="Image Hosted by ImageShack.us" height="321" src="http://img209.imageshack.us/img209/1576/schemas.jpg" width="400" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;the assembling phase:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/picrealizzaz.jpg" alt="" height="337" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/picrealizzaz.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;/div&gt;&lt;div style="color: white; margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Practice – the code&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;I wrote the code in MikroC language (you can find it attached at the end of this article). &lt;/span&gt; &lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;This is the “hello world” of my project: in this way you can retrieve the coordinates and... do what you want to do with this data.&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;Let's start with the main(), which reads the value of the registers and writes it on the LCD (in a loop, after the port and LCD initialization). &lt;/span&gt; &lt;/div&gt;&lt;div align="LEFT" style="color: white; margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The register contains a two's complement value, so you can simply add this value, which is only the displacement from the last reading phase, to the “global/final position”.&lt;/span&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: small;"&gt;void main(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_LCD_PIC(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(;;) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x += readRegister(DX); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y += readRegister(DY); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LCDWriteResult(x,y); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.21cm; }&lt;/style&gt;  &lt;br /&gt;&lt;div align="LEFT" style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;This code reads from the register (THIS IS THE CORE OF THE PROJECT):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-family: Verdana; font-size: small;"&gt;signed short readRegister(const register unsigned short int address){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; signed short output = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; signed short i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //direction WRITING&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DIRDATA = OUT;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //write address of register to be read&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=7;i!=-1;i--){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_DATA = 1 &amp;amp;&amp;amp; ((address &amp;amp; (1&amp;lt;&amp;lt;i))&amp;gt;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //direction READING&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DIRDATA=IN;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //wait for data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_us(100);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //read the data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=8;i!=0;i--)&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOUSE_CLK = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output |= MOUSE_DATA &amp;lt;&amp;lt; i-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return output;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;hr style="color: white;" /&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;explanation: DIRDATA is the read/write serial state. &lt;/span&gt; &lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The first &lt;i&gt;for&lt;/i&gt; loop sends the first byte of data to the mouse, using the clock for the synchronization.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;The second one “composes” the result bit by bit, reading the data that come from the mouse.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" alt="" border="0" height="216" src="http://www.grix.it/UserFiles/mikymouse/Image/mouse/realizzazione.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" class="youtube-player" frameborder="0" height="390" src="http://www.youtube.com/embed/ccebebWv_fI" title="YouTube video player" type="text/html" width="480"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-size: small;"&gt;Comments? Any questions? Use the “Comments” button :)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;THANKS TO TIZIANA (TES T) FOR HELPING ME WITH EVERY ITALIAN-ENGLISH TRANSLATION! &lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://myfreefilehosting.com/f/f0cb9fab0d_0.1MB"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;h1&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://sourceforge.net/projects/mousesensor/files/" target="_blank"&gt;ZIPPED SOURCE FILE&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-8522729178377168835?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/8522729178377168835/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/interfacing-optical-mouse-usb-with-pic.html#comment-form' title='14 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8522729178377168835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8522729178377168835'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/interfacing-optical-mouse-usb-with-pic.html' title='Interfacing an optical mouse (USB) with a PIC (which doesn&apos;t have USB CONTROLLER!)'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ccebebWv_fI/default.jpg' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-3420756632879474187</id><published>2011-03-07T10:07:00.006+01:00</published><updated>2011-10-01T16:40:45.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='treno impulsi'/><category scheme='http://www.blogger.com/atom/ns#' term='PWM'/><category scheme='http://www.blogger.com/atom/ns#' term='onda quadra'/><category scheme='http://www.blogger.com/atom/ns#' term='16f628'/><category scheme='http://www.blogger.com/atom/ns#' term='pic'/><category scheme='http://www.blogger.com/atom/ns#' term='mikroc'/><category scheme='http://www.blogger.com/atom/ns#' term='seriale'/><category scheme='http://www.blogger.com/atom/ns#' term='pic kit 2'/><category scheme='http://www.blogger.com/atom/ns#' term='duty cycle'/><category scheme='http://www.blogger.com/atom/ns#' term='oscilloscopio'/><category scheme='http://www.blogger.com/atom/ns#' term='16F628A'/><title type='text'>PWM seriale pic 16F628</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/--ncSOcIRMQM/TXJ6InrWAtI/AAAAAAAAAAw/jZ71PEKm8JI/s1600/oscilloscopio.JPG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="https://lh3.googleusercontent.com/--ncSOcIRMQM/TXJ6InrWAtI/AAAAAAAAAAw/jZ71PEKm8JI/s320/oscilloscopio.JPG" width="320" /&gt;&lt;/a&gt;Per un progetto che vedrete prossimamente, avevo bisogno di generare un segnale PWM dalla seriale del pc... il problema principale è che mi serviva di continuare a generare lo stesso segnale anche dopo aver staccato il cavo di collegamento al pc. Bene, basta un pic, un max232 e una manciata di componenti a contorno. &lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;questo è il circuito che ho realizzato:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-6DE6PqwB6RA/TXJ9idJBZoI/AAAAAAAAAA4/3NmUBv0QHtg/s1600/schema.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="https://lh5.googleusercontent.com/-6DE6PqwB6RA/TXJ9idJBZoI/AAAAAAAAAA4/3NmUBv0QHtg/s400/schema.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;I componenti sono pochi e la lista precisa è la seguente:&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22pF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22pF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,47uF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;C9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100nF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;IC1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC16F628A&lt;br /&gt;IC2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAX232&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;IC3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LM2940T&lt;br /&gt;Q1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.000Hz&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;Q5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRF540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;R4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100ohm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;I più attenti noteranno che sul circuito che ho realizzato manca il MOSFET... si lo so, all'ultimo momento ho pensato che tanto non mi serviva di controllare l'accensione e lo spegnimento degli impulsi PWM, quindi non l'ho più messo.&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;Per chi non lo sapesse, il 2940 è un regolatore di tensione fisso a 5v LDO (Low Drop Out) che regge fino a 1Ampere circa. Lo uso spesso perché mi permette di alimentare i circuiti "come viene", senza dovermi preoccupare di fornire 5v stabili (di solito uso pacchi batterie da modellismo).&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;Per la realizzazione ho usato un semplice millefori, non mi andava di fare lo stampato e comunque non è che il circuito sia poi così difficile da assemblare&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-XaT5yhUt4jc/TXJ6L4OwT2I/AAAAAAAAAA0/E2lue4McKMw/s1600/pezzi.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="https://lh6.googleusercontent.com/-XaT5yhUt4jc/TXJ6L4OwT2I/AAAAAAAAAA0/E2lue4McKMw/s320/pezzi.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;e questo è il codice MikroC necessario per far funzionare il tutto:&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;char buffer[4];&lt;br /&gt;int posizione;&lt;br /&gt;int cursore_buffer;&lt;br /&gt;char car_letto;&lt;br /&gt;&lt;br /&gt;void interrupt(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Uart1_data_ready()){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; car_letto=Uart1_Read();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(car_letto!=0x0D &amp;amp;&amp;amp; car_letto!=0x0A){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[cursore_buffer]=car_letto;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(cursore_buffer==3){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[3]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posizione=atoi(buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void main(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISA=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISB=0x00001000;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CMCON=0x07;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.GIE=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIE1.RCIE=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.PEIE=1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UART1_Init(9600);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM1_Start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM1_Init(50000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursore_buffer=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posizione=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM1_Set_Duty(posizione);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PWM1_Set_Duty(posizione);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;}&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;Vorrei solo far notare che l'interrupt dalla seriale è generato ogni volta che arrivano dei dati, ma è un canale orientato al byte, e quindi ogni volta che si chiama la read si legge un byte. Per questo è necessario concatenare l'input e solo dopo convertirlo in numero. NO, non esiste una read bloccante o se esiste (e io non l'ho vista) non la potevo usare dentro la procedura di interrupt, che già è troppo lunga così).&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;Ovviamente la sintassi per generare i PWM è la stessa seguita dall'struzione MikroC. Il PIC si aspetterà sulla seriale un numero di 3 cifre, quindi se volete passare "8" alla PWM1_Set_Duty dovrete in realtà scrivere "008".&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;In conclusione si tratta di un circuito semplice e fine a se stesso, in realtà stiamo controllando un segnale dalla porta del pc semplificando la programmazione di quest'ultimo, visto che non si dovranno generare i treni di impulsi. Ma non vorrei rivelare troppo sul progetto che sto portando avanti, maggiori dettagli nei prossimi articoli!&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;E questo è il risultato finale:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/--ncSOcIRMQM/TXJ6InrWAtI/AAAAAAAAAAw/jZ71PEKm8JI/s1600/oscilloscopio.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="215" src="https://lh3.googleusercontent.com/--ncSOcIRMQM/TXJ6InrWAtI/AAAAAAAAAAw/jZ71PEKm8JI/s320/oscilloscopio.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Duty cycle del 50% circa &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-3420756632879474187?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/3420756632879474187/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/03/pwm-seriale-pic-16f628.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3420756632879474187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3420756632879474187'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/03/pwm-seriale-pic-16f628.html' title='PWM seriale pic 16F628'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/--ncSOcIRMQM/TXJ6InrWAtI/AAAAAAAAAAw/jZ71PEKm8JI/s72-c/oscilloscopio.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-3905684315366283794</id><published>2011-02-21T21:42:00.003+01:00</published><updated>2011-02-21T21:45:32.496+01:00</updated><title type='text'>termostato PIC-based con isteresi</title><content type='html'>&lt;div style="color: white;"&gt;&lt;span style="clear: left; float: left; font-size: medium; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/sensoreDanilo/realizzazione.jpg" alt="" height="240" src="http://www.grix.it/UserFiles/mikymouse/Image/sensoreDanilo/realizzazione.jpg" width="320" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;premessa: questo articolo è presente anche su grix.it.&lt;/div&gt;&lt;div style="color: white;"&gt;Quello che vi mostro oggi è un semplice  termostato/attuatore a isteresi basato su PIC 16F690 (questo avevo e  questo ho usato) e il solito LM35. Il circuito è semplice, quindi  l'attenzione vorrei porla sulla spiegazione del codice da caricare sul  PIC, che sarà scritto in mikroC e abbondantemente commentato per  permettere anche a chi non ne sa niente di capire di cosa si sta  parlando.&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: medium;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Descrizione&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Ho utilizzato un 16F690 perché, tra i PIC  che avevo a disposizione, è l'unico con un ingresso analogico. In  questo modo nonho dovuto utilizzare altri componenti per leggere la  temperatura rilevata dal sensore. Il circuito risultante è pulito e  semplice, in grado di resistere nel tempo senza dover subire  manutenzione di nessun tipo (verrà posizionato in un posto poco  accessibile). &lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Che vuol dire isteresi? Con l'isteresi si definisce una "finestra" &lt;/span&gt;&lt;span style="font-size: medium;"&gt;di  funzionamento, in cui un attuatore viene azionato senza il pericolo di  avere instabilità attorno ad un valore. Mi spiego meglio: diciamo che  vogliamo far accendere una lampadina se con un sensore si misurano 25  gradi. Che succede se la temperatura comincia ad oscillare tra 25,001 e  24,999 gradi? succede che la lampadina comincia a "sfrigolare" (termine  altamente tecnico/elettronico che rende bene l'idea). La soluzione è  creare un sistema che, superata una certa soglia S1 non si spegne fino  al raggiungimento di una soglia S2, dove S2&amp;lt;S1. Tornando all'esempio  precedente, la lampada non si spegne fino, ad esempio, al raggiungimento  dei 23 gradi, cioè una soglia minore di 25.&lt;/span&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Come funziona un LM35? Questo sensore  è, secondo me, il più facile in assoluto da interfacciare con un pic (ma  anche con un Arduino, in realtà). E' il solo alimentato tra 0 e +5 V e  può misurare solo temperature positive. Sul datasheet, comunque, sono  presenti vari metodi per ottenere anche la misurazione di temperature  negative. Nel mio caso questo non era necessario, e ho utilizzato il  sensore semplicemente interfacciandolo al pic, come visto in molti altri  tutorial in rete.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;L'idea di base del progetto che volevo  realizzare è semplice: il sensore misura la temperatura ad intervalli  regolari. Quando si preme un pulsante apposito, la temperatura corrente  viene memorizzata. Il sistema cerca poi di  mantenersi attorno al valore  rilevato in precedenza, accendendo una pompa di ricircolo per il  raffreddamento se si dovessero rilevare temperature superiori a quella  memorizzata e spegnendola in caso di temperature inferiore. &lt;/span&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Circuito &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Come dicevo il circuito è molto semplice&lt;/span&gt;&lt;span style="font-size: medium;"&gt;,  ci sono dei 3 led che indicano lo stato del sistema: un led lampeggia  quando si è impostata la temperatura di riferimento, altri due led  indicano se l'attuatore è acceso o spento (come fosse una configurazione  binaria: o è acceso un led oppure l'altro). &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Con un pulsante (in pullup) è possibile impostare la temperatura che dovrà poi essere mantenuta.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Un comune relais a 6V è comandato da un transistor "general purpose", l&lt;/span&gt;&lt;span style="font-size: medium;"&gt;'alimentazione (5V) è fornita da un alimentatore esterno, quindi nessun regolatore di tensione è presente a bordo del circuito.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;In più, ho previsto un connettore per poter caricare il firmware all'interno del pic senza doverlo smontare (ICSP).&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;/div&gt;&lt;h1 align="center" style="color: white; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/sensoreDanilo/schema.png" alt="" height="238" src="http://www.grix.it/UserFiles/mikymouse/Image/sensoreDanilo/schema.png" width="400" /&gt;&lt;/h1&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&amp;nbsp;  &lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Codice &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Qui di seguito il  codice da utilizzare, diviso in base alla funzione svolta e commentato.  Le porte del PIC sono impostate come sullo schema precedente.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;La funzione di init del  PIC ha solamente il compito di inizializzare i registri interni e di  abilitare gli interrupt (servirà poi per capire quando è stato premuto  il pulsante per impostare la temperatura da mantenere).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: medium;"&gt;void init()&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //abilita interrupt sulla porta RA4 + globali&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.GIE=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.INTE=1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ANSEL=0b00000010;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configura RA1 come ingresso analogico&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ANSELH=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADCON0=1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //abilita ADC&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CM1CON0=0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //disabilita tutti i comparatori&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CM2CON0=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //PORTA input il resto output&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISA=0xFF;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTA=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISB=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRISC=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per poter accendere l'utilizzatore (che in questo caso, come già detto è una pompa di ricircolo) utilizzo la seguente funzione:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;void accendiPompa(){&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ACCENDI LA POMPA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F6=1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //STATO POMPA ACCESA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F4=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F5=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(adc_rd&amp;gt;temperaturaImpostata-1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(2000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd&amp;nbsp; = ADC_read(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd *= 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd /= 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //la temperatura si è abbassata&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //spegni la pompa e esci&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F6=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //STATO POMPA SPENTA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F4=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F5=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;}&lt;/span&gt;&lt;span style="font-size: medium;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;lmportante, qui e nel  seguito, è notare la presenza della variabile "flag" che serve per poter  entrare nella procedura di impostazione della temperatura a seguito  della pressione del pulsante collegato al PIC.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Il tutto è richiamato da una procedura main:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;void main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int valore;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //lettura della temperatura salvata in memoria (con protezione)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ee_read(0,&amp;amp;temperaturaImpostata,sizeof(int));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temperaturaImpostata=min(temperaturaImpostata,MAX_TEMP);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=0; //interrupt non ancora avvenuto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //stato: POMPA SPENTA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F4=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F5=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTC.F6=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //leggi il valore dal sensore&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd&amp;nbsp; = ADC_read(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd *= 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc_rd /= 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //decidi se accendere o no la pompa&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(adc_rd&amp;gt;=temperaturaImpostata+1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contatore=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; accendiPompa();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //se c'è stato un interrupt allora salva il nuovo valore&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //valori MIN e MAX di sicurezza&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valore=min(adc_rd,MAX_TEMP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valore=max(adc_rd,MIN_TEMP);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //salva valore in memoria&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ee_write(0,&amp;amp;valore,sizeof(int));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //e nella variabile (evita accessi in EEPROM)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temperaturaImpostata=valore;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //lampeggia&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=0;i&amp;lt;4;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB.F6=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(125);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTB.F6=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(125);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //letture ogni mezzo secondo CIRCA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Sulle prime istruzioni  per il salvataggio e il ripristino della temperatura tornerò tra poco.  Intanto vorrei commentare quello che succede "a regime". La temperatura  viene rilevata ogni mezzo secondo circa. La precisione non mi  interessava molto, infatti uso l'oscillatore interno del PIC invece del  quarzo esterno, sempre per avere un circuito il più semplice e meno  soggetto ad usura. Bene, è arrivato il momento di discutere un problema  che mi si è posto durante la progettazione: Il funzionamento del  circuito, come ho detto, è semplice: si preme un pulsante e il sistema  cerca di mantenere la temperatura attorno a quella rilevata in quel  momento. Che succede quando si spegne il circuito? la temperatura  memorizzata viene persa. Per questo motivo ho introdotto le seguenti due  routine:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: medium;"&gt;void ee_write(unsigned int ee_addr, int *p, int size){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (size-- != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_Write(ee_addr++, *p++);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Delay_ms(20);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 20ms is microC recommendation */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;void ee_read(unsigned int ee_addr, int *p, int size){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (size-- != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *p++ = EEPROM_Read(ee_addr++);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Queste hanno il compito  di "spezzare" un int in byte e memorizzarlo in locazioni di memoria  sequenziali (l'indirizzamento qui è sempre al byte). Ovviamente lo  stesso vale anche per ripristinare il valore dalla memoria. Utilizzo una  variabile globale per non dover accedere ogni volta in memoria (visto  che comunque nei pic questo tipo di letture si possono fare solo un  numero finito di volte, molto elevato ma sempre finito).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Chiudo spendendo due  parole sulla routine di gestione dell'interrupt: questa viene richiamata  in automatico da mikroc quando si genera un interrupt esterno, e non fa  altro che settare una variabile globale che poi viene "catturata"  durante l'esecuzione del programma (vedere funzione main).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;void interrupt(void){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay_ms(1000);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //evita problemi con la pressione del pulsante&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTCON.INTF=0;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Realizzazione&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Ecco il circuito stampato finito e  assemblato (con la famosa tecnica dello stira e ammira). La pinzetta che  si vede la stavo utilizzando per dialogare con il pic tramite seriale  (per debug).&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white; text-align: center;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/sensoreDanilo/realizzazione.jpg" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/sensoreDanilo/realizzazione.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-3905684315366283794?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/3905684315366283794/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/termostato-pic-based-con-isteresi.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3905684315366283794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3905684315366283794'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/termostato-pic-based-con-isteresi.html' title='termostato PIC-based con isteresi'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-1354155266534066931</id><published>2011-02-14T10:07:00.001+01:00</published><updated>2011-02-14T10:07:00.787+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alimentatore'/><category scheme='http://www.blogger.com/atom/ns#' term='stabilizzato'/><category scheme='http://www.blogger.com/atom/ns#' term='breadboard'/><category scheme='http://www.blogger.com/atom/ns#' term='progetti'/><category scheme='http://www.blogger.com/atom/ns#' term='lm2940'/><title type='text'>Alimentatore 5v per breadboard</title><content type='html'>&lt;div style="color: white;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/funzionamento.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/funzionamento.jpg" alt="" border="0" height="218" src="http://www.grix.it/UserFiles/mikymouse/Image/funzionamento.jpg" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Spesso lavorando con le breadbord si  sente la necessità di un alimentazione stabilizzata, si ricorre quindi  ai soliti integrati 7805 ecc. con lo svantaggio di dover ogni volta  assemblare il circuito di alimentazione, o lasciarlo sempre montato  rubando spazio per il progetto che si sta realizzando.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;strong&gt;&lt;span style="font-size: large;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Ho voluto utilizzare un integrato del  tipo LM2940, poco diffuso ma secondo me valido: è un regolatore di  tensione fisso di tipo LDO a 5v con 1A di corrente massima in uscita. La  sigla LDO sta per "Low Drop Out", infatti questo regolatore ha solo  0,5v di drop out, il che permette di alimentare il circuito anche con  poco più di 5v. Il funzionamento di un regolatore è relativamente  semplice, bisogna solo inserire (come specificato sul datasheet &lt;/span&gt;www.wulfden.org/downloads/datasheets/LM2940.pdf&lt;span style="font-size: medium;"&gt;) due condensatori che hanno il compito di fornire un "buffer" di corrente.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Solitamente le breadbord presentano  l'alimentazione da entrambi i lati, in alcuni casi questa soluzione si  rivela una comodità perché ci permette di avere due differenti voltaggi a  cui collegare i componenti. Per non dover rinunciare a questo  particolare ho inserito un jumper (sostituibile facilmente con un dip  switch ad esempio) per selezionare l'alimentazione per la "seconda linea  di alimentazione" della breadboard. Quindi, una linea sarà sempre a 5v  mentre per l'altra si può scegliere tra: &lt;/span&gt;&lt;/div&gt;&lt;ul style="color: white;"&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;nessuna alimentazione (togliendo del tutto il jumper)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;5v&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;alimentazione diretta dal trasformatore (non stabilizzata)&lt;/span&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;strong&gt;&lt;span style="font-size: large;"&gt;Realizzazione&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Per prima cosa, anche se il circuito è  semplice, ho usato Eagle per disegnare lo schema e il pcb. Poi tramite  PovRay ho renderizzato lo schema per avere un idea di come sarebbe  venuto. Quindi ho realizzato il circuito su millefori (è un progetto un po' vecchio e ancora non avevo cominciato a farmi gli stampati da solo). Di seguito le  immagini relative alla progettazione e alla realizzazione:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/schema.png" alt="" height="213" src="http://www.grix.it/UserFiles/mikymouse/Image/schema.png" width="400" /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/pcb.png" alt="" height="320" src="http://www.grix.it/UserFiles/mikymouse/Image/pcb.png" width="400" /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alimentatore.jpg" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/alimentatore.jpg" width="400" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;a _fcksavedurl="/UserFiles/mikymouse/File/alimentatore.zip" href="http://www.grix.it/UserFiles/mikymouse/File/alimentatore.zip"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;realizzazione - componenti necessari: &lt;/span&gt;&lt;/div&gt;&lt;ul style="color: white;"&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;connettore da 2,5 (al trasformatore, io ne uso uno da 12v)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;del filo sottile rigido per le saldature&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;la basetta millefori tagliata a misura della breadboard&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;led e relativa resistenza (220Ohm per funzionare a 5v) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;jumper per selezionare l'alimentazione (vedere sezione precedente) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;regolatore di tensione LM2940 con relativi condensatori e dissipatore di calore&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/componenti.jpg" alt="" height="201" src="http://www.grix.it/UserFiles/mikymouse/Image/componenti.jpg" width="400" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;realizzazione - lato saldature (qui non avevo ancora tagliato i connettori del regolatore di tensione)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/saldature.jpg" alt="" height="166" src="http://www.grix.it/UserFiles/mikymouse/Image/saldature.jpg" width="400" /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;realizzazione - collaudo finale&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/funzionamento.jpg" alt="" height="218" src="http://www.grix.it/UserFiles/mikymouse/Image/funzionamento.jpg" width="400" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-1354155266534066931?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/1354155266534066931/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/alimentatore-5v-per-breadboard.html#comment-form' title='7 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/1354155266534066931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/1354155266534066931'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/alimentatore-5v-per-breadboard.html' title='Alimentatore 5v per breadboard'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-8981182865332692693</id><published>2011-02-07T10:07:00.002+01:00</published><updated>2011-02-07T10:07:00.687+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pic'/><category scheme='http://www.blogger.com/atom/ns#' term='progetti'/><category scheme='http://www.blogger.com/atom/ns#' term='elettronica'/><category scheme='http://www.blogger.com/atom/ns#' term='demoboard'/><title type='text'>Demoboard modulare per pic</title><content type='html'>&lt;div style="color: white;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/final.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/final.jpg" alt="" border="0" height="232" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/final.jpg" width="320" /&gt;&lt;/a&gt;&lt;span style="font-size: medium;"&gt;Questa  è la demoboard che ho usato nel progetto del mouse interfacciato con il  PIC... volevo farvela veder eun po' più nel dettaglio :)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Una  parte  della demoboard rimane sempre costante (però non è detto,  potrebbe  cambiare anche questa), mentre lo zoccolo porta pic cambia in  base al  pic che si vuole usare.&lt;br /&gt;Questa scelta ha inoltre l'enorme vantaggio (per chi come me ha   cominciato da pochissimo con l'elettronica) di permettere un buon debug:   se non funziona un modulo (o se questo si rompe) si butta e se ne   costruisce un altro mantenendo intatto il resto della demoboard.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per  la realizzazione ho usato una scatola  in plastica (ne potete avere 3  per 2€ nel "negozio svedese")  opportunamente modificata mentre il  circuito è  realizzato su millefori...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&amp;nbsp;Inizialmente la scatola si presenta così:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/scatola.jpg" alt="" height="281" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/scatola.jpg" width="400" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Nelle prossime sezioni descriverò i principali moduli, ma la demoboard è pensata per essere ampliata o modificata a piacere.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Ogni modulo ha un connettore per l'alimentazione che proviene dal "modulo di alimentazione" (5v stabilizzati).&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Modulo base&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Questo  è lo zoccolo  porta pic, permette di avere a disposizione le porte del  pic su una  stripline femmina a cui si possono connettere normali pin o  infilare  fili volanti. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Su questo modulo è  saldato anche un porta quarzo (un socket a 8 pin).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;C'è  un pulsante di  reset che collega MCLR a massa (normalmente invece  questo pin è  collegato al positivo con una resistenza di pullup), un  led per  segnalare l'alimentazione e il connettore per ICSP (per la   programmazione del pic con programmatori Microchip). Di seguito lo   schema e le foto della realizzazione per pic 16f628.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&amp;nbsp;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloBase(1).png" alt="" height="242" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloBase%281%29.png" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Si  nota nello schema il  diodo 1N4148 che permette di riprogrammare il pic  anche con  l'alimentazione della demoboard inserita (parlo di  programmatori come ad  esempio il picKit2) e un condensatore da 100nf  per l'eliminazione di  eventuali disturbi tra il polo positivo e la  massa.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloBaseRealizz.jpg" alt="" height="191" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloBaseRealizz.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloBaseRelizzQuarzo.jpg" alt="" height="238" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloBaseRelizzQuarzo.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloBaseSaldature.jpg" alt="" height="203" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloBaseSaldature.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Modulo di alimentazione&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Ho  progettato e  realizzato un regolatore di tensione fisso a 5v  utilizzano un lm2940 e  una manciata di condensatori aggiuntivi...  Non  ho fatto foto di questo modulo realizzato, ma si vede nelle foto   finali.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloAlim.png" alt="" height="268" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloAlim.png" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Moduli aggiuntivi - led e pulsanti&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Non  mi dilungo tanto su  questa parte, ho solo collegato 6 led ad  altrettanti pin in modo da  poterli collegare alle porte del pic  all'occorrenza. I led sono  collegati a massa con una resistenza da  220Ohm, quindi basta alzare la  porta del pic per far accendere il led.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloLed.jpg" alt="" height="227" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloLed.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Ho  poi creato un modulo  su cui ho inserito dei pulsanti e bottoncini di  recupero da un vecchio  mouse, tutti con resistenze di pull up. C&lt;/span&gt;&lt;span style="font-size: medium;"&gt;'è   poi un trimmer il cui comune si può collegare ad una porta del pic e   gli altri due connettori vanno a massa e al positivo (niente di nuovo   insomma).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloSwitch.jpg" alt="" height="209" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloSwitch.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Ulteriori moduli&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Nella  mia realizzazione  ho inoltre inserito un display LCD (qui il "modulo"  comprende solo  l'alimentazione e un potenziometro per regolare il  contrasto) sulla  parte frontale e un modulo RS232 (usando il solito  MAX232) nella parte  interna della scatola (dove trova posto anche  l'alimentatore). &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/moduloSeriale.png" alt="" height="236" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/moduloSeriale.png" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Questa è una vista a coperchio alzato.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&amp;nbsp;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/dentro(1).jpg" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/dentro%281%29.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Conclusioni&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Questo è il risultato finale, &lt;/span&gt;&lt;span style="font-size: medium;"&gt;si vede anche una piccola breadboard sulla parte superiore della scatola.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt; &lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/final.jpg" alt="" height="291" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/final.jpg" width="400" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;particolare con interruttore di accensione/spegnimento della breadboard:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/demoboard/final2.jpg" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/demoboard/final2.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;spero  che possa essere un'idea  interessante per qualcuno che come me cercava  "ispirazione"... in futuro  penso di inserire almeno un modulo con  display 7 segmenti, ma se avete  suggerimenti sono qui.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-8981182865332692693?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/8981182865332692693/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/demoboard-modulare-per-pic_07.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8981182865332692693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/8981182865332692693'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/02/demoboard-modulare-per-pic_07.html' title='Demoboard modulare per pic'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-5375585807894846904</id><published>2011-01-31T10:07:00.004+01:00</published><updated>2011-01-31T10:15:29.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alimentatore'/><category scheme='http://www.blogger.com/atom/ns#' term='alimentatore da banco'/><category scheme='http://www.blogger.com/atom/ns#' term='regolatore'/><category scheme='http://www.blogger.com/atom/ns#' term='lm317'/><category scheme='http://www.blogger.com/atom/ns#' term='elettronica'/><category scheme='http://www.blogger.com/atom/ns#' term='tester'/><title type='text'>Micro-alimentatore da banco (molto) economico</title><content type='html'>&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/infunzione%282%29.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/infunzione(2).jpg" alt="" border="0" height="400" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/infunzione%282%29.jpg" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;do you want me to translate this article in English?ask me in the "comments" :)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Come realizzare un alimentatore regolabile con un tester cinese da pochi euro, un LM317 e  qualche componente a contorno?&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Utilizzando spesso breadboard e piccoli  circuiti può nascere l'esigenza di avere un alimentatore regolabile di  poca potenza e di non voler spendere soldi per un vero alimentatore da  banco.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;L'occorrente per la costruzione del mio micro-alimentatore è:&lt;/span&gt;&lt;/div&gt;&lt;ul style="color: white;"&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;un tester qualsiasi, io ne ho usato uno pagato 6€ su una bancarella, ma ne ho visti anche a 2€!&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;LM317 + componenti a contorno: 4 condensatori, 2 diodi e un potenziometro (vedere sezione dedicata)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: medium;"&gt;connettore da 2,5 per l'alimentazione e pulsanti di accensione/spegnimento&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;ho stimato che la spesa per tutto l'occorrente non supera i 10€ e per la realizzazione non serve più di una giornata....&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;All'apertura il tester si presenterà così:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;span style="font-size: medium; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/inizioaperto.jpg" alt="" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/inizioaperto.jpg" width="400" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&amp;nbsp;&lt;span style="font-size: medium;"&gt;Dopo aver aperto il tester  consiglio, per prima cosa, di incollare il piccolo schermo LCD in modo  che non si possa muovere: ritrovare il corretto posizionamento non è  cosa semplice.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Idea del funzionamento&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;L'alimentazione è  fornita da un'alimentatore a 12v esterno al tester, collegato con un  connettore 2,5 da pannello (nella parte sinistra della prossima  immagine). Con un pulsante (in alto a destra nella foto) si accende e si  spegne l'alimentatore da banco e un led avvisa dello stato (on/off).  Questo può permettere di conservare alcune funzionalità del tester  (vedere sezioni successive). Per ottenere un alimentatore "tascabile" ma  capace di erogare 1,5A c'è bisogno di un dissipatore di calore sul  regolatore di tensione, ma all'interno del tester lo spazio è troppo  poco. Ho quindi deciso di posizionare un dissipatore da cpu (un 486)  nella parte frontale (ma esterna) del tester. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;La prossima sequenza di immagini chiarirà il procedimento:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/ideaposizione.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/ideaposizione.jpg" alt="" border="0" height="320" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/ideaposizione.jpg" width="228" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;In basso si vede la  posizione del regolatore: praticamente si troverà nell'alloggiamento  della batteria, sotto ad essa (come se fosse un doppio fondo). &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;In questa immagine si vede anche il posizionamento del connettore di alimentazione e del pulsante di accensione.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Successivamente ho quindi forato la parte frontale del tester&lt;/span&gt;&lt;span style="font-size: medium;"&gt; e creato i fori di fissaggio per il dissipatore. &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/bucodavanti.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/bucodavanti.jpg" alt="" border="0" height="300" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/bucodavanti.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Dopo il montaggio del dissipatore e del regolatore nella parte posteriore, il tester appare così:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;a href="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/regolatoreposizionato.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/regolatoreposizionato.jpg" alt="" border="0" height="320" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/regolatoreposizionato.jpg" width="228" /&gt;&lt;/a&gt;&lt;span style="font-size: medium; margin-left: 1em; margin-right: 1em;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/primodissipatore.jpg" alt="" height="320" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/primodissipatore.jpg" width="211" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: white; text-align: center;"&gt;&lt;/div&gt;&lt;div style="color: white; margin-left: 1em; margin-right: 1em;"&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Il regolatore non da  fastidio alla batteria perchè di fatto si trova ad un livello più basso,  mentre i piedini sono al livello della scocca. Bisogna inoltre prestare  attenzione affinché il selettore del tester possa girare anche dopo  aver montato il dissipatore.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Funzionamento del regolatore&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Colgo l'occasione per  spiegare velocemente il circuito con l'integrato LM317.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Premetto che questa è  "la spiegazione che avrei sempre voluto avere io e non ho mai trovato",  quindi è probabile che chi ne sa già di elettronica possa storcere la  bocca, ma per chi come me è alle prime armi (spero) chiarirà qualche  punto dell'uso dei regolatori.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/schema.jpg" alt="" height="175" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/schema.jpg" width="400" /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;partendo da sinistra:&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;C1:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  I regolatori di tensione in generale (e LM317 non fa eccezione) sono  progettati per funzionare con delle buone sorgenti di tensione in  ingresso. Siccome per il funzionamento io utilizzo un alimentatore 12v  (pure questo da bancarella o poco più) poco affidabile, e con un lungo  cavo tra trasformatore e connettore, questo può comportarsi da  induttanza posta in serie all'ingresso. Per evitare problemi con il  ripple rejection (il "residuo" di corrente alternata che rimane dopo il  ponte raddrizzatore all'interno dell'alimentatore da 12v) si inserisce  per prima cosa questo condensatore. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;C4:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  questo condensatore deve essere posto vicino al piedino di ingresso del  regolatore e serve ad evitare le auto-oscillazioni. Nelle foto del  progetto finito si vede che l'ho proprio saldato al piedino.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;D2:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  si tratta di un diodo di protezione per il regolatore. Quando il  condensatore di uscita è grande si rischia, una volta spento  l'alimentatore del circuito, che il condensatore si scarichi sull'uscita  del LM317. Con questo diodo posto in antiparallelo, la corrente evita  di passare nel regolatore "nel verso sbagliato".&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;C3:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  La funzione di questo condensatore è quella di fornire una tensione più  stabile possibile al piedino di regolazione del regolatore.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;D1:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  anche questo è un diodo di protezione. La sua funzione è semplicemente  quella di scaricare il condensatore C3 in caso di cortocircuito. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;R1 e R3:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  queste sono le resistenze che permettono si variare la tensione in  uscita dal regolatore. Per il calcolo del valore vi rimando al  datasheet. In questa sede basta sapere che con un potenziometro da 5k e  una resistenza da 220Ohm si varia la tensione tra 1,3v e 12v circa  (comunque molto dipende dalla tensione erogata dall'alimentatore che si  utilizza). Come specificato sul datasheet ufficiale la resistenza va  saldata il più vicino possibile al piedino dell'integrato. &lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;C2:&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style="font-size: medium;"&gt;  questo condensatore si comporta come un "serbatoio". Sul datasheet  sembrerebbe di secondaria importanza, ma per esperienza personale è  molto importante che ci sia (nella prima realizzazione di questo  alimentatore lo avevo omesso, il risultato è stato un alimentatore  stabile solo sopra ai 6v).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: large;"&gt;Montaggio&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt; Questo è come si presenta il tester a montaggio ultimato:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/finitoordinatodentro.jpg" alt="" height="326" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/finitoordinatodentro.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;La batteria da 9v  originale (in basso a sinistra) è stata avvolta nel nastro isolante per  evitare che possa cortocircuitare i piedini del regolatore&lt;/span&gt;&lt;span style="font-size: medium;"&gt; (per sicurezza anche i piedini del regolatore andranno isolati).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Il connettore di alimentazione è stato sostituito da uno migliore "ad incastro". &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Non avendo a  disposizione un potenziometro da 5k ne ho usato momentaneamente uno da  10k ricavato da una vecchia ventola (serviva per la regolazione della  velocità), e l'ho posizionato nella parte superiore del tester (nella  foto si trova a destra).&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per utilizzare il  tester come alimentatore da banco basta collegare i puntali e  utilizzarli come fossero i poli di un qualsiasi alimentatore.&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="color: white;"&gt;&lt;span style="font-size: large;"&gt;Conclusioni&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;La funzionalità del tester viene  compromessa, si potrà utilizzare al massimo per misurare piccole  tensioni, le altre misurazioni saranno falsate dalla presenza del carico  costituito dal circuito del regolatore. Si può comunque inserire un  interruttore che permetta di disabilitare il circuito, interrompendo  quelli che&amp;nbsp; nelle foto sono i fili di colore rosso e nero che dal  regolatore vanno agli spinotti del tester.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;Per qualsiasi proposta o commento sono qui :)&lt;br /&gt;&lt;br /&gt;Il tester finito&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;span style="font-size: medium;"&gt;&lt;img _fcksavedurl="/UserFiles/mikymouse/Image/alibanco/finale.jpg" alt="" height="258" src="http://www.grix.it/UserFiles/mikymouse/Image/alibanco/finale.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-5375585807894846904?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/5375585807894846904/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/micro-alimentatore-da-banco-molto.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/5375585807894846904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/5375585807894846904'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/micro-alimentatore-da-banco-molto.html' title='Micro-alimentatore da banco (molto) economico'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-6818084370099748334</id><published>2011-01-26T11:42:00.001+01:00</published><updated>2011-01-30T14:03:17.389+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BIpolar stepper motor arduino robotics'/><title type='text'>TUTORIAL: how to control a BIpolar stepper motor</title><content type='html'>ok from now on I'll write in english, I have to learn it.&lt;br /&gt;&lt;br /&gt;In  this tutorial I will show you how to control a stepper motor with FOUR  control wires and a L293D IC. You can use everything you want in order  to generate control signals. In this tutorial I used an Arduino board,  but a PIC is also ok.&lt;br /&gt;&lt;br /&gt;Why "FOUR" control wires? because everyone  who writes a tutorial&amp;nbsp; or something else about bipolar stepper motors  wants to control them with only TWO wires and a lot of components (NPN  transistors, resistors ecc ecc). But controlling a L293D with 4 wires is  simpler!&lt;br /&gt;&lt;br /&gt;ok, let's see the circuit:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://a.imageshack.us/img72/2723/293d.jpg" alt="" src="http://a.imageshack.us/img72/2723/293d.jpg" style="height: 378px; width: 505px;" /&gt;&lt;br /&gt;&lt;br /&gt;How does the L293D work?&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;That's simple: you send a signal on the "inputX" and then the IC "opens" the port "outputX" for the current passing.&lt;br /&gt;You can also enable or disable a particular input-output "phase" (pin 1 and 9), but in this tutorial they are always enabled.&lt;br /&gt;&lt;img _cke_saved_src="http://a.imageshack.us/img828/1795/currentpassing.jpg" alt="" src="http://a.imageshack.us/img828/1795/currentpassing.jpg" style="height: 358px; width: 479px;" /&gt;&lt;br /&gt;This is the result:&lt;br /&gt;&lt;object height="385" width="480"&gt; &lt;param name="movie" value="http://www.youtube.com/v/PGAFg8aua4o&amp;amp;hl=it_IT&amp;amp;fs=1" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/PGAFg8aua4o&amp;amp;hl=it_IT&amp;amp;fs=1" type="application/x-shockwave-flash" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;and this is a (very) simple sketch of Arduino programming:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: maroon;"&gt;&lt;span style="background-color: black;"&gt;//declaration of PINS that connected the wire to motor&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;int nero = 13;&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;int marrone = 12;&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;int arancio = 11;&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;int giallo = 10;&lt;/span&gt;&lt;br style="background-color: black;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;//this is the time to wait in every single step&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;int delayTime = 100;&lt;/span&gt;&lt;br style="background-color: black;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;//set the pin for OUTPUT&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;void setup() {&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; pinMode(nero, OUTPUT);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; pinMode(marrone, OUTPUT);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; pinMode(giallo, OUTPUT);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; pinMode(arancio, OUTPUT);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;}&lt;/span&gt;&lt;br style="background-color: silver;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;void loop() {&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; forward(13);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; delay(500);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; backward(13);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;}&lt;/span&gt;&lt;br style="background-color: black;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;void forward(int steps){&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; for(int i=0;i&amp;lt;steps;i++){&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;// in every phase 2 wires is up and 2 is down&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(nero, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(marrone, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(arancio, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(giallo, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(nero, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(marrone, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(arancio, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(giallo, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(nero, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(marrone, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(arancio, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(giallo, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(nero, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(marrone, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(arancio, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(giallo, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; delay(delayTime);}&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;}&lt;/span&gt;&lt;br style="background-color: silver;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;void backward (int steps){&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; for(int i=0;i&amp;lt;steps;i++){&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(nero, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(marrone, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(arancio, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(giallo, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(nero, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(marrone, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(arancio, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; digitalWrite(giallo, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(nero, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(marrone, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(arancio, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(giallo, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(nero, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(marrone, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(arancio, HIGH);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; digitalWrite(giallo, LOW);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; delay(delayTime);&lt;/span&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: black;" /&gt;&lt;br style="background-color: black;" /&gt; &lt;span style="background-color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&lt;br /&gt;this page: http://www.arduino.cc/en/Tutorial/StepperBipolar&amp;nbsp; is for UNIPOLAR stepper motor!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-6818084370099748334?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/6818084370099748334/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/tutorial-how-to-control-bipolar-stepper.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/6818084370099748334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/6818084370099748334'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/tutorial-how-to-control-bipolar-stepper.html' title='TUTORIAL: how to control a BIpolar stepper motor'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-3090345475510221191</id><published>2011-01-26T11:39:00.000+01:00</published><updated>2011-01-26T11:39:20.759+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WL0025 Alfa Network 500mA'/><title type='text'>analisi comparativa WL0025 e Alfa Network 500mA</title><content type='html'>finalmente ho finito una recenzione comparativa di due tra le migliori  schede di rete wireless in commercio... il senso è presentarvi qualche  shoot per mettervi in condizione di giudicare voi stessi, più che di  spendere parole, comunque partiamo dalla descrizione veloce dei prodotti  (googolando si trovano tantissime recensioni specifiche, volendo...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt;Alfa Network AWUS036H&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basata sul chipset Realtek 8187L succhia 500mw alla massima potenza,  non so se corrisponde a vero, ma sicuramente la batteria del portatile  dura meno con la scheda attaccata.&lt;br /&gt;viene riconosciuta out-of-the-box  da debian (senza injection se non si patchano i driver) e BackTrack3  (in pieno), con i driver contenuti nel cd anche su windows, ma non era  mia intenzione testarla sul sistema operativo di zio Bill, per dovere di  cronaca ho inserito anche degli screen con i grafici di NetStrumbler  che vanno tanto di moda, ma non ho fatto di più.&lt;br /&gt;Carina la confezione in cui arriva, solo cd driver (inutile...) e scheda, senza manuali e roba inutile.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: medium;"&gt; LogiLink WL0025 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Monta un chip Ralink rt2570, è una scheda economica ed essenziale.&lt;br /&gt;scaricando dai repository debian i driver la scheda funziona bene  (sempre senza injection se non si patchano), BT3 la riconosce senza  problemi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;piattaforma di testing:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;portatile DELL 640m con BackTrack3 on USB&lt;br /&gt;&lt;img _cke_saved_src="http://img223.imageshack.us/img223/5194/dscn3518qp5.jpg" alt="" src="http://img223.imageshack.us/img223/5194/dscn3518qp5.jpg" style="height: 480px; width: 404px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;antenne:&lt;/span&gt;&lt;br /&gt;- antenne originali delle due schede&lt;br /&gt;&lt;br /&gt;- omnidirezionale da 5db&lt;br /&gt;&lt;br /&gt;- elicoidale autoprodotta&lt;br /&gt;&lt;img _cke_saved_src="http://img515.imageshack.us/img515/8027/elicoidalecn1.jpg" alt="" src="http://img515.imageshack.us/img515/8027/elicoidalecn1.jpg" style="height: 210px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;basta chiacchiere, le prove sono fatte tutte indoor per due buoni motivi:&lt;br /&gt;- in terrazzo fa freddo&lt;br /&gt;- le reti all'esterno con la alfa diventano talmente tante da essere quasi ingestibili&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;premettendo che me ne frego di mascherare gli ESSID delle reti (già è  tanto che ho levato qualche MAC) visto che non sono segreti e che se la  gente ci mette nome e cognome... beh peggio per loro, una volta  attaccate le schede CON ANTENNA ORIGINALE questo è quello che ci si  presenta davanti:&lt;br /&gt;&lt;br /&gt;WL0025:&lt;br /&gt;&lt;img _cke_saved_src="http://img110.imageshack.us/img110/3426/wl0025originalehg6.png" alt="" src="http://img110.imageshack.us/img110/3426/wl0025originalehg6.png" style="height: 349px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;ALFA:&lt;br /&gt;&lt;img _cke_saved_src="http://img266.imageshack.us/img266/2851/alfaoriginalefi1.png" alt="" src="http://img266.imageshack.us/img266/2851/alfaoriginalefi1.png" style="height: 344px; width: 480px;" /&gt;&lt;br /&gt;come si può vedere la alfa rileva più reti ma con margini minori,  questo comporta un segnale non sempre costante nelle connessioni (non è  mia intenzione entrare nelle reti che rilevo, ma dalle prove che ho  fatto sulla mia rete basta un segnale di "30" segnato da airodump per  una connessione funzionante, con entrambe le schede.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;prossimo passo, attacco l'antenna omnidirezionale da 5db e ripeto il test:&lt;br /&gt;WL0025:&lt;br /&gt;&lt;img _cke_saved_src="http://img504.imageshack.us/img504/8140/wl0026omni5io7.png" alt="" src="http://img504.imageshack.us/img504/8140/wl0026omni5io7.png" style="height: 346px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;ALFA:&lt;br /&gt;&lt;img _cke_saved_src="http://img253.imageshack.us/img253/9581/alfaomni62mingf6.png" alt="" src="http://img253.imageshack.us/img253/9581/alfaomni62mingf6.png" style="height: 347px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;e di nuovo si evidenziano gli stessi risultati, la LogiLink rileva solo  le reti con segnale maggiore, ma più stabili a dispetto della alfa che  per conto suo ci da una panoramica notevole delle reti intorno a noi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ultimo passo, antenna elicoidale (puntata verso l'esterno della camera):&lt;br /&gt;WL0025:&lt;br /&gt;&lt;img _cke_saved_src="http://img253.imageshack.us/img253/2280/wl0027direzionaleku4.png" alt="" src="http://img253.imageshack.us/img253/2280/wl0027direzionaleku4.png" style="height: 348px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;ALFA:&lt;br /&gt;&lt;img _cke_saved_src="http://img141.imageshack.us/img141/5739/alfadirezionale2mincp8.png" alt="" src="http://img141.imageshack.us/img141/5739/alfadirezionale2mincp8.png" style="height: 350px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;è difficile riuscire a dare un giudizio globale, sono schede molto  diverse che si tende a assimilare... mentre la LogiLink è perfetta per  un uso casalingo (ottimo rapporto qualità/prezzo) la Alfa è dedicata  agli smanettoni, ai wardriver (si ricorda che entrare nelle reti altrui  senza permesso è un reato)&lt;br /&gt;certo è difficile non commuoversi quando  si fa injection con la Alfa che "sfrigola", ma è anche vero che ha un  costo circa doppio della "tranquilla" WL0025.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;chiudo con due  grafici di NetStrumbler che non hanno molto valore, visto che non sono  fatti sulla stessa rete, ma fanno una gran scena!&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img259.imageshack.us/img259/2608/graficirtlun8.jpg" alt="" src="http://img259.imageshack.us/img259/2608/graficirtlun8.jpg" style="height: 380px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img502.imageshack.us/img502/917/graficialfaze0.jpg" alt="" src="http://img502.imageshack.us/img502/917/graficialfaze0.jpg" style="height: 403px; width: 480px;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-3090345475510221191?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/3090345475510221191/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/analisi-comparativa-wl0025-e-alfa.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3090345475510221191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/3090345475510221191'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/analisi-comparativa-wl0025-e-alfa.html' title='analisi comparativa WL0025 e Alfa Network 500mA'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-6585533295511672841</id><published>2011-01-26T11:11:00.001+01:00</published><updated>2011-01-26T11:45:37.335+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='faxe cantenna direzionale antenna wifi wireless aircrack airodump'/><title type='text'>FAXE CANTENNA</title><content type='html'>Come anticipato nel primo post, oggi si costruisce una direzionale con un barattolo di FAXE.&lt;br /&gt;non è esattamente una antenna a costo zero come decantato da tanti siti, ma permette un buon guadagno con una spesa decente.&lt;br /&gt;&lt;br /&gt;occorrente:&lt;br /&gt;barattolo di FAXE da un litro (costo 2,71€ alla SMA)&lt;br /&gt;connettore tipo N femmina da pannello (costo 5€ perche l'ho preso da ladri, mediamente costa 3€)&lt;br /&gt;pigtail rp-sma --&amp;gt; N maschio (7€ circa sulla baia)&lt;br /&gt;chiodo, fil di ferro (meglio rame) o qualsiasi conduttore di diametro 2mm e lunghezza 3,1cm&lt;br /&gt;&lt;br /&gt;dremel con dischi per tagliare la lamiera, carta vetrata e trapano (punte per ferro da 1cm e 3mm)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;per prima cosa buttate la "birra" contenuta nel barattolo. non provate a  berla. secondo me i produttori della faxe hanno rinunciato a produrre  birra per il consumo, fanno i barattoli per le cantenne in realtà, e ci  buttano dentro quello che gli capita.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;prendete il barattolo e  con il dremel tagliate lungo la linea dorata superiore del barattolo  (sembra fatta a posta per avere una guida per il taglio, questo avvalora  la mia tesi sulla produzione di barattoli per antenne e non per la  birra).&lt;br /&gt;&lt;br /&gt;alla fine otterrete questo:&lt;br /&gt;&lt;img src="http://img17.imageshack.us/img17/4268/taglio.jpg" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;By &lt;a target="_new" href="http://profile.imageshack.us/user/mikymouse"&gt;mikymouse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;più è preciso il taglio e meglio è. alla fine rifinite con la carta vetrata.&lt;br /&gt;&lt;br /&gt;prendete il fil di ferro o quello che avete scelto come dipolo e saldatelo sul connettore.&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img86.imageshack.us/img86/9020/dscn3500yv6.jpg" alt="" src="http://img86.imageshack.us/img86/9020/dscn3500yv6.jpg" style="height: 370px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;adesso, montate una punta da 1 per metallo sul trapano e contate 5,2cm  dal fondo della lattina. il punto è appena sopra le scritte, regolatevi  con l'immagine sotto.&lt;br /&gt;una volta fatto il buco principale, poggiateci  sopra il connettore e fate i buchi per le viti di fissaggio del  connettore (punta da 3).&lt;br /&gt;consiglio: fate prima UN buco, poi ci  mettete sopra il connettore (fissato con una vite) e fate un altro buco,  se segnate i 4 punti e fate i buchi tutti insieme rischiate di non  trovarli allineati con i fori del connettore.&lt;br /&gt;&lt;img _cke_saved_src="http://img301.imageshack.us/img301/1462/buchizl6.jpg" alt="" src="http://img301.imageshack.us/img301/1462/buchizl6.jpg" style="height: 350px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;ora montate il connettore.... alla fine ottenete questo:&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img104.imageshack.us/img104/3327/connettoreww5.jpg" alt="" src="http://img104.imageshack.us/img104/3327/connettoreww5.jpg" style="height: 360px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;beh praticamente abbiamo già finito. ora ci attaccate il pigtail e  collegate l'antenna alla vostra scheda di rete. il tocco di classe è  fissare un bullone per poter mettere l'antenna su un treppiede, una cosa  del genere:&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img164.imageshack.us/img164/6521/treppiedeiz1.jpg" alt="" src="http://img164.imageshack.us/img164/6521/treppiedeiz1.jpg" style="height: 802px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;il guadagno che si ottiene lo avevo postato anche l'altra volta, ma per completezza lo rimetto.&lt;br /&gt;&lt;br /&gt;prima&lt;br /&gt;&lt;img _cke_saved_src="http://img530.imageshack.us/img530/5139/screenshot1lh3.png" alt="" src="http://img530.imageshack.us/img530/5139/screenshot1lh3.png" style="height: 281px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;dopo&lt;br /&gt;&lt;img _cke_saved_src="http://img530.imageshack.us/img530/5373/screenshot2ci9.png" alt="" src="http://img530.imageshack.us/img530/5373/screenshot2ci9.png" style="height: 281px; width: 480px;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-6585533295511672841?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/6585533295511672841/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/faxe-cantenna.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/6585533295511672841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/6585533295511672841'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/faxe-cantenna.html' title='FAXE CANTENNA'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6659201995721258273.post-2344856705390325378</id><published>2011-01-26T10:24:00.000+01:00</published><updated>2011-01-26T10:24:27.780+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='external antenna'/><category scheme='http://www.blogger.com/atom/ns#' term='asus'/><category scheme='http://www.blogger.com/atom/ns#' term='antenna'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><title type='text'>external antenna eeepc 900</title><content type='html'>ed ecco a voi il primo post di questo blog.... una mod semplice  semplice.... piazzare un connettore rp-sma per antenne esterne su un  asus eeepc 900 (con qualche riferimento a come si smonta un eeepc, visto  che in rete non avevo trovato consigli)&lt;br /&gt;&lt;br /&gt;allora, per prima cosa vi serve:&lt;br /&gt;un pigtail U.FL / IPX RP-SMA&amp;nbsp; facilmente reperibile sulla baia (non tanto facilmente in Italia...) costo approssimativo 6-7€&lt;br /&gt;&lt;br /&gt;pesantemente ispirato a:&lt;br /&gt;&lt;a _cke_saved_href="http://wiki.portertech.org/doku.php?id=eeepc900-ext-antenna" href="http://wiki.portertech.org/doku.php?id=eeepc900-ext-antenna" target="_blank"&gt;wiki.portertech.org/doku.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;dove potrete trovare anche altre foto e approfondimenti.&lt;br /&gt;&lt;br /&gt;per prima cosa vanno rimosse le viti dalla parte inferiore della  scocca, poi sbloccata e rimossa la tastiera, svitate le altre viti  (sotto la tastiera) e sbloccata la parte superiore della scocca.&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/322/dscn3459.jpg" alt="" src="http://img159.imageshack.us/img159/322/dscn3459.jpg" style="height: 360px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;una volta rimossa la parte superiore si ottiene questo: (i connettori con i cerchi rossi vanno tolti)&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/9677/dscn3460.jpg" alt="" height="579" src="http://img159.imageshack.us/img159/9677/dscn3460.jpg" width="800" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;alzando la scheda madre... sulla destra si nota la scheda di rete con i  due fili (bianco-nero) delle antenne che si trovano dietro al monitor.&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/1631/dscn3464.jpg" alt="" height="600" src="http://img159.imageshack.us/img159/1631/dscn3464.jpg" width="800" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;a questo punto si può procedere bucando come si può vedere sotto....&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/4107/dscn3465.jpg" alt="" src="http://img159.imageshack.us/img159/4107/dscn3465.jpg" style="height: 360px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;inserendo il connettore dopo aver lavorato il buco e creato la feritoia per il pigtail&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/9223/dscn3467.jpg" alt="" src="http://img159.imageshack.us/img159/9223/dscn3467.jpg" style="height: 324px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;a questo punto il connettore del pigtail va collegato alla scheda wifi  sostituendo il connettore "aux" presente. rimontando.... lavoro finito&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/3339/dscn3473.jpg" alt="" src="http://img159.imageshack.us/img159/3339/dscn3473.jpg" style="height: 360px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/9469/dscn3474.jpg" alt="" src="http://img159.imageshack.us/img159/9469/dscn3474.jpg" style="height: 360px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img159.imageshack.us/img159/2161/dscn3475.jpg" alt="" src="http://img159.imageshack.us/img159/2161/dscn3475.jpg" style="height: 282px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;conclusioni:&lt;br /&gt;&lt;br /&gt;la modifica è adatta per antenne direzionali, molto meno per antenne  fisse omnidirezionale come quella che ho montato per prova nell'ultima  foto a causa della posizione del connettore: montando antenne più grosse  si ha che il pc "poggia" sull'antenna e non sui piedini perchè questa  sporge troppo. con piccole antenne come quella sopra o con cantenne il  problema non si pone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;queste sono due schermate di  airodump prima e dopo la connessione di una antenna direzionale (le foto  della realizzazione le metterò nel prossimo post) ovviamente nello  stesso punto della casa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img530.imageshack.us/img530/5139/screenshot1lh3.png" alt="" src="http://img530.imageshack.us/img530/5139/screenshot1lh3.png" style="height: 281px; width: 480px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img _cke_saved_src="http://img530.imageshack.us/img530/5373/screenshot2ci9.png" alt="" src="http://img530.imageshack.us/img530/5373/screenshot2ci9.png" style="height: 281px; width: 480px;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6659201995721258273-2344856705390325378?l=ferretrobotics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ferretrobotics.blogspot.com/feeds/2344856705390325378/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/external-antenna-eeepc-900.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/2344856705390325378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6659201995721258273/posts/default/2344856705390325378'/><link rel='alternate' type='text/html' href='http://ferretrobotics.blogspot.com/2011/01/external-antenna-eeepc-900.html' title='external antenna eeepc 900'/><author><name>mikymouse</name><uri>http://www.blogger.com/profile/13886323024989045651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
