<?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>Automazione Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/automazione/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/automazione/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Mon, 12 Oct 2015 18:21:24 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>Automazione Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/automazione/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pilotare diversi dispositivi con il movimento della testa</title>
		<link>https://logicaprogrammabile.it/arduino-pilotare-dispositivi-movimento-testa/</link>
					<comments>https://logicaprogrammabile.it/arduino-pilotare-dispositivi-movimento-testa/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 02 May 2012 06:34:01 +0000</pubDate>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Automazione]]></category>
		<category><![CDATA[IRremote]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2702</guid>

					<description><![CDATA[<p>Come utilizzare Arduino per comandare diversi elettrodomestici col movimento della testa L&#8217;idea di questo progetto nasce per dare una mano alle persone con gravi disfunzioni motorie, utilizzando Arduino (per comandare alcuni sistemi come televisore, condizionatore, lampade e altri dispositivi) e un pc con webcam, per...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-pilotare-dispositivi-movimento-testa/">Pilotare diversi dispositivi con il movimento della testa</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come utilizzare Arduino per comandare diversi elettrodomestici col movimento della testa</h3>
<p>L&#8217;idea di questo progetto nasce per dare una mano alle persone con gravi disfunzioni motorie, utilizzando Arduino (per comandare alcuni sistemi come televisore, condizionatore, lampade e altri dispositivi) e un pc con webcam, per tradurre piccoli movimenti della testa in istruzioni da  impartire ad Arduino.</p>
<p>Il sistema è un prototipo che non è stato mai provato realmente, ma solo in ambiente simulato, pertanto non mi ritengo responsabile di malfunzionamenti e/o danni causati dal sistema; questo articolo vuole essere un&#8217;idea per poter realizzare qualcosa di più serio e sicuro, e spiegare come ho realizzato il prototipo utilizzando diverse tecnologie.</p>
<p><span id="more-2702"></span></p>
<p>Lo schema di funzionamento rappresentato in figura è il frutto dell&#8217;unione di elementi già esistenti che permettono di formare il sistema completo.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-2704" title="SchemaIRtxrx" src="https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIRtxrx.png" alt="Schema a blocchi sistema TX RX raggi infrarossi" width="712" height="247" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIRtxrx.png 712w, https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIRtxrx-300x104.png 300w" sizes="(max-width: 712px) 100vw, 712px" /></p>
<p>questo l&#8217;elenco dell&#8217;hardware e del software impiegato per il prototipo</p>
<ul>
<li>Arduino UNO</li>
<li>Classe IRremote</li>
<li>PC o Netbook</li>
<li>Webcam</li>
<li>Software basato su .Net Framework 4.0</li>
<li>Software per spostare il mouse con il tracking facciale tramite webcam</li>
<li>eventuali circuiti esterni per pilotare carichi</li>
</ul>
<p>il funzionamento del sistema si divide in due fasi denominate SETUP e OPERATIV. Nella fase di <strong>setup</strong> (quando il pin4 di Arduino si trova a livello logico alto) è possibile ricevere e decodificare il codice del telecomando e tramite il software sul pc, associarlo ad un pulsante dell&#8217;interfaccia grafica. Nella fase <strong>operativ</strong> (quando il pin4 di Arduino si trova a livello logico basso) il software sul pc permette di inviare ad Arduino il codice, associato ad un pulsante, e di riprodurre il relativo segnale ir.</p>
<p>Lo schema del circuito elettrico è il seguente:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-2715" title="SchemaIR" src="https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIR.gif" alt="Schema elettrico stadio ir e attuatori" width="506" height="357" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIR.gif 506w, https://logicaprogrammabile.it/wp-content/uploads/2012/04/SchemaIR-300x211.gif 300w" sizes="(max-width: 506px) 100vw, 506px" /></p>
<p>La sezione composta da un fototransistor (IR RX) si occupa di acquisire il segnale di un telecomando, mentre il diodo IR TX permette di trasmettere un codice precedentemente memorizzato.<br />
La sezione attuatori è composta da tre diodi led, che permettono di simulare le uscite verso relè o altri circuiti digitali. La sezione scelta modalità permette di eseguire la memorizzazione dei codici dei telecomandi piuttosto che la loro riproduzione.</p>
<p>il codice che gira sull&#8217;Arduino è il seguente, i diversi commenti nel codice ne spiegano il funzionamento</p>
<p>[c]<br />
#include &lt;IRremote.h&gt;<br />
//pin dove è collegato il fototransistor<br />
int RECV_PIN = 2;</p>
<p>//oggetti per ricevere e trasmettere il segnale IR<br />
IRrecv irrecv(RECV_PIN);<br />
IRsend irsend;</p>
<p>decode_results results;</p>
<p>String DataIR = &quot;&quot;;</p>
<p>char dataRX = &#8216; &#8216;;<br />
byte buffer = 0;</p>
<p>String codNome = &quot;&quot;;<br />
String codCodifica = &quot;&quot;;<br />
String codNumBit = &quot;&quot;;</p>
<p>void setup()<br />
{<br />
  //pin scelta modalita SETUP-OPERATIV<br />
  pinMode(4, INPUT);</p>
<p>  //inizializzazione seriale e classe ir<br />
  Serial.begin(9600);<br />
  irrecv.enableIRIn();<br />
}</p>
<p>//Funzione per decodificare il segnale ir<br />
void dump(decode_results *results) {</p>
<p>  //se non ci sono bit da decodificare esci<br />
  if(results-&gt;bits == 0)<br />
  {<br />
    return;<br />
  }</p>
<p>  //inizio struttura stringa da spedire al pc<br />
  Serial.print(&quot;@&quot;);</p>
<p>  //restituisci il tipo di codifica<br />
  if (results-&gt;decode_type == UNKNOWN) {<br />
    Serial.print(&quot;???&quot;);<br />
  }<br />
  else<br />
  {<br />
    if (results-&gt;decode_type == NEC)<br />
    {<br />
      Serial.print(&quot;NEC&quot;);<br />
    }<br />
    else if (results-&gt;decode_type == SONY)<br />
    {<br />
      Serial.print(&quot;SON&quot;);<br />
    }<br />
    else if (results-&gt;decode_type == RC5)<br />
    {<br />
      Serial.print(&quot;RC5&quot;);<br />
    }<br />
    else if (results-&gt;decode_type == RC6)<br />
    {<br />
      Serial.print(&quot;RC6&quot;);<br />
    }</p>
<p>    Serial.print(&quot;$&quot;);<br />
    //invio il codice del telecomando<br />
    Serial.print(results-&gt;value, HEX);</p>
<p>    Serial.print(&quot;$&quot;);<br />
    //invio il numero dei bit<br />
    Serial.print(results-&gt;bits, DEC);<br />
  }</p>
<p>  //fine buffer<br />
  Serial.println(&quot;#&quot;);</p>
<p>}</p>
<p>void loop()<br />
{<br />
  if(digitalRead(4) == HIGH)<br />
  {<br />
    //modalità registrazione segnale ir<br />
    if (irrecv.decode(&amp;results))<br />
    {<br />
      //invia al software tutti i dati<br />
      //sul segnale ir<br />
      dump(&amp;results);<br />
      // Receive the next value<br />
      irrecv.resume();<br />
    }<br />
  }<br />
  else if(digitalRead(4) == LOW)<br />
  {<br />
    //modalità generazione segnale ir in base a comando da pc<br />
    //via porta seriale<br />
    while(Serial.available())<br />
    {<br />
      //leggi dalla seriale il codice<br />
      //e trasmetilo via IR<br />
      dataRX = Serial.read();<br />
      //scarto lil carattere @<br />
      if(dataRX == &#8216;@&#8217;)<br />
        buffer = 0;<br />
      else if (dataRX == &#8216;$&#8217;)<br />
      {<br />
        buffer++;<br />
      }<br />
      else if (dataRX == &#8216;#&#8217;)<br />
      {<br />
        //fine pacchetto trasmetti i dati via ir<br />
        //Serial.println(codNome);<br />
        //Serial.println(codCodifica);<br />
        //Serial.println(codNumBit);</p>
<p>        //converte da stringa a int<br />
        char buf_codCodifica[codCodifica.length() + 1];<br />
        codCodifica.toCharArray(buf_codCodifica, codCodifica.length() + 1);</p>
<p>        char buf_codNumBit[codNumBit.length() + 1];<br />
        codNumBit.toCharArray(buf_codNumBit, codNumBit.length() + 1);</p>
<p>        long lng_codCodifica = atol(buf_codCodifica);<br />
        long lng_codNumBit = atol(buf_codNumBit);</p>
<p>        //Serial.println(lng_codCodifica);<br />
        //Serial.println(lng_codNumBit);</p>
<p>        //trasmette il segnale<br />
        if(codNome == &quot;NEC&quot;)<br />
          irsend.sendNEC(lng_codCodifica, lng_codNumBit);<br />
        if(codNome == &quot;SON&quot;)<br />
          irsend.sendSony(lng_codCodifica, lng_codNumBit);<br />
        if(codNome == &quot;RC5&quot;)<br />
          irsend.sendRC5(lng_codCodifica, lng_codNumBit);<br />
        if(codNome == &quot;RC6&quot;)<br />
          irsend.sendRC6(lng_codCodifica, lng_codNumBit);</p>
<p>        //pulisci le variabili per un nuovo comando<br />
        codNome = &quot;&quot;;<br />
        codCodifica = &quot;&quot;;<br />
        codNumBit = &quot;&quot;;<br />
        buffer = 0;<br />
      }<br />
      else<br />
      {<br />
        //accumula i caratteri provenienti dal pc e li dispone<br />
        //nelle relative variabili<br />
        if(buffer == 0)<br />
          codNome += dataRX;</p>
<p>        if(buffer == 1)<br />
          codCodifica += dataRX;</p>
<p>        if(buffer == 2)<br />
          codNumBit += dataRX;<br />
      }<br />
    }<br />
  }<br />
}<br />
[/c]</p>
<p>L&#8217;interfaccia del software che gira sul pc è mostrata in figura</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2012/04/Pararduino.png"><img decoding="async" class="aligncenter size-medium wp-image-2724" title="Pararduino" src="https://logicaprogrammabile.it/wp-content/uploads/2012/04/Pararduino-300x182.png" alt="" width="300" height="182" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/04/Pararduino-300x182.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2012/04/Pararduino.png 994w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Il pulsante <strong>Avvia registrazione</strong> permette di ricevere la stringa inviata da Arduino contenente Il nome della codifica, il valore e il numero di bit che la compongono. Una volta acquisito il codice è possibile assegnarlo ad uno dei dodici pulsanti dei comandi, semplicemente cliccando sul numero di pulsante nella <strong>lista dei codici assegnati ai pulsant</strong>i e cliccando sul pulsante <strong>Assegna</strong>.<br />
Una volta terminata la fase di registrazione e dopo aver settato il circuito nella modalità <strong>Operativ</strong>, è possibile inviare il codice del telecomando alla scheda cliccando semplicemente il pulsante relativo.</p>
<p>La fase successiva è quella di impiegare un software per il tracking facciale. Per la prova ho utilizzato <a href="http://cameramouse.org/" target="_blank">Camera Mouse 2012</a> disponibile gratuitamente per il download. Avviamo il software, viene rilevata automaticamente la webcam, tramite il mouse dobbiamo cliccare su un punto del viso da traccare, ad esempio la punta del naso. Per avviare lo spostamento del mouse tramite movimenti della testa è necessario premete il tasto <strong>Ctrl</strong> della tastiera. Nella sezione <strong>settings</strong> del programma è possibile settare molti parametri tra cui la simulazione del click che viene effettuata quando il puntatore del mouse rimane, per un tempo stabilito, fermo sopra un&#8217;icona o pulsante. Quindi ritornando alla nostra interfaccia grafica, il click verrà effettuato quando il puntatore del mouse rimarrà fermo sopra un pulsante <strong>Comando</strong>.</p>
<p>Attualmente il progetto èin fase embrionale, bisogna ancora migliorare le funzionalità del software su pc che deve permettere anche la gestione diretta dei pin digitali della board Arduino.<br />
Anche la gestione dei segnali ir, che attualmente vengono gestiti dalla libreria IRremote, può essere migliorata creando un sistema di acquisizione diretta dei segnali in modo da permettere la gestione di ogni tipo di telecomando, visto che nel prototipo vengono gestito solo le codifiche NEC, SONY RC5 e RC6</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-pilotare-dispositivi-movimento-testa/">Pilotare diversi dispositivi con il movimento della testa</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-pilotare-dispositivi-movimento-testa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
