Compartir el estado de GPIOs de Raspberry con Arduino vía USB serie

Hola a todos!! ;) , tengo una duda que no soy capaz de resolver y creo que este es el sitio más indicado para encontrar la respuesta.

Estoy haciendo un proyecto en el que una Raspberry se comunica con un Arduino nano mediante los GPIO de las Raspberry, esto lo hago cableando los GPIO de las Raspberry a las entradas digitales del Arduino nano y cuando detecto que se ponen en HIGH o LOW las uso en el mi sketch. Mi pregunta es la siguiente:

¿Se puede hacer lo mismo usando un cable USB haciendo uso de la comunicación serie entre las dos placas? Lo que pretendo es que por ejemplo cuando se active el GPIO 10 de la Raspberry el Arduino sepa que está activo ese GPIO y actuará en consecuencia y si está apagado ese GPIO que actúe de otra manera, todo esto quiero que ocurra conectando las dos placas mediante un cable USB.

He visto tutoriales sobre como activar la comunicación serie entre el Arduino y la Raspberry pero no se explica nada sobre como usar las activaciones de los GPIO y compartir su estado para usarlos en mi sketch de Arduino.

Gracias y un saludo.
 
No entiendo muy bien la pregunta, a ver si acierto:

Lo mismo me da que sea un arduino rpi que lo que sea, cuando detectas un cambio en un pin, envías un mensaje por el puerto serie y en el otro lado lo interpretas. Ya está.
En los ejemplos que has visto se enviarán mensajes por el motivo que sea, cambia ese motivo por el cambio de nivel de un pin.

¿Cual es el problema?
 
Hola Scooter, disculpa si no me he explicado bien.

Yo ahora mismo hago un control de programa en Arduino detectando activaciones de GPIO de forma directa (cableada) simplemente cuando se activa un GPIO el arduino recibe ese valor al detectar los 3,5 v que emite el GPIO. Lo que pretendo ahora es usar el mismo metodo pero todo por puerto USB, el problema que no tengo nada de experiencia en comunicacion serie y no se si lo que pretendo es posible, puede que sea muy sencillo de realizar pero ando muy perdido.
Básicamente necesito que cuando active un GPIO determinado con la Raspberry el arduino sepa por comunicacion serie que GPIO ha sido activado, por supuesto tendre que cambiar el codigo de mi arduino y adaptarlo a la nueva comunicacion, donde tengo declaradas las entradas digitales que uso para detectar los voltajes en alto de la Raspberry tendre que cambiarlos por mensajes de serie, imagino...
En lo que me comentas que cambie los mensajes del motivo que sea por cambio de nivel de pin, no se como se hace ese proceso de especificar el GPIO.

Un saludo y gracias por la ayuda.
 
Ahora haces algo así como.
Cuando pase algo activa el pin

Tienes que cambiarlo a
Cuando pase algo manda un mensaje

En el otro lado tienes algo como
Cuando cambie el pin haz algo

Lo cambias a
Cuando recibas el mensaje "X" haz algo

No entiendo tu disposición, no sé si es por experimentar o algo. Si la rPI detecta algo que active directamente lo que sea. No sé qué hace ahí un Arduino.
 
El motivo por el que uso un Arduino es un poco especifico y se sale del tema de mi pregunta y la verdad no queria liarlo mas, pero para que te hagas una idea:
el Arduino se encuentra integrado en una matriz neo pixel tipo pantalla de leds programables y tiene un programa hecho con micro interrupciones, de manera que segun el GPIO activo de la Raspberry mostrara en la pantalla una cosa u otra.
El motivo de usar un Arduino es por que es la manera mas sencilla que conozco de controlar las pantallas de leds mediante lenguage c y las librerias pertinentes,otro motivo es por liberar de carga de procesamiento a la Raspberry que a su ves la tengo manejando mas procesos y por ultimo la Raspberry se encuentra separada fisicamente de la pantalla y uso el Arduino para comandar la pantalla sin necesidad de tener la Raspberry unida al control de la pantalla.
De la manera que lo tengo ahora funciona, el problema que para la comunicación entre las las 2 placas es un coñazo la unión entre las dos mediante cables y soldaduras al Arduino, por lo que es una solución mucho mas limpia el uso de un cable USB que quito y pongo cuando quiero, ademas si consigo comunicar las 2 placas de esta manera no tendría que seguir añadiendo más cableado para los siguientes elementos que quiero añadir.

Entonces lo que tu sugieres es que mande mensajes por puerto serie entre las dos placas para usarlos como confirmación de activación? y como adapto esto a mi código, ¿tendría que poner que si recibo por ejemplo la palabra "gpio13" que ocurra una determinada acción? +
No hay un comando mas directo para realizar esto?
Saludos
------- Mensaje actualizado: -------

En concreto lo que necesito es algo asi como: "si esta activo el GPIO10 manda el siguiente mensaje por puerto serie" ¿como podría realizar esto, tendria que formularlo en python?
 
¿Y quien te ha dicho que mandes "gpio13"? Mira a ver si mandas El Quijote entero para una cosa y Hamlet para otra... jejeje
Pues depende de cuantos códigos necesitas, dato que desconozco.
Que como modificas tu código; pues como no lo he visto: "con mucho cuidado no sea que lo estropees"

yo mandaría un mísero byte en binario, y si necesitas mas de 8 bits, pues depende, o lo mandas en ascii o sigues en binario. Soy fan del binario porque simplifica mucho.
Pero depende de si quieres que el código sea "humanamente comprensible" o no. Si lo envías en binario es un galimatías para cualquier persona que esté observando la comunicación, a cambio es rapidísima. Si lo envías en ASCII y en modo literario, cualquier persona lo entiende pero el programa se complica.

¿Que como se interpreta en el arduino? Mira los ejemplos de Serial.xxxx
 
Última edición:
Hola!! tras varios dias de lucha conseguí al final mi objetivo, te resumo de forma muy básica lo que hice:
En el lado de Arduino:
Hice un sencillo programa de prueba mediante el cual iniciaba la variable Rasp para leer por puerto serie todo lo que entrase, y mediante un bucle switch case detectaba cada uno de los estados que se envian desde la Raspi, dejo el codigo aquí:

C++:
int Rasp = 0;

void setup() {
    Serial.begin(9600);
}

void loop() {
    if (Serial.available() > 0) {
        Rasp = Serial.read();
    } // fin de lectura puerto serie

    switch (Rasp) {
    case '1':
        Serial.println("Modo 1");
        delay(400);
        break;
    case '2':
        Serial.println("Modo 2");
        delay(400);
        break;
    default:
        Serial.println("OFF");
        delay(400);
    }
}
En el lado de Raspberry:
Exporté los GPIOs que queria usar e hice unas variables para poder preguntar por el estado de esos GPIO en todo momento, y segun el valor de los GPIO establezco una comunicación serie mediante la libreria de Python.serial.

Por ultimo conecto la Raspberry con un Arduino nano mediante un cable USB y establezco la comunicación serie entre ambas placas.

Me funciona bien, lo que pasa que para que funcione correctamente la comunicación necesito estar continuamente preguntandole a la Raspi si tiene los GPIO activo o no, con lo cual la comunicación serie se vuelve a iniciar, por lo que necesito una manera de detectar un cambio en la salida de un comando, de manera que si no hay cambio no haga nada pero si hay cambio en el GPIO que si actualice la comunicación serie.

He probado el siguiente comando:
watch -n 2 ./estado_gpio.sh
lo que hace es ejecutar cada 2 segundos el script mediante el cual compruebo el estado de los GPIO, el problema es que se ejecuta siempre incluso cuando no hay cambios en los GPIO y esto hace que me reinicie la comunicación serie, necesito alguna manera de que si no hay ningun cambio que no actue.
Saludos!!
 

Temas similares


Arriba