Autor Tema: Arduino + OpenWrt  (Leído 240 veces)

BENDER y 2 Visitantes están viendo este tema.

Desconectado raphik

  • ****
  • Mensajes: 50
Arduino + OpenWrt
« en: 21-06-2019, 10:58 (Viernes) »
INTRODUCCIÓN

No se puede hablar de Arduino + OpenWrt sin mencionar el Arduino Yún. Se trata de una placa en la que coexiste un microcontrolador Atmel ATmega32U4 y un microprocesador Atheros AR9331 interconectados por un puerto serie.

El entorno μC-Arduino se encarga de la lectura de sensores y del accionamiento de dispositivos.
El entorno μP-Linux, mediante scripts en Bash y Python y se encarga del tratamiento de datos, la interfaz de usuario e Internet.
La Web de Arduino muestra el Yún como producto retirado.

Un producto más cercano al concepto actual de IoT es el Dragino. Aquí, un conjunto μC-sensor-actuador —nodo— está unido inalámbricamente a un μP Linux —pasarela IoT— que le proporciona acceso a Internet.



PROPÓSITO

Conectar un router OpenWrt a un Arduino. Manejar las GPIOs del Arduino desde el router mediante scripts Lua. Para las pruebas utilizaré un HG553 con OpenWrt 18.06.2 y un Arduino Pro Mini.


LA CONEXIÓN SERIE

El Arduino Pro Mini tiene la ventaja de tener muy bajo consumo. Tal vez por ese motivo no tiene convertidor USB-Serie. Se le puede conectar un convertidor PL2303 externo de esta manera:

O, también se podría enchufar directamente al conector serie interno del HG553.

Para que OpenWrt reconozca el PL2303 hay que instalarle el driver correspondiente.
Código: [Seleccionar]
opkg update && opkg install kmod-usb-serial-pl2303
También hay que instalar la utilidad de configuración de puertos serie.
Código: [Seleccionar]
opkg install coreutils-stty
Ya se puede configurar el puerto serie.
Código: [Seleccionar]
stty -F /dev/ttyUSB0 raw speed 115200 -echo -hupcl
Para enviar mensajes del router al Arduino (desde una sesión ssh):
Código: [Seleccionar]
echo "mensaje" > /dev/ttyUSB0
Y para recibirlos :
Código: [Seleccionar]
cat /dev/ttyUSB0
(Continuará...)


« Última modificación: Ayer a las 21:41 por raphik »

Desconectado raphik

  • ****
  • Mensajes: 50
Encender / Apagar el LED de Arduino desde el router
« Respuesta #1 en: 22-06-2019, 17:33 (Sábado) »
Controlar salidas analógicas y digitales desde el router

La Interfaz Web tiene este aspecto.


Éste es el código HTML/Javascript de la Interfaz. Copiar en el router: /www/arduino.html
Código: [Seleccionar]
<html>
<head>
  <title>Arduino</title>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
</head>
<body>
  <h2>Salidas digitales y analógicas (PWM)</h2>
    PWM03<input type="range" id="PWM03" min="0" max="255"value="0" onchange="analogic(id)"><br><br>
    DIG04<input type="checkbox" id="DIG04" onchange="digital(id)"><br>
    DIG05<input type="checkbox" id="DIG05" onchange="digital(id)"><br>
    DIG13<input type="checkbox" id="DIG13" onchange="digital(id)"><br>
    <form action="./cgi-bin/arduino/comando.lua" id="ejecutar" method="post" target="invisible">
      <input type="hidden" id="mensaje">
    </form>
<script>
function digital(pin) {
  var x = document.getElementById(pin).checked;
  document.getElementById("mensaje").name = pin;
  document.getElementById("mensaje").value = x;
  document.getElementById("ejecutar").submit();
}
function analogic(pin) {
  var x = document.getElementById(pin).value;
  document.getElementById("mensaje").name = pin;
  document.getElementById("mensaje").value = x;
  document.getElementById("ejecutar").submit();
}
</script>
  2019 :P raphik
  <p><iframe name="invisible" style="visibility:hidden;display:none"></iframe>
</body>
</html>

Éste script Lua envía las peticiones a través del puerto serie. Copiar en el router y dar permisos de ejecución (chmod -R 0777 /www/cgi-bin/arduino/comando.lua)
Código: [Seleccionar]
#!/usr/bin/lua
io.write("Content-type: Text/html\n\n")

local infoGET = io.read('*all')

print [[
<!DOCTYPE html><html lang="es">
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
</head>
<body>
  <h3>Visualizar POST</h3>
]]

io.write(infoGET.."<br>")
os.execute("stty -F /dev/ttyUSB0 raw speed 115200 -echo -hupcl > /dev/null")
serialPort = io.open("/dev/ttyUSB0","w")
serialPort:write(infoGET.."\n")
serialPort:close()

print [[
</body>
</html>
]]

Finalmente, las peticiones que llegan al Arduino son interpretadas por este sketch.
Código: [Seleccionar]
// Control de salidas analógicas (PWM) y digitales
// 2019 :P raphik

void setup() {
  Serial.begin(115200); // Inicializa la UART
  while (!Serial); // Esperr hasta que se conecte la consola
  Serial.println("¡Consola conectada!");
}

void loop() {
  if (Serial.available()) { // Se verifica si hay información entrante
    String data = Serial.readStringUntil('\n'); // Se lee la información entrante
    String modo = data.substring(0,3);
    int pin = data.substring(3,5).toInt();
    if(modo=="DIG") {
      boolean val = data.substring(6) == "true";
      pinMode(pin, OUTPUT);
      digitalWrite(pin, val);
    }
    if(modo=="PWM") {
      byte val = data.substring(6).toInt();
      pinMode(pin, OUTPUT);
      analogWrite(pin, val);
    }
  }
  delay(100);
}

También es posible manejar los pines de salida de Arduino desde la línea de comandos del router.
Código: [Seleccionar]
# Activar la salida digital 13
echo 'DIG13=true' > /dev/ttyUSB0
# Activar al 75% la salida analógica 3
echo 'PWM03=191' > /dev/ttyUSB0
« Última modificación: Ayer a las 22:08 por raphik »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1934
Re:Arduino + OpenWrt
« Respuesta #2 en: 22-06-2019, 18:20 (Sábado) »
¿Sabes que si le pones el firmware firmata al arduino y los paquetes de firmata a openwrt puedes manejar todos los pines digitales y analógicos y tener multitud de sensores?
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

Desconectado raphik

  • ****
  • Mensajes: 50
Re:Arduino + OpenWrt
« Respuesta #3 en: 22-06-2019, 19:16 (Sábado) »
No, no tenía ni idea. ¡Gracias!
¿Funciona en routers que no sean AR9331?


Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1934
Re:Arduino + OpenWrt
« Respuesta #4 en: 23-06-2019, 13:33 (Domingo) »
No, no tenía ni idea. ¡Gracias!
¿Funciona en routers que no sean AR9331?

Sí, claro. Es genérico.
Tienes multitud de clientes para el firmata. En python, php, node, c#, ...
https://github.com/firmata/protocol
El cliente de openwrt está basado en node, si mal no recuerdo, así que tienes que instalar los paquetes de node y el del firmata.
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

Desconectado raphik

  • ****
  • Mensajes: 50
Re:Arduino + OpenWrt
« Respuesta #5 en: 23-06-2019, 18:26 (Domingo) »
Me daba el pálpito de que no iba a caber todo en el HG553.


Node ocupa unos cuantos megas y no deja espacio para Firmata.


Algo parecido le pasa a OpenWrt para Yún (Linino). Además de estar diseñado para el AR9331, corre sobre Python que se come el sistema de archivos.
En fin, probará node antes de meterle más memoria al router.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1934
Re:Arduino + OpenWrt
« Respuesta #6 en: 23-06-2019, 21:17 (Domingo) »
Sí. Todo lo que sean lenguajes de programación o compiladores se comen todo el espacio del router.
Móntate un extroot y lo pruebas.  ;)
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

Desconectado raphik

  • ****
  • Mensajes: 50
Re:Arduino + OpenWrt
« Respuesta #7 en: 24-06-2019, 20:27 (Lunes) »
Al final no me ha hecho falta instalar firmata para controlar las salidas analógicas y digitales de Arduino. Ha bastado con una interfaz Web escrita en HTML/Javascript y un script en Lua. Y, como es logico, Arduino también ha necesitado su propio sketch.

El código está aquí: https://foro.seguridadwireless.net/openwrt/arduino-openwrt/msg366859/#msg366859

Ya veremos cómo me las arreglo para leer las entradas.
« Última modificación: 24-06-2019, 20:28 (Lunes) por raphik »

Desconectado antares

  • **
  • Mensajes: 15
Re:Arduino + OpenWrt
« Respuesta #8 en: Hoy a las 10:28 »
Me picó el gusanillo con el firmata y lo he probado en un arduíno conectado a un HG556 (openwrt 17.01.4).
Sólo he necesitado instalar los paquetes "lua-rs232" y "luasocket", que ocupan menos de 100KB.

En el arduíno he grabado el StandardFirmata.ino y en openwrt he utilizado los ejemplos que vienen en
"github.com/sivieri/lua-firmata/tree/master/src",  con algunas modificaciones en example.lua:

--require "posix"

arduino = Arduino("/dev/ttyACM0")
por
arduino = Arduino("/dev/ttyUSB0")

cur = posix.gettimeofday()["sec"]
por
cur = os.time()

root@HW556:~/lua-firmata-master/src# lua example.lua
OK, port open with values 'device: /dev/ttyUSB0, baud: 57600, data bits: 8, parity: none, stop bits: 1, flow control: off'
LED changed
0
LED changed
0
LED changed
87
LED changed
91
LED changed
114

Y eso es todo. El programilla activa/desactiva una salida digital y lee una entrada analógica.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1934
Re:Arduino + OpenWrt
« Respuesta #9 en: Hoy a las 16:52 »
Lo siguiente es conectar sensores i2c y leer los valores en openwrt...  >:D
https://github.com/firmata/protocol/blob/master/i2c.md
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

Desconectado sourlemon

  • **
  • Mensajes: 1
Re:Arduino + OpenWrt
« Respuesta #10 en: Hoy a las 18:22 »
Gracias por el tema.
basketball games