FEATHER-M0-Adapter-Croquis
Préambules
L' ATSAMD21 est une puce vraiment très intéressant... mais encore assez récent au coeur des Arduino-compatible. La plupart des croquis/sketch fonctionne mais nous avons noté quelques points!
Référence analogique
Si vous avez l'habitude d'utiliser la broche ARef pour les références analogique différentes de 3.3V alors le code doit utiliser analogReference(AR_EXTERNAL) (c'est AR_EXTERNAL et non EXTERNAL)
Pullup et broche en sortie
L'ancienne façon d'activer la résistance pull-up (qui ramène le potentiel à +3.3v) sur une broche entrée était codé comme suit:
pinMode(pin, INPUT) digitalWrite(pin, HIGH)
Il en était ainsi parce que le registre de sélection pull-up était le même que le registre de sélection des sorties.
Vous ne pouvez plus faire cela sur un M0! A la place, vous devez utiliser
pinMode(pin, INPUT_PULLUP)
Option qui à l'avantage d'être rétro-compatible avec AVR.
Sérial vs SerialUSB
99.9% de nos croquis Arduino utilisent Serial.print pour faire du débogage et produire des sorties d'information. Sur l'Arduino SAMD/M0 officiel, les instructions sont dirigés vers le port série Serial5 qui n'est pas "exposé"/accessible sur le Feather. Le port USB sur l'Arduino M0 officiel est appelé SerialUSB.
Sur les plateformes Adafruit M0, le port série à été redirigé le port USB. Par conséquent tout fonctionne parfaitement sur un Feather M0 (et de façon totalement automatique).
Cependant, si vous comptez aussi utiliser un Arduino Arduino SAMD officiel et si vous désirez afficher des messages via le port série ALORS utilisez SerialUSB à la place de Serial
Si vous avez des croquis existant et que vous désirez utiliser ces derniers sur un M0 sans devoir faire une volée de rechercher-remplacer alors optez pour:
#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL) // Required for Serial on Zero based boards #define Serial SERIAL_PORT_USBVIRTUAL #endif
juste avant la première définition de fonction de votre code. Par exemple:
Crédit: AdaFruit Industries www.adafruit.com
PWM / AnalogWrite
Adafruit a eu l'occasion de constater que certaines sorties PWM ne fonctionne pas sur les coeur SAMD. Adafruit se penche sur le problème!
Fichier d'entête manquant
Si votre compilateur se plaint qu'il lui manque un fichier d'entête (Header, .h), c'est qu'il se pourrait que le code utilise une bibliothèque non supportée pas le M0.
Par exemple, si vous avez la ligne:
#include <util/delay.h>
Vous obtiendrez une erreur comme celle-ci
fatal error: util/delay.h: No such file or directory #include <util/delay.h> ^ compilation terminated. Error compiling.
Qui vous permet de localiser (avec précision) la ligne produisant l'erreur (le message d'erreur mentionne le nom de fichier et le numéro de ligne).
Si l'inclusion se fait depuis un bibliothèque que vous utilisez, vous pouvez désactiver l'inclusion de la sous bibliothèque litigieuse pour le M0 en l'entourant l'inclusion d'une définition #ifdef comme celle ci-dessous:
#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2) #include <util/delay.h> #endif
Le #if s'assure que le fichier d'entête n'est pas inclus pour d'autres architectures.
Si l' #include est directement dans le croquis Arduino, vous pouvez juste essayer de retirer la ligne.
Démarrage de booloader
Sur la plupart des autres AVRs, cliquer sur reset, lorsque celui-ci est branché sur USB, permet de lancer manuellement le bootloader.
Le bootloader reste actif pendant quelques secondes (time-out) puis passe la main au croquis présent sur la carte.
Sur un M0, vous aurez besoin de double cliquer sur le bouton Reset. Vous verrez la LED rouge pulser et vous saurez que le mode bootloader est actif.
Il n'y a pas de time-out dans le mode Bootloader. Une fois le mode Bootloader activé, la carte reste dans ce mode. Cliquez sur le bouton Reset à nouveau pour redémarre la carte (et exécuter votre Croquis).
L'accès mémoire (Aligned Memory Access)
Cela ne risque pas forcément de vous arriver mais nous avons rencontré ce problème!
Si vous avez l'habitude des plateformes 8-bits, vous pouvez utiliser des techniques de typecasting de variable comme celle-ci dessous:
uint8_t mybuffer[4]; float f = (float)mybuffer;
Vous ne pouvez pas avoir la garantie qu'une telle méthode fonctionnera sur une plateforme 32-bits parce que mybuffer pourrait ne pas être aligné sur 2 ou 4-octets. Voyez l'article "Alignement en mémoire" (Wikipedia)
L'ARM Cortex-M0 peut uniquement accéder directement à des données bornées en 16-bit (tous les 2 ou 4 octets). Essayer d'accéder à un octet impaire (l'octet en position 1 ou 3) causera une faute matérielle (Hard Fault) et stoppera le MCU. Heureusement, il y a un moyen simple pour contourner ce problème... faire un simple memcpy!
uint8_t mybuffer[4]; float f; memcpy(f, mybuffer, 4)
Conversion en virgule flottante
Comme pour les AVR Arduino, la bibliothèque M0 n'a pas un support complet pour pour la conversion des nombres en virgule flottante en chaine ASCII. Les fonctions comme sprintf ne convertira pas les nombres en virgule flottante. Par chance, la bibliothèque standard AVR-LIBC inclus la fonction dtostrf peut prendre en charge cette conversion.
Malheureusement, la bibliothèque run-time du M0 ne dispose pas de dtostrf. Vous pourriez rencontrer quelques références utilisant #include <avr/dtostrf.h> pour inclure dtostrf dans votre code... mais même si cela compile, dtostrf ne fonctionnera pas!
Nous vous proposons de prendre connaissance du fil de discussion suivant pour trouver une fonction dtostrf que vous pourriez inclure dans votre code:
Combien de RAM disponible
L'ATSAMD21G18 dispose de 32K de RAM mais si vous avez besoin de surveiller votre consommation mémoire, vous pouvez le faire avec la fonction suivante:
extern "C" char *sbrk(int i); int FreeRam () { char stack_dummy = 0; return &stack_dummy - sbrk(0); }
Trouvé grâce à ce message http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879 sur le forum Arduino!
Stocker des données en Flash
Si vous êtes un habitué des AVR, vous avez probablement déjà utilisé PROGMEM qui vous permet de compiler une chaîne de caractère dans la mémoire Flash et permet d'économiser de la RAM.
Sur un ARM, c'est même encore plus simple, il suffit d'ajouter un const devant le nom de la variable:
const char str[] = "My very long string";
Cette chaine est maintenant en FLASH. Vous pouvez manipuler la string (chaîne de caractère) comme s'il s'agissait d'une donnée en RAM, le compilateur fera le nécessaire pour effectuer les lectures en FLASH (vous n'avez donc pas besoin de connaître et utiliser les fonctions progmem).
Vous pouvez vérifier où sont stockées les données en affichant leur adresse:
Serial.print("Address of str $"); Serial.println((int)&str, HEX);
Si l'adresse est $2000000 ou supérieur, c'est stocké en SRAM. Si l'adresse est entre $0000 et $3FFFF alors c'est stocké en FLASH
Source: Adafruit Feather M0 Basic Proto créé par LadyAda pour AdaFruit Industries. Crédit [www.adafruit.com 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.