Dicho de otra forma la union de un microcontrolador que da la fuerza con un microprocesador que pone el cerebro.
En esta ocación y como uno de mis apuntes favoritos pasamos al objetivo del proyecto: Comunicar por puerto serial una placa arduino con el raspberry.
Vamos a controlar un LED conectado en el Arduino, este ya estará programado y conectado por USB al raspberry. Mediante Python vamos a tener una comunicacion serial y mandaremos comandos que arduino esta preparado para leer.
Para llevar un orden dividiremos en parte de arduino y parte de raspberry.
Parte Arduino
El montaje es muy sencillo solo colocaremos un led en el pin 13 y en ground, no necesitamos resistencia ya que ese pin ya tiene una resistencia montada.
const int led = 13; //Declaramos el numero de pin para el led que vamos a controlar void setup () { pinMode(led, OUTPUT); //Declaramos el pin led=13 como salida Serial.begin(9600); //Inicializo el puerto serial a 9600 baudios } void loop () { if (Serial.available()) { //Si hay comunicacion serial char c = Serial.read(); //Guardamos en una variable de tipo caracter lo que lea if (c == 'H') { //Si es H (HIGH) prendemos el led digitalWrite(led, HIGH); } else if (c == 'L') { //Si no es H pero si es L (LOW) apagamos el led digitalWrite(led, LOW); } } }
Ahora compilamos y cargamos el programa al arduino.
Parte Raspberry
Ahora en el raspberry previamente debemos tener instalado Raspbian y tener acceso SSH para mayor comodidad, por si se lo perdieron:
Instalando Raspbian en Raspberry –Â Raspberry por SSH
Raspbian ya tiene python instalado solo necesitaremos la libreria para usar la comunicacion serial. Esto lo logramos instalando facilmente desde consola con:
sudo apt-get install python-serial
De aqui en adelante iremos por consola, ahora podemos crear un directorio para nuestro proyecto con
sudo mkdir raspduino
entramos en el
cd raspduino
creamos un archivo python llamado raspduino.py con el codigo siguiente
sudo nano raspduino.py
import serial arduino = serial.Serial('/dev/ttyACM0',9600) while True: comando = raw_input('Introduce un comando: ') arduino.write(comando) if comando == 'H': print('LED ENCENDIDO') elif comando == 'L': print('LED APAGADO') arduino.close()#FINALIZA LA COMUNICACION
guardamos con ctrl+x
Lo que nuestro codigo anterior hace es declarar arduino con como un objeto serial, despues en un bucle infinito pedimos un comando que guardamos en la variable y lo usamos en el metodo write de arduino, luego para visualizar si el comando es H o L y cierra la comunicacion.
Conectando el raspberry y el arduino
Ahora que ya tenemos todo listo podemos conectar el arduino al raspberry por usb y por consola ejecutar el archivo python con:
sudo python raspduino.py
Ahora si colocamos H o L, prende o apaga el led ya que el programa de arduino esta esperando un comando por puerto serial y cuando compara llama a la funcion digitalWrite.
EXTRA PHP
Como extra podriamos ejecutar python desde PHP, hacer un boton que prenda y otro que apague el led, necesitariamos primero tener un servidor web corriendo en el Raspberry.
Instalar apache, mysql y ftp en Raspberry
vamos a nuestra directorio www
cd /var/www
creamos un directorio llamado raspduino
sudo mkdir raspduino
y dentro colocamos o creamos los siguientes archivos:
index.php
<!DOCTYPE html> <html> <head> <title>Raspduino</title> </head> <body> <form action="prender.php"> <button type="submit">Prender</button> </form> <form action="apagar.php"> <button type="submit">apagar</button> </form> </body> </html>
prender.php
<?php $prende= exec('sudo python enciendeled.py'); header('Location:index.php'); ?>
apagar.php
<?php $apaga = exec('sudo python apagaled.py'); header('Location:index.php'); ?>
enciendeled.py
import serial import time arduino = serial.Serial('/dev/ttyACM0',9600) arduino.open() comando='H' if comando: arduino.write(comando) arduino.close()
apagaled.py
import serial import time arduino = serial.Serial('/dev/ttyACM0',9600) arduino.open() comando='L' if comando: arduino.write(comando) arduino.close()#FINALIZA LA COMUNICACION
Ahora si navegamos en culaquier navegador de nuestra red en la direccion de nuestra raspberry:
http://ip-raspberry/raspduino tendremos
Finalmente le di un poco de estilo con bootstrap, pero ese es otro cantar, espero les sirva el tutorial tanto como a mi y esperamos ver sus proyectos.
TIP: Algunos tendran problemas al ejecutar python desde php. Hagan algunas pruebas con los siguientes comandos:
En el directorio donde estan los archivos py
- sudo python enciendeled.py
- sudo python apagaled.py
Si los comandos anteriores prendieron y apagaron el led ahi no tenemos problemas.
Ahora ejecutemos php
- sudo php prender.php
- sudo php apagar.php
Si los comandos fueron correctos entonces no tendran problema al llamar estos desde index.php.
Si el PHP no funciono noten el error y lo que es muy probable es que apache no tenga permisos para ejecutar python. Para solucionarlo prueben dandole permisos
sudo chown -R www-data:www-data /var/www
No tengo a la mano el raspberry pero este fin de semana pruebo el proyecto, gracias por leernos.
Añado los archivos del proyecto para su descarga directa: https://mega.co.nz/#!6AIh1KRA!D_mt9ahvx1-b9Q4ZiuCM9VuNncYoprURTBVceK5y18A
funciona muy bien, pero hay cosas que están malas en la parte de php
en apagar.php hace referencia a index.html y debe ser a index.php
y otra cosa es que esa parte no me hace nada en mi caso. abre la pagina, hago click en encender, pero no enciende
Ya cheque tenia unos codigos que finalmente cambie, gracias por los comentarios
El problema deben ser los permisos, dejame actualizarlo, pero es cuestion que des permisos a la carpeta www y poner a tu user en el grupo correcto
me podrÃas dar luz acerca de eso de los permisos?
muchas gracias
Simplemente ve a la carpeta y dale clic derecho, Propiedades, ve a la pestaña de Seguridad, selecciona el usuario y dale los permisos que requieras, en caso de no saber cuales dale Permitir a todos. Saludos
Muchas gracias por el aporte, he seguido los pasos tal como los sugieres
pero tengo un problema con el botón “prender” que se genera ya que al hacer clic
me manda a otra pagina donde no se muestra nada, en cuando al botón apagar
solo logro que parpadee el led.
te agradezco me puedas ayudar en esa parte.
Buen dia. Realizo los pasos desde php, sin embargo solo se enciende y como que el proceso no termina y no puedo oprimir apagar, refresco la pagina y ya no me permite apagar el led. Chrome o safari siempre se quedan en estatus “esperando a localhost”. Que será que me falla?
Hola amigo disculpa la tardanza, el archivo apagar.php debe llamar a apagarled.py
Buenas noches me podrias ayudar, porque no se muestran los datos obtenidos desde enciendeled.py que se encuentra dentro del archivo prender.php.
y para que sirve header(‘Location:index.php’);????
Location:index.php es para que despues de ejecutar el prender.php se regrese a index.php donde estan los botones
de echo desde php podrÃas poner en el exec(“echo ” $valor” >/dev/ttyACM0″);
siempre y cuando le des permisos al puerto para ser controlado con un chmod 777 /dev/ttyACM0
y asà desde php mandas “H” o “L” y te ahorras mucho y asà solo seria la clase con los dos botones y la clase que recibe y envÃa al arduino sin tener que utilizar las clases de python y es mas rápido el tiempo de respuesta
Buenas, necesito ayuda.
Antes que nada enhorabuena por el artÃculo.
En consola los scripts tanto en python como en php funcionan de forma correcta. El problema surge al ejecutarlos en la web. No hace nada y mirando en los log de apache no se registran errores. He dando permisos al usuario www-data con “sudo chown -R www-data:www-data /var/www”, y sigue todo igual.
Alguna idea?
es porq lo que no tienes es permisos sobre el puerto en que se monta el arduino el la rasspberry yo le di permisos globales a full con el sudho chmod 777 /dev/ttyACM0 y ya jalo incluso sin usar las clases de phyton
Hola
He probado una y mil veces el programa python raspduino, y ningún problema, pero lo que pasa es que se me queda enganchado en el bucle y solo puedo hacer escribir H y luego L y asà hasta que no haga ctrl+C
Lo que yo quiero es precisamente lo que tu propones, un programa que encienda y se ejecute, y otro que apague, cosa que resuelves con enciendeled.py y apagaled.py…..pero lo he probado una y mil veces y no hay manera de encender el led del arduino
que es lo que hago mal??
gracias de todos modos por el aporte
Jordi
Hola me ha parecido interesante tu proyecto he realizado las pruebas y tengo un problema cuando prende doy click en prender el led que tengo conectado al circuito solo parpadea no se queda prendido ayudame por favor no se en que estoy mal
Sorry por las faltas de ortografia Hola me ha parecido interesante tu proyecto he realizado las pruebas y tengo un problema cuando doy click en prender el led que tengo conectado al circuito solo parpadea no se queda prendido ayudame por favor no se en que estoy mal
holas chicos, me estuve rascando la cabeza,trantando de solucionar el problema encendido y apagado via wed,de hecho soy novato o principiando con linux,tuve que revisar varios segmentos de apoyo este me salvo:
http://www.peatonet.com/raspberry-pi-y-los-pines-gpio-controlando-el-led-desde-una-interfaz-web/
primer lugar no descarguen el archivo del proyecto, de hecho tiene mas errores y esta muy desactualizada,sigan al pie con los pasos de EXTRA PHP
otro punto prueben con TIP sudo python enciendeled.py y sudo python apagaled.py, siempre cuando esten el directorio var/www/raspduino o nombre que pusieron a carpeta de repositorio del proyecto, si sale ERROR o no enciende;y les sale Nota donde dice port esta siendo utilizada por problema arduino.open() en tal linea comando x;editen el archivo con “sudo nano enciendeled.py” si les sale el mismo error para el archivo apagaled.py ponga el mismo comando “sudo nano apagaled.py” y comente la linea “#arduino.open() “o quiten la arduino.open()
si todo sale bien ahora tiene el problema con “sudo chown -R www-data:www-data /var/www” de hecho en si el permiso, cuando correr via wed el proyecto no sale resultado de apagado y encendido del led,pero haciendo correr desde directorio var/www/raspduino ejecutando el comando sudo php prender.php y sudo php apagar.php, sale respuesta sastifatoria por menos o solo parpadea;
lo que tiene hacer poner este comando “sudo visudo” en la terminal y al final del archivo que abrimos añadimos a www-data como sudoer, debe quedar asÃ.
……………………………………………..
# See sudoers(5) for more information on “#include” directives:
#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL
www-data ALL=(ALL) NOPASSWD: ALL
…………
le damos todos permisos www-data de apache
despues Ctrl+x y tecla y para modificar o guardar y presionan enter
esta listo!!! y prueben, que lo disfruten chicos,