<?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</title>
	<atom:link href="http://www.it-robotix.net/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, 26 Mar 2012 15:37:16 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Esperimenti con le OpenCV</title>
		<link>http://www.it-robotix.net/2012/03/07/esperimenti-con-le-opencv/</link>
		<comments>http://www.it-robotix.net/2012/03/07/esperimenti-con-le-opencv/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 15:17:39 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Codice]]></category>
		<category><![CDATA[.Net Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EMGU]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Visione artificiale]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=462</guid>
		<description><![CDATA[Non ricordo quanti anni sono passati dalla prima volta che ho sentito parlare di OpenCV, ma ricordo bene tutto il fascino che hanno generato in me, l’idea di poter analizzare un’immagine ed estrapolarne delle informazioni era qualcosa di estremamente interessate e a quei tempi si vedevano poche cose del genere in giro, ma le limitate [...]]]></description>
			<content:encoded><![CDATA[<p>Non ricordo quanti anni sono passati dalla prima volta che ho sentito parlare di <a title="OpenCV" href="http://it.wikipedia.org/wiki/OpenCV" target="_blank">OpenCV</a>, ma ricordo bene tutto il fascino che hanno generato in me, l’idea di poter analizzare un’immagine ed estrapolarne delle informazioni era qualcosa di estremamente interessate e a quei tempi si vedevano poche cose del genere in giro, ma le limitate conoscenze e la scarsa documentazione (in italiano) mi avevano fortemente limitato.<br />
Da un po’ di tempo è disponibile un Wrapper delle OpenCV per il .Net Framework di Microsoft, si chiama <a title="EMGU" href="http://www.emgu.com/wiki/index.php/Main_Page" target="_blank">Emgu CV</a>, anche se l’ho scoperto da poco, mi è subito sembrato molto interessante, per prima cosa posso usare il C#, visto che lo uso per lavoro è sicuramente un linguaggio su cui mi muovo meglio del C++, poi compilando con Mono si può sviluppare l’applicazione anche per Linux e Mac OS X, non ultimo il fatto che tra i vari Wrapper è quello più supportato anche a livello di sviluppi (n.d.r. La documentazione è sempre in inglese, però ora sono più preparato anche in questo <img src='http://www.it-robotix.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p>Tralasciando le premesse storiche, e passando a qualcosa di più concreto, ho cominciato un progettino giocando con i vari metodi messi a disposizione della libreria e sono arrivato a realizzare un’applicazione che evidenzia i volti ripresi dalla WebCam e scattando una foto campione è in grado di analizzarla con ciò che si vede a video e stabilire se si tratta dello stesso soggetto.</p>
<p style="text-align: center;"><a href="http://lh3.ggpht.com/-2ubkd-pVF14/T1dzj2pUbAI/AAAAAAAABgw/pUfMyYE2RjA/FaceDetector.PNG?imgmax=640" rel="lightbox[2012-2-3-15-55-42]"><img class="pie-img aligncenter" style="margin-top: 10px; margin-bottom: 10px;" src="http://lh3.ggpht.com/-2ubkd-pVF14/T1dzj2pUbAI/AAAAAAAABgw/pUfMyYE2RjA/s144-c/FaceDetector.PNG" alt="FaceDetector.PNG" width="144" height="144" /></a></p>
<p><span id="more-462"></span><br />
Di seguito il codice del metodo richiamato al caricamenteo dell’applicazione.</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('p462code3'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4623"><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
</pre></td><td class="code" id="p462code3"><pre class="c" style="font-family:monospace;">private <span style="color: #993333;">void</span> Window_Loaded<span style="color: #009900;">&#40;</span>object sender<span style="color: #339933;">,</span> RoutedEventArgs e<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   capture <span style="color: #339933;">=</span> new Capture<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Risoluzione <span style="color: #339933;">=</span> String.<span style="color: #202020;">Format</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Risoluzione: {0}x{1} ({2})<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #339933;">,</span> 
          capture.<span style="color: #202020;">Width</span><span style="color: #339933;">,</span> capture.<span style="color: #202020;">Height</span><span style="color: #339933;">,</span> capture.<span style="color: #202020;">CaptureSource</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   haarCascade <span style="color: #339933;">=</span> new HaarCascade<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;haarcascade_frontalface_default.xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">// Check if foto file is present</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>File.<span style="color: #202020;">Exists</span><span style="color: #009900;">&#40;</span>FOTO_FILE<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
      Bitmap pictureFace <span style="color: #339933;">=</span> new Bitmap<span style="color: #009900;">&#40;</span>FOTO_FILE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      image3.<span style="color: #202020;">Source</span> <span style="color: #339933;">=</span> _bitmapToSource<span style="color: #009900;">&#40;</span>pictureFace<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      txtbMessaggi.<span style="color: #202020;">Text</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Pronto per l'analisi del soggetto ...&quot;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #b1b100;">else</span>
   <span style="color: #009900;">&#123;</span>
      txtbMessaggi.<span style="color: #202020;">Text</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Scattare una foto prima di procedere con l'analisi ...&quot;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// Start timer</span>
   timer <span style="color: #339933;">=</span> new DispatcherTimer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   timer.<span style="color: #202020;">Tick</span> <span style="color: #339933;">+=</span> new EventHandler<span style="color: #009900;">&#40;</span>timer_Tick<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   timer.<span style="color: #202020;">Interval</span> <span style="color: #339933;">=</span> new TimeSpan<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   timer.<span style="color: #202020;">Start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>L’oggetto principale è il Capture, in pratica è quello che cattura i frame dalla WebCam, è possibile anche definire alcuni parametri supplementari, ma in questo caso prende le impostazioni base. Da notare il numero 0 tra le parentesi quando instanzia l’oggetto, serve ad identificare quale Web Cam utilizzare, nell’ipotesi che ne abbiate più di una disponibile, naturalmente il primo pensiero va alla possibilità di utilizarne due contemporaneamente per la visione stereoscopica.<br />
Altro oggetto importante è l’HaarCascade tramite il quale è indicato un file XML, dove sono definite le regole per il riconoscimento dei volti. Tra i vari file delle OpenCV che si scaricano, c’è anche un eseguibile per creare questi file XML, ma non ho ancora provato ad utilizzarlo.<br />
Il resto del codice è per controllare se è gia stata scattata una foto, la parte importante è quella relativa alla definizione del Timer che ad ogni Tick richiamerà il metodo associato, visibile nel codice che segue.</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('p462code4'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4624"><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
</pre></td><td class="code" id="p462code4"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> timer_Tick<span style="color: #009900;">&#40;</span>object sender<span style="color: #339933;">,</span> EventArgs e<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   Image currentFrame <span style="color: #339933;">=</span> capture.<span style="color: #202020;">QueryFrame</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>currentFrame <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
      String Coordinate <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
      <span style="color: #993333;">int</span> counterFace <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
      Image grayFrame <span style="color: #339933;">=</span> currentFrame.<span style="color: #202020;">Convert</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      var detectedFaces <span style="color: #339933;">=</span> haarCascade.<span style="color: #202020;">Detect</span><span style="color: #009900;">&#40;</span>grayFrame<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      foreach <span style="color: #009900;">&#40;</span>var face in detectedFaces<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
         <span style="color: #993333;">int</span> xCenter <span style="color: #339933;">=</span> face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">X</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Width</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #993333;">int</span> yCenter <span style="color: #339933;">=</span> face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Y</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Height</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         Coordinate <span style="color: #339933;">+=</span> String.<span style="color: #202020;">Format</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Face {0} - X:{1},Y:{2} - ({3})<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> counterFace<span style="color: #339933;">,</span> xCenter<span style="color: #339933;">,</span> yCenter<span style="color: #339933;">,</span> face.<span style="color: #202020;">neighbors</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #666666; font-style: italic;">// Filtro per non vedere quadrati di facce sovrapposte</span>
         <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>face.<span style="color: #202020;">neighbors</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #0000dd;">20</span><span style="color: #009900;">&#41;</span>
         <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Rettangolo che evidenzia il volto</span>
            currentFrame.<span style="color: #202020;">Draw</span><span style="color: #009900;">&#40;</span>face.<span style="color: #202020;">rect</span><span style="color: #339933;">,</span> new Bgr<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> counterFace <span style="color: #339933;">*</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// Crocetta al centro del rettangolo</span>
            currentFrame.<span style="color: #202020;">Draw</span><span style="color: #009900;">&#40;</span>new Cross2DF<span style="color: #009900;">&#40;</span>new System.<span style="color: #202020;">Drawing</span>.<span style="color: #202020;">PointF</span><span style="color: #009900;">&#40;</span>xCenter<span style="color: #339933;">,</span> yCenter<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
               <span style="color: #0000dd;">10</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> new Bgr<span style="color: #009900;">&#40;</span>System.<span style="color: #202020;">Drawing</span>.<span style="color: #202020;">Color</span>.<span style="color: #202020;">DarkGray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// Aggiunto per scattare la foto solo se ha inquadrato un volto e per recuperare solo la porzione del volto</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>scatta<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
               Bitmap pictureFace <span style="color: #339933;">=</span> currentFrame.<span style="color: #202020;">ToBitmap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #202020;">Clone</span><span style="color: #009900;">&#40;</span>new Rectangle<span style="color: #009900;">&#40;</span>face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">X</span><span style="color: #339933;">,</span> 
                  face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Y</span><span style="color: #339933;">,</span> face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Width</span><span style="color: #339933;">,</span> face.<span style="color: #202020;">rect</span>.<span style="color: #202020;">Height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> currentFrame.<span style="color: #202020;">ToBitmap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #202020;">PixelFormat</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               pictureFace.<span style="color: #202020;">Save</span><span style="color: #009900;">&#40;</span>FOTO_FILE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               image3.<span style="color: #202020;">Source</span> <span style="color: #339933;">=</span> _bitmapToSource<span style="color: #009900;">&#40;</span>pictureFace<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               scatta <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
               txtbMessaggi.<span style="color: #202020;">Text</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Foto scattata.&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
         <span style="color: #009900;">&#125;</span>
         counterFace<span style="color: #339933;">++;</span>
      <span style="color: #009900;">&#125;</span>
      image1.<span style="color: #202020;">Source</span> <span style="color: #339933;">=</span> ToBitmapSource<span style="color: #009900;">&#40;</span>currentFrame<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      txtbCoordinate.<span style="color: #202020;">Text</span> <span style="color: #339933;">=</span> Risoluzione <span style="color: #339933;">+</span> Coordinate<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La prima operazione che viene eseguita è la cattura di una “istantanea” tramite il metodo QueryFrame dell’oggetto Capture, l’oggetto Image restituito viene poi elaborato per essere convertito in una immagine in scala di grigi e poi dato in pasto al metodo Detect dell’oggeto HaarCascade di cui parlavo prima. Il risultato è un oggetto che rappresenta tutte le facce, e le loro proprietà, che il metodo è riuscito ad identificare nell’istantanea. Il ciclo foreach serve per elaborare i dati “di ogni” faccia riconosciuta.<br />
In pratica per ogni faccia viene identificata un area rettangolare dell’istantanea che la contiene, recupero queste informazioni per mostrarle poi a video sia sotto forma di coordinate che di rettangolo che evidenzia il volto. Il controllo “if(face.neighbors&gt;20)” l’ho usato per evitare che venissero disegnati quadrati sovrapposti, può capitare un po’ di tutto anche che riconosca cose strane come volti. Il controllo sulla variabile “scatta” serve a fare in modo che l’immagine da usare come campione per l’analisi venga scattata, dopo la pressione dell’apposito pulsante, solo quando è evidenziato almeno un volto.</p>
<p>Il metodo btnAnalizza_Click è quello che si occupa di analizzare l’immagine del volto salvata precedentemente con quella che viene catturata dopo la pressione del pulsante per l’analisi, non riporto tutto il codice, ma in fondo alla pagina si può scaricare tutto il progetto. Uno degli oggetti fondamentali è il SURFDetector che viene inzializzato con l’oggetto MCvSURFParams dove è indicata la soglia di keypoint di uguaglianza tra le due immagini, necessari per decretare che si tratta dello stesso soggetto. Vengono creati due oggetti ImageFeature per le due immagini da campionare a cui vengono poi applicati i metodi dell’oggetto Features2DTracker. Infine ho usato l’oggetto HomographyMatrix per determinare il piano prospettico del volto cercato nell’immagine analizzata, questo oggetto viene definito solo se l’algoritmo riesce a definire una corrispondenza. Il resto del codice serve a concatenare le due immagini in una, unire i punti di corrispondenza delle due immagini ed evidenziare il piano della HomographyMatrix.<br />
Se siete arrivati a leggere fin qui e siete a digiuno degli argomenti trattati, vi sembrerà qualcosa di complicato, ma vorrei tranquillizzarvi che sono arrivato a completare questo programma semplicemente mettendo insieme vari esempi e cercando di capire, anche se con i miei limiti, come funzionano le cose. Se invece pensate che abbia scritto cavolate non esitate a corregermi. Di seguito trovate il link al codice sorgente e quello per l’eseguibile se siete solo curiosi di provare il programma, per essere eseguito richiede comunque il .Net Framework 4 perchè ho voluto usare WPF per realizzare l’interfaccia.</p>
<p style="text-align: center;"><a title="Face Detection Code" href="http://www.it-robotix.net/wp-content/uploads/2012/03/FaceDetection-Code.zip">:: Face Detection Code ::</a></p>
<p style="text-align: center;"><a title="Face Detection" href="http://www.it-robotix.net/wp-content/uploads/2012/02/Face-Detection.zip">:: Face Detection ::</a></p>
<p style="text-align: left;">Per chi fosse interessato segnalo un articolo simile &#8220;<a href="http://www.robot-home.it/blog/informatica/tutorial-riconoscimento-facce-con-opencv/" target="_blank">Riconoscimento facce con OpenCV</a>&#8220; dell&#8217;amico Walter, che in merito a questi argomenti ha più conoscenze di me, scritto in C++. Sul suo sito potete trovare altri Tutorial molto interessanti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2012/03/07/esperimenti-con-le-opencv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>B4 project start</title>
		<link>http://www.it-robotix.net/2012/02/16/b4-project-start/</link>
		<comments>http://www.it-robotix.net/2012/02/16/b4-project-start/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 22:30:56 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[B4]]></category>
		<category><![CDATA[mbed]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[RS485]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=452</guid>
		<description><![CDATA[Da un po&#8217; troppo tempo mancano aggiornamenti sul sito, se escludiamo una lenta traduzione degli articoli esistenti in Inglese attualmente in corso, volevo in questo post aprire ufficialmente i lavori ad un nuovo Robot che avevo già annunciato in modo molto vago qualche tempo fa. Come al solito, quando mi viene una mezza idea, la [...]]]></description>
			<content:encoded><![CDATA[<p>Da un po&#8217; troppo tempo mancano aggiornamenti sul sito, se escludiamo una lenta traduzione degli articoli esistenti in Inglese attualmente in corso, volevo in questo post aprire ufficialmente i lavori ad un nuovo Robot che avevo già annunciato in modo molto vago qualche tempo fa. Come al solito, quando mi viene una mezza idea, la prima cosa che riesco a fare è trovargli un nome che questa volta è &#8220;B4&#8243;, non è proprio un nome di mia fantasia ma si tratta di una citazione, vediamo chi è il primo che posta un commento con l’indicazione della citazione?<br />
Ma veniamo alle cose serie, in passato ho sempre pensato a Robot con dimensioni contenute nel classico 20x20cm della Robot Explorer, ma questa volta ho pensato di realizzare un Robot più grande, che fosse per me una solida e funzionante base di partenza per studi futuri, per questo mi sono orientato su una base circolare con il diametro di 36cm. Il progetto prevede la realizzazione di un sistema in grado di muoversi in un ambiente &#8220;domestico&#8221;, composto da un controllo motori, sensori di prossimità per evitare gli ostacoli e sistema di alimentazione controllato, mentre per la parte di &#8220;super visione/gestione&#8221; di queste periferiche non voglio imporre vincoli specifici, ma avere la possibilità di usare qualsiasi cosa, che sia un PIC, un mbed, uno smartphone Android, un piccolo netbook o un mastodontico super server collegato tramite WiFi. Forse sarebbe meglio parlare di una base sperimentale, più che di un Robot vero e proprio, da usare per sviluppare sistemi di controllo principale di tutti i tipi. Per la prima versione ho pensato di utilizzare mbed come sistema centrale che sarà dedicato a controllare tutte le periferiche, anche se ho avuto delle idee per implementare delle funzioni di visioni artificiale per cui dovrei usare almeno un netbook, ma vediamo nel dettaglio lo schema a blocchi del progetto.</p>
<p style="text-align: center;"><a href="http://lh4.ggpht.com/-DkIJdP8BIak/Tzpx61_-FkI/AAAAAAAABf0/IZRjAgxevtQ/B4_Diagram.png?imgmax=640" rel="lightbox[2012-1-4-23-20-40]"><img class="pie-img aligncenter" style="margin-top: 10px; margin-bottom: 10px;" src="http://lh4.ggpht.com/-DkIJdP8BIak/Tzpx61_-FkI/AAAAAAAABf0/IZRjAgxevtQ/s144-c/B4_Diagram.png" alt="B4_Diagram.png" width="144" height="144" /></a></p>
<p><span id="more-452"></span><br />
Analizziamo lo schema a partire dal blocco in alto a sinistra, il Battery Monitor, come avevo scritto in un altro <a title="Line Follower project start" href="http://www.it-robotix.net/2011/03/05/line-follower-project-start/" target="_blank">post</a>, i tempi sono maturi per passare ad utilizzare batterie LiPo senza spendere una fortuna sui nostri Robot, ma per non rovinare questo tipo di batterie è meglio tenere sotto controllo il loro livello di carica, per farlo pensavo di utilizzare un PIC che potesse segnalare lo stato di carica tramite un LED e staccare l’alimentazione a tutto il sistema se si scende sotto la la soglia minima, poi visto che c’è il PIC perché non permettere al sistema centrale di controllare il livello di carica? Per questa sezione ho già uno schema di massima e idee su come realizzarlo, ma ancora non ho realizzato un circuito per effettuare i primi test.<br />
Continuando verso destra dello schema, c’è il secondo blocco dell’alimentazione, si tratta di un circuito Switching Step Down per l’alimentazione, il cui scopo è quello di ridurre la tensione che arriverà sugli stabilizzatori a 5V delle altre schede. Questo perché l’alimentazione principale sarà fornita da una batteria da 14,4V, tensione che sarà applicata direttamente al Ponte H per pilotare i motori che sono da 12V, mentre per gli stabilizzatori che devono ridurre i 14,4V della batteria a 5V, sono costretti a dissipare tanta energia in calore, con conseguente scarica della batteria più rapida. Per ottimizzare i consumi utilizzerò lo Step Down, grazie anche all’esperienza e il supporto di <a href="http://www.guiott.com/Rino/dsNavCon/NewdsNavCon_PwrSupply.htm" target="_blank">Guido</a>, in questo modo la tensione che arriverà in ingresso agli stabilizzatori sarà di 7V riducendo al minimo le perdite di energia sotto forma di calore.<br />
Il punto fondamentale dello schema è il BUS RS485 che ho scelto per l’interconessione tra i vari sistemi, il motivo che mi ha orientato su questa soluzione rispetto ad altre tipologie di BUS è dovuta anche al fatto che ultimamente altri amici Robottari lo stanno utilizzando per i loro progetti, e mi è sembrata da subito una buona idea realizzare qualcosa che potesse in qualche modo essere comune ad altri progetti, per permettere oltre allo scambio di esperienze anche la possibilità di utilizzare soluzioni circuitali di altri con il minimo sforzo. In fin dei conti questo per me è un hobby non un lavoro (purtroppo), quindi se qualcuno realizza qualcosa che può tornarmi utile, mi permette di perdere meno tempo e raggiungere prima il risultato che mi sono prefissato.<br />
Passando ai blocchi nella parte bassa dello schema, la Sensor Board come dice il nome stesso, è quella che si occuperà della gestione di tutti i sensori telemetrici e di rilevazione ostacoli. Nell’ottica di realizzare qualcosa che potesse tornare utile anche ad altri sto cercando di progettarla in modo da renderla più versatile possibile, anche se per questioni di costo sono costretto a limitarmi all’utilizzo dei sensori che avevo nei cassetti a prendere polvere. Questa è anche la scheda che al momento si trova in una fase di sviluppo più avanzata, ma ne parlerò più in dettaglio in un prossimo post.<br />
Il controllo motori sarà affidato al blocco Motor Control, tramite una scheda realizzata dall’amico <a href="http://www.xbot.it" target="_blank">Stefano</a>, con cui collaborerò per lo sviluppo del software per il controllo PID, tale progetto segue le linee di quello di <a href="http://www.guiott.com/Rino/dsNavCon33/dsNavCon33.html" target="_blank">Guido</a>. Dimenticavo di dire che questa scheda è un altro motivo che mi ha spinto verso l’utilizzo del BUS 485, visto che Stefano l’ha progettata e realizzata così (fortunatamente).<br />
Infine la scheda di controllo del Robot, come anticipato prima, sarà basata su mbed, almeno per il momento, dotata di un modulo WiFly per la trasmissione di dati telemetrici verso un PC. Su questa parte al momento ho poche idee, ma ben confuse, non credo che farà cose molto complesse oltre a orchestrare il funzionamento delle varie periferiche.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2012/02/16/b4-project-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creata la pagina Google+ di IT-Robotix</title>
		<link>http://www.it-robotix.net/2011/11/14/creata-la-pagina-google-di-it-robotix/</link>
		<comments>http://www.it-robotix.net/2011/11/14/creata-la-pagina-google-di-it-robotix/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 11:05:14 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[IT-Robotix]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=420</guid>
		<description><![CDATA[Clicca sul link che segue per aggiungere la pagina Google+ di IT-Robotix alle tue cerchie e segui gli aggiornamenti dei progetti. IT-Robotix on Google+]]></description>
			<content:encoded><![CDATA[<p>Clicca sul link che segue per aggiungere la pagina Google+ di IT-Robotix alle tue cerchie e segui gli aggiornamenti dei progetti.</p>
<div style="padding-left:250px"><a href="https://plus.google.com/113999583208796197322?prsrc=3" style="text-decoration: none; color: #333;">
<div style="display: inline-block; *display: inline;">
<div style="text-align: center;"><img src="https://ssl.gstatic.com/images/icons/gplus-64.png" width="64" height="64" style="border: 0;"/></div>
<div style="font: bold 13px/16px arial,sans-serif; text-align: center;">IT-Robotix</div>
<div style="font: 13px/16px arial,sans-serif;"> on Google+ </div>
</div>
<p></a></div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/11/14/creata-la-pagina-google-di-it-robotix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modificato il codice SRF02 ora funziona correttamente</title>
		<link>http://www.it-robotix.net/2011/11/02/412/</link>
		<comments>http://www.it-robotix.net/2011/11/02/412/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 22:26:19 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Componenti]]></category>
		<category><![CDATA[sensori]]></category>
		<category><![CDATA[SRF02]]></category>
		<category><![CDATA[ultrasuoni]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=412</guid>
		<description><![CDATA[Riprendo dal post precedente relativo al sensore SRF02, come avevo scritto in precedenza seguendo il codice di esempio riportato sul sito riscontravo un comportamento anomalo sulla misurazione, chiedendo ad amici che avevano lo stesso sensore, ma testato con software scritto con linguaggi diversi avevano un comportamento più corretto. Ho eseguito quindi dei test con mbed, [...]]]></description>
			<content:encoded><![CDATA[<p>Riprendo dal post precedente relativo al sensore SRF02, come avevo scritto in precedenza seguendo il codice di esempio riportato sul sito riscontravo un comportamento anomalo sulla misurazione, chiedendo ad amici che avevano lo stesso sensore, ma testato con software scritto con linguaggi diversi avevano un comportamento più corretto.<br />
Ho eseguito quindi dei test con mbed, per verificare se cambiando dispositivo anche a me il sensore funzionasse correttamente, ed in effetti i risultati sono stati positivi, confermando che il sensore non era guasto.<span id="more-412"></span><br />
Il passo successivo è stato modificare il codice per utilizzare le librerie del C18 per il BUS I2C, definendo le funzioni per l&#8217;inizializzazione della periferica e la lettura del sensore.</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('p412code7'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4127"><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
</pre></td><td class="code" id="p412code7"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;i2c.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define SRF02   0xE0            // Address of SRF02</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/**************************************************************************
 * Inizializza la periferica MSSP per il funzionamento in I2C Master
 *************************************************************************/</span>
<span style="color: #993333;">void</span> srf02_config<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    OpenI2C<span style="color: #009900;">&#40;</span>MASTER<span style="color: #339933;">,</span> SLEW_OFF<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    SSPADD <span style="color: #339933;">=</span> <span style="color: #208080;">0x63</span><span style="color: #339933;">;</span>              <span style="color: #666666; font-style: italic;">// 100khz BUS @ 40MHz PIC</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/**************************************************************************
 * Esegue la misurazione tramite il sensore
 *
 * Restituisce la misura effettuata in centimetri
 *************************************************************************/</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> srf02_read<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;">int</span> result<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> measure<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> measurement<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    result <span style="color: #339933;">=</span> EEByteWrite<span style="color: #009900;">&#40;</span>SRF02<span style="color: #339933;">,</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x51</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Verifica l'esito dell'operazione di avvio della lettura</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>result<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Attende il completamento della misurazione del sensore</span>
        Delay10KTCYx<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">70</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Recupera la misurazione fatta dal sensore</span>
        result <span style="color: #339933;">=</span> EESequentialRead<span style="color: #009900;">&#40;</span>SRF02<span style="color: #339933;">,</span> <span style="color: #208080;">0x02</span><span style="color: #339933;">,</span> measurement<span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Verifica l'esito dell'operazione di lettura del sensore</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>result<span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Scrive il valore letto dal sensore</span>
            measure <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>measurement<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</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>
            measure <span style="color: #339933;">+=</span> measurement<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> measure<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Di seguito invece la chiamata a questi nuovi metodi:</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('p412code8'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4128"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p412code8"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> main<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: #202020;">srf02_config</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    lcd_clear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        lcd_put_uint<span style="color: #009900;">&#40;</span>srf02_read<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Delay10KTCYx<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/11/02/412/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestire un sensore ad ultrasuoni SRF02</title>
		<link>http://www.it-robotix.net/2011/09/30/gestire-un-sensore-ad-ultrasuoni-srf02/</link>
		<comments>http://www.it-robotix.net/2011/09/30/gestire-un-sensore-ad-ultrasuoni-srf02/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 14:22:49 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Componenti]]></category>
		<category><![CDATA[sensori]]></category>
		<category><![CDATA[SRF02]]></category>
		<category><![CDATA[ultrasuoni]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=380</guid>
		<description><![CDATA[Finalmente è giunto il momento di mettere le mani su uno dei sensori ad ultrasuoni che conservo nei cassetti dei componenti, in particolare sto parlando del sensore SRF02, un telemetro ad ultrasuoni in grado di eseguire misurazioni comprese tra  16cm e 6m. Questo sensore può essere controllato sia in I2C che in seriale, la scelta [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente è giunto il momento di mettere le mani su uno dei sensori ad ultrasuoni che conservo nei cassetti dei componenti, in particolare sto parlando del sensore SRF02, un telemetro ad ultrasuoni in grado di eseguire misurazioni comprese tra  16cm e 6m.</p>
<p>Questo sensore può essere controllato sia in I2C che in seriale, la scelta della modalità di controllo avviene tramite uno dei 5 pin, che va collegato a massa se si vuole usare la seriale, o lasciato non collegato se si vuole usare il controllo tramite I2C. In questo articolo parlerò della mia esperienza con il sensore controllato in I2C tramite un PIC 18F2620, e come si potrà vedere la gestione del sensore è identica a quella di una comune EEPROM I2C. I dettagli sul sensore e il suo utilizzo li potete trovare a questo <a title="SRF02" href="http://www.robot-electronics.co.uk/htm/srf02techI2C.htm" target="_blank">link</a>.</p>
<p>Cominciamo ad analizzare lo schema elettrico del circuito che è quanto di più semplice possa esistere.</p>
<p style="text-align: center;"><img class="pie-img aligncenter" src="http://lh5.ggpht.com/-yqRzS8hY5DA/ToDtvwN5XGI/AAAAAAAABec/ORxeIEQdgxY/srf02.png?imgmax=400" alt="srf02.png" width="400" height="225" /><img style="margin: 10px 10px 10px 10px;" alt="" /></p>
<p><span id="more-380"></span></p>
<p>Come si può vedere, oltre alla circuiteria di base per il PIC (quarzo, condensatori e resistenza su MCLR) il sensore è collegato ai pin RC3 e RC4 rispettivamente SCL e SDA, utilizzati dal modulo MSSP del PIC per la comunicazione con dispositivi Slave I2C. Entrambi questi pin sono tenuti a livello alto tramite due resistenze di pull-up da 1,8K ohm, così come richiesto dalle specifiche del BUS I2C. Ho aggiunto allo schema anche un display, per poter visualizzare i valori restituiti dal sensore.</p>
<p>Vediamo ora il codice:</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('p380code10'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38010"><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
</pre></td><td class="code" id="p380code10"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> main<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> counter<span style="color: #339933;">;</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> range<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> autotune<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Configurazione del PIC</span>
    config_system<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Esegue 6 letture ravvicinate per l'autotune</span>
    srf02_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Loop infinito</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Invia al sensore la richiesta per avviare la misurazione in cm</span>
        srf02_tx<span style="color: #009900;">&#40;</span>SRF08<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">81</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Delay10KTCYx<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">70</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Legge i sei registri del sensore</span>
        srf02_rx<span style="color: #009900;">&#40;</span>SRF08<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        lcd_clear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Scrive la versione del software del Sensore</span>
        lcd_put_uchar<span style="color: #009900;">&#40;</span>srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Scrive il valore del registro non usato (dovrebbe essere 0x80)</span>
        lcd_put_uchar<span style="color: #009900;">&#40;</span>srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Scrive il valore letto dal sensore</span>
        range <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	range <span style="color: #339933;">+=</span> srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        lcd_put_uint<span style="color: #009900;">&#40;</span>range<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Scrive il valore di autotune</span>
        autotune <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	autotune <span style="color: #339933;">+=</span> srf02_buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        lcd_put_uint<span style="color: #009900;">&#40;</span>autotune<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #0000dd;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        Delay10KTCYx<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Come si può vedere anche il codice (quello completo è scaricabile da questo <a href="http://www.it-robotix.net/wp-content/uploads/2011/09/srf02_code.zip">link</a>) è molto semplice, alla riga 15 viene chiamata la funzione che avvia la misurazione della distanza in centimetri da parte del sensore. Poi un delay attende che siano passati 70 millisecondi, il tempo necessario per ricevere l&#8217;eco più lontana e poi vengono letti i 6 registri del sensore, memorizzando i valori nell&#8217;array srf02_buffer. Come indicato nella guida ogni registro del sensore contiene delle informazioni specifiche, come si può facilmente capire dai commenti nel codice, la parte che ci interessa di più è quella alle righe 25 e 26, dove viene letta la distanza misurata tra il sensore e l&#8217;oggetto che si trova di fronte. Sul display, a scopo puramente didattico, il codice visualizza tutti gli altri valori, e come si può vedere tutto il ciclo viene ripetuto ogni mezzo secondo. Alla riga 9 viene chiamata la funzione srf02_init(), questa non fa altro che eseguire sei misurazioni in rapida sequenza, come indicato nelle <a title="SRF02" href="http://www.robot-electronics.co.uk/htm/srf02techI2C.htm" target="_blank">specifiche</a> del sensore le prime 5/6 misurazioni vengono usate per fare un&#8217;auto calibrazione del sensore.</p>
<p>In un primo momento, seguendo l&#8217;esempio riportato sulle pagine della documentazione, andavo a leggere solamente i due registri che contengono la misura della distanza, facendo in questo modo però avevo delle strane misure che, partendo da un minimo cominciavano ad incrementarsi per dieci letture consecutive per poi ricominciare da capo. La misura più piccola risultava però essere molto più precisa di quella che ottengo leggendo tutti e 6 i registri. Non avendo trovato informazioni utili su questo strano comportamento ho comunque deciso di considerare il metodo della lettura di tutti i registri come più stabile, e quindi come sistema da utilizzare. Se avete delle esperienze diverse sarei curioso di capirne di più quindi non esitate a postare commenti con le vostre esperienze.</p>
<p style="text-align: center;"><a href="http://lh6.ggpht.com/-gmQcCNLJMFE/ToOP6Y89NmI/AAAAAAAABfU/5t3AHfUgELk/IMG_9731.JPG?imgmax=640" rel="lightbox[2011-8-5-16-14-52]"><img class="pie-img" style="margin: 10px 10px 10px 10px;" src="http://lh6.ggpht.com/-gmQcCNLJMFE/ToOP6Y89NmI/AAAAAAAABfU/5t3AHfUgELk/s144-c/IMG_9731.JPG" alt="IMG_9731.JPG" width="144" height="144" /></a></p>
<p>Prossimamente voglio provare ad utilizzare anche il modello SRF10, che viene gestito analogamente al SRF02, ma essendo dotato di una capsula US trasmittente ed una ricevente riesce a gestire una misura minima più bassa pari a 6cm.</p>
<p style="text-align: center;"><a href="http://www.it-robotix.net/wp-content/uploads/2011/09/srf02_code.zip">:: Scarica il codice completo ::</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/09/30/gestire-un-sensore-ad-ultrasuoni-srf02/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>2</slash:comments>
		</item>
		<item>
		<title>Finalmente è arrivato MBED</title>
		<link>http://www.it-robotix.net/2011/02/08/finalmente-e-arrivato-mbed/</link>
		<comments>http://www.it-robotix.net/2011/02/08/finalmente-e-arrivato-mbed/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 12:50:29 +0000</pubDate>
		<dc:creator>bobboteck</dc:creator>
				<category><![CDATA[Componenti]]></category>
		<category><![CDATA[mbed]]></category>

		<guid isPermaLink="false">http://www.it-robotix.net/?p=332</guid>
		<description><![CDATA[Finalmente è arrivato l&#8217;mbed, nella confezione ho trovato la scheda, e il cavo USB per collegarlo al PC, un foglietto con sopra stampate le semplici istruzioni per registrarsi al sito, un paio di copie della piedinatura della scheda di cui una anche plastificata e un adesivo, insomma è tutto pronto all&#8217;uso. Collegando l&#8217;mbed al PC, viene [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente è arrivato l&#8217;mbed, nella confezione ho trovato la scheda, e il cavo USB per collegarlo al PC, un foglietto con sopra stampate le semplici istruzioni per registrarsi al sito, un paio di copie della piedinatura della scheda di cui una anche plastificata e un adesivo, insomma è tutto pronto all&#8217;uso.</p>
<p>Collegando l&#8217;mbed al PC, viene visualizzato un nuovo disco rimovibile, che rappresenta la memoria flash dell&#8217;mbed dove andremo a scaricare il nostro programma, naturalmente se vediamo le proprietà si tratta di pochi KB (mai vista una chiavetta così piccola <img src='http://www.it-robotix.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ), come indicato anche nel foglietto delle istruzioni aprendo questo disco c&#8217;è dentro un file html che non è altro che un redirect alla pagina di registrazione sul sito dell&#8217;mbed.<br />
<span id="more-332"></span>Poche informazioni da compilare e ci si registra per accedere subito alla parte autenticata del sito, ho visto che da una parte è riportato un numero di serie che dovrebbe essere relativo al proprio mbed, ma non ho indagato se c&#8217;è un legame diretto o meno. La sezione autenticata fa molto Social Network, per prima cosa si accede alla propria Home da cui è possibile accedere ad altre pagine, il tutto per condividere progetti, librerie, riferimenti ad altri social network (FB,Twitter,LinkedIn), evidenziare come preferiti altri utenti, e altre funzionalità che ancora non ho avuto modo di esplorare, certo non siamo ai livelli di FB, ma ci sono diverse funzionalità utili, anche se ad un primo sguardo qualcosa manca, come ad esempio potrebbe essere un feed sull&#8217;evoluzione di progetti che si stanno seguendo.</p>
<p>Il punto forte è comunque il &#8220;Compiler&#8221;, cliccando su questo link si apre in una nuova finestra l&#8217;ambiente di sviluppo nel browser, da qui si gestiscono i propri progetti, ma è possibile anche cercare, ed importare, nel proprio workspace tutti i progetti/librerie pubbliche realizzate da altri utenti, tanto per segnalare un&#8217;altra funzionalità di navigazione, quando si incontrano dei progetti interessanti sono disponibili degli shortcut per accedere al compilatore con la sezione di import già configurata per caricare il progetto che si stava guardando.<br />
Il sito fornisce comunque una buona documentazione, a questo link ci sono le spiegazioni per cominciare ad utilizzare l&#8217;ambiente di sviluppo: <a href="http://mbed.org/handbook/Creating-a-program" target="_blank">http://mbed.org/handbook/Creating-a-program</a>.</p>
<p>Quando si crea un nuovo progetto, viene generato subito il codice per eseguire il lampeggio di uno dei 4 led presenti sulla scheda, ma basta fare un giro tra i vari progetti per capire come fare delle semplici modifiche e cominciare a fare dei semplici giochi di luci con i 4 led, magari andando ad importare qualche progetto già presente.<br />
Nel poco tempo che sono riuscito a dedicargli ieri ho visto che esiste anche la possibilità di utilizzare la connessione USB, normalmente usata per programmare la scheda, anche per la comunicazione con il PC, è sufficiente installare un driver (il driver è necessario solo per Windows), e la connessione verrà vista come una Seriale, quindi utilizzando un programma di terminale (tipo Hyper Terminal) e configurandolo come indicato nel sito si può stabilire una comunicazione bidirezionale con il PC.<br />
Per provare come funziona basta aprire la finestra del Compiler, creare un nuovo progetto e scrivere il codice che segue:</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('p332code12'); return false;">Mostra codice</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p33212"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p332code12"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;mbed.h&quot;</span>
DigitalOut myled<span style="color: #009900;">&#40;</span>LED1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <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>
      myled <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
      wait<span style="color: #009900;">&#40;</span><span style="color:#800080;">0.2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello World!n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      myled <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
      wait<span style="color: #009900;">&#40;</span><span style="color:#800080;">0.2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p> Lo standard output, ma anche lo standard input, è la seriale quindi usando la printf scriviamo direttamente sul terminale. A questo punto è sufficiente salvare il progetto e avviare la compilazione, terminata la quale il bowser avvia il download di un file &#8220;bin&#8221; con il nome del nostro progetto. Questo file, che possiamo scaricare direttamente nella memoria dell&#8217;mbed, rappresenta il nostro programma compilato, ora basta avviare il programma di terminale sul PC e poi premere il pulsante di reset sull&#8217;mbed, come risultato avremo il solito led lampeggiante, mentre sul terminale comparirà la scritta &#8220;Hello World!&#8221; che si ripeterà per ogni ciclo del codice.</p>
<p>Devo dire che sono rimasto molto colpito dalla semplicità con cui sono riuscito ad ottenere questo risultato, che in altre condizioni in cui mi sono trovato per fare una cosa simile (PIC&lt;-&gt;PC) ho impiegato decisamente molto più tempo ed è stata necessaria una conoscenza molto più approfondita dell&#8217;oggetto che stavo utilizzando, mentre in questo caso con un ora di &#8220;gioco&#8221; sono arrivato a questo risultato.<br />
Certo gli argomenti testati sono molto semplici, invece ero interessato ad utilizzare l&#8217;USB come Host e mi sono perso nei meandri dei vari documenti trovati sul sito, ma questo è sicuramente un argomento più complesso che richiede sicuramente uno studio più approfondito, anche perché è la prima volta che lo affronto e mi mancano anche le basi.<br />
Spero quanto prima di avere tempo da dedicarci e cominciare a studiare nuove cose, vi terrò aggiornati sulle varie esperienze, se invece nel frattempo avete qualche domanda o curiosità da chiarire chiedete pure, vediamo se riesco ad aiutarvi <img src='http://www.it-robotix.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.it-robotix.net/2011/02/08/finalmente-e-arrivato-mbed/feed/</wfw:commentRss>
		<slash:comments>3</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>
	</channel>
</rss>

