jueves, 18 de julio de 2013

Matlab Arduino Y Procesamiento De Imágenes (Posición de un servomotor)

Hola todos,

En este vídeo muestro una pequeña aplicación que había hecho hace un tiempo y quería mostrársela a ustedes, es una aplicación bastante simple; su objetivo es mover un servomotor (controlar la posición de un servomotor) mediante el movimiento de un objeto, haciendo uso de procesamiento de imágenes. 

Esta aplicacion la considero como principios básicos de rootica (un pequeño sistema de visión artificial).Esta aplicación surge a partir de mi necesidad de querer aprender a programar en arduino, y quería empezar con algo básico pero quería hacerlo rápido, entonces me puse a pensar, mmmm no tengo tiempo para aprender arduino en este memento, entonces lo que hice fue programar en matlab (que es mi fuerte) y enviar los datos al arduino, luego prendí y apague un LED, cuando de repente estaba buscando algo en el cajón de mi escritorio y encontré un servomotor, entonces se me ocurrió esta aplicación.


Descargar Los Archivos 

o

47 comentarios:

  1. excelente aporte Alex.... gracias y muchos exitos

    ResponderEliminar
  2. como programaste el arduino o como es el código amigo, me gustaría intentarlo, acabo de comprar un arduino leonardo y quisiera hacer proyecto, buen dia.

    ResponderEliminar
    Respuestas
    1. http://edutronic.blogspot.com/2013/08/controlar-una-placa-de-arduino-desde.html

      Saludos

      Eliminar
  3. necesito las claves para ver el código de los archivos

    ResponderEliminar
    Respuestas
    1. debajo de los links de descarga hay un boton que dice ver contraseña, sale la dirección del blog, esa es la contraseña para descomprimir los archivos

      Saludos

      Eliminar
  4. tienes algunos tutoriales de matlab para empezar a programar, muy buen video (y)

    ResponderEliminar
  5. Hola Gran trabajo el que realizas en este blog y muy buen programa este que has publicado!!
    Quería comentarte que yo estoy publicando también algunos programas basados en procesamiento de imagen con Matlab como reconocimiento de monedas u otros similares.
    Además he hecho un pequeño tutorial sobre este tema y quería comentártelo sobretodo lo de los programas que he realizado para que les eches un vistazo si puedes y me comentes que tal los ves y si podría mejorar algún aspecto:
    http://matlabimagenes.blogspot.com.es/

    ResponderEliminar
    Respuestas
    1. esta bueno tu blog, tiene conceptos básicos para personas que hasta ahora están empezando con el mundo del procesamiento de imanes, pero creo que te hace falta explicar un poco sobre el manejo de vectores y matrices con matlab (pues de eso se basa el manejo de imágenes), porque con aplicaciones de alto nivel la personas suelen decir que Matlab es lento y que no hace procesamiento en tiempo real, pero eso es porque no saben manejar bien los vectores y matrices em este sotware, la mayoría de personas esta acostumbradas a programar el C y el uso excesivo de bucles y condicionales en Matlab ocasiona que el procesamiento se vuelva lento (porque Matlab trabaja sobre ,matrices, y que son las imágenes? pues matrices), entonces hay que entender mejor ese paradigma de programación en C y Matlab.

      Otra cosa que puedes mejorar es que el codigo se resalte sobre la pagina, para que no se vea tan plano el diseño de las paginas.

      pero en general esta bien, si quieres mas información sobre procesamiento de imagenes me dices y cuando tenga tiempo subo una Demo Computer Vision que hice

      Saludos

      Eliminar
  6. disculpa amigo, me sale un herror de myvid, sabes como solucionarlo?

    ResponderEliminar
  7. mas vien esto es:
    ??? Undefined function or method 'message' for input arguments of type 'char'.

    Error in ==> MyVid at 37
    warning(message('imaq:obj2mfile:MATload'));

    Error in ==> ServoMove at 1
    vid = MyVid;

    ResponderEliminar
    Respuestas
    1. tienes que crear tu propio archivo MyVid.m con imtool de matlab, o simplemente reemplazar esa linea y adquirir directamente la imagen de la Cam.

      Saludos

      Eliminar
    2. kokok, bueno y como logro eso? jeje, soy nuevo en esto, mas bien en cunato a matlab ;S disculpa la ignorancia,..

      Eliminar
    3. en mi blog podrás encontrar como controlar una placa de arduino desde matlab, y puedes descargar el código y pegarle una revisada, Saludos

      Eliminar
  8. hola amigo estoy interesado en este proyecto he descargado los archivos lo que pasa es que cuando me sale la imagen para seleccionar el color roo la imagen sale en gris y no se diferencian los colores para poder seleccionar el color rojo ojola me puedas ayudar con esto muchas gracias

    ResponderEliminar
  9. oye amigo a mi me ,arca este error:

    Error in MyVid (line 53)
    vidObj1 = videoinput(adaptorName, deviceID, vidFormat);

    Error in ServoMove (line 1)
    vid = MyVid;

    ResponderEliminar
    Respuestas
    1. Estudia un poco el código y te darás cuanta del error, ademas es la primer linea, la idea cuando uno descarga un código es estudiarlo y aprender de él, no solo copia y pegar.

      PD: Si después de estudiar y analizar el error no encuentra la solución, lea los comentarios anteriores que ya comentaron ese problema.

      Saludos

      Eliminar
  10. Oye amigo no podrías mostrarnos como hiciste las conexiones a la placa arduino con el servo motor. Para este proyecto........

    ResponderEliminar
    Respuestas
    1. Es solo conectar el servo a los terminales positivo y negativo y el pin del dato a la salida PWM del arduino.

      Eliminar
  11. Me imagino que el arduino lo estas alimentando con una Fuente o un eliminador verdad .......
    Para esta aplicacion es nomas para el arduino mega o tambien soporta el arduino uno.......... o algunos otros mas......

    ResponderEliminar
    Respuestas
    1. esta aplicacion funciona para todos los arduino (se necesitan las librerías de matlab, ver el video en donde explico como hacerlo). No, no estoy alimentado el arduino con una fuente, solo lo conecto al Pc y listo, un servo no consume mucha corriente. Saludos

      Eliminar
    2. Oye disculpa si quiero detectar la imagen con una camara web USB como seria el comando, para que este trabajando con la camara web USB.......

      Eliminar
    3. es solo tener los instalados los drivers de la cámara, matlab almacena la nomenclatura de las cámaras en un vector, pero para mayor facilidad (aun no sabes mucho del tema), que utilices imtool, escribe ese comando y te aparecerá una interface gráfica de configuración y luego puedes generar una función automáticamente con esa herramienta. Saludos

      Eliminar
  12. Oye una pregunta cual es la contraseña del archivo, ya intente con la contraseña que esta abajo de los licks de descarga pero no funciono.

    ResponderEliminar
    Respuestas
    1. esa es la contraseña, intenta otra vez, fijate que no hallan espacios ni nada
      http://edutronic.blogspot.com/
      Saludos

      Eliminar
    2. si ya lo cheque y si fue la misma. Gracias. Oye otra pregunta si quiero que siga no específicamente siga un objeto, ahora quiero que sean dos objetos como le puedo hacer? tienes un correo para ponerme en contacto ? Gracias

      Eliminar
  13. Hola!! este codigo tambien funciona para arduino nano?? y en windows 8?? porque cuando ejecuto el comando ___.servoAttach() suena como si el arduino se desconectara y ya no funciona para ningun comando. No entiendo porque da este error y ya no se que mas intentar. Gracias por tu ayuda

    ResponderEliminar
    Respuestas
    1. si funciona para cualquier arduino (ver tutorial del blog de como conectar una placa de arduino a matlab) y si funciona en Windows 8, es mas en el video el pc que uso tiene Windows 8.

      Si no funciona ningún comando es porque no has instalado las librerías para poder comunicar la placa de arduino con matlab, entonces te recomiendo que veas el video. Saludos

      http://edutronic.blogspot.com/p/matlab.html

      Eliminar
  14. Buenas tardes he estado probando tu código, leyendo y experimentando, mas sin embargo aun no me queda muy claro que es el numero que aparece en la imagen cuando se esta moviendo el servo?

    ResponderEliminar
    Respuestas
    1. son los grados, en mi caso lo programe de 0 a 180 porque mi servomotor solo se mueve 180 grados. Saludos

      Eliminar
  15. Buenas tardes John,

    He estado revisando tu código y no sé cómo solucionar lo que me ocurre. Resulta que en la pantalla de segmentación del vídeo sólo me sale un único frame y ya no se mueve ni avanza.
    Me sale un warning que no sé si tiene que ver con este error:
    Attempting connection .............
    Analog & Digital I/O + Encoders + Servos (adioes.pde) sketch detected !
    Arduino successfully connected !
    Warning: P-file C:\Matlab\ARDUINO\Programa 1\colorseg.p is older than M-file
    C:\Matlab\ARDUINO\Programa 1\colorseg.m.
    C:\Matlab\ARDUINO\Programa 1\colorseg.p may be obsolete and may need to be regenerated.
    Type "help pcode" for information about generating P-files from M-files.
    > In ServoMove at 35
    Warning: P-file C:\Matlab\ARDUINO\Programa 1\imstack2vectors.p is older than M-file
    C:\Matlab\ARDUINO\Programa 1\imstack2vectors.m.
    C:\Matlab\ARDUINO\Programa 1\imstack2vectors.p may be obsolete and may need to be regenerated.
    Type "help pcode" for information about generating P-files from M-files.
    > In C:\Matlab\ARDUINO\Programa 1\colorseg.p>colorseg at 33
    In ServoMove at 35

    He probado con la función pcode para actualizar los archivos .p pero entonces me salen otro tipo de errores.

    Muchas gracias, un saludo.

    ResponderEliminar
    Respuestas
    1. que versión del matlab estas usando? puede ser que estés usando unas versión 2007, entonces actualiza a las nuevas versiones, o puede ser que estas usando la versión 2014, la versión 2014 no la he probado pero se que ha cambiado cosas acerca de la lectura de toolbox, en el caso de mi código supondría que los archivos .m y .p los tomas como toolbox. Si estas usando la ultima versión no te puedo ayudar porque no la he probado y ya hace bástate tiempo que no uso matlab. Saludos

      Eliminar
  16. disculpa intente realizar esta prueba pero al momento de que empieza a correr el video este detecta el objeto pero solo me arroja numeros incongruentes jamas tengo cero grados ni 180 solo oscila entre 85 y 100 y despues se detiene la captura de video, otra pregunta , las librerias que utilizas es adioes.pde o adiosrv.pde?

    ResponderEliminar
  17. Como hacer el ejecutable, para no instalar matlab en otra pc ?

    ResponderEliminar
    Respuestas
    1. http://edutronic.blogspot.com/2013/07/hacer-un-ejecutable-exe-en-matlab.html

      Eliminar
  18. Hola amigo, ¿me podrias pasar la contraseña para poder abrir los archivos comprimidos?

    ResponderEliminar
  19. hola, necesito ayuda, quiero recorrer una matriz binaria con matlab, cuya matriz es sacada de una imagen que se binarizó, y enviar este recorrido a traves de arduino uno hasta unos motores paso a paso para que ejecuten la accion de moverse, donde un láser quemará dependiendo si reciba un 1 o un 0

    ResponderEliminar
  20. me puedes ayudar amigo me salen estos errores

    Error using checkForSameSizeAndClass (line 8)
    X and Y must have the same class.

    Error in immultiply (line 54)
    checkForSameSizeAndClass(X, Y, mfilename);

    Error in ServoMove (line 13)
    red=immultiply(mask, a(:,:,1)); % identificar la region roja

    ResponderEliminar
  21. Disculpa me podrías decir como va armado el circuito

    ResponderEliminar
    Respuestas
    1. Tal como dice el autor]: Es solo conectar el servo a los terminales positivo (5V)y negativo(GND) y el pin del dato a la salida PWM del arduino...

      Eliminar
  22. excelente tu proyecto amigo pero yo tengo un probema con el codigo
    Reference to a cleared variable MATLoaded.
    Error in MyVid (line 78)
    if (MATLoaded)
    y una duda el acceso directo de la carpeta que nos brinde trabaja con una base de datos al parecer debo configurar algo ahi?

    ResponderEliminar
  23. Amigo como lo puedo contactar

    ResponderEliminar
  24. Necesito ayuda con esto "No appropriate method, property, or field 'servoattach' for class 'arduino'."

    ResponderEliminar