¿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:
Si, yo abro mediante el putty la sesion sh webcam.sh despues la otra sesion python servidor.py
Luego arranco el VLC y se ve la imagen
Pero cuando abro el Processing me salta el cuadro gris, pero cuando doy no funciona nada.
Creo que el problema esta cuando ejecuto mediante putty la sesion de python servidor.py me pone esto:
Traceback (most recent call last):
File «servidor.py», line 4, in
ser=serial.Serial(‘/dev/ttyAMA0’),115200)
File «/usr/lib7python2.7/dist-packages/serial/serialutil.py»,line 260, in_init__
self.open()
File «/usr/lib7python2.7/dist-packages/serial/serialposix.py»,line 276, in open
raise SerialException(«could not open port %s:%s» % (self._port, msg))
serial.serialutil.SerialException:could not open port /dev/ttyAMA0: [Errno 13] permission denied: ‘/dev/ttyAMA0’
Al final me dice que no puedo abrir el puerto pero no lo entiendo
Gracias
¿Has ejecutado el chmod que aparece en el artículo?
Si lo ejecuto pero no me sale nada. Es decir meto el chmod y directamente me salta otra linea. Como si no se ejecutara nada.
Cuando ejecuto el chmod, lo hago sin ninguna conexion con el arduino. Solamente tengo la raspberry conectada mediante wifi e instalo anteriormente los dos comandos, luego el chmod y los dos programas(servidor.py y webcam.sh)
Una vez que he instalado todo eso, paso a hacer todas las conexiones con el arduino y me conecto mediante putty.
Tengo que tenerlo conectado con el arduino cuando meta los comandos y el chmod?
No, en principio no hace falta tenerlo conectado. El error que te da es que no tienes permisos para usar el puerto serie de la raspberry pi. ¿Puedes ejecutar un
ls -la /dev/ttyAMA0
y ponerme lo que te sale?Ya he solucionado ese problema, con el putty he puesto el chmod y despues he ejecutado el comando python servidor.py
Y me salta espera una conexion
Despues meto el Processing y me pone conectado mas la ip de mi ordenador
Pero le doy por ejemplo a la tecla de hacia delante y al rato empieza a andar hacia delante pero sin parar
A la hora de ejecutar un ls -la /dev/ttyAMA0
Me aparece esto:
crw-rw—- 1 root tty 204, 64 Apr 16 15:17 /dev/ttyAMA0
Pero eso es antes de hacer el chmod, verdad?
El chmod ya lo he ejecutado
Algo raro pasa, tendría que salirte crw-rw-rw– No se están dando los permisos de lectura y escritura a otros. ¿el chmod lo estas ejecutando con el sudo delante?
Ahora mismo el problema que tengo es: que cuando ejecuto python servidor.py me sale «se espera una conexion»
Luego arranco el Processing con la ip de mi raspberry y en el putty me pone «conectado» y la ip de la raspberry
Pero cuando le doy al teclado de mi ordenador no se mueve el coche
No me cuadra con el anterior mensaje http://www.sistemasorp.es/2013/03/23/televigilancia-con-un-coche-rc-arduino-y-la-raspberry-pi/#comment-53976 donde dices que te sale la ip del ordenador y el coche si se mueve.
Vale si ya me sale esto:
crw-rw-rw- 1 root tty 204, 64 Apr 16 15:44 /dev/ttyAMA0
A ver yo ejecuto el Processing y me salta el cuadro gris, pero le doy para que se mueva y nada.
Lo que me sucede es que si desengancho el cable de conexion entre arduino y raspberry(el pin TX de la raspberry pi el que se conecta al pin RX de arduino)
Pues el coche empieza a moverse y nose porque
Ok. Ya lo he entendido. ¿Qué motor shield tienes puesto?
El ardumoto este: https://www.sparkfun.com/products/9815
Bien, como es distinto al que yo tengo, en el programa de Arduino debes cambiar las 4 primeras lineas por estas:
int dirA = 12; // sentido
int dirB = 13; // direccion
int speedA = 3; // velocidad del motor
int speedB = 11; // parada o encendido de la dirección
Prueba ahora a elegir la ventana de processing con el ratón y a continuación pulsar las teclas de dirección (arriba, abajo, izquierda y derecha)
Si, el codigo que tenia en el arduino es el mismo, solamente habia cambiado el 10 por 3 porque en el ardumoto era diferente.
Te voy a decir los pasos por si me estoy confundiendo en algo. Una vez que tengo metido el programa en el arduino, meto los tres comandos y los dos programas de raspberry(servidor.py y webcam.sh). Hago todas las conexiones. Ejecuto con el putty el fichero sh webcam.sh hasta aqui todo correcto
Luego ejecuto python servidor.py y me salta:
Traceback(most recent call last):
File «servidor.py», line 4, in
ser=serial.Serial(‘/dev/ttyAMA0’,115200)
File «/usr/lib/python2.7/dist-packages/serial/serialutil.py», line 260, in__init__
self.opne()
File «/usr/lib/python2.7/dist-packages/serial/serialposix.py», line 276, in open
raise SerialException(«could not open port %s:%s» % (self._port, msg))
serial.serialutil.SerialException:could not open port /dev/ttyAMA0: [Errno 13] permission denied: ‘/dev/ttyAMA0’
Entonces lo que hago es poner sudo chmod a+rw /dev/ttyAMA0 y despues otra vez python servidor.py y me sale se espera una conexion
Luego me conecto al VLC y me sale la imagen de la webcam sin problemas
Por ultimo me voy al Processing y lo ejecuto, me salta la ventana gris y a la vez en el putty me sale como conectado y la ip de mi ordenador, luego pincho la ventana gris y le doy a las teclas pero el coche no se mueve.
Pon al final del fichero servidor.py un
print data
(al mismo nivel de identación que ser.write) y haz lo mismo, ¿te salen números en el putty después de «conectado» cada vez que pulsas una tecla?He cambiado el codigo pero al ejecutarlo me pone esto:
File «servidor.py», line 23
print data
^
Indentation Error: expected an indented block
Por eso te he dicho antes que lo pongas en el mismo nivel de identación. La p de print tiene que coincidir con la s de ser
Vale si ya me salen numeros:
Cuando dejo pulsado la tecla de arriba me sale 1 cuando la suelto me sale un 0
Cuando dejo pulsado la tecla de abajo me sale 2 cuando la suelto me sale un 0
Cuando dejo pulsado la tecla izquierda me sale 4 cuando la suelto me sale un 0
Cuando dejo pulsado la tecla derecha me sale un 8 cuando la suelto me sale un 0
Muy bien. Eso confirma que la raspberry pi recibe los carácteres que le envía el processing desde tu ordenador. Ahora vamos a ver que tengo alguna sospecha de la distribución de linux. Ejecuta estos comandos en la consola una sola vez:
sudo wget https://raw.github.com/lurch/rpi-serial-console/master/rpi-serial-console -O /usr/bin/rpi-serial-console
sudo chmod +x /usr/bin/rpi-serial-console
sudo rpi-serial-console disable
Reinicia la raspberry Pi Y prueba de nuevo el programa.
Ya he metido los comandos, cuando ejecuto el ultimo me pone Serial console has been disabled, a reboot is required to make this take effect
Si estoy con el Putty como hago para reiniciar? Directamente cierro esta sesion y abro otra?
en el mismo putty pon
sudo reboot
. Luego pasados unos segundos tendrás que volver a conectar.Me siguen saliendo los numeros, pero nada el coche ni se mueve.
Lo unico que veo, es que cuando desconecto el cable entre el arduino y la raspberry el coche empieza a moverse sin ningun sentido.
Donde puedo tener el fallo?
Vamos a hacer otra prueba, sube esto al arduino y mira si el coche se mueve hacia delante cada 5 segundos durante medio segundo:
int dirA = 12; // sentido
int dirB = 13; // direccion
int speedA = 3; // 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 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()
{
analogWrite(speedA, velocidad);
alante();
delay(500);
digitalWrite(speedA, LOW);
delay(5000);
}
Exacto se mueve medio segundo, no hace nada en 5 segundos y vuelve moverse medio segundo y asi todo el rato. Todo correcto
Creo que el fallo puede estar en la comunicacion entre el arduino y la raspberry. Las conexiones las he mirado y estan bien. Pero yo pienso que puede ser algo con la configuracion de las comunicaciones que a lo mejor para el ardumoto es diferente, pero no lo se
Todo funciona excepto la comunicación por el puerto serie. ¿Tienes normalmente conectado el cable usb del ordenador a Arduino? si es así quitalo y prueba de nuevo.
Una vez que meto el programa en el arduino desconecto el cable. Como puedo comprobar si esa comunicacion por el puerto serie funciona bien.
Voy a volver a instalar todo de nuevo, voy a formatear la sd de la raspberry e instalo todo de nuevo
Pero para el arduino con instalar de nuevo el programa es suficiente no? O se queda algo guardado en otro lado? Para limpiar el arduino?
Si, si lo subes al Arduino es como empezar de 0. Ahora no tengo tiempo, pero antes quiero probar contigo un par de ejemplos más. Mañana te los comento.
Una pregunta, ¿la raspberry pi tiene una alimentación distinta a la del arduino? Cuando me refiero a distinta es a que la raspberry pi tiene el ubec con una batería y el arduino tiene otra batería distinta.
No no yo alimento el arduino con la bateria de 7,4V y a esta misma conecto el UBEC que luego va a la raspberry.
Te voy a decir los pasos que hago por si lo estoy haciendo mal pero creo que no. Primero meto el programa al arduino, despues me conecto a una tele con la raspberry y activo el wifi usb. Luego desde la terminal de raspberry mediante la television con un teclado y raton y conectado al wifi meto los tres comandos indicados.
Despues paso a crear los dos ficheros, se crean con el comando nano no? Es decir nano servidor.py y luego nano webcam.sh
Se hace asi desde la terminal no?
Una vez hecho eso conecto la pila al arduino y tambien a la raspberry, conecto el cable entre arduino y rasperry y conecto la webcam.
Despues ejecuto el putty y meto los comandos siguientes paso a paso. Y nada el coche sigue sin funcionar
Si, es correcto. Aunque los apt-get sólo los tienes que ejecutar una vez. Prueba una cosa, pon un cable desde el pin GND del arduino hasta el pin 14 de la Raspberry:
Pingback: SISTEMAS O.R.P » Blog Archive » Retransmisión en tiempo real con la cámara de la Raspberry Pi
En la actualizacion que has hecho es necesario modificar los dos ficheros? Es que me pone permiso denegado y no me deja hacerlo
Ya he conectado el cable que me has dicho, pero nada sigue sin funcionar. El arduino tiene tres pines de tierra da igual a cual lo conecte no?
Creo que el problema sigue siendo que la raspberry no se comunica como es debido con arduino porqe cuando desconecto el cable entre arduino y raspberry y con la pila puesta y el ubec conectado empieza a moverse sin sentido el coche
Si, es necesario, tienes que hacerlo con
sudo nano
.Da igual, cualquier pin de tierra te vale, prueba a desactivar la consola serie como he puesto en la última edición y prueba de nuevo.
Lo que comentas es raro, ya que sólo se debería mover si recibe los bytes correctos, es decir 0x31, 0x32, 0x34 o 0x38. Vamos a hacer otra prueba, instala el screen en la Raspberry Pi con
sudo apt-get install screen
y luego en vez de ejecutar el python servidor.py ejecutasudo screen /dev/ttyAMA0 115200
y escribe en la misma pantalla del putty los números 1, 2, 4 y 8 a ver si se mueve el coche.Si no funciona me empiezo a temer que el puerto serie de tu Raspberry Pi o el Arduino estén defectuosos.
El cable que tengo conectado de arduino a raspberry, esta soldado con estaño a la patilla de la raspberry. Eso no creo que influya no?
Ya tengo conectado el cable de tierra. he instalado el screen, pero al ejecutar sudo screen /dev/ttyAMA0 115200 le doy a los numeros, pero en la pantalla del putty no sale nada, ni tampoco se mueve.
No, no tiene por qué influir.
Los carácteres no salen porque no está puesto el eco (se envían al arduino pero no se muestran de vuelta).
¿Puedes hacerme una foto de cómo quedan los cables, subirla a http://postimg.org/ y poner aquí el enlace?
Aqui tienes unas cuantas fotos:
http://postimg.org/image/c63rjuux1/
http://postimg.org/image/uzpkgut51/
http://postimg.org/image/4sodkwav9/
http://postimg.org/image/upi1xieit/
http://postimg.org/image/sslbsxnut/
http://postimg.org/image/l68d41r0l/
http://postimg.org/image/wjuwf91j9/
Pues aparentemente está bien. ¿Tienes un polímetro? ¿Podrías medir la tensión que hay en el pin TX de la Raspberry Pi?
No aqui no, pero mañana lo podria medir.
No habria ninguna forma de que me lo pudieras revisar en persona? Me seria de gran ayuda, lo necesito para un proyecto. Gracias
Vamos a hacer otra prueba, aunque tendrás que prescindir de la webcam. Conecta un cable usb desde el arduino a la Raspberry Pi (quita los cables del RX y GND del Arduino). Cambia en el fichero servidor.py la línea
ser=serial.Serial('/dev/ttyAMA0', 115200)
porser=serial.Serial('/dev/ttyUSB0', 115200)
y prueba de nuevo a ver si funciona.Me han dejado un polimetro, en la raspberry mide 4,97V y he medido en el arduino y mide lo mismo. la conexion que tengo hecha es correcta.
He medido la tension que le llega a la raspberry mediante el UBEC y es de 5,13V
4,97 me parece que es exagerado, tiene que ser 3,3 como mucho, ca da vez más me da la sensación de que o la UART del Arduino o de la Raspberry Pi están estropeadas.
Me podrias decir alguna motor shield que funcione con tu programa para comprarla, porque lo unico diferente a tu proyecto es eso.
Por eso me podrias aconsejar alguna y que tarden poco en enviarmelo. Gracias
No creo que sea problema de la motorshield puesto que esta te funciona bien.
Te digo de decirme otra motor shield, porque ayer sin querer junte dos cables y salto un chispazo y he quemado el arduino, no me funciona.
Por lo que tengo que comprar hasta que no me lo traigan no puedo hcer mas pruebas.
Por eso si me dices una motor shield, la pido con el arduino.
La ultima prueba que me dices seria seguir los mismos pasos del proyecto y cambiar unicamente esa linea en el fichero servidor.py no?
Esa motorshield que tienes es buena.
La última prueba es cambiar sólo la línea del fichero servidor.py si, pero también prescindir de los cables que van a del arduino a las raspberry pi y poner un cable usb desde el arduino hasta la raspberry pi.
En cuanto tenga el arduino voy a seguir estos pasos, dime si es correcto lo que hago.
Primero meto el programa al arduino, Despues a parte me conecto con la raspberry solamente a un televisor y en el menu que te sale al principio solo le doy a expandir y cambio el teclado al español, luego conecto el wifi.
Despues voy a conectar la pila al arduino, el UBEC a la raspberry y conecto el cable de arduino al usb que me sobra en la raspberry.
Luego me conecto mediante el putty, instalo los dos primeros comandos, luego edito esos dos ficheros, instalo el siguiente comando que seria asi sudo chmod a+rw /dev/ttyUSB0.
Despues creo el fichero servidor.py mediante el comando nano servidor.py y cambio esto /dev/ttyAMA0 por /dev/ttyUSB0
Luego creo el fichero webcam.sh mediante el comando nano webcam.sh
Despues llamo ejecuto sh webcam.sh
Luego la funcion python servidor.py
Luego enciendo el VLC
y por ultiimo abro el processing y ejecuto el programa tal cual
Se que el fichero webcam.sh y ejecutar su funcion no hace falta porque no tengo webcam conectada, pero si le pongo un adaptador a la raspberry para que pueda conectar 3 usb seria posible?
Correcto con todo. Con respecto a la cámara lo que puedes hacer es usar un hub autoalimentado que se alimente a través del UBEC y conectes a este el wifi, la webcam y la propia raspberry pi. (Como este http://www.amazon.es/exec/obidos/ASIN/B00006B7DA/masmanuti-21#productDetails )
Pingback: “Es importante y necesario que se enseñe robótica en los colegios” | Educación abierta
Buenas:
Estamos terminando ya el proyecto, pero no sabemos muy bien como conectar las Lipo en serie. Nos han comentado que no es tan facil como ponerlas en serie ya que hay que estar constantemente comprobando que no se desequilibren, etc. tiene alguno idea de como podriamos hacerlo?
En mi caso no os puedo ayudar ya que yo las Lipo de 7,4 que uso son comerciales.
Ya tengo el arduino, estoy siguiendo los pasos tal cual, pero a la hora de meter el comando sudo chmod a+rw /dev/ttyUSB0 me pone esto:
chmod:cannot access ‘/dev/ttyUSB0’: no such file or directory
Supongo que tendrás el arduino alimentado a través de la batería y enchufado el cable usb del arduino a la raspberry. Si es así, haz un
sudo ls /dev/tty*
y copia aquí el resultado.Ya me funciona, muchas gracias por todo.
He cambiado en el fichero servidor.py lo que me dijiste por /dev/ttyACM0.
Ya que tengo conectado la pila al arduino y el cable usb a la raspberry y ademas el ubec.
A parte me gustaria hacerte en estos dias unas preguntas sobre los programas utilizados ya que hay funciones que no se el sentido que tienen ni la funcion que empeñan.
Gracias. Un saludo
Enhorabuena, ¿vas a poner el hub usb?
Perdona por tardar en contestar no he tenido tiempo. Si acabo de comprarlo, tengo que modificar algo en algun programa para que vaya la webcam?
Otra pregunta, hay alguna forma para poder manejar el coche desde otro sitio mediante internet?
Gracias
No, todo es igual.
Claro, configura el router para que redirija los puertos 22 (ssh), 1976 (programa) y 5000 (webcam) desde fuera a tu raspberry.
He conectado a los usb de la raspberry, por un lado el wifi y por otro el hub
En el hub tengo conectado el cable del arduino y la webcam.
El programa para mover el coche funciona perfecto, pero cuando ejecuto el comando sh webcam.sh me aparece esto:
Setting pipeline to PAUSED …
ERROR: Pipeline doesn’t want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Could not negotiate format
Additional debug info:
gstbasesrc.c(2830): gst_base_src_start (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Check your filtered caps, if any
Setting pipeline to NULL …
Freeing pipeline …
¿Y si quitas el del hub usb en la raspberry pi y pones la webcam en su lugar te funciona esta?
Si funciona si hago eso
Ahora he conectado, el hub y la webcam a la raspberry.
Y luego al hub he conectado el arduino y el wifi y si que funciona todo.
Por que puede ser?
Me podias explicar o hacer un resumen del funcionamiento por encima del programa servidor.py y de webcam.sh es para hacer un informe del proyecto.
Tambien queria saber porque hay que poner «sh» para ejecutar el programa y despues el nombre del fichero
Al igual que porque ponemos «python» y el nombre servidor.py
No lo se, puede ser por tema de consumos.
El resumen está en el propio artículo.
sh es necesario para ejecutar scripts bash y python para ejecutar scripts python, es simple. Si quieres prescindir de ellos tendrás que dar permisos de ejecución a ambos y poner
#!/bin/sh
en la primera línea de webcam.sh y#/usr/bin/env python
en la primera línea de servidor.py.Me quiero conectar a una red de a universidad, donde tengo que poner la identidad ( que es mi correo) una contraseña (es la que me dieron) y tambien tengo que poner CA certificate. No se que tengo que poner ahi en el CA para poder conectarme al wifi
Ni idea, no puedo ayudarte.
Pingback: Blog@luigdima » Controlar Arduino desde GNU/Linux con PySerial
hola mira soy nuevo con raspberry y me gusto mucho tu proyecto, estoy tratando de hacer lo mismo per cuando trato de hacer el sudo apt-get install me sale esto Package gstreamer-tools is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
libgstreamer0.10-dev
me gustaria saber como puedo corregir eso
mil gracias por tu ayuda.
ola de nuevo ya llegue a la parte donde tengo que reboot mi pi y me sale un problema con el kernel y algo de vfs y se me queda en la pantalla negra con las 4 fresitas y una lista de toda la pantalla y no me hace mas nada no me deja entrar en el sistema nada
me tocara formatear de nuevo la sdcard
en el código de processing que has puesto de donde sacas los valores de las teclas ?
0xFFFFFFFE
0xFFFFFFFD
0xFFFFFFFB
0xFFFFFFF7
es que me gustaría añadirle más teclas para hacer otras funciones pero no se como hacerlo, muchas gracias de antemano.
—————
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;
Muy buenas yo dispongo de un coche 4W y con una placa de motores para arduino L298N, que pines tendría que modificar del programa para seguir funcionando?
Pingback: Ordenar comandos a un robot con tu propia voz y el altavoz de Google Home | SISTEMAS O.R.P