FEATHER-M0-ArduinoIDE-SPI-Flash

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Une des fonctionnalités les plus captivante du M0 express est la petite puce mémoire flash additionnel (en SPI) placée sur la carte. Cette mémoire peut être utilisé pour fournir de nombreux services tels que le stockage de fichiers de données, du code Python et plus.

Voyez cette mémoire flash additionnel comme une petite carte SD continuellement branchée sur la carte à laquelle vous pouvez accéder en utilisant une bibliothèque similaire à la bibliothèque Carte SD d'Arduino. Vous pouvez même lire et écrire les fichaiers que CircuitPython stocker sur cette mémoire Flash!

Vous aurez besoin d'installer la bibliothèque SPI Flash Memory d'Adafruit dans Arduino IDE pour utiliser cette mémoire flash avec Arduino.  Cliquez sur le bouton ci-dessous pour télécharger les sources de la bibliothèque, ouvrez le fichier zip, et copiez le dans un répertoire Adafruit_SPIFlash (retirez le '-master' ajouté par GitHub au nom du répertoire lorsqu'il est téléchargé depuis GitHub) au côté des autres bibliothèques Arduino:

Une fois la bibliothèque installée, ouvrez Arduino IDE pour accéder aux différents exemples de la bibliothèque:

  • fatfs_circuitpython
  • fatfs_datalogging
  • fatfs_format
  • fatfs_full_usage
  • fatfs_print_file
  • flash_erase

Ces exemples vous permettent de formater la mémoire flash avec un système de fichier FAT (la même type de système de fichier que l'on retrouve sur une carte SD), lire et écrire des fichiers comme ont le fait sur une carte SD.

Lire et écrire des fichiers CircuitPython

L'exemple fatfs_circuitpython montre comment lire et écrire des fichiers sur la mémoire flash de sorte qu'ils puissent être accéssible depuis CircuitPython/MicroPython.  Cela signifie que vous pouvez exécuter un programme CircuitPython sur votre carte pour y stocker des données, puis utiliser un croquis Arduino qui utilise cette bibliothèque pour interagir avec ces mêmes données.

Notez qu'avant d'utiliser l'exemple fatfs_circuitpython vous devez avoir chargé CircuitPython sur votre carte. Voyez ce guide pour charger la dernière version de CircuitPython afin que le système de fichier CircuitPython soit écrit et initialisé sur la puce Flash. Une fois CircuitPython chargé sur la carte, vous pouvez exécuter le croquis fatfs_circuitpython.

Pour exécuter le croquis, il faut le charger dans Arduino IDE et le téléverser sur la carte Feather M0. Ensuite, il faut ouvrir le moniteur série à 115200 baud. Vous devriez voir des messages s'afficher lorsqu'il essaye de lire et écrire des fichiers sur la mémoire Flash.

Plus spécifiquement, l'exemple cherche les fichiers boot.py et main.py (puisque CircuitPython exécute ces fichiers au démarrage) et affiche leur contenu. Puis il ajoute une ligne à la fin du fichier data.txt présent sur la carte (le fichier est créé s'il n'existe pas encore). Après avoir exécuté le croquis, vous pouvez recharger CircuitPython sur la carte et charger et lire le fichier data.txt depuis CircuitPython!

Voyons un peu le code du croquis pour comprendre comment lire et écrire des fichiers CircuitPython. Pour commencer une instance de la classe Adafruit_M0_Express_CircuitPython est crée en lui passant un instance de la classe SPIFlash (permettant d'accéder à la mémoire Flash):

#define FLASH_SS       SS1                    // broche SSP de la Flash
#define FLASH_SPI_PORT SPI1                   // port SPI surlequel est branché la mémoire Flash

Adafruit_SPIFlash flash(FLASH_SS, &FLASH_SPI_PORT);     // Utiliser le bus SPI matériel 

// Il est possible d'utiliser d'autres broches comme bus SPI (SPI logiciel)!
//Adafruit_SPIFlash flash(SCK1, MISO1, MOSI1, FLASH_SS);

// Pour finir, créer un objet Adafruit_M0_Express_CircuitPython qui offre un accès
// à une interface de type Carte SD pour interagir avec les fichiers stockés dans 
// le système de fichier Flash de CircuitPython.
Adafruit_M0_Express_CircuitPython pythonfs(flash);

En utilisant la classe Adafruit_M0_Express_CircuitPython vous obtenez un objet de type système de fichier compatible avec en lecture et écriture avec le formattage de la mémoire Flash de CircuitPython. C'est très important pour l'interopérabilité entre CircuitPython et Arduino étant donné que CircuitPython dispose d'un partitionnement spécifique et d'un agencement particulier de la mémoire flash qui n'est pas compatible avec des bibliothèque plus "simple" (que vous pourriez rencontrer dans les autres exemples).

Une fois l'instance de la classe Adafruit_M0_Express_CircuitPython créée (instance appelée pythonfs dans le croquis) vous pouvez interagir avec elle comme s'il s'agissait de la bibliothèque carte SD d'Arduino.  Vous pouvez ouvrir des fichiers en lecture ou écriture, créer des répertoires, effacer des fichiers et répertoires et plus encore.

Voici un croquis qui vérifie la présence du fichier boot.py et affiche sont contenu (un caractère à la fois):

  // Vérifie si le fichier boot.py existe puis affiche le contenu.
  if (pythonfs.exists("boot.py")) {
    File bootPy = pythonfs.open("boot.py", FILE_READ);
    Serial.println("Afficher boot.py...");
    while (bootPy.available()) {
      char c = bootPy.read();
      Serial.print(c);
    }
    Serial.println();
  }
  else {
    Serial.println("Pas de fichier boot.py...");
  }

Notez l'appel de la fonction exists qui vérifie la présence du fichier boot.py, puis l'utilisation de la fonction open pour ouvrir celui-ci en mode lecture (read en anglais). Une fois fichier ouvert vous obtenez une référence vers un objet de la classe File qui permet de lire et écrire dans le fichier comme s'il s'agissait d'un périphérique Serial (encore une fois, toutes les fonctions de la classe File sont identiques à celle de la classe carte SD).

Dans ce cas, la fonction available retournera le nombre d'octets (bytes) restant à lire jusqu'à la fin du fichier -et- la fonction read lit un caractère à la fois (pour l'afficher sur le moniteur série).

L'écriture d'un fichier est tout aussi simple, voici comment le croquis ajoute des données dans le fichier data.txt:

  // Créer et ajouter des données dans le fichier data.txt 
  // puis ajouter un retour à la ligne.
  // Le code CircuitPython pourra, plus tard, ou consulter
  // le contenu de ce fichier!
  File data = pythonfs.open("data.txt", FILE_WRITE);
  if (data) {
    // Ajouter une nouvelle ligne de donnée:
    data.println("Un bonjour a CircuitPython de la part d Arduino!");
    data.close();
    // Voir les autre exemples fatfs comme fatfs_full_usage 
    // et fatfs_datalogging pour plus d'exemples concernant 
    // les interactions avec les fichiers.
    Serial.println("Nouvelle ligne ajoutée au fichier data.txt!");
  }
  else {
    Serial.println("Erreur, ne sais pas ouvrir le fichier en écriture!");
  }

Cette fois encore, la fonction open est utilisée pour ouvrir le fichier si ce n'est que cette fois, le fichier est ouvert en lecture (write en anglais). Dans ce mode, le fichier est ouvert en ajout (les données sont ajoutées en fin de fichier) si ce dernier existe. A noter le mode écriture crée le fichier si celui-ci n'existe pas. Une fois le fichier ouvert, les fonctions tels que print et println peuvent être utilisées pour écrire des données dans le fichier (juste comme envoi des données vers le moniteur série). Une fois le traitement terminé, la fonction close ferme le fichier!

Voilà, nous en avons terminé avec les opérations fondamentales de lecture et d'écriture. Voyez l'exemple fatfs_full_usage pour un apercu des fonctionnalités avancées tels que la création de répertoire, effacement de fichiers et répertoires, obtention de la taille d'un fichier, etc!  Rappelez vous que pour interagir avec les fichiers CircuitPython, il faudra utiliser la classe Adafruit_Feather_M0_CircuitPython comme indiqué dans l'exemple ci-dessus!

Formatter la mémoire Flash

L'exemple fatfs_format formattera le contenu de la FLASH SPI avec un système de fichier flambant neuf.  ATTENTION, ce croquis effacera toutes les données de la mémoire flash, inluant tout le code python et autres données que vous pourriez avoir stocké dans la mémoire FLASH!.

Le croquis de formatage est utile si vous avez besoin d'effacer TOUS les élément pour redémarrer avec un environnement propre. Le croquis permet également de retrouver un état stable si, pour une raison ou une autre, le système de fichier était corrompu.

Pour executer le croquis de formattage, chargez le dans Arduino IDE et téléversez le sur la carte Feather M0. Ouvrez ensuite le moniteur série (à 115200 baud). Vous devriez voir un message demandant une confirmation avant de formatter la mémoire Flash.

Si vous ne voyez pas ce message alors fermez le moniteur série, appuyez sur le bouton rest et réouvrez le moniteur série.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Saisissez OK dans le moniteur série et pressez le bouton d'envoi pour confirmer votre intention de formater la mémoire Flash. Il est nécessaire de saisir OK en capital!  

Une fois confirmé, le croquis formattera la mémoire Flash SPI. La processus d'effacement et formatage prend environ une minute. Le croquis affiche un message une fois le formatage terminé. Voilà, vous disposez d'une mémoire FLASH prête à l'emploi et avec un tout nouveau système de fichier.

Exemple de Datalogging

Une utilisation pratique de la mémoire flash SPI flash est le stockage de données, comme le datalogging des données des senseurs. L'exemple fatfs_datalogging montre quelques opérations de datalogging/écriture. Ouvrez l'exemple dans the Arduino IDE et téléversez le sur votre carte Feather M0. Ouvrez ensuite le moniteur série (à 115200 baud), vous devriez voir un message s'afficher toutes les minutes lorsque le croquis écrit une nouvelle ligne dans le système de fichier de la mémoire flash.

Voyez le contenu de la fonction loop() pour comprendre comment écrire dans le fichier:

  // Ouvrir le fichier de datalogging en écriture.  Le mode FILE_WRITE ouvrira
  // le fichier en mode ajout (ajoutera les données en fin de fichier).
  File dataFile = fatfs.open(FILE_NAME, FILE_WRITE);
  // Vérifie si le fichier est ouvert et écrit des données.
  if (dataFile) {
    // Obtenir les données depuis les senseurs, etc. Dans ce exemple
    // nous créons juste un nombre aléatoire.
    int reading = random(0,100);
    // Ecrire une nouvelle ligne dans le fichier.  
    // Vous poyvez utiliser les mêmes fonctions print que celles
    // utilisées pour afficher des données sur le moniteur série. 
    // Par exemple, pour écrire deux valeurs CSV (séparées par une virgule):
    dataFile.print("Sensor #1");
    dataFile.print(",");
    dataFile.print(reading, DEC);
    dataFile.println();
    // Pour finir, fermer le fichier lorsque l'opération
    // d'écriture est achevée. C'est une facon adéquate pour 
    // s'assurer que les données soient bien écrites dans 
    // le fichier.
    dataFile.close();
    Serial.println("Nouvelle mesure écrite dans le fichier!");
  }

Comme vous le feriez avec la bibliothèque Arduino de la carte SD, vous pouvez créer un objet File en appelant la fonction open en indiquant le nom de fichier et le mode d'accès (le mode FILE_WRITE, écrit de nouvelles données en fin de fichier). Notez cependant qu'à la place d'appeler la fonction global open, c'est la méthode fatfs.open() de l'objet système_de_fichier nouvellement créé qu'il faut appeler (voyez les valeurs de configurations juste après #define).

Once the file is opened it's simply a matter of calling print and println functions on the file object to write data inside of it.  This is just like writing data to the serial monitor and you can print out text, numeric, and other types of data.  Be sure to close the file when you're done writing to ensure the data is stored correctly!

Reading and Printing Files

The fatfs_print_file example will open a file (by default the data.csv file created by running the fatfs_datalogging example above) and print all of its contents to the serial monitor.  Open the fatfs_print_file example and load it on your Feather M0 board, then open the serial monitor at 115200 baud.  You should see the sketch print out the contents of data.csv (if you don't have a file called data.csv on the flash look at running the datalogging example above first).

To understand how to read data from a file look in the setup function of the sketch:

  // Open the file for reading and check that it was successfully opened.
  // The FILE_READ mode will open the file for reading.
  File dataFile = fatfs.open(FILE_NAME, FILE_READ);
  if (dataFile) {
    // File was opened, now print out data character by character until at the
    // end of the file.
    Serial.println("Opened file, printing contents below:");
    while (dataFile.available()) {
      // Use the read function to read the next character.
      // You can alternatively use other functions like readUntil, readString, etc.
      // See the fatfs_full_usage example for more details.
      char c = dataFile.read();
      Serial.print(c);
    }
  }

Just like when writing data with the datalogging example you create a File object by calling the open function on a fatfs object.  This time however you pass a file mode of FILE_READ which tells the filesystem you want to read data.

After you open a file for reading you can easily check if data is available by calling the available function on the file, and then read a single character with the read function.  This makes it easy to loop through all of the data in a file by checking if it's available and reading a character at a time.  However there are more advanced read functions you can use too--see the fatfs_full_usage example or even the <a href="https://www.arduino.cc/en/reference/SD">Arduino SD library documentation</a> (the SPI flash library implements the same functions).

Full Usage Example

For a more complete demonstration of reading and writing files look at the fatfs_full_usage example.  This examples uses every function in the library and demonstrates things like checking for the existence of a file, creating directories, deleting files, deleting directories, and more.

Remember the SPI flash library is built to have the same functions and interface as the <a href="https://www.arduino.cc/en/reference/SD">Arduino SD library</a> so if you have code or examples that store data on a SD card they should be easy to adapt to use the SPI flash library, just create a fatfs object like in the examples above and use its open function instead of the global SD object's open function.  Once you have a reference to a file all of the functions and usage should be the same between the SPI flash and SD libraries!

Accessing SPI Flash

Arduino doesn't have the ability to show up as a 'mass storage' disk drive. So instead we must use CircuitPython to do that part for us. Here's the full technique:


  • Start the bootloader on the Express board. Drag over the latest circuitpython uf2 file
  • After a moment, you should see a CIRCUITPY drive appear on your hard drive with boot_out.txt on it
  • Now go to Arduino and upload the fatfs_circuitpython example sketch from the Adafruit SPI library. Open the serial console. It will successfully mount the filesystem and write a new line to data.txt


{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com


  • Back on your computer, re-start the Express board bootloader, and re-drag circuitpython.uf2 onto the BOOT drive to reinstall circuitpython
  • Check the CIRCUITPY drive, you should now see data.txt which you can open to read!

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Once you have your Arduino sketch working well, for datalogging, you can simplify this procedure by dragging CURRENT.UF2 off of the BOOT drive to make a backup of the current program before loading circuitpython on. Then once you've accessed the file you want, re-drag CURRENT.UF2 back onto the BOOT drive to re-install the Arduino sketch!



Source: Adafruit Feather M0 Express - Designed for CircuitPython créé par LadyAda, Tony DiCola, Scorr Shawcroft, Dan Halbert pour AdaFruit Industries. Crédit AdaFruit Industries

Traduit par Meurisse D. pour MCHobby.be

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.