ENG-CANSAT-FEATHER-M0-SPI

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

Forewords

One of the most exciting feature of the M0 Express board is this small FLASH chip wired on the SPI bus. That memory could be used to provide lot of services like storing files, python script and many more.

You can see that additional FLASH chip like a small SD card continously wired on the board. This flash memory is available through a library very similar to the Arduino's SD card. You can even read and write the files on the CircuitPython filesystem (Circuit Python use this Flash to store the Python Script and files)!

You will need to install the Adafruit SPI Flash Memory library in Arduino IDE to use the SPI Flash with your Arduino sketch. Click on the link below to download the library source code, open the zip file and copy the file files into a subfolder named Adafruit_SPIFlash (remove the '-master' added by GitHub on the front of the folder name). Place this new library next to your other Arduino libraries:

Once the library installed, start your Arduino IDE to access the various examples available in the library:

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

Thoses exemples would allow you to format the Flash memory with the FAT filesystem (the same filesytem than used on SD card), read and write files like we do with SD card.

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.

 
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.

Erreur de formattage

Si vous n'arrivez pas à formater la mémoire Flash et recevez ce message d'erreur:

Adafruit SPI Flash FatFs Format Example
Flash chip JEDEC ID: 0x1401501
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
This sketch will ERASE ALL DATA on the flash chip and format it with a new filesystem!
Type OK (all caps) and press enter to continue.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Partitioning flash with 1 primary partition...
Couldn't read sector before performing write!
Error, f_fdisk failed with error code: 1

Alors il faut revenir à une version plus ancienne de la bibliothèque en attendant le correction de la bibliothèque.

Voir ce lien sur les forums d'Adafruit.

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).

Une fois le fichier ouvert, il suffit simplement d'appeler les fonctions print et println sur l'objet fichier pour écrire des données en fin de fichier. C'est exactement comme envoyer des données vers le moniteur série pour y afficher du texte, des valeurs numériques et autres types de donnée.

Assurez-vous d'avoir correctement fermé le système de fichier pour être certain que les données soient enregistrées correctement dans le fichier!

Lecture et affichage de fichiers

L'exemple fatfs_print_file ouvrira un fichier (le fichier data.csv par défaut, le fichier créé par l'exemple fatfs_datalogging présenté ci-dessus) et affiche tout son contenu dans le moniteur série. Ouvrez l'exemple fatfs_print_file et téléversez le sur votre carte Feather M0, puis ouvrez le moniteur série (à 115200 baud).

Vous devriez voir le croquis afficher le contenu du fichier data.csv (si la mémoire flash ne contient pas de fichier data.csv alors vous pouvez ouvrir l'exemple datalogging ci-dessus pour le créer).

Voyez le contenu de la fonction setup() pour comprendre comment s'effectue la lecture du fichier:

  // Ouvrir le fichier en lecture et vérifier s'il est correctement ouvert
  // Le mode FILE_READ ouvre le fichier en lecture.
  File dataFile = fatfs.open(FILE_NAME, FILE_READ);
  if (dataFile) {
    // Le fichier a été ouvert. 
    // Afficher le contenu caractère par caractère jusqu'à
    // la fin du fichier.
    Serial.println("Fichier ouvert, contenu affiché ci-dessous:");
    while (dataFile.available()) {
      // Utilisé la fonction read() pour lire le prochain caractère.
      // Il est également possible d'utiliser des fonctions telles 
      //     que readUntil, readString, etc.
      // Voyez l'exemple fatfs_full_usage pour plus de détails.
      char c = dataFile.read();
      Serial.print(c);
    }
  }

Tout comme pour l'écriture de donnée dans l'exemple datalogging, il est nécessaire de créer un objet File en appelant la fonction open de l'objet fatfs. Cependant, cette fois, le mode utilisé est FILE_READ, indiquant que l'on désire lire le système de fichier.

Après avoir ouvert le fichier en lecture, la fonction available permet de facilement savoir si des données sont disponibles dans le fichier. Ensuite, la fonction read permet de lire un caractère depuis le fichier. La combinaison de ces deux fonctions permet de réaliser facilement une boucle de lecture qui vérifie la disponibilité de donnée puis la lecture et l'affichage de celle-ci (un caractère à la fois).

Il existe également des fonctions de lecture avancées que vous pouvez voir dans l'exemple fatfs_full_usage ou soit dans la documentation de la classe SD d'Arduino (la bibliothèque Flash SPI implémente les mêmes fonctions).

Exemple complet d'utilisation de la Flash

Vous pouvez vous référer à l'exemple fatfs_full_usage pour une démonstration complète concernant la lecture et l'écriture de fichiers. Cet exemple utilise toutes les fonction de la bibliothèque et démontre des opérations tels que le test d'existence d'un fichier, la création de répertoire, effacement de fichier, effacement de fichier, etc.

Rappelez vous que la bibliothèque SPI flash est conçue pour exposer les mêmes fonctions et mêmes interfaces que la la bibliothèque SD d'Arduino. Par conséquent, les code et exemples stockant des données sur une carte SD seront très facile à adapter pour fonctionner avec la bibliothèque SPI flash. Créez simplement un objet fatfs comme dans les exemples ci-dessus et utilisez la fonction open sur cet objet (en lieu et place de la fonction globale). Une fois que vous avez obtenu une référence sur un fichier, toutes les fonctions et utilisations sont identiques entre la bibliothèque SPI flash et la bibliothèque SD d'Arduino!

Accéder à la Flash SPI

Arduino n'est malheureusement pas capable d'exposer un périphérique de stockage (dit "mass storage" en anglais). Par conséquent, il faut utiliser CircuitPython qui, lui, est capable de faire cela pour nous. Voici la technique à utiliser.Here's the full technique:

  • Démarrer le bootloader de votre carte Express. Faites un glisser/déposer de la dernière version du fichier uf2 circuitpython.
  • Après un moment, vous devriez voir apparaître le lecteur CIRCUITPY contenant un fichier boot_out.txt. Voilà, le système de fichier est initialisé sur la Flash SPI.
  • Ouvrez maintenant Arduino IDE et téléversez l'exemple fatfs_circuitpython disponible dans la bibliothèque SPI d'Adafruit. Ouvrez la console série pour démarrer le croquis. Voilà, le système de fichier CircuitPython sera correctement monté et le fichier data.txt créé et initialisé.

 
Crédit: AdaFruit Industries www.adafruit.com

  • Revenons sur notre ordinateur, redémarrez le bootloader de la carte Express --ET-- re-glissez/re-déposez circuitpython.uf2 sur le lecteur BOOT rendu accessible par le bootloader. Voilà, CircuitPython est résintallé sur la carte Express.
  • Au bout d'un moment, le lecteur CIRCUITPY redevient accessible. Celui-ci expose a nouveau le système de fichier MicroPython de la Flash SPI. Vous pouvez maintenant voir le fichier data.txt, l'ouvrir et en consulté le contenu!

 
Crédit: AdaFruit Industries www.adafruit.com

Une fois que votre croquis de datalogging Arduino fonctionne comme attendu, vous pouvez simplifier la procédure en copiant CURRENT.UF2 depuis le lecteur BOOT pour faire une copie de sauvegarde de votre programme Arduino. Vous pourrez ensuite charger CircuitPython pour accéder au système de fichier de la Flash SPI et enfin recopier votre CURRENT.UF2 sur le lecteur BOOT de la carte Express pour réactiver votre croquis Arduino!


Written by Meurisse D. from MC Hobby - License: CC-SA-BY.