<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT-Robotix &#187; Robot</title>
	<atom:link href="http://www.it-robotix.net/category/robot/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.it-robotix.net</link>
	<description>Sito dedicato al mondo della Robotica amatoriale</description>
	<lastBuildDate>Mon, 14 Nov 2011 11:08:16 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Coming soon &#8230;</title>
		<link>http://www.it-robotix.net/2011/09/26/coming-soon/</link>
		<comments>http://www.it-robotix.net/2011/09/26/coming-soon/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 13:51:14 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Robot]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=372</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.it-robotix.net/wp-content/uploads/2011/09/B4.png"><img class="size-full wp-image-373 aligncenter" title="B4" src="http://www.it-robotix.net/wp-content/uploads/2011/09/B4.png" alt="B4" width="179" height="119" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/09/26/coming-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Romecup 2011</title>
		<link>http://www.it-robotix.net/2011/03/10/romecup-2011/</link>
		<comments>http://www.it-robotix.net/2011/03/10/romecup-2011/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 21:46:22 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Explorer]]></category>
		<category><![CDATA[Robofesta]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[robocup]]></category>
		<category><![CDATA[romecup]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=351</guid>
		<description><![CDATA[Dal 14 al 16 Marzo si svolgerà la consueta manifestazione della RomeCup una tre giorni dedicata alla Robotica, le prime due giornate si svolgeranno presso l&#8217;ITIS Galileo Galilei di Roma, mentre l&#8217;ultima giornata si svolgerà nella sala della Protomoteca del Campidoglio. E&#8217; vero che si tratta di un evento dedicato alle scuole, ma ci saranno [...]]]></description>
			<content:encoded><![CDATA[<p>Dal 14 al 16 Marzo si svolgerà la consueta manifestazione della RomeCup una tre giorni dedicata alla Robotica, le prime due giornate si svolgeranno presso l&#8217;ITIS Galileo Galilei di Roma, mentre l&#8217;ultima giornata si svolgerà nella sala della Protomoteca del Campidoglio.</p>
<p style="text-align: center;"><img class="pie-img aligncenter" src="http://lh6.ggpht.com/_ndUeRg81MJ8/TXlHB3FxJvI/AAAAAAAABeE/DSVe3A5FCc8/romecup2011.jpg?imgmax=640" alt="romecup2011.jpg" width="294" height="171" /><img style="margin: 10px 10px 10px 10px;" alt="" /></p>
<p>E&#8217; vero che si tratta di un evento dedicato alle scuole, ma ci saranno anche altre iniziative in ambito Robotico, tra le tante cito anche alcune presentazioni su Arduino tenute da un amico di Roboteck, gruppo citato anche nel programma della manifestazione.</p>
<p>Tra le gare in programma ci sono:</p>
<ul>
<li>Explorer Junior</li>
<li>Explorer Senior</li>
<li>Robocup junior open league</li>
<li>Robocup junior light weight league</li>
<li>Robocup junior Dance primary</li>
<li>Robocup junior Dance secondary</li>
<li>Robocup junior Rescue primary</li>
<li>Robocup junior Rescue secondary</li>
</ul>
<p>Se siete interessati, per maggiori dettagli potete andare sul sito ufficiale della manifestazione il link è il seguente: <a href="http://www.romecup.org/" target="_blank">http://www.romecup.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/03/10/romecup-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Line Follower project start</title>
		<link>http://www.it-robotix.net/2011/03/05/line-follower-project-start/</link>
		<comments>http://www.it-robotix.net/2011/03/05/line-follower-project-start/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 21:56:20 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[LineFollower]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[alimentazione]]></category>
		<category><![CDATA[LDO]]></category>
		<category><![CDATA[LiPo]]></category>
		<category><![CDATA[roboteck]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=337</guid>
		<description><![CDATA[Il progetto Line Follower comincia a prendere forma non solo nella mia mente, ma anche su carta almeno per il momento, la mia intenzione è quella di realizzare un &#8220;prototipo&#8221; che mi permetta di valutare di volta in volta parti nuove fino ad arrivare ad una soluzione &#8220;definitiva&#8221; che sia in grado di offrire prestazioni [...]]]></description>
			<content:encoded><![CDATA[<p>Il progetto Line Follower comincia a prendere forma non solo nella mia mente, ma anche su carta almeno per il momento, la mia intenzione è quella di realizzare un &#8220;prototipo&#8221; che mi permetta di valutare di volta in volta parti nuove fino ad arrivare ad una soluzione &#8220;definitiva&#8221; che sia in grado di offrire prestazioni di un certo livello. Per questo motivo anche in questo progetto userò la filosofia a me tanto cara della modularità, anche se questa volta viste le dimensioni ridotte dividere la sezione alimentazione e controllo motori diventa un po&#8217; difficile.<br />
La prima analisi che ho fatto sul progetto si è basata sul capire quali materiali avevo già da poter &#8220;riciclare&#8221;, quindi la scelta è ricaduta su due motoriduttori della Solarbotics, che poi sono gli stessi che ho già montato su <a href="http://www.it-robotix.net/robot/fire/" target="_self">FIRE</a>. Per il controllo dei motori l&#8217;idea è di utilizzare un L293D, che al suo interno contiene già i diodi di ricircolo, ho scartato subito la possibilità L298 perché troppo ingombrante, e questi motori non dovrebbero richiedere una corrette troppo elevata da superare le capacità del 293.<span id="more-337"></span></p>
<p>Determinato il sistema di locomozione, bisogna pensare a come alimentare sia i motori che tutta la parte di logica del Robot. Sempre per una questione di spazio la prima idea è stata quella di utilizzare 4 batterie stilo e un porta batterie di quelli con le molle, per avere la possibilità di cambiarle facilmente. Facendo un po&#8217; di calcoli però si vede subito che questa soluzione, così com&#8217;è non può andare, infatti se consideriamo 4 comuni batterie stilo da 1,5V abbiamo un totale di 6V che sono un po&#8217; pochi per una logica che funziona a 5V anche utilizzando uno stabilizzatore LDO, perché basta che si scarichino un po&#8217; le batterie per avere problemi. In più c&#8217;è da considerare anche il Ponte H che, a causa dei sui circuiti interni, che fanno scendere la tensione applicabile ai motori di 2,5V, andrebbe ad alimentare i motori con 6-2,5=3,5V e una tensione un po&#8217; troppo bassa per dei motori che nascono da 6 Volt equivale a dire perdere molti giri motore, tenendo presente che su un robot da LF la velocità è un fattore importante sicuramente non questa non è una scelta valida. Naturalmente il discorso peggiora pensando di utilizzare delle batterie ricaricabili che sono da 1,2V per elemento.</p>
<p>Ecco quindi il primo problema da affrontare, il ponte H serve anche perchè i motori saranno controllati in PWM, vorrei evitare di scegliere qualcosa di alternativo al L293, almeno per ora, quindi non mi rimane che alzare la tensione. Le possibilità sono due aumentare il numero di batterie, che vorrebbe dire più ingombro e più peso, o aggiungere un circuito elevatore di tensione, che vuol dire aumentare la complessità ed il costo del Robot.<br />
Dopo averci ragionato un po&#8217; chiedo consiglio agli amici di Roboteck per avere un loro parere, che è stato quasi unanime verso l&#8217;utilizzo di batterie Li-Po, in effetti era una soluzione che non avevo mai preso in considerazione per via dei costi, che nel tempo sono cambiati, infatti per delle buone batterie NiMH si spendo circa 4€ ad elemento quindi dovendone usare sei il totale fa 24€, mentre guardando tra i negozzi di modellismo si trovano delle buone LiPo da 7,4V (2 celle da 3,7V) 1800mAh (20C) a 20€. Escludendo la piccola differenza di prezzo, quello che cambia notevolmente è l&#8217;ingombro e il peso (80g di differenza).</p>
<p>Sulle LiPo va fatta comunque una piccola precisazione, sono delle batterie un po&#8217; delicate, quindi vanno gestite con criterio, per prima cosa necessitano di caritori appositi quindi meglio non improvvisare perchè potrebbero anche esplodere, poi quando vengono utilizzate è bene non scendere mai al disotto di una certa soglia di tensione (3V per cella) oltre la quale la batteria potrebbe anche danneggiarsi.<br />
Fatte tutte queste premesse, dettate anche dai vari consigli ricevuti, sono passato a disegnare lo schema elettrico della sezione di alimentazione che è quello che potete vedere in figura.</p>
<div><img class="pie-img aligncenter" src="http://lh3.ggpht.com/_ndUeRg81MJ8/TXKtdZrzNQI/AAAAAAAABdc/jpBvQdvXDSc/Alimentazione.png?imgmax=576" alt="Circuito di alimentazione per il nuovo Robot Line Follower" width="576" height="256" /><img style="margin: 10px 10px 10px 10px;" alt="" /><img style="margin: 10px 10px 10px 10px;" alt="" /></div>
<p>Partendo da sinistra i due ingressi X1 e X2 sono per il connettore della batteria LiPo da 7,4V, per prima cosa è presente un partitore resistivo il cui scopo è quello di ridurre la tensione che viene prelevata nel punto indicato da VBAT e inviata ad un ingresso ADC per essere misurata, lo scopo è quello di tenere sotto controllo lo stato di carica della batteria durante il funzionamento del Robot ed eventualmente intervenire nel caso in cui la tensione scenda sotto una certa soglia, il partitore serve per ridurre la tensione che arriverà all&#8217;ADC, considerando anche che a batteria carica la tensione sarà anche superiore agli 8Volt. I motori saranno alimentati direttamente dalla batteria, per la parte logica ho aggiunto un regolatore LDO (IC1) con configurazione classica dei condensatori in ingresso ed in uscita. Nel circuito ho aggiunto solamente un diodo (D1) prima del regolatore per evitare inversioni di polarità, qualcuno avrà notato però che ai motori, o meglio al ponte H arriva direttamente la tensione di batteria senza passare per il diodo, questa mia scelta serve per evitare ulteriori cadute di tensione verso i motori, e sono disposto a sacrificare ponte H che tutto il resto dell&#8217;elettronica, anche se un danno è quasi impossibile, visto che il connettore della batteria sarà comunque polarizzato.<br />
Il prossimo step sara quello di cominciare a mettere insieme i pezzi, cioè di vedere assemblati i motori sul supporto di vetronite che ospiterà anche i circuiti di alimentazione e controllo motori.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/03/05/line-follower-project-start/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Line Follower</title>
		<link>http://www.it-robotix.net/2011/01/31/line-follower/</link>
		<comments>http://www.it-robotix.net/2011/01/31/line-follower/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 22:11:14 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[LineFollower]]></category>
		<category><![CDATA[Robot]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=318</guid>
		<description><![CDATA[Il regolamento ufficiale è stato redatto, e scaricabile al seguente link, quindi mi sembra il momento giusto per spiegarvi meglio cos&#8217;è questo Line Follower, si tratta in sostanza di una competizione velocistica tra Robot, i quali devono autonomamente seguire un tracciato nel minor tempo possibile. Il tracciato è indicato da una linea nera larga 25mm, che [...]]]></description>
			<content:encoded><![CDATA[<p>Il regolamento ufficiale è stato redatto, e scaricabile al seguente <a title="Regolamento LineFollower" href="http://www.roboteck.it/doc/lf1.zip" target="_blank">link</a>, quindi mi sembra il momento giusto per spiegarvi meglio cos&#8217;è questo Line Follower, si tratta in sostanza di una competizione velocistica tra Robot, i quali devono autonomamente seguire un tracciato nel minor tempo possibile.<br />
Il tracciato è indicato da una linea nera larga 25mm, che segna un percorso articolato che varia ad ogni competizione, nell&#8217;immagine che segue si può vedere un esempio di pista.</p>
<p style="text-align: center;"><img class="pie-img" src="http://lh6.ggpht.com/_ndUeRg81MJ8/TUco4HKuS8I/AAAAAAAABbs/PKCqLmjdglU/esempio_tracciato_lf.png?imgmax=640" alt="Esempio di tracciato Line Follower" width="600" height="234" /></p>
<p><span id="more-318"></span><br />
Altri esempi di tracciato li potete trovare allegati al regolamento.</p>
<p>Sempre sul regolamento sono definite la distanza minima tra due righe, il raggio minimo di curvatura e l&#8217;angolo minimo in caso di curve angolari, che è di 90°. I segmenti ortogonali alla riga del tracciato servono come punti di rilevamento per i tempi, quindi il Robot deve essere in grado di oltrepassarli senza problemi.</p>
<p>Naturalmente vengono squalificati i Robot che non seguono correttamente il tracciato, ovvero cominciano a girovagare senza meta, maggiori dettagli ed esempi in merito sono riportati nel regolamento, che consiglio comunque di leggere.</p>
<p>Ecco un video di un Robot all&#8217;opera, ma fate un giro su YouTube ne trovante molti altri.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="390" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/73kVe9rVQHU&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="600" height="390" src="http://www.youtube.com/v/73kVe9rVQHU&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>In sostanza per realizzare un LF servono un paio di motori, dei sensori in grado di verificare la presenza della riga nera, i circuiti di controllo e tanta fantasia nello scrivere il software, semplice no.</p>
<p>Se avete voglia di cimentarvi e confrontare le vostre capacità, la prossima occasione sarà a Sutri, dove si sta organizzando un evento Robotico in cui ci sarà sia il Line Follower che altre categorie, spero presto di poter dare ulteriori dettagli sulla manifestazione.</p>
<p>Intanto penso che con buona probabilità comincerò la costruzione di un nuovo Robot LF, dopo l&#8217;esperienza di <a title="Smoke Line Follower a Pisa" href="http://www.it-robotix.net/2011/01/20/ancora-una-volta-un-bel-raduno-a-pisa/#more-293" target="_self">Smoke</a> a Pisa, ho capito che bisogna realizzare un progetto specifico, sempre su questo sito quanto prima comincerà la cronologia del progetto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/01/31/line-follower/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ancora una volta un bel raduno a Pisa</title>
		<link>http://www.it-robotix.net/2011/01/20/ancora-una-volta-un-bel-raduno-a-pisa/</link>
		<comments>http://www.it-robotix.net/2011/01/20/ancora-una-volta-un-bel-raduno-a-pisa/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 18:56:52 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Robofesta]]></category>
		<category><![CDATA[Robot]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=293</guid>
		<description><![CDATA[Anche questo 2011 ha visto le due più grandi comunita italiane della Robotica Amatoriale, ospiti della Robofesta tenutasi presso l&#8217;IPSIA Fascetti di Pisa. Come tutti gli anni la mattinata si è svolta tra le gare di robot (questanno non ci sono stati gli explorer), i saluti agli amici che non si vedono da un po&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>Anche questo 2011 ha visto le due più grandi comunita italiane della Robotica Amatoriale, ospiti della Robofesta tenutasi presso l&#8217;IPSIA Fascetti di Pisa.<br />
Come tutti gli anni la mattinata si è svolta tra le gare di robot (questanno non ci sono stati gli explorer), i saluti agli amici che non si vedono da un po&#8217;, la mostra dei robot vecchi e nuovi, e il solito chiacchierare di soluzioni tecniche utilizzate.</p>
<p style="text-align: center;"><a rel="lightbox[2011-0-0-23-7-7]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNUcRzCamI/AAAAAAAABaA/2uPoU1M4zxY/IMG_7559.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNUcRzCamI/AAAAAAAABaA/2uPoU1M4zxY/s144-c/IMG_7559.JPG" alt="IMG_7559.JPG" width="144" height="144" /></a><a rel="lightbox[2011-0-0-23-7-34]" href="http://lh5.ggpht.com/_ndUeRg81MJ8/TTNU9j1r14I/AAAAAAAABaA/oShFSkswi_I/IMG_7569.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh5.ggpht.com/_ndUeRg81MJ8/TTNU9j1r14I/AAAAAAAABaA/oShFSkswi_I/s144-c/IMG_7569.JPG" alt="IMG_7569.JPG" width="144" height="144" /></a><a rel="lightbox[2011-0-0-23-8-13]" href="http://lh6.ggpht.com/_ndUeRg81MJ8/TTNWL6J_m8I/AAAAAAAABaA/h5Eju0D9EXs/IMG_7595.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh6.ggpht.com/_ndUeRg81MJ8/TTNWL6J_m8I/AAAAAAAABaA/h5Eju0D9EXs/s144-c/IMG_7595.JPG" alt="IMG_7595.JPG" width="144" height="144" /></a></p>
<p><span id="more-293"></span><br />
La scuola ci ha messo disposizione l&#8217;aula magna per tutto il pomeriggio, così subito dopo le gare abbiamo consumato un pasto veloce per cominciare ad affrontare i punti che avevamo in programma il prima possibile.</p>
<p style="text-align: center;"><a rel="lightbox[2011-0-0-23-13-7]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/TTNVF7D5cGI/AAAAAAAABaA/lC9qaepWhNg/IMG_7572.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/TTNVF7D5cGI/AAAAAAAABaA/lC9qaepWhNg/s144-c/IMG_7572.JPG" alt="IMG_7572.JPG" width="144" height="144" /></a> <a rel="lightbox[2011-0-0-23-13-42]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/TTNV5kSK0HI/AAAAAAAABaA/OsREcpNSsR4/IMG_7590.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/TTNV5kSK0HI/AAAAAAAABaA/OsREcpNSsR4/s144-c/IMG_7590.JPG" alt="IMG_7590.JPG" width="144" height="144" /></a> <a rel="lightbox[2011-0-0-23-14-7]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNVSIT7uDI/AAAAAAAABaA/1LNnuTZtFJ4/IMG_7577.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNVSIT7uDI/AAAAAAAABaA/1LNnuTZtFJ4/s144-c/IMG_7577.JPG" alt="IMG_7577.JPG" width="144" height="144" /></a></p>
<p>Gli argomenti trattati nel pomeriggio sono stati molto interessanti, ed hanno portato al solito grande interesse da parte di tutti, presentando lavori fatti con vecchie conoscenze e nuovi prodotti che si affacciano nella robotica.</p>
<p><a title="Guido" href="http://www.guiott.com/" target="_blank">Guido</a> ci ha introdotto prima ad un nuovo sistema di prototipazione veloce l&#8217;<a title="mbed" href="http://www.mbed.org" target="_blank">mbed</a>, basato su un processore ARM a 32-bit facilmente programmabile e con tutta una serie di librerie realizzate da una intera comunità. Poi ci ha parlato del progetto che ha realizzato con lo PSoC (di cui se ne era parlato la prima volta proprio l&#8217;anno prima sempre in occasione dell&#8217;incontro di Pisa) per il rilevamento del tono a 4KHz per la gara dei Robot Explorer.</p>
<p>L&#8217;altro intervento della giornata è stato quello di Sergio che ci ha illustrato le potenzialità di <a title="ROS" href="http://www.willowgarage.com/pages/software/ros-platform" target="_blank">ROS</a> un framework che facilità il lavoro di sviluppo software e di interconnessioni tra i vari sistemi di un Robot.</p>
<p>Il pomeriggio si è concluso con i primi di test di Line Follower, necessari anche per validare i punti del regolamento che verrà utilizzato nelle prossime competizioni. I robot pronti per i test non erano tantissimi, ma si è già visto un buon interesse da parte di molte persone, ci si aspetta quindi una buona partecipazione alla prima gara ufficiale. Buone notizie in tal senso arrivano anche dal Fascetti, che sembrerebbe essere interessata come scuola a ospitare per il prossimo anno anche una competizione di Line Follower.</p>
<p><a rel="lightbox[2011-0-0-23-33-46]" href="http://lh6.ggpht.com/_ndUeRg81MJ8/TTNW0kdkzKI/AAAAAAAABaA/TI6KMuAZugs/IMG_7606.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh6.ggpht.com/_ndUeRg81MJ8/TTNW0kdkzKI/AAAAAAAABaA/TI6KMuAZugs/s144-c/IMG_7606.JPG" alt="IMG_7606.JPG" width="144" height="144" /></a> <a rel="lightbox[2011-0-0-23-34-26]" href="http://lh5.ggpht.com/_ndUeRg81MJ8/TTNXUIPl_tI/AAAAAAAABaA/G8R0a1EuJBg/IMG_7614.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh5.ggpht.com/_ndUeRg81MJ8/TTNXUIPl_tI/AAAAAAAABaA/G8R0a1EuJBg/s144-c/IMG_7614.JPG" alt="IMG_7614.JPG" width="144" height="144" /></a> <a rel="lightbox[2011-0-0-23-34-55]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNYPBo7DfI/AAAAAAAABaA/sR3I9oZSeeg/IMG_7629.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNYPBo7DfI/AAAAAAAABaA/sR3I9oZSeeg/s144-c/IMG_7629.JPG" alt="IMG_7629.JPG" width="144" height="144" /></a> <a rel="lightbox[2011-0-0-23-35-15]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNYY5VAB0I/AAAAAAAABaA/G5CrfrSAaM8/IMG_7632.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/TTNYY5VAB0I/AAAAAAAABaA/G5CrfrSAaM8/s144-c/IMG_7632.JPG" alt="IMG_7632.JPG" width="144" height="144" /></a></p>
<p>Vi lascio con un video di Smoke impegnato nell&#8217;affrontare il circuito del Line Follower.</p>
<p><iframe title="YouTube video player" class="youtube-player" type="text/html" width="480" height="390" src="http://www.youtube.com/embed/iDsMU8rMSFE" frameborder="0" allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/01/20/ancora-una-volta-un-bel-raduno-a-pisa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>30 anni di Robotica in Italia</title>
		<link>http://www.it-robotix.net/2010/09/14/30-anni-di-robotica-in-italia/</link>
		<comments>http://www.it-robotix.net/2010/09/14/30-anni-di-robotica-in-italia/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 14:07:23 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Robot]]></category>
		<category><![CDATA[documenti]]></category>
		<category><![CDATA[italia]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=290</guid>
		<description><![CDATA[Ho il piacere di segnalarvi un link ad un documento redatto dall&#8217;amico Ivan nel quale propone un resoconto dell&#8217;attività robotica in Italia negli ultimi 30 anni. 30 anni di Robotica in Italia Il documento è in fase di ampliamento, per aggiungere i vari Robot amatoriali realizzati in questi anni, vi consiglio di leggerlo perché è [...]]]></description>
			<content:encoded><![CDATA[<p>Ho il piacere di segnalarvi un link ad un documento redatto dall&#8217;amico <a href="http://http://www.officinerobotiche.it/" target="_blank">Ivan</a> nel quale propone un resoconto dell&#8217;attività robotica in Italia negli ultimi 30 anni.</p>
<p style="text-align: center;"><a title="30 anni di Robotica in Italia" href="http://www.roboteck.it/doc/30_anni.pdf" target="_blank">30 anni di Robotica in Italia</a></p>
<p>Il documento è in fase di ampliamento, per aggiungere i vari Robot amatoriali realizzati in questi anni, vi consiglio di leggerlo perché è sicuramente un documento destinato a fare storia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2010/09/14/30-anni-di-robotica-in-italia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WWW.XBOT.IT</title>
		<link>http://www.it-robotix.net/2010/08/24/www-xbot-it/</link>
		<comments>http://www.it-robotix.net/2010/08/24/www-xbot-it/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 12:29:49 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Robot]]></category>
		<category><![CDATA[sito]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=285</guid>
		<description><![CDATA[Nasce il nuovo sito dell&#8217;amico Stefano dedicato alla Robotica, molto carina come impostazione e semplice da seguire, in poche parole un lavoro proprio ben fatto. www.xbot.it Questo sito è appena nato, ma già presenta una serie di articoli molto interessanti che vi consiglio di andare a vedere.]]></description>
			<content:encoded><![CDATA[<p>Nasce il nuovo sito dell&#8217;amico Stefano dedicato alla Robotica, molto carina come impostazione e semplice da seguire, in poche parole un lavoro proprio ben fatto.</p>
<p style="text-align: center;"><a rel="lightbox[2010-7-2-14-25-26]" href="http://lh6.ggpht.com/_ndUeRg81MJ8/THO51WzFiLI/AAAAAAAABRk/pxd9fIUGK34/xbot.it.gif?imgmax=640"><img class="pie-img aligncenter" style="margin-top: 10px; margin-bottom: 10px;" src="http://lh6.ggpht.com/_ndUeRg81MJ8/THO51WzFiLI/AAAAAAAABRk/pxd9fIUGK34/s144-c/xbot.it.png" alt="xbot.it.gif" width="144" height="144" /></a><br />
<a title="XBOT" href="http://www.xbot.it/" target="_blank">www.xbot.it</a></p>
<p>Questo sito è appena nato, ma già presenta una serie di articoli molto interessanti che vi consiglio di andare a vedere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2010/08/24/www-xbot-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FIRE &#8211; Aggiornamenti</title>
		<link>http://www.it-robotix.net/2010/02/15/fire-aggiornamenti/</link>
		<comments>http://www.it-robotix.net/2010/02/15/fire-aggiornamenti/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 21:08:37 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Explorer]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[RTC]]></category>
		<category><![CDATA[controllo motori]]></category>
		<category><![CDATA[encoder]]></category>
		<category><![CDATA[FIRE]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=174</guid>
		<description><![CDATA[Continua il lavoro sul nuovo Robot FIRE, lo sviluppo si è spostato ora sulla parte di controllo motori, che utilizzerà come encoder i sensori e i dischi dentati recuperati da un vecchio mouse, il cui principio di funzionamento è molto simile a quello che serve per il nostro scopo. Il circuito è molto semplice, da [...]]]></description>
			<content:encoded><![CDATA[<p>Continua il lavoro sul nuovo Robot FIRE, lo sviluppo si è spostato ora sulla parte di controllo motori, che utilizzerà come encoder i sensori e i dischi dentati recuperati da un vecchio mouse, il cui principio di funzionamento è molto simile a quello che serve per il nostro scopo.</p>
<p style="text-align: center;"><a title="Qui si possono vedere i due circuiti con i ricevitori e trasmettitori IR recuperati da vecchi mouse a pallina." rel="lightbox[2010-1-4-20-15-51]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/S2sVkzsA91I/AAAAAAAABMU/zaFJX3plcTk/IMG_4716.JPG?imgmax=640"><img class="pie-img aligncenter" style="margin-top: 10px; margin-bottom: 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/S2sVkzsA91I/AAAAAAAABMU/zaFJX3plcTk/s144-c/IMG_4716.JPG" alt="Qui si possono vedere i due circuiti con i ricevitori e trasmettitori IR recuperati da vecchi mouse a pallina." width="144" height="144" /></a></p>
<p>Il circuito è molto semplice, da una parte abbiamo un trasmettitore IR e dall&#8217;altra due ricevitori posti ad una certa distanza tra loro, ma contenuti nello stesso package, va da se che messi il TX e l&#8217;RX uno davanti all&#8217;altro i due ricevitori daranno in uscita due segnali a livello alto (i sensori usati hanno un&#8217;uscita TTL), mentre interponendo qualcosa tra i due sensori le uscite sono a livello basso. Ora se consideriamo che il disco dentato, ha appunto delle zone aperte, dove i raggi IR possono passare tranquillamente, e delle zone chiuse dove i raggi non passano, va da se che le uscite del ricevitore, se il disco gira, alterneranno valori alto e basso generando così un treno di onde quadre.<span id="more-174"></span> Nelle figure che seguono (ingrandirle per vederle meglio) si possono vedere, le differenze dei segnali in uscita dai due ricevitori, che in seguito chiameremo canali, e si può notare la differenza nel canale B (rosso) quando il motore gira in un verso o nell&#8217;altro.</p>
<p style="text-align: center;"><a title="Esempio di segnali dei due canali dell'encoder per una rotazione oraria." rel="lightbox[2010-1-3-23-20-40]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/S3MwtJm0XgI/AAAAAAAABQQ/zDrYuoW4Fp4/Segnali%20encoder%20avanti.PNG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/S3MwtJm0XgI/AAAAAAAABQQ/zDrYuoW4Fp4/s144-c/Segnali%20encoder%20avanti.PNG" alt="Esempio di segnali dei due canali dell'encoder per una rotazione oraria." width="144" height="144" /></a> <a title="Esempio di segnali dei due canali dell'encoder per una rotazione antioraria." rel="lightbox[2010-1-3-23-21-11]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/S3MwtHacAUI/AAAAAAAABQU/GTgt-s8XbNM/Segnali%20encoder%20indietro.PNG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/S3MwtHacAUI/AAAAAAAABQU/GTgt-s8XbNM/s144-c/Segnali%20encoder%20indietro.PNG" alt="Esempio di segnali dei due canali dell'encoder per una rotazione antioraria." width="144" height="144" /></a></p>
<p>Questa differenza tra i due canali è utile per stabilire il verso di rotazione del motore (faccio presente che non utilizzando un encoder commerciale e quindi con caratteristiche specifiche, lo sfasamento tra i due canali può cambiare a seconda di come questi vengono montati), infatti se ipotiziamo di controllare il livello dei due segnali in seguito al fronte di salita (evidenziati dalla freccia) del canale A (blu), con il motore che gira in un verso avremo sempre le uscite dei due canali sono a livello alto (figura 1), ma se invece giriamo il motore nel verso opposto le cose cambiano, il canale B sarà sempre al livello opposto a quello di del canale A, sarà quindi sufficiente fare un controllo dei due livelli per determinare il verso di rotazione del motore.</p>
<p>Ma passiamo dalla teoria alla pratica, quelle che vedete di seguito sono le foto di dettaglio della struttura definitiva dei motori, come si può vedere è stata aggiunta un&#8217;altra staffa ad L per aumentare la stabilita dell&#8217;asse che sostiene il disco del encoder.</p>
<p style="text-align: center;"><a title="Dettaglio della struttura definitiva dei motori, come si può vedere è stata aggiunta un'altra staffa ad L per aumentare la stabilita dell'encoder." rel="lightbox[2010-1-1-14-19-58]" href="http://lh3.ggpht.com/_ndUeRg81MJ8/S2sVjt891eI/AAAAAAAABMQ/T_qiGBqQqJ4/IMG_4721.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh3.ggpht.com/_ndUeRg81MJ8/S2sVjt891eI/AAAAAAAABMQ/T_qiGBqQqJ4/s144-c/IMG_4721.JPG" alt="Dettaglio della struttura definitiva dei motori, come si può vedere è stata aggiunta un'altra staffa ad L per aumentare la stabilita dell'encoder." width="144" height="144" /></a> <a title="Particolare della dentellatura del disco che forma l'encoder. Si nota anche come la parte dentellata è posta tra il trasmettitore e il ricevitore." rel="lightbox[2010-1-1-14-20-19]" href="http://lh5.ggpht.com/_ndUeRg81MJ8/S2sVm0jSUgI/AAAAAAAABMc/qT2YYjN7iTM/IMG_4724.JPG?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh5.ggpht.com/_ndUeRg81MJ8/S2sVm0jSUgI/AAAAAAAABMc/qT2YYjN7iTM/s144-c/IMG_4724.JPG" alt="Particolare della dentellatura del disco che forma l'encoder. Si nota anche come la parte dentellata è posta tra il trasmettitore e il ricevitore." width="144" height="144" /></a></p>
<p>Il problema principale, della realizzazione hardware di questi encoder, è stato trovare la giusta posizione dei sensori rispetto al disco dentato. Essendo una soluzione &#8220;home made&#8221;, non abbiamo studiato più di tanto sulla capacità di replicabilità, ma ci siamo diretti più sulla funzionalità, pensando che stiamo comunque lavorando su un progetto il cui scopo finale è quello di studiare/analizzare nuove problematiche oltre naturalmente a trovare soluzioni per i nostri scopi. Solo come nota a margine, nel cassetto si sono già degli ottimi motoriduttori con encoder &#8220;serio&#8221; integrato che aspettano di essere usati.</p>
<p>Veniamo ora alla parte elettronica per la gestione degli encoder, per prima cosa per il controllo motori viene usato un PIC18F4431, montato momentaneamente su una Roboboard 2.0, probabilmente successivamente passeremo a realizzare una scheda apposita e con il più piccolo 18F2431, le cui uniche differenze sono nel package da 28 pin anziché 40 con il conseguente minore numero di porte, ma quelle disponibili sono sufficienti per i nostri scopi.</p>
<p style="text-align: center;"><a title="Circuito per il controllo motori con 18F2431" rel="lightbox[2010-1-2-21-50-58]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/S3HKWG4-8NI/AAAAAAAABPo/UZDYSFQJCX8/MotorControl_SCH.png?imgmax=640"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/S3HKWG4-8NI/AAAAAAAABPo/UZDYSFQJCX8/s144-c/MotorControl_SCH.png" alt="Circuito per il controllo motori con 18F2431" width="144" height="144" /></a></p>
<p>Come si può vedere dallo schema, della futura scheda con 18F2431, i canali A e B di entrambi gli encoder sono collegati alle porte KBI1, KBI2, KBI3 e KBI4, questi ingressi permettono di configurare un interrupt &#8220;on change&#8221;. Questa serie di PIC (18FXX31) ha tra le sue periferiche, quelle per la gestione del PWM avanzato, che mettono a disposizione per ogni PWM generato due segnali in opposizione di fase tra loro, questo semplifica ulteriormente il circuito, perché per pilotare il PonteH non è necessario aggiungere nessun altro integrato per invertire i segnali. RC0 viene utilizzato per abilitare/disabilitare il PonteH, al solo scopo di ridurre i consumi durante le fasi di standby, ricordo che i motori vengono controllati in modalità LAP, quindi per mantenerli fermi è necessario comunque che all&#8217;interno dei motori scorra corrente, invece disabilitando il ponte i motori non sono frenati ma i consumi vengono ridotti, cosa molto importante se si considera che il robot è alimentato a batterie.</p>
<p>Passiamo ora ad analizzare il codice, in particolare per prima cosa vediamo la parte più importante ovvero l&#8217;ISR (Interrupt Service Routine).  In questa prima bozza del codice il PIC conta il numero di click dell&#8217;encoder di ogni ruota, misura il periodo dell&#8217;onda quadra generata dal canale B degli encoder e determina il verso di rotazione dei motori.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p174code4'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1744"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
</pre></td><td class="code" id="p174code4"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> InterruptHandlerHigh <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>INTCONbits.<span style="color: #202020;">RBIF</span><span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Controlla quale canale di quale encoder ha scatenanto l'interrupt</span>
		<span style="color: #666666; font-style: italic;">// ed aggoirna in contatore di impulsi associato</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_SX<span style="color: #339933;">!=</span>encAsxOldStatus<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			clickSX<span style="color: #339933;">++;</span>
			encAsxOldStatus<span style="color: #339933;">=</span>ENC_A_SX<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Se il valore della variabile è 1 allora c'è stato un fronte di</span>
			<span style="color: #666666; font-style: italic;">// salita, quindi posso leggere il timer per misurare il periodo</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_SX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Cattura il valore attuale del Timer, leggo prima la parte</span>
				<span style="color: #666666; font-style: italic;">// bassa per evitare che vari ulteriormente la lettura.</span>
				tmr5_now_sx.<span style="color: #202020;">byteL</span><span style="color: #339933;">=</span>TMR5L<span style="color: #339933;">;</span>
				tmr5_now_sx.<span style="color: #202020;">byteH</span><span style="color: #339933;">=</span>TMR5H<span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// Salvo il numero di overflow e azzero il contatore</span>
				tmr5_ovf_value_sx<span style="color: #339933;">=</span>tmr5_overflow_sx<span style="color: #339933;">;</span>
				tmr5_overflow_sx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// Imposto il flag di controllo per il calcolo della velocità</span>
				flag_calcola_speed_sx<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_B_SX<span style="color: #339933;">!=</span>encBsxOldStatus<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			clickSX<span style="color: #339933;">++;</span>
			encBsxOldStatus<span style="color: #339933;">=</span>ENC_B_SX<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Determina il verso di rotazione</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_SX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;&amp;</span> ENC_B_SX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				Rdir_mot_sx<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//Forward</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_SX<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> ENC_B_SX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				Rdir_mot_sx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #666666; font-style: italic;">//*******************</span>
			LedVerde<span style="color: #339933;">=!</span>LedVerde<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">//*******************</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_DX<span style="color: #339933;">!=</span>encAdxOldStatus<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			clickDX<span style="color: #339933;">++;</span>
			encAdxOldStatus<span style="color: #339933;">=</span>ENC_A_DX<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Se il valore della variabile è 1 allora c'è stato un fronte di</span>
			<span style="color: #666666; font-style: italic;">// salita, quindi posso leggere il timer per misurare il periodo</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_DX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Cattura il valore attuale del Timer, leggo prima la parte</span>
				<span style="color: #666666; font-style: italic;">// bassa per evitare che vari ulteriormente la lettura.</span>
				tmr5_now_dx.<span style="color: #202020;">byteL</span><span style="color: #339933;">=</span>TMR5L<span style="color: #339933;">;</span>
				tmr5_now_dx.<span style="color: #202020;">byteH</span><span style="color: #339933;">=</span>TMR5H<span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// Salvo il numero di overflow e azzero il contatore</span>
				tmr5_ovf_value_dx<span style="color: #339933;">=</span>tmr5_overflow_dx<span style="color: #339933;">;</span>
				tmr5_overflow_dx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// Imposto il flag di controllo per il calcolo della velocità</span>
				flag_calcola_speed_dx<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_B_DX<span style="color: #339933;">!=</span>encBdxOldStatus<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			clickDX<span style="color: #339933;">++;</span>
			encBdxOldStatus<span style="color: #339933;">=</span>ENC_B_DX<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Determina il verso di rotazione</span>
			<span style="color: #666666; font-style: italic;">//*!ATTENZIONE!Questo encoder è momntato nello stesso verso</span>
			<span style="color: #666666; font-style: italic;">//* dell'altro, quindi la logica di controllo va invertita</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_DX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;&amp;</span> ENC_B_DX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				Rdir_mot_dx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// Backward</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>ENC_A_DX<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> ENC_B_DX<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				Rdir_mot_dx<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// Forward</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #666666; font-style: italic;">//*******************</span>
			LedRosso<span style="color: #339933;">=!</span>LedRosso<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">//*******************</span>
		<span style="color: #009900;">&#125;</span>
		INTCONbits.<span style="color: #202020;">RBIF</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>PIR3bits.<span style="color: #202020;">TMR5IF</span><span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//*********************</span>
		LedGiallo<span style="color: #339933;">=!</span>LedGiallo<span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//*********************</span>
		<span style="color: #666666; font-style: italic;">// Incrementa i contatori di overflow</span>
		tmr5_overflow_dx<span style="color: #339933;">++;</span>
		tmr5_overflow_sx<span style="color: #339933;">++;</span>
		PIR3bits.<span style="color: #202020;">TMR5IF</span><span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>I primi controlli che vengono fatti nella ISR, sono gli &#8220;if&#8221; visibili alla riga 3 e alla riga 84, questi controlli sui flag di interrupt vengono usati per stabilire quale periferica l&#8217;ha scatenato.  Prendiamo in esame l&#8217;Interrupt Flag del Timer 5, questo viene generato ogni volta che il registro del contatore del timer va in owerflow, quindi ogni volta che avviene questo evento vengono incrementate le due variabili di controllo &#8220;tmr5overflow_xx&#8221;, che verranno poi utilizzate in un&#8217;altra funzione per misurare la durata del periodo. Alla riga 82 viene fatta un&#8217;operazione importantissima ovvero il reset del flag dell&#8217;Interrupt del Timer5, questa operazione deve essere fatta manualmente al termine della gestione dell&#8217;ISR, altrimenti appena usciti dalla routine questa verrà richiamata immediatamente come se fosse stato generato un nuovo interrupt.<br />
L&#8217;altro flag RBIF, viene posto a livello alto quando uno degli ingressi delle porte KBIx cambia di stato, a queste porte come già visto sono collegati i canali dei due encoder, quindi dopo il controllo della riga 3 vengono fatti altri quattro controlli, uno per ogni canale degli encoder, dove viene verificato se il livello logico attuale dell&#8217;encoder è diverso da quello memorizzato l&#8217;ultima volta che c&#8217;è stato un cambiamento (righe 7, 26, 43, 62).<br />
Prendiamo in analisi la porzione di codice che segue l&#8217;istruzione &#8220;if&#8221; di riga 7, alla riga 9 viene incrementata la variabile &#8220;clickSX&#8221; che viene utilizzata per contare il numero di click totale del motore sinistro, adesso questa informazione non è utilizzata, ma servirà poi per la parte di odometria che svilupperemo in seguito. Nella riga successiva (10) viene aggiornata la variabile encAsxOldStatus con il valore attuale del livello dell&#8217;encoder.<br />
Nella riga 13 troviamo un altro &#8220;if&#8221; in questo caso controlla se il livello attuale del canale A dell&#8217;encoder in esame è a livello alto, questo permette di stabilire se quello che stiamo analizzando è stato un cambio di stato dal livello logico basso ad alto, quindi se è seguito ad un fronte di salita. In questo modo il codice che segue viene eseguito solo a seguito di ogni fronte di salita, e quindi ad ogni periodo delle onde quadre generate dall&#8217;encoder, questo ulteriore controllo serve appunto per effettuare la misurazione della durata del periodo, quindi a seguito di ogni fronte di salita viene salvato il valore del Timer5 e il numero di volte che questo è andato in overflow nelle apposite variabili di appoggio, viene impostata ad uno la variabile &#8220;flag_calcola_speed_sx&#8221;, che viene utilizzata nella funzione &#8220;misura_velocità&#8221;, che vedremo in seguito, per stabilire se è il momento di fare i conti per misurare la durata del periodo.<br />
Alla riga 26 viene controllato se il cambio di stato è avvenuto sul canale B dell&#8217;encoder collegato al motore sinistro, le istruzioni nelle due righe che seguono sono equivalenti a quelle già viste per le righe 9 e 10. Le righe che seguono invece servono a stabilire il verso di rotazione del motore, come già indicato nei grafici visti in precedenza.<br />
La parte di codice che segue (dalla riga 43 alla 80) è in pratica la replica dello stesso codice, solo che questa volta è relativo al motore destro e presenta un&#8217;unica differenza nella parte in cui viene stabilito il verso di rotazione, questo perché trattandosi di encoder home made non sono stati fatti per girare entrambi allo stesso modo. Infine alla riga 81 viene azzerato il flag dell&#8217;interrupt, per renderlo disponibile ad essere attivato al prossimo cambio di stato di uno dei quattro pin.</p>
<p>Il codice che segue riporta la funzione utilizzata per calcolare la durata del periodo di un&#8217;onda quadra, misurato come abbiamo visto in precedenza sul canale B dei due encoder.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p174code5'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1745"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code" id="p174code5"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> misura_velocita<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> icp<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Si è concluso un periodo intero per il canale A del motore SX</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>flag_calcola_speed_sx<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Memorizzo nella variabile unsigned int i due registri H e L del TMR5</span>
		tmr5_now_sx.<span style="color: #202020;">Word</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span>tmr5_now_sx.<span style="color: #202020;">byteH</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>tmr5_now_sx.<span style="color: #202020;">byteL</span><span style="color: #339933;">;</span>
 		<span style="color: #666666; font-style: italic;">// Controlla se ci sono stati un overflow del timer durante il conteggio,</span>
 		<span style="color: #666666; font-style: italic;">// per stabilire come calcolare il valore del periodo.</span>
 		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>tmr5_ovf_value_sx<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			lcd_put_uchar<span style="color: #009900;">&#40;</span>tmr5_ovf_value_sx<span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #339933;">,</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Se c'è stato overflow la durata del periodo è calolata sottraendo</span>
			<span style="color: #666666; font-style: italic;">// al valore massimo del TMR5 il valore della lettura precedente,</span>
			<span style="color: #666666; font-style: italic;">// aggiungendo per ogni altro overflow-1 il valore massimo di TMR5 e</span>
			<span style="color: #666666; font-style: italic;">// aggiungendo in fine il valore attuale sempre di TMR5+1.</span>
			durata_periodo_sx<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> <span style="color: #993333;">long</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0xFFFF</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>tmr5_ovf_value_sx<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0xFFFF</span><span style="color: #339933;">-</span>tmr5_old_sx<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>tmr5_now_sx.<span style="color: #202020;">Word</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Imposto il valore attuale del timer come old per il prossimo calcolo</span>
			tmr5_old_sx<span style="color: #339933;">=</span>tmr5_now_sx.<span style="color: #202020;">Word</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Se non c'è stato overflow la durata del periodo è la differenza</span>
			<span style="color: #666666; font-style: italic;">// tra la lettura precedente e quella attuale.</span>
			durata_periodo_sx<span style="color: #339933;">=</span>tmr5_now_sx.<span style="color: #202020;">Word</span><span style="color: #339933;">-</span>tmr5_old_sx<span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Imposto il valore attuale del timer come old per il prossimo calcolo</span>
			tmr5_old_sx<span style="color: #339933;">=</span>tmr5_now_sx.<span style="color: #202020;">Word</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		flag_calcola_speed_sx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// Si è concluso un periodo intero per il canale A del motore DX</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>flag_calcola_speed_dx<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Per i commenti vedi la sezione speculare sopra</span>
		tmr5_now_dx.<span style="color: #202020;">Word</span><span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span>tmr5_now_dx.<span style="color: #202020;">byteH</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>tmr5_now_dx.<span style="color: #202020;">byteL</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>tmr5_ovf_value_dx<span style="color: #339933;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			lcd_put_uchar<span style="color: #009900;">&#40;</span>tmr5_ovf_value_dx<span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #339933;">,</span><span style="color: #0000dd;">17</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			durata_periodo_dx<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> <span style="color: #993333;">long</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0xFFFF</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>tmr5_ovf_value_dx<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span><span style="color: #208080;">0xFFFF</span><span style="color: #339933;">-</span>tmr5_old_dx<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span>tmr5_now_dx.<span style="color: #202020;">Word</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			tmr5_old_dx<span style="color: #339933;">=</span>tmr5_now_dx.<span style="color: #202020;">Word</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			durata_periodo_dx<span style="color: #339933;">=</span>tmr5_now_dx.<span style="color: #202020;">Word</span><span style="color: #339933;">-</span>tmr5_old_dx<span style="color: #339933;">;</span>
			tmr5_old_dx<span style="color: #339933;">=</span>tmr5_now_dx.<span style="color: #202020;">Word</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		flag_calcola_speed_dx<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Il primo controllo che viene fatto  sulle variabili &#8220;flag_calcola_speed_xx&#8221;, già viste nella gestione della ISR, per stabilire se ci sono i dati necessari per il calcolo.  Per prima cosa alla riga 9 vengono memorizzati i valori presi dai due registri a 8 bit che compongono il contatore del Timer5, in una variabile a 16 bit da utilizzare per i calcoli. Alla riga 12 viene controllato se durante la durata del periodo dell&#8217;onda sul canale B c&#8217;è stato uno o più overflow del registro del Timer5, nel caso questo sia vero viene applicata la formula nella riga 19 per calcolare la durata del periodo.  Il calcolo risulta molto più semplice quando non c&#8217;è stato overflow, in questo caso è sufficiente sottrarre al valore attuale del Timer quello della misura precedente. La misura per l&#8217;altro motore funziona allo stesso modo, in entrambi i casi è necessario ricordarsi di azzerare la variabile flag_calcola_speed_xx per evitare letture sbagliate.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p174code6'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1746"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p174code6"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Mostra il numero di Click per ruota</span>
	lcd_put_uint<span style="color: #009900;">&#40;</span>clickSX<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	lcd_put_uint<span style="color: #009900;">&#40;</span>clickDX<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Esegue la misura della velocità sui due motori</span>
	misura_velocita<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Mostra il valore del periodo calcolato</span>
	lcd_put_uslong<span style="color: #009900;">&#40;</span>durata_periodo_sx<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	lcd_put_uslong<span style="color: #009900;">&#40;</span>durata_periodo_dx<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #0000dd;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Mosta la direzione di rotazione dei motori impostata e quella verificata tramite gli encoder</span>
	...
	...
	...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Questo box contiene una parte del codice eseguito nel loop principale presente nel main, come si può facilmente intuire vengono eseguite le istruzioni per visualizzare sul display le informazioni dei motori visualizzando i dati impostati e quelli misurati. Nella riga 7 viene richiamata la funzione &#8220;misura_velocita()&#8221; vista in precedenza.</p>
<p>Le informazioni sul display (20&#215;4) sono divise in due colonne destra e sinistra, dove vengono visualizzate le informazioni dei rispettivi motori destro e sinistro. La prima riga indica il valore impostato nel registro del PWM e la direzione impostata per i motori, la seconda invece indica il periodo misurato tramite il Timer5, la terza indica il numero di click letti dall&#8217;encoder e l&#8217;ultima riga indica quante volte è andato in overflow il registro del Timer5.</p>
<p style="text-align: center;"><a title="Dati visualizzati sul display." rel="lightbox[2010-1-3-23-7-50]" href="http://lh4.ggpht.com/_ndUeRg81MJ8/S2sVo2H5LUI/AAAAAAAABMs/W21EYdUucds/IMG_4728.JPG?imgmax=640"><img class="pie-img aligncenter" style="margin-top: 10px; margin-bottom: 10px;" src="http://lh4.ggpht.com/_ndUeRg81MJ8/S2sVo2H5LUI/AAAAAAAABMs/W21EYdUucds/s144-c/IMG_4728.JPG" alt="Dati visualizzati sul display." width="144" height="144" /></a></p>
<p>Concludo il lungo articolo dicendo che ora abbiamo tutte le informazioni necessarie per poter implementare un controllo PID sui motori e per poi passare alla fase di controllo dell&#8217;odometria.</p>
<p><strong> Stay Tuned!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2010/02/15/fire-aggiornamenti/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

