Longan Nano, le kit RISC-V à moins de 5$

[PUB: Pour un guide complet sur la Longan Nano, courrez acheter le Hackable 33 pour lire l’article «Un RISC-V à bas coût pour monitorer votre PC avec LCDproc»]

Je viens de recevoir mon kit, voici donc une petite description du déballage du kit basé sur un microcontrôleur RISC-V GD32VF nommé Longan Nano.

Le kit est tout petit mais comporte quand même une LED tricolore, un écran LCD, des boutons, …

Pour accéder à l’usb (mode DFU) il faut laisser le bouton boot0 appuyé tout en branchant le kit. On obtient le message suivant :

$ dmesg
[896404.667425] usb 3-2: new full-speed USB device number 59 using xhci_hcd
[896404.808892] usb 3-2: New USB device found, idVendor=28e9, idProduct=0189
[896404.808895] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[896404.808896] usb 3-2: Product: GD32 0x418 DFU Bootloade
[896404.808897] usb 3-2: Manufacturer: GDMicroelectronics
[896404.808898] usb 3-2: SerialNumber: 䌳䩂

Surtout retenez bien le numéro de série 😉

Outils et développement

SiPeed indique comment développer sur son kit avec Visual Studio (Hé oui le truc tourne sous Linux !) et la plate-forme platform.io.

Il faut donc commencer par installer les outils Microsoft qui, à ma grande surprise, fonctionnent très bien sur debian (64bits) ! Ça me vexe un peu d’ailleurs, mais passons.

$ sudo dpkg -i /home/fabien/Téléchargements/code_1.39.2-1571154070_amd64.deb

  • Visual Studio se lance simplement avec la commande code (pas du tout prétentieux):

$ code

  • Pour installer le greffon platformio (pio pour les intimes) il faut faire une recherche dans les extensions et installer PlatformIO IDE. Et patienter un peu (1 à 2 minutes chez moi).
  • Pour configurer le bouzin pour la Longan Nano il suffit d’ouvrir une console dans l’outils (symbole platformio fourmi -> quick access -> New Terminal) puis de lancer la commande :
$ platformio platform install gd32v
 PlatformManager: Installing gd32v
 gd32v @ 1.1.0 has been successfully installed!
 PackageManager: Installing toolchain-gd32v @ ~9.2.0
 Downloading  [####################################]  100%          
 Unpacking  [####################################]  100%          
 toolchain-gd32v @ 9.2.0 has been successfully installed!
 The platform 'gd32v' has been successfully installed!
 The rest of packages will be installed automatically depending on your build environment.
  • Perso j’ai plutôt pris la version «à jour» github :
$ platformio platform install https://github.com/sipeed/platform-gd32vLangage du code : JavaScript (javascript)
  • Un guide est donné également pour faire clignoter la LED en rouge. Il faut néanmoins faire quelques modifications pour le téléchargement du programme dans le micro comme nous allons le voir.
  • Lancer l’exemple longan-nano-blink
  • Modifier le fichier platform.ini comme suivant :
[env:sipeed-longan-nano]
platform = gd32v
framework = gd32vf103-sdk
board = sipeed-longan-nano
monitor_speed = 115200

; change microcontroller
board_build.mcu = GD32VF103CBT6

; change MCU frequency
board_build.f_cpu = 108000000L

; upload_protocol = sipeed-rv-debugger

upload_protocol = dfu
  • Ajouter les règles udev pour l’usb :

$ sudo vim /etc/udev/rules.d/90-longan-nano.rules

  • Avec la règle suivante (en supposant que votre utilisateur fait parti du groupe dialout depuis longtemps déjà).

ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"

  • Installer les outils DFU :

$ sudo apt-get install dfu-util

  • (Re-)Démarrer le kit en mode «bootstrap» en le branchant à l’USB du pc tout en restant appuyé sur le bouton «boot0». Une fois branché vous avez l’autorisation de lâcher le bouton 😉 Constater que le kit est bien présent sur l’usb :

$ sudo dfu-util -l
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=1, name="@Option Bytes /0x1FFFF800/01016 g", serial="??" Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=0, name="@Internal Flash /0x08000000/512002Kg", serial="??"

$  sudo dfu-util -l
 dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2016 Tormod Volden and Stefan Schmidt
 This program is Free Software and has ABSOLUTELY NO WARRANTY
 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=1, name="@Option Bytes  /0x1FFFF800/01016 g", serial="??" Found DFU: [28e9:0189] ver=1000, devnum=62, cfg=1, intf=0, path="3-1", alt=0, name="@Internal Flash  /0x08000000/512002Kg", serial="??"Langage du code : JavaScript (javascript)
  • Compiler (le minuscule symbole de check en V en bas à gauche)
  • Télécharger (le minuscule symbole flèche juste à coté du minuscule symbole de compile)
> Executing task: platformio run --target upload <

Processing sipeed-longan-nano (platform: gd32v; framework: gd32vf103-sdk; board: sipeed-longan-nano)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PackageManager: Installing tool-openocd-gd32v @ ~0.1.1
Downloading  [####################################]  100%          
tool-openocd-gd32v @ 0.1.1 has been successfully installed!
PackageManager: Installing tool-gd32vflash @ ~0.1.0
tool-gd32vflash @ 0.1.0 has been successfully installed!
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/gd32v/sipeed-longan-nano.html
PLATFORM: GigaDevice GD32V 1.1.0 > Sipeed Longan Nano
HARDWARE: GD32VF103CBT6 108MHz, 32KB RAM, 128KB Flash
DEBUG: Current (altera-usb-blaster) External (altera-usb-blaster, gd-link, jlink, rv-link, sipeed-rv-debugger, um232h)
PACKAGES: tool-openocd-gd32v 0.1.1, framework-gd32vf103-sdk 1.0.0, tool-gd32vflash 0.1.0, toolchain-gd32v 9.2.0
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Compiling .pio/build/sipeed-longan-nano/src/main.o
Compiling .pio/build/sipeed-longan-nano/src/systick.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_adc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_bkp.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_can.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_crc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dac.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dbg.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_dma.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_eclic.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_exmc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_exti.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_fmc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_fwdgt.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_gpio.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_i2c.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_pmu.o
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c: In function 'i2c_flag_clear':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c:610:14: warning: variable 'temp' set but not used [-Wunused-but-set-variable]
  610 |     uint32_t temp;
      |              ^~~~
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c: In function 'i2c_interrupt_flag_clear':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c:718:14: warning: variable 'temp' set but not used [-Wunused-but-set-variable]
  718 |     uint32_t temp;
      |              ^~~~
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_rcu.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_rtc.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_spi.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_timer.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_usart.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/Source/gd32vf103_wwdgt.o
Compiling .pio/build/sipeed-longan-nano/standard_peripheral/system_gd32vf103.o
Compiling .pio/build/sipeed-longan-nano/RISCV/drivers/n200_func.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/entry.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/handlers.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/init.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/start.o
Compiling .pio/build/sipeed-longan-nano/RISCV/env_Eclipse/your_printf.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/_exit.o
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/RISCV/env_Eclipse/your_printf.c: In function '__wrap_printf':
/home/fabien/.platformio/packages/framework-gd32vf103-sdk/RISCV/env_Eclipse/your_printf.c:4:1: warning: control reaches end of non-void function [-Wreturn-type]
    4 | }
      | ^
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/close.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/fstat.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/isatty.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/lseek.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/read.o
Archiving .pio/build/sipeed-longan-nano/libstandard_peripheral.a
Indexing .pio/build/sipeed-longan-nano/libstandard_peripheral.a
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/sbrk.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/write.o
Compiling .pio/build/sipeed-longan-nano/RISCV/stubs/write_hex.o
Archiving .pio/build/sipeed-longan-nano/libRISCV.a
Indexing .pio/build/sipeed-longan-nano/libRISCV.a
Linking .pio/build/sipeed-longan-nano/firmware.elf
Checking size .pio/build/sipeed-longan-nano/firmware.elf
Building .pio/build/sipeed-longan-nano/firmware.bin
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=         ]   7.0% (used 2310 bytes from 32768 bytes)
PROGRAM: [=         ]   5.0% (used 6572 bytes from 131072 bytes)
Configuring upload protocol...
AVAILABLE: altera-usb-blaster, dfu, gd-link, jlink, rv-link, serial, sipeed-rv-debugger, um232h
CURRENT: upload_protocol = dfu
Uploading .pio/build/sipeed-longan-nano/firmware.bin
dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Opening DFU capable USB device...
ID 28e9:0189
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
GD32 flash memory access detected
Device model: GD32VF103CB
Memory segment (0x08000000 - 0801ffff)(rew)
Erase size 1024, page count 128
Downloading to address = 0x08000000, size = 6584

Download        [                         ]   0%            0 bytes
Download        [=======                  ]  31%         2048 bytes
Download        [===============          ]  62%         4096 bytes
Download        [=======================  ]  93%         6144 bytes
Download        [=========================] 100%         6584 bytes
Download done.
File downloaded successfully
Transitioning to dfuMANIFEST stateLangage du code : HTML, XML (xml)
  • Et voilà ! La led clignote en rouge. Pour la passer en vert (par exemple) il faut changer le code de main.c:
/* BUILTIN LED OF LONGAN BOARDS IS PIN PC13
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_CLK RCU_GPIOC
*/

/* BUILTIN LED GREEN*/
#define LED_PIN BIT(1)
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK RCU_GPIOALangage du code : CSS (css)

Le pinout de la LED RGB n’apparaît pas sur ce schéma

Publié dans électronique, Non classé | Marqué avec , , | 10 commentaires

Zaleae Logic 16 – Prise de notes

Sur le site d’aliexpress, j’ai fait l’acquisition d’un analyseur logic sur usb nommé Saleae Logic 16 pchit pchit pas de marque.

Contrairement au marquage, cet appareil n’est pas un Saleae Logic 16 mais une vulgaire copie chinoise «compatible»

Ce billet de blog est là pour garder une prise de notes de mes manip’ avec l’engin.

Le colis comporte :

  • Le boitier USB Saleae Logic 16
  • un câble déjà branché avec 16 fils «dupont» de signals et 4 fils «dupont» de masse
  • un câble USB (violet!) de 1.5m

Le logiciel peut fonctionner sous Linux et est téléchargeable sous la forme d’une archive zip de 27Mo à l’adresse suivante. Pour le manuel c’est par ici.

Pour l’installer il suffit de le dézziper dans le répertoire de son choix. Pour l’instant je n’ai pas trouvé d’autre solution que de le lancer en sudo pour qu’il fonctionne:

$ cd Logic\ 1.2.18\ (64-bit)/
$ sudo ./Logic

Ce qui donne une fenêtre comme ça :

La sonde est détectée au branchement de l’usb :

[14601.025730] usb 1-1.2: new high-speed USB device number 7 using ehci-pci
[14601.134110] usb 1-1.2: New USB device found, idVendor=21a9, idProduct=1001
[14601.134113] usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0

Mais elle nécessite les droits en écriture sur l’USB. Il faut donc rajouter le fichier udev avec les autorisations diabolique !

$ sudo vim /etc/udev/rules.d/91-saleae.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="21a9", MODE="0666"
SUBSYSTEM=="usb_device", ATTRS{idVendor}=="21a9", MODE="0666"

Liens divers:

  • Le user guide qui ne semble pas inclure le saleae que j’ai.
  • Le produit sur le site d’aliexpress, visiblement c’est une copie pirate du vrai saleae Logic 16 (on voit que le marquage à été vulgairement effacé sur l’image du produit).

[Edit 20/03/2021]

En ayant commandé un deuxième j’ai pu m’apercevoir que le marquage à changé sur le boitier:

Le clone chinois se nomme désormais Zaleae

Publié dans électronique | Marqué avec | Laisser un commentaire

Papyr, le papier électronique par electronut labs

Electronut LABS propose un petit kit permettant de tester le papier électronique connecté au bluetooth. Le kit est proposé dans une petite boite métallique, la documentation n’est disponible que sur le site officiel.

Le kit papyr sorti de sa boite en métal

L’intérêt de ce genre de kit est de tester le papier électronique, mais comme la carte inclue également un chip Bluetooth nRF52840 de chez nordic. On peut donc faire une pierre deux coups : tester un epaper et le bluetooth.

Test rapide

Pour un test rapide, il faut un téléphone muni d’un OS android et un accès au «store» de google. L’appli est simplement accessible sous le nom «electronut labs». Une fois lancé il nous reste à:

  • Allumer le kit en insérant la pile et en commutant le bouton sur «batt»
  • lancer l’application de dessin
  • Dessiner ce que l’on souhaite (pas évident, l’appli est assez mal foutue)
  • cliquer sur «send image»
  • Attendre presque 30 secondes que l’écran change.
  • L’écran va d’abord clignoté en noir pour dessiner les parties noires
  • Puis il va clignoter en rouge pour dessiner les parties rouge
On en chie pour dessiner un simple bonhomme 😉

Si l’on éteint le kit (bouton position usb) alors l’image reste, c’est le but recherché.

Publié dans électronique, Non classé | Marqué avec , , , , , , | Laisser un commentaire

Réception du kit SiPeed MAIX GO

(Bloc notes éditables au fur et à mesures de mes expérimentations)

La société chinoise SiPeed (le site s’affiche très mal avec firefox chez moi, par contre chromium marche mieux) lançait une campagne de crowdfunding en novembre dernier pour construire un kit de developpement à base de module Kendryte K210 muni d’un double cœurs Risc-V 64bits.

Pour $50 on pouvait acquérir un kit complet muni de :

  • La carte électronique SiPeed MAIX GO
  • un réseau de microphones
  • Un simple micro + HP
  • Un écran LCD + touchscreen
  • Une simple caméra
  • Une carte double caméras stéréo
  • Une antenne wifi et toute la visserie nécessaire pour faire un boîtier


Voici donc le contenu du colis reçu après deux mois de retard (ce qui n’est pas non plus exceptionnel dans ce genre de campagne de crowdfunding):

Contenu de la boite M1W

Une notice de montage est fournie sous forme de vidéo youtube (encore …).

Le kit complet
La carte «mère» et son fameux module SIPEED M1W

À l’allumage on détecte quelques trucs sur le dmesg

$ dmesg
[21758.478583] usb 3-2: new full-speed USB device number 4 using xhci_hcd
[21758.620109] usb 3-2: New USB device found, idVendor=c251, idProduct=f001
[21758.620113] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[21758.620116] usb 3-2: Product: CMSIS-DAP
[21758.620118] usb 3-2: Manufacturer: CMSIS-DAP by ARM
[21758.620119] usb 3-2: SerialNumber: 0001A0000000
[21758.620902] cdc_acm 3-2:1.0: ttyACM0: USB ACM device
[21758.622685] hid-generic 0003:C251:F001.0006: hiddev0,hidraw3: USB HID v1.00 Device [CMSIS-DAP by ARM CMSIS-DAP] on usb-0000:00:14.0-2/input2

Langage du code : PHP (php)

Il est possible de se connecter au port série trouvé et on obtient un message du programme déjà chargé dans le kit :

$ kermit
C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux+SSL+KRB5 (64-bit)
 Copyright (C) 1985, 2011,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/fabien/) C-Kermit>c
Connecting to /dev/ttyACM0, speed 115200
 Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------

 __  __              _____  __   __  _____   __     __ 
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ / 
| |\/| |   / /\ \     | |     > <   |  ___/    \   /  
| |  | |  / ____ \   _| |_   / . \  | |         | |   
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|
Official Site:http://www.sipeed.com/
Wiki:http://maixpy.sipeed.com/
[MAIXPY]Pll0:freq:320666666
[MAIXPY]Pll1:freq:159714285
[MAIXPY]Flash:0xc8:0x17
[MAIXPY]:Spiffs Mount successful 
[MAIXPY]LCD:init

MicroPython 3b5c45649-dirty on 2018-11-15; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>> 
Langage du code : PHP (php)

Par contre, pour le moment, impossible d’écrire quoi que ce soit sur la console avec kermit. Michael Wilkinson donne quelques indices quand à ce problème dans les commentaires d’indiegogo :

«Michael Wilkinson 6 days ago

I’ve received my ALL IN ONE as well today. Quick tip: If you are having trouble connecting to the REPL out of box over serial, make sure you are using 115200 baud and hardware flow control or you’ll get nothing. From the schematic it appears that DTR and RTS are wired to BOOT and RST and so must be actively controlled. Might only be a thing on the MAIX GO boards which have a dedicated STM32 JTAG/UART bridge chip on them.»

Visiblement il suffirait d’activer le contrôle de flux pour que ça puisse marcher correctement.

Sentry donne une solution sur le forum sipeed. En utilisant un petit script python qui appel miniterm en désactivant les ligne dtr et rts on arrive à se logger correctement sur la carte.

import serial.tools.miniterm as MTM

MTM.main(default_port='/dev/ttyACM0',
        default_baudrate=115200,
        default_dtr=False,
        default_rts=False)
Langage du code : PHP (php)

Le script se lance ensuite simplement avec python (2.7 chez moi) :

$ python sipeedcom.py 
--- forcing DTR inactive
--- forcing RTS inactive
--- Miniterm on /dev/ttyACM0  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

 __  __              _____  __   __  _____   __     __ 
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ / 
| |\/| |   / /\ \     | |     > <   |  ___/    \   /  
| |  | |  / ____ \   _| |_   / . \  | |         | |   
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|
Official Site:http://www.sipeed.com/
Wiki:http://maixpy.sipeed.com/
[MAIXPY]Pll0:freq:320666666
[MAIXPY]Pll1:freq:159714285
[MAIXPY]Flash:0xc8:0x17
[MAIXPY]:Spiffs Mount successful 
[MAIXPY]LCD:init

MicroPython 3b5c45649-dirty on 2018-11-15; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>> help()
Welcome to MicroPython on the Sipeed Maix One!

For generic online docs please visit http://maixpy.sipeed.com/

Official website : www.sipeed.com

Current installed module:
os modules:Built-in system operation module and file operation method
machine module:Built in some machine related modules
socket modules:Network operation method
app modules   :Provide some applications

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>> help('modules')
object modules is of type str
  encode -- <function>
  find -- <function>
  rfind -- <function>
  index -- <function>
  rindex -- <function>
  join -- <function>
  split -- <function>
  splitlines -- <function>
  rsplit -- <function>
  startswith -- <function>
  endswith -- <function>
  strip -- <function>
  lstrip -- <function>
  rstrip -- <function>
  format -- <function>
  replace -- <function>
  count -- <function>
  partition -- <function>
  rpartition -- <function>
  center -- <function>
  lower -- <function>
  upper -- <function>
  isspace -- <function>
  isalpha -- <function>
  isdigit -- <function>
  isupper -- <function>
  islower -- <function>
>>> 
Langage du code : HTML, XML (xml)

Pour quitter miniterm faire un Ctrl+] ou éteindre le maixpy.

La documentation de MaixPY est disponible en anglais ici.

Ressources:

[ Le réseau de micro de la MaixPy]

Publié dans Non classé | Marqué avec , , , , , | Laisser un commentaire

Réception de la VegaBoard

OpenISA propose une carte de développement à base de cœur Risc-V et Arm pour faire de l’IoT: la VEGABoard.

Schéma blocs de la VEGABoard

Le premier lots de cartes était disponible à la demande en novembre/décembre 2018. Ayant demandé gentiment j’ai pu recevoir un kit de leur part 😉

Le kit est assez minimaliste et se présente sous la forme d’une petite boite en carton.

Avec la carte de développement, un câble USB et quelques ponté-de-court-circuits.

Pour le guide de démarrage il y a une petite feuille volante nous demandant d’aller voir sur internet.

On peut également visionner la vidéo de démarrage et de branchement de sa VEGABoard sur Youtube.

Visiblement il manque la sonde JTaG dans mon kit. Mais je pense que c’est voulu, on doit déjà pouvoir commencer à faire des choses sans. La sonde JTaG proposée est une JLink un peu cher (à partir de 300€ visiblement) donc on fera sans pour le moment tant que je ne trouverais pas de solution plus viable. D’après le forum officiel il est possible de se procurer une version low-cost de cette sonde chez adafruit.

Le branchement à l’ordinateur sur le connecteur USB J12 fait apparaître pas mal d’interfaces dans le dmesg :

$ dmesg
[ 1178.214445] usb 3-1: new high-speed USB device number 2 using xhci_hcd
[ 1178.355326] usb 3-1: New USB device found, idVendor=0d28, idProduct=0204
[ 1178.355331] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1178.355334] usb 3-1: Product: DAPLink CMSIS-DAP
[ 1178.355337] usb 3-1: Manufacturer: ARM
[ 1178.355339] usb 3-1: SerialNumber: 02250000800a00184e453614ffffffff0028ffff97969906
[ 1178.357544] hid-generic 0003:0D28:0204.0004: hiddev0,hidraw3: USB HID v1.00 Device [ARM DAPLink CMSIS-DAP] on usb-0000:00:14.0-1/input3
[ 1178.952081] usb-storage 3-1:1.0: USB Mass Storage device detected
[ 1178.952231] scsi host6: usb-storage 3-1:1.0
[ 1178.952360] usbcore: registered new interface driver usb-storage
[ 1178.973347] usbcore: registered new interface driver uas
[ 1178.982598] cdc_acm 3-1:1.1: ttyACM0: USB ACM device
[ 1178.982842] usbcore: registered new interface driver cdc_acm
[ 1178.982843] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 1179.967098] scsi 6:0:0:0: Direct-Access MBED VFS 0.1 PQ: 0 ANSI: 2
[ 1179.967849] sd 6:0:0:0: Attached scsi generic sg2 type 0
[ 1179.967976] sd 6:0:0:0: [sdc] 131200 512-byte logical blocks: (67.2 MB/64.1 MiB)
[ 1179.968101] sd 6:0:0:0: [sdc] Write Protect is off
[ 1179.968107] sd 6:0:0:0: [sdc] Mode Sense: 03 00 00 00
[ 1179.968260] sd 6:0:0:0: [sdc] No Caching mode page found
[ 1179.968270] sd 6:0:0:0: [sdc] Assuming drive cache: write through
[ 1179.972344] sd 6:0:0:0: [sdc] Attached SCSI removable disk

En plus de l’habituel port de debug en uart (ttyACM0) on peut voir se monter un disque (sdc) ! Ce disque contient un fichier HTML avec un liens vers une page de NXP et un fichier de détails donnant ce qui semble être les caractéristiques de la carte:


$ cat /media/fabien/RV32M1/DETAILS.TXT
# DAPLink Firmware - see https://mbed.com/daplink
Unique ID: 02250000800a00184e453614ffffffff0028ffff97969906
HIC ID: 97969906
Auto Reset: 0
Automation allowed: 0
Overflow detection: 0
Daplink Mode: Interface
Interface Version: 0244
Git SHA: 6ff5529d66104e9744bf43fb3ee62baecd11b560
Local Mods: 1
USB Interfaces: MSD, CDC, HID
Interface CRC: 0xae100b74
Remount count: 0

La connexion au port uart /dev/ttyACM0 avec kermit (115200) me donne une suite ininterrompue de coordonnées x/y :

$ kermit -c
[...]
x=  1 y =  4
x=  1 y =  4
x=  1 y =  5
x=  1 y =  5
x=  1 y =  5
x=  1 y =  4
x=  1 y =  4
x=  1 y =  4
[...]

Pour commencer à jouer avec la carte, il faut se rendre sur le site d’OpenISA. La totalité de la documentation du kit est disponible sous la forme d’un gros (39Mo) zip téléchargeable sur leur site:

$ wget https://github.com/open-isa-org/open-isa.org/releases/download/1.0.0/Documentation.zipLangage du code : JavaScript (javascript)

Le SDK est disponible en téléchargement directement via une archive au forma *.sh ! Ce script (de 38Mo !) permet de forcer l’utilisateur à lire la licence avant de pouvoir décompresser l’archive tar.gz :

$ wget https://github.com/open-isa-org/open-isa.org/releases/download/1.0.0/rv32m1_sdk_riscv_installer.sh
[...]
$ bash rv32m1_sdk_riscv_installer.sh 
$ ls
rv32m1_sdk_riscv_installer.sh  rv32m1_sdk_riscv.tar.gz
$ tar -zxvf rv32m1_sdk_riscv.tar.gz 
[...]Langage du code : JavaScript (javascript)

Attention l’archive ne se décompresse pas dans un sous répertoire, donc si vous êtes dans votre home vous allez en foutre partout.

L’archive contient un pdf «getting started guide» expliquant le fonctionnement de la toolchain.

[À suivre sur cette même page …]

Publié dans Non classé | Marqué avec , , , , | Laisser un commentaire

Qu’affiche le code suivant ?

char* states[] = {
    "PLOP",
    "PLIP",
    "BOUHHH",
    "CROTTE",
    "DINGDING",
    "CAFE",
    "UB40"
    "GWB",
};
char * others_string[] = {
    "ROGER",
    "RABBIT",
};
[...]

printf("State %s\n", states[7]);

Je précise que je compile toujours en -Wall et que je n’avais aucun warning bien sûr !

[edit 6 décembre 2018]

Si c’est un compilateur GCC pour ARM sur APF6 (j’ai pas toutes les options en tête) la fonction printf affiche :

State ROGER

Par contre sur un pc (debian) sans aucune option spécifique :

State (null)

Et oui ça n’est pas vu comme un bug … puisque ça compile en -Wall et que ça s’exécute sans problème (enfin pour l’exécution il y a quand même une histoire de pointeur qui va trifouiller au mauvais endroit de la mémoire sur la version «embarquées»).

Tout simplement car deux chaînes de caractères côtes à côtes sont considérées comme une seule et même chaîne.
Ici « UB40 » et « GWB » ne sont pas deux chaînes de caractères distinctes mais une seule et même chaîne : « UB40GWB ». Il n’y a pas d’index numéro 7 et donc on déborde sur la suite … qui est également un tableau de pointeurs sur chaînes de caractères. Du coup ça ne le dérange pas de l’afficher.
cqfd

Publié le par admin | 3 commentaires

Partage des photos sur le réseau local avec sa raspberry-pi

C’est pas souvent que je suis contraint de toucher à l’OS de Micro$oft, mais à chaque fois ça me rend fou !

Alors voila, je cherche à faire un truc qui me semble simple : partager un disque dur sur mon réseau local pour que tous les ordinateurs de la maison puissent y avoir accès. Et plus particulièrement : que tout le monde puisse avoir accès aux photos.

Pour cela je suis parti gaiement la fleur au fusils installer samba sur ma raspberry pi (raspbian) et j’ai suivi quelques tuto sur le web pour partager mon disque dur USB à toute la maison.

Le tutoriel est plutôt simple, le partage se fait parfaitement avec mon ordinateur (debian). Rappelons tout de même que Samba utilise un protocole micro$oft, donc si ça marche même sur un pc Debian, cela devrait être transparent sous W$ …

Et bien non, j’ai tout simplement pas réussi à accéder au partage samba de ma raspberrypi avec l’ordinateur w$ que j’ai à la maison.

C’est un ordinateur «familiale» qui possède donc un windows «windows 10 family». Et bien il semblerait que cela ne fonctionne pas avec la version famille de w$10 !

J’ai eu beau tester d’obscures commandes ici et ici, mais non impossible, w$ persiste à me dire que j’ai pas la possibilité d’y accéder et qu’il faut contacter l’administrateur (peut-être aller mettre un cierge …).

Pour préserver ma santé j’ai donc abandonné l’idée de partage samba et lancé simplement la commande python suivante dans le répertoire que je voulais partager:

Photos/$ python -m SimpleHTTPServer

Une fois cette commande lancée sur la raspberrypi il est possible de parcourir avec firefox (en lecture seule) le contenu des répertoires, charger les fichiers que l’on souhaite visualiser en allant simplement sur le «site» en question :

http://raspberrypi.local:8000/

Seulement quand on souhaite visualiser les photos d’un répertoire, elles vont s’afficher une par une et il faudra revenir en arrière à chaque fois pour aller cliquer sur la suivante.

Ce qui serait bien c’est de pouvoir naviguer vers la photo précédente et/ou la suivante avec un simple bouton.

C’est quelque chose qui peu se faire assez simplement avec un script greasemonkey.

Voici donc le script en question qui ajoute un lien vers la photos précédente et un lien vers la photo suivante.

C’est du quick&dirty mais ça fait le job.

Pour l’installer il faut bien sûr avoir l’extension «greasemonkey» installée sur son firefox. Puis ouvrir le menu greasemonkey en cliquant sur le singe. De là il suffit de copier coller le code fourni en lien puis d’activer le script.

Publié dans humeur, informatique | Marqué avec , , , , , , , | Laisser un commentaire

Prise en main de l’émetteur récepteur 433Mhz RXFcom dans domoticz sur Raspberrypi

J’ai craqué, plutôt que de continuer mon hack avec l’entrée son sur un kit rasbperry-pi, j’ai acheté un produit tout fait du marché : le CM180. Je ne trouvais pas le temps pour bien calibrer mon montage raspberry-pi. De plus, l’enregistrement du son en continu avec les calculs de puissance RMS prenait beaucoup de ressource proc et … consommait pas mal !

Du coup j’ai un super afficheur au milieu du salon qui me donne la puissance électrique consommé par ma maison en temps réel. Le boitier en question communique avec le boîtier de mesure en 433Mhz se situant dans mon tableau électrique.

Je n’ai cependant pas perdu de vue mon objectif premier : enregistrer (logger) la consommation électrique de la maison avec ma raspberry-pi. Pour cela j’aurais pu faire un montage à base de petit émetteur/récepteur 433Mhz comme on en trouve des milliers sur le marché. J’aurais pu également me lancer dans le montage d’un émetteur récepteur libre à base d’arduino comme on en trouve à travers le web. Mais non, là encore j’ai craqué pour un truc tout fait du commerce (et bien plus cher) en achetant un RFXcom USB. L’objectif étant de ne pas perdre trop de temps en configuration pour me concentrer sur la gestion d’un serveur de log sur raspberry-pi (certainement domoticz).

Le vif du sujet

On trouve plusieurs tutoriels pour l’installation du RFXcom sous Linux. Mais comme d’habitude avec mon pc sous debian, ça ne marche pas tout à fait comme décrit.

Et comme l’objectif final est d’utiliser l’adaptateur sur une raspberrypi, autant s’y mettre tout de suite, d’autant que tutomotic propose un très bon tutoriel pour ça.

L’installation sur la raspberrypi est extrêmement simple, il suffit de taper la commande :

sudo curl -L install.domoticz.com | bash

Puis de se connecter au serveur avec son navigateur pour la configuration.

Pour la connexion de domoticz au CM180 on se reportera au tuto de l’atelier du geek qui explique tout très bien. Une fois l’adaptateur ajouté, le compteur d’energie est visible dans la rubrique «dispositif».

Et voila on peut maintenant fliquer sa consommation d’électricité minute par minute 😉

Publié dans embarqué, informatique, Non classé | Marqué avec , , , | Laisser un commentaire

Piloter un servo-moteur avec le kit HiFive1 à cœur Risc-V

Pour prendre la main sur une nouvelle plate-forme électronique, la manip de base (hello world) est de faire clignoter une led. C’est vrai qu’avec une simple led on peut déjà «afficher» quelques informations, il suffit pour cela de la faire clignoter de plusieurs manières différentes pour obtenir l’état du système que l’on veut connaître.

C’est simple, c’est visuel et c’est rigolo. Seulement c’est vraiment très basique et on pourrait innover un peut dans le «Hello World de l’électronique». Par exemple en faisant bouger un servomoteur !

Le signal de commande d’un servo-moteur est assez simple, il faut envoyer une pulsation de largeur 1ms (min) à 2 ms (max) toute les 20ms.

Si on utilise un petit servo-moteur en 5v comme celui-là en plus, il suffit de l’alimenter par le 5 volt du kit et ça roule.

On trouve des propositions de montages pour piloter des servomoteurs sur le site d’arduino, mais le code donné ne fonctionne pas (encore?) avec le HiFive1 puisque la bibliothèque Servo n’est pas implémentée pour le Risc-V.

Avec un microcontrôleur comme le Hifive1 même pas besoin d’utiliser des trucs compliqués comme les PWM ou les timer. En effet le core pédale tellement vite (320Mhz) qu’une simple commutation dans la boucle principale avec des délais bien ajustés suffisent à générer le signal de pilotage correctement.

Pour un essais rapide, on peut simplement utiliser l’IDE d’arduino comme je l’avais expliqué dans un précédent article.

La fonction générant le signal utilise des delayMicroseconds():

void servo(int pos){
  digitalWrite(pwmpin, HIGH);
  delayMicroseconds(pos);
  digitalWrite(pwmpin, LOW);
  delayMicroseconds(16000); 
  delayMicroseconds(4000); 
}

D’après la doc la fonction de delaymicroseconds ne peut pas attendre plus de 16383 microsecondes. Du coup pour dépasser les 20ms on va l’appeler deux fois 😉

Le «pilotage» du servo se fait via une entrée bouton, quand on appui sur le bouton le servomoteur est en position minimal et quand on relâche le bouton le servomoteur se met en position maximal.


  if (readbtn == HIGH) {
   servo(1000);
  } else {
   servo(2000);
  }

Le code complet:


int pwmpin = 9; // pwm servo pin
int btnpin = 7; // «input button»
int readbtn = LOW;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(pwmpin, OUTPUT);
  pinMode(btnpin, INPUT);
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
}

void servo(int pos){
  digitalWrite(pwmpin, HIGH);
  delayMicroseconds(pos);
  digitalWrite(pwmpin, LOW);
  delayMicroseconds(16000); 
  delayMicroseconds(8000); 
}

// the loop function runs over and over again forever
void loop() {
  readbtn = digitalRead(btnpin);
  if (readbtn == HIGH) {
   servo(1000);
  } else {
   servo(2000);
  }
}

Une petite vidéo du fonctionnement du montage :

Voila, c’était rigolo de bidouiller le kit HiFive1 avec l’IDE playscool d’arduino, mais maintenant il va falloir passer à des trucs plus sérieux en utilisant du code C (puis assembleur) via la toolchain gnu de compilation.

À suivre donc…

Publié dans électronique, programmation | Marqué avec , , , | Laisser un commentaire

Débutons avec le module LoFive

Pour ceux qui veulent intégrer un processeur Risc-v dans leurs produits, un module réduit nommé LoFive a été proposé en vente groupé à la fin de l’été.
Les modules viennent d’être livrés. Voici donc un petit «starting-up» pour bien débuter avec le module.

La carte de référence de la société SiFive pour utiliser le E310 est le Hifive1 compatible arduino. Cependant si l’on veut intégrer le E310 dans un montage perso il peut être préférable d’utiliser un module comme le LoFive.

La société Qwerty embedded design proposait un kit complet pour jouer avec un riscv, en plus du module LoFive, on pouvait aussi avoir la plaque d’essais, les câbles et le convertisseur usb-ftdi/jtag.

Pour pouvoir programmer le composant il faut donc d’abord faire un petit montage en suivant le pinout donné sur la page du sdk permettant de brancher le JTAG ainsi que l’uart du ftdi vers le lofive.

Pour ma part j’ai tenté quelque chose d’artistique comme on peut le voir sur l’image suivante:

Branchement de l’adaptateur uart/Jtag ftdi sur le module LoFive

Pour la partie «informatique» il faut télécharger et compiler un dérivé du sdk hifive qu’on trouve sur github. On espère qu’une pull-request permettra de merger ce fork rapidement avec le freedom-sdk «officiel» utilisé pour le hifive. Parce que compiler deux sdk c’est lourd 😉

Pour le télécharger rien de plus simple, il suffit de lancer la commande suivante :

git clone --recursive https://github.com/sifive/freedom-e-sdk.git

Puis d’attendre, parce qu’il y a quelques git à télécharger. Pour le compiler c’est indiqué sur le github, il suffit de faire ça (après avoir installé tous les packets debian/ubuntu indiqué sur le github):

cd freedom-e-sdk
make tools [BOARD=freedom-e300-lofive]

Puis attendre de looooongues minutes (plus de 60 en fait chez moi…).

Les programmes de démo se trouvent dans le répertoire software/ et on peut les compiler en indiquant leur nom à make:

make software upload PROGRAM=demo_gpio BOARD=freedom-e300-lofive-blank

La commande termine avec une erreur, mais le programme démarre quand même …

Publié dans électronique, embarqué, informatique | Marqué avec , , , | Laisser un commentaire