L’Internet des Objets
2.1 Le matériel STM
La société STMicroelectronics produit des microcontroleurs et des capteurs numériques. Ceux-ci peuvent être intégrés dans des cartes. Les cartes que nous utilisons sont principalement :
- Nucleo
-
des cartes permettant de tester un microcontrôleur ;
- Discovery
-
des cartes comportant un microcontrôleur et des capteurs ;
- X-Nucleo
-
des cartes filles hébergeant principalement des capteurs ou actionneurs ;
D’autres objets existent développées par ST ou d’autres fabricants, comme les cartes MicroPython, les cartes LoRa de Seeedstudio…Nous présentons ici les cartes que nous avons manipulées :
- Nucleo
-
les cartes Nucleo
- Nucleo WB55
-
la carte Nucleo avec capacité BLE et d’autres protocoles similaires ;
- USB WB55
-
le processeur WB55 est disponible en carte Nucleo et en carte USB ;
- Seeedstudio WL55
-
une carte LoRa programmable en commandes AT ;
2.1.1 Nucleo WB55
Les WB55 sont disponibles sous forme de kit combinant les deux cartes, comme dans la figure 2.1. L’une est une carte Nucleo avec les connecteurs compatibles Arduino, l’autre est une clef au format USB A.
La carte WB55 (voir la figure ??) est une carte Nucleo offrant des possibilités de communications Bluetooth, OpenThread et Zigbee. Pour le moment seul le protocole BLE est utilisable avec l’IDE Arduino ou MicroPython.
Cette carte peut être programmée avec l’interface Arduino ou micropython, voir 6.4, pour la communication BLE. L’entreprise propose une interface de programmation (dérivée d’Eclipse) permettant un contrôle fin des composants internes mais difficile à prendre en mail.
La carte comporte :
-
• 2.4 GHz RF transceiver supporting Bluetooth® specification v5.0 and IEEE 802.15.4-2011 PHY and MAC
-
• Three user LEDs
-
• Three user buttons and one reset button
-
• Board connector : USB user with Micro-B
-
• Connecteurs : Arduino™ Uno V3, ST morpho
-
• On-board socket for CR2032 battery
Le support de la pile impose de modifier physiquement la carte en modifiant l’alimentation par coupure et soudure. Les boutons sont difficilement accessibles si une carte fille est ajoutée.
La documentation est disponible sur https://www.st.com/resource/en/user_manual/dm00517423-bluetooth-low-energy-and-802154-nucleo-pack-based-on-stm32wb-series-microcontrollers-stmicroelectronics.pdf
Nous l’avons utilisée avec le shield IKS01A3, présenté au chapitre 18, le shield GNSS ou le shield Grove. Nous la programmons principalement en micropython (voir 6.2.3). Les shields sont difficilement empilables pour des raisons mécaniques.
2.1.1.1 Composant radio
Le firmware du composant Radio peut aussi être modifié. La procédure impose d’utiliser les outils de ST, le firmware est disponible à l’adresse :
Les librairies Micropython spécifiques aux STM32 fournissent quelques commandes utiles (avec deux exemples issus de deux cartes différentes) :
- statut du composant radio
-
stm.rfcore_status() Returns the status of the second CPU as an integer (the first word of device info table).
>>> stm.rfcore_status() 2839959225 >>> stm.rfcore_status() 0
- version du firmware radio
-
stm.rfcore_fw_version(id)
Get the version of the firmware running on the second CPU.
- 0
-
Pass in 0 for id to get the FUS version, and
- 1
-
to get the WS version.
>>> stm.rfcore_fw_version(0) (1, 2, 0, 0, 0) >>> stm.rfcore_fw_version(1) (1, 16, 0, 0, 4) >>> stm.rfcore_fw_version(0) (0, 0, 0, 0, 0) >>> stm.rfcore_fw_version(1) (1, 0, 0, 4, 3)
la version du fus est fournie par le paramètre 0. En 2024, c’est 1.2.0.0. Nous voyons donc que le premier est à jour, mais pas le second.
#! /bin/sh URL=https://stm32python.gitlab.io/fr/docs/tools/cubeprog/cube_prog_firmware_ble_hci for file in Release_Notes.html \ stm32wb5x_BLE_HCILayer_fw.bin \ stm32wb5x_FUS_fw_for_fus_0_5_3.bin \ stm32wb5x_FUS_fw.bin ; do wget $URL/$file -O /tmp/$file done
Après une mise à jour, nous obtenons aujourd’hui (5 mars 2024) :
>>> stm.rfcore_status() 2839959225 >>> stm.rfcore_fw_version(0) (1, 2, 0, 0, 0) >>> stm.rfcore_fw_version(1) (1, 18, 0, 0, 3)
La page https://stm32python.gitlab.io/fr/docs/tools/cubeprog/cube_prog_firmware_ble_hci présente comment mettre à jour le composant radio à partir de l’IDE de ST.
ATTENTION : nous présentons ici un résumé, il faut d’abord utiliser la page de stm32python pour tout vérifier, en particulier les adresses.
Il faut commencer par aller sur le site ST et trouver STM32CUBEIDE pour télécharger l’archive. Ce programme n’impose pas les droits d’administrateur, ce qui est une bonne chose. Mais le logiciel demande les droits d’écriture sur le compodant USB.
Ensuite, aller sur le site https://github.com/STMicroelectronics/STM32CubeWB/blob/master/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/ pour récupérer les mises à jour. Il y a deux firmwares à éventuellement upgrader. Le FUS (Firmware Upĝrader Service et la pile BLE HCILayer. Il existe deux versions de la seconde, nous prendrons celle qui n’est pas étendue.
Examinons ce que nous dit MicroPython de la carte :
stm.rfcore_status() 2839959225 stm.rfcore_fw_version(0) (0, 5, 3, 0, 0) stm.rfcore_fw_version(1) (0, 0, 0, 0, 0)
Donc le FUS n’est pas à jour, il faut prendre l’upgrade pour la version 0.5.3. Le firmware radio est inexistant ou effacé. Commençons par mettre le FUS à jour :
alias stcli=$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin/STM32_Programmer_CLI
stcli -c port=swd \
-fwupgrade stm32wb5x_FUS_fw_for_fus_0_5_3.bin \
0x080EC000 firstinstall=0
Puis nous effaçons le firmware radio avant d’installer la mise à jour :
stcli -c port=swd -fwdelete
stcli -c port=swd \
-fwupgrade stm32wb5x_BLE_HCILayer_fw.bin \
0x080E0000 firstinstall=1
Après installation de MicroPython, nous voyons les valeurs suivantes :
>>> stm.rfcore_status() 0 >>> stm.rfcore_fw_version(0) (1, 2, 0, 0, 0) >>> stm.rfcore_fw_version(1) (1, 18, 0, 0, 3) >>>
2.1.2 La pitchoune WB55
Le kit WB55 vient aussi avec une petite carte WB55-USB avec un connecteur USB-A.
2.1.2.1 Installation du firmware sur la pitchoune
Le sélecteur BOOTO permet de sélectionner la connection USB. Il faut le manipuler avant de brancher le dongle. La documentation fournit peu d’explications :
The USB dongle can be programmed through USB BootLoad or USB DFU. It is also possible to debug/program it with an external STLink V2 (not delivered), using the SWD interface.
En sélectionnant le switch sur 0, il apparaît comme un périphérique série(USB ACM).
Bus 001 Device 074: ID 0483:5740 STMicroelectronics Virtual COM Port
En le commutant sur 1, nous voyons la mise en place d’un périphérique DFU (DFU in FS Mode). DFU (Device Firmware Update) permet de modifier le comportement d’un périphérique (en particulier USB) pour qu’il accepte le changement de firmware.
Bus 001 Device 068: ID 0483:df11 STMicroelectronics STM Device in DFU Mode
Après l’installation du paquet dfu-util, nous trouvons un périphérique. Il semble qu’il ne le trouve pas à chaque fois.
=> dfu-util -l ... Found DFU: [0483:df11] ver=0200, devnum=107, cfg=1, intf=0, path="1-1.4.1", alt=2, name="@OTP Memory /0x1FFF7000/01*1024 e", serial="205B3766594D" Found DFU: [0483:df11] ver=0200, devnum=107, cfg=1, intf=0, path="1-1.4.1", alt=1, name="@Option Bytes /0x1FFF8000/01*128 e", serial="205B3766594D" Found DFU: [0483:df11] ver=0200, devnum=107, cfg=1, intf=0, path="1-1.4.1", alt=0, name="@Internal Flash /0x08000000/256*04Kg", serial="205B3766594D"
Nous voyons trois périphériques DFU. Le dernier (numéro 0) indique que c’est la flash qui commence à l’adresse indiquée.
La compilation de micropython pour le dongle (USBDONGLE_WB55) a produit un fichier firmware.dfu que nous allons flasher.
=> dfu-util -a 0 -D /tmp/firmware.dfu 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/ Match vendor ID from file: 0483 Match product ID from file: df11 Opening DFU capable USB device... ID 0483:df11 Run-time device DFU version 011a Claiming USB DFU Interface... Setting Alternate Setting #0 ... Determining device status: state = dfuIDLE, status = 0 dfuIDLE, continuing DFU mode device DFU version 011a Device returned transfer size 1024 DfuSe interface name: "Internal Flash " file contains 1 DFU images parsing DFU image 1 image for alternate setting 0, (1 elements, total size = 215720) parsing element 1, address = 0x08000000, size = 215712 Download [=========================] 100% 215712 bytes Download done. done parsing DfuSe file
il devient alors un Pyboard.
Bus 001 Device 031: ID f055:9800 MicroPython Pyboard Virtual Comm Port in FS Mode
2.1.2.2 Description de la WB55-USB
La figure 2.4 présente les connecteurs d’extensions de la carte. La carte est livrée sans les broches soudées, ce qui peut poser quelques soucis pour ceux qui ne savent pas souder.
La clef dispose de fonctionnalités classiques :
-
• GPIO classique (probablement numérique) ;
-
• Convertisseurs analogique — numérique :
-
• UART (liaison série) ;
-
• Bus I2C ;
-
• Bus SPI ;
-
• Une broche WKUP (Wakeup ?) ;
-
• Une fonctionnalité de débug.
| CN2 | CN1 | ||||
| 10 | PA1 | ADC | SPI1_MOSI | PA7 | 10 |
| 9 | GND | SPI1_MISO | PA6 | 9 | |
| 8 | PA8 | ADC | SPI1_SCK | PA5 | 8 |
| 7 | PA9/PB7 | PWM?/GPIO | SPI1_NSS | PB2 | 7 |
| 6 | PB6 | GPIO | +3,3V | 6 | |
| 5 | PA3 | LPUART1_RX | db: SWO | PB3 | 5 |
| 4 | PA2 | LPUART1_TX | db: SWCLK | PA14 | 4 |
| 3 | PA0 | WKUP1 | db: SWDIO | PA13 | 3 |
| 2 | PB9 | I2C1_SDA | RESET | NRST | 2 |
| 1 | PB8 | I2C1_SCL | GND | 1 | |
Tab. 2.1 : Liste des connecteurs de la WB55 USB.
2.1.2.3 La carte NUCLEO-L476RG
Nous présentons ici un autre exemple de carte NUCLEO. Cette carte a un format différent de la carte WB55, elle est présentée dans la figure 2.5. La documentation est https://www.st.com/en/evaluation-tools/nucleo-l476rg.html
Cette carte dispose de plusieurs fonctionnalités qui manquent à la WB55, en particulier six connecteurs séries.
2.1.3 La carte STM32H723G
La carte STM32H723G dispose de capacité Ethernet et d’une prise RJ45. Sa https://www.st.com/resource/en/user_manual/um2407-stm32h7-nucleo144-boards-mb1364-stmicroelectronics.pdf
La carte est munie de deux connecteurs USB. Le connecteur lié au ST-LINK est à l’opposé du connecteur RJ45. C’est lui qui, par défaut, alimente la carte. L’autre est celui qui sera utilisé par MicroPython. Le port ST-LINK fournit une console et un périphérique de mémoire de masse. L’autre fournit la version MicroPython de la console, la mémoire de masse fournit l’accès au système de fichiers MicroPython. La figure 2.7 présente les deux connecteurs branchés simultanément.
Cette carte dispose de plusieurs UART qui sont disponibles en MicroPython :
// UART config #define MICROPY_HW_UART2_TX (pin_D5) #define MICROPY_HW_UART2_RX (pin_D6) #define MICROPY_HW_UART2_RTS (pin_D4) #define MICROPY_HW_UART2_CTS (pin_D3) #define MICROPY_HW_UART3_TX (pin_D8) #define MICROPY_HW_UART3_RX (pin_D9) #define MICROPY_HW_UART5_TX (pin_B6) #define MICROPY_HW_UART5_RX (pin_B12) #define MICROPY_HW_UART6_TX (pin_C6) #define MICROPY_HW_UART6_RX (pin_C7) #define MICROPY_HW_UART7_TX (pin_F7) #define MICROPY_HW_UART7_RX (pin_F6) #define MICROPY_HW_UART8_TX (pin_E1) #define MICROPY_HW_UART8_RX (pin_E0) #define MICROPY_HW_UART_REPL PYB_UART_3 #define MICROPY_HW_UART_REPL_BAUD 115200
Les connecteurs sont présentés dans la figure 2.8
L’UART 3 est utilisé par la console (simultanée entre ST-Link et python). Nous pouvons utiliser l’UART 2. La documentation indique que les broches utilisées sont :
-
• PD6 / D52, fil jaune communication depuis LoRa ;
-
• PD5 / D53 fil blanc pour l’inverse.
L’alimentation doit être branchée sur le 5V et il ne faut pas oublier la masse.
Le support Ethernet est assez simple en MicroPython.
import network
nic = network.LAN()
nic.active(1)
if not nic.isconnected():
nic.connect()
print("Waiting for connection...")
while not nic.isconnected():
time.sleep(1)
print(nic.ifconfig())
print(nic.ipconfig("addr4"))
Dans ce mode, la carte prend ses paramètres IP en DHCP. Il faut donc attendre un peu avant d’utiliser le réseau. Ce serait bien de trouver comment vérifier que la connexion est établie.
La carte dispose de deux connecteurs USB. Il semble qu’il soit possible de les utiliser simultanément. Dans la photo de la figure 2.7. Sur cette photo, le connecteur USB à droite est labellisé USB PWR, il fournit donc l’alimentation et le port ST-Link. Le connecteur de gauche, labellisé USB User permet de fournir un accès mass storage au système de fichier MicroPython.
2.1.4 Jouez avec les UART
Les cartes NUCLEO disposent d’un module ST-LINK qui sert à la programmer et offre également un canal de communication série avec l’ordinateur auquel elle est connectée. Pour assurer ses missions de programmeur de firmware et de liaison pour le débogage, le ST-LINK est animé par un microcontrôleur STM32L0 programmé avec son propre firmware.
Ce module fournit du côté USB une émulation de port Modem (/dev/ttyACM0) et une mémoire de masse. Sur l’interface interne, ce module est connecté à une des UART du microcontroleur principal de la carte NUCLEO. La figure 2.9 présente les connecteurs de chaque UART.
Le premier port utilisé est celui affecté au ST-LINK. Celui-ci est routé vers l’UART 2. Cet UART est utilisé par le connecteur Arduino et peut rentrer en conflit avec certains shields, comme le shield Grove ou le shield GNSS. Pour utiliser ces broches, il faut donc les couper la liaison avec le ST-LINK.
Pour débuguer la communication, il faudra mettre en place un montage temporaire. Nous allons lier








