Raspberry pi(como servidor) + Arduino (como "actuador")

Hola me gustaría saber si se puede implementar una Raspberry pi como servidor junto con un Arduino para que active o desactive salidas o incluso realice avisos dependiendo de las ordenes que se reciban mediate un interface (programación php, apache....etc).

La cuestión es esa, que la Rpberry sea la protagonista a la hora de hacer de servidor en vez de la ethernet shield porque está claro que permite mucha mas versatilidad a la hora de implementar seguridad,un diseño del entorno mas agradable.....en fín todo eso y el Arduino para que realice sus funciones según se trate de lo que queramos hacer.

En un principio en cuanto a la hora de la programación del entorno en la Rberry no habría problema y del Arduino( Espero porque nunca he programado ninguno, he copiado programas y eso aunque no creo sea excesivamente complicado).

La duda entre otras muchas es la forma de conectar físicamente el Arduino a la Rberry y sobre todo cómo dedirle tanto a uno como a otro que que las ordenes que se reciban via software por la Rberry pasen a ejecutarse mediante el Arduino y al contrario, que los datos obtenidos mediante sensores pasen a la Rberry.

Vamos,lo que sería un contról domótico si en su caso fuera. Por cierto que ya he visto por ahí lo del tema de las dif erentes tensiones y bueno mas o menos he visto como lo solucionan algunos. ;)

pero...

¿La raspberry pi no tiene ya salidas o entradas para gobernar cosas?

Por poder hacerlo claro que se puede como tu dices: arduino+raspberry aunque suena redundante

Seria como querer usar un arduino para que controle a otro como salidas... si ya las tiene el primero !!

Deacuerdo, es probable que ambas actuen de forma parecida o al menos así lo dices como yo me guio por lo que he leido en los foros, sólo que por lo visto una hace mejor unas cosas que otra, por ejemplo si me dices que a una ethernet shield se le puede implementar un entorno html algo complejo,con su seguridad y todo al inicio de sesión......etc sería estupendo pero me han comentado que para eso se queda algo corta,dime si me equivoco por favor y la Rpberry es algo mas compleja a la hora de configurar sus pines GPIO....no se. Ahora bien, te adelanto que de electrónica no mucho,he visto lo que marcas de UART,SPI,I2C, SPI, supongo que son las diferentes opciones de conectar hacia el arduino mediante el RX TX o qué? Y de ser así qué tipo de comandos habría que meter en la Rberry y Arduino respectivamente para que actuara el uno sobre el otro? Gracias y disculpa por mis preguntas por quizá querer avanzar demasiado rápido.......je je pero me pica la curiosidad. :D

Hola feperval.

Si, es muy posible lo que solicitas.

En mi caso, conecto la raspberry al arduino por puerto USB, y uso un servidor web sobre la raspberry, empleando el PHP como programa. Por medio de php y el puerto serial asignado a arduino (/dev/ttyACM0 por lo general) puedo enviar instrucciones al arduino y luego capturar la respuesta que da el arduino.

En ese caso, uso un programa en arduino que interpreta lo solicitado, por ejemplo, una cadena de 20 caracteres, en los cuales le envio 1/0 para indicar si la salida debe quedar encendida o apagada, tomando cada posición de la cadena como el valor que debe tomar cada puerto.

Luego puedo usar la respuesta de arduino al comando, (serial.writeln) para devolver el estado de algun sensor.

Hla Hfabión, me preguntaba si podría comentarte en tu correo un proyecto que tengo en mente ya que por lo que veo sería algo muy parecido a lo que tu tienes,el tema de programación podría no ser un problema es mas que nada el montaje de los diferentes elementos que me gustaría o creo serían de gran utilidad hubiese en esta idea. Más que nada antes de aventurarme a pedir algún que otro elemento. Gracias ya de por adelantado por contestar.

Me interesa mucho el tema.

Como configurar la Raspberry para interactuar con Arduino conectada por USB a la Raspberry ? Simplemente es conectar y ya está en un dispositivo /dev ? O que hay que hacer ?

Porque me pasa lo mismo que a feperval, que yo de programación no tengo problemas, pero de electrónica ando justillo, y al poder usar la Arduino para encender y apagar cosas directamente .. solo me falta poder conectarlo a la Raspberry y programar un entorno WEB que interactue con ella.

Un Saludo.

Yo sigo pensando que es más sencillo utilizar solamente la raspberry pi. Se puede alojar el servidor y manipular el gpio. Pero bueno, yo también le pille el gusto al arduino así que: http://playground.arduino.cc/Interfacing/SerialNet

Aqui tienes multiples programas que sirven para exactamente eso (pasar la comunicación serie a network).

Si tienes alguna duda pregunta o cuando tenga tiempo te paso un ejemplo

Bubuwuena por lo que he leído con Raspberry solo se puede usar 1 canal GPIO y con la Arduino 6 además de 8 entradas analógicas. Por eso lo de usar la Arduino !

Hombre claro depende del calibre de tu proyecto, pero normalmente con el i2c i el spi vas más que listo. Lo bueno de arduino es más sencillo y si lo tienes a mano usalo.

Ejemplo con serproxy(para arduino mediante usb):

--php-- ( Codigo del servidor..)

$fp = fsockopen ("localhost", "5331", $errno, $errstr, 10); //Con esto te comunicas con arduino a traves de puerto serie. fputs($fp, $mensaje); // Enviar $rmensaje fgets($fp);// Recibir

--arduino--

void setup() { Serial.begin(19200); Serial.print(mensaje); //envia while(Serial.available()){ //Mientras haya mensaje.. mensaje=Serial.read() //lee i guarda en mensaje

Suponiendo que en el archivo "serproxy.cfg" asignes tu COMX al puerto "5331" y la velocidad de transmission como "19200".

Espero que veas por donde van los tiros. No me acuerdo muy bien pero más o menos es así.

Suerte.

Ya he conseguid conectar. Ha sido fácil. Simplemente conectar Arduino en el USB de abajo de la Raspberry y accesible desde /dev/ttyACM0 Para mandar un 1 ... echo -ne "1" > /dev/ttyACM0 Ahora estoy intentando desde un php mandar algo al puerto, pero de momento no me funciona.

Si antes digo que no va, antes lo arreglo.

<?php echo system("echo -ne '1' > /dev/ttyACM0"); ?>

Aunque previamente hay que cambiar el propietario del /dev/ttyACM0 al que ejecuta el servidor web.

Pero me pasa una cosa.
Intenta funcionar, pero el LED parpadea y se apaga … es como si se reiniciase la Arduino.

Lo que intento es pagar y encender un LED de momento.

Porque puede ser lo del parpadeo y que no se quede fijo ?

He encontrado esto

http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/

Pero no he podido probarlo porque no tengo condensadores a mano.

Alguien sabe si funciona ?

Abrí un post nuevo, con los ejemplos que estoy probando sobre Raspberry Pi + Arduino. (por si os interesa)

http://forum.arduino.cc/index.php?topic=168306.0

Buenos dias, estoy intentado hacer lo mismo para realizar una comunicacion bi-direccional entre Arduino y RaspberryPi, y he conseguido hacerlo por Python y por c. Pero justamente por C++ no se hacerlo T_T... quizas intente probar por Php porque he visto que suele haber perdidas de datos en la comunicacion entre los 2 dispositivos.

Os dejo los tutos que he seguido para C y para python, si alguno lo consigue al 100% por php o por C++ porfa ponganlo por aqui.

c: http://webdev.nkoder.com/archives/6-Serial-communication-USBRS232-between-Arduino-and-PC.html

python: http://www.geekytheory.com/arduino-raspberry-pi-raspduino/

Espero que les sirva.

En la raspberry puedes instalar un linux + Lazarus y programar todas tus entradas y salidas desde ese lenguaje (object-pascal), incluso con entorno grafico para usar en un tv. Por otro lado si usas un expansor IO como PCF8575 que te dá 16 Entrada o Salidas configurables, y puede poner hasta 4. Tamien las lecturas analogicas no son problema, porque hay muchos conversores AD que funcionan por I2C o SPI.

Buenas,

Mira este post, esta todo explicado y lo transmite bien.

Un saludo.

A qui pueden ver un proyecto donde Arduinno trabaja de la mano con Raspberry Pi

http://riverajefer.blogspot.com/2013/09/control-de-un-led-rgb-traves-de.html

Saludos

Buenas:

Un pregunta tonta.

¿Por qué usar Arduino como actuador, por ejemplo, controlar relés o otras cosas, si la propia Raspberry Pi tiene pines para hacer lo mismo directamente?

Me pregunté esta pregunta a mi mismo hace tiempo. Leyendo bien cada dispositivo vale la pena unir Raspberry Pi y Arduino, también puede ser Raspberry Pi con PIC a secas sin Arduino, sobre todo para hacer placas específicas. Ya que Rasp tiene la posibilidades de comunicación de varios protocolos y poco GPIO, es decir, pocos conecciones directas, bajo mi punto de vista es bueno añadirle otro dispositivo como un microcontrolador, en este caso una placa llamada Arduino. Para los que quieran más entradas o salidas digitales o analógicas hay circuitos integrados que puedes poner más pines como el PCF8574 bajo protocolo I2C en este caso.

http://pic16f84a.org/proteus.html#Proteus_Capitulo_26

Puedes utitlizar 4 IC PCF8574 y otros 4 PCF8574A, entre ellos solo cambian la dirección física, por eso se pueden poner 8 en total. Tienes de pines para artarte tanto configurable como entrada o salidas directamente al Pi, también se pueden comunicar con Pi, Arduino y los PCF. En caso de que no dispongan los PCF8574, puedes usar PIC que emule los PCF8574, solo que este hay que programarlo, también te vale programar independientemente el AVR del Arduino UNO en este caso llamado Atmega328, la ventaja que se puede extraer.

Hay gente que no tiene claro estas cosas, así para los nuevos visitantes que aún leen estas líneas y no saben lo que es lo dejo claro aquí abajo.

1. Microcontrolador es un dispositivo programable para controlar periféricos como sensores de temperatura, ondas de choque o ultrasonido, sensor de movimiento pantalla LCD 4x20 y mil cosas más. 2. PIC es un microcontrolador de la firma de Microchip. 3. AVR es un microcontrolador de la firma Atmel. 4. Arduino es una placa que integra la comodidad de ya disponer USB, resistencias, oscilador externo y demás componentes para facilitar al usuario la parte de la electrónica, programar sinsaber a ciencia cierta su hardware. Má adelante cuando aprenda, usará el microcontrolador con su propia placa fabricada por uno mismo para una tarea específica, Arduino es genérico para aprendizaje.

Hace tiempo, iba hacer un servidor Web en PC de una torre normal, primero bajo Windows ya que es más fácil para empezar, sobre personas nóveles y luego en Linux que al final aún no he hecho. Mucho más adelante sacan un Raspberry Pi, ahora quiero hacer un buen tutorial o manual en pdf sobre estos dispositivos, incluido Arduino UNO rv3 cargado de detalles.

Un ejemplo de un turorial en pdf lo puedes ver aquí. http://electronica-pic.blogspot.com.es/2009/06/servidor-casero-apache-php-mysql.html

Según voy aprendiendo se hará un buen servidor Web con Raspberry y Arduino o simplemente también con Arduino y el Web Server Shield que es su complemento. Ya se verá lo que quieren usredes.

El que tenga un servidor Web hecho de prueba, lo hace saber por aquí, para que nos invite a probarlo desde Internet, como controlar Led, WebCam, motores, etc y scar nuestras propias conclusiones. En caso de que sea yo el que lo haga cuando tenga estos dispositivos en mis manos y acabe con el proyecto, se los haré saber desde mi Blog y por estos foros creando un tema nuevo. Mi idea es, que alguien de aquí entren en una Web, tendrá acceso con password y login que se los diré, para que no entren todo el mundo, solo lo controla uno. Luego podran contralar dos servomotores con una WebCam, Led, motores, ventiladores, y sensor de temperatura sea el DS1820 digital o el LM35 analógico o cualquier sensor. Será gravado el vídeo y se publicará aquí si lo desea el manipulador de Raspberry Pi a distancia.

Me alegro mucho de que llegaran hasta aquí leyendo este pequeño testamento.

Un saludo y aprobar con los servidores.

Gracias, me ha funcionado correctamente.

Incluso he hecho algunas modificaciones en el código para enviarle instrucciones al arduino desde php.

String inputString = "";         
boolean stringComplete = false;  


void setup()
{
  Serial.begin(9600);      
  inputString.reserve(200);  


}





void loop() 
{

  if (stringComplete) 
  {
    
    String Consulta_ACCION = inputString.substring(0,10);
    
    if( Consulta_ACCION == "READ      ")
    {
      // ACCIONES DE LECTURA
      String Consulta_PUERTO = inputString.substring(10,13);
      int Consulta_PIN = inputString.substring(15,17).toInt();
      
      if( Consulta_PUERTO == "ANL" )
      {
        pinMode(Consulta_PIN,INPUT);
        int dato = analogRead(Consulta_PIN + 1000);
        Serial.println(dato);
      }
      if( Consulta_PUERTO == "DGT" )
      {
        int dato = digitalRead(Consulta_PIN + 1000);
        Serial.println(dato);
      }
      
    }
    if( Consulta_ACCION == "WRITE     ")
    {
      // ACCIONES DE ESCRITURA
      String Consulta_PUERTO = inputString.substring(10,13);
      int Consulta_PIN = inputString.substring(15,17).toInt();
      int Consulta_VALOR = inputString.substring(19,22).toInt();
      
      if( Consulta_PUERTO == "ANL" )
      {
        //ACCIONES SOBRE PUERTO ANALOGICO
        pinMode(Consulta_PIN,OUTPUT);
        analogWrite(Consulta_PIN,Consulta_VALOR);
        
      }
      if( Consulta_PUERTO == "DGT" )
      {
        //ACCIONES SOBRE PUERTO DIGITAL
        pinMode(Consulta_PIN,OUTPUT);
        digitalWrite(Consulta_PIN,Consulta_VALOR);
      }      
    }
    
    
    
    inputString = "";             
    stringComplete = false;      
  }
  
  
}
















void serialEvent()
{
  while (Serial.available())
  {
    char inChar = (char)Serial.read(); 
    inputString += inChar;
    if (inChar == '\n')
    {
      stringComplete = true;
    } 
  }
}

/****************************************************************************************************************************************************************************************** * Explicacion basica de la sintaxis de consulta, para coneccion a la placa. * Basicamente, cada vez que por serial le indiquemos algo a la placa se hara por medio de estas consultas. *****************************************************************************************************************************************************************************************/

// Sintaxis

// Armado de consulta. // ====================

// ********************************************************** // Primero. 10 digitos

// READ // WRITE

// { ACCION GENERAL - 10 digitos }

// ********************************************************** // Segundo. 3 digitos

// DGT // ANL

// { ELECCION DE PUERTO - 3 digitos }

// ********************************************************** // Tercero. 4 digitos

// INT ( 00 - 99 )

// { NUMERO DE PIN - 2 espacios + 2 digitos }

// ********************************************************** // Cuarto. 5 digitos

// INT ( 000 - 999 )

// { Valor - 2 espacios + 3 digitos }

//**************************************************************** // CONSULTA: // ACCION PUERTO VALOR // 10 + 3 + 4 + 5

//**************************************************************** // EJEMPLOS // // READ ANG 03 (leer valor pin analogico n3 ) // WRITE ANG 03 255 (escribir valor del pin analogico 3 en 255) // READ DGT 13 (leer estado pin digital 13) // WRITE DGT 13 000 (apagar pin digital 13)

//*************************************************************** // ACLARACION // // Los datos de escritura de un pin analogico van desde 0 a 255 // Los datos de lectura de un pin analogico van desde 0 a 1023 // // Los datos de escritura de un pin digital van desde 0 a 999 ( igual hasta ahora solo tomamos 000 ( LOW ) y 1 ( HIGH ) // Los datos de lectura de un prin digital son booleanos ( true or false )

Y desde php ejecuto las consultas:

$fp = fopen('/dev/ttyACM0','w+');
//fwrite($fp,"WRITE     ANL  06  255    \n");
fwrite($fp,  "READ      ANL  07   255  \n");
fclose($fp);


$fp = fopen('/dev/ttyACM0','w+');
echo fread($fp,"4");
fclose($fp);