Adafruit Feather M0 Adalogger
Created by lady ada
https://learn.adafruit.com/adafruit-feather-m0-adalogger
Last updated on 2022-07-27 03:36:48 PM EDT
©Adafruit Industries
Page 1 of 57
Table of Contents
Overview
5
Pinouts
8
•
•
•
•
Power Pins
Logic pins
Micro SD Card + Green LED
Other Pins!
Assembly
•
•
•
•
•
•
•
•
•
Header Options!
Soldering in Plain Headers
Prepare the header strip:
Add the breakout board:
And Solder!
Soldering on Female Header
Tape In Place
Flip & Tack Solder
And Solder!
Power Management
•
•
•
•
•
12
22
Battery + USB Power
Power Supplies
Measuring Battery
ENable pin
Alternative Power Options
Arduino IDE Setup
29
Using with Arduino IDE
31
•
•
•
•
•
•
•
•
Install SAMD Support
Install Adafruit SAMD
Install Drivers (Windows 7 & 8 Only)
Blink
Successful Upload
Compilation Issues
Manually bootloading
Ubuntu & Linux Issue Fix
Feather HELP!
39
Using the SD Card
44
• Example logging sketch
• Next steps!
Adapting Sketches to M0 & M4
•
•
•
•
•
•
48
Analog References
Pin Outputs & Pullups
Serial vs SerialUSB
AnalogWrite / PWM on Feather/Metro M0
analogWrite() PWM range
analogWrite() DAC on A0
©Adafruit Industries
Page 2 of 57
•
•
•
•
•
•
•
•
•
•
•
•
•
Missing header files
Bootloader Launching
Aligned Memory Access
Floating Point Conversion
How Much RAM Available?
Storing data in FLASH
Pretty-Printing out registers
M4 Performance Options
CPU Speed (overclocking)
Optimize
Cache
Max SPI and Max QSPI
Enabling the Buck Converter on some M4 Boards
Downloads
56
• Datasheets
• Schematic
• Fabrication Print
©Adafruit Industries
Page 3 of 57
©Adafruit Industries
Page 4 of 57
Overview
Feather is the new development board from Adafruit, and like it's namesake it is thin,
light, and lets you fly! We designed Feather to be a new standard for portable
microcontroller cores.
This is the Adafruit Feather M0 Adalogger - our take on an 'all-in-one' Cortex M0
datalogger (or data-reader) with built in USB and battery charging. Its an Adafruit
Feather M0 with a microSD holder ready to rock! We have other boards in the Feather
family, check'em out here (https://adafru.it/jAQ)
©Adafruit Industries
Page 5 of 57
At the Feather M0's heart is an ATSAMD21G18 ARM Cortex M0 processor, clocked at
48 MHz and at 3.3V logic, the same one used in the new Arduino Zero (http://
adafru.it/2843). This chip has a whopping 256K of FLASH (8x more than the
Atmega328 or 32u4) and 32K of RAM (16x as much)! This chip comes with built in USB
so it has USB-to-Serial program & debug capability built in with no need for an FTDIlike chip.
To make it easy to use for portable projects, we added a connector for any of our 3.7V
Lithium polymer batteries and built in battery charging. You don't need a battery, it will
run just fine straight from the micro USB connector. But, if you do have a battery, you
can take it on the go, then plug in the USB to recharge. The Feather will automatically
switch over to USB power when its available. We also tied the battery thru a divider to
an analog pin, so you can measure and monitor the battery voltage to detect when
you need a recharge.
©Adafruit Industries
Page 6 of 57
Here's some handy specs! Like all Feather M0's you get:
• Measures 2.0" x 0.9" x 0.28" (51mm x 23mm x 8mm) without headers soldered in
• Light as a (large?) feather - 5.3 grams
• ATSAMD21G18 @ 48MHz with 3.3V logic/power
• 256KB of FLASH + 32KB of RAM
• 3.3V regulator with 500mA peak current output
• USB native support, comes with USB bootloader and serial port debugging
• You also get tons of pins - 20 GPIO pins
• Hardware Serial, hardware I2C, hardware SPI support
• 8 x PWM pins
• 10 x analog inputs
• Built in 100mA lipoly charger with charging status indicator LED
• Pin #13 red LED for general purpose blinking
• Power/enable pin
• 4 mounting holes
• Reset button
The Feather M0 Adalogger uses the extra space left over to add MicroSD + a green
LED:
• Pin #8 green LED for your blinking pleasure
• MicroSD card holder for adding as much storage as you could possibly want, for
reading or writing.
©Adafruit Industries
Page 7 of 57
Comes fully assembled and tested, with a USB bootloader that lets you quickly use it
with the Arduino IDE. We also toss in some header so you can solder it in and plug
into a solderless breadboard. Lipoly battery, MicroSD card and USB cable not
included (but we do have lots of options in the shop if you'd like!)
Check out our tutorial for all sorts of details, including schematics, files, IDE
instructions, and more!
Pinouts
Pretty Pins PDF on GitHub (https://adafru.it/Xlf).
©Adafruit Industries
Page 8 of 57
The Feather M0 Adalogger is chock-full of microcontroller goodness. There's also a
lot of pins and ports. We'll take you a tour of them now!
Power Pins
• GND - this is the common ground for all power and logic
©Adafruit Industries
Page 9 of 57
• BAT - this is the positive voltage to/from the JST jack for the optional Lipoly
battery
• USB - this is the positive voltage to/from the micro USB jack if connected
• EN - this is the 3.3V regulator's enable pin. It's pulled up, so connect to ground
to disable the 3.3V regulator
• 3V - this is the output from the 3.3V regulator, it can supply 500mA peak
Logic pins
This is the general purpose I/O pin set for the microcontroller.
All logic is 3.3V
Nearly all pins can do PWM output
All pins can be interrupt inputs
• #0 / RX - GPIO #0, also receive (input) pin for Serial1 (hardware UART), also can
be analog input
• #1 / TX - GPIO #1, also transmit (output) pin for Serial1, also can be analog input
• #20 / SDA - GPIO #20, also the I2C (Wire) data pin. There's no pull up on this pin
by default so when using with I2C, you may need a 2.2K-10K pullup.
• #21 / SCL - GPIO #21, also the I2C (Wire) clock pin. There's no pull up on this pin
by default so when using with I2C, you may need a 2.2K-10K pullup.
• #5 - GPIO #5
• #6 - GPIO #6
• #9 - GPIO #9, also analog input A7. This analog input is connected to a voltage
divider for the lipoly battery so be aware that this pin naturally 'sits' at around
2VDC due to the resistor divider
• #10 - GPIO #10
• #11 - GPIO #11
• #12 - GPIO #12
• #13 - GPIO #13 and is connected to the red LED next to the USB jack
• A0 - This pin is analog input A0 but is also an analog output due to having a
DAC (digital-to-analog converter). You can set the raw voltage to anything from 0
to 3.3V, unlike PWM outputs this is a true analog output
• A1 thru A5 - These are each analog input as well as digital I/O pins.
• SCK/MOSI/MISO (GPIO 24/23/22)- These are the hardware SPI pins, you can use
them as everyday GPIO pins (but recommend keeping them free as they are
best used for hardware SPI connections for high speed.
©Adafruit Industries
Page 10 of 57
Micro SD Card + Green LED
Since not all pins can be brought out to breakouts, due to the small size of the
Feather, we use these to control the SD card!
• #4 - used as the MicroSD card CS (chip select) pin
• #7 - used as the MicroSD card CD (card detect) pin. If you want to detect when a
card is inserted/removed, configure this pin as an input with a pullup. When the
pin reads low (0V) then there is no card inserted. When the pin reads high, then
a card is in place. It will not tell you if the card is valid, its just a mechanical
switch
• #8 - This pin was also left over, so we tied it to a green LED, its next to the SD
card. It might be handy to blink this LED when writing / reading valid data or
some other user-alert!
Other Pins!
• RST - this is the Reset pin, tie to ground to manually reset the AVR, as well as
launch the bootloader manually
• ARef - the analog reference pin. Normally the reference voltage is the same as
the chip logic voltage (3.3V) but if you need an alternative analog reference,
connect it to this pin and select the external AREF in your firmware. Can't go
higher than 3.3V!
©Adafruit Industries
Page 11 of 57
SWCLK & SWDIO - These pads on the bottom are used to program the chip. They can
also be connected to an SWD debugger.
Assembly
We ship Feathers fully tested but without headers attached - this gives you the most
flexibility on choosing how to use and configure your Feather
Header Options!
Before you go gung-ho on soldering, there's a few options to consider!
©Adafruit Industries
Page 12 of 57
The first option is soldering in plain male
headers, this lets you plug in the Feather
into a solderless breadboard
©Adafruit Industries
Page 13 of 57
Another option is to go with socket female
headers. This won't let you plug the
Feather into a breadboard but it will let
you attach featherwings very easily
©Adafruit Industries
Page 14 of 57
We also have 'slim' versions of the female
headers, that are a little shorter and give a
more compact shape
©Adafruit Industries
Page 15 of 57
Finally, there's the "Stacking Header"
option. This one is sort of the best-of-bothworlds. You get the ability to plug into a
solderless breadboard and plug a
featherwing on top. But its a little bulky
Soldering in Plain Headers
Prepare the header strip:
Cut the strip to length if necessary. It will
be easier to solder if you insert it into a
breadboard - long pins down
©Adafruit Industries
Page 16 of 57
Add the breakout board:
Place the breakout board over the pins so
that the short pins poke through the
breakout pads
And Solder!
Be sure to solder all pins for reliable
electrical contact.
(For tips on soldering, be sure to check out
our Guide to Excellent Soldering (https://
adafru.it/aTk)).
©Adafruit Industries
Page 17 of 57
Solder the other strip as well.
©Adafruit Industries
Page 18 of 57
You're done! Check your solder joints
visually and continue onto the next steps
Soldering on Female Header
Tape In Place
For sockets you'll want to tape them in
place so when you flip over the board they
don't fall out
©Adafruit Industries
Page 19 of 57
Flip & Tack Solder
After flipping over, solder one or two
points on each strip, to 'tack' the header in
place
©Adafruit Industries
Page 20 of 57
And Solder!
Be sure to solder all pins for reliable
electrical contact.
(For tips on soldering, be sure to check out
our Guide to Excellent Soldering (https://
adafru.it/aTk)).
©Adafruit Industries
Page 21 of 57
You're done! Check your solder joints
visually and continue onto the next steps
Power Management
©Adafruit Industries
Page 22 of 57
Battery + USB Power
We wanted to make our Feather boards easy to power both when connected to a
computer as well as via battery.
There's two ways to power a Feather:
1. You can connect with a USB cable (just plug into the jack) and the Feather will
regulate the 5V USB down to 3.3V.
2. You can also connect a 4.2/3.7V Lithium Polymer (LiPo/LiPoly) or Lithium Ion
(LiIon) battery to the JST jack. This will let the Feather run on a rechargeable
battery.
When the USB power is powered, it will automatically switch over to USB for power,
as well as start charging the battery (if attached). This happens 'hot-swap' style so you
can always keep the LiPoly connected as a 'backup' power that will only get used
when USB power is lost.
The JST connector polarity is matched to Adafruit LiPoly batteries. Using wrong
polarity batteries can destroy your Feather.
The above shows the Micro USB jack (left), LiPoly JST jack (top left), as well as the
3.3V regulator and changeover diode (just to the right of the JST jack) and the LiPoly
charging circuitry (to the right of the Reset button).
There's also a CHG LED next to the USB jack, which will light up while the battery is
charging. This LED might also flicker if the battery is not connected, it's normal.
©Adafruit Industries
Page 23 of 57
The charge LED is automatically driven by the LiPoly charger circuit. It will try to
detect a battery and is expecting one to be attached. If there isn't one it may
flicker once in a while when you use power because it's trying to charge a (nonexistent) battery. It's not harmful, and its totally normal!
Power Supplies
You have a lot of power supply options here! We bring out the BAT pin, which is tied
to the LiPoly JST connector, as well as USB which is the +5V from USB if connected.
We also have the 3V pin which has the output from the 3.3V regulator. We use a
500mA peak regulator. While you can get 500mA from it, you can't do it continuously
from 5V as it will overheat the regulator.
It's fine for, say, powering an ESP8266 WiFi chip or XBee radio though, since the
current draw is 'spikey' & sporadic.
Measuring Battery
If you're running off of a battery, chances are you wanna know what the voltage is at!
That way you can tell when the battery needs recharging. LiPoly batteries are 'maxed
out' at 4.2V and stick around 3.7V for much of the battery life, then slowly sink down
to 3.2V or so before the protection circuitry cuts it off. By measuring the voltage you
can quickly tell when you're heading below 3.7V.
To make this easy we stuck a double-100K resistor divider on the BAT pin, and
connected it to D9 (a.k.a analog #7 A7). You can read this pin's voltage, then double it,
to get the battery voltage.
©Adafruit Industries
Page 24 of 57
#define VBATPIN A7
float measuredvbat = analogRead(VBATPIN);
measuredvbat *= 2;
// we divided by 2, so multiply back
measuredvbat *= 3.3; // Multiply by 3.3V, our reference voltage
measuredvbat /= 1024; // convert to voltage
Serial.print("VBat: " ); Serial.println(measuredvbat);
This voltage will 'float' at 4.2V when no battery is plugged in, due to the lipoly charger
output, so its not a good way to detect if a battery is plugged in or not (there is no
simple way to detect if a battery is plugged in)
Average Power Draw w/SD Card
The average power draw of the ATSAMD21 + regulator circuitry is 11mA. Both the red
and green LED each draw 1mA if you light them up.
Say you are running this sample sketch which logs the analog voltage on A0 to an SD
card file once a second.
1
#include
2
#include
3
4
// Set the pins used
5
#define cardSelect 4
6
7
File logfile;
8
9
10
11
// blink out an error code
void error(uint8_t errno) {
while(1) {
12
uint8_t i;
13
for (i=0; iBasics->Blink)
4. Select the correct board in the Tools menu, e.g. Feather 32u4, Feather M0,
Itsy 32u4 or M0 (physically check your board to make sure you have the right
one selected!)
5. Compile it (make sure that works)
6. Click Upload to attempt to upload the code
7. The IDE will print out a bunch of COM Ports as it tries to upload. During this
time, double-click the reset button, you'll see the red pulsing LED that tells
you its now in bootloading mode
8. The board will show up as the Bootloader COM/Serial port
9. The IDE should see the bootloader COM/Serial port and upload properly
©Adafruit Industries
Page 40 of 57
I can't get the Itsy/Feather USB device to show up - I get
"USB Device Malfunctioning" errors!
This seems to happen when people select the wrong board from the Arduino
Boards menu.
If you have a Feather 32u4 (look on the board to read what it is you have) Make
sure you select Feather 32u4 for ATMega32u4 based boards! Do not use anything
else, do not use the 32u4 breakout board line.
If you have a Feather M0 (look on the board to read what it is you have) Make sure
you select Feather M0 - do not use 32u4 or Arduino Zero
If you have a ItsyBitsy M0 (look on the board to read what it is you have) Make sure
you select ItsyBitsy M0 - do not use 32u4 or Arduino Zero
©Adafruit Industries
Page 41 of 57
I'm having problems with COM ports and my Itsy/Feather
32u4/M0
Theres two COM ports you can have with the 32u4/M0, one is the user port and
one is the bootloader port. They are not the same COM port number!
When you upload a new user program it will come up with a user com port,
particularly if you use Serial in your user program.
If you crash your user program, or have a program that halts or otherwise fails, the
user COM port can disappear.
When the user COM port disappears, Arduino will not be able to automatically start
the bootloader and upload new software.
So you will need to help it by performing the click-during upload procedure to restart the bootloader, and upload something that is known working like "Blink"
I don't understand why the COM port disappears, this
does not happen on my Arduino UNO!
UNO-type Arduinos have a seperate serial port chip (aka "FTDI chip" or "Prolific
PL2303" etc etc) which handles all serial port capability seperately than the main
chip. This way if the main chip fails, you can always use the COM port.
M0 and 32u4-based Arduinos do not have a seperate chip, instead the main
processor performs this task for you. It allows for a lower cost, higher power
setup...but requires a little more effort since you will need to 'kick' into the
bootloader manually once in a while
I'm trying to upload to my 32u4, getting "avrdude:
butterfly_recv(): programmer is not responding" errors
This is likely because the bootloader is not kicking in and you are accidentally
trying to upload to the wrong COM port
The best solution is what is detailed above: manually upload Blink or a similar
working sketch by hand by manually launching the bootloader
©Adafruit Industries
Page 42 of 57
I'm trying to upload to my Feather M0, and I get this error
"Connecting to programmer: .avrdude: butterfly_recv():
programmer is not responding"
You probably don't have Feather M0 selected in the boards drop-down. Make sure
you selected Feather M0.
I'm trying to upload to my Feather and i get this error
"avrdude: ser_recv(): programmer is not responding"
You probably don't have Feather M0 / Feather 32u4 selected in the boards dropdown. Make sure you selected Feather M0 (or Feather 32u4).
I attached some wings to my Feather and now I can't read
the battery voltage!
Make sure your Wing doesn't use pin #9 which is the analog sense for the lipo
battery!
The yellow LED Is flickering on my Feather, but no battery
is plugged in, why is that?
The charge LED is automatically driven by the Lipoly charger circuit. It will try to
detect a battery and is expecting one to be attached. If there isn't one it may flicker
once in a while when you use power because it's trying to charge a (non-existant)
battery.
It's not harmful, and its totally normal!
The Arduino IDE gives me "Device Descriptor Request Failed"
This can require "manual bootloading".
If you ever get in a 'weird' spot with the bootloader, or you have uploaded code that
crashes and doesn't auto-reboot into the bootloader, double-click the RST button to
get back into the bootloader. The red LED will pulse, so you know that its in
bootloader mode. Do the reset button double-press right as the Arduino IDE says its
attempting to upload the sketch, when you see the Yellow Arrow lit and the Uploading
... text in the status bar.
©Adafruit Industries
Page 43 of 57
(h
ttps://adafru.it/UJA)
Don't click the reset button before uploading, unlike other bootloaders you want this
one to run at the time Arduino is trying to upload
Using the SD Card
Once you have your Feather working, you probably want to rock out with some SD
card reading and writing! Luckily, the Arduino IDE has an SD card library that works
great, and it even comes with the IDE!
You can start with CardInfo which is very detailed
©Adafruit Industries
Page 44 of 57
Luckily many of the default examples already have chipSelect = 4 For other sketches,
do check to make sure that CS is set to 4! The SD card uses hardware SPI for the
remaining pins.
Make sure you have Adafruit SAMD board package version 1.6.2 or higher, so that
Serial debug data goes out on Serial not SerialUSB!
One done, upload & open up the serial console and you'll get all this info including a
list of files
Note that it may not print out the files, thats because the example root.ls(LS_R |
LS_DATE | LS_SIZE) expects to print to Serial rather than SerialUSB.
If you want to list the files, use listFiles example
Once you have that working, check out the other examples, such the Datalogger
example (saving analog data to SD card) and Dumpfile example (reading back data
from an SD card)
Example logging sketch
If you want to try saving data to the SD card in the simplest sketch, try this example.
You can adjust the delay() to set how often analog data is read from pin A0 and saved
to the SD card. The red LED will blink if there's an error, and the green LED will blink
when data is written to the SD card.
Note that to save power, we buffer the data, so you will only 'save' data truely every
50 datapoints (512 total characters written)
1
#include
2
#include
©Adafruit Industries
Page 45 of 57
3
4
// Set the pins used
5
#define cardSelect 4
6
7
File logfile;
8
9
10
// blink out an error code
void error(uint8_t errno) {
while(1) {
11
12
uint8_t i;
13
for (i=0; i