<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4239052219634326361</id><updated>2012-02-08T17:51:29.106+01:00</updated><title type='text'>celtico</title><subtitle type='html'>Blog de celtico y por ahora de su proyecto: Creacion de un robot.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-7846356843628835088</id><published>2009-05-05T00:33:00.008+02:00</published><updated>2010-02-17T18:19:12.671+01:00</updated><title type='text'>Nueva Web</title><content type='html'>No tiene nada que ver, pero ya que estoy pongo la nueva web donde se van subiendo cosas que no tienen nada que ver con Rabotron:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://victor.gestioninfo.com/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.victorpv.es/"&gt;http://www.victorpv.es/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gracias a todos los que leisteis el blog y lo seguis haciendo, a todos los que habeis escrito comentarios y no fuisteis contestados, lo siento, estaba abandonado y posiblemente lo seguira estando...&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;prueba:&lt;br /&gt;&lt;a href="http://www.jardinerialospalacios.es/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.jardinerialospalacios.es/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.jardinerialospalacios.es/"&gt;jardineria los palacios&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-7846356843628835088?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/7846356843628835088/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=7846356843628835088' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7846356843628835088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7846356843628835088'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2009/05/nueva-web.html' title='Nueva Web'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-2169533449349418485</id><published>2008-06-03T22:41:00.001+02:00</published><updated>2008-12-11T08:02:39.857+01:00</updated><title type='text'>Primeras fotos de rabotron</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;esdf&lt;br /&gt;&lt;/script&gt;Os adjunto algunas fotos del montaje de rabotron.&lt;br /&gt;&lt;br /&gt;Esta practicamnente todo montado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qXc7kTaGt-E/SEWtsHtOM6I/AAAAAAAAAFE/UVC9uG2WsEw/s1600-h/IMGP0334.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_qXc7kTaGt-E/SEWtsHtOM6I/AAAAAAAAAFE/UVC9uG2WsEw/s320/IMGP0334.JPG" alt="" id="BLOGGER_PHOTO_ID_5207759517618418594" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qXc7kTaGt-E/SEWuK8TWgII/AAAAAAAAAFM/7f8k54zYrnE/s1600-h/IMGP0337.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_qXc7kTaGt-E/SEWuK8TWgII/AAAAAAAAAFM/7f8k54zYrnE/s320/IMGP0337.JPG" alt="" id="BLOGGER_PHOTO_ID_5207760047133065346" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qXc7kTaGt-E/SEWuo15iJfI/AAAAAAAAAFU/66gACfsET7k/s1600-h/IMGP0344.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_qXc7kTaGt-E/SEWuo15iJfI/AAAAAAAAAFU/66gACfsET7k/s320/IMGP0344.JPG" alt="" id="BLOGGER_PHOTO_ID_5207760560810239474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-2169533449349418485?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/2169533449349418485/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=2169533449349418485' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2169533449349418485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2169533449349418485'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/06/primeras-fotos-de-rabotron.html' title='Primeras fotos de rabotron'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qXc7kTaGt-E/SEWtsHtOM6I/AAAAAAAAAFE/UVC9uG2WsEw/s72-c/IMGP0334.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-573722516732880588</id><published>2008-02-07T09:47:00.000+01:00</published><updated>2008-12-11T08:02:40.643+01:00</updated><title type='text'>Filtro Blob</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;El algoritmo de blobs  agrupa píxeles vecinos con las mismas características dentro de un mismo blob, formando así grupos de píxeles mas grandes dentro de la imagen.&lt;br /&gt;&lt;br /&gt;El algoritmo de blobs se aplicará sobre una imagen ya binarizada con anterioridad.&lt;br /&gt;&lt;br /&gt;El fin de la aplicación del algoritmo es buscar el blob que se ajuste más a nuestras necesidades: un blob con una forma determinada, que siga un parámetro de comportamiento determinado, etc, gracias al análisis de los blobs podemos obtener información del entorno y del objetivo al que Rabotron deberá seguir, así como su posible comportamiento en el futuro.&lt;br /&gt;&lt;br /&gt;Vamos a pasar a la explicación del algoritmo:&lt;br /&gt;&lt;br /&gt;El algoritmo es realmente sencillo, simplemente clasifica, como ya hemos dicho anteriormente, un píxel con respecto a sus vecinos creando los blobs (o grupos de objetos encontrados), por lo tanto recorremos la imagen píxel a píxel calculando un código de ponderación de cada píxel con respecto a sus vecinos y aplicando la función correspondiente según el resultado obtenido en dicho código.&lt;br /&gt;&lt;br /&gt;Lo primero que haremos será crearnos una matriz cuadrada del tamaño de la imagen, para almacenar en ella el valor del blob al que pertenece cada pixel, por ejemplo (si la imagen fuese de 10x10 píxeles):&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   TD P { margin-bottom: 0cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;   &lt;table style="color: rgb(0, 0, 0);" border="1" cellpadding="3" cellspacing="0" width="498"&gt;  &lt;col width="43"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="44"&gt;  &lt;col width="40"&gt;  &lt;tbody&gt;&lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;span style="font-size:100%;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="bottom"&gt;   &lt;td width="43"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="44"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="color: rgb(192, 192, 192);" width="40"&gt;    &lt;p align="center"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-size:100%;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt;La ponderación aplicada a los vecinos será con una mascará de 2x2:&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt;                 &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   TD P { margin-bottom: 0cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;dl&gt;&lt;dl&gt;&lt;dl&gt;&lt;dl&gt;&lt;dl&gt;&lt;dl&gt;&lt;dd&gt;&lt;table style="color: rgb(0, 0, 0);" border="1" cellpadding="3" cellspacing="0" width="100%"&gt;        &lt;col width="118*"&gt;        &lt;col width="138*"&gt;        &lt;tbody&gt;&lt;tr&gt;         &lt;td style="color: rgb(192, 192, 192);" height="28" width="46%"&gt;          &lt;p align="center"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:100%;"&gt;pixel          * 1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;         &lt;/td&gt;         &lt;td style="color: rgb(192, 192, 192);" width="54%"&gt;          &lt;p align="center"&gt; &lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:100%;"&gt;pixel          * 2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;         &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="color: rgb(192, 192, 192);" width="46%"&gt;          &lt;p align="center"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:100%;"&gt;pixel          * 4&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;         &lt;/td&gt;         &lt;td style="color: rgb(192, 192, 192);" width="54%"&gt;          &lt;p align="center"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:100%;"&gt;Pixel          examinado * 8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;         &lt;/td&gt;        &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;      &lt;/dd&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/dl&gt;&lt;/dl&gt;  &lt;p&gt; code = Pixel(x-1, y-1) + 2*Pixel(x, y-1) + 4*src.Pixel(x-1, y) + 8*Pixel(x, y)&lt;br /&gt;&lt;br /&gt;Al utilizar una matriz de 2x2, los píxeles situados al borde de la imagen binarizada dejan elementos de la matriz fuera de la imagen. Para evitar esto, se rodea la imagen original con un borde de un píxel negro.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lRjDQFtRjZg/R6rG55vB7KI/AAAAAAAAAFM/4Hcn1bhdhmY/s1600-h/blob_inicializacion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 470px; height: 145px;" src="http://1.bp.blogspot.com/_lRjDQFtRjZg/R6rG55vB7KI/AAAAAAAAAFM/4Hcn1bhdhmY/s320/blob_inicializacion.png" alt="" id="BLOGGER_PHOTO_ID_5164158620786617506" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;La ejecución comienza por el píxel que situado en la coordenada (1,1). Cuando examinamos cada píxel, dependiendo de si los píxeles de la máscara son blancos o negros, se obtendrán 16 códigos distintos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6rzEJvB7LI/AAAAAAAAAFU/NR4W7BYO7G8/s1600-h/cuadrosRabotron.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 429px; height: 185px;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6rzEJvB7LI/AAAAAAAAAFU/NR4W7BYO7G8/s320/cuadrosRabotron.gif" alt="" id="BLOGGER_PHOTO_ID_5164207175391898802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A la derecha de cada cuadro se indica el tipo de operación que se aplicará cuando se encuentre una situación con el código indicado (a la izquierda):&lt;br /&gt;&lt;br /&gt;- Operaciones de tipo I: indican operaciones donde se explora un punto negro, que se incorpora a los puntos del fondo de la imagen (no forma parte de ningún blob).&lt;br /&gt;&lt;br /&gt;- Operaciones de tipo II: indican operaciones donde se explora un punto blanco, y alrededor no hay puntos blancos con quienes conectarlo, con lo que se iniciará en él un nuevo blob.&lt;br /&gt;&lt;br /&gt;- Operaciones de tipo III: indican operaciones donde se explora un punto blanco, teniendo puntos blancos en alguna casilla de alrededor (P2, P3 o P4), con lo que se añadirá el nuevo punto blanco al blob que se hubiera formado previamente con estos.&lt;br /&gt;&lt;br /&gt;- Operaciones de tipo IV: indica un caso particular de las operaciones de tipo III, donde el nuevo punto blanco detectado conecta dos blobs que antes se consideraban distintos. Lo que se hace es unir los dos blobs en uno solo, añadiendo a este nuevo blob el nuevo punto explorado.&lt;br /&gt;&lt;br /&gt;El código java correspondiente a la clasificación del píxel examinado a un blob:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;(code&lt;8)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  regiones[x][y] = 0;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt; &lt;b&gt;else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt; (code == 8 || code == 9) {&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob = &lt;b&gt;new&lt;/b&gt; Blob();&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_x.add(x);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_y.add(y);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  lista_blobs.add(blob);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  regiones[x][y] = lista_blobs.size();&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt; }&lt;b&gt;else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt; (code == 10 || code == 11 || code == 15) {&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob = (Blob) lista_blobs.get(regiones[x][y - 1] - 1);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_x.add(x);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_y.add(y);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  regiones[x][y] = regiones[x][y - 1];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt; }&lt;b&gt;else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt; (code == 12 || code == 13) { &lt;/span&gt; &lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob = (Blob) lista_blobs.get(regiones[x - 1][y] - 1);   &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_x.add(x);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_y.add(y);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  regiones[x][y] = regiones[x - 1][y];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt; } &lt;b&gt;else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt; (code == 14) { &lt;/span&gt; &lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  &lt;b&gt;if&lt;/b&gt; (regiones[x][y - 1] != regiones[x - 1][y])&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;   fusiona(regiones[x][y - 1], regiones[x - 1][y], regiones, lista_blobs);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob = (Blob) lista_blobs.get(regiones[x][y - 1] - 1);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_x.add(x);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  blob.lista_y.add(y);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;  regiones[x][y] = regiones[x][y - 1];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt; }&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Este proceso finalmente nos devuelve  un listado de blobs de los que podemos extraer variar propiedades, entre la que destacaremos el uso del centroide.&lt;br /&gt;&lt;br /&gt;Nos hemos creado una clase Blob, donde se almacenan los datos de cada blob en marticular, concretamente para cada blob tenemos almacenado:&lt;br /&gt;&lt;br /&gt;- Lista de coordenada X de cada píxel perteneciente al blob --&gt; lista_x&lt;br /&gt;- Lista de coordenada Y de cada píxel perteneciente al blob --&gt; lista_y&lt;br /&gt;- Coordenada X del centroide del blob --&gt;centro_x&lt;br /&gt;- Coordenada Y del centroide del blob --&gt; centro_y&lt;br /&gt;- Variable boolena que indica si es un blob válido (si posee un número mínimo de píxeles) --&gt; valido&lt;br /&gt;&lt;br /&gt;La función fusiona(blob1, blob2, regiones, lista_de_blobs) junta dos bloques de píxeles pertenecientes a dos blob distintos en un mismo blob.&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt; &lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;fusiona(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;blob1,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;blob2,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;[][]regiones,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;ArrayList&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;lista_blobs)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(192, 192, 192);font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  Blob b1 = (Blob) lista_blobs.get(blob1 - 1);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  Blob b2 = (Blob) lista_blobs.get(blob2 - 1);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;int&lt;/b&gt; l2_length = b2.lista_x.size();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;int&lt;/b&gt;[] l2x_array = b2.lista_x.toArray();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;int&lt;/b&gt;[] l2y_array = b2.lista_y.toArray();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; i = 0; i &lt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;   regiones[l2x_array[i]][l2y_array[i]] = blob1;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  b1.lista_x.append(b2.lista_x);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  b2.lista_x.free();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  b1.lista_y.append(b2.lista_y);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt;  b2.lista_y.free();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; color: rgb(192, 192, 192);font-family:arial;" align="left"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:9;"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Como ejemplo de detección de blob vamos a poner una impresión de pantalla en la que pintamos (de verde) el blob mas grande detectado con el mismo color que existe justo en el punto central de la imagen.&lt;br /&gt;&lt;br /&gt;Para este ejemplo de uso del algoritmo de detección de blob usamos como criterio para binarizar la imagen el color detectado en el punto central de la imagen, podemos observar como en la imagen binarizada aparecen varias zonas blancas distantes, gracias a la separación en blobs podemos ignorar las zonas que no nos interesan y quedarnos con el blob mas grande de la imagen (pintado de verde), que casualmente coincide con el blob central de la imagen en este caso.&lt;br /&gt;&lt;br /&gt;Prueba 1:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6r0FJvB7MI/AAAAAAAAAFc/WPdd7wvA5Ss/s1600-h/blob1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 371px; height: 127px;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6r0FJvB7MI/AAAAAAAAAFc/WPdd7wvA5Ss/s320/blob1.png" alt="" id="BLOGGER_PHOTO_ID_5164208292083395778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Prueba 2:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6r0FZvB7NI/AAAAAAAAAFk/FeFl6rVuomQ/s1600-h/blob2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 372px; height: 126px;" src="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6r0FZvB7NI/AAAAAAAAAFk/FeFl6rVuomQ/s320/blob2.png" alt="" id="BLOGGER_PHOTO_ID_5164208296378363090" border="0" /&gt;&lt;/a&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-573722516732880588?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/573722516732880588/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=573722516732880588' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/573722516732880588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/573722516732880588'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/02/filtro-blob.html' title='Filtro Blob'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lRjDQFtRjZg/R6rG55vB7KI/AAAAAAAAAFM/4Hcn1bhdhmY/s72-c/blob_inicializacion.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-4593784725544965738</id><published>2008-02-05T17:42:00.000+01:00</published><updated>2008-12-11T08:02:42.437+01:00</updated><title type='text'>Filtro K-means (K-Medias)</title><content type='html'>Como ya hicimos hace muchisimo tiempo con el filtro Equalize, volvemos a presentar uno de los filtros que finalmente hemos decidido incorporar a nuestro proyecto gracias a sus buenos resultados en las pruebas, el filtro kmeans ( ó filtro de las k medias ).&lt;br /&gt;&lt;br /&gt;La función del algoritmo kmeans es clusterizar la imagen en K grupos distintos, entiéndase por cluster: agrupación de elementos similares. El proceso de Clusterización (Clustering) consiste en la división de los datos en grupos de objetos similares (en nuestro caso particular esa similitud se hará entre los píxeles de la imagen).  Para calcular la similitud entre píxeles se suele utilizar diferentes algoritmos de distancia: distancia euclídea, de Manhatan, de Mahalanobis, etc.&lt;br /&gt;&lt;br /&gt;El nombre de kmeans (kmedias) viene porque representa cada uno de los clusters por la media (o media ponderada) de sus puntos, es decir, por su centroide. La representación mediante centroides tiene la ventaja de que tiene un significado gráfico y estadístico inmediato .&lt;br /&gt;&lt;br /&gt;En el filtro kmeans aplicado en nuestro proyecto robótico agruparemos cada sector de la imagen en k cluster, para ello usaremos la imagen en color RGB y creamos tantos cluster distintos como le indiquemos al algoritmo (si indicamos solo un cluster todos los píxeles pertenecerán al mismo sector, con dos cluster el algoritmo agrupará los píxeles en dos grupos distintos, y así sucesivamente). Mediante este algoritmo perdemos gran cantidad de detalles en la imagen, pero simplificaremos el procesamiento de los misma.&lt;br /&gt;&lt;br /&gt;Para comenzar el algoritmo inicializa los valores de las clases de manera que estos queden repartidos uniformente.&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;                 &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p  style="margin-bottom: 0cm; font-style: normal; text-decoration: none;font-family:arial;"&gt; &lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt; &lt;b&gt;public&lt;/b&gt; &lt;b&gt;void &lt;/b&gt;buscaValoresColor(&lt;b&gt;int&lt;/b&gt; clases, &lt;b&gt;int&lt;/b&gt;[]valoresR, &lt;b&gt;int&lt;/b&gt;[]valoresG, &lt;b&gt;int&lt;/b&gt;[]valoresB) {&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt;[] vectorR= &lt;b&gt;new&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; [&lt;i&gt;tamano&lt;/i&gt;/3];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt;[] vectorG= &lt;b&gt;new&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; [&lt;i&gt;tamano&lt;/i&gt;/3];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt;[] vectorB= &lt;b&gt;new&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; [&lt;i&gt;tamano&lt;/i&gt;/3];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt; aux=1;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  //guardamos los pixeles en distintos arrays de color&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; k = 0; k &lt; &lt;i&gt;tamano&lt;/i&gt;/3; k++) {&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   aux= k*3;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   vectorR[k] = imageRGB[aux];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   vectorG[k] = imageRGB[aux+1];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   vectorB[k] = imageRGB[aux+2];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  } &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  //ordenamos de menor a mayor, solo ordenamos el array rojo, los otros, se ordenarán a partir del rojo&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  Arrays.&lt;i&gt;sort&lt;/i&gt; (vectorR);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  Arrays.&lt;i&gt;sort&lt;/i&gt; (vectorG);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  Arrays.&lt;i&gt;sort&lt;/i&gt; (vectorB);&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;    &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt; longi = vectorR.length;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt; sep = longi/clases;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt; j=0;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;int&lt;/b&gt; i=0;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  //clasificación provisional de cluster&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  &lt;b&gt;while&lt;/b&gt; (i &lt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   valoresR[j] = vectorR[i]; valoresG[j] = vectorG[i]; valoresB[j] = vectorB[i];&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   i = i + sep;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;   j++;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;  }&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt; }&lt;/span&gt;&lt;/p&gt; &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Una vez hecho esto nos guardamos los valores de los píxeles originales de la imagen, estos valores no se modificarán nunca en el algoritmo.&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;         &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;                 &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;            &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm; font-style: normal; text-decoration: none; font-family: arial;"&gt; &lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;b&gt; &lt;/b&gt;&lt;span style="font-size:9;"&gt;for&lt;/span&gt;&lt;span style="font-size:9;"&gt; (&lt;/span&gt;&lt;span style="font-size:9;"&gt;int&lt;/span&gt;&lt;span style="font-size:9;"&gt; k = 0; k &lt; &lt;/span&gt;&lt;span style="font-size:9;"&gt;&lt;i&gt;tamano&lt;/i&gt;&lt;/span&gt;&lt;span style="font-size:9;"&gt;/3; k++) {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm; font-family: arial;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  aux= k*3;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  valorPixelR[k] = imageRGB[aux];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  valorPixelG[k] = imageRGB[aux+1];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  valorPixelB[k] = imageRGB[aux+2];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;Una vez hecho esto, comenzamos con el algoritmo de distancia mínima (algoritmo de distancia mínima euclídea) para saber a que clase pertenece cada píxel, haremos tantas iteraciones como sean necesarias para que cada píxel acabe agrupado en su clase mas cercana, la finalización de este proceso se hará cuando no haya variación entre un conjunto de clusteres y los obtenidos en la siguiente iteración.&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;                &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p  style="margin-bottom: 0cm; font-style: normal; text-decoration: none;font-family:arial;" align="justify"&gt; &lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;&lt;b&gt; do&lt;/b&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt; //examinamos cada pixel de la imagen y asignamos un cluster dependiendo de la distancia minima (euclidea)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt; &lt;span style="font-size:9;"&gt; &lt;/span&gt;&lt;span style="font-size:9;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:9;"&gt; (&lt;/span&gt;&lt;span style="font-size:9;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:9;"&gt; i=0; i&lt;valorpixelr.length;&gt;&lt;/valorpixelr.length;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   min_dif=1000;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; j=0;j&lt;valoresr.length;j++)&gt;&lt;/valoresr.length;j++)&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    dif1=(&lt;b&gt;double&lt;/b&gt;)Math.&lt;i&gt;abs&lt;/i&gt;(valorPixelR[i] - valoresR[j]);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    dif2=(&lt;b&gt;double&lt;/b&gt;)Math.&lt;i&gt;abs&lt;/i&gt;(valorPixelG[i] - valoresG[j]);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    dif3=(&lt;b&gt;double&lt;/b&gt;)Math.&lt;i&gt;abs&lt;/i&gt;(valorPixelB[i] - valoresB[j]);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    sumaPotencias=Math.&lt;i&gt;pow&lt;/i&gt;(dif1, 2) + Math.&lt;i&gt;pow&lt;/i&gt;(dif2, 2) + Math.&lt;i&gt;pow&lt;/i&gt;(dif3, 2);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    diferencia = (&lt;b&gt;int&lt;/b&gt;)Math.&lt;i&gt;sqrt&lt;/i&gt;(sumaPotencias);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    &lt;b&gt;if&lt;/b&gt; (diferencia &lt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;     min_dif = diferencia;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;     min_clase = j;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   cluster[i] = min_clase;       &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  //guardamos valores de la ultima iteracion&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;int&lt;/b&gt; elems[] = &lt;b&gt;new&lt;/b&gt; &lt;b&gt;int&lt;/b&gt;[cjtos];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; i=0; i&lt;cjtos;&gt;&lt;/cjtos;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   valorAntR[i]=valoresR[i]; valorAntG[i]=valoresG[i]; valorAntB[i]=valoresB[i];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   valoresR[i]=0; valoresG[i]=0; valoresB[i]=0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   elems[i]=0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; j=0; j&lt;cluster.length;&gt;&lt;/cluster.length;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   valoresR[cluster[j]] += valorPixelR[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   valoresG[cluster[j]] += valorPixelG[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   valoresB[cluster[j]] += valorPixelB[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   elems[cluster[j]]++;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  //recalculamos el centroide de cada cluster&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; j=0; j&lt;valoresr.length;&gt;&lt;/valoresr.length;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   &lt;b&gt;if&lt;/b&gt; (elems[j]==0) {//it avoids that no class has 0 elements&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    Random alea = &lt;b&gt;new&lt;/b&gt; Random(); //it chooses random coordinates&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    &lt;b&gt;int&lt;/b&gt; x=alea.nextInt(w) ;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    &lt;b&gt;int&lt;/b&gt; y=alea.nextInt(h);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresR[j] = imageRGB[(y*w)+x];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresG[j] = imageRGB[(y*w)+x+1];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresB[j] = imageRGB[(y*w)+x+2];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    elems[j]++;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   &lt;b&gt;else&lt;/b&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresR[j] /= elems[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresG[j] /= elems[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    valoresB[j] /= elems[j];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  //comprobamos si hubo cambios en esta iteracion&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  salir = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  &lt;b&gt;for&lt;/b&gt; (&lt;b&gt;int&lt;/b&gt; i=0; i&lt;cjtos;&gt;&lt;/cjtos;&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   &lt;b&gt;if&lt;/b&gt; (valoresR[i]!=valorAntR[i]){&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    salir=&lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;    &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin-bottom: 0cm;font-family:arial;" align="left"&gt;&lt;span style="color: rgb(230, 230, 255);font-size:85%;" &gt;&lt;span style="font-size:9;"&gt; } &lt;b&gt;while&lt;/b&gt; (!salir);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;style type="text/css"&gt;-   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Finalmente copiamos los valores calculados en una nueva imagen, en la cual al mostrarla por pantalla podemos ver los distintos cluster formados por el algoritmo.&lt;br /&gt;&lt;br /&gt;Algoritmo kmeans con 2 cluster (K=2):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSu5vB7CI/AAAAAAAAAEM/TZ2_O9vJYAo/s1600-h/kmeans2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSu5vB7CI/AAAAAAAAAEM/TZ2_O9vJYAo/s320/kmeans2.png" alt="" id="BLOGGER_PHOTO_ID_5163538307249990690" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 3 cluster (K=3):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSu5vB7DI/AAAAAAAAAEU/vAgzsnrJTfs/s1600-h/kmeans3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSu5vB7DI/AAAAAAAAAEU/vAgzsnrJTfs/s320/kmeans3.png" alt="" id="BLOGGER_PHOTO_ID_5163538307249990706" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 4 cluster (K=4):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lRjDQFtRjZg/R6iSvJvB7EI/AAAAAAAAAEc/AeDYZPMWbyg/s1600-h/kmeans4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_lRjDQFtRjZg/R6iSvJvB7EI/AAAAAAAAAEc/AeDYZPMWbyg/s320/kmeans4.png" alt="" id="BLOGGER_PHOTO_ID_5163538311544958018" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 6 cluster (K=6):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6iSvpvB7FI/AAAAAAAAAEk/ndfgUDRBhFM/s1600-h/kmeans6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6iSvpvB7FI/AAAAAAAAAEk/ndfgUDRBhFM/s320/kmeans6.png" alt="" id="BLOGGER_PHOTO_ID_5163538320134892626" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 8 cluster (K=8):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSv5vB7GI/AAAAAAAAAEs/IktXdyEfDAY/s1600-h/kmeans8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSv5vB7GI/AAAAAAAAAEs/IktXdyEfDAY/s320/kmeans8.png" alt="" id="BLOGGER_PHOTO_ID_5163538324429859938" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 10 cluster (K=10):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lRjDQFtRjZg/R6iS9ZvB7II/AAAAAAAAAE8/x94vH9stofk/s1600-h/kmeans10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_lRjDQFtRjZg/R6iS9ZvB7II/AAAAAAAAAE8/x94vH9stofk/s320/kmeans10.png" alt="" id="BLOGGER_PHOTO_ID_5163538556358093954" border="0" /&gt;&lt;/a&gt;Algoritmo kmeans con 20 cluster (K=20):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6iS9pvB7JI/AAAAAAAAAFE/CEvPvuXZDI8/s1600-h/kmeans20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/R6iS9pvB7JI/AAAAAAAAAFE/CEvPvuXZDI8/s320/kmeans20.png" alt="" id="BLOGGER_PHOTO_ID_5163538560653061266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt; &lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;&lt;br/&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-4593784725544965738?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/4593784725544965738/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=4593784725544965738' title='17 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4593784725544965738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4593784725544965738'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/02/filtro-k-means-k-medias.html' title='Filtro K-means (K-Medias)'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lRjDQFtRjZg/R6iSu5vB7CI/AAAAAAAAAEM/TZ2_O9vJYAo/s72-c/kmeans2.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-5191991817302611340</id><published>2008-01-28T10:07:00.001+01:00</published><updated>2008-01-28T11:38:48.296+01:00</updated><title type='text'>Player + placa+ pwm +puente en h + motor</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;Ya estamos probando la integración de player con la placa de motores soldada, recordamos que usamos pwm para la velocidad de los motores. Se han hecho pruebas de direccion de los motores y de velocidades, aunque por ahora solo probamos con un único motor. La ultima fase de esto fue crear el puente en H (h-bridge).&lt;br /&gt;&lt;br /&gt;En el vídeo se puede ver la prueba que se hizo referida a la velocidad del motor. En el vídeo se puede ver la fuente de alimentación de 12 voltios que alimenta la placa gestora de los motores, luego se ve la placa de motores con sus componentes (pic16f876, max232, 74hct04, 74hct08, condensadores, resistencias, conectores ...). Esta placa conecta con un bus de 6 pines a otra placa donde se puede ver el puente en h, este es el encargado de proporcionar la fuerza correspondiente al motor. En el vídeo también se ve el portátil con el eclipse Ide arrancado y nuestro programa funcionando. También se ven dos consolas, una con el servidor de player corriendo, y otra con la lectura del puerto serie /dev/ttyUSB0 con las señales que devuelve el pic.  &lt;br /&gt;&lt;br /&gt;El programa es un bucle que empieza mandando señales de funcionamiento del motor hacia delante a una velocidad máxima, el bucle va decrementando esta velocidad en porciones de 1/10 (un décimo) hasta que llegue a parar.&lt;br /&gt;&lt;br /&gt;El vídeo no se aprecia muy bien la velocidad a la que gira el motor, casi se puede apreciar más con el sonido que hace este mismo.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7dmRpCOY68I&amp;amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7dmRpCOY68I&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Esta prueba nos sirve para poder sacar algunas conclusiones que voy a exponer:&lt;br /&gt;&lt;br /&gt;-La integración es un hecho, los funcionamientos de dirección (adelante / atrás) son correctos y la implementación del pwm(modulación ancho de pulso / pulse width modulation) satisfactoria.&lt;br /&gt;&lt;br /&gt;- El calor es ahora mismo el enemigo publico numero uno. Los cables de potencia (12v) son finos lo que provoca irradiación por lo tanto cierto malfuncionamiento de la placa. Esto lo solucionaremos soldando cables de mayor grosor.&lt;br /&gt;&lt;br /&gt;- Los tips usados, los TIP125 solo soportan 4 amperios, los motores consumen de 2 a 3. Lo que hace que se calienten en exceso, en 20 o 30 segundos pueden llegar a hechar humo. Esto lo podemos solucionar con disipadores y algún ventilador. Aunque hemos decidido comprar unos superiores, los TIP135 que soportan 12 Amperios (suficiente creo) combinados con los TIP130, si no fuera suficiente le pondremos disipadores. Estos TIPS están pedidos, pero tardarán 1 semana en llegar (no había en ninguna tienda de alicante).&lt;br /&gt;&lt;br /&gt;- Tenemos algunos problemas con los voltajes finales. A máxima potencia debería de dar 12 voltios y solo da 10,30 y "8 y algo" dependiendo la dirección. Además los voltajes no son estables, lo que pensamos que puede ser por la temperatura de los cables y los tips. A pesar de ello voy a desmontar el puente en H y hacerle una limpieza en profundidad por si hay algún pequeño cortocircuito.&lt;br /&gt;&lt;br /&gt;Por lo demás estamos relativamente contentos por el funcionamiento. No es correcto del todo, pero el trasfondo es positivo.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-5191991817302611340?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/5191991817302611340/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=5191991817302611340' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5191991817302611340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5191991817302611340'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/01/player-placa-pwm-puente-en-h-motor.html' title='Player + placa+ pwm +puente en h + motor'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-3180169819481291334</id><published>2008-01-22T09:26:00.000+01:00</published><updated>2008-12-11T08:02:42.968+01:00</updated><title type='text'>Actualizacion de diagrama</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;De&lt;br /&gt;&lt;/script&gt;Como comenté anteriormente he tenido que sustituir algunos componentes del diagrama electrico de la placa que gestiona los motores.  Entre otras cosas he tenido que suprimir el l293 por no tener un mínimo de soporte al amperaje y he insertado un 7408 (puertas and) para poder aplicar las señales al puente en H.&lt;br /&gt;&lt;br /&gt;Aquí tenéis la nueva versión del diagrama:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/R5WqsoNWqRI/AAAAAAAAAE8/Y0o7HQ494JM/s1600-h/diagrama7408.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/R5WqsoNWqRI/AAAAAAAAAE8/Y0o7HQ494JM/s320/diagrama7408.JPG" alt="" id="BLOGGER_PHOTO_ID_5158216631907166482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aquí os ponga también el diseño que he creado para soldar en una placa virgen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R5WqYYNWqQI/AAAAAAAAAE0/V2-QbkN0qO8/s1600-h/Diagrama_RABOTRON.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/R5WqYYNWqQI/AAAAAAAAAE0/V2-QbkN0qO8/s320/Diagrama_RABOTRON.JPG" alt="" id="BLOGGER_PHOTO_ID_5158216284014815490" border="0" /&gt;&lt;/a&gt;Bueno ahora queda soldar los componentes y hacer las pruebas. Algo ya tengo soldado pero estoy teniendo algunos problemas de inductancia que explicaré en el próximo post.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-3180169819481291334?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/3180169819481291334/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=3180169819481291334' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3180169819481291334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3180169819481291334'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/01/actualizacion-de-diagrama.html' title='Actualizacion de diagrama'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qXc7kTaGt-E/R5WqsoNWqRI/AAAAAAAAAE8/Y0o7HQ494JM/s72-c/diagrama7408.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-3655519920043543693</id><published>2008-01-17T09:51:00.000+01:00</published><updated>2008-12-11T08:02:43.634+01:00</updated><title type='text'>Integracion de PWM y Puente en H</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;Como ya hemos comentado previamente, la velocidad de nuestro robot la vamos a regular mediante PWM (pulse width modulation) o modulación de ancho de pulso. También hemos comentado que para el manejo de los motores usaremos un puente en h que estamos creando. Aquí vamos a ver como integrar las dos cosas y no morir en el intento.&lt;p class="MsoNormal"&gt;  &lt;/p&gt;&lt;p class="MsoNormal"&gt;Como dijimos en el post anterior (&lt;a href="http://celtico-celtico.blogspot.com/2008/01/consideraciones-del-puente-en-h.html"&gt;http://celtico-celtico.blogspot.com/2008/01/consideraciones-del-puente-en-h.html&lt;/a&gt;) el puente en H tiene 5 entradas: 2 entradas para los voltajes positivo y negativo de la bateria (fuerza con la que se mueven los motores) y 3 entradas para el manejo lógico del puente en H en sí (dos para las direcciones y una para tierra).&lt;/p&gt;&lt;p class="MsoNormal"&gt;Un ejemplo de puente en H se muestra a continuación:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/R48YRINWqNI/AAAAAAAAAEc/mQvOfKX0gSY/s1600-h/puenteH.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/R48YRINWqNI/AAAAAAAAAEc/mQvOfKX0gSY/s320/puenteH.JPG" alt="" id="BLOGGER_PHOTO_ID_5156366780902844626" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;No es exactamente el que usamos nosotros pero nos sirve para la explicación. Las entradas de avance y retroceso son las que indican la dirección en la que van a girar los motores, vamos a llamarlas de una forma más técnica InputA e InputB. Con la siguiente tabla podemos ver el funcionamiento del motor dependiendo de los valores de las entradas:&lt;/p&gt;&lt;pre&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; input | output&lt;br /&gt;A | B | A | B&lt;br /&gt;----------------&lt;br /&gt;0   0 | libre --&gt; &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:130%;"&gt;Paro: Motores sin corriente&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 1   0 | 1   0 --&gt; &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:130%;"&gt;Giro hacia un sentido&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 0   1 | 0   1 --&gt; &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:130%;"&gt;Giro hacia otro sentido&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 1   1 | 1   1 --&gt; &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:130%;"&gt;Paro: Bloqueo de motores (intentar evitarlo)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;Lo que nos queda entonces es poder aplicar el pwm al puente en H. En otros integrados ya existentes (L293, L298...) ya tienen la entrada de habilitar donde podemos poner el pwm. En el que creamos nosotros por contra no dispone de ella, por lo que deberemos aplicar la señal pwm sobre las entradas de control del puente en H dirtectamente.&lt;/p&gt;&lt;p class="MsoNormal"&gt;La movida es que necesitaríamos 4 señales de pwm (2 motores y 2 entradas por motor) y el integrado (PIC16F876) solo dispone de 2 (por lo menos por hardware). Podríamos crear 2 señales pwm manejadas por software, pero creo que no sería la mejor solución, primero por la gestión de recursos del propio chip y segundo por la necesidad de dejar entradas libres del pic para otros usos.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Entonces fué el momento de sacar mis conocimientos Informática básica, fundamentos de los computadores y fundamentos técnicos de los computadores para acordarme de aquellas puertas lógicas tan chulas que me acompañaron en la carrera. La solución al problema es dar una señal pwm a cada motor. Cada entrada del motor tendrá una puerta and (hablamos de puertas lógicas) que mezcle la señal de pwm con la señal de habilitación.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Vamos a ir por partes y lo primero que quiero indicar para el que no sepa mucha lógica booleana es que hace una puerta and. Aquí está la tabla de verdad:&lt;/p&gt;&lt;pre&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; input | output&lt;br /&gt;A | B |   A&lt;br /&gt;----------------&lt;br /&gt;0   0 |   0&lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 1   0 |   0 &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:12;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 0   1 |   0 &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:12;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 1   1 |   1&lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:12;"&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="MsoNormal"&gt;  Por lo que si ponemos una puerta and a cada una de las entradas del puente en H con las señales de pwm y de "habilitación" conseguimos sacar ó 0 ó la señal de pwm:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qXc7kTaGt-E/R48qfYNWqOI/AAAAAAAAAEk/P_pGqTQU4wU/s1600-h/and.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_qXc7kTaGt-E/R48qfYNWqOI/AAAAAAAAAEk/P_pGqTQU4wU/s320/and.JPG" alt="" id="BLOGGER_PHOTO_ID_5156386816925280482" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Podemos ver el comportamiento de las entradas, donde x significa el valor del pwm, h entrada de habilitación y P entrada pwm:&lt;/p&gt;&lt;pre&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; input | output&lt;br /&gt;H | P |   A&lt;br /&gt;----------------&lt;br /&gt;0   x |   0 &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; 1   x |   x&lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;/pre&gt;Cabe destacar que la otra entrada del puente en H es inversa. Por lo que si una está habilitada la otra no. Por lo que siempre correrá por el puente los siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt;pwm | direccion  | entrada A | entrada B&lt;br /&gt;-----------------------------------------&lt;br /&gt;x  |  adelante  |    x      |    0 &lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;tt&gt;&lt;span style="font-family:ARIAL;"&gt;&lt;tt&gt; x  |   atras    |    0      |    x&lt;/tt&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las puertas and utilizadas son las del chip  74HCT08&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qXc7kTaGt-E/R48xfoNWqPI/AAAAAAAAAEs/IT-_RyDPBWI/s1600-h/74hct08.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_qXc7kTaGt-E/R48xfoNWqPI/AAAAAAAAAEs/IT-_RyDPBWI/s320/74hct08.gif" alt="" id="BLOGGER_PHOTO_ID_5156394517801642226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creo que esto nos va a servir para el movimiento de nuestros motores. Pero esto es la teoría, ahora hay que empezar a montar esto a ver si funciona. En cuanto tenga algo espero poder subir fotos o algún vídeo.&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;font-size:12;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-3655519920043543693?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/3655519920043543693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=3655519920043543693' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3655519920043543693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3655519920043543693'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/01/integracion-de-pwm-y-puente-en-h.html' title='Integracion de PWM y Puente en H'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qXc7kTaGt-E/R48YRINWqNI/AAAAAAAAAEc/mQvOfKX0gSY/s72-c/puenteH.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-138538531803711863</id><published>2008-01-10T09:29:00.000+01:00</published><updated>2008-12-11T08:02:44.457+01:00</updated><title type='text'>Consideraciones del puente en H</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;CPara P&lt;br /&gt;&lt;/script&gt;Para el movimiento final de los motores del robot vamos a utilizar un puente en H. El sistema de puente en H se basa en la utilización de interruptores, los cuales los permitirán pasar o cortar la corriente en un determinado sentido. Con esto conseguimos poder dar el voltaje necesario a los motores controlando tambien  la direccion de esto. El nombre de puente en H viene dado por la forma que tienen sus componentes en el esquema.&lt;br /&gt;&lt;br /&gt;En un principio queríamos usar uno ya hecho. Por lo que en los esquemas aparece el integrado L293 o el L293b (con diodos) que es un doble puente en H, por lo que podriamos tener una bonita, a la misma vez que barata solución para el proyecto.&lt;br /&gt;&lt;br /&gt;L293:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R4XbtYNWqII/AAAAAAAAAC0/JInshrkOV_M/s1600-h/l293b.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/R4XbtYNWqII/AAAAAAAAAC0/JInshrkOV_M/s320/l293b.jpg" alt="" id="BLOGGER_PHOTO_ID_5153766921234458754" border="0" /&gt;&lt;/a&gt;Pero no todo es tan bonito. Aguanta hasta 36V y nosotros vamos a manejar 12V. Pero solo puede aguantar 1A de consumo. No sabemos exactamente cuanto va a consumir los motores pero preveemos que rondará el 1,2A. Por lo que este integrado no nos sirve.&lt;br /&gt;&lt;br /&gt;Hemos visto la posibilidad de usar un integrado de mayores prestaciones, como puede ser el L298.&lt;br /&gt;&lt;br /&gt;L298:&lt;br /&gt;Al igual que el L293 se trata de un puente en H aunque se presenta en otro formato:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qXc7kTaGt-E/R4Xda4NWqJI/AAAAAAAAAC8/TBO2o_pLN-M/s1600-h/L298.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_qXc7kTaGt-E/R4Xda4NWqJI/AAAAAAAAAC8/TBO2o_pLN-M/s320/L298.jpg" alt="" id="BLOGGER_PHOTO_ID_5153768802430134418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Este integrado soporta ya 2A (amperios) por canal (cada motor), por lo que en un principio podrían moverse los motores de nuestro robot.&lt;br /&gt;&lt;br /&gt;Es el momento entonces de introducir un nuevo concepto: Consumo de parada.&lt;br /&gt;Cuando un motor nos dice en la especificación que consume X amperios significa que lo hace en vacío, es decir, sin tener que soportar ninguna carga. Conforme el motor tiene que soportar mas carga este consumo se va haciendo cada vez mas y mas grande. Llegando hasta el punto de que el motor no sea capaz de mover el peso. En este punto estamos en parada. El consumo aquí sube dramáticamente hasta  hasta puntos insospechados.&lt;br /&gt;&lt;br /&gt;Para hacernos una idea, si el robot se tropieza con una pared y las ruedas no "patinan" (momento de parada) los motores podrían pasar de 1,2 A hasta 8A. También es verdad es que este caso tan extremo no se va a dar (o eso espero), pero tenemos que tener en cuenta que un puente en H que solo soporte 2A parece muy poco.&lt;br /&gt;&lt;br /&gt;Tenemos que ir a algo mas "consistente". En integrados no he encontrado nada mas fuerte, por lo que hemos decidido construirlo nosotros mismos.&lt;br /&gt;&lt;br /&gt;Vamos a usar un esquema encontrado por Internet que&lt;span style="font-family:ARIAL;"&gt; maneja  pequeños motores dc de 100W, 5 Amperios o 40 Voltios, que creemos que es suficiente:&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/R4XzioNWqKI/AAAAAAAAADE/v8zojEcJ-SE/s1600-h/esqu.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/R4XzioNWqKI/AAAAAAAAADE/v8zojEcJ-SE/s320/esqu.JPG" alt="" id="BLOGGER_PHOTO_ID_5153793124829931682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por lo que vamos a intentar implementar este esquema para el manejo de los motores, ya que creemos que es el mas idóneo.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-138538531803711863?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/138538531803711863/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=138538531803711863' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/138538531803711863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/138538531803711863'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/01/consideraciones-del-puente-en-h.html' title='Consideraciones del puente en H'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qXc7kTaGt-E/R4XbtYNWqII/AAAAAAAAAC0/JInshrkOV_M/s72-c/l293b.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-6143991669869461800</id><published>2008-01-07T13:16:00.001+01:00</published><updated>2008-12-11T08:02:44.736+01:00</updated><title type='text'>Posible configuración de los motores</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;Estoy estudiando que motores ponerle a al robot Rabotron.&lt;br /&gt;Lo que hay que tener en cuenta antes de comprarlos es de las dos limitaciones  que tenemos: la velocidad y la potencia.&lt;br /&gt;&lt;br /&gt;La velocidad ya comentamos en posts anteriores que dependería del radio de la rueda y de las rev por minuto (rpm) del motor. En una primera estimación concluí que con una rueda de 10 cm de diámetro necesitaríamos un motor de unas 280 vueltas por minuto.&lt;br /&gt;&lt;br /&gt;La velocidad se ve todo muy matemático. Pero el problema es cuando queremos ver que potencia debe de tener los motores. Ya comentamos que hay que llevar unos 7 a 9 kg. Pero para saber que potencia debemos de manejarnos por la experiencia.&lt;br /&gt;&lt;br /&gt;Buscando por Internet encontré una pagina que ya habían hecho esta experiencia y los resultados fueron:&lt;br /&gt;&lt;br /&gt;Con dos motores de 19,61 N-cm se comprobó que se podía transportar hasta 3,5 Kg. Por lo que con dos motores de 26 N-cm se podía transportar un total de 9,8 kg.&lt;br /&gt;&lt;br /&gt;Carga = 52 N-cm * 3,5 Kg / 19,61 N-cm = 9,8 Kg&lt;br /&gt;&lt;br /&gt;Una opción sería comprar motores y ponerle yo una reductora. Cosa que veo muy complicada debido a que no se donde comprar reductoras, y otra opción es comprar motores con reductoras incorporadas.&lt;br /&gt;&lt;br /&gt;De la segunda opción: motores con reductora, he creado una pequeña configuración de motores de una tienda de Sevilla llamada superrobotica.com.&lt;br /&gt;&lt;br /&gt;&lt;table class="Txt1" align="center" border="0" width="740"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R4IkTINWqHI/AAAAAAAAACs/cyap7SdrF5M/s1600-h/presu.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/td&gt;   &lt;/tr&gt;      &lt;form action="../cgi-bin/robocarrito.asp?modo=S360170&amp;amp;IdRef=Actual" method="post" name="form1"&gt;&lt;/form&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;table class="Txt1" align="center" border="1"&gt;           &lt;tbody&gt;&lt;tr align="right"&gt;             &lt;td bgcolor="#ffcc00"&gt;Referencia&lt;/td&gt;             &lt;td bgcolor="#ffcc00"&gt;Nombre&lt;/td&gt;             &lt;td bgcolor="#ffcc00"&gt;P.Unitario&lt;/td&gt;             &lt;td bgcolor="#ffcc00"&gt;Cantidad&lt;/td&gt;             &lt;td bgcolor="#ffcc00"&gt;EUROS&lt;/td&gt;           &lt;/tr&gt;                      &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td&gt;S330142&lt;/td&gt;             &lt;td&gt;MOTOR DC REDUCTOR 12V 253 RPM&lt;/td&gt;             &lt;td&gt;27,46&lt;/td&gt;             &lt;td&gt;&lt;input size="3" value="2" name="ItemS330142" type="text"&gt;&lt;/td&gt;             &lt;td&gt;54,91&lt;/td&gt;           &lt;/tr&gt;                      &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td&gt;S360167&lt;/td&gt;             &lt;td&gt;MEGA RUEDA ROBOT TODO TERRENO 130 MM&lt;/td&gt;             &lt;td&gt;27,11&lt;/td&gt;             &lt;td&gt;&lt;input size="3" value="1" name="ItemS360167" type="text"&gt;&lt;/td&gt;             &lt;td&gt;27,11&lt;/td&gt;           &lt;/tr&gt;                      &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td&gt;S360170&lt;/td&gt;             &lt;td&gt;CASQUILLOS FIJACION RUEDA TT 90MM&lt;/td&gt;             &lt;td&gt;10,13&lt;/td&gt;             &lt;td&gt;&lt;input size="3" value="1" name="ItemS360170" type="text"&gt;&lt;/td&gt;             &lt;td&gt;10,13&lt;/td&gt;           &lt;/tr&gt;                      &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td&gt;S360214&lt;/td&gt;             &lt;td&gt;PAREJA SOPORTES MOTOR DC REDUCTOR&lt;/td&gt;             &lt;td&gt;8,66&lt;/td&gt;             &lt;td&gt;&lt;input size="3" value="1" name="ItemS360214" type="text"&gt;&lt;/td&gt;             &lt;td&gt;8,66&lt;/td&gt;           &lt;/tr&gt;                      &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td colspan="4" align="right"&gt;Gastos de Envió Zona 1&lt;/td&gt;             &lt;td&gt;7,00&lt;/td&gt;           &lt;/tr&gt;           &lt;tr align="right" bgcolor="#e9e9e9"&gt;             &lt;td colspan="4" align="right"&gt;IVA 16%&lt;/td&gt;             &lt;td&gt;17,25&lt;/td&gt;           &lt;/tr&gt;           &lt;tr align="right" bgcolor="#ffcc00"&gt;             &lt;td colspan="4" align="right"&gt;&lt;b&gt;TOTAL&lt;/b&gt;&lt;/td&gt;             &lt;td&gt;&lt;b&gt;125,07&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R4IkTINWqHI/AAAAAAAAACs/cyap7SdrF5M/s1600-h/presu.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/R4IkTINWqHI/AAAAAAAAACs/cyap7SdrF5M/s320/presu.jpg" alt="" id="BLOGGER_PHOTO_ID_5152720834704877682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Los motores S330142 tienen las siguientes características:&lt;br /&gt;&lt;br /&gt;&lt;table class="Txt1" align="center" border="1" cellspacing="0" width="80%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Tensión Nominal &lt;/td&gt;              &lt;td&gt;12V&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Velocidad Nominal a 12V &lt;/td&gt;              &lt;td&gt;253 rpm &lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Consumo sin carga 12V &lt;/td&gt;              &lt;td&gt;157 mA &lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Consumo eje frenado 12V &lt;/td&gt;              &lt;td&gt;3800 mA &lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Relación engranajes&lt;/td&gt;              &lt;td&gt;30:1&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Fuerza de parada &lt;/td&gt;              &lt;td&gt;10 kg·cm&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Peso &lt;/td&gt;              &lt;td&gt;202 g &lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Diámetro Máximo&lt;/td&gt;              &lt;td&gt;37 mm &lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Diámetro Eje &lt;/td&gt;              &lt;td&gt;&lt;p&gt;6 mm&lt;/p&gt;&lt;/td&gt;            &lt;/tr&gt;            &lt;tr&gt;              &lt;td&gt;Rosca fijación&lt;/td&gt;              &lt;td&gt;4 x M3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Los 10 kg.cm de parada supera claramente a los 2,65 necesarios para mover 9 kilos. Las revoluciones son un poco justas, por lo que lo compensamos con ruedas de 13 cm de diámetro:&lt;br /&gt;&lt;br /&gt;&lt;table str="" style="border-collapse: collapse; width: 478pt;" border="0" cellpadding="0" cellspacing="0" width="637"&gt;&lt;col style="width: 76pt;" width="101"&gt;  &lt;col style="width: 72pt;" width="96"&gt;  &lt;col style="width: 66pt;" span="5" width="88"&gt;  &lt;tbody&gt;&lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt; width: 76pt;" height="21" width="101"&gt;Diametro rueda&lt;/td&gt;   &lt;td style="width: 72pt;" width="96"&gt;cm*vuelta&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;RPM&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/minuto&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;m/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;Km/h&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt;" num="" align="right" height="21"&gt;13&lt;/td&gt;   &lt;td num="40.840704496667314" fmla="=A2*PI()" align="right"&gt;40,8407045&lt;/td&gt;   &lt;td num="" align="right"&gt;253&lt;/td&gt;   &lt;td num="10332.69823765683" fmla="=B2*C2" align="right"&gt;10332,6982&lt;/td&gt;   &lt;td num="619961.89425940986" fmla="=D2*60" align="right"&gt;619961,894&lt;/td&gt;   &lt;td num="6199.6189425940984" fmla="=E2/100" align="right"&gt;6199,61894&lt;/td&gt;   &lt;td num="6.199618942594098" fmla="=F2/1000" align="right"&gt;6,19961894&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Con lo que conseguiríamos una velocidad de poco mas de 6 km/h, suficiente para seguir a un peatón que no corra mucho.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-6143991669869461800?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/6143991669869461800/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=6143991669869461800' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6143991669869461800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6143991669869461800'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2008/01/posible-configuracin-de-los-motores.html' title='Posible configuración de los motores'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qXc7kTaGt-E/R4IkTINWqHI/AAAAAAAAACs/cyap7SdrF5M/s72-c/presu.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8016837829802682037</id><published>2007-12-27T21:02:00.000+01:00</published><updated>2007-12-27T21:31:13.678+01:00</updated><title type='text'>Probando motores</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;He creado una especie de prototipo de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Rabotron&lt;/span&gt;. El prototipo se basa en una madera donde van tres ruedas. Dos ruedas son las motrices y una tercera es una rueda loca. Supuestamente cada rueda motriz va con un motor. Para la prueba desmonté un destornillador &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;eléctrico&lt;/span&gt; de 12 voltios que compré con anterioridad. Por lo que solo hay una rueda motriz, lo que hace que el robot de vueltas sobre si mismo.&lt;br /&gt;&lt;br /&gt;Lo que no he tenido claro desde un principio es que motor poner al final. Necesito un motor que pueda ir a la velocidad de una persona andando (unos 5 km/h) y a la misma vez que pueda mover el peso del robot. El peso del robot es mas o menos:&lt;br /&gt;&lt;br /&gt;- &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;Batería&lt;/span&gt; 2 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;kg&lt;/span&gt;&lt;br /&gt;- &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Portátil&lt;/span&gt; 2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Kg&lt;/span&gt;&lt;br /&gt;- Estructura ? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;kg&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;metacrilato&lt;/span&gt;)&lt;br /&gt;- Los motores ? &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;kg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por lo que con esto ya tenemos las primera &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;incógnitas&lt;/span&gt;, ya que no se cuanto pesa el robot, aunque supongo que unos 5-6 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;kg&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La prueba se hizo con el susodicho motor del destornillador que funciona a 550 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;rpm&lt;/span&gt;. Las ruedas usadas son de 5cm de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;diámetro&lt;/span&gt;. Por lo que el robot &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;iría&lt;/span&gt; a una velocidad de unos  5 km/h. El &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;cálculo&lt;/span&gt; esta hecho en una hoja de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;excel&lt;/span&gt; como se ve a continuación:&lt;br /&gt;&lt;br /&gt;&lt;table str="" style="border-collapse: collapse; width: 478pt;" border="0" cellpadding="0" cellspacing="0" width="637"&gt;&lt;col style="width: 76pt;" width="101"&gt;  &lt;col style="width: 72pt;" width="96"&gt;  &lt;col style="width: 66pt;" span="5" width="88"&gt;  &lt;tbody&gt;&lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt; width: 76pt;" height="21" width="101"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;Diámetro&lt;/span&gt; rueda&lt;/td&gt;   &lt;td style="width: 72pt;" width="96"&gt;cm*vuelta&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;RPM&lt;/span&gt;&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/minuto&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;m/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;Km/h&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt; text-align: left;" num="" height="21"&gt;5&lt;/td&gt;   &lt;td style="text-align: left;" num="15.707963267948966" fmla="=A2*PI()"&gt;15,70796327&lt;/td&gt;   &lt;td style="text-align: left;" num=""&gt;550&lt;/td&gt;   &lt;td style="text-align: left;" num="8639.3797973719302" fmla="=B2*C2"&gt;8639,3798&lt;/td&gt;   &lt;td style="text-align: left;" num="518362.7878423158" fmla="=D2*60"&gt;518362,788&lt;/td&gt;   &lt;td style="text-align: left;" num="5183.6278784231581" fmla="=E2/100"&gt;5183,62788&lt;/td&gt;   &lt;td style="text-align: left;" num="5.1836278784231578" fmla="=F2/1000"&gt;5,18362788&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Eso es a lo que se refiera a la velocidad. Si hablamos de la potencia, no tenemos &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_18"&gt;ningún&lt;/span&gt; dato significativo en las instrucciones del motor, así es que en la practica pasaba lo siguiente:&lt;br /&gt;&lt;br /&gt;De 0 a 3 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;kg&lt;/span&gt; de peso: El robot se mueve con facilidad.&lt;br /&gt;De 3 a 6 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;Kg&lt;/span&gt; de peso: El robot se mueve con cierta facilidad aunque se nota una disminución de la velocidad.&lt;br /&gt;Más de 6 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;kg&lt;/span&gt; de peso: Mucha dificultad (con mas de 7 presenta problemas de movimiento y se para).&lt;br /&gt;&lt;br /&gt;En lo que se refiere al consumo, cosa que me importa &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_22"&gt;también&lt;/span&gt; bastante para poder fabricar un puente en H acorde, los motores consumen  en &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;vacío&lt;/span&gt; unos 2 A (amperios). Cuando mueve cierto peso este consumo sube a unos 3 o 3 y algo. Cosa que no es muy alarmante pensando que &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;podría&lt;/span&gt; ser peor.&lt;br /&gt;&lt;br /&gt;El ejemplo que se ha comentado con anterioridad sale presentado en el siguiente &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;vídeo&lt;/span&gt;, donde el robot pesa 5 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;kg&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/GxHZK0JACxw"&gt;&lt;embed src="http://www.youtube.com/v/GxHZK0JACxw" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Lo que quiero hacer es empezar a ver que motores son los adecuados para nuestro robot &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;rabotron&lt;/span&gt;. Las ruedas lo que esta claro es que son muy pequeñas, por lo que iremos a unas de al menos 10-12 cm de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_28"&gt;diámetro&lt;/span&gt;. Por lo que con las formulas de antes podemos ver que con 270 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;rpm&lt;/span&gt; puede ir a la velocidad de un humano y así seguirlo:&lt;br /&gt;&lt;br /&gt;&lt;table str="" style="border-collapse: collapse; width: 478pt;" border="0" cellpadding="0" cellspacing="0" width="637"&gt;&lt;col style="width: 76pt;" width="101"&gt;  &lt;col style="width: 72pt;" width="96"&gt;  &lt;col style="width: 66pt;" span="5" width="88"&gt;  &lt;tbody&gt;&lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt; width: 76pt;" height="21" width="101"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_30"&gt;Diámetro&lt;/span&gt; rueda&lt;/td&gt;   &lt;td style="width: 72pt;" width="96"&gt;cm*vuelta&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;RPM&lt;/span&gt;&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/minuto&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;cm/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;m/hora&lt;/td&gt;   &lt;td style="width: 66pt;" width="88"&gt;Km/h&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td style="height: 15.75pt;" num="" align="right" height="21"&gt;11&lt;/td&gt;   &lt;td num="34.557519189487721" fmla="=A2*PI()" align="right"&gt;34,55751919&lt;/td&gt;   &lt;td num="" align="right"&gt;270&lt;/td&gt;   &lt;td num="9330.5301811616846" fmla="=B2*C2" align="right"&gt;9330,53018&lt;/td&gt;   &lt;td num="559831.81086970109" fmla="=D2*60" align="right"&gt;559831,811&lt;/td&gt;   &lt;td num="5598.3181086970108" fmla="=E2/100" align="right"&gt;5598,31811&lt;/td&gt;   &lt;td num="5.5983181086970104" fmla="=F2/1000" align="right"&gt;5,59831811&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Pero la pregunta es.... ¿que motor? y sobretodo.. ¿soportará el motor el peso de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;rabotron&lt;/span&gt;? Las unidades de medida son &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;kg&lt;/span&gt;/cm o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;mNm&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;miliNewton&lt;/span&gt; por metro) pero no las tengo del todo claro para saber si puede mover dicho peso o no.&lt;br /&gt;&lt;br /&gt;Bueno habrá que seguir investigando.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8016837829802682037?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8016837829802682037/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8016837829802682037' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8016837829802682037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8016837829802682037'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/probando-motores.html' title='Probando motores'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-7279517221353691945</id><published>2007-12-20T16:46:00.000+01:00</published><updated>2008-12-11T08:02:44.924+01:00</updated><title type='text'>Instalación del proyecto Rabotron paso a paso</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;En este post vamos ha explicar como hemos instalado nuestro proyecto desde cero, para lo que hemos instalado... Debian, eclipse, java, gspca (spca5xx), player ( player 2.0.4 ).&lt;br /&gt;&lt;br /&gt;Bueno comencemos:&lt;br /&gt;&lt;br /&gt;1.- Lo primero que tenemos  que hacer es descargar Debian. En nuestro caso hemos decido instalar Debian Lenny (en estos momentos testing) desde el netinstall (http://www.debian.org/devel/debian-installer/). Para el que no se aclare mucho siempre puede descargar los ISOs de Debian completos, aun que si aquí ya andamos perdidos...&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;En este post vamos ha explicar como hemos instalado nuestro proyecto desde cero, para lo que hemos instalado... Debian, eclipse, java, gspca (spca5xx), player ( player 2.0.4 ).&lt;br /&gt;&lt;br /&gt;Bueno comencemos:&lt;br /&gt;&lt;br /&gt;1.- Lo primero que tenemos  que hacer es descargar Debian. En nuestro caso hemos decido instalar Debian Lenny (en estos momentos testing) desde el &lt;a href="http://www.debian.org/devel/debian-installer/"&gt;netinstall&lt;/a&gt;. Para el que no se aclare mucho siempre puede descargar los ISOs de Debian completos, aun que si aquí ya andamos perdidos...&lt;br /&gt;&lt;br /&gt;2.- Una vez instalado Debian...lo tenemos todo un poco “pelao” todavía.&lt;br /&gt;Seguiremos por descargar &lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse Classic&lt;/a&gt; de la página oficial.&lt;br /&gt;Cuando se haya descargado Eclipse simplemente es descomprimirlo donde queramos.&lt;br /&gt;&lt;br /&gt;Es posible que al ejecutar Eclipse nos de un error similar a este:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Error opening the editor&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;java.lang.ClassNotFoundException: org.eclipse.core.runtime.Plugin&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lRjDQFtRjZg/R2qPAMrPChI/AAAAAAAAABo/bEcuTUCG0yM/s1600-h/errorEclipse.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 255px;" src="http://4.bp.blogspot.com/_lRjDQFtRjZg/R2qPAMrPChI/AAAAAAAAABo/bEcuTUCG0yM/s320/errorEclipse.png" alt="" id="BLOGGER_PHOTO_ID_5146082757789551122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bien, que no cunda el pánico, esto es porque Eclipse no encuentra el entorno de ejecución de java (JRE). Para solucionarlo simplemente hay que instalar el JRE, hay variar soluciones.&lt;br /&gt;&lt;br /&gt;La elegida esta vez ha sido &lt;a href="https://sdlc2d.sun.com/ECom/EComActionServlet;jsessionid=1D21311B6ED356E1FD6223C601F3BB0F"&gt;descargar el jdk6&lt;/a&gt; de la web de &lt;a href="http://java.sun.com/"&gt;sun&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3.- Pasamos a instalar el driver gspca (antiguo spca5XX) necesario para la camara web. Ya explicamos como instalar tanto el driver spca como el gspca, Para mas información leer el post &lt;a href="http://celtico-celtico.blogspot.com/2007/09/webcam-bajo-linux.html"&gt;http://celtico-celtico.blogspot.com/2007/09/webcam-bajo-linux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4.- Instalar Camorama: Esto no es obligatorio, pero podemos instalarlo para ver si el driver gspca funciona correctamente (apt-get install camorama).&lt;br /&gt;&lt;br /&gt;5.- Ya solo nos queda instalar &lt;a href="http://playerstage.sourceforge.net/"&gt;player&lt;/a&gt; 2.0.4, hemos elegido esta versión por ser estable. Estuvimos probando con la versión de player 2.1.0 descargada del CVS (explicaremos como hacerlo con eclipse en otro post) pero decidimos quedarnos con la 2.0.4 por estar todavía en pruebas y en depuración de varios bugs la versión 2.1.0.&lt;br /&gt;&lt;br /&gt;Antes de empezar con la instalación de Player 2.0.4 hay que instalar varias librerías:&lt;br /&gt;&lt;br /&gt;-    Librería “libtool” (apt-get install libtool) necesaria al hacer bootstrap para ejecutar automáticamente las ordenes:&lt;br /&gt;&lt;br /&gt;libtoolize –force&lt;br /&gt;&lt;br /&gt;-    Instalar automake (apt-get install automake), necesaria al hacer bootstrap para ejecutar automáticamente las ordenes:&lt;br /&gt;&lt;br /&gt;aclocal&lt;br /&gt;&lt;br /&gt;autoheader&lt;br /&gt;&lt;br /&gt;automake --gnu --add-missing&lt;br /&gt;&lt;br /&gt;-    Instalar pkg-config (apt-get install pkg-config), necesaria al hacer bootstrap para ejecutar automáticamente la orden:&lt;br /&gt;&lt;br /&gt;autoconf&lt;br /&gt;&lt;br /&gt;-    Libreria “libjpeg62-dev”(apt-get install libjpeg62-dev), necesaria para que al instalar player se instale el driver cameracompress, de lo contrario este driver no aparecerá en la instalación. Esto se ve al hacer el configure, donde aparece una lista con los drivers que se instalarán y los que no.&lt;br /&gt;&lt;br /&gt;Una vez instaladas estas librerías solo nos queda descargar &lt;a href="http://sourceforge.net/project/downloading.php?group_id=42445&amp;amp;use_mirror=surfnet&amp;amp;filename=player-2.0.4.tar.bz2&amp;amp;81204391"&gt;player 2.0.4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En nuestro caso hemos descomprimido el archivo y hemos añadido el driver Rabotron a la carpeta de “server/drivers/”, una vez hecho esto pasamos a la instalar Player:&lt;br /&gt;&lt;br /&gt;./bootstrap&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si al ejecutar bootstrap nos aparece el siguiente error:&lt;br /&gt;&lt;br /&gt;server/libplayerdrivers/Makefile.am:26: shell find $(top_builddir: non-POSIX variable name&lt;br /&gt;&lt;br /&gt;server/libplayerdrivers/Makefile.am:26: (probably a GNU make extension)&lt;br /&gt;&lt;br /&gt;hay que instalar la versión 1.9 de automake (apt-get install automake1.9) y volver a ejecutar bootstrap.&lt;br /&gt;&lt;br /&gt;Una vez termine, ejecutamos el comando:&lt;br /&gt;&lt;br /&gt; ./configure&lt;br /&gt;&lt;br /&gt;Al ejecutar configure nos dice los drivers que se instalarán y los que no serán instalados junto con la causa por la cual no pueden ser instalados:&lt;br /&gt;&lt;br /&gt;The following device drivers will be included:&lt;br /&gt;&lt;br /&gt;acts, amtecpowercube, aodv, bumpersafe, nd, &lt;span style="font-weight: bold; color: rgb(204, 204, 204);"&gt;cameracompress&lt;/span&gt;, camerav4l, canonvcc4,             clodbuster, cmucam2, cmvision, dummy, er1, fakelocalize, festival, flockofbirds, garminnmea, iwspy, khepera, laserbar, laserbarcode, lasercspace,    laserposeinterpolator, laserrescan, lasersafe, laservisualbarcode, laservisualbw, linuxjoystick, laserposeinterpolator, logfile, mapcspace, microstrain, obot, p2os, erratic, wbr914, ptu46, relay, rflex, sicklms200, sicknav200, sickpls, sicks3000, sphere, sonyevid30, urglaser, vfh, vmapfile, roomba, &lt;span style="font-weight: bold; color: rgb(204, 204, 204);"&gt;rabotron&lt;/span&gt;, wavefront, insideM300, skyetekM1, mica2&lt;br /&gt;&lt;br /&gt;The following device drivers will NOT be included:&lt;br /&gt;&lt;br /&gt; acoustics -- disabled by default; use --enable-acoustics to enable&lt;br /&gt; amcl -- couldn't find (at least one of) gsl/gsl_version.h&lt;br /&gt;artoolkitplus -- couldn't find required package artoolkitplus &gt;= 2.0.2&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Como vemos, en drivers instalados, aparecen los drivers de cameracompress y rabotron.&lt;br /&gt;&lt;br /&gt;El siguiente paso es ejecutar las ordenes:&lt;br /&gt;./make&lt;br /&gt;./make install&lt;br /&gt;&lt;br /&gt;Ya tenemos instalado Player!!. Ahora para ejecutarlo simplemente habrá que ejecutar:&lt;br /&gt;&lt;br /&gt;./player ficheroCfg.cfg&lt;br /&gt;&lt;br /&gt;Ahora CUIDADO, puede que nos de un error similar al siguiente al intentar arrancar player:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;player: error while loading shared libraries: libplayerdrivers.so.2: cannot open shared object file: No such file or directory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso hay que exportar el path:&lt;br /&gt;&lt;br /&gt;export LD_LIBRARY_PATH=/usr/local/lib&lt;br /&gt;&lt;br /&gt;Un consejo es que se ponga en el fichero  “.bashrc” para que cada vez que se habrá un terminal se ejecute automaticamente.&lt;br /&gt;&lt;br /&gt;Ya podemos ejecutar player en nuestro sistema:&lt;br /&gt;&lt;br /&gt;./player ficheroCFG.cfg&lt;br /&gt;&lt;br /&gt;* Part of the Player/Stage/Gazebo Project [http://playerstage.sourceforge.net].&lt;br /&gt;* Copyright (C) 2000 - 2006 Brian Gerkey, Richard Vaughan, Andrew Howard,&lt;br /&gt;* Nate Koenig, and contributors. Released under the GNU General Public License.&lt;br /&gt;* Player comes with ABSOLUTELY NO WARRANTY.  This is free software, and you&lt;br /&gt;* are welcome to redistribute it under certain conditions; see COPYING&lt;br /&gt;* for details.&lt;br /&gt;&lt;br /&gt;Listening on ports: 6665&lt;br /&gt;&lt;br /&gt;Ahora solo nos quedaría arrancar el proyecto y verlo rular...&lt;br /&gt;&lt;br /&gt;Adicionalmente recordar que subimos un post en el que indicábamos como grabar video de nuestro escritorio Linux con el programa “recordMyDesktop”:  &lt;a href="http://celtico-celtico.blogspot.com/2007/11/grabacin-de-vdeo-en-linux.html"&gt;http://celtico-celtico.blogspot.com/2007/11/grabacin-de-vdeo-en-linux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-7279517221353691945?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/7279517221353691945/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=7279517221353691945' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7279517221353691945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7279517221353691945'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/instalacin-del-proyecto-rabotron-paso.html' title='Instalación del proyecto Rabotron paso a paso'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lRjDQFtRjZg/R2qPAMrPChI/AAAAAAAAABo/bEcuTUCG0yM/s72-c/errorEclipse.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8679331378181884488</id><published>2007-12-14T12:38:00.000+01:00</published><updated>2007-12-14T13:11:08.147+01:00</updated><title type='text'>Camino hacia la integración</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;Voy a permitirme hacer una analogía entre nuestro proyecto y una situación de la vida real que podría ocurrir.&lt;br /&gt;&lt;br /&gt;Supongamos que existe una gran cordillera que separa dos países. Por intereses económicos y comerciales se quieren comunicar ambos países. Por lo que se decide hacerlo mediante un camino que atravesará con un túnel la gran cordillera.&lt;br /&gt;&lt;br /&gt;Para que los dos países tengan los mismos gastos y esfuerzos, se decide que el país A haga un túnel hacia el país B y viceversa. La intención no es crear dos túneles distintos, sino que más bien es encontrarse  los dos túneles a la mitad de la cordillera, formando así uno único.&lt;br /&gt;&lt;br /&gt;¿Que os parece?&lt;br /&gt;¿fácil?&lt;br /&gt;¿difícil?&lt;br /&gt;&lt;br /&gt;El que haya contestado debería de reflexionar sobre algunos aspectos clave que no han sido presentados. Por ejemplo, ¿de que países estamos hablando? No es lo mismo que se quieran comunicar dos países del tercer mundo con economías muy limitadas, que lo hagan dos superpotencias con sus ingenieros de caminos y sus excavadoras. ¿Y si hablamos de en que año situamos esto? Quizás hemos pensado en una época actual, pero si pensamos en cuando el cavernicola iba con un taparabos y una lanza para cazar... se nos viene a la cabeza la palabra utopía.&lt;br /&gt;&lt;br /&gt;Hablando meramente del proyecto. Los dos componentes hemos empezado por polos opuestos (cada uno a un lado de la cordillera). }TOR{ ha estado programando en JAVA peleándose con la visión y ha ido bajando de niveles tocando el servidor de player. Por otro lado, celtico ha ido desde lo más bajo hacia arriba, soldando la placa de motores, programando los microcontroladores y creando el driver que se integra en player.&lt;br /&gt;&lt;br /&gt;Ahora si que es el momento. Es el momento de la integración, si todo ha ido bien los túneles se encontrarán sin problemas, sino tendremos que ir buscando soluciones. Ahora hago la misma pregunta que antes sobre la integración de nuestro proyecto Rabotron....&lt;br /&gt;&lt;br /&gt;¿Que os parece?&lt;br /&gt;¿fácil?&lt;br /&gt;¿difícil?&lt;br /&gt;&lt;br /&gt;Pues la contestación es, como antes se ha explicado ... "depende". Tenemos que tener en cuenta que hablamos de tecnologías en constante desarrollo (player y javaclient), hablamos de hardware creado por estudiantes, de escasa información en la red.... Todo esto nos hace tener un cumulo de sensaciones de posibilidad de éxito en esta etapa o de fracaso.&lt;br /&gt;&lt;br /&gt;Nunca se sabe, es el momento. Vamos.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8679331378181884488?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8679331378181884488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8679331378181884488' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8679331378181884488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8679331378181884488'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/camino-hacia-la-integracin.html' title='Camino hacia la integración'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-7215457495446827881</id><published>2007-12-05T22:11:00.000+01:00</published><updated>2008-12-11T08:02:45.184+01:00</updated><title type='text'>Vista general de Rabotron</title><content type='html'>Como se puede observar ya hay gran cantidad de posts sobre el trabajo que se está realizando. Pero a veces no estoy seguro si la gente tiene claro la ubicación general del proyecto y más despues de hablar esta tarde con mi colega skool. Es por ello que quiero comentar brevemente la visión general del proyecto.&lt;br /&gt;&lt;br /&gt;Rabotron se compone basicamente de un portatil en el que va instalado un servidor llamado  PLAYER (en nuestro caso la version 2.1.0 compilada desde el cvs).  Hemos tenido que compilarla manualmente nosotros ya que necesitamos gestionar una placa de motores para el movimiento de rabotron.&lt;br /&gt;&lt;br /&gt;Es por ello que creamos un driver en lenguaje c , lo integramos en player y lo compilamos. No ocurre igual con la camara web (para la vision) ya que ya existe un driver creado v4l (video for linux) y es el que vamos a usar.&lt;br /&gt;&lt;br /&gt;El servidor lo manejará un cliente creado a partir de Javaclient 2.0 (programamos en java). Dicho cliente tambien va instalado en el mismo portatil y se comunica con player a traves del puerto 6665.&lt;br /&gt;&lt;br /&gt;Los perifericos usados es una camara web a traves de usb y una placa diseñada y creada integramente por nosotros encargada de gestionar el movimiento del robot. La placa es la que contiene el pic16f876 que programada en emsamblador se comunica por rs-232 con el driver  de player.&lt;br /&gt;&lt;br /&gt;Dicho esto, una secuencia logica de funcionamiento es: la camara web recibe una imagen y la envia de forma vertical (segun el dibujo de mas abajo) hasta javaclient2. Aqui la valoramos y decidimos el movimiento de rabotron segun las necesidades del entorno. El movimiento se le indica a player a traver del puerto 6665, gracias al driver creado se comunica con la placa por puerto serie y esta es la que lo trasforma en impulsos para las ruedas del robot.&lt;br /&gt;&lt;br /&gt;Espero que todo haya quedado un poco más claro. Os dejo un dibujo aclaratorio:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qXc7kTaGt-E/R1cVXaMXFTI/AAAAAAAAACk/y0_xKZ5eL5Y/s1600-h/vistageneral.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_qXc7kTaGt-E/R1cVXaMXFTI/AAAAAAAAACk/y0_xKZ5eL5Y/s320/vistageneral.jpg" alt="" id="BLOGGER_PHOTO_ID_5140600991579051314" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-7215457495446827881?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/7215457495446827881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=7215457495446827881' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7215457495446827881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/7215457495446827881'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/vista-general-de-rabotron.html' title='Vista general de Rabotron'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qXc7kTaGt-E/R1cVXaMXFTI/AAAAAAAAACk/y0_xKZ5eL5Y/s72-c/vistageneral.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-3213348898226925024</id><published>2007-12-05T01:34:00.000+01:00</published><updated>2008-12-11T08:02:45.606+01:00</updated><title type='text'>Aplicando filtro Equalize (¿mejorando?)</title><content type='html'>El filtro realiza una mejora sustancial de la imagen capturada bajo circunstancias pobres de luz ó exponiendo a la víctima de Rabotron a una luz que no sea blanca, mientras que si realizamos en filtro en campo abierto no es tanta la ganancia que podamos llegar a tener comparada con la pérdida de tiempo que tenemos al aplicar la función anterior. El tiempo dirá si realmente merece la pena que realizamos el filtro, para empezar lo que hemos hecho es optimizar un poco el código para que la función tarde menos en ejecutarse, el código actual tarda un tiempo (calculado mediante pruebas) aproximado del 30% al 40% menor al código inicial de la función equalize.&lt;br /&gt;&lt;br /&gt;El código en java del filtro de ecualizado optimizado es el siguiente:&lt;br /&gt;  public int [] filtroEqualizeTOR()&lt;br /&gt;  {&lt;br /&gt;      double max=255;&lt;br /&gt;      double[] binR= new double [tamano/3];&lt;br /&gt;      double[] binG= new double [tamano/3];&lt;br /&gt;      double[] binB= new double [tamano/3];&lt;br /&gt;      int [] binAux = new int [tamano];&lt;br /&gt;   &lt;br /&gt;      double maxiR=0,maxiG=0,maxiB=0;&lt;br /&gt;      double miniR=255,miniG=255,miniB=255;&lt;br /&gt;      int aux=1;&lt;br /&gt;   &lt;br /&gt;  //sacamos valor del pixel minimo y maximo para cada componente RGB&lt;br /&gt;      for (int k = 0; k &lt; tamano/3; k++) {             aux= k*3;             binR[k] = imageRGB[aux];             binG[k+1] = imageRGB[aux+1];             binB[k+2] = imageRGB[aux+2];         }         Arrays.sort(binR);         Arrays.sort(binG);         Arrays.sort(binB);                 maxiR=binR[(tamano/3)-1];         maxiG=binG[(tamano/3)-1];         maxiB=binB[(tamano/3)-1];         miniR=binR[0];         miniG=binG[0];         miniB=binB[0];          for (int k = 0; k &lt; tamano/3; k++) {         aux=k*3;                 binAux[aux]=(int)(((imageRGB[aux]-miniR)/(maxiR-miniR))* (double)max);     binAux[aux+1]=(int)(((imageRGB[aux+1]-miniG)/(maxiG-miniG))*(double)max);     binAux[aux+2]=(int)(((imageRGB[aux+2]-miniB)/(maxiB-miniB))*(double)max);         }         return binAux;     }  &lt;br /&gt;&lt;br /&gt;Al estar trabajando con imágenes de 320x240 no es excesivo el tiempo ganado, pero todo lo que podamos recortar es tiempo que ganamos a la hora de ejecutar la orden a Rabotron para que se mueva.  Para la demostración de este filtro voy a poner solamente un par imágenes de la ejecucion: En la parte superior de la ventana se ve la imagen captura sin aplicarle ningún tipo de filtro Mientras que en el canvas de abajo de la ventana se ve la misma imagen pero aplicándole el filtro de ecualización.  En esta primera imagen podemos ver como al mejorar filtrar la imagen también mejoramos el binarizado de la misma al buscar a nuestra víctima, en este caso el color a buscar es el de la mano.  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lRjDQFtRjZg/R17BB6wdnOI/AAAAAAAAABg/BkRwDOr3CMc/s1600-h/filtroEqualize.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_lRjDQFtRjZg/R17BB6wdnOI/AAAAAAAAABg/BkRwDOr3CMc/s320/filtroEqualize.png" alt="" id="BLOGGER_PHOTO_ID_5142760063200238818" border="0" /&gt;&lt;/a&gt;   &lt;p class="MsoNormal" style=""&gt;  &lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;- Imagen 1-&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En la segunda imagen ( Imagen 2 ) simplemente se ve la mejora realizada sobre el color de la imagen (Arriba sin aplicar filtro, Abajo tras aplicar el filtro), no mostramos el binariza:&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight: bold;" class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/R1XzrawdnLI/AAAAAAAAABM/1-2sfm6BtsQ/s1600-h/filtroEqualize2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/R1XzrawdnLI/AAAAAAAAABM/1-2sfm6BtsQ/s320/filtroEqualize2.png" alt="" id="BLOGGER_PHOTO_ID_5140282476955802802" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;-Imagen 2-&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:Monospace;font-size:10;color:black;"   lang="ES-TRAD" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-3213348898226925024?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/3213348898226925024/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=3213348898226925024' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3213348898226925024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3213348898226925024'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/aplicando-filtro-equalize-mejorando.html' title='Aplicando filtro Equalize (¿mejorando?)'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lRjDQFtRjZg/R17BB6wdnOI/AAAAAAAAABg/BkRwDOr3CMc/s72-c/filtroEqualize.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-4520043034367718843</id><published>2007-12-04T09:07:00.000+01:00</published><updated>2008-12-11T08:02:45.820+01:00</updated><title type='text'>cambio comunicacion puerto serie</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;He&lt;br /&gt;&lt;/script&gt;Hola a todos,&lt;br /&gt;&lt;br /&gt;He cambiado el protocolo de comunicación del puerto serie.  Lo he hecho mas que nada pensando en un mejor rendimiento de la comunicación. Antiguamente enviaba carácter a carácter desde el puerto serie del ordenado a la placa controladora de motores y el pic era el que daba confirmaciones de envío.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El esquema como recordatorio es algo así:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R1UN5KMXFRI/AAAAAAAAACU/dnhpN5nepV4/s1600-h/rs232.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/R1UN5KMXFRI/AAAAAAAAACU/dnhpN5nepV4/s320/rs232.gif" alt="" id="BLOGGER_PHOTO_ID_5140029825353192722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El cambio reside pues en la forma de envío. A partir de ahora no se hará de carácter a carácter, sino que se enviará una trama entera y es el pic el encargado de interpretarla, definiendo así nuestro propio protocolo.&lt;br /&gt;&lt;br /&gt;La trama enviada tiene tres limitadores. Primero una "d" indicando que se refiere al motor derecho, despues va un numero (negativo o positivo) de 0 hasta 127 que indica la potencia del motor derecho. Luego hay un limitador "i" indicando que se refiere al motor izquierdo, al igual que antes después aparece un numero  que indica la potencia de dicho motor. El ultimo carácter de la trama es el limitador "f", que indica que la trama ha finalizado.&lt;br /&gt;&lt;br /&gt;Un ejemplo de trama:&lt;br /&gt;&lt;br /&gt;&lt;table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 23.4pt;" valign="top" width="31"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style="color: rgb(51, 51, 255);font-family:Arial;font-size:36;"  &gt;d&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;2&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;5&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style="color: rgb(51, 51, 255);font-family:Arial;font-size:36;"  &gt;i&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;-&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;6&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;4&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style="color: rgb(51, 51, 255);font-family:Arial;font-size:36;"  &gt;f&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Por supuesto que la longitud de la trama es variable, ponemos la máxima dimensión y la mínima:&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 23.4pt;" valign="top" width="31"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;d&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;-&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;1&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;1&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;5&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;i&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;-&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;1&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;2&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;7&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;f&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr style=""&gt;   &lt;td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 23.4pt;" valign="top" width="31"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;d&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;5&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;i&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;7&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0cm 5.4pt; width: 18pt;color:windowtext windowtext windowtext -moz-use-text-color;" valign="top" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:36;"  &gt;f&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Por ultimo y si por si es de ayuda os posteo el código del pic para recibir las tramas, interpretarlas y crear los impulsos necesarios para el control de los motores:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;#include &lt;16f876a.h&gt;       // Definiciones del PIC 16F876A&lt;br /&gt;#include &lt;stdlib.h&gt;        // Para el atoi&lt;br /&gt;#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre&lt;br /&gt;#use delay(clock=4000000) // Oscilador a 4 Mhz&lt;br /&gt;#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CONSTANTES /////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;int const lenbuff=12; // Longitud de buffer--&gt; Ajustar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// VARIABLES EN RAM ///////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;int motder,motizq;&lt;br /&gt;int sentido, sentidoder, sentidoizq;&lt;br /&gt;int xbuff=0x00;      // Índice: siguiente char en cbuff&lt;br /&gt;char cbuff[lenbuff]; // Buffer&lt;br /&gt;char rcvchar=0x00;   // último carácter recibido&lt;br /&gt;int1 flagcommand=0;  // Flag para indicar comando disponible&lt;br /&gt;char arg[lenbuff];   // para pasar el negativo&lt;br /&gt;int cont=0;          // contador de recibidos&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Declaración de Funciones ///////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void inicializa(void);&lt;br /&gt;void inicbuff(void);        // Borra buffer&lt;br /&gt;int addcbuff(char c);       // añade carácter recibido al buffer&lt;br /&gt;void procesa_comando(void); // Procesa comando&lt;br /&gt;int aentero(void);          // Pasa el buffer a un entero&lt;br /&gt;int procesatrama(void);    // Procesa una trama recibida&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// INTERRUPCIONES /////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#int_rda&lt;br /&gt;&lt;br /&gt;void serial_isr() // Interrupción recepción serie USART&lt;br /&gt;{&lt;br /&gt;while ( cbuff[cont-1]!='f' ) // entramos al bucle while&lt;br /&gt;{&lt;br /&gt;if ( kbhit () )&lt;br /&gt;  {&lt;br /&gt;  cbuff[cont]=getc(); // en la variable keypress se guardan los caracteres&lt;br /&gt;  cont++;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;printf("Recibo: %s ",cbuff);&lt;br /&gt;cont=0;&lt;br /&gt;flagcommand=1;    // Comando en Main&lt;br /&gt;procesatrama();   //procesa la trama&lt;br /&gt;inicbuff();       // Borra buffer&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Desarrollo de Funciones ////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void inicializa()&lt;br /&gt;{&lt;br /&gt;motder=motizq=0;&lt;br /&gt;sentido=sentidoder=sentidoizq=0;&lt;br /&gt;xbuff=0x00;      // Índice: siguiente char en cbuff&lt;br /&gt;inicbuff();       //char cbuff[lenbuff]; // Buffer&lt;br /&gt;rcvchar=0x00;   // último carácter recibido&lt;br /&gt;flagcommand=0;  // Flag para indicar comando disponible&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void inicbuff(void) // Inicia a \0 cbuff -------------------&lt;br /&gt;{&lt;br /&gt;int i;&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;lenbuff;i++){ bucle="" que="" pone="" a="" 0="" todos="" los="" caracteres="" en="" buffer="" xbuff="0x00;" inicializo="" el="" ndice="" de="" siguiente="" cter="" contador="0;" int="" retorno="0;" return=""&gt; Recibo d: %c ",cbuff[contador]);&lt;br /&gt;&lt;br /&gt;contador++; //1&lt;br /&gt;&lt;br /&gt;if(cbuff[contador]=='-')&lt;br /&gt;{&lt;br /&gt;sentidoder=0;&lt;br /&gt;contador++;&lt;br /&gt;printf("PT--&gt; Recibo negativo der");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;sentidoder=1;&lt;br /&gt;&lt;br /&gt;i=0;&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;{                               // Extraemos argumento D del buffer&lt;br /&gt;arg[i]=cbuff[contador];&lt;br /&gt;i++;&lt;br /&gt;printf("PT--&gt; Recibo num der: %c ",cbuff[contador]);&lt;br /&gt;}while(cbuff[++contador ]!='i');         // hasta que llegue I&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;motder=atoi(arg); //valor motor derecha&lt;br /&gt;&lt;br /&gt;printf("PT--&gt; Mot der: %d ",motder);&lt;br /&gt;&lt;br /&gt;//inicbuff(); //iniciamos el buffer de arg&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;lenbuff;i++) bucle="" que="" pone="" a="" 0="" todos="" los="" arg="" no="" hace="" falta="" return=""&gt; Recibo i: %c ",cbuff[contador]);&lt;br /&gt;&lt;br /&gt;contador++; //en izq&lt;br /&gt;&lt;br /&gt;if(cbuff[contador]=='-')&lt;br /&gt;{&lt;br /&gt;printf("PT--&gt; Recibo negativo izq");&lt;br /&gt;sentidoizq=0;&lt;br /&gt;contador++;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;sentidoizq=1;&lt;br /&gt;&lt;br /&gt;i=0;&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;{                               // Extraemos argumento D del buffer&lt;br /&gt;arg[i]=cbuff[contador];&lt;br /&gt;i++;&lt;br /&gt;printf("PT--&gt; Recibo num izq: %c ",cbuff[contador]);&lt;br /&gt;contador++;&lt;br /&gt;}while(cbuff[contador]!='f' &amp;amp;&amp;amp; cbuff[contador]!=0x00);         // hasta que llegue F&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;motizq=atoi(arg); //valor motor derecha&lt;br /&gt;&lt;br /&gt;printf("PT--&gt; Mot izq: %d ",motizq);&lt;br /&gt;&lt;br /&gt;retorno = 1;&lt;br /&gt;return retorno;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Programa Principal /////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;setup_ccp1(CCP_PWM); //ccp1 modo PWM&lt;br /&gt;setup_ccp2(CCP_PWM); //ccp2 modo PWM&lt;br /&gt;&lt;br /&gt;setup_timer_2(T2_DIV_BY_16, 127, 1); // 488Hz (con XT=4MHz) esta frecuencia la podes variar cambiando los valores, fijate en el datasheet del micro que uses, que vienen las relaciones para calcular lo inherente a la frecuencia y al duty.&lt;br /&gt;inicbuff(); // Borra buffer al inicio&lt;br /&gt;&lt;br /&gt;printf("Soy el Pic y estoy activo\n");&lt;br /&gt;enable_interrupts(int_rda); // Habilita Interrupción RDA&lt;br /&gt;enable_interrupts(global);  // Habilita interrupciones&lt;br /&gt;&lt;br /&gt;do {&lt;br /&gt;&lt;br /&gt;if(flagcommand) procesa_comando(); // Si hay comando pendiente&lt;br /&gt;                                   // de procesar ... lo procesa.&lt;br /&gt;&lt;br /&gt;} while (TRUE);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Procesador de Comandos /////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void procesa_comando(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;flagcommand=0; // Desactivo flag de comando pendiente.&lt;br /&gt;&lt;br /&gt;printf ("procesa comando: %d\n",motder);&lt;br /&gt;printf ("procesa comando: %d\n",motizq);&lt;br /&gt;&lt;br /&gt;if(sentidoder!=0)&lt;br /&gt;    {&lt;br /&gt;  printf ("Enciende DER\n");&lt;br /&gt;    output_high(PIN_C3);&lt;br /&gt;    }&lt;br /&gt;else&lt;br /&gt;    {&lt;br /&gt;  printf ("Apaga DER\n");&lt;br /&gt;    output_low(PIN_C3);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;set_pwm1_duty(motder); // Se cambia el ancho con el valor obtenido en canal 0.&lt;br /&gt;&lt;br /&gt;if(sentidoizq!=0)&lt;br /&gt;    {&lt;br /&gt;  printf ("Enciende IZQ\n");&lt;br /&gt;    output_high(PIN_C4);&lt;br /&gt;            output_high(PIN_C5);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;    {&lt;br /&gt;  printf ("Apaga IZQ\n");&lt;br /&gt;    output_low(PIN_C4);&lt;br /&gt;output_low(PIN_C5);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;set_pwm2_duty(motizq); // Se cambia el ancho con el valor obtenido en canal 0.&lt;br /&gt;&lt;br /&gt;  inicializa(); // Borra buffer&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/Usuario/CONFIG%7E1/Temp/moz-screenshot-2.jpg" alt="" /&gt;&lt;img src="file:///C:/DOCUME%7E1/Usuario/CONFIG%7E1/Temp/moz-screenshot-3.jpg" alt="" /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;/lenbuff;i++)&gt;&lt;/lenbuff;i++){&gt;&lt;/stdlib.h&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-4520043034367718843?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/4520043034367718843/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=4520043034367718843' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4520043034367718843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4520043034367718843'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/12/cambio-comunicacion-puerto-serie.html' title='cambio comunicacion puerto serie'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qXc7kTaGt-E/R1UN5KMXFRI/AAAAAAAAACU/dnhpN5nepV4/s72-c/rs232.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8281141294870217356</id><published>2007-11-27T09:18:00.000+01:00</published><updated>2007-11-27T09:39:30.672+01:00</updated><title type='text'>Off-topic: Ingenieros Informaticos</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;Hoho&lt;br /&gt;&lt;/script&gt;Lo mal que está hoy en día el trabajo de ingeniero en informático no es ningún descubrimiento.&lt;br /&gt;&lt;br /&gt;Buscando por el youtube he encontrado 1 vídeo ( referenciado por la profesora de BDA) que creo que puede ser bastante interesante a la vez que divertido.&lt;br /&gt;&lt;br /&gt;Es triste que nos tengamos que reír de algo que nos afecta directamente y que además no tiene ninguna pinta de cambiar. Pero bueno, a mal tiempo buena cara.&lt;br /&gt;&lt;br /&gt;Os dejo aquí el enlace al vídeo a ver si os gusta. Por desgracia lo que dice de forma sarcástica es realidad:&lt;br /&gt;&lt;br /&gt;http://es.youtube.com/watch?v=mdP7noUwbR4&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8281141294870217356?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8281141294870217356/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8281141294870217356' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8281141294870217356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8281141294870217356'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/off-topic-ingenieros-informaticos.html' title='Off-topic: Ingenieros Informaticos'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-6675811930918250545</id><published>2007-11-25T18:53:00.000+01:00</published><updated>2008-12-11T08:02:46.475+01:00</updated><title type='text'>Fotos placa gestion motores</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;Hola a todos&lt;br /&gt;&lt;br /&gt;Como os dije he tenido un poco de tiempo para hacer unas fotos a la placa que gestionará los motores del nuestro robot rabotron. Como podemos ver en la primera imagen tenemos una bateria de 12 v voltios de entrada, aunque es regulada a 5 voltios por el 7805. Tambien podemos ver como a nuestra placa le hemos conectado una placa de pruebas de esas blancas donde hemos conectado leds y resistencias para poder ver a ojo el funcionamiento de la placa (indica direccion y fuerza de cada uno de los motores):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qXc7kTaGt-E/R0m66gjI49I/AAAAAAAAAB8/jl7nDL3qBuQ/s1600-h/P1010011.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_qXc7kTaGt-E/R0m66gjI49I/AAAAAAAAAB8/jl7nDL3qBuQ/s320/P1010011.JPG" alt="" id="BLOGGER_PHOTO_ID_5136842364325258194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En esta foto podemos ver con más detalle  los elementos que hay soldados en nuestra placa. Basicamente están todos menos el puente en H (l293) que lo soldaremos mas adelante, ya que aun no es de vital importancia:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/R0m7DwjI4-I/AAAAAAAAACE/OzT6BoIq4zA/s1600-h/placa+copia.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/R0m7DwjI4-I/AAAAAAAAACE/OzT6BoIq4zA/s320/placa+copia.jpg" alt="" id="BLOGGER_PHOTO_ID_5136842523239048162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En la siguiente imagen podemos ver las soldadoras por la cara de atrás de la placa ( es un poco rustico):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/R0m7QAjI4_I/AAAAAAAAACM/yx7h-9OBAOA/s1600-h/Por+detras.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/R0m7QAjI4_I/AAAAAAAAACM/yx7h-9OBAOA/s320/Por+detras.jpg" alt="" id="BLOGGER_PHOTO_ID_5136842733692445682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por ahora la placa se va a quedar así y voy a ponerme a programar un driver para linux y player/stage que gestione dicha placa, y esta placa que gestione los motores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-6675811930918250545?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/6675811930918250545/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=6675811930918250545' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6675811930918250545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6675811930918250545'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/fotos-placa-gestion-motores.html' title='Fotos placa gestion motores'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qXc7kTaGt-E/R0m66gjI49I/AAAAAAAAAB8/jl7nDL3qBuQ/s72-c/P1010011.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-5834809074058012452</id><published>2007-11-22T21:10:00.000+01:00</published><updated>2008-12-11T08:02:46.740+01:00</updated><title type='text'>Primeras pruebas de visión</title><content type='html'>Una vez decido el formato de color elegido para la identificación de nuestra víctima, hemos de empezar con las primeras pruebas sobre el reconocimiento del objetivo a seguir. Para lo cual ya explicamos en un post anterior que usaríamos el modelo de color HSV (Hue, Saturatión, Value) también conocido como HSB debido a la mayor efectividad que obteníamos analizando colores en comparación con el formato de imagen RGB.&lt;br /&gt;&lt;br /&gt;Para una correcta muestra del funcionamiento de nuestra captura de imagen, hemos decidido crear una ventana en la cual mostramos:&lt;br /&gt;-La imagen original en el modelo de color RGB que está recibiendo nuestra cámara&lt;br /&gt;-Una imagen binarizada que representa los puntos que realmente nos interesan de la imagen que estamos capturando.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lRjDQFtRjZg/R0XjBNXTB9I/AAAAAAAAAA8/C2rvfYA_AWY/s1600-h/muestra.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 409px; height: 254px;" src="http://3.bp.blogspot.com/_lRjDQFtRjZg/R0XjBNXTB9I/AAAAAAAAAA8/C2rvfYA_AWY/s320/muestra.png" alt="" id="BLOGGER_PHOTO_ID_5135760559992670162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Actualmente para calcular la imagen binarizada aplicamos un filtro del color que queremos buscar sobre la imagen original en formato HSB, analizando el matriz, la saturación y el brillo de cada píxel de la imagen.&lt;br /&gt;&lt;br /&gt;El color que nuestro robot debe localizar lo calculamos a partir de una imagen de la víctima, a través de la cual obtenemos el perfil de matiz, saturación y brillo de nuestra víctima para poder realizar el posterior seguimiento.&lt;br /&gt;&lt;br /&gt;Como demostración subiremos un primer vídeo del reconocimiento de una persona basándonos únicamente en el color de la ropa de la misma, para que vayamos haciendo nos una idea del objetivo que vamos persiguiendo en la zona de visión.&lt;br /&gt;&lt;br /&gt;Como se puede apreciar hay ruido en la imagen y algunas zonas no reconocidas por problemas de sobras por el ángulo de incisión de la luz sobre la ropa y las arrugas de la misma.&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/E_UlAFBcb-I&amp;amp;rel=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/E_UlAFBcb-I&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-5834809074058012452?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/5834809074058012452/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=5834809074058012452' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5834809074058012452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5834809074058012452'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/primeras-pruebas-de-visin.html' title='Primeras pruebas de visión'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lRjDQFtRjZg/R0XjBNXTB9I/AAAAAAAAAA8/C2rvfYA_AWY/s72-c/muestra.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-4333395582527518590</id><published>2007-11-22T00:51:00.000+01:00</published><updated>2007-11-22T14:39:57.922+01:00</updated><title type='text'>Grabación de Vídeo en Linux</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;                 &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm; font-style: normal; text-decoration: none;" align="justify"&gt; &lt;span style="font-size:100%;"&gt;Para poder mostrar al publico externo a la Universidad de Alicante como actúa la visión del robot Rabotron, que mejor manera de realizar algún vídeo con el resultado de alguna de las pruebas que estamos realizando.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal; text-decoration: none;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Para la captura de vídeo bajo linux de nuestro escritorio de trabajo hemos decidido utilizar el programa “&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://recordmydesktop.iovar.org/"&gt;recordMyDesktop&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;”.  El software se puede adquirir desde su página web o mediante los repositorios de Debian / Ubuntu. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;En nuestro caso hemos optado por la segunda opción:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;apt-get install recordmydesktop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Como el software dispone de una versión gráfica y cómoda de usar hemos decido también instalarla&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;apt-get insta gtk-recordmydesktop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Más rápidamente podemos realizar la instalación conjunta &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;apt-get install recordmydeskto gtk-recordmydesktop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Una vez realizada la instalación tenemos un acceso directo al software de grabación en: Aplicaciones / Sonido y Vídeo / gtk-recordMyDesktop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Mediante el uso de la versión gráfica podemos seleccionar una sola ventana o la parte del escritorio sobre la que queremos realizar la grabación, así mismo también podemos modificar la calidad de sonido y audio de nuestro vídeo, el uso es realmente sencillo.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Nota: El vídeo grabado por defecto por el software recordmydesktop es en formato OGG.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Como transformar los video OGG a formato AVI:&lt;br /&gt;&lt;br /&gt;Estamos teniendo bastante problemas al subir vídeo en formato OGG a youtube, por lo que hemos decido pasarlo al formato AVI antes de subirlos.&lt;br /&gt;&lt;br /&gt;Para covertir video en formato OGG al formato AVI usaremos en nuestro caso el software &lt;a href="http://es.wikipedia.org/wiki/MEncoder"&gt;MEncoder&lt;/a&gt;, el cual se instala al instalar el &lt;a href="http://www.mplayerhq.hu/"&gt;Mplayer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Antes de instalar Mplayer debemos instalar primero el encoder de vídeo mp3 &lt;a href="http://lame.sourceforge.net/index.php"&gt;Lame&lt;/a&gt;, sino no será posible realizar la conversión de videos con Mplayer, muy importante instalar primero los codecs, sino no compilaremos el Mplayer sin la librería libmp3lame y nos dará un error al realizar la transformación del vídeo.&lt;br /&gt;&lt;br /&gt;Para instalar Lame debemos seguir las siguientes pautas: (descargamos la versión 3.97)&lt;br /&gt;&lt;br /&gt;# wget http://ufpr.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz&lt;br /&gt;# gunzip -c lame-3.97.tar.gz | tar xvf -&lt;br /&gt;# cd lame-3.97/&lt;br /&gt;# ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;&lt;br /&gt;Ahora llega el momento de instalar el Mplayer, en nuestro caso hemos descargado de la web oficial de Mplayer la versión Mplayer-1.0rc1, la instalación es bastante sencilla:&lt;br /&gt;&lt;br /&gt;# tar xvjf MPlayer-1.0rc1.tar.bz2&lt;br /&gt;# cd Mplayer-1.0rc1/&lt;br /&gt;# ./configure&lt;br /&gt;# ./make&lt;br /&gt;# ./make install&lt;br /&gt;&lt;br /&gt;Una vez instalado todo simplemente tenemos que ejecutar la orden para convertir nuestro vídeo en OGG a AVI:&lt;br /&gt;&lt;br /&gt;# mencoder video_entrada.ogg -ovc lavc -oac mp3lame -o video_salida.avi&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;     &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-4333395582527518590?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/4333395582527518590/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=4333395582527518590' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4333395582527518590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/4333395582527518590'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/grabacin-de-vdeo-en-linux.html' title='Grabación de Vídeo en Linux'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8591761685856016280</id><published>2007-11-20T13:14:00.000+01:00</published><updated>2007-11-20T14:38:34.103+01:00</updated><title type='text'>Programa de control del puerto serie / motores</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;YYhasdfasdf&lt;br /&gt;&lt;/script&gt;Ya tengo la placa que gestiona los motores soldada. Todo menos el puente en H (L293), con lo que por ahora tengo las salidas del microcontrolador (pic 16f876) enganchadas a unos leds, con resistencias de 220 ya que la salida es de 5v. Con esto consigo ver  el funcionamiento del pic y el pueroto serie de una forma gráfica.&lt;br /&gt;&lt;br /&gt;En cuanto pueda subiré unas fotos de como va la placa que gestiona los motores y si me da tiempo algun video. Por ahora os voy a comentar el programa en c que he creado en el PICC para recibir datos desde el puerto serie (rs232) y transformarlo en señales para los motores.&lt;br /&gt;&lt;br /&gt;Lo primero que queria comentar es que el codigo me he basado en uno que hay hecho por Internet. Y he ido modificando cosas para poder aplicarlo a mi caso (que ha sido bastantes modificaciones).&lt;br /&gt;&lt;br /&gt;Basicamente hay una funcion principal  que activa los dos pwm(RC1 y RC2):&lt;br /&gt;&lt;br /&gt;setup_ccp1(CCP_PWM); //ccp1 modo PWM&lt;br /&gt;setup_ccp2(CCP_PWM); //ccp2 modo PWM&lt;br /&gt;&lt;br /&gt;Inicializamos el TIMER2 y activamos dos interrupciones, las interrupciones globales y la de RDA que es cuando recibe datos por el puerto serie.&lt;br /&gt;&lt;br /&gt;Despues el programa se queda en un bucle infinito esperando que hayan datos que procesar.&lt;br /&gt;&lt;br /&gt;La interrupcion de rda (serial_isr();) se activa cuando llega algo por el puerto serie, conforme va recibiendo datos los va acumulando en un buffer para despues procesarlos.&lt;br /&gt;&lt;br /&gt;Por funciones tenemos:&lt;br /&gt;&lt;br /&gt;Inicializa --&gt; que inicializa todas las variables globales de nuestro programa.&lt;br /&gt;&lt;br /&gt;inicbuffer --&gt; inicializa el buffer de caracteres leidos y lo pone todo a 0x00. Indispensable limpiarlo despues de usarlo, ya que se puede quedar basura que haga un funcionamiento anomalo.&lt;br /&gt;&lt;br /&gt;addcbuffer --&gt; Va añadiendo caracteres al buffer, en el caso de que un caracter sea un intro (0x0D) o un espacio (0x20) se corta la ejecucion para procesar los comandos.&lt;br /&gt;&lt;br /&gt;aentero --&gt; Convierte la cifra obtenida en caracteres a numero entero, aqui tambien vemos si el valor es negativo, en dicho caso el motor irá en sentido contrario.&lt;br /&gt;&lt;br /&gt;procesa_comando --&gt; Una vez que se han introducido los comandos esta funcion es la encargada de sacar los valores (iluminar leds) correspondientes que más adelante moverán los motores.&lt;br /&gt;&lt;br /&gt;La forma de usar el programa es pasando valores por el puerto serie de la siguiente forma:&lt;br /&gt;valor1 (espacio) valor2 (intro)&lt;br /&gt;&lt;br /&gt;Por ejemplo para mover los motores hacia adelante de una forma continua podria ser:&lt;br /&gt;50 50&lt;br /&gt;&lt;br /&gt;Para mover un motor hacia adelante despacio y otro hacia atras muy rapido sería:&lt;br /&gt;8 -100&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuacion os pego el codigo entero del pic:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;#include &lt;16f876a.h&gt;       // Definiciones del PIC 16F876A&lt;stdlib.h&gt;&lt;stdlib.h&gt;&lt;stdlib.h&gt;&lt;br /&gt;#include &lt;&lt;/stdlib.h&gt;&lt;/stdlib.h&gt;&lt;/stdlib.h&gt;stdlib&lt;stdlib.h&gt;&lt;stdlib.h&gt;&lt;stdlib.h&gt;&gt; //stdlib.h para el atoi&lt;br /&gt;#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre&lt;br /&gt;#use delay(clock=4000000) // Oscilador a 4 Mhz&lt;br /&gt;#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CONSTANTES /////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;int const lenbuff=5; // Longitud de buffer, Ajustar&lt;br /&gt;             // a lo que desees (o te sea posible)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// VARIABLES EN RAM ///////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;int motder,motizq;&lt;br /&gt;int sentido, sentidoder, sentidoizq;&lt;br /&gt;int xbuff=0x00;      // Índice: siguiente char en cbuff&lt;br /&gt;char cbuff[lenbuff]; // Buffer&lt;br /&gt;char rcvchar=0x00;   // último carácter recibido&lt;br /&gt;int1 flagcommand=0;  // Flag para indicar comando disponible&lt;br /&gt;char arg[lenbuff];   // para pasar el negativo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Declaración de Funciones ///////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void inicializa(void);&lt;br /&gt;void inicbuff(void);        // Borra buffer&lt;br /&gt;int addcbuff(char c);       // añade carácter recibido al buffer&lt;br /&gt;void procesa_comando(void); // Procesa comando&lt;br /&gt;int aentero(void);          // Pasa el buffer a un entero&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// INTERRUPCIONES /////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;#int_rda&lt;br /&gt;void serial_isr() {    // Interrupción recepción serie USART&lt;br /&gt;&lt;br /&gt;rcvchar=0x00;        // Inicializo carácter recibido&lt;br /&gt;if(kbhit())&lt;br /&gt;{         // Si hay algo pendiente de recibir ...&lt;br /&gt;rcvchar=getc();    // lo descargo y ...&lt;br /&gt;addcbuff(rcvchar); // lo añado al buffer y ...&lt;br /&gt;printf("Recibo: %c ",rcvchar);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Desarrollo de Funciones ////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void inicializa()&lt;br /&gt;{&lt;br /&gt;motder=motizq=0;&lt;br /&gt;sentido=sentidoder=sentidoizq=0;&lt;br /&gt;xbuff=0x00;      // Índice: siguiente char en cbuff&lt;br /&gt;inicbuff();       //char cbuff[lenbuff]; // Buffer&lt;br /&gt;rcvchar=0x00;   // último carácter recibido&lt;br /&gt;flagcommand=0;  // Flag para indicar comando disponible&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void inicbuff(void) // Inicia a \0 cbuff -------------------&lt;br /&gt;{&lt;br /&gt;int i;&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;lenbuff;i++){ bucle="" que="" pone="" 0="" todos="" los="" caracteres="" en="" buffer="" xbuff="0x00;" inicializo="" el="" ndice="" de="" siguiente="" cter="" int="" char="" ade="" a="" cbuff="" case="" enter=""&gt; Habilita Flag para procesar&lt;br /&gt;flagcommand=1;     // Comando en Main&lt;br /&gt;motizq=aentero();  // Paso a entero&lt;br /&gt;sentidoizq=sentido;// Cambio sentido&lt;br /&gt;inicbuff(); // Borra buffer&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;case 0x20:           // Espacio&lt;br /&gt;motder=aentero();  // Paso a entero&lt;br /&gt;sentidoder=sentido;// Cambio sentido&lt;br /&gt;inicbuff(); // Borra buffer&lt;br /&gt;break;&lt;br /&gt;&lt;br /&gt;default:&lt;br /&gt;cbuff[xbuff++]=c; // Añade carácter recibido al Buffer&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int aentero () //pasa el buffer a un entero&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;int retorno,i;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(cbuff[0]=='-')&lt;br /&gt;{&lt;br /&gt;sentido=0;&lt;br /&gt;&lt;br /&gt;i=1;&lt;br /&gt;&lt;br /&gt;do{                               // Extraemos argumento del buffer&lt;br /&gt;arg[i-1]=cbuff[i];             // copiamos a arg sin el '-'&lt;br /&gt;}while(cbuff[++i ]!=0x00);&lt;br /&gt;&lt;br /&gt;retorno=atoi(arg);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;sentido=1;&lt;br /&gt;retorno=atoi(cbuff);&lt;br /&gt;}&lt;br /&gt;printf("A entero: %d\n",retorno);&lt;br /&gt;&lt;br /&gt;return retorno;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Programa Principal /////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;setup_ccp1(CCP_PWM); //ccp1 modo PWM&lt;br /&gt;setup_ccp2(CCP_PWM); //ccp2 modo PWM&lt;br /&gt;&lt;br /&gt;setup_timer_2(T2_DIV_BY_16, 127, 1); // 488Hz (con XT=4MHz) esta frecuencia la podes variar cambiando los valores, fijate en el datasheet del micro que uses, que vienen las relaciones para calcular lo inherente a la frecuencia y al duty.&lt;br /&gt;inicbuff(); // Borra buffer al inicio&lt;br /&gt;&lt;br /&gt;printf("Soy el Pic y estoy activo\n");&lt;br /&gt;enable_interrupts(int_rda); // Habilita Interrupción RDA&lt;br /&gt;enable_interrupts(global);  // Habilita interrupciones&lt;br /&gt;&lt;br /&gt;do {&lt;br /&gt;&lt;br /&gt;if(flagcommand) procesa_comando(); // Si hay comando pendiente&lt;br /&gt;                              // de procesar ... lo procesa.&lt;br /&gt;&lt;br /&gt;} while (TRUE);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Procesador de Comandos /////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;void procesa_comando(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;flagcommand=0; // Desactivo flag de comando pendiente.&lt;br /&gt;&lt;br /&gt;printf ("procesa comando: %d\n",motder);&lt;br /&gt;printf ("procesa comando: %d\n",motizq);&lt;br /&gt;&lt;br /&gt;if(sentidoder!=0)&lt;br /&gt;{&lt;br /&gt;printf ("Enciende DER\n");&lt;br /&gt;output_high(PIN_C3);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;printf ("Apaga DER\n");&lt;br /&gt;output_low(PIN_C3);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set_pwm1_duty(motder); // Se cambia el ancho con el valor obtenido en canal 0.&lt;br /&gt;&lt;br /&gt;if(sentidoizq!=0)&lt;br /&gt;{&lt;br /&gt;printf ("Enciende IZQ\n");&lt;br /&gt;output_high(PIN_C4);&lt;br /&gt;       output_high(PIN_C5);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;printf ("Apaga IZQ\n");&lt;br /&gt;output_low(PIN_C4);&lt;br /&gt;output_low(PIN_C5);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set_pwm2_duty(motizq); // Se cambia el ancho con el valor obtenido en canal 0.&lt;br /&gt;&lt;br /&gt;inicializa(); // Borra buffer&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------------&lt;br /&gt;&lt;br /&gt;Espero que os sea de ayuda.&lt;br /&gt;UN SALUDO&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;/lenbuff;i++){&gt;&lt;/stdlib.h&gt;&lt;/stdlib.h&gt;&lt;/stdlib.h&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8591761685856016280?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8591761685856016280/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8591761685856016280' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8591761685856016280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8591761685856016280'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/programa-de-control-del-puerto-serie.html' title='Programa de control del puerto serie / motores'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-6513168307705831437</id><published>2007-11-08T08:45:00.000+01:00</published><updated>2007-11-08T10:11:37.649+01:00</updated><title type='text'>Ya va el puerto serie</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;P&lt;br /&gt;&lt;/script&gt;Por fin puedo escribir para dar buenas noticias. Como recordáis os comenté que tenia problemas porque aparentemente la placa con la gestión de los motores debería de funcionar perfectamente y no lo hacía. Pues bien después de mucho esfuerzo, sudores y tres intentos de suicidio he conseguido que funcionara.&lt;br /&gt;&lt;br /&gt;Voy a explicar los problemas que localicé. La primera lección chicos para el éxito del proyecto es la siguiente premisa: "No meteré 12 voltios donde van 5". Sí, como oís, al meter mas voltaje me cargué varios componentes de la placa (¿varios? queria decir casi todos). Como ya comenté la otra vez comprar componentes en Alicante es como buscar un balneario en Somalia. El PIC 16F876 fui a comprarlo a una tienda que lo ofertan en el catalogo en inet y recibieron con un: ¿que quieres piratear? Yo flipando. Es como si vas a la ferreteria a comprar un cuchillo y te preguntan ¿A quien vas a matar? Bueno en fin.... Despues de patearme toda alicante he encontrado un sitio donde si que lo tenian, y les he comprado todos los que le quedaban, o sea 5.&lt;br /&gt;&lt;br /&gt;Una vez resuelta la papeleta de los componentes, resulta que tenia retorno las pistas de enviar y recibir, Rx Tx. Despues de comerme muchos dias la cabeza resulta que comprendí que la pasta de soldadura es conductora. Toda mi desesperacion se fué en cuanto limpié  toda la pasta.&lt;br /&gt;&lt;br /&gt;Conclusiones: tengo la placa funcionando a la perfeccion. Al final resulté ser una chorrada. Pero una chorrada que me ha llevado bastante tiempo. Espero poder quedar con mi "jefe de proyecto" para enseñarle los resultados.&lt;br /&gt;&lt;br /&gt;El siguiente paso será programar el driver.&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-2913113-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-6513168307705831437?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/6513168307705831437/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=6513168307705831437' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6513168307705831437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6513168307705831437'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/11/ya-va-el-puerto-serie.html' title='Ya va el puerto serie'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-3645807000071234622</id><published>2007-10-31T08:35:00.000+01:00</published><updated>2007-10-31T09:39:51.139+01:00</updated><title type='text'>Problemas con el proyecto</title><content type='html'>Como habéis podido comprobar llevo un tiempo sin escribir nada. Puede parecer que haya desertado el proyecto como un cobarde, jejej. No es el caso, por lo menos por el momento. Pero si que he sufrido una serie de contratiempos.&lt;br /&gt;&lt;br /&gt;Os comento que llevo soldado de la placa que controlará los motores, el conector rs-232, el max232 (cambio de niveles) y el pic16f876. He estado programando algunas rutinas para comprobar que la trasmisión serie funciona. En estas rutinas he conseguido que el pic mande datos al PC y viceversa.&lt;br /&gt;Aunque no se que pasa que a veces pierdo datos, no se si es por el oscilador o por algo.&lt;br /&gt;&lt;br /&gt;También comentaros que he pasado de programar en ensamblador a hacerlo en C. He encontrado una herramienta llamada PICC que es un compilador de C para los PIC. Creo que este paso puede acortarme las tareas de programación, como así ha sido.&lt;br /&gt;&lt;br /&gt;Bueno paso a comentar los contratiempos. El problema que tengo es que antes de soldar toda la movida lo tenia en dos placas distintas (placas experimentales de esas blancas que no hace falta soldar) y muy tonto de mi cuando fui a conectar la alimentación le metí 12V donde iban 5V. El efecto fue casi inmediato ya olia a quemado y salió una pequeña nube de humo. A pesar de los signos evidentes de "petada" el chip seguia funcionando, pero era solo un espejismo, porque cuando fui a grabarlo de nuevo comprobé que habia muerto.&lt;br /&gt;&lt;br /&gt;Como vivo en alicante y esto es lo mas parecido al tercer mundo hablando tecnológicamente pues me ha costado dios y ayuda encontrar un PIC16f876. Vamos que estaba rellenedo un pedido a una tienda de valencia cuando por fin encontré una en Alicante de la cual no me da la gana poner su nombre y darle publicidad.&lt;br /&gt;&lt;br /&gt;El tema es que ayer por fin pude probar las rutinas para el puerto serie y parece que medio funcionaban, solo medio porque aun me hacen extraños, pero como la alimentación la tengo con dos cables en un movimiento me saltó una chispa y creo que creé un cortocircuito, por lo que ahora no va nada. ¿es posible que sea el 7805? lo que tengo claro es que el 16f876 no es ya que he comprobado que funcione y grabe y todas esas movidas.&lt;br /&gt;&lt;br /&gt;El resumen es que por unas cosas o otras no estoy consiguiendo avanzar al ritmo que tenia previsto y el que seria idóneo para la finalización de la practica. Es posible que empiece a mirar alguna placa hecha para gestion de motores y sobretodo los precios, aunque me congratularia mucho mas poder terminarla yo con mis propias manos. A ver si alguien se anima y me escribe algun consejo o algun animo, porque hoy estoy encendidisimo jejejej.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-3645807000071234622?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/3645807000071234622/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=3645807000071234622' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3645807000071234622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/3645807000071234622'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/problemas-con-el-proyecto.html' title='Problemas con el proyecto'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8460815754602939603</id><published>2007-10-18T08:49:00.000+02:00</published><updated>2008-12-11T08:02:47.771+01:00</updated><title type='text'>Diagrama electronico drivers motores (II)</title><content type='html'>He tenido que rectificar el diagrama electrónico del driver de motores de nuestro robot. En el anterior están mal enganchadas las patillas de comunicación del pic con el puerto serie. Anteriormente su colocación ha sido arbitraria  y después me he dado cuenta que tienen que enchufarse obligatoriamente a los pines RC6 para el Tx y RC7 para el Rx.&lt;br /&gt;&lt;br /&gt;El problema reside en que el puerto C ya lo tenia ocupado con el control de los motores, ya que los pines de PWM también están en dicho puerto. Por lo que no me cabe las dos cosas en el mismo puerto.&lt;br /&gt;&lt;br /&gt;Para cada motor gestionado por el L293 van dos señales que le indican la dirección que debe de tomar (positivo y negativo) o (negativo y positivo), pero nunca (negativo y negativo)  o (positivo y positivo) ya que el motor no se moveria. Como una señal es siempre la contraria que la otra podemos insertar un negador que nos lo haga automáticamente. El negador es el 7404 como se muestra en la imagen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/RxcF63HaUHI/AAAAAAAAABU/ouMN9Dq7F_E/s1600-h/7404.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/RxcF63HaUHI/AAAAAAAAABU/ouMN9Dq7F_E/s320/7404.png" alt="" id="BLOGGER_PHOTO_ID_5122569609942814834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Gracias al negador conseguimos ahorrarnos 2 patillas, por lo que podemos usar la usart del PIC y el control de los motores con el mismo puerto. Dejando otros puertos para futuras ampliaciones del robot rabotron. Sobretodo el puerto B.&lt;br /&gt;&lt;br /&gt;El esquema queda de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/RxcGYHHaUII/AAAAAAAAABc/nYF1tqm6xiM/s1600-h/esquema.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/RxcGYHHaUII/AAAAAAAAABc/nYF1tqm6xiM/s320/esquema.JPG" alt="" id="BLOGGER_PHOTO_ID_5122570112453988482" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8460815754602939603?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8460815754602939603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8460815754602939603' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8460815754602939603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8460815754602939603'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/diagrama-electronico-drivers-motores-ii.html' title='Diagrama electronico drivers motores (II)'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qXc7kTaGt-E/RxcF63HaUHI/AAAAAAAAABU/ouMN9Dq7F_E/s72-c/7404.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-1399022256965577633</id><published>2007-10-12T16:13:00.001+02:00</published><updated>2008-12-11T08:02:48.081+01:00</updated><title type='text'>Probando el MAX232</title><content type='html'>&lt;span style="font-family:georgia;"&gt;Una vez diseñada la placa para el driver de motores para nuestro robot, solo tenemos que empezar a soldarla tal como se ha indicado en el esquema anterior.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;El primer paso es el del max232 (en nuestro caso el st232). &lt;/span&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;&lt;span style="font-family:georgia;"&gt;El MAX232 es un circuito integrado que convierte los niveles de las líneas de un puerto serie RS232 a niveles TTL y viceversa. Esto nos es imprescindible para la comunicación entre el microcontrolador (pic16f876) y el ordenador (rs232).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: georgia;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/Rw-Aw3ry8NI/AAAAAAAAABM/G-kDceM4svI/s1600-h/max232.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/Rw-Aw3ry8NI/AAAAAAAAABM/G-kDceM4svI/s320/max232.jpg" alt="" id="BLOGGER_PHOTO_ID_5120452878413263058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="font-family: georgia;" src="file:///C:/DOCUME%7E1/XP/CONFIG%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt;&lt;span style="font-family:georgia;"&gt;Del puerto serie solo necesitamos &lt;/span&gt;&lt;span style=";font-family:Times New Roman;font-size:100%;"  &gt;los pines TX y RX. TX es la señal de transmisión de datos, RX es la de recepción (RTS y CTS se utilizan para establecer el protocolo para el envío y recepción de los datos). Para la comunicación con nuestro robot vamos a utilizar lo que vulgarmente llamamos “modem nulo”. Es decir, que tan solo vamos a tener en consideración las señales de RX (recepción) y la de TX (trasmisión) para realizar la comunicación.&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Por ultimo podemos ver el video como indicando que el funcionamiento es correcto:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;-12V/-9V  --&gt; 5V&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;12V/9V     --&gt; 0V&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;y viceversa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mDMj87ZSNEA"&gt;&lt;embed src="http://www.youtube.com/v/mDMj87ZSNEA" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-1399022256965577633?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/1399022256965577633/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=1399022256965577633' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/1399022256965577633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/1399022256965577633'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/probando-el-max232.html' title='Probando el MAX232'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qXc7kTaGt-E/Rw-Aw3ry8NI/AAAAAAAAABM/G-kDceM4svI/s72-c/max232.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-8460694053341008963</id><published>2007-10-09T11:18:00.000+02:00</published><updated>2008-12-11T08:02:48.621+01:00</updated><title type='text'>Reconociendo colores: ¿Por que HSV (HBS) y no RGB?</title><content type='html'>&lt;span style="font-family:times new roman;font-size:130%;"&gt;Una vez conseguido capturar imágenes con Linux para nuestro robot, tenemos que pasar a examinar dichas imágenes para así conseguir el objetivo deseado: que rabotron reconozca a nuestra “víctima” mediante visión (webcam). En los inicios el modelo de color empleado fue el conocido &lt;a href="http://es.wikipedia.org/wiki/Modelo_de_color_RGB"&gt;RGB &lt;/a&gt;(&lt;i&gt;Red, Green, Blue&lt;/i&gt;), en este modelo al representarse cada color como una tupla de tres elementos, en nuestro caso lógicamente colores: rojo, verde y azul, esto acarrea un problema a la hora de reconocer un color, en un ambiente de luminosidad variado un color puede tener varios tonos, por ejemplo, podemos tener un amarillo, amarillo oscuro o un amarillo claro (todo dependiendo del nivel de luz que incida sobre nuestro objeto y la webcam que usemos para la captura):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-family: times new roman;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lRjDQFtRjZg/Rwtj0sV2YFI/AAAAAAAAAAM/t5YU_nrRFbk/s1600-h/rgb.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_lRjDQFtRjZg/Rwtj0sV2YFI/AAAAAAAAAAM/t5YU_nrRFbk/s320/rgb.jpg" alt="" id="BLOGGER_PHOTO_ID_5119295158343852114" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:times new roman;font-size:130%;"  &gt;Por lo tanto para reconocer un mismo color con distintas intensidades se nos plantea el problema de tener que crear un filtro de rangos a la hora de localizarlo.  &lt;/span&gt;&lt;p class="MsoNormal"  style="text-align: justify;font-family:times new roman;"&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;span style="font-family:times new roman;font-size:130%;"&gt;Para solucionar este pequeña pega consideramos mas conveniente usar el modelo &lt;a href="http://es.wikipedia.org/wiki/Modelo_de_color_HSV"&gt;HSV&lt;/a&gt; (Hue, Saturation, Value) ( también conocido como HBS (Hue, Saturation, Brightness), en este modelo cada color esta representado por una tonalidad, una saturación y un brillo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-family: times new roman;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lRjDQFtRjZg/RwtkmMV2YGI/AAAAAAAAAAU/2DLWAjxTp7s/s1600-h/hsv.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_lRjDQFtRjZg/RwtkmMV2YGI/AAAAAAAAAAU/2DLWAjxTp7s/s320/hsv.jpg" alt="" id="BLOGGER_PHOTO_ID_5119296008747376738" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;  &lt;p class="MsoNormal"  style="text-align: justify;font-family:times new roman;"&gt;&lt;span style="font-size:130%;"&gt;Por lo tanto a la hora de localizar un color en concreto nos bastará saber su tonalidad para saber si podría ser el color buscado en la imagen que recibe nuestro robot.&lt;/span&gt;&lt;/p&gt;    &lt;span style=";font-family:times new roman;font-size:130%;"  &gt;Por tanto para el reconocimiento de nuestra “victima” usaremos el modelo de color HSV.&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=""&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-8460694053341008963?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/8460694053341008963/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=8460694053341008963' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8460694053341008963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/8460694053341008963'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/reconociendo-colores-por-que-hsv-hbs-y.html' title='Reconociendo colores: ¿Por que HSV (HBS) y no RGB?'/><author><name>}TOR{</name><uri>http://www.blogger.com/profile/05864406022583208360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp3.blogger.com/_lRjDQFtRjZg/R1bBgqwdnNI/AAAAAAAAABY/hR9fagPusaQ/S220/cc+.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_lRjDQFtRjZg/Rwtj0sV2YFI/AAAAAAAAAAM/t5YU_nrRFbk/s72-c/rgb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-2803173401853127912</id><published>2007-10-09T10:11:00.000+02:00</published><updated>2008-12-11T08:02:49.696+01:00</updated><title type='text'>Diagrama electrónico drivers motores</title><content type='html'>Vamos a comentar brevemente el diseño de lo que a posteriori será el circuito impreso de nuestro driver de motores.&lt;br /&gt;&lt;br /&gt;La comunicación con el pc (con player/stage) se efectuará mediante el puerto serie, usando los pines 2 y 3 que son los de Tx(trasmision) y el Rx (recepcion) y el pin 5 de tierra. Los niveles del puerto serie (-12V para un 1 lógico y 12V para un 0 cero lógico) no coinciden con los que necesita el microcontrolador (5V para un 1 lógico y 0V para un 0 cero lógico). Por ello vamos a utilizar un max232 que es el encargado de convertir los niveles de las líneas de un puerto serie a niveles TTL y viceversa.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rws_SHry8KI/AAAAAAAAAA0/Yg3G275mLiM/s1600-h/max232.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rws_SHry8KI/AAAAAAAAAA0/Yg3G275mLiM/s320/max232.jpg" alt="" id="BLOGGER_PHOTO_ID_5119254981969637538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez que tenemos trasformadas las tensiones conectamos con el microcontrolador, como ya hemos comentado anteriormente será un PIC16F876. Este microcontrolador es el encargado de recibir las ordenes del pc (cabeza pensante del robot) y manejar los motores.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rws_SHry8LI/AAAAAAAAAA8/7XvOgo-uasM/s1600-h/PIC16F876.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rws_SHry8LI/AAAAAAAAAA8/7XvOgo-uasM/s320/PIC16F876.gif" alt="" id="BLOGGER_PHOTO_ID_5119254981969637554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para manejar los motores (ya que vamos a usar motores de corriente continua) utilizamos un L293 que basicamente es un circuito puente en h. Las entradas metemos la direccion en que giran los motores y la interrupcion para dejar que giren o pararlos. El circuito se alimenta con 5v pero dejaremos pasar 12 v que son lo que alimentan a los motores (usamos motores dc de 12 v).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qXc7kTaGt-E/Rws_R3ry8JI/AAAAAAAAAAs/EnTYXMJahZU/s1600-h/l293.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_qXc7kTaGt-E/Rws_R3ry8JI/AAAAAAAAAAs/EnTYXMJahZU/s320/l293.jpg" alt="" id="BLOGGER_PHOTO_ID_5119254977674670226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Con esto podemos crear nuestro diagrama electrónico para el driver de motores que despues soldaremos en una placa. El diagrama queda de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qXc7kTaGt-E/RwtAFXry8MI/AAAAAAAAABE/Pn3oH9ucbJA/s1600-h/esquema.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_qXc7kTaGt-E/RwtAFXry8MI/AAAAAAAAABE/Pn3oH9ucbJA/s320/esquema.JPG" alt="" id="BLOGGER_PHOTO_ID_5119255862437933250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Podriamos haber puesto un inversor (un 7400) para no tener que replicar algunas salidas del pic16f876 con el l293. Pero no se como voy a ir de espacio en la placa y como me sobran pines en el microcontrolador voya gestionarlo por "software", espero no equivocarme.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-2803173401853127912?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/2803173401853127912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=2803173401853127912' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2803173401853127912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2803173401853127912'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/diagrama-electrnico-drivers-motores.html' title='Diagrama electrónico drivers motores'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qXc7kTaGt-E/Rws_SHry8KI/AAAAAAAAAA0/Yg3G275mLiM/s72-c/max232.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-5407928380983968441</id><published>2007-10-02T16:58:00.000+02:00</published><updated>2008-12-11T08:02:50.013+01:00</updated><title type='text'>Modulacion de ancho de pulso (PWM)</title><content type='html'>Entrando en materia, tenemos que tener presente como vamos a utilizar los motores para el movimiento de nuestro robot. Las variables que nos va a pasar el player/stage a los motores serán la velocidad lineal y la velocidad angular. Con estas dos variables el robot debe de poder moverse de un lado a otro con distintas velocidades.&lt;br /&gt;&lt;br /&gt;La primera solucion para ello era utilizar motores paso a paso, ya que con ello podemos seleccionar los pasos que den los mismos tanto haccia adelante y hacia atras. Consultando con un pas de la universidad de alicante me acondejó que no lo hiciera así, ya que son motores muy bruscos y no muy recomendables para el movimiento de un robot, aunque si para la posición de algo.&lt;br /&gt;&lt;br /&gt;A si es que he preferido meterme con el "tinglao" de motores de corriente continua (motores dc), es podible que eso sea lo que necesita nuestro robot. El problema reside es que para realizar los giros, un motor debe de ir a distinta velocidad que el otro. Para hacer esto recurrimos al pwm (pulse width modulation) modulacion del ancho del pulso.&lt;br /&gt;&lt;br /&gt;PWM es una técnica en la que se modifica el ciclo de trabajo de una señal periódica. De esta manera conseguimos que trabaje mas o menos tiempo un motor. El microcontrolador trabajará por nivel alto, cuanto mas tiempo este en nivel alto más velocidad:&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/celtico/CONFIG%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qXc7kTaGt-E/RwJg4kXvYxI/AAAAAAAAAAk/kDZcK12laSA/s1600-h/pwm_signal.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_qXc7kTaGt-E/RwJg4kXvYxI/AAAAAAAAAAk/kDZcK12laSA/s320/pwm_signal.png" alt="" id="BLOGGER_PHOTO_ID_5116758651598496530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para usar esto necesitamos un microcontrolador de gama media (no lo mas baratos), el elegido en nuestro caso es el del robot (pic 16f876) con dos salidas moduladas con pwm.&lt;br /&gt;&lt;br /&gt;Para probarlo nhemos creado un programita que aumenta el % de nivel alto hasta el 100% y despues disminuye poco a poco hasta el 0% y así indefinidamente. El codigo del microcontrolador para esta tarea lo programamos de la siguiente manera:&lt;br /&gt;&lt;br /&gt;;Includes       &lt;br /&gt;        LIST P=16f876&lt;br /&gt;        RADIX HEX&lt;br /&gt;        INCLUDE "P16F876.INC"&lt;br /&gt;&lt;br /&gt;;Configuracion quitar&lt;br /&gt;;        __CONFIG    _PWRTE_ON &amp;amp; _WDT_OFF &amp;amp; _HS_OSC &amp;amp; _LVP_OFF&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        cont1    equ    0x0E    ; Numero de ticks a esperar&lt;br /&gt;        cont2    equ    0x0F    ; Numero de ticks a esperar&lt;br /&gt;        cont3    equ    0x10    ; Numero de ticks a esperar&lt;br /&gt;&lt;br /&gt;        ORG 0x00&lt;br /&gt;&lt;br /&gt;        GOTO INICIO&lt;br /&gt;&lt;br /&gt;        ORG 0x05&lt;br /&gt;&lt;br /&gt;; Initialisierung&lt;br /&gt;INICIO&lt;br /&gt;&lt;br /&gt;; Preparacion del PWM&lt;br /&gt;; Predivisor 16:1 y Timer2 on&lt;br /&gt;        BSF    T2CON, T2CKPS1    ; Preescalador 16:1&lt;br /&gt;        BSF    T2CON, TMR2ON    ; Activa el Timer2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; Frecuencia a 1,22 KHz&lt;br /&gt;        BSF     STATUS, RP0    ;Cambio al banco 1&lt;br /&gt;        MOVLW    D'255'        ;255 en decimal&lt;br /&gt;        MOVWF    PR2        ;1.22 kHz&lt;br /&gt;        BCF    STATUS, RP0    ;Cambio al banco 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; Ponemos la potencia al 50%&lt;br /&gt;        MOVLW    D'127'        ;127 en decimal&lt;br /&gt;        MOVWF    CCPR1L        ;50%&lt;br /&gt;&lt;br /&gt;; RC2/CCP1 salida&lt;br /&gt;        BSF    STATUS, RP0    ;Banco 1&lt;br /&gt;        BCF    TRISC, 2    ;RC2 salida&lt;br /&gt;        BCF    STATUS, RP0    ;Volvemos al Banco 0&lt;br /&gt;&lt;br /&gt;; Inicializamos el modo PWM de CCP1&lt;br /&gt;        CLRF    CCP1CON        ;Limpiamos reg CCP1&lt;br /&gt;        BSF    CCP1CON, CCP1M3    ;CCP1 en modo pwm 11XX&lt;br /&gt;        BSF    CCP1CON, CCP1M2&lt;br /&gt;&lt;br /&gt;;Aumento&lt;br /&gt;&lt;br /&gt;AUMENTO&lt;br /&gt;        CALL    RETARDO       &lt;br /&gt;        INCFSZ    CCPR1L,1    ;Incrementamos uno&lt;br /&gt;        GOTO    AUMENTO        ;Va aumentando&lt;br /&gt;        GOTO    DECREMENTA    ;Toca decrementar&lt;br /&gt;&lt;br /&gt;;decrementa&lt;br /&gt;DECREMENTA&lt;br /&gt;        CALL    RETARDO&lt;br /&gt;        DECFSZ    CCPR1L,1    ;Decrementamos uno&lt;br /&gt;        GOTO    DECREMENTA    ;Va decrementando&lt;br /&gt;        GOTO    AUMENTO        ;Toca aumentar&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;;************************************************************&lt;br /&gt;;* Rutina de espera.&lt;br /&gt;;* ENTRADA:&lt;br /&gt;;*    -W: Numero de ticks a esperar. Cada tick es de 10ms&lt;br /&gt;;************************************************************&lt;br /&gt;&lt;br /&gt;RETARDO&lt;br /&gt;    movlw    D'2'&lt;br /&gt;    movwf    cont3&lt;br /&gt;CICLO3    movlw    D'20'&lt;br /&gt;    movwf    cont2&lt;br /&gt;CICLO2    movlw    D'33'&lt;br /&gt;    movwf    cont1&lt;br /&gt;CICLO    decfsz    cont1,1&lt;br /&gt;    goto    CICLO&lt;br /&gt;    decfsz    cont2,1&lt;br /&gt;    goto    CICLO2   &lt;br /&gt;    decfsz    cont3,1&lt;br /&gt;    goto    CICLO3   &lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;    RETURN            ; Si, terminar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; FIN       &lt;br /&gt;        end&lt;br /&gt;&lt;br /&gt;A continuación podemos ver un video de la ejecucion del programa. La prueba se hace con un led. Cuanto mas pwm el led se ilumina mas y cuando vamos bajando vemos como el led disminuye su iluminacion hasta apagarse y luego al reves. Además podemos contemplar los voltages como aumenta y disminuye acorde con el led:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8JgW_F_MP5E"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8JgW_F_MP5E" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-5407928380983968441?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/5407928380983968441/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=5407928380983968441' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5407928380983968441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/5407928380983968441'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/10/modulacion-de-ancho-de-pulso-pwm.html' title='Modulacion de ancho de pulso (PWM)'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qXc7kTaGt-E/RwJg4kXvYxI/AAAAAAAAAAk/kDZcK12laSA/s72-c/pwm_signal.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-2197124058476398020</id><published>2007-09-28T16:36:00.001+02:00</published><updated>2008-12-11T08:02:50.608+01:00</updated><title type='text'>Webcam bajo linux</title><content type='html'>Como es de esperar , la visión de nuestro robot se hará mediante una camara web que captura el entorno para que más tarde sea player quien procese dicha imagen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para hacer las pruebas he cogido la mía, una logitech un poco reventada. He estado buscando por inet y he encontrado dos drivers distintos: el spca5xx y el gspca. La verdad es que no se aun la diferencia entre ambos. En un principio entendí que el spca5xx era mas moderno y lo instalé. Más tarde lei en otra pagina web que era al revés y entonces instalé el gspca. El caso es que ahora conviven los dos en mi lenny, por ahora sin problemas.&lt;br /&gt;&lt;br /&gt;La forma de instalar spca5xx fue esta:&lt;br /&gt;&lt;br /&gt;#apt-get install spca5xx-source&lt;br /&gt;&lt;br /&gt;Se nos instalara en /usr/src, por tanto vamos a esa ruta, y lo descomprimos:&lt;br /&gt;&lt;br /&gt;laos:/home/usuario# cd /usr/src/&lt;br /&gt;laos:/usr/src# ls spca5xx-source.tar.bz2&lt;br /&gt;laos:/usr/src# unp spca5xx-source.tar.bz2&lt;br /&gt;modules/ modules/spca5xx/&lt;br /&gt;modules/spca5xx/debian/&lt;br /&gt;modules/spca5xx/debian/rules&lt;br /&gt;modules/spca5xx/debian/control.modules.in&lt;br /&gt;modules/spca5xx/debian/control&lt;br /&gt;modules/spca5xx/debian/compat&lt;br /&gt;modules/spca5xx/debian/copyright&lt;br /&gt;modules/spca5xx/debian/changelog&lt;br /&gt;modules/spca5xx/cutlog.py&lt;br /&gt;modules/spca5xx/LICENSE&lt;br /&gt;modules/spca5xx/CHANGELOG&lt;br /&gt;modules/spca5xx/INSTALL&lt;br /&gt;modules/spca5xx/drivers/&lt;br /&gt;modules/spca5xx/drivers/usb/&lt;br /&gt;modules/spca5xx/drivers/usb/spca500_init.h&lt;br /&gt;modules/spca5xx/drivers/usb/spcaCompat.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca5xx.h&lt;br /&gt;modules/spca5xx/drivers/usb/pac207.h&lt;br /&gt;modules/spca5xx/drivers/usb/spcausb.h&lt;br /&gt;modules/spca5xx/drivers/usb/sonix.h&lt;br /&gt;modules/spca5xx/drivers/usb/tas5130c.h&lt;br /&gt;modules/spca5xx/drivers/usb/cxlib.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca508_init.h&lt;br /&gt;modules/spca5xx/drivers/usb/sp5xxfw2.h&lt;br /&gt;modules/spca5xx/drivers/usb/spcadecoder.c&lt;br /&gt;modules/spca5xx/drivers/usb/pb0330.h&lt;br /&gt;modules/spca5xx/drivers/usb/cs2102.h&lt;br /&gt;modules/spca5xx/drivers/usb/dummy_cam.h&lt;br /&gt;modules/spca5xx/drivers/usb/spcadecoder.h&lt;br /&gt;modules/spca5xx/drivers/usb/pas106b.h&lt;br /&gt;modules/spca5xx/drivers/usb/cx11646.h&lt;br /&gt;modules/spca5xx/drivers/usb/sn9cxxx.h&lt;br /&gt;modules/spca5xx/drivers/usb/hdcs2020.h&lt;br /&gt;modules/spca5xx/drivers/usb/spcagamma.h&lt;br /&gt;modules/spca5xx/drivers/usb/hv7131b.h&lt;br /&gt;modules/spca5xx/drivers/usb/hv7131c.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca500.dat&lt;br /&gt;modules/spca5xx/drivers/usb/jpeg_header.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca501.dat&lt;br /&gt;modules/spca5xx/drivers/usb/icm105a.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca501_init.h&lt;br /&gt;modules/spca5xx/drivers/usb/jpeg_qtables.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca505.dat&lt;br /&gt;modules/spca5xx/drivers/usb/spca505_init.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca508.dat&lt;br /&gt;modules/spca5xx/drivers/usb/et61xx51.h&lt;br /&gt;modules/spca5xx/drivers/usb/ov7630c.h&lt;br /&gt;modules/spca5xx/drivers/usb/tv8532.h&lt;br /&gt;modules/spca5xx/drivers/usb/zc3xx.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca506.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca561.h&lt;br /&gt;modules/spca5xx/drivers/usb/mr97311.h&lt;br /&gt;modules/spca5xx/drivers/usb/spca5xx.c&lt;br /&gt;modules/spca5xx/drivers/usb/sp5xxfw2.dat&lt;br /&gt;modules/spca5xx/README-TV8532&lt;br /&gt;modules/spca5xx/README-SONIX&lt;br /&gt;modules/spca5xx/Makefile&lt;br /&gt;modules/spca5xx/README-KERNEL-UPTO-2.6.16&lt;br /&gt;modules/spca5xx/RGB-YUV%2fmodule-setting&lt;br /&gt;modules/spca5xx/README&lt;br /&gt;&lt;br /&gt;Ahora lo tendremos en la carpeta modules, vamos a élla y lo compilamos:&lt;br /&gt;laos:/usr/src# cd modules/spca5xx/&lt;br /&gt;&lt;br /&gt;instalar el source del kernel:&lt;br /&gt;laos:/usr/src/modules/spca5xx# apt-get install linux-source-2.6.21&lt;br /&gt;laos:/usr/src/modules/spca5xx# apt-get install linux-tree-2.6.21&lt;br /&gt;laos:/usr/src/modules/spca5xx# apt-get install linux-headers-2.6.21-2-all-i386&lt;br /&gt;&lt;br /&gt;otros paquetes necesarios:&lt;br /&gt;laos:/usr/src/modules/spca5xx# apt-get install gcc&lt;br /&gt;&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;laos:/usr/src/modules/spca5xx# lsmod |grep spca5xx&lt;br /&gt;spca5xx               658224  1&lt;br /&gt;videodev               25952  2&lt;br /&gt;spca5xx usbcore       123272  5 spca5xx,usbhid,ehci_hcd,uhci_hcd&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con esto ya conseguí que se viera la cámara perfectamente. Luego más tarde por un problema con una cámara intenté instalar el otro driver, el gspca. De la siguiente manera:&lt;br /&gt;&lt;br /&gt;laos:/home/usuario# apt-get install module-assistant&lt;br /&gt;laos:/home/usuario# apt-get install gspca-source&lt;br /&gt;laos:/home/usuario# m-a prepare (abreviatura de module-assistant)&lt;br /&gt;laos:/home/usuario# m-a a-i gspca&lt;br /&gt;laos:/home/usuario# modprobe gspca&lt;br /&gt;laos:/home/usuario# lsmod |grep spca5xx&lt;br /&gt;spca5xx               658224  0&lt;br /&gt;videodev               25952  3&lt;br /&gt;gspca,zc0301,spca5xx usbcore   123272  9  gspca,usbhid,zc0301,snd_usb_audio,snd_usb_lib,spca5xx,ehci_hcd,uhci_hcd&lt;br /&gt;&lt;br /&gt;Podemos ver como ahora carga los dos drivers y sigue yendo igual. Para probarla podeis usar cualquier programa que use la webcam o usad el camorama:&lt;br /&gt;&lt;br /&gt;apt-get install camorama&lt;br /&gt;camorama&lt;br /&gt;&lt;br /&gt;Os pego una imagen de mi propio sistema operativo.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rv0RkUXvYwI/AAAAAAAAAAc/yTYYcvfle5I/s1600-h/cam.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_qXc7kTaGt-E/Rv0RkUXvYwI/AAAAAAAAAAc/yTYYcvfle5I/s320/cam.png" alt="" id="BLOGGER_PHOTO_ID_5115264067403997954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;cámara funcionando.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-2197124058476398020?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/2197124058476398020/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=2197124058476398020' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2197124058476398020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/2197124058476398020'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/09/webcam-bajo-linux.html' title='Webcam bajo linux'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qXc7kTaGt-E/Rv0RkUXvYwI/AAAAAAAAAAc/yTYYcvfle5I/s72-c/cam.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-1819409371967210715</id><published>2007-09-01T23:09:00.000+02:00</published><updated>2007-09-01T23:43:02.953+02:00</updated><title type='text'>Mi proyecto</title><content type='html'>Como todo en la vida, las cosas tienen un principio, un desarrollo y un final. Mi carrera universitaria no iba a ser menos, a si es que me encuentro casi al final del trayecto. Para terminar necesito hacer el proyecto de fin de carrera. Para esto cuento con la inestimable ayuda de mi compañero de andadas (por lo menos  en los ultimos 3 años), mi amigo victor.&lt;br /&gt;&lt;br /&gt;Como Victor le da relativamente igual el proyecto a realizar, he decidido elegir yo por él. Quizás esto sea bastante peligroso, ya que es muy probable que nos metamos en un verdadero berengenal. Pero bueno creo que hemos salido de situaciones peores, o sea que esto no nos da miedo y seguro que sale adelante (Intento convencerme a mi mismo).&lt;br /&gt;&lt;br /&gt;La idea es hacer un robot.  Vaya tela ¿no?.  La verdad es que hace tiempo hice uno bastante sencillo que se trataba de un sigue-lineas. Con un PIC 16F84 y unos cuantos sensores infrarrojos de corto alcance (CNY70)  conseguí terminarlo y la verdad es que funcionaba bastante bien. Pero te das cuenta que no tiene muchas posibilidades un microcontrolador para crear un robot "semi-inteligente". La segunda toma de contacto queria que fuera con una fpga pero eso fue tan desastroso que ni lo cuento.Lo que pasa es que como los ingenieros, o los informaticos, o simplemente yo, siempre queremos superarnos he seguido investigando. Y creo que ya se el berengenal que voy a hacer.&lt;br /&gt;&lt;br /&gt;La idea es crear un robot "inteligente". Lo de inteligente no se refiere a que sea einstein, ni nada parecido, me conformo con que tenga alguna conducta inteligente. En un principio lo hablé con un profesor de la universidad y pactamos algo tan simple como seguir a una persona dada. Ese es el objetivo aunque me gustaria sobrepasarlo.&lt;br /&gt;&lt;br /&gt;El problema tiene dos partes diferenciadas, por un lado el montaje del robot (mecanicamente y electronicamnente) y por otro lado la programacion del mismo y la instauracion de inteligencia artificial. Lo que me lleva a no poder hablar solo con un departamento, sino que tendré que ir pidiendo ayuda de al menos dos. Aunque el departamento encargado seguramente será el de inteligencia artificial.&lt;br /&gt;&lt;br /&gt;En la parte del montaje tengo un amigo que trabaja con metacrilato, por lo que en plan de retales creo que podré montarlo, aunque aun me queda hacer el diseño. Pero la verdad es que llevo un lio con que motores ponerle y como gestionarlos. Supongo que unos motores paso a paso para medir los cm que avanza y la gestion haré alguna placa. Por otro lado pondré una camara web para la vision del robot. ¿Qué camara? Aun no se. por ahora uso una logitech bastante antigua, aunque he leido que la websphere de logitech va bien.&lt;br /&gt;&lt;br /&gt;Por el lado del software la idea es meterle un portatil entero con player/stage instalado que sea el que gestione todo y que interactue con el hardware. La verdad es que nunca he usado player/stage pero estoy viendo que no es dificil y da posibilidades. Creo que la IA se la daré a mi compi Victor y yo me dedicaré al montage y a la electronica.&lt;br /&gt;&lt;br /&gt;No se como saldrá esto. Espero que dios reparta suerte y espero vuestros comentarios tambien.&lt;br /&gt;&lt;span style="font-size:-1;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-1819409371967210715?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/1819409371967210715/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=1819409371967210715' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/1819409371967210715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/1819409371967210715'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/09/mi-proyecto.html' title='Mi proyecto'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4239052219634326361.post-6917923558683994018</id><published>2007-08-24T19:37:00.000+02:00</published><updated>2007-08-24T19:39:58.826+02:00</updated><title type='text'>Bienvenida</title><content type='html'>Siempre he estado entrando a distintos blogs por internet. Pero ahora ha sido el momento de hacer uno. jejeje.&lt;br /&gt;&lt;br /&gt;Intentaré escribir aqui mi proyecto de final de carrera (aunque aun no esta decidido) y algunas otras hierbas que crea que son interesantes.&lt;br /&gt;&lt;br /&gt;Un saludo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4239052219634326361-6917923558683994018?l=celtico-celtico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celtico-celtico.blogspot.com/feeds/6917923558683994018/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4239052219634326361&amp;postID=6917923558683994018' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6917923558683994018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4239052219634326361/posts/default/6917923558683994018'/><link rel='alternate' type='text/html' href='http://celtico-celtico.blogspot.com/2007/08/bienvenida.html' title='Bienvenida'/><author><name>celtico</name><uri>http://www.blogger.com/profile/09747072757230645070</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://sportsmedia.ign.com/sports/image/article/635/635699/batista-animal-unleashed-20050721053017434.jpg'/></author><thr:total>0</thr:total></entry></feed>
