Différences entre versions de « FEATHER-M0-ArduinoIDE-Croquis »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(19 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
{{FEATHER-M0-EXPRESS-NAV}}
 
{{FEATHER-M0-EXPRESS-NAV}}
  
{{traduction}}
 
 
== Introduction ==
 
== Introduction ==
 
L'ATSAMD21 est un tout petit composant mais encore assez récent comme nouveau venu dans le monde des Arduino-compatible. La '''plupart''' des croquis et bibliothèques fonctionnerons mais il y a quelques petites choses à noter!
 
L'ATSAMD21 est un tout petit composant mais encore assez récent comme nouveau venu dans le monde des Arduino-compatible. La '''plupart''' des croquis et bibliothèques fonctionnerons mais il y a quelques petites choses à noter!
Ligne 27 : Ligne 26 :
 
Approche qui à au moins le bénéfice d'être rétro-compatible avec AVR.
 
Approche qui à au moins le bénéfice d'être rétro-compatible avec AVR.
  
== Serial vs SerialUSB ==
+
== Serial ou SerialUSB ==
99.9% of your existing Arduino sketches use '''Serial.print''' to debug and give output. For the Official Arduino SAMD/M0 core, this goes to the Serial5 port, which isn't exposed on the Feather. The USB port for the Official Arduino M0 core, is called '''SerialUSB''' instead.
+
99.9% des croquis Arduino existant utilise '''Serial.print''' pour sortie de débogage ou sortie console. Sur un Arduino SAMD/M0 officiel, cette instruction utilise le port Serial5, qui n'est pas exposé sur un Feather.  
  
In the Adafruit M0 Core, we fixed it so that Serial goes to USB when you use a Feather M0 so it will automatically work just fine.
+
A la place, le port USB d'un Arduino M0 officiel est appelé '''SerialUSB'''.
  
'''However, on the off chance you are using the official Arduino SAMD core not the Adafruit version (which really, we recommend you use our version because as you can see it can vary) & you want your Serial prints and reads to use the USB port, use SerialUSB instead of Serial in your sketch'''
+
Sur un Adafruit M0, Adafruit a corrigé cela de sortie que Serial est dirigé vers l'USB lorsque vous utilisez un Feather M0 (et donc tout fonctionne correctement automatiquement).
  
If you have existing sketches and code and you want them to work with the M0 without a huge find-replace, put
+
{{ambox|text=Cependant, si vous utilisez un Arduino SAMD officiel, et non une version Adafruit (nous recommandons une carte Adafruit car, comme vous pouvez le voir, il y a des différences), il faudra alors utiliser SerialUSB à la place de Serial pour envoyer le résultat des instructions "print" sur le port USB.}}
  
<code>#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)<br>   // Required for Serial on Zero based boards<br>   #define Serial '''SERIAL_PORT_USBVIRTUAL'''<br> #endif</code>
+
Si vous avez des croquis existants et que vous désirez le faire fonctionner sur un M0 sans occasionner de nombreuses opérations de remplacement, placez le code suivant:
  
'''right above the first''' function definition in your code. For example:
+
<syntaxhighlight lang="c">
 +
#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
 +
  // requis pour les opérations Serial sur les cartes à base de Zero
 +
  #define Serial '''SERIAL_PORT_USBVIRTUAL'''
 +
#endif
 +
</syntaxhighlight>
 +
 
 +
'''juste au dessus de la première''' définition de fonction dans votre code.
 +
 
 +
Par exemple:
  
 
{{ADFImage|FEATHER-M0-ArduinoIDE-Croquis-01.png|640px}}
 
{{ADFImage|FEATHER-M0-ArduinoIDE-Croquis-01.png|640px}}
  
== AnalogWrite / PWM on Feather/Metro M0 ==
+
== AnalogWrite / PWM sur Feather M0/Metro M0 ==
After looking through the SAMD21 datasheet, we've found that some of the options listed in the multiplexer table don't exist on the specific chip used in the Feather M0.
+
{{ambox|text=Cette section est traduite au mieux mais il faut bien avouer que cela est très technique. N'hésitez donc pas à faire part de vos corrections.}}
  
For all SAMD21 chips, there are two peripherals that can generate PWM signals: The Timer/Counter (TC) and Timer/Counter for Control Applications (TCC). Each SAMD21 has multiple copies of each, called 'instances'.
+
Après avoir consulté la fiche technique du SAMD21, Adafruit à constaté qu'il manquait quelques options listée dans la table multiplexeur sur la puce spécifiquement utilisée sur un Feather M0.
  
Each TC instance has one count register, one control register, and two output channels. Either channel can be enabled and disabled, and either channel can be inverted. The pins connected to a TC instance can output identical versions of the same PWM waveform, or complementary waveforms.
+
Sur toutes les puces SAMD21, il y a deux périphériques capables de générer des signaux PWM: Le Timer/Counter (TC) et Timer/Counter pour le contrôle des applications (TCC). Chaque SAMD21 dispose de plusieurs copies de chaque, appelés 'instances'.
  
Each TCC instance has a single count register, but multiple compare registers and output channels. There are options for different kinds of waveform, interleaved switching, programmable dead time, and so on.
+
Chaque instance TC dispose d'un registre de comptage (count), un registre de contrôle (control) et de deux canaux de sortie (output channel). Chaque canal peut être activé, désactivé et même inversé. Les broches connectées sur une instance TC peuvent produire une version identique de la même forme d'onde, ou forme d'onde complémentaire.
 
 
The biggest members of the SAMD21 family have five TC instances with two 'waveform output' (WO) channels, and three TCC instances with eight WO channels:
 
  
 +
Chaque instance TCC dispose d'un simple registre compteur (count) mais de multiples registre comparateur (compare) et canaux de sorties (output channels). Il y a des options pour différent type de forme d'onde, interleaved switching, programmable dead time, etc.
  
 +
Les plus gros membres de la famille SAMD21 ont jusqu'à 5 instances TC avec 2 canaux WO (''waveform output'' : sortie de forme d'onde) et 3 instances TCC avec 8 canaux WO:
 
* TC[0-4],WO[0-1]
 
* TC[0-4],WO[0-1]
 
* TCC[0-2],WO[0-7]
 
* TCC[0-2],WO[0-7]
  
And those are the ones shown in the datasheet's multiplexer tables.
+
Et cela sont ceux présentés dans la table multiplexer de la fiche technique.
 
 
The SAMD21G used in the Feather M0 only has three TC instances with two output channels, and three TCC instances with eight output channels:
 
 
 
  
 +
Le SAMD21G utilisé sur le Feather M0 dispose seulement de 3 instances TC avec 2 canaux de sortie, et 3 instances TCC avec 8 canaux de sorties:
 
* '''TC[3-5],WO[0-1]'''
 
* '''TC[3-5],WO[0-1]'''
 
* '''TCC[0-2],WO[0-7]'''
 
* '''TCC[0-2],WO[0-7]'''
  
Tracing the signals to the pins broken out on the Feather M0, the following pins can't do PWM at all:
+
En suivant les signaux vers les broches rendues disponibles sir le Feather M0, <font color="red">'''les broches suivantes ne seront pas capable de produire de signal PWM'''</font>:
 +
* '''broche analogique A5'''
  
 +
Les broches suivantes peuvent être configurées en sortie PWM (sans aucun conflit) aussi longtemps que les broches SPI, I2C et UART gardent leurs fonctions protocole:
 +
* '''Broches digitales 5, 6, 9, 10, 11, 12 et 13'''
 +
* '''Broches analogiques A3 et A4'''
  
* '''Analog pin A5'''
+
Si seules les broches SPI gardent leur fonctions protocole, vous pouvez également faire du PWM sur les broches suivantes:
 +
* '''TX''' (broche digitale 1)
 +
* '''SDA''' (broche digitale 20)
  
The following pins can be configured for PWM without any signal conflicts as long as the SPI, I2C, and UART pins keep their protocol functions:
+
== analogWrite() et gamme de valeur PWM ==
 +
Sur un AVR (Arduino Uno), si vous utilisez l'instruction {{fname|analogWrite(pin, 255)}} sur une sortie PWM alors cela conduit à un signal HAUT en permanence sur la broche.
  
 +
Sur un Cortex ARM, le signal PWM sera fixé à 255/256. Par conséquent, il y aura toujours une très petite 'implusion à 0v'. Si vous avez besoin que le signal soit continuellement HIGH alors il faudra ajouter un test qui remplace l'instruction {{fname|analogWrite(pin, 255)}} par {{fname|digitalWrite(pin, HIGH)}}
  
* '''Digital pins 5, 6, 9, 10, 11, 12, and 13'''
+
== Fichier d'entête manquant ==
* '''Analog pins A3 and A4'''
+
Vous pourriez avoir du code qui utilise des bibliothèques non supportée sur un coeur M0. Par exemple, si vous avez du code contenant la ligne suivante:
  
If only the SPI pins keep their protocol functions, you can also do PWM on the following pins:
+
<syntaxhighlight lang="c">
 +
#include <util/delay.h>
 +
</syntaxhighlight>
  
 +
alors vous obtiendrez une erreur mentionnant
  
* '''TX and SDA (Digital pins 1 and 20)'''
+
<nowiki>
 +
fatal error: util/delay.h: No such file or directory
 +
  #include <util/delay.h>
 +
                         ^
 +
compilation terminated.
 +
Error compiling.</nowiki>
  
== analogWrite() PWM range ==
+
Ce qui permet de localiser la ligne (et fichier) où s'est produit l'erreur. Il suffira alors de l'inclure dans une structure #ifdef comme celle présentée ci-dessous:
On AVR, if you set a pin's PWM with <code>analogWrite(pin, 255)</code> it will turn the pin fully HIGH. On the ARM cortex, it will set it to be 255/256 so there will be very slim but still-existing pulses-to-0V. If you need the pin to be fully on, add test code that checks if you are trying to <code>analogWrite(pin, 255)</code> and, instead, does a <code>digitalWrite(pin, HIGH)</code>
 
  
== Missing header files ==
+
<syntaxhighlight lang="python">
there might be code that uses libraries that are not supported by the M0 core. For example if you have a line with
+
#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2)
 
+
#include <util/delay.h>;
<code>#include <util/delay.h></code>
+
#endif
 +
</syntaxhighlight>
  
you'll get an error that says
+
Les lignes ci-dessous font en sorte de ne pas inclure le fichier d'entête pour d'autres architectures.
  
<code>fatal error: util/delay.h: No such file or directory<br>  #include <util/delay.h><br>                         ^<br>compilation terminated.<br>Error compiling.</code>
+
Si l'instruction {{fname|#include}} se trouve directement dans votre croquis Arduino alors vous pouvez essayer de retirer cette ligne.
  
In which case you can simply locate where the line is (the error will give you the file name and line number) and 'wrap it' with #ifdef's so it looks like:
+
== Lancer le Bootloader ==
 +
Sur la plupart des AVRs (Arduino Uno), le simple fait de presser le bouton '''reset''' avec le microcontrôleur branché en USB permet de démarrer manuellement le bootloader. Le bootloader termine automatiquement sont exécution au bout de quelques secondes.
  
<syntaxhighlight lang="python">
+
Sur le M0, vous aurez besoin de <font color="red">'''double cliquer'''</font> le bouton '''reset'''. Vous verrez la LED rouge pulser, ce qui indique que le bootloader est actif. Une fois dans ce mode, il n'y a pas de "time out", le M0 reste en mode bootloader indéfiniment. Cliquez une nouvelle fois sur le bouton "reset" pour redémarrer le microcontrôleur.
#if !defined(ARDUINO_ARCH_SAM) &amp;&amp; !defined(ARDUINO_ARCH_SAMD) &amp;&amp; !defined(ESP8266) &amp;&amp; !defined(ARDUINO_ARCH_STM32F2)
 
#include &lt;util/delay.h&gt;
 
#endif
 
</syntaxhighlight>
 
  
The above will also make sure that header file isn't included for other architectures
+
== Alignement en mémoire ==
 +
Cela à moi de chance de vous arriver... mais autant être tenu informé.
  
If the #include is in the arduino sketch itself, you can try just removing the line.
+
Si vous avez utilisé des plateformes 8 bits alors vous savez probablement qu'il est possible de réaliser des typecast de variables. Par exemple:
  
== Bootloader Launching ==
+
<syntaxhighlight lang="c">
For most other AVRs, clicking '''reset''' while plugged into USB will launch the bootloader manually, the bootloader will time out after a few seconds. For the M0, you'll need to ''double click ''the button. You will see a pulsing red LED to let you know you're in bootloader mode. Once in that mode, it wont time out! Click reset again if you want to go back to launching code
+
uint8_t mybuffer[4];
 +
float f = (float)mybuffer;
 +
</syntaxhighlight>
  
== Aligned Memory Access ==
+
Mais vous ne pouvez pas garantir que cela fonctionnera sur une plateforme 32 bits parce que '''mybuffer''' pourrait ne pas être aligné sur 2 ou 4 octets (voir [https://fr.wikipedia.org/wiki/Alignement_en_m%C3%A9moire alignement en mémoire] sur Wikipedia).  
This is a little less likely to happen to you but it happened to me! If you're used to 8-bit platforms, you can do this nice thing where you can typecast variables around. e.g.
 
  
<code>uint8_t mybuffer[4];</code><br><code>float f = (float)mybuffer;</code>
+
Un ARM Cortex-M0 peut uniquement accéder directement aux données par bloc de 16-bit (tous les deux ou 4 octets). Essayer d'accéder à un octet impaire (octets en position 1 ou 3) provoquera une erreur matérielle et un arrêt du MCU.
  
You can't be guaranteed that this will work on a 32-bit platform because '''mybuffer''' might not be aligned to a 2 or 4-byte boundary. The ARM Cortex-M0 can only directly access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an odd-boundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU. Thankfully, there's an easy work around ... just use memcpy!
+
Heureusement, il existe une solution simple... utiliser la fonction {{fname|memcpy}} !
  
<code>uint8_t mybuffer[4];<br>float f;<br>memcpy(f, mybuffer, 4)</code>
+
<syntaxhighlight lang="c">
 +
uint8_t mybuffer[4];
 +
float f;
 +
memcpy(f, mybuffer, 4)
 +
</syntaxhighlight>
  
== Floating Point Conversion ==
+
== Conversion en virgule flottante (dtostrf) ==
Like the AVR Arduinos, the M0 library does not have full support for converting floating point numbers to ASCII strings. Functions like sprintf will not convert floating point.  Fortunately, the standard AVR-LIBC library includes the dtostrf function which can handle the conversion for you.
+
Tout comme pour les AVR arduino, la bibliothèque M0 ne propose un support "complet" permettant de convertir une valeur en virgule flottante vers une chaine de caractères.  
  
Unfortunately, the M0 run-time library does not have dtostrf.  You may see some references to using '''#include <avr/dtostrf.h>''' to get dtostrf in your code.  And while it will compile, it does '''not''' work.
+
Les fonctions comme {{fname|sprintf}} ne feront pas la conversion de valeur en virgule flottante. Par chance, la bibliothèque standard AVR-LIBC inclus la fonction {{fname|dtostrf}} qui est capable de gérer cette conversion pour nous.
  
Instead, check out this thread to find a working dtostrf function you can include in your code:
+
Malencontreusement, les bibliothèques run-time du M0 ne dispose pas de cette fonction dtostrf! Vous pourriez rencontrer quelques fils de discussions mentionnant '''#include <avr/dtostrf.h>''' pour obtenir la fonction dtostrf. <font color="red">Mais si cela compile, le fonction '''ne fonctionne pas sur un M0'''</font>.
  
<a href="http://forum.arduino.cc/index.php?topic=368720.0">http://forum.arduino.cc/index.php?topic=368720.0</a>
+
A la place, voyez le fil de discussion suivant pour trouver une fonction {{fname|dtostrf}} fonctionnelle que vous pourrez inclure dans votre code:
 +
* http://forum.arduino.cc/index.php?topic=368720.0
  
== How Much RAM Available? ==
+
== Combien de RAM disponible? ==
The ATSAMD21G18 has 32K of RAM, but you still might need to track it for some reason. You can do so with this handy function:
+
Un ATSAMD21G18 dispose de 32K de RAM mais vous pourriez avoir besoin de surveiller sa consommation pour des raisons propres à votre projet. Vous pouvez le faire à l'aide de cette fonction:
  
<syntaxhighlight lang="python">
+
<syntaxhighlight lang="c">
 
extern "C" char *sbrk(int i);
 
extern "C" char *sbrk(int i);
  
 
int FreeRam () {
 
int FreeRam () {
 
   char stack_dummy = 0;
 
   char stack_dummy = 0;
   return &amp;stack_dummy - sbrk(0);
+
   return &stack_dummy - sbrk(0);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Thx to <a href="http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879">http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879</a> for the tip!
+
Merci a [http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879 ce fil de discussion] sur les forums Arduino pour ce truc!
  
== Storing data in FLASH ==
+
== Stocker des données en FLASH ==
If you're used to AVR, you've probably used '''PROGMEM''' to let the compiler know you'd like to put a variable or string in flash memory to save on RAM. On the ARM, its a little easier, simply add '''const''' before the variable name:
+
Si vous utilisez un AVR (Arduino), alors vous avez probablement déjà utilisé '''PROGMEM''' qui permet au compilateur de savoir que vous voulez placer le contenu d'une variable (ou chaine de caractère) dans la mémoire Flash (afin d'économiser de la RAM).  
  
'''const char str[] = "My very long string";'''
+
Sur un ARM, c'est un peu plus facile. Il suffit d'ajouter le mot '''const''' devant le nom de la variable:
  
That string is now in FLASH. You can manipulate the string just like RAM data, the compiler will automatically read from FLASH so you dont need special progmem-knowledgeable functions.
+
<syntaxhighlight lang="c">
 +
const char str[] = "Ma treesss lonnnnguuuue chaiiiinnnnneeee";
 +
</syntaxhighlight>
  
You can verify where data is stored by printing out the address:<br>'''Serial.print("Address of str $"); Serial.println((int)&str, HEX);'''
+
Cette chaîne de caractère est maintenant en FLASH. Vous pouvez manipuler la chaîne de caractère comme si c'était des données en RAM, le compilateur fera automatiquement une lecture depuis la mémoire FLASH et vous n'aurez pas besoin d'utiliser de fonction spécialement conçue pour les manipulation progmem.
  
If the address is $2000000 or larger, its in SRAM. If the address is between $0000 and $3FFFF Then it is in FLASH
+
Vous pouvez vérifier l'emplacement de stockage des données en affichant leur adresse de stockage:
 +
 
 +
<syntaxhighlight lang="c">
 +
Serial.print("Address of str $"); Serial.println((int)&str, HEX);
 +
</syntaxhighlight>
  
 +
Si l'adresse est:
 +
* égale ou supérieure à $2000000 alors c'est stocker en SRAM.
 +
* entre $0000 et $3FFFF alors c'est stocké en FLASH
  
 
{{FEATHER-M0-EXPRESS-TRAILER}}
 
{{FEATHER-M0-EXPRESS-TRAILER}}

Version actuelle datée du 29 octobre 2017 à 10:23


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

L'ATSAMD21 est un tout petit composant mais encore assez récent comme nouveau venu dans le monde des Arduino-compatible. La plupart des croquis et bibliothèques fonctionnerons mais il y a quelques petites choses à noter!

Les notes ci-dessous concerne toutes les cartes M0 mais il n'est pas nécessaire de toutes les appliquer (ex: Trinket M0 et Gemma M0 n'ont pas de broche ARef, vous pouvez donc sauter les notes concernant la Référence Analogique!)

Référence Analogique

Si vous désirez utiliser la broche ARef pour une référence analogique différente de 3.3V, le code à utiliser est analogReference(AR_EXTERNAL) (avec un AR_EXTERNAL et non EXTERNAL)

Broches et pull-up

L'ancienne façon d'activer une broche en entrée avec un avec résistance pullup etait:

pinMode(pin, INPUT)
digitalWrite(pin, HIGH)

Parce que le registre de selection-pullup (pullup-selection) est le même que le registre de sélection-des-sortie (output-selection).

Vous ne pouvez plus utiliser cette approche avec le M0! Il faut utiliser:

pinMode(pin, INPUT_PULLUP)

Approche qui à au moins le bénéfice d'être rétro-compatible avec AVR.

Serial ou SerialUSB

99.9% des croquis Arduino existant utilise Serial.print pour sortie de débogage ou sortie console. Sur un Arduino SAMD/M0 officiel, cette instruction utilise le port Serial5, qui n'est pas exposé sur un Feather.

A la place, le port USB d'un Arduino M0 officiel est appelé SerialUSB.

Sur un Adafruit M0, Adafruit a corrigé cela de sortie que Serial est dirigé vers l'USB lorsque vous utilisez un Feather M0 (et donc tout fonctionne correctement automatiquement).

Si vous avez des croquis existants et que vous désirez le faire fonctionner sur un M0 sans occasionner de nombreuses opérations de remplacement, placez le code suivant:

#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
   // requis pour les opérations Serial sur les cartes à base de Zero
   #define Serial '''SERIAL_PORT_USBVIRTUAL'''
#endif

juste au dessus de la première définition de fonction dans votre code.

Par exemple:

FEATHER-M0-ArduinoIDE-Croquis-01.png
Crédit: AdaFruit Industries www.adafruit.com

AnalogWrite / PWM sur Feather M0/Metro M0

Après avoir consulté la fiche technique du SAMD21, Adafruit à constaté qu'il manquait quelques options listée dans la table multiplexeur sur la puce spécifiquement utilisée sur un Feather M0.

Sur toutes les puces SAMD21, il y a deux périphériques capables de générer des signaux PWM: Le Timer/Counter (TC) et Timer/Counter pour le contrôle des applications (TCC). Chaque SAMD21 dispose de plusieurs copies de chaque, appelés 'instances'.

Chaque instance TC dispose d'un registre de comptage (count), un registre de contrôle (control) et de deux canaux de sortie (output channel). Chaque canal peut être activé, désactivé et même inversé. Les broches connectées sur une instance TC peuvent produire une version identique de la même forme d'onde, ou forme d'onde complémentaire.

Chaque instance TCC dispose d'un simple registre compteur (count) mais de multiples registre comparateur (compare) et canaux de sorties (output channels). Il y a des options pour différent type de forme d'onde, interleaved switching, programmable dead time, etc.

Les plus gros membres de la famille SAMD21 ont jusqu'à 5 instances TC avec 2 canaux WO (waveform output : sortie de forme d'onde) et 3 instances TCC avec 8 canaux WO:

  • TC[0-4],WO[0-1]
  • TCC[0-2],WO[0-7]

Et cela sont ceux présentés dans la table multiplexer de la fiche technique.

Le SAMD21G utilisé sur le Feather M0 dispose seulement de 3 instances TC avec 2 canaux de sortie, et 3 instances TCC avec 8 canaux de sorties:

  • TC[3-5],WO[0-1]
  • TCC[0-2],WO[0-7]

En suivant les signaux vers les broches rendues disponibles sir le Feather M0, les broches suivantes ne seront pas capable de produire de signal PWM:

  • broche analogique A5

Les broches suivantes peuvent être configurées en sortie PWM (sans aucun conflit) aussi longtemps que les broches SPI, I2C et UART gardent leurs fonctions protocole:

  • Broches digitales 5, 6, 9, 10, 11, 12 et 13
  • Broches analogiques A3 et A4

Si seules les broches SPI gardent leur fonctions protocole, vous pouvez également faire du PWM sur les broches suivantes:

  • TX (broche digitale 1)
  • SDA (broche digitale 20)

analogWrite() et gamme de valeur PWM

Sur un AVR (Arduino Uno), si vous utilisez l'instruction analogWrite(pin, 255) sur une sortie PWM alors cela conduit à un signal HAUT en permanence sur la broche.

Sur un Cortex ARM, le signal PWM sera fixé à 255/256. Par conséquent, il y aura toujours une très petite 'implusion à 0v'. Si vous avez besoin que le signal soit continuellement HIGH alors il faudra ajouter un test qui remplace l'instruction analogWrite(pin, 255) par digitalWrite(pin, HIGH)

Fichier d'entête manquant

Vous pourriez avoir du code qui utilise des bibliothèques non supportée sur un coeur M0. Par exemple, si vous avez du code contenant la ligne suivante:

#include <util/delay.h>

alors vous obtiendrez une erreur mentionnant

fatal error: util/delay.h: No such file or directory
  #include <util/delay.h>
                         ^
compilation terminated.
Error compiling.

Ce qui permet de localiser la ligne (et fichier) où s'est produit l'erreur. Il suffira alors de l'inclure dans une structure #ifdef comme celle présentée ci-dessous:

#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2)
 #include <util/delay.h>;
#endif

Les lignes ci-dessous font en sorte de ne pas inclure le fichier d'entête pour d'autres architectures.

Si l'instruction #include se trouve directement dans votre croquis Arduino alors vous pouvez essayer de retirer cette ligne.

Lancer le Bootloader

Sur la plupart des AVRs (Arduino Uno), le simple fait de presser le bouton reset avec le microcontrôleur branché en USB permet de démarrer manuellement le bootloader. Le bootloader termine automatiquement sont exécution au bout de quelques secondes.

Sur le M0, vous aurez besoin de double cliquer le bouton reset. Vous verrez la LED rouge pulser, ce qui indique que le bootloader est actif. Une fois dans ce mode, il n'y a pas de "time out", le M0 reste en mode bootloader indéfiniment. Cliquez une nouvelle fois sur le bouton "reset" pour redémarrer le microcontrôleur.

Alignement en mémoire

Cela à moi de chance de vous arriver... mais autant être tenu informé.

Si vous avez utilisé des plateformes 8 bits alors vous savez probablement qu'il est possible de réaliser des typecast de variables. Par exemple:

uint8_t mybuffer[4];
float f = (float)mybuffer;

Mais vous ne pouvez pas garantir que cela fonctionnera sur une plateforme 32 bits parce que mybuffer pourrait ne pas être aligné sur 2 ou 4 octets (voir alignement en mémoire sur Wikipedia).

Un ARM Cortex-M0 peut uniquement accéder directement aux données par bloc de 16-bit (tous les deux ou 4 octets). Essayer d'accéder à un octet impaire (octets en position 1 ou 3) provoquera une erreur matérielle et un arrêt du MCU.

Heureusement, il existe une solution simple... utiliser la fonction memcpy !

uint8_t mybuffer[4];
float f;
memcpy(f, mybuffer, 4)

Conversion en virgule flottante (dtostrf)

Tout comme pour les AVR arduino, la bibliothèque M0 ne propose un support "complet" permettant de convertir une valeur en virgule flottante vers une chaine de caractères.

Les fonctions comme sprintf ne feront pas la conversion de valeur en virgule flottante. Par chance, la bibliothèque standard AVR-LIBC inclus la fonction dtostrf qui est capable de gérer cette conversion pour nous.

Malencontreusement, les bibliothèques run-time du M0 ne dispose pas de cette fonction dtostrf! Vous pourriez rencontrer quelques fils de discussions mentionnant #include <avr/dtostrf.h> pour obtenir la fonction dtostrf. Mais si cela compile, le fonction ne fonctionne pas sur un M0.

A la place, voyez le fil de discussion suivant pour trouver une fonction dtostrf fonctionnelle que vous pourrez inclure dans votre code:

Combien de RAM disponible?

Un ATSAMD21G18 dispose de 32K de RAM mais vous pourriez avoir besoin de surveiller sa consommation pour des raisons propres à votre projet. Vous pouvez le faire à l'aide de cette fonction:

extern "C" char *sbrk(int i);

int FreeRam () {
  char stack_dummy = 0;
  return &stack_dummy - sbrk(0);
}

Merci a ce fil de discussion sur les forums Arduino pour ce truc!

Stocker des données en FLASH

Si vous utilisez un AVR (Arduino), alors vous avez probablement déjà utilisé PROGMEM qui permet au compilateur de savoir que vous voulez placer le contenu d'une variable (ou chaine de caractère) dans la mémoire Flash (afin d'économiser de la RAM).

Sur un ARM, c'est un peu plus facile. Il suffit d'ajouter le mot const devant le nom de la variable:

const char str[] = "Ma treesss lonnnnguuuue chaiiiinnnnneeee";

Cette chaîne de caractère est maintenant en FLASH. Vous pouvez manipuler la chaîne de caractère comme si c'était des données en RAM, le compilateur fera automatiquement une lecture depuis la mémoire FLASH et vous n'aurez pas besoin d'utiliser de fonction spécialement conçue pour les manipulation progmem.

Vous pouvez vérifier l'emplacement de stockage des données en affichant leur adresse de stockage:

Serial.print("Address of str $"); Serial.println((int)&str, HEX);

Si l'adresse est:

  • égale ou supérieure à $2000000 alors c'est stocker en SRAM.
  • entre $0000 et $3FFFF alors c'est stocké en FLASH

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.