Archivo de etiquetas cubieboard

PorLeón Ramos

Leer un Switch desde la Cubieboard

¡Saludos, comunidad de creadores digitales! En nuestra aventura continua por el cruce entre la programación y la electrónica, hoy vamos a profundizar en cómo utilizar la biblioteca gpiod en Python para interactuar con un switch de dos polos conectado a una Cubieboard A10, implementando una resistencia pull-up. Este tutorial está diseñado para aquellos de ustedes interesados en fusionar el poder del hardware y el software para dar vida a sus ideas electrónicas.

Lo Que Necesitas

Antes de adentrarnos en la mecánica del código, asegúrate de tener a mano:

  • Una Cubieboard A10.
  • Un switch de dos polos.
  • Cables de conexión.
  • Una resistencia pull-up (sugerimos 10KΩ).
  • Python y la biblioteca gpiod instalados en tu Cubieboard.

Preparación del Entorno

Si aún no tienes la biblioteca gpiod, instálala ejecutando el siguiente comando en tu terminal:

pip install gpiod

Esta biblioteca facilita la interacción con los pines GPIO de la Cubieboard A10 de forma eficiente.

Esquema de Conexión: Switch de Dos Polos con Pull-Up

Para garantizar una lectura precisa del estado del switch sin interferencias del ruido eléctrico, utilizaremos una resistencia pull-up. A continuación, te presento el esquema de cómo conectar el switch de dos polos con la resistencia pull-up al pin GPIO 11 (CSI1-D0, línea 196) de tu Cubieboard A10:

 

Este esquema muestra el correcto cableado, incluyendo la resistencia pull-up conectada entre el switch y la fuente de voltaje positivo (VCC), además de la conexión a tierra (GND) desde el switch. Es una configuración ideal para evitar lecturas falsas por el ruido.

 

Script de Python para Leer el Estado del Switch

Ahora que tenemos todo conectado correctamente, veamos cómo leer el estado del switch mediante Python y gpiod:

import gpiod
import time

CHIP_NAME = 'gpiochip0'
PIN_NUMBER = 196

chip = gpiod.Chip(CHIP_NAME)

line = chip.get_line(PIN_NUMBER)
line.request(consumer='read_switch', type=gpiod.LINE_REQ_DIR_IN)

print("Iniciando monitoreo del switch. Presiona CTRL+C para terminar.")

try:
   while True:
      state = line.get_value()
      if state == 1:
         print("Switch abierto (OFF)")
      else:
         print("Switch cerrado (ON)")
      time.sleep(0.5)

except KeyboardInterrupt:
   print("Finalizando monitoreo del switch.")

line.release()

Desglose del Código

El script inicia importando los módulos necesarios y estableciendo el chip GPIO y el número de pin. Accedemos al pin deseado como entrada y entramos en un bucle para leer constantemente el estado del switch, indicando si está abierto o cerrado.

Conclusión

Integrar componentes de hardware como un switch de dos polos con tu Cubieboard A10 abre un mundo de posibilidades para tus proyectos. Este tutorial te brinda los conocimientos básicos para empezar, desde la configuración física hasta la interacción a través de Python.

Nos encantaría ver qué proyectos increíbles puedes crear a partir de este conocimiento. ¡Comparte tus experiencias y aprendizajes con la comunidad!

PorLeón Ramos

Wrapper: Ejecutar un script desde un servidor web en una cubieboard

¡Hola!

En esta ocasión vamos a realizar un wrapper o un script para realizar algunas acciones desde una página web en nuestra cubieboard A10.

IMPORTANTE: Cabe resaltar que esta práctica es altamente insegura y deberán de colocarse controles adicionales como contraseñas o manejo de usuarios para evitar problemas futuros.

Instalar dependencias

  • Lo primero que hay que realizar es asegurarse de que tenemos el servidor web apache instalado:
sudo apt-get install apache2 php

¿Funciona apache?

  • Ahora probaremos que está funcionando, conéctate a la misma red de tu cubieboard y revisa cuál es su dirección ip.
ip a
  • Abre un navegador y deberás ver una página de inicio como la siguiente

 

El script bash

  • Crearemos un script sencillo para probar la ejecución en la carpeta /var/www/html/scripts
sudo mkdir -p /var/www/html/scripts

cd /var/www/html/scripts/

nano script1.sh

El contenido del script será el siguiente:

#!/bin/bash

usuario=$(whoami)
echo "Este es un script BASH!!!! ejecutado por $usuario"

Recuerda darle premisos de ejecución:

sudo chmod 755 script1.sh

La página html

  • Ahora generaremos una página web con un botón en el archivo boton.html
cd /var/www/html

nano boton.html

El contenido del archivo es este:

<!DOCTYPE html>
<html lang="es">
  <head>
  <meta charset="UTF-8">
    <title>Botón para invocar un script Bash</title>
    <script>
      function ejecutarScript() {
        // Realiza una solicitud HTTP POST a un script PHP que ejecutará el script Bash
        console.log("Invocando PHP de fondo");
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "ejecutar_script.php", true);
        xhr.send();
      }
    </script>
  </head>
  <body>
    <h1>Botón para invocar un script Bash</h1>
    <form action="ejecutar_script.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo"/>
    </form>
    <form action="ejecutar_script_sudo.php" method="post">
      <input type="submit" value="Ejecutar script redirigiendo y sudo"/> 
    </form>
    <button onclick="ejecutarScript()">Ejecutar Script SIN redirigir</button>
  </body>
</html>

El script php

  • Ahora crearemos un script ejecutar_script.php para que lance el script bash
nano ejecutar_script.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

El gemelo malvado

También haremos otro script muy parecido  ejecutar_script_sudo.php pero este lo usaremos para ejecutar el script con permisos de superusuario

nano ejecutar_script_sudo.php

el contenido del archivo es el siguiente:

<?php
// Ruta al script Bash
$scriptPath = "/var/www/html/scripts/script1.sh";

// Ejecuta el script Bash
$output = shell_exec("sudo bash $scriptPath");

// Si deseas imprimir la salida del script Bash, puedes hacerlo aquí
echo "<pre>$output</pre>";
?>

Primera prueba

  • Hasta el momento si abrimos el navegador y escribimos la dirección http://<ip_cubieboard>/boton.html vamos a  ver lo siguiente:

Si damos clic en el primer botón todo funcionará correctamente y nos aparecerá la siguiente leyenda:

Sin embargo, si usamos el segundo botón, que intenta ejecutar el script con permisos de superusuario, nos generará un error, es necesario agregar algo más para que los permisos de superusuario funcionen.

Si damos clic een el tercer botón, se lanzará el script pero de fondo y no sabemos si se ejecutó o no. Para esto abre la consola de desarrollador de tu navegador y al presionar le botón deberás ver una salida como esta:

Donde nos indica que el código javascript efectivamente lanzó la ejecución del script bash pero no vemos la salida en la pantalla.

Permisos de root

  • Para agregar los permisos de super usuario será necesario que escribamos realicemos el siguiente procedimiento:

Abrir la tabla de sudoers con el comando que valida la sintaxis:

sudo visudo

Agregar al final del archivo la siguiente línea:

www-data ALL=(ALL) NOPASSWD: /bin/bash /var/www/html/scripts/script1.sh

Guardar y salir del archivo. Si todo ha salido bien, ahora el segundo botón funcionará y el script bash se habrá ejecutado como root o superusuario.

Happy coding!

PorLeón Ramos

SOS: Enciende un LED con la GPIO de tu Cubieboard A10

Hola:

Acá les voy a compartir la receta de cocina para poder controlar un led desde uno de los pines de la GPIO. Tengo una Cubieboard A10 con Armbian 23.11.1 bookworm. Vamos a necesitar:

  1. Una resistencia de 220 (rojo, rojo, café) o 330 (naranja, naranja, café) ohms.
  2. Un diodo led de preferencia de bajo consumo (no ultrabrillante).
  3. Una protoboard
  4. Algunos cables dupont para conectar de header macho a protoboard (Dupont macho-hembra).

 

Para empezar, seleccionamos un pin de la GPIO. Para eso buscamos el diagrama pinout de la placa.

Diagrama pinout Cubieboard A10 GPIO

 

 

En nuestro caso vamos a seleccionar el pin 11 del puerto del lado derecho del diagrama. Es el pin margado como CSI1-D0. Y para aterrizar el circuito usaremos el pin 19 o 20  marcados como GND o Ground del mismo puerto. El circuito nos quedaría de la siguiente forma:

Diagrama de conexiones

Actualizar sistema

sudo apt update
sudo apt upgrade

Instalar dependencias de python

sudo apt install python3-libgpiod

Revisar pines disponibles

dtc -I dtb -O dts -o sun4i-a10-cubieboard.dts /boot/dtb/sun4i-a10-cubieboard.dtb

Script python

Acá estaría el script que debes de copiar y pegar en un archivo. Yo le puse de nombre sos.py.

#!/usr/bin/python

import gpiod
import time

def morse_code_signal(line, symbol):
    if symbol == ".":
        line.set_value(1)
        time.sleep(0.2)  # Duración del punto
        line.set_value(0)
        time.sleep(0.2)  # Espacio entre partes de la misma letra
    elif symbol == "-":
        line.set_value(1)
        time.sleep(0.6)  # Duración de la raya
        line.set_value(0)
        time.sleep(0.2)  # Espacio entre partes de la misma letra

def morse_code_sos(line):
    # Representación de SOS en Morse: ... --- ...
    for symbol in "... --- ...":
        morse_code_signal(line, symbol)
        if symbol == " ":
            time.sleep(0.6)  # Espacio entre letras

chip = gpiod.Chip('gpiochip0')
line_number = 196
led = chip.get_line(line_number)
led.request(consumer='gpio_led_morse', type=gpiod.LINE_REQ_DIR_OUT)

try:
    while True:
        morse_code_sos(led)
        time.sleep(5)  # Espera 5 segundos antes de repetir
finally:
    led.release()

 

Ahora podemos darle permisos de escritura

chmod 755 sos.py

Ejecutamos como superusuario

sudo ./sos.py

¡Y listo! ¡Ya podemos controlar un LED con un script python en linux!

Happy coding!

Porcreadores

Mediaserver en un Cubieboard A10

Objetivo

En mi caso estoy buscando compartir algunos videos, música y libros digitales utilizando un servidor web y dlna. Además usaré este tipo de instalación como base para el desarrollo de nuestra plataforma para IoT (Internet of Things).

Lista de materiales

  • Cubieboard A10
  • Disco duro SATA de espacio a elegir (yo estoy usando 1TB)
  • Cable SATA + 5V breakout
  • Adaptador o fuente de alimentación de 5V a 2A
  • Wifi DWA-131E1 marca D-Link

sata-cable-5v-2a-dc-power-adapter

Instalando la plataforma

Descarga la imagen

Primero hay que descargar la imagen. La que estoy utilizando y me funcionó muy bien es la Cubian-nano-x1-a10-hdmi.img. Aquí el torrent para descargarlo.

Si no tienes 7z, lo puedes descargar en ubuntu así:

sudo apt-get install p7zip

Una vez descargado, puedes descomprimir el archivo así:

7zr x Cubian-nano-x1-a10-hdmi.img.7z

Copia la imagen a la memoria uSD

Coloca tu memoria sd en el lector y copia la imagen a la misma. Yo estoy usando micro sd’s de 8GB y me han funcionando muy bien.

micro_sd_8gb

sudo dd if=Cubian-nano-x1-a10-hdmi.img of=/dev/mmcblk0

Nota que en mi caso la memoria sd se detecta como /dev/mmcblk0 y así como aparece lo uso. NUNCA uses la partición /dev/mmcblk0p1.

Configurando el sistema

Inicia el sistema

Arranca tu sistema conectando un monitor y un teclado. Sigue el wizard para realizar la configuración inicial y reinicia el sistema.

cubieboard

Actualiza el sistema

Actualiza los paquetes y el sistema para tener la última versión.

sudo su -
apt-get install aptitude
aptitude update
aptitude upgrade

Wifi

Instalando el módulo

Estoy usando una tarjeta DWA-131E1 de D-Link, su módulo no está incluido en la distribución, así que lo voy a compilar. Es relativamente fácil encontrar este hardware en México y también es económico, por eso lo incorporé al diseño.

dwa-131e1

aptitude install usbutils
aptitude install firmware-realtek firmware-linux

aptitude install build-essential git
aptitude install linux-headers
aptitude install linux-headers-3.4.79-sun4i

git clone https://github.com/romcyncynatus/rtl8192eu.git

Ya que tenemos todos los paquetes necesarios, ahora sí lo compilaremos.

cd rtl8192eu

Comenta la siguiente línea  en el archivo Makefile anteponiendo el numeral #

#EXTRA_CFLAGS += -Wno-error=date-time

Guarda el archivo y comienza la compilación,  posteriormente instala los binarios

make ARCH=arm KVER=3.4.79-sun4i
make ARCH=arm KVER=3.4.79-sun4i install

Agrega las opciones del módulo, no estoy muy claro si las debería de llevar o no, si alguien ha hecho más pruebas, me vendrían muy bien sus comentarios.

Crea el archivo /etc/modprobe.d/8192eu.conf

options 8192eu rtw_power_mgnt=0 rtw_enusbss=0

Edita el archivo que carga los módulos al arranque para que esté presente cuando inicies la cubieboard. /etc/modules

#wifi
8192eu

Reinicia y prueba que se cargue el módulo correctamente. Una forma sencilla es ejecutar el comando:

lsmod | grep 8192eu

Configurando el SSID

Ejecuta el siguiente comando, reemplazando Mi_SSID por el nombre de tu red.

wpa_passphrase Mi_SSID

La salida será parecida a esto:

network={
   ssid="Mi_SSID"
   #psk="my_very_secret_passphrase"
   psk=ee80f3ecd6496a956e76f7c0332960326951f8edee80f3ecd6496a956e76f7c0332960326951f8ed
}

Para que se configure al inicio del sistema tenemos que editar /etc/network/interfaces.

auto wlan0
iface wlan0 inet dhcp
   wpa-ssid Mi_SSID
   wpa-psk ee80f3ecd6496a956e76f7c0332960326951f8edee80f3ecd6496a956e76f7c0332960326951f8ed

Prueba que funcione levantando la interface y revisando que se haya configurado correctamente con ifconfig.

ifup wlan0 && ifconfig wlan0

Almacenamiento

disco_duro_2-5

Preparar el almacenamiento

Apaga el sistema y conecta el disco duro de 2.5″, seguramente el sistema le asignará el descriptor /dev/sda1, lo puedes checar con un dmesg.

Formatea con ext4

mkfs.ext4 -I 256 /dev/sda1

Móntalo permanentemente

Edita el archivo /etc/fstab, es el lugar en donde el sistema guarda la tabla para montar sistemas de archivos automáticamente. Agrega al final la siguiente línea.

/dev/sda1  /archivos  ext4  noatime,dealloc  0  0

Arregla los locales

Encontrarás errores sobre los locales si cambiaste el idioma de inglés a español. Aquí algunos tips de como arreglarlo:

locale-gen
dpgk-reconfigure locales

Instalando el miniDLNA

Ahora configuraremos el servidor miniDLNA que nos ayudará a compartir la música y los videos con smartTVs y consolas.

aptitude install minidlna

Edita el archivo /etc/minidlna.conf y cambia las siguientes líneas:

media_dir=/mi_ruta
presentation_url=http://mi_ip:8200

Cambia /mi_ruta por el directorio en donde están tus archivos a compartir, también cambia mi_ip por la IP que tu sistema usará. (también sería recomendable configurar tu interface wlan0 con una dirección estática para que nunca cambie).

Instalando el servidor web

Un servidor web muy ligero y rápido es nginx, en lo personal lo prefiero a apache para aplicaciones pequeñas. No viene preeinstalado en el sistema, así que hay que instalarlo y configurarlo.

aptitude install nginx

Edita el archivo /etc/nginx/sites-enable/default, encuentra la sección que comienza con «location /» y agrega esto entre las llaves:

autoindex on;

La línea anterior te permitirá ver todos los archivos y navegar entre ellos.

Aquí puedes agregar un sistema sencillo de autenticación como un htaccess o similar.

Happy sharing!!