¿Quién no ha tenido alguna vez la necesidad de poder ver nuestra casa desde otro lugar (oficina, hotel, otra casa, etc), o poder hacer inspección de tuberías, respiraderos o sitios inaccesibles? La idea que planteo en este artículo es la de un coche teledirigido al que podemos manejar remotamente mediante wifi y que veamos por donde va.
Principalmente está compuesto de un coche RC, una placa arduino duemilanove (o UNO) con una motorshield y una raspbery pi modelo B con dos USB (un WIFI y una webcam) y el sistema operativo Raspbian.
El funcionamiento es sencillo: Por un lado con un programa en python que se ejecuta en la raspberry pi hacemos un servidor que reciba los comandos por tcp/ip, estos son enviados mediante el puerto serie de la raspberry pi al puerto serie del arduino, que será el encargado de manejar la motorshield para mover el conjunto. Por otro lado en la propia Raspberry Pi hacemos streaming de vídeo para que podamos ver a través de su webcam remotamente.
Todo está alimentado con una batería Lipo 7,4 V. (2S) de 1000 mAh. Por un lado está conectado directamente a arduino y por otro a un regulador UBEC para alimentar a la raspberry pi a través de los pines GPIO de 5v y GND.
La comunicación entre la rasbperry Pi y arduino se hace simplemente con un cable, ya que no es necesario ninguna protección al ser el pin TX de la raspberry pi el que se conecta al pin RX de arduino, y por tanto no hay riesgo con los voltajes diferentes (siempre y cuando no reprogrames arduino, si es así desconecta el cable de RX hasta haber terminado).
El programa de Arduino es bastante simple, sólo comprueba si existe un byte en el puerto serie y si lo hay lo interpreta para saber qué movimiento hay que hacer con los motores. Se parte del byte 0x30 (0 en ASCII) y se comprueban sus bits:
- Si el bit 0 está activado el coche va hacia delante.
- Si el bit 1 está activado el coche va hacia atrás.
- Si los bits anteriores están desactivados entonces el coche no se mueve.
- Si el bit 2 está activado gira las ruedas a la izquierda.
- Si el bit 3 está activado gira las ruedas a la derecha.
- Si los bits anteriores están desactivados entonces la dirección el coche permanece recta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
int dirA = 12; // sentido int dirB = 13; // direccion int speedA = 10; // velocidad del motor int speedB = 11; // parada o encendido de la dirección int velocidad = 150; // PWM del motor de tracción // El robot va hacia atrás void atras() { digitalWrite (dirA, HIGH); } // El robot va hacia alante void alante() { digitalWrite (dirA, LOW); } // El robot tuerce a la izquierda void izquierda() { digitalWrite (dirB, LOW); } // El robot tuerce a la derecha void derecha() { digitalWrite (dirB, HIGH); } void setup() { // Configuración de las comunicaciones Serial.begin(115200); // Configuración de los pines de la motorshield pinMode (dirA, OUTPUT); pinMode (dirB, OUTPUT); pinMode (speedA, OUTPUT); pinMode (speedB, OUTPUT); digitalWrite(speedA, LOW); digitalWrite(speedB, LOW); } void loop() { while (Serial.available()) { int caracter = Serial.read(); caracter -= 0x30; if(caracter == 0) { digitalWrite(speedA, LOW); digitalWrite(speedB, LOW); } else { if(caracter & 1) { analogWrite(speedA, velocidad); alante(); } else if(caracter & 2) { analogWrite(speedA, velocidad); atras(); } else if((caracter & 3) == 0) { digitalWrite(speedA, LOW); } if(caracter & 4) { digitalWrite(speedB, HIGH); izquierda(); } else if(caracter & 8) { digitalWrite(speedB, HIGH); derecha(); } else if((caracter & 12) == 0) { digitalWrite(speedB, LOW); } } } } |
En el lado de la Raspberry Pi hay que instalar primero varias cosas:
1 2 |
sudo apt-get update sudo apt-get install gstreamer-tools gstreamer0.10-plugins-bad gstreamer0.10-plugins-good v4l-utils python-serial |
Editado 17/04/2014: Desactivar la consola serie que viene por defecto activada:
En el fichero /etc/inittab poner una almohadilla (#) al principio en la línea:
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
En el fichero /boot/cmdline.txt sustituir la línea:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
por
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Finalmente hay que reiniciar la Raspberry Pi para que coja los cambios.
Después hay que dar permisos de lectura y escritura al puerto serie:
1 |
sudo chmod a+rw /dev/ttyAMA0 |
A continuación creamos un fichero llamado servidor.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import socket import serial ser=serial.Serial('/dev/ttyAMA0', 115200) host = '' port = 1976 backlog = 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host,port)) s.listen(backlog) while 1: ser.write("0") print "se espera una conexion" client, address = s.accept() print "conectado " + address[0] while 1: data = client.recv(1) if data == '': break else: ser.write(data) |
Este programa python se encarga de crear un socket tcp/ip que escucha por el puerto 1976 , cuando alguien se conecta a este puerto entonces permanece a la espera de recibir los bytes que posteriormente enviará a Arduino a través del puerto serie.
Finalmente crearemos un fichero llamado webcam.sh con el siguiente contenido (cambiar 192.168.1.133 por la ip que tenga vuestra raspberry pi):
1 |
gst-launch -v v4l2src ! ffmpegcolorspace ! video/x-raw-yuv,width=320,height=240,framerate=\(fraction\)30/1 ! queue ! videorate ! video/x-raw-yuv,framerate=10/1 ! jpegenc ! multipartmux ! tcpserversink host=192.168.1.133 port=5000 sync=false |
Este programa shell arrancará un servidor de streaming con GStreamer. De momento GStreamer es el software que conozco que funciona más rápido enviando imágenes con un retardo de 2 segundos, ffmpeg tenía un retardo de hasta ¡¡¡ 10 segundos !!!. La idea la cogí de aquí.
Ahora que ya tenemos lo necesario en nuestra parte del coche, necesitamos configurar el router para redirigir los puertos 22, 1976 y 5000 hacía la ip que tenga la Raspberry Pi.
Desde el ordenador remoto necesitaremos tener el programa VLC para el recibir el streaming, un cliente de ssh (en windows el mejor es el putty) y Processing para enviar los comandos.
Los pasos para hacer que nuestro sistema de televigilancia son los siguientes:
Conectar mediante ssh a la raspberry pi y ejecutar el comando:
1 |
sh webcam.sh |
Abrir otra sesión de ssh y ejecutar el comando:
1 |
python servidor.py |
Arrancar VLC y abrir una ubicación de red poniendo la siguiente línea, con esto podremos ver lo que hay frente a la webcam (cambiar 192.168.1.133 por la ip que tenga vuestra raspberry pi):
1 |
tcp://192.168.1.133:5000 |
Arrancar el Processing con el siguiente programa y ejecutarlo (cambiar 192.168.1.133 por la ip que tenga vuestra raspberry pi):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import processing.net.*; Client myClient; int valor; void setup() { size(200, 200); myClient = new Client(this, "192.168.1.133", 1976); valor = 0; } void draw() { } void keyReleased() { if (key == CODED) { if (keyCode == UP) { valor &= 0xFFFFFFFE; } else if (keyCode == DOWN) { valor &= 0xFFFFFFFD; } else if (keyCode == LEFT) { valor &= 0xFFFFFFFB; } else if (keyCode == RIGHT) { valor &= 0xFFFFFFF7; } myClient.write(valor + 0x30); } } void keyPressed() { if (key == CODED) { if (keyCode == UP) { valor |= 1; } else if (keyCode == DOWN) { valor |= 2; } else if (keyCode == LEFT) { valor |= 4; } else if (keyCode == RIGHT) { valor |= 8; } myClient.write(valor + 0x30); } } |
Si todo ha ido bien, ponemos la ventana de processing que nos ha abierto como activa cuando hemos lanzado el programa y pulsamos los botones de los cursores del teclado, momento en el cual veremos a través de la webcam (o en local si lo tenemos enfrente) cómo nos desplazamos.
Y finalmente un vídeo de cómo funciona:
Me encanta y me ha dado una idea para un vehículo con FPV que tenga una raspi, arduino para los motores y una web cam conectado a un router, que iría en el vehiculo.
Si en algún momento lo publicas, avísame, tiene buena pinta.
Eres un máquina!
jajajajaja, no te creas, son cosas que ya existen pero que modifico para adaptarlas a los proyectos.
Muy bueno el tuto!
Por cierto un par de preguntas?
-Si yo quisiera mandar datos de los sensores de arduino a la raspberry me haría falta otro cable del arduino tx a rx de la raspberry?
-El processing no es un programa para diseñar circuitos? como se puede mandar acciones a la raspberry a traves de ese programa? es la única mánera?
muchisimas gracias
1-Si, así es, necesitas otro cable, pero también debes convertir la tensión de Arduino que es de 5V a la de la Raspberry Pi que es de 3,3V.
2-No, el processing es un entorno de desarrollo para programar animaciones gráficas. Pero al ser multiplataforma y tener acceso a sockets y el puerto serie me ha venido bien para el proyecto. Existe otras maneras, pero depende de en qué sistema operativo estés.
muchisimas gracias!
me has abierto los ojos!
Espero que sigas publicando cosas tan interesantes como estas con la raspberry!
un saludo!
Hola muy buenas.Gracias x compartir !! Una pregunta, mediante la GPIO de la RP no es posible controlar los motores ? supongo q no ya q hay muchos proyectos con RP&Arduino .Entonces q uso tiene la susodicha GPIO . Por ultimo q shield de motores usaste ?
Gracias de nuevo y sorry si las preguntas son muy obvias !
Enjoy !
Hola, gracias a ti por el comentario.
En cuanto al GPIO, podría manejar los motores pero a través de un driver. Lo hice así porque con Arduino podía controlar más cosas además de los motores (leds, botones, bumpers, etc). EL GPIO de la Raspberry Pi está bien, pero es un poco más complejo programarlo que usando Arduino y además tienes que convertir los niveles de tensión de 3,3 a 5v.
No he puesto el enlace de la shield que use porque ya está descatalogada, pero es esta http://playground.arduino.cc/MotorControlShieldV3/0
Buenas tardes.
Estoy tratando de ayudar a un niño con un proyecto y lo tengo bastante avanzado, pero me quedo colgado en programacion de arduino y veo que eres una maquina en esto.
Si pudieras ayudarme te lo agradeceria y remuneraria que el tiempo no se regala.
Un saludo y gracias
Te puedo orientar en cosas concretas, pero no me puedo implicar, por tanto si necesitas mucha ayuda siempre puedes ir a los foros de arduino que ahí hay gente con mucha experiencia.
Perdoname.. tu pagina se sale porque son proyectos que no se encuentran normalmente.
Sigue asi
oye disculpa,
pase todo el codigo del arduino a python
para no usar el arduino, pero cuando
le stoy presionando hacia atras y luego al mismo tiempo presiono hacia la derecha, truena el programa.
Ya que data en tu codigo, cuando se presionan esas 2 teclas da como resultado «:» en lugar de un numero
como se podria resolver esto?
Es correcto, el caracter ASCII «:» es 3A en hexadecimal o 00111010 en binario. Luego si te fijas en el programa de Arduino le resto al valor que recibe 30 en hexadecimal, por lo que se quedaría en 0A o 00001010, que es el código para ir atrás y a la derecha.
También podríamos conectar arduino y raspberry pi mediante un cable Usb para poder enviar y recibir sin convertir voltajes? Aunque habría que poner un hub usb ya que sólo se dispone de dos en raspi.
Exacto. Ahora que ya está a la venta la cámara de la Raspberry Pi y tiene su propio conector en la placa, se puede aprovechar la clavija usb disponible para conectar el arduino.
Buenas!!
Un post cojonudo y didactico! una duda, desde el motor shield conectas unos servos que has comprado o directamente los motores originales del coche RC?
saludos
La conecto directamente a los motores del coche RC. Un motor es el que se encarga del giro y el otro del empuje.
entiendo que los motores del RC eran del tipo servo también ¿no?
mil gracias
te dejo una forma de ver el video casi
en tiempo real ,me ha gustado muncho tu
tutorial.gracias por compartir tus conocimientos:
el video esta en youtube:Raspberry pi camara en castellano
hola me agrado bastante tu proyecto, estoy empezando con la comunicación de sockets y me llamó bastante la atencion tu explicacion :D, solo tengo una duda que tal vez sea muy básica pero pues quisiera saber. La direccion IP del codigo en Python host=’ ‘ ,a que se refiere que toma la IP del raspberry ?
No, indica que escuche en todas las interfaces de red. Tu puedes hacer que un socket escuche por una sola tarjeta de red o por todas.
ok, creo que ya le estoy agarrando, disculpa que te moleste nuevamente mi duda es si puedo poner en la raspberry un ip de host diferente al ip de la tarjeta y comunicarme a través de este ?
No entiendo tu pregunta.
Muy buen post, me ha encantando. Voy a intentar lo hacer haber que sale ;), me has hecho ganas .
Pero tengo una duda como van conectado los pines entre el motorshield y el arduino ? y los motores al motoshield ?
Saludos y muchas gracias !
El motorshield es un shield de Arduino y se acopla a este por encima, no se si te refieres a eso.
Muchas gracias, es que realmente entiendo todo el montaje menos la parte esa del arduino con el motor shield, por que nose como funciona ni que es realmente el motorshield, es algo así el componente? :
http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=151185020&cPath=1342&gclid=CMii8oTXq7sCFfHMtAodIUEAcg
o bien es un arduino uno:
http://www.adafruit.com/products/50
con un shield insertado en el arduino (pero de cuantos pins y donde lo inserto ? es mi otra duda):
http://www.adafruit.com/products/85
Es que lo tengo todo claro menos la parte del motor shield y el arduino…
Muchísimas gracias !
Vale creo que ya lo entiendo… tengo que pone sobre el http://store.arduino.cc/index.php?main_page=product_info&cPath=11_12&products_id=195 (arduino uno) el motor shield http://arduino.cc/en/Main/ArduinoMotorShieldR3, correcto ?
Exáctamente, eso es.
Hola, se podría usar en vez de WiFi una tarjeta sim con 3g..
Podia ser posible??
Un saludo y gracias
Si que se podría, lo único que la velocidad de envío de imágenes y la latencia de estas sería peor.
Gracias por la respuesta.
Pero para usar una tarjeta 3g seria lo mismo pero imagino que tendría que usar … Un USB con tarjeta?? O una placa de arduino con sin 3g.
Gracias…
Si, sería sustituir el usb wifi por el usb 3g.
ok. pues voy a intentarlo montarme uno pero con la camara de raspberrry.
si tengo algun problema me echaras un cable??
no creo que sea muy dificil..
un saludo y gracias.
Hola bueno días,ya he empezado con el proyecto y me ha surgido un problema cuando escribo el programa servidor.py (el de la parte de la raspberry pi), una vez lo escribo y lo ejecuto desde la terminal (con el comando python servidor.py )me sale :
File «servidor.py»,line 3,in import serial
ImportError: No module named serial
He mirado que la raspberrey pi tenga el python actualizado a la última versión pero me dice que si, esta intalada la última versión.
Así que no se por donde tirar, me he quedado estancado en el proyecto…
Muchas gracias !
En el artículo hay un serie de paquetes que indico que hay que instalar, ¿lo has hecho?
Hola,
Un trabajo muy bueno. Estoy tratando de usar el codigo que has puesto en la Rasp para hacer un bridge de comunicacion entre una aplicacion en C# y una arduino. La Rasp recibe datos x ethernet y los transmite x serie. El problema es que quiero hacerlo bidireccional (para recibir datos). He usado un conversor de niveles y la parte de comunicacion serie funciona perfectamente pero como el programa que has hecho esta siempre a la espera de recibir datos no se como hacer que tambien escuche en paralelo el puerto serie para transmitir los datos al programa en c#. No se si puedes echarme una mano.
Muchas gracias
La recepción en el socket es bloqueante, para comprobar si existen datos antes de hacer el recv tendrías que usar el select: http://docs.python.org/2/howto/sockets.html#non-blocking-sockets
Deje un poco apartado el proyecto por el tema de los examenes pero ahora ya he vuelto, pero con algun problemilla. Bien te explico, he probado por una parte el programa servidor.py en al raspeberry y todo perfecto desde mi pc la raspberry pi recive informacion ya que he hecho que haga unos prints por pantalla, donde en terminal me aparece la tecla que pulso. Bien el problema un tanto extraño es ahora cuando conecto el arduino con el programa ya cargado en la raspberry pi, la raspberry pi de me apaga. Puede que sea porque mi raspberry esta conectada a la luz con el cargador de mi movil y este no le proporciona suficiente corriente ? De ser eso que solución me aportas.
Bien y mi otra duda..es a la hora de alimentar el coche has dicho que gastamos una bateria tipo esta ? :
http://dx.com/es/p/mystery-7-4v-1200mah-25c-rechargeable-li-po-battery-for-300-below-300-r-c-helicopters-37151?tc=EUR&gclid=COD4zZe11rwCFXGWtAodWj8AWg#.UwO1bUJ5Oho
que por una parte irá conectada directamente al arduino (mi duda es como ? no se por donde he de alimentar ya que mi arduino uno puede aliementarse por usb, que lo utlizo para conectarme a mi raspberry y otro el que es una conector de alto voltaje) y realemente nose como conectar los cables que salen de mi bateria trasformarlos de alguna forma para conectarlos al arduino y la otra duda de conexión es, como conector la bateria al regulador y el regulador a la raspberry.
Muchas gracias por todo y saludos !
Hola, me gustaría saber si me compro en vez de una placa arduino uno y un wifi, directamente compro una placa «arduino wifi shield»
Querría saber si funcionaria de la misma manera. Gracias
No, dado que ni se podría ejecutar el programa en python ni se podría visualizar la imagen.
Hola, he cogido y he desmontado este rc Nikko 150040A Savanna y por dentro tiene una placa a la que se conectan: dos cables que vienen que vienen del motor de las ruedas delanteras, otros tres cables de las traseras(siendo uno de ellos que va conectado a tierra), y luego uno que va de la placa a donde va conectada la pila y de ahi sale otro al interruptor y del interruptor a su vez uno qe vuelve a la placa; lo normal. Me gustaria saber como conecto el rc al arduino motor shield, que cables salen del rc y a que pines se conectan del arduino.
Me puedes aclarar bien por favor, como conecto los dos motores del rc a la shield. ¿cada cable de los motores a que pin de la shield va conectado? Gracias
En la motor shield no hay pines, hay 2 bloques terminales de 2 entradas cada uno donde colocas los dos cables de cada motor.
Los motores que conectas al arduino son dos motores de continua? Como puedo probar una vez conectados los motores y metido el programa en el arduino que funciona bien? Que va hacia adelante, atras, que gira sin la raspberry unicamente habiendo conectado el arduino con el coche
Si, son motores de continua. Para manejarlos, mejor mira el artículo que escribí hace tiempo http://www.sistemasorp.es/2010/07/03/robot-con-arduino-motorshield-modulo-bluetooth-y-camara-portatil/
Lo primero me gustaria saber si este motor shield podria valer:
http://dx.com/es/p/ardumoto-l298p-motor-driver-shield-for-arduino-163089#.UyHAFvl5Oz2
Y luego queria saber la funcion que tiene el regulador UBEC.
Gracias
Si, valdría. Pero no se si tendrás que modificar el código para adaptarlo a esa shield.
La función viene explicada en el artículo.
Entonces si pongo este motor shield, no habria que cambiar el programa. Seria meter el programa tal cual http://arduino.cc/en/Main/ArduinoMotorShieldR3#.UyLt1Jm0rFp
No es la misma shield, la shield que tengo es http://playground.arduino.cc/MotorControlShieldV3/0 y tiene los pines distintos a la que comentas.
Si ya me he comprado esa shield como tendria que modificar el programa.
Otra duda: para meter el programa en la raspberry necesito que sea en Linux?
O se puede usar el programa Python en Windows de la misma manera?
No lo se, puede haber varias formas de controlar una shield con motores, tendrás que buscar ejemplos de código en internet de esa shield.
El python se ejecuta en la Rapsberry y esta sólo tiene Linux.
Me han dicho que la version de motor shield tuya ya no se hacen, que ahora hacen esta.
Entonces qeria saber como tu estas mas puesto en el tema de arduino, si me puedes echar una mano para ver que tengo que modificar del programa. Gracias me hace mucha falta
Hola,
Me he comprado la bateria lipo que indicas, pero queria saber como va conectada a la raspberry.
Ya se que dos cables van conectados al arduino, pero luego salen tres cables mas de la bateria que he comprado( uno rojo, blanco y negro) cuales conecto a los pines GPIO de 5v y GND y cual de los tres dejo sin conectar
Un saludo.
Los dos cables van al arduino y al UBEC y después del UBEC a la Raspberry PI, tal como pon en el artículo. Los otros 3 sólo sirven para cuando cargas la batería.
Vale si perdona.
Entonces del Regulador conecto dos cables a la raspberry en los pines que dices, pero en la foto del principio no los conectas a esos pines. Ya que el de 5v y GND son los pines primero y tercero respectivamente y tu los cables se ve que los conectas a los pines segundo y tercero de la raspberry.
Otra cosa, este regulador serviria:
http://es.aliexpress.com/item/DC-DC-Converter-Regulator-12V-to-5V-3A-15W-Car-Led-Display-Power-Supply-Module/994518048.html
Eso es porque los dos primeros pines (en realidad p2 y p4) están conectados como un puente: http://elinux.org/RPi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29
No, ese regulador no sirve, ya que necesita 12 Voltios y una Lipo no te da ese voltaje. Mejor un UBEC como indico.
Ahora mucho mejor, entonces daria igual que lo conectase a p2 o p4?, o como te he dicho los pines primero y segundo en el lado derecho.
Entonces esta pila lipo valdria: http://www.ebay.es/itm/221387923128?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2649
Y este regulador: http://www.ebay.es/itm/Hobbywing-3A-UBEC-5V-6V-max-5A-Lowest-RF-Noise-BEC-regulador-radio-control-lipo-/221382046148?pt=LH_DefaultDomain_186&hash=item338b65f1c4&_uhb=1
Si, da igual conectarlo a p2 o a p4. Ambos productos valen, pero en el caso del regulador que es de 5V y de 6V, tendrás que fijarte bien en poner el jumper correcto.
Y como tendria qe hacerlo para poner el correcto??
Ya tengo el regulador UBEC, los cables de la entrada van conectados a la bateria lipo.
Pero luego de la salida salen tres cables(rojo, negro y blanco), el rojo que va al pin 5v de la raspberry, el negro va al pin GND y que hago con el blanco. Lo corto?
Si, córtalo, no sirve para nada en este caso.
Hola buenos días:
Primero de todo enhorabuena por el articulo, nos esta sirviendo un monton.
Estamos haciendo un proyecto muy similar para una asignatura (ingeneria industrial) y teniamos un par de dudas.
Primero de todo nos gustaria saber si el processing te permitiria crear una interfaz para el ordenador mas «friendly» y si conoces algún buen tutorial que nos permita aprender un poco. Si no es posible, habria alguna forma de hacer lo que has hecho con el processing con C#?
Otra duda que tenemos es sobre la alimentación. No tenemos el regulador y lo que tenemos son 4 baterias lipo de 3.7 voltios y tenemos que alimentar la raspberry, el arduino y el motor que queremos alimentar el motor mas o menos a 14 voltios. Nuestra idea era conectar las baterias en serie y alimentar al motor en paralelo, y luego desde los 7’4 voltios alimentar arduino y raspberry en paralelo, pero no tenemos mucha idea de si alimentar por encima de los cinco voltios seria dañino ni de si es inviable alimentarlo así. Es decir queremos saber si es totalmente necesario el regulador.
Luego puesto que el coche va a ser pilotado nos gustaria saber si existe alguna forma de disminuir el retraso de la imagen. Tenemos tanto una picamera que se conectaria por pines como una webcam y una eyetoy (lo que pasa es que estas nos estan dando mas problema).
Luego, nosotros la conexión entre arduino y raspberry, puesto que no conociamos la forma en la que las has conectado aqui, habiamos pensado en hacerla utilizando los pines de I2C, puesto que tenemos que enviar los datos de alante, atras, derecha, izquierda, y los de dos servos mas que mueven un pal&til donde va la cámara, y además pedirle al arduino el valor de los sensores de distancia (ultrasónicos). Podría hacerse usando los puertos RX y TX o debemos usar el I2C?
Por último no entiendo muy bien como controlas la velocidad del motor sin encoder ni nada. Nosotros habiamos pensado programar en la raspberry el bucle de control de la velocidad del motor y otro de seguimiento de pared y no teniamos muy claro de si era mejor hacerlo en la Raspberry o en el arduino. Por lo que entiendo del código de arduino, el motor que usas ya trae su propio regulador y le puedes especificar la velocidad?
Un saludo.
Muy agradecido, Javi
Hola
Vamos a ir por partes porque son un montón de preguntas:
Processing: Los mejores tutoriales están en la propia página de Processing. Se pueden incluir librerías de interfaces gráficas http://www.processing.org/reference/libraries/#gui. En C# se puede hacer igualmente, lo hice en processing para que funcionase tanto en Windows, GNU/Linux u OS X; pero podeis hacerlo en python, c#, java o cualquier otro que tenga sockets.
Alimentación: La Raspberry Pi tiene que funcionar a 5V siempre por lo que tendreis que usar un regulador, mi recomendación es un UBEC por lo sencillo, eficiente, potente y barato que es, pero podeis usar otras alternativas como un LM2576, LM2596 o un 7805 aunque con un disipador. Al Arduino se recomieda alimentarlo desde 7V a 12V (aunque con 14V no habría problema).
Retraso en la imagen: Se puede hacer que se vea en tiempo real con la picamera, te paso el enlace de mi artículo al respecto http://www.sistemasorp.es/2013/06/09/retransmision-en-tiempo-real-con-la-camara-de-la-raspberry-pi/
Datos: Os recomiendo el puerto serie por lo sencillo que es, eso si, teneis que usar un conversor de niveles cuando conecteis el TX del Arduino que funciona a 5V hacia el RX de la Raspberry que es de 3,3V para no estropear esta última. En mi caso no lo he usado porque el Arduino solo recibe ordenes (y desde el RX del Arduino se puede leer el TX de la Raspberry sin conversión), pero en vuestro caso si va a ser necesario. Pongo aquí un enlace a un tutorial de cómo hacer la conversión http://www.olimex.cl/tutorials.php?page=Guia-de-Diseno-de-Interfaz-de-sensores
Velocidad del motor: Yo lo tengo fijo, pero como funciona por PWM se puede cambiar la señal para que el motor vaya más rápido o más lento. Como recomendación, todo lo que sean sensores y actuadores (los motores y los servos) hacedlo desde Arduino y toda la lógica de envío de imagen (y procesado si quereis usar OpenCV) y comunicaciones wifi en la Raspberry Pi.
Nosotros construimos un projecto similiar pero usamos una tarjeta IOIO en vez de una Arduino. Aqui puedes ver el resultado:
http://youtu.be/vkvkfcqEUkk
Muy interesante. ¿Teneis alguna página donde comenteis el proyecto?
Me he descarcagado el Raspbian en la sd, tengo que instalar esto:
sudo apt-get update
sudo apt-get install gstreamer-tools gstreamer0.10-plugins-bad gstreamer0.10-plugins-good v4l-utils python-serial
sudo chmod a+rw /dev/ttyAMA0
¿O donde tengo que ejecutar estas funciones? ¿Y para que sirven?
Pero eso es lo más básico que tienes que saber de linux, sino no se puede avanzar mucho. Si buscas por intenert hay millones de páginas explicando lo que es un apt-get y un chmod y cómo se ejecutan.
Yo he seguido este tutorial: https://www.youtube.com/watch?v=15rQBahf_Wo
Una vez que estoy en el menu de raspberry, que tengo que hacer.
Me lo podrias explicar paso a paso que a partir de la conexion con arduino estoy un poco perdido. Gracias
¿has accedido a la consola Raspberry por ssh o directamente desde un monitor y teclado? Es ahí donde tienes que meter los comandos.
Yo también use tu proyecto para construir el mio, te dejo el link.
http://www.MarioFmz.com
Un saludo y gracias por toda la información que has publicado.
Gracias Mario, pero leyendo tu artículo no he visto ningún enlace a la página original del proyecto, ni que hayas puesto la autoría del código fuente de Processing y Arduino.
Correcto se me debió pasar lo modifico , inmediatamente . Un saludo
Pingback: Coche Rc. Controlado a través de conexión wifi con Raspberry pi&Arduino PARTE2 | MARIO´S ROOM
Desde el monitor y teclado, creo que eso lo he entendido. Otra duda me he comprado esta webcam: http://www.mercadoactual.es/camaras/video/webcams/approx-appwc02w-299951.html
¿Tengo que cambiar algo o necesito hacer algo para configurarla?
Si, desde ahí, ¿y accedes con el usuario pi y contraseña raspberry? La cámara tiene que ser compatible con V4L, no se si esa lo es.
Exacto he accedido de esa forma me conecto.
Como veo si es compatible?
Cuando creo el fichero servidor.py donde pone host = » ¿Entre los dos guiones tengo que poner la ip? ¿ o es un espacio en blanco?
Ya he metido los tres primeros comandos, tambien los dos ficheros tanto servidor.py como webcam.sh. Pero ahora cuando me conecto mediante Putty
y habiendo conectado todo bien.
Al meter sh webcam.sh me pone esto:
ERROR: pipeline could not be constructed: no element «v412src»
Es que has puesto dentro del fichero webcam.sh el texto v412src en vez de v4l2src. Es una L minúscula no un uno.
Cuando creo el programa servidor.py lo hago tal cual? O tengo que poner algo donde pone host=»?
Y luego como se si es compatible la webcam?
Simplemente sigue las instrucciones del artículo. En cuanto a la webcam, busca la por internet a ver si otra gente la ha usado con linux.
Lo primero muchas gracias por tu pronta respuesta que se me paso darte las gracias.
Hemos decidido hacerte caso en lo del regulador y no hacer inventos raros, pero el único que habia en la tienda era un SBEC y no un UBEC y estuve leyendo un poco y parecia ser que funcionaria igual. Lo que nos extraño un poco fue que venia con una anilla de ferrita que no tenemos muy claro para que sirve.
La comunicación en principio vamos a hacerla en I2C porque la hemos usado ya alguna vez este curso y nos ha ido medianamente bien. Pero si vemos que no nos furula lo haremos usando el puerto serie.
Muchas gracias por el articulo de el streaming en directo, funciono perfectamente.
Ahora estoy peleandome con la interfaz del ordenador, la estoy haciendo en processing y la verdad es que es bastante intuitivo y facil de usar, lo que no me termina de salir es meter el MPlayer que se genera del streaming en directo dentro del programa. Sabes como se podria hacer? A unas malas si no me sale acabaremos abriendo las dos cosas a la vez.
Muchas gracias 😉
Vale, os va a servir igual el SBEC. El núcleo de ferrita creo que era para estabilizar la tensión.
Yo lo hago así, abriendo dos ventanas distintas.
Mola, muchas gracias. Ya subire el proyecto cuando lo tengamos mas avanzado.
Un saludo.
Al final estamos trantando de hacer la comunicación por USB porque las demas opciones nos estaban dando muchos problemas. Me gustaría saber como nos afecta hacerlo así a la hora de alimentarlo ya que la raspberry esta alimentando el arduino por el USB y no sabemos si funcionara así.
Un saludo.
Bueno, no debería haber problema si además el Arduino lo alimentáis con otra fuente para que pueda funcionar la motorshield.
He seguido todos los pasos y la webcam me funciona correctamente, solamente que la imagen va un poco lenta. Hay alguna manera de que la imagen no vaya con tanto retraso
Otra cosa, lo unico que no me funciona es cuando arranco el Processing. Compilo el programa cambiando la ip y me salta una ventana gris, pero no me funciona. ¿cual puede ser el problema?
Gracias
Que vaya más rápido depende de la calidad de la webcam y de si estas conectado por wifi mediante ad-hoc o no.
No lo se, ¿está en la Raspberry Pi el programa en python ejecutandose antes de arrancar el programa de processing?