<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mbattistella</id>
		<title>Proyecto Butiá - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mbattistella"/>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php/Especial:Contribuciones/Mbattistella"/>
		<updated>2026-04-05T23:53:10Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Tlx&amp;diff=2234</id>
		<title>Plantilla:Tlx</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Tlx&amp;diff=2234"/>
				<updated>2012-02-29T22:01:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '{{fusionar en|Plantilla:ep}} {{Subpágina de documentación}} === Uso === Enlace a plantilla, muestra una presentación mejorada y hasta tres parámetros y [[Ayuda:Enlace interl...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fusionar en|Plantilla:ep}}&lt;br /&gt;
{{Subpágina de documentación}}&lt;br /&gt;
=== Uso ===&lt;br /&gt;
Enlace a plantilla, muestra una presentación mejorada y hasta tres parámetros y [[Ayuda:Enlace interlingüístico|enlaces interlingüísticos]].&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de enlaces internos]]&lt;br /&gt;
&lt;br /&gt;
[[en:Template:Tlx]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2233</id>
		<title>Plantilla:Listaref/doc</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2233"/>
				<updated>2012-02-29T22:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Subpágina de documentación}}&lt;br /&gt;
{{Metaplantilla de avisos&lt;br /&gt;
|texto = '''Las referencias en columnas múltiples son compatibles únicamente con las versiones más recientes de [[Gecko (motor de renderizado)|Gecko]] ([[Firefox]]) y [[WebKit]] ([[Google Chrome]], [[Safari (navegador)|Safari]]).'''&amp;lt;br&amp;gt;Cualquier versión anterior a la '''10''' de [[Internet Explorer]], así como cualquier versión anterior a la '''11''' de [[Opera (navegador)|Opera]], no es compatible con las columnas múltiples.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:88%&amp;quot;&amp;gt;Véase [[#Separación en columnas según el navegador en uso|más abajo]] para más información.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Uso ===&lt;br /&gt;
Parámetros:&lt;br /&gt;
&lt;br /&gt;
* '''n =''' número de columnas.&lt;br /&gt;
* '''ancho =''' ancho de la(s) columna(s).&lt;br /&gt;
&lt;br /&gt;
En definitiva, si quieres utilizar esta plantilla, debes colocar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{listaref|n|ancho=xxx}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde n corresponde al número de columnas y «xxx» define el mínimo ancho en píxeles de cada columna.&lt;br /&gt;
&lt;br /&gt;
El número de columnas solo se aplica si la anchura del navegador lo permite. Es decir, si n=2 y &amp;lt;code&amp;gt;ancho=600px&amp;lt;/code&amp;gt;, la plantilla generará dos columnas cuando la anchura de la ventana del navegador sea superior a 1200 píxeles, y sólo una única columna cuando la anchura sea inferior.&lt;br /&gt;
&lt;br /&gt;
=== Referencias por grupo ===&lt;br /&gt;
Desde junio de 2008, el sistema de notas al pie soporta la separación de referencias en grupos. Los grupos permiten tener separadas las notas aclaratorias, las referencias de tablas y más.&lt;br /&gt;
&lt;br /&gt;
El formato general para una etiqueta de referencia de grupo es:&lt;br /&gt;
&lt;br /&gt;
:{{tag|ref group=''&amp;quot;nombre_del_grupo&amp;quot;''|apertura}}&lt;br /&gt;
&lt;br /&gt;
y para la plantilla de lista de referencias:&lt;br /&gt;
:{{tlx|listaref|grupo=''&amp;quot;nombre_del_grupo&amp;quot;''}}&lt;br /&gt;
&lt;br /&gt;
:Donde ''nombre_del_grupo'' será el identificador de grupo tal como &amp;quot;nota&amp;quot;, &amp;quot;n&amp;quot; o el nombre deseado.&lt;br /&gt;
&lt;br /&gt;
;Parámetro refs&lt;br /&gt;
&lt;br /&gt;
Dentro de las referencias se coloca:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{listaref|group=&amp;quot;nombre_del_grupo&amp;quot;|refs=&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre1&amp;quot;&amp;gt;contenido1&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre2&amp;quot;&amp;gt;contenido2&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Así, estas referencias pueden ser invocadas en el artículo como:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre1&amp;quot; /&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre2&amp;quot; /&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estilos de lista ===&lt;br /&gt;
El parámetro {{parámetro|estilolista}} permite especificar el estilo de los numerales de las referencias. &lt;br /&gt;
{{Lista desplegable&lt;br /&gt;
|título=Tipos de estilos de lista&lt;br /&gt;
|título_estilo=background:#ccccff; text-align:center;&lt;br /&gt;
|1={{Listaref/doc/estilolista}}}}&lt;br /&gt;
&lt;br /&gt;
=== Detalles técnicos ===&lt;br /&gt;
==== Separación en columnas según el navegador en uso ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right; margin:0 0 1em 1em; text-align:center; font-size:90%;&amp;quot;&lt;br /&gt;
|+ Soporte de navegador web para esquemas de columnas múltiples CSS3&lt;br /&gt;
! Internet&amp;lt;br&amp;gt;Explorer !! Firefox !! Safari !! Chrome !! Opera&lt;br /&gt;
|-&lt;br /&gt;
| {{no|6}} || {{sí|3}} || {{sí|3}} || {{sí|8}} || {{no|10}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|7}} || {{sí|4}} || {{sí|4}} || {{sí|9}} || {{no|11}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|8}} || {{sí|5}} || {{sí|5}} || {{sí|10}} || {{sí|11.1}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|9}} || || || {{sí|11}} || {{sí|12}}&lt;br /&gt;
|-&lt;br /&gt;
| {{yes|10}} ||   || || {{sí|12}} || &lt;br /&gt;
|}&lt;br /&gt;
Las columnas múltiples se generan usando [[Cascading Style Sheets|CSS3]], aún en fase de desarrollo; por ello sólo los navegadores de Internet que soportan esta función mostrarán columnas múltiples.&amp;lt;ref&amp;gt;{{cita web|fechaacceso=31 de marzo de 2009|título=CSS3 Multi-Column Thriller|url=http://www.stuffandnonsense.co.uk/archives/css3_multi-column_thriller.html}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cita web|url=http://www.w3.org/TR/css3-multicol/|título=CSS3 module: Multi-column layout|editorial=[[World Wide Web Consortium|W3C]]|fechaacceso=31 de marzo de 2009}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los siguientes navegadores '''soportan''' columnas CSS3:&lt;br /&gt;
* Navegadores basados en [[Gecko (motor de renderizado)|Gecko]], como [[Mozilla Firefox]]&lt;br /&gt;
* Navegadores basados en [[WebKit]], como [[Safari (navegador)|Safari]] y [[Google Chrome]]&lt;br /&gt;
* [[Opera (navegador)|Opera]] a partir de la versión 11.10&lt;br /&gt;
* [[Internet Explorer 10]] Platform Preview&lt;br /&gt;
&lt;br /&gt;
Los siguientes navegadores '''no soportan''' columnas CSS3:&lt;br /&gt;
* Navegadores basados en [[Trident]], incluyendo Internet Explorer hasta la versión 9&amp;lt;ref&amp;gt;{{Cita web |url=http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx#multicolumn |title=CSS Compatibility and Internet Explorer: Multi-column Layout |work=Microsoft Developer Network |publisher=Microsoft |accessdate=March 16, 2011}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Opera (navegador)|Opera]] hasta la versión 11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Véase también ===&lt;br /&gt;
* [[Wikipedia:Referencias]]&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de listas]]&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de referencias]]&lt;br /&gt;
&lt;br /&gt;
[[ar:قالب:ثبت المراجع]]&lt;br /&gt;
[[be-x-old:Шаблён:Зноскі]]&lt;br /&gt;
[[br:Patrom:Daveoù]]&lt;br /&gt;
[[ca:Plantilla:Referències]]&lt;br /&gt;
[[cy:Nodyn:Cyfeiriadau]]&lt;br /&gt;
[[en:Template:Reflist]]&lt;br /&gt;
[[eo:Ŝablono:Referencoj]]&lt;br /&gt;
[[eu:Txantiloi:Erreferentzia zerrenda]]&lt;br /&gt;
[[fa:الگو:پانویس]]&lt;br /&gt;
[[fi:Malline:Viitteet]]&lt;br /&gt;
[[fr:Modèle:Références]]&lt;br /&gt;
[[hi:साँचा:टिप्पणीसूची]]&lt;br /&gt;
[[hr:Predložak:Izvori]]&lt;br /&gt;
[[hsb:Předłoha:Referency]]&lt;br /&gt;
[[hu:Sablon:Reflist]]&lt;br /&gt;
[[ia:Patrono:Reflist]]&lt;br /&gt;
[[it:Template:References]]&lt;br /&gt;
[[ja:Template:Reflist]]&lt;br /&gt;
[[ka:თარგი:სქოლიოს სია]]&lt;br /&gt;
[[ko:틀:주석]]&lt;br /&gt;
[[lv:Veidne:Reflist]]&lt;br /&gt;
[[ml:ഫലകം:Reflist]]&lt;br /&gt;
[[ms:Templat:Reflist]]&lt;br /&gt;
[[no:Mal:Reflist]]&lt;br /&gt;
[[pl:Szablon:Przypisy]]&lt;br /&gt;
[[pt:Predefinição:Referências]]&lt;br /&gt;
[[ro:Format:Listănote]]&lt;br /&gt;
[[ru:Шаблон:Примечания]]&lt;br /&gt;
[[sr:Шаблон:Напомене]]&lt;br /&gt;
[[th:แม่แบบ:รายการอ้างอิง]]&lt;br /&gt;
[[uk:Шаблон:Reflist]]&lt;br /&gt;
[[vi:Bản mẫu:Tham khảo]]&lt;br /&gt;
[[zh:Template:Reflist]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Purgar&amp;diff=2232</id>
		<title>Plantilla:Purgar</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Purgar&amp;diff=2232"/>
				<updated>2012-02-29T21:57:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '&amp;lt;span class=&amp;quot;noprint plainlinks purgelink&amp;quot;&amp;gt;[{{fullurl:{{{página|{{{page|{{FULLPAGENAME}}}}}}}}|action=purge}} &amp;lt;span title=&amp;quot;Purga esta página&amp;quot;&amp;gt;{{{1|purgar}}}&amp;lt;/span&amp;gt;]&amp;lt;noinclude&amp;gt;...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;noprint plainlinks purgelink&amp;quot;&amp;gt;[{{fullurl:{{{página|{{{page|{{FULLPAGENAME}}}}}}}}|action=purge}} &amp;lt;span title=&amp;quot;Purga esta página&amp;quot;&amp;gt;{{{1|purgar}}}&amp;lt;/span&amp;gt;]&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Tag&amp;diff=2231</id>
		<title>Plantilla:Tag</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Tag&amp;diff=2231"/>
				<updated>2012-02-29T21:33:33Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '&amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;{{#switch:{{{2|par}}}  |cierre  |simple   = &amp;lt;!--nothing--&amp;gt;  |apertura  |par  |#default = &amp;amp;lt;{{{1|tag}}}{{#if:{{{params|}}}|&amp;amp;#32;{{{params}}}}}...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;{{#switch:{{{2|par}}}&lt;br /&gt;
 |cierre&lt;br /&gt;
 |simple   = &amp;lt;!--nothing--&amp;gt;&lt;br /&gt;
 |apertura&lt;br /&gt;
 |par&lt;br /&gt;
 |#default = &amp;amp;lt;{{{1|tag}}}{{#if:{{{params|}}}|&amp;amp;#32;{{{params}}}}}&amp;amp;gt;&lt;br /&gt;
}}{{#switch:{{{2|pair}}}&lt;br /&gt;
 |apertura&lt;br /&gt;
 |cierre&lt;br /&gt;
 |simple   = &amp;lt;!--nothing--&amp;gt;&lt;br /&gt;
 |par&lt;br /&gt;
 |#default = {{{contenido|}}}&lt;br /&gt;
}}{{#switch:{{{2|par}}}&lt;br /&gt;
 |apertura&lt;br /&gt;
 |simple   = &amp;lt;!--nothing--&amp;gt;&lt;br /&gt;
 |cierre&lt;br /&gt;
 |par&lt;br /&gt;
 |#default = &amp;amp;lt;&amp;amp;#47;{{{1|tag}}}&amp;amp;gt;&lt;br /&gt;
}}{{#switch:{{{2|par}}}&lt;br /&gt;
 |simple   = &amp;amp;lt;{{{1|tag}}}{{#if:{{{params|}}}|&amp;amp;#32;{{{params}}}}}&amp;amp;#47;&amp;amp;gt;&lt;br /&gt;
}}&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2230</id>
		<title>Plantilla:Listaref/doc</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2230"/>
				<updated>2012-02-29T21:27:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página blanqueada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2229</id>
		<title>Plantilla:Listaref/doc</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref/doc&amp;diff=2229"/>
				<updated>2012-02-29T21:25:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '{{Subpágina de documentación}} {{Metaplantilla de avisos |texto = '''Las referencias en columnas múltiples son compatibles únicamente con las versiones más recientes de [[G...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Subpágina de documentación}}&lt;br /&gt;
{{Metaplantilla de avisos&lt;br /&gt;
|texto = '''Las referencias en columnas múltiples son compatibles únicamente con las versiones más recientes de [[Gecko (motor de renderizado)|Gecko]] ([[Firefox]]) y [[WebKit]] ([[Google Chrome]], [[Safari (navegador)|Safari]]).'''&amp;lt;br&amp;gt;Cualquier versión anterior a la '''10''' de [[Internet Explorer]], así como cualquier versión anterior a la '''11''' de [[Opera (navegador)|Opera]], no es compatible con las columnas múltiples.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:88%&amp;quot;&amp;gt;Véase [[#Separación en columnas según el navegador en uso|más abajo]] para más información.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Uso ===&lt;br /&gt;
Parámetros:&lt;br /&gt;
&lt;br /&gt;
* '''n =''' número de columnas.&lt;br /&gt;
* '''ancho =''' ancho de la(s) columna(s).&lt;br /&gt;
&lt;br /&gt;
En definitiva, si quieres utilizar esta plantilla, debes colocar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{{listaref|n|ancho=xxx}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde n corresponde al número de columnas y «xxx» define el mínimo ancho en píxeles de cada columna.&lt;br /&gt;
&lt;br /&gt;
El número de columnas solo se aplica si la anchura del navegador lo permite. Es decir, si n=2 y &amp;lt;code&amp;gt;ancho=600px&amp;lt;/code&amp;gt;, la plantilla generará dos columnas cuando la anchura de la ventana del navegador sea superior a 1200 píxeles, y sólo una única columna cuando la anchura sea inferior.&lt;br /&gt;
&lt;br /&gt;
=== Referencias por grupo ===&lt;br /&gt;
Desde junio de 2008, el sistema de notas al pie soporta la separación de referencias en grupos. Los grupos permiten tener separadas las notas aclaratorias, las referencias de tablas y más.&lt;br /&gt;
&lt;br /&gt;
El formato general para una etiqueta de referencia de grupo es:&lt;br /&gt;
&lt;br /&gt;
:{{tag|ref group=''&amp;quot;nombre_del_grupo&amp;quot;''|apertura}}&lt;br /&gt;
&lt;br /&gt;
y para la plantilla de lista de referencias:&lt;br /&gt;
:{{tlx|listaref|grupo=''&amp;quot;nombre_del_grupo&amp;quot;''}}&lt;br /&gt;
&lt;br /&gt;
:Donde ''nombre_del_grupo'' será el identificador de grupo tal como &amp;quot;nota&amp;quot;, &amp;quot;n&amp;quot; o el nombre deseado.&lt;br /&gt;
&lt;br /&gt;
;Parámetro refs&lt;br /&gt;
&lt;br /&gt;
Dentro de las referencias se coloca:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{listaref|group=&amp;quot;nombre_del_grupo&amp;quot;|refs=&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre1&amp;quot;&amp;gt;contenido1&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre2&amp;quot;&amp;gt;contenido2&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Así, estas referencias pueden ser invocadas en el artículo como:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre1&amp;quot; /&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre2&amp;quot; /&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Estilos de lista ===&lt;br /&gt;
El parámetro {{parámetro|estilolista}} permite especificar el estilo de los numerales de las referencias. &lt;br /&gt;
{{Lista desplegable&lt;br /&gt;
|título=Tipos de estilos de lista&lt;br /&gt;
|título_estilo=background:#ccccff; text-align:center;&lt;br /&gt;
|1={{Listaref/doc/estilolista}}}}&lt;br /&gt;
&lt;br /&gt;
=== Detalles técnicos ===&lt;br /&gt;
==== Separación en columnas según el navegador en uso ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right; margin:0 0 1em 1em; text-align:center; font-size:90%;&amp;quot;&lt;br /&gt;
|+ Soporte de navegador web para esquemas de columnas múltiples CSS3&lt;br /&gt;
! Internet&amp;lt;br&amp;gt;Explorer !! Firefox !! Safari !! Chrome !! Opera&lt;br /&gt;
|-&lt;br /&gt;
| {{no|6}} || {{sí|3}} || {{sí|3}} || {{sí|8}} || {{no|10}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|7}} || {{sí|4}} || {{sí|4}} || {{sí|9}} || {{no|11}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|8}} || {{sí|5}} || {{sí|5}} || {{sí|10}} || {{sí|11.1}}&lt;br /&gt;
|-&lt;br /&gt;
| {{no|9}} || || || {{sí|11}} || {{sí|12}}&lt;br /&gt;
|-&lt;br /&gt;
| {{yes|10}} ||   || || {{sí|12}} || &lt;br /&gt;
|}&lt;br /&gt;
Las columnas múltiples se generan usando [[Cascading Style Sheets|CSS3]], aún en fase de desarrollo; por ello sólo los navegadores de Internet que soportan esta función mostrarán columnas múltiples.&amp;lt;ref&amp;gt;{{cita web|fechaacceso=31 de marzo de 2009|título=CSS3 Multi-Column Thriller|url=http://www.stuffandnonsense.co.uk/archives/css3_multi-column_thriller.html}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cita web|url=http://www.w3.org/TR/css3-multicol/|título=CSS3 module: Multi-column layout|editorial=[[World Wide Web Consortium|W3C]]|fechaacceso=31 de marzo de 2009}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los siguientes navegadores '''soportan''' columnas CSS3:&lt;br /&gt;
* Navegadores basados en [[Gecko (motor de renderizado)|Gecko]], como [[Mozilla Firefox]]&lt;br /&gt;
* Navegadores basados en [[WebKit]], como [[Safari (navegador)|Safari]] y [[Google Chrome]]&lt;br /&gt;
* [[Opera (navegador)|Opera]] a partir de la versión 11.10&lt;br /&gt;
* [[Internet Explorer 10]] Platform Preview&lt;br /&gt;
&lt;br /&gt;
Los siguientes navegadores '''no soportan''' columnas CSS3:&lt;br /&gt;
* Navegadores basados en [[Trident]], incluyendo Internet Explorer hasta la versión 9&amp;lt;ref&amp;gt;{{Cita web |url=http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx#multicolumn |title=CSS Compatibility and Internet Explorer: Multi-column Layout |work=Microsoft Developer Network |publisher=Microsoft |accessdate=March 16, 2011}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Opera (navegador)|Opera]] hasta la versión 11&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Véase también ===&lt;br /&gt;
* [[Wikipedia:Referencias]]&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de listas]]&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de referencias]]&lt;br /&gt;
&lt;br /&gt;
[[ar:قالب:ثبت المراجع]]&lt;br /&gt;
[[be-x-old:Шаблён:Зноскі]]&lt;br /&gt;
[[br:Patrom:Daveoù]]&lt;br /&gt;
[[ca:Plantilla:Referències]]&lt;br /&gt;
[[cy:Nodyn:Cyfeiriadau]]&lt;br /&gt;
[[en:Template:Reflist]]&lt;br /&gt;
[[eo:Ŝablono:Referencoj]]&lt;br /&gt;
[[eu:Txantiloi:Erreferentzia zerrenda]]&lt;br /&gt;
[[fa:الگو:پانویس]]&lt;br /&gt;
[[fi:Malline:Viitteet]]&lt;br /&gt;
[[fr:Modèle:Références]]&lt;br /&gt;
[[hi:साँचा:टिप्पणीसूची]]&lt;br /&gt;
[[hr:Predložak:Izvori]]&lt;br /&gt;
[[hsb:Předłoha:Referency]]&lt;br /&gt;
[[hu:Sablon:Reflist]]&lt;br /&gt;
[[ia:Patrono:Reflist]]&lt;br /&gt;
[[it:Template:References]]&lt;br /&gt;
[[ja:Template:Reflist]]&lt;br /&gt;
[[ka:თარგი:სქოლიოს სია]]&lt;br /&gt;
[[ko:틀:주석]]&lt;br /&gt;
[[lv:Veidne:Reflist]]&lt;br /&gt;
[[ml:ഫലകം:Reflist]]&lt;br /&gt;
[[ms:Templat:Reflist]]&lt;br /&gt;
[[no:Mal:Reflist]]&lt;br /&gt;
[[pl:Szablon:Przypisy]]&lt;br /&gt;
[[pt:Predefinição:Referências]]&lt;br /&gt;
[[ro:Format:Listănote]]&lt;br /&gt;
[[ru:Шаблон:Примечания]]&lt;br /&gt;
[[sr:Шаблон:Напомене]]&lt;br /&gt;
[[th:แม่แบบ:รายการอ้างอิง]]&lt;br /&gt;
[[uk:Шаблон:Reflist]]&lt;br /&gt;
[[vi:Bản mẫu:Tham khảo]]&lt;br /&gt;
[[zh:Template:Reflist]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Documentaci%C3%B3n&amp;diff=2228</id>
		<title>Plantilla:Documentación</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Documentaci%C3%B3n&amp;diff=2228"/>
				<updated>2012-02-29T20:59:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '&amp;lt;includeonly&amp;gt;&amp;lt;div style=&amp;quot;clear: both; margin: 1em 0 0 0; background: #EEF9FA; border: 1px dotted #8BCBFF; color:#000; padding: 0.9em;&amp;quot;&amp;gt; &amp;lt;div style=&amp;quot;padding-bottom:3px; border-bo...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;div style=&amp;quot;clear: both; margin: 1em 0 0 0; background: #EEF9FA; border: 1px dotted #8BCBFF; color:#000; padding: 0.9em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding-bottom:3px; border-bottom: 1px solid #aaa; margin-bottom:1ex&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;editsection plainlinks&amp;quot; id=&amp;quot;doc_editlinks&amp;quot;&amp;gt;{{#ifexist:{{{1|{{FULLPAGENAME}}/doc}}}|[[{{fullurl:{{{1|{{FULLPAGENAME}}/doc}}}|action=edit}} editar]] [{{purgar}}]|[[{{fullurl:{{{1|{{FULLPAGENAME}}/doc}}}|action=edit&amp;amp;preload=Plantilla:Documentación/precarga}} crear]]}}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 150%&amp;quot;&amp;gt;[[Archivo:Template-info.svg|35px|link=]] Documentación de plantilla&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#ifexist:{{{1|{{FULLPAGENAME}}/doc}}} | __NOEDITSECTION__{{ {{{1|{{FULLPAGENAME}}/doc}}}|ns:0 }} }}&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both; margin: 0.2em 0; border: 1px dotted #8BCBFF; background-color: #EEF9FA; color:#000; padding: 0.25em 0.9em; font-style: italic&amp;quot;&amp;gt;{{#ifexist:{{{1|{{FULLPAGENAME}}/doc}}}|Esta documentación está transcluida desde [[{{{1|{{FULLPAGENAME}}/doc}}}]].&amp;lt;br&amp;gt;}}Los editores pueden experimentar en la [[{{#ifexist:{{FULLPAGENAME}}/zona de pruebas | {{FULLPAGENAME}}/zona de pruebas | {{FULLPAGENAME}}/pruebas }}|zona de pruebas]] de la plantilla.&amp;lt;br&amp;gt;Por favor, añade las categorías e interwikis a la subpágina de documentación. [[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpáginas de esta plantilla]].&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref&amp;diff=2227</id>
		<title>Plantilla:Listaref</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Plantilla:Listaref&amp;diff=2227"/>
				<updated>2012-02-29T20:55:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Página creada con '&amp;lt;div class=&amp;quot;listaref&amp;quot; style=&amp;quot;&amp;lt;!--  --&amp;gt;{{#if: {{{ancho|{{{colwidth|}}}}}}     | -moz-column-width: {{{ancho{{{colwidth|}}}}}}; -webkit-column-width: {{{ancho{{{colwidth|}}}}}}; c...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;listaref&amp;quot; style=&amp;quot;&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if: {{{ancho|{{{colwidth|}}}}}}&lt;br /&gt;
    | -moz-column-width: {{{ancho{{{colwidth|}}}}}}; -webkit-column-width: {{{ancho{{{colwidth|}}}}}}; column-width: {{{ancho{{{colwidth|}}}}}};&lt;br /&gt;
    | {{#if: {{{1|}}}&lt;br /&gt;
      | -moz-column-count:{{{1}}}; -webkit-column-count:{{{1}}}; column-count:{{{1}}};&lt;br /&gt;
      }}&lt;br /&gt;
    }} list-style-type: &amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{{estilolista|{{{liststyle|{{#switch: {{{grupo|{{{group|}}}}}}&lt;br /&gt;
    | upper-alpha&lt;br /&gt;
    | upper-roman&lt;br /&gt;
    | lower-alpha&lt;br /&gt;
    | lower-greek&lt;br /&gt;
    | lower-roman = {{{grupo|{{{group}}}}}}&lt;br /&gt;
    | #default = decimal}}}}}}}};&amp;quot;&amp;gt;{{#tag:references|{{{refs|}}}|group={{{grupo|{{{group|}}}}}}}}&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2220</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2220"/>
				<updated>2012-02-29T14:38:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Febrero 177.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Febrero 174.JPG|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''(Falta la descripción)'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Febrero 179.JPG|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_177.JPG&amp;diff=2219</id>
		<title>Archivo:Febrero 177.JPG</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_177.JPG&amp;diff=2219"/>
				<updated>2012-02-29T14:38:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Dispositivos colocados&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dispositivos colocados&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2218</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2218"/>
				<updated>2012-02-29T14:36:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Proyecto: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Febrero 174.JPG|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''(Falta la descripción)'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Febrero 179.JPG|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_174.JPG&amp;diff=2217</id>
		<title>Archivo:Febrero 174.JPG</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_174.JPG&amp;diff=2217"/>
				<updated>2012-02-29T14:36:13Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Placa montada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Placa montada&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2216</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2216"/>
				<updated>2012-02-29T14:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Comenzando las pruebas: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''(Falta la descripción)'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Febrero 179.JPG|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2215</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2215"/>
				<updated>2012-02-29T14:33:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Comenzando las pruebas: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''(Falta la descripción)'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Archivo:Febrero 179.JPG|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_179.JPG&amp;diff=2214</id>
		<title>Archivo:Febrero 179.JPG</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Archivo:Febrero_179.JPG&amp;diff=2214"/>
				<updated>2012-02-29T14:32:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: Robot butia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot butia&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2188</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2188"/>
				<updated>2012-02-25T20:10:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Bobot-Server, monitoreo desde la terminal de Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''(Falta la descripción)'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2187</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2187"/>
				<updated>2012-02-25T20:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Bobot-Server, monitoreo desde la terminal de Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*INIT&lt;br /&gt;
'''Falta la descripción'''&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2186</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2186"/>
				<updated>2012-02-25T20:05:03Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 8) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2182</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2182"/>
				<updated>2012-02-24T19:03:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2181</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2181"/>
				<updated>2012-02-24T19:03:11Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
ahora.&amp;lt;ref&amp;gt;Vila, Marco Aurelio. 1967: Aspectos geográficos de las Dependencias Federales. Corporación Venezolana de Fomento. Caracas. 115p.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Cervigon, Fernando. 1995: Las Dependencias Federales. Academia Nacional de la Historia. Caracas. 193p.&amp;lt;/ref&amp;gt;&amp;lt;ref &amp;gt;Hernández Caballero, Serafín (Editor). 1998: Gran Enciclopedia de Venezuela. Editorial Globe, C.A. Caracas. 10 volúmenes. ISBN 980-6427-00-9 ISBN 980-6427-10-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2180</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2180"/>
				<updated>2012-02-24T19:02:59Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref&amp;gt;Vila, Marco Aurelio. 1967: Aspectos geográficos de las Dependencias Federales. Corporación Venezolana de Fomento. Caracas. 115p.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Cervigon, Fernando. 1995: Las Dependencias Federales. Academia Nacional de la Historia. Caracas. 193p.&amp;lt;/ref&amp;gt;&amp;lt;ref &amp;gt;Hernández Caballero, Serafín (Editor). 1998: Gran Enciclopedia de Venezuela. Editorial Globe, C.A. Caracas. 10 volúmenes. ISBN 980-6427-00-9 ISBN 980-6427-10-6&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2179</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2179"/>
				<updated>2012-02-24T19:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Referencias: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2178</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2178"/>
				<updated>2012-02-24T19:01:01Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Referencias: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2177</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2177"/>
				<updated>2012-02-24T19:00:36Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Referencia: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencias:'''=&lt;br /&gt;
&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2176</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2176"/>
				<updated>2012-02-24T19:00:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
='''Referencia:'''=&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2175</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2175"/>
				<updated>2012-02-24T18:59:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en &amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2174</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2174"/>
				<updated>2012-02-24T18:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2173</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2173"/>
				<updated>2012-02-24T18:56:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla &amp;lt;ref&amp;gt;PAra ver más información consultar en http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt; uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar&amp;lt;ref&amp;gt;Para descargar el firmware: http://www.fing.edu.uy/inco/proyectos/butia/&amp;lt;/ref&amp;gt;&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2172</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2172"/>
				<updated>2012-02-24T18:50:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) el cual lo identifica ante el cliente (tortugarte por ejemplo) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2162</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2162"/>
				<updated>2012-02-24T03:30:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Comenzando las pruebas: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2161</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2161"/>
				<updated>2012-02-24T03:30:40Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Comenzando las pruebas: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==='''Comenzando las pruebas:'''===&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2160</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2160"/>
				<updated>2012-02-24T03:30:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Comenzando las pruebas: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===='''Comenzando las pruebas:'''====&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2159</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2159"/>
				<updated>2012-02-24T03:22:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2158</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2158"/>
				<updated>2012-02-24T03:22:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Desarrollo del problema: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2157</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2157"/>
				<updated>2012-02-24T03:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2156</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2156"/>
				<updated>2012-02-24T03:21:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2155</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2155"/>
				<updated>2012-02-24T03:17:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Monitoreo desde el compilador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 14: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2154</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2154"/>
				<updated>2012-02-24T03:16:43Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Bobot-Server, monitoreo desde la terminal de Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 10: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 11: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.12: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2153</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2153"/>
				<updated>2012-02-24T03:15:42Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Proyecto: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:Image.png|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2152</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2152"/>
				<updated>2012-02-24T03:15:15Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* El Proyecto: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando5.jpg|thumb|Fig.7: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2151</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2151"/>
				<updated>2012-02-24T03:14:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.6: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando7.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Fig.8: Placa entrada/salida (I/O, e/s) Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2150</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2150"/>
				<updated>2012-02-24T03:12:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2149</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2149"/>
				<updated>2012-02-24T03:11:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3876.JPG|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3879.JPG|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Image_(1).png|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2148</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2148"/>
				<updated>2012-02-24T03:09:47Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&amp;lt;&amp;lt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2147</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2147"/>
				<updated>2012-02-24T03:08:01Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2146</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2146"/>
				<updated>2012-02-24T03:07:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2145</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2145"/>
				<updated>2012-02-24T03:06:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: /* Objetivos: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2144</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2144"/>
				<updated>2012-02-24T03:06:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|thumb|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2143</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2143"/>
				<updated>2012-02-24T03:04:19Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
[[Archivo:probando3.jpg|Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	<entry>
		<id>http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2142</id>
		<title>Grupo HotPlug</title>
		<link rel="alternate" type="text/html" href="http://164.73.124.35/inco/proyectos/butia/mediawiki/index.php?title=Grupo_HotPlug&amp;diff=2142"/>
				<updated>2012-02-24T03:03:14Z</updated>
		
		<summary type="html">&lt;p&gt;Mbattistella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Introducción:'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto Butiá trata de ampliar las capacidades sensoriales y de actuación de la computadora XO del proyecto OLPC en una plataforma robótica móvil, simple y económica que permita a alumnos de instituciones educativas , en coordinación con docentes e inspectores de Enseñanza Secundaria, interiorizarse con la programación del comportamiento de robots. &lt;br /&gt;
Se utiliza una Placa entrada/salida (Figura 4) donde se conecta un Shield (Figura &lt;br /&gt;
2) con 9 conectores de 9 pines genéricos para motores, sensores y actuadores para la interactividad con el ambiente que pueden controlarse fácilmente desde cualquier lenguaje de programación con soporte de conexiones TCP/IP. &lt;br /&gt;
&lt;br /&gt;
Estos dispositivos se conectan a la placa entrada/salida a través del Shield. Al encender el la Placa entrada/salida, ésta revisa cada conector para ver si algo está conectado. &lt;br /&gt;
Cada sensor y actuador tiene uno o más puentes en sus conectores (Figura 1) que respetan los valores de una tabla ('''enlazar la tabla acá)''' uniéndo a partir de 2 pines, uno tierra y otro positivo, otros pines, para que la placa entrada/salida identifique lo que se conectó e informe a la computadora que hay conectado en cada conector a travéz de su conexión por el puerto USB.&lt;br /&gt;
&lt;br /&gt;
A cada sensor y actuador le corresponde un valor (un número entero) entre los que podemos encontrar:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3872.JPG|250px|Figura 1: Sensores y boton, en el conector se pueden observar los puentes de pin a pin|thumb|dcha]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|info1|Sensor de distancia||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de temperatura||info2|11&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de luz||info2|12&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de grises||info2|13&lt;br /&gt;
|-&lt;br /&gt;
|Sensor botón||info2|30&lt;br /&gt;
|-&lt;br /&gt;
|Sensor contacto||info2|31&lt;br /&gt;
|-&lt;br /&gt;
|Sensor Tilt||info2|32&lt;br /&gt;
|-&lt;br /&gt;
|Sensor de vibración||info2|33&lt;br /&gt;
|-&lt;br /&gt;
|Sensor magnético||info2|34&lt;br /&gt;
|-&lt;br /&gt;
|Actuador Led||info2|53&lt;br /&gt;
|-&lt;br /&gt;
|Parlante||info2|10&lt;br /&gt;
|-&lt;br /&gt;
|Sensor potenciómetro||info2|21&lt;br /&gt;
|-&lt;br /&gt;
|Desconocido||info2|15&lt;br /&gt;
|}&lt;br /&gt;
Estos valores se pueden encontrar en el firmware con el que trabaja la Placa. Un firmware especial para el funcionamiento de este robot desarrollado en la Facultad de Ingeniería de la Universidad de la República que se puede descargar y modificar. '''(colocar sitio aquí)'''&lt;br /&gt;
Nuestro trabajo se concentra en mayor parte a este nivel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo: colcar imagen |Fig.7: Dispositivos colocados|dcha]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Archivo:IMG_3876.JPG|Fig.2: Shield&lt;br /&gt;
Archivo:IMG_3879.JPG|Fig.3: Shield&lt;br /&gt;
Archivo:Image_(1).png|Fig.4: Arduino Mega + Shield&lt;br /&gt;
Archivo:Image.png|Fig.5: Arduino Mega + Shield&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''El Proyecto:'''==&lt;br /&gt;
&lt;br /&gt;
===Integrantes:===&lt;br /&gt;
* Juan La Cruz&lt;br /&gt;
* Sofía Maiolo&lt;br /&gt;
* Mathias Battistella&lt;br /&gt;
&lt;br /&gt;
===Tema elegido:===&lt;br /&gt;
Firmware + Software : soporte HotPlug.&lt;br /&gt;
&lt;br /&gt;
===Motivación:===&lt;br /&gt;
Hasta el momento para que el robot funcione correctamente con todos los sensores y actuadores que se conecten, éstos deben estar conectados antes de el encendido para que cuando la Placa entrada/salida revise los conectores, los encuentre. La idea es que esto suceda también durante la ejecución del programa para mantener actualizada la lista de dispositivos conectados. Esto traería grandes ventajas entre las que podemos considerar:&lt;br /&gt;
&lt;br /&gt;
*Evitar reiniciar el robot cada vez que se conectan más dispositivos, lo que permitiría ahorrar tiempo y obtener un mayor dinamismo.&lt;br /&gt;
&lt;br /&gt;
*Un uso más sencillo de los dispositivos del Butiá.&lt;br /&gt;
&lt;br /&gt;
*En cuanto al trabajo, nos interesó la idea de trabajar en varios niveles (firmware, bobot, tortugarte) y poder comprender mejor como se relacionan.&lt;br /&gt;
&lt;br /&gt;
===Objetivos:===&lt;br /&gt;
[[Archivo: colcar imagen |Fig.6: Robot sin XO armado |dcha]]&lt;br /&gt;
Que la actualización de los módulos de usuario y drivers del Butiá sea &amp;quot;on the fly&amp;quot; es decir, dinámico. &lt;br /&gt;
Se desea que durante la ejecución del Bobot-Server, podamos conectar y tener disponible para su uso sensores o actuadores.&lt;br /&gt;
&lt;br /&gt;
=='''Desarrollo del problema:'''==&lt;br /&gt;
&lt;br /&gt;
===El Firmware===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Algunas de las placas entrada/salida (E/S, I/O, in/out) utilizadas son:&lt;br /&gt;
&lt;br /&gt;
*USB4all '''(enlazar)'''&lt;br /&gt;
*Arduino Mega 03 '''(enlazar)'''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:IMG_3887.JPG|dcha|thumb|Figura 4: Placa entrada/salida Arduino Mega]]&lt;br /&gt;
&lt;br /&gt;
El firmware consta de 11 archivos; &amp;quot;PnP&amp;quot;, &amp;quot;ax12.h&amp;quot;, &amp;quot;ax12.cpp&amp;quot;, &amp;quot;comunicacion&amp;quot;, &amp;quot;conector.cpp&amp;quot;, &amp;quot;conector.h&amp;quot;, &amp;quot;info&amp;quot;, &amp;quot;modulos&amp;quot;, &amp;quot;perifericos&amp;quot;, &amp;quot;servicios&amp;quot; y el principal &amp;quot;butia_mega_firmware_0_2&amp;quot; donde se levantan los otros 10 '''(describir brevemente cada archivo)'''. El lenguaje utilizado es similar al C++. Para este trabajo modificamos los archivos &amp;quot;butia_mega_firmware_0_2&amp;quot;, &amp;quot;modulos&amp;quot; y &amp;quot;PnP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En primer lugar modificamos el código del módulo butia, incluido en el archivo modulos.pde, para incluir una nueva operación que actualice los dispositivos conectados al Butiá. Esta nueva operacion consta de un for, donde se recorren los conectores, revisando su estado. Anexamos el código añadido&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for (k=0; k&amp;lt;NUM_CONNECTORS; k++)&lt;br /&gt;
{ &lt;br /&gt;
   if (conector[k].get_type() != 0) &lt;br /&gt;
        {add_module(k) }; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Al anexar esta nueva operación, debemos modificar también los drivers, incluidos en la carpeta bobot. Cambiamos, en particular, el archivo butia.lua, para poder invocar a la nueva función, que llamamos get_hot_plug. Incluimos el código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
api.hot_plug = {}&lt;br /&gt;
api.hot_plug.parameters = {} -- no se envian parámetros&lt;br /&gt;
api.hot_plug.returns = {} --nos devuelve el estado de los conectores&lt;br /&gt;
api.hot_plug.call = function ()&lt;br /&gt;
	device:send(HOT_PLUG) --envío el código de operación&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de realizar varias pruebas (detalladas en la próxima sesión) decidimos cambiar el enfoque y optamos por quitar el FOR agregado inicialmente en el módulo butiá. Lo sustituimos por el siguiente código incluido en el archivo butia_firmware_mega_0_2.pde:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (time_act-time_last2 &amp;gt;= 5000) {               // cada 20ms llamamos a la sample(). Ojo porque esto afecta al &amp;quot;cuentapasos&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
    // explora los conectores&lt;br /&gt;
    for (byte f=0; f&amp;lt;NUM_CONNECTORS; f++) {&lt;br /&gt;
      byte tipoOld = conector[f].get_type();&lt;br /&gt;
      byte subtipoOld = conector[f].get_subtype();&lt;br /&gt;
      &lt;br /&gt;
      conector[f].update_config ();&lt;br /&gt;
      // conecte algo donde no habia nada, o cambie lo que estaba conectado&lt;br /&gt;
      if (conector[f].get_type() != 0 &amp;amp;&amp;amp;  &lt;br /&gt;
         (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld)) &lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
          //primero borrar el viejo en la lista de handlers si es que &lt;br /&gt;
          //el viejo no era el tipo 0 (el caso q no hay nada)&lt;br /&gt;
&lt;br /&gt;
          add_module(f);&lt;br /&gt;
      }else if (conector[f].get_type() == 0 &amp;amp;&amp;amp;  //desconecte algo&lt;br /&gt;
               (conector[f].get_type() != tipoOld || conector[f].get_subtype() != subtipoOld))){&lt;br /&gt;
               //borrar el modulo que se acaba de desconectar&lt;br /&gt;
        &lt;br /&gt;
      } // si hay algo en el conector, agrega 1 módulo PnP para él&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
    }  &lt;br /&gt;
    &lt;br /&gt;
    time_last2 = time_act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este código realiza las siguientes acciones:&lt;br /&gt;
&lt;br /&gt;
-Recorremos los conectores, y guardamos su tipo y sub-tipo anteriores.&lt;br /&gt;
&lt;br /&gt;
-Si no había un conector en la lista de handlers y además, los tipos y sub-tipos son distintos, agregamos el conector llamando a '''add_module(f);''' de PnP.pde&lt;br /&gt;
&lt;br /&gt;
-Sino, debemos borrar del handler el módulo que acabamos de desconectar. Debemos implementar esta función, a la que llamaremos '''remove_module.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Para implementar remove_module, exploramos el handler, buscando el módulo a borrar y lo sustituimos por el módulo que se encuentra en la última posición ocupada del handler. Actualizamos, también, la cantidad de módulos. Incluimos la primera versión de nuestro código:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void remove_module (byte num_conector) {&lt;br /&gt;
  int i=8;  //Comenzamos a recorrer desde el 8 ya que desde el 8 se comienzan a agregar los nuevos conectores. &lt;br /&gt;
  while ( (i&amp;lt; num_modules) &amp;amp;&amp;amp; (handler[i].num_conector != num_conector) )    //Buscamos el conector con &amp;quot;num_conector&amp;quot; en el arreglo.&lt;br /&gt;
      i++;&lt;br /&gt;
  if (i&amp;lt; num_modules)  //El conector con &amp;quot;num_conector&amp;quot; no es el ultimo.&lt;br /&gt;
  {    &lt;br /&gt;
         //Hacemos el intercambio, dejando en la posicion i, al conector que se encontraba en la ultima posicion (num_modules).           &lt;br /&gt;
         strcpy (handler[i].nombre,  handler[num_modules].nombre); &lt;br /&gt;
         handler[i].funcion = handler[num_modules].funcion;&lt;br /&gt;
         handler[i].num_conector = handler[num_modules].num_conector;         &lt;br /&gt;
  }&lt;br /&gt;
  num_modules--;&lt;br /&gt;
  &lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Comenzando las pruebas:'''==&lt;br /&gt;
&lt;br /&gt;
==='''Bobot-Server, monitoreo desde la terminal de Linux'''===&lt;br /&gt;
&lt;br /&gt;
Brinda una interfaz de alto nivel para poder interactuar con los módulos (sensores/actuadores). &lt;br /&gt;
Se interactua directamente con la placa e/s mediante una Terminal Telnet con el protocolo de transmición  TCP/IP por el puerto 2009.&lt;br /&gt;
&lt;br /&gt;
Algunos comandos que se pueden utilizar son:&lt;br /&gt;
&lt;br /&gt;
*LIST &lt;br /&gt;
Lista los módulos detectados.&lt;br /&gt;
*DESCRIBE moduleName&lt;br /&gt;
Devuelve una descripción del módulo.&lt;br /&gt;
*CALL moduleName operation param1, param2, ... , paramN&lt;br /&gt;
Invoca la función indicada en el módulo dado. Los parámetros dependen de la función.&lt;br /&gt;
*CLOSEALL&lt;br /&gt;
Cierra todos los módulos.&lt;br /&gt;
*OPEN moduleName&lt;br /&gt;
Abre el módulo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Probando.jpg|centro|500px]]&lt;br /&gt;
&lt;br /&gt;
En primer instancia, probamos nuestra implementación conectando un boton y un sensor de distancia. Hacemos un LIST y los reconoce bien. Los desconectamos, llamamos a nuestra operación y al INIT.  Sin embargo, al usar el comando LIST,  los sensores y el botón siguen apareciendo, lo cual nos hace pensar que la placa no fue reseteada&lt;br /&gt;
&lt;br /&gt;
Probando y consultando con docentes, nos dimos cuenta de que faltaba actualizar el tipo de los conectores, antes de hacer la recorrida en el for. Para ello, usamos una función implementada en conector.cpp, llamada ''' update_config ()'''. &lt;br /&gt;
Incluimos el código de dicha función:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando2.png|Figura 6: Control del robot mediante un explorador web|thumb|borde|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:probando3.jpg|Figura 7: Placa Arduino + Shield|thumb|dcha]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo: colcar imagen |Fig.6: Robot con XO armado |dcha]]&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Conector::update_config () {&lt;br /&gt;
  byte id = digitalRead (pin_id0) + 2*digitalRead (pin_id1);&lt;br /&gt;
  switch (id) {&lt;br /&gt;
    case 3:                                                      // NADA       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      type = 0;&lt;br /&gt;
      subtype = 0;&lt;br /&gt;
      break;   &lt;br /&gt;
    case 2:                                                      // sensor analógico       &lt;br /&gt;
      pinMode (pin_dig0, INPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig0, HIGH);             // activa los pull-ups&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 1;&lt;br /&gt;
      subtype = digitalRead (pin_dig0) + 2*digitalRead (pin_dig1);&lt;br /&gt;
      break;         &lt;br /&gt;
    case 1:                                                      // sensor analógico c/pin de control       &lt;br /&gt;
      pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
      pinMode (pin_dig1, INPUT);&lt;br /&gt;
      digitalWrite (pin_dig1, HIGH);             // activa los pull-ups&lt;br /&gt;
      type = 2;&lt;br /&gt;
      subtype = digitalRead (pin_dig1);&lt;br /&gt;
      break;&lt;br /&gt;
    case 0:                                                     // sensor o actuador digital&lt;br /&gt;
    {  &lt;br /&gt;
      int analog_id = analogRead (pin_analog);   &lt;br /&gt;
      byte i;&lt;br /&gt;
      for (i=0; i&amp;lt;NUM_VALORES; i++) {&lt;br /&gt;
          if (abs(analog_id-values[i]) &amp;lt;= TOLERANCIA) {break;}&lt;br /&gt;
      } &lt;br /&gt;
      switch (i) {&lt;br /&gt;
        case 0: case 1: case 2: case 3: case 4:&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 3;                                             // sensor digital&lt;br /&gt;
          subtype = i;&lt;br /&gt;
          break;        &lt;br /&gt;
        case 5: case 6: case 7: case 8:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 4;&lt;br /&gt;
          subtype = i-5;&lt;br /&gt;
          break;&lt;br /&gt;
        case 9: case 10: case 11: case 12:&lt;br /&gt;
          pinMode (pin_dig0, OUTPUT); &lt;br /&gt;
          pinMode (pin_dig1, OUTPUT);&lt;br /&gt;
          type = 5;                                            // sensor digital c/pin de control&lt;br /&gt;
          subtype = i-9;&lt;br /&gt;
          break;&lt;br /&gt;
        case NUM_VALORES:              // si la red de resistencias no coincide con ningun valor, se deja en modo manual&lt;br /&gt;
          pinMode (pin_dig0, INPUT); &lt;br /&gt;
          pinMode (pin_dig1, INPUT);&lt;br /&gt;
          type = 0;&lt;br /&gt;
          subtype = 0;&lt;br /&gt;
          break;   &lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitoreo desde el compilador===&lt;br /&gt;
&lt;br /&gt;
El compilador de la placa Arduino dispone también de un monitor para ver y controlar lo que pasa en la placa e/s, indicando desde el código lo que tiene que imprimir el firmware durante su ejecución. Se puede ver más información sobre este paso en http://arduino.cc/en/Reference/HomePage&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cuadro Serial Monitor.png|750px|centro]]&lt;br /&gt;
&lt;br /&gt;
En este caso lo utilizamos, como se puede ver en la imagen para controlar que es lo que detecta la placa en cada recorrida de los conectores, indicando en tipo y subtipo el número que representa al dispositivo que se conectó. Esta recorrida la hace cada cierto tiempo y eso se va actualizando en el monitor del compilador.&lt;br /&gt;
Como se puede ver en la imagen, en el conector 0, se detecta un dispositivo al que le corresponde el número 10, que como se puede ver en la tabla le corresponde el sensor de distancia. Hasta ahora pudimos comprobar que se detectó correctamente el sensor.Si se desconecta dicho sensor, en la próxima recorrida, deberá indicar 0, lo que nos dice que la placa no detectó nada.&lt;br /&gt;
&lt;br /&gt;
Primero debuggeamos usando ./lua bobot-server.lua DEBUG en la Terminal para ver más información los sensores y actuadores aparecían como unknown.&lt;br /&gt;
Probando con el monitor del compilador el FOR  original de tal forma que repita cada 5 seg sin el INIT que aparece antes del codigo. Se puede ver el Print indicado mostrando correctamente la lista de dispositivos conectados. Para ello agregamos en butia.lua, linea 35: Print (&amp;quot;tipo leido&amp;quot;,devolver);   (devolver integer)&lt;br /&gt;
[[Archivo:probando4.png|thumb|borde|dcha|Figura 9: Código anterior]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt; &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Serial.print(&amp;quot;conector &amp;quot;);&lt;br /&gt;
      Serial.print(f,DEC);&lt;br /&gt;
      Serial.print(&amp;quot; tipo= &amp;quot;);&lt;br /&gt;
      Serial.print(conector[f].get_type(), DEC);&lt;br /&gt;
      Serial.print(&amp;quot; subtipo= &amp;quot;);&lt;br /&gt;
      Serial.println(conector[f].get_subtype(), DEC);&lt;br /&gt;
  &amp;lt;/source&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En base a estas pruebas decidimos eliminar el FOR original del modulo butiá &lt;br /&gt;
&lt;br /&gt;
Luego haciendo para cada conector update_config: &amp;quot;conector[f].update_config (); funionó, se probó con un boton y un sensor y verificó que el codigo los reconocía correctamente desde el monitor del compilador. Pero probando con:   ./lua bobot-server.lua DEBUG (Terminal) no funcionó, ahora el sensor de grises no aparece como unknown, sino como &amp;quot;grises&amp;quot;, pero al desconectar y volver a conectar el anterior no se borra y aparece repetidas veces.&lt;br /&gt;
&lt;br /&gt;
===Luego de las primeras pruebas===&lt;br /&gt;
&lt;br /&gt;
Probando con el bobot-server, comprobamos que se detecta correctamente cuando se conecta/desconecta un sensor. Sin embargo, cuando conectamos/desconectamos sensores del mismo tipo, los nombres asignados no se actualizan. Es decir, si conectamos dos sensores del tipo X y listamos los sensores conectados (usando LIST), veremos conectados: X, X1. Al desconectar en este caso X1, veremos un comportamiento correcto.  Pero, al conectar nuevamente el sensor, y listar apreciaremos: X, X2 La instancia debería ser 1 y no 2.&lt;br /&gt;
Para solucionar este problema, relacionado con la cantidad de instancias de cada conector del handler, optamos por:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Crear una nueva estructura (un array de bytes), llamada instancias, en la cual guardaremos las instancias de cada conector, mapeandolos según los siguientes criterios:&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;byte globaltype = 12*conector[num_conector].get_type() + conector[num_conector].get_subtype();&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En cada lugar del array, correspondiente a alguno de estos valores, guardaremos la cantidad de instancias de ese sensor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:250px; height:210px&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_DISTANCIA  || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TEMPERATURA|| 11&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_LUZ        || 12&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_GRISES     || 13&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BOTON      || 30&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONTACTO   || 31&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_TILT       || 32&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_VIBRACION  || 33&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MAGNETICO  || 34&lt;br /&gt;
|-&lt;br /&gt;
| ACTUADOR_LED      || 53&lt;br /&gt;
|-&lt;br /&gt;
| MAX_CALLBACKS     || 10&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_POTE       || 21&lt;br /&gt;
|-&lt;br /&gt;
| UNKNOWN           || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
El objetivo primordial de esta estructura es tener en una variable global el numero de instancias, para poder actualizarlo en el procedimiento remove_module, ya que antes estas variables solo se podían modificar en get_config al agregar un nuevo sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Modificamos la estructura H, agregándole un nuevo campo, instancia, que guardará a qué instancia de ese sensor corresponde el dispositivo ubicado en ese lugar del handler. &lt;br /&gt;
De esta forma podremos acceder al valor de instacias totales para cada tipo de conector (buscando en el array instancias) y a su vez, al valor particular de cada sensor (que corresponde con la nomenclatura de su nombre). Es importante destacar, que cuando existe sólo un sensor conectado, en el array instancias habrá un 1, mientras que el valor de instancia en el handler será 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)Una vez hecho esto, tenemos que actualizar distintas partes del código, para incluir las nuevas estructuras. En particular, hicimos cambios relevantes en los procedimientos get_config, add_module y remove_module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Luego de agregar las nuevas estructuras, volvimos a repetir las pruebas y sin embargo, el problema no se solucionó.&lt;br /&gt;
&lt;br /&gt;
=='''Conclusiones:'''==&lt;br /&gt;
&lt;br /&gt;
*Hasta este momento hemos logrado que se '''detecte correctamente cuando se conecta/desconecta un sensor.''' Sin embargo, a pesar de todos los cambios hechos, no hemos podido solucionar el problema de la nomenclatura de los conectores.&lt;br /&gt;
&lt;br /&gt;
*El proyecto nos motivó mucho, ya que nos permitió utilizar herramientas que ya teníamos y observar de una forma mucho más práctica a la cual estamos acostumbrados, los cambios introducidos en el código.&lt;br /&gt;
&lt;br /&gt;
*Nuestra idea es culminar el proyecto, tratando de solucionar el problema antes explicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Presentación de nuestro trabajo:'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para ver la presentación de nuestro proyecto:&lt;br /&gt;
&lt;br /&gt;
[http://www.box.com/s/jk0nr1jnes9sa7gjrfkk Presentación HotPlug]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Trabajo a futuro:'''==&lt;br /&gt;
&lt;br /&gt;
*Creemos que los cambios introducidos deberían permitirnos completar nuestro proyecto solucionando los problemas ahora existentes. Nuestro trabajo a futuro se centrará en identificar qué estamos haciendo mal, para poder cumplir íntegramente los objetivos planteados.&lt;br /&gt;
&lt;br /&gt;
*Por otro lado, también evaluamos la posibilidad de incluir un &amp;quot;botón refresh&amp;quot; dentro del Tortugarte, para permitir al usuario, actualizar los sensores cuando lo desee. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
=='''Referencia:'''==&lt;br /&gt;
&lt;br /&gt;
[http://linux-hotplug.sourceforge.net HotPlug sorceforge]&lt;br /&gt;
&lt;br /&gt;
[http://lua-users.org/wiki/LuaTypesTutorial Wiki de Lua]&lt;br /&gt;
&lt;br /&gt;
[http://es.wikipedia.org/wiki/Arduino Articulo wikipedia Arduino]&lt;br /&gt;
&lt;br /&gt;
[http://www.arduino.cc/es/ Web Arduino]&lt;/div&gt;</summary>
		<author><name>Mbattistella</name></author>	</entry>

	</feed>