Milk-V Duo (CV1800B)

Milk-V duo es una placa de desarrollo embebido muy pequeña basada en el chip CV1800B con dos núcleos y arquitectura RISC-V que puede ejecutar Linux reducido en uno de ellos y en el otro un RTOS o una aplicación de Arduino.

SISTEMAS EMBEBIDOS

Biblioman

8/24/20245 min leer

Introducción

Las placas con arquitectura RISC-V crecen como los champiñones. Si quieres "cacharrear" con una placa con procesador de arquitectura RISC-V y a bajo precio esta puede ser una opción valida. Pero eso si, ten en cuenta que tanto esta como otras placas similares son placas en desarrollo, veamos sus características hardware:

  • Soc: CVITEC CV1800B

  • Procesador: Dos núcleos independientes C906 (núcleo principal) a 1 GHz donde puede correr un sistema operativo reducido Linux y otro C906 a 700 Mhz donde puede correr de manera independiente un RTOS o un programa de Arduino

  • MCU: El SoC de la Duo incorpora también un micro-controlador 8051 con memoria RAM de 8KB. El subsistema formado por el núcleo 8051 como el núcleo auxiliar C906 a 700 MHz se comunican con el núcleo principal a través de MailBox.

  • TPU (Tensor Processing Unite): Motor de aceleración de IA para redes neuronales de aprendizaje profundo de 0.5 TOP en INT8, actualmente permite el formato de intercambio abierto ONNX y el framework Caffe.

  • Almacenamiento: Slot para tarjeta micro-SD

  • Memoria RAM: SIP 64 MB

  • USB: 1xUSB para alimentación y datos tipo C, pines para conexión USB disponibles.

  • Ethernet: 100 Mbps PHY

  • Conector para cámara CSI: MIPI CSI de 2 carriles.

  • GPIO: Hasta 26 pines de E/S de propósito general con funciones multiplexadas.

  • Alimentación: 5V/1A a través de conector USB tipo C

  • Tamaño: 21 mm x 51 mm

  • SDK: Builroot, RTOS

  • Imagen Oficial: Puedes acceder a la última versión desde aquí

  • Imágenes de terceros (producidas por la comunidad)

Puedes ver la descripción detallada del SoC en el siguiente enlace de Github

En el siguiente vídeo se muestra el Unboxing y los primeros pasos con esta placa así como la placa de expansión disponible para ella que incorpora cuatro puertos USB y conector RJ45 para Ethernet.

Nota: La última parte del vídeo no trata de la Milk-V Duo sino de la actualización de esta página WEB que coincidió en el tiempo con esta review , me pareció interesante incluirlo para el que esté interesado en la creación de una página web personal. Si no te interesa te la puedes saltar.

Milk-V Duo & Arduino

La serie Milk-V Duo ahora es compatible con el IDE de Arduino además de poder programarse en C y Python. Su manera de operar es la siguiente: el firmware de arduino (sketch) se ejecuta en el núcleo pequeño (700MHz), mientras que el núcleo principal (1GHz) se encarga de la comunicación con el IDE de Arduino. El núcleo principal recibe el firmware procedente del IDE de arduino y lo carga en el núcleo pequeño para su ejecución. Al mismo tiempo podemos seguir conectados por SSH al núcleo principal desde un PC y operando desde el, es lo que vamos a ver en el siguiente vídeo así como la prueba de la placa de expansión.

Comandos utilizados

A continuación muestro un resumen de los comandos utilizados en el vídeo, para obtener una documentación mas completa recomiendo visitar la wiki del proyecto.

Programación con arduino: la forma de proceder es similar a otras placas de arduino, nos descargamos la última versión del IDE desde la página oficial de arduino, añadimos la dirección del archivo .JSON https://github.com/milkv-duo/duo-arduino/releases/download/config/package_sg200x_index.json y añadimos la DUO como cualquier placa. Como comento en el vídeo la comunicación con el IDE de arduino y la carga del binario una vez compilado en el núcleo secundario corre a cargo del núcleo principal.

Nota: me ha ocurrido que después de ejecutar el sketch en el núcleo secundario, si el código incluía un bucle infinito al querer volver a cargar un programa en C o Python desde el núcleo principal no me dejaba, la solución que encontré es cargar otro programa de arduino donde simplemente no tuviera ningún bucle infinito y terminara el programa.

Programación en Python: si hemos instalado la versión oficial del sistema operativo ya lleva instalado el interprete de Python junto a las librería PinPong creada por DfRobot. La forma de programar utilizando este entorno es muy sencillo simplemente me conecto a la placa a través de SSH y abro el editor VI escribo el script en Python y lo guardo con extensión .py, para ejecutarlo simplemente escribe python ejemplo.py

Nota: Si utilizamos el LED que incorpora la placa (PIN 25) previamente tenemos que des-habilitar el script del parpadeo automático del LED que viene en el firmware predeterminado de DUO ejecutando el siguiente comando:

mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync

Programación en C: La milk DUO no tiene suficiente recursos hardware para instalar y compilar los ejemplos en C desde la propia placa para ello debemos de realizar compilación cruzada, lo ideal es crear una máquina virtual Ubuntu 20.04 con VirtuaBox y ejecutar los siguientes comandos:

Para compilar los ejemplos:

cd hello-world

make

Una vez compilado el ejemplo en la máquina virtual hay que transferirlo a la DUO por SCP:

scp helloworld root@192.168.42.1:/root/

Para ejecutarlo:

[root@milkv]~# ./helloworld

Hello, World!

Placa de expansión

La alimentación a la placa es a través del USB tipo C que trae la placa (solo es de alimentación). En este caso perdemos la conexión USB de la DUO y por tanto la conexión a la red a través de USB (RNDIS), la conexión a Ethernet se realiza a través del conector RJ-45 de la placa de expansión.

El firmware por defecto no establece una dirección MAC fija, para dejarla fija debemos de ejecutar el comando:

echo "pre-up ifconfig eth0 hw ether 78:01:B3:FC:E8:55" >> /etc/network/interfaces && sync

Después de eso hay que reiniciar la placa.

Para habilitar los 4 puertos USB hay que ejecutar:

ln -sf /mnt/system/usb-host.sh /mnt/system/usb.sh

sync

Y después reiniciar.

Para comprobar que la memoria USB a sido reconocida por la placa ejecutamos:

ls /dev/sd*

Nos debe de aparecer la unidad (/dev/sda1), para montarla en la carpeta udisk ejecutamos:

mkdir /mnt/udisk

mount /dev/sda1 /mnt/udisk

Y ya podremos acceder al contenido de la memoria USB

ls /mnt/udisk

Para desmontar la unidad:

umount /mnt/udisk

Nota: cuando utilizamos la placa de expansión automáticamente perdemos la conexión de red USB(RNDIS) para restaurar dicha funcionalidad debemos de ejecutar antes de apagar la placa los siguientes comandos:

ln -sf /mnt/system/usb-rndis.sh /mnt/system/usb.sh

sync

Enlace a tienda