Feather M0 Microprocessor


The Feather M0 family of microprocessors is a variant of the Arduino, produced by AdaFruit. These are intended for more complicated tasks than a typical Arduino, and have more memory, a faster processor, and other capabilities. Some models are also equipped with WiFi. Similarly to the Arduino, they run one program at a time from permanent flash memory. And, with the addition of some libraries and other add-ons, can be programmed from the same development environment used for Arduino. They aren’t 100% compatible, as pins will have different numbers because of the different processor chip used. They also operate on 3.3V DC, which may create problems with some add-on boards (most Arduinos operate at 5V).

The M0 models all use the Cortex M0+ processor. Other models use different processors. This page is specific to the M0 versions except where noted otherwise.

Although these are slightly more expensive than the Arduino, their added capabilities make them suitable for applications that do not require a full computer like the Raspberry Pi, but which still exceed the capabilities of the standard Arduino. They also have a couple of stackable add-on boards, although nothing like the variety of “shields” available for the Arduino.

All of these additionally have a JST connector for a LiPoly battery and charging circuitry to allow the battery to be charged while the feather is connected to USB or an external power source. However, you can omit the battery and run from external power if desired.

Note: LiPoly batteries are easily damaged and subject to bursting into flames if improperly charged (or damaged). Use this aspect at your own risk.


Processor


The M0 versions of the Feather use the ATMEL D21G18 version of ARM’s Cortex M0+, the same processor used in the Arduino Zero. In fact, if you think of these as a small “pro” form-factor version of the Zero with added hardware, you’ll have the general idea. There are also 32u4 models, which use the same processor as the now-retired Arduino Leonardo. These are less capable, with slower clock speeds and less memory. I would not expect to use them (an Arduino Pro Mini would probably be just as good, and less expensive). There’s also one model using a fast Cortex M3 processor, but this seems overly complex for this class of device.

The M0 has 32K of SRAM and 256K of internal flash, and is clocked at 48 MHz.

Because the Cortex M0 is a 16-bit processor, unlike the 328 used in most Arduinos, which is an 8-bit processor, operations on single bytes are different. This can cause some “tricks” used for bit manipulations or byte-level access to produce unexpected results. While most libraries will work, the combination of a 16-bit processor, different pin numbers, and slightly different per-pin capabilities, may cause issues with libraries or programs originally written for the Arduino Uno. Also, while the Feather (and Arduino Zero) have some similarities to the Due (which also uses a Cortex processor), there are significant differences between the version of Cortex used on the Due and that on the Feather/Zero.

One other nice thing about these boards is that the Cortex processor can directly address flash memory (rather than the “copy from PROGMEM” approach used on a standard Arduino), so “const” data types are stored in flash memory rather than SRAM without any extra work required.


Models


The following models are available as of early 2016, however this product line was only introduced in late 2015 and new models are still being added.


M0 Adalogger
This has a slot for a microSD flash memory card, and is designed for data logging applications.


M0 Basic Proto
This is the minimalest version, with the M0+ processor and no added features.


M0 Blufruit LE
This version adds a Bluetooth Low Energy radio. This is a popular method for very short range communications between microprocessor devices. Bluetooth LE can be used to communicate with smartphones as well.


M0 Wifi
This has a WiFi chip added, supporting 802.11b/G/N (it does not support the newer 802.11AC version of WiFi). I expect to use this model in a couple of projects.


M0 WiFi with uFL
This is the same as the M0 WiFi except that it does not include a built-in antenna, but instead has a small snap-on u.FL connector for an external antenna. This is intended for applications where the antenna needs to be located away from the processor, or where longer-ranges are required.

Note: the female u.FL connectors (the one on the antenna) are not designed for frequent disconnect / reconnect and will become loose after only a few connections. If you need to disconnect antennas, use an adapter cable to a screw-type connector (SMA, for example).


WICED WiFi
This uses a 120 MHz Cortex M3 processor, with 128K of internal flash and a full megabyte of SRAM. It also includes an 802.11b/G/N WiFi chip. This is more complicated to develop for. It is intended to run more complex applications, such as web servers, but it is not a replacement for a more general computer such as the Raspberry Pi.


Power


The built-in regulator can convert an external voltage source (including a 3.7V LiPoly battery) to the 3.3V needed. It can also supply power to external devices, with an upper limit of 600 mA for limited durations (using that much continuously would overheat the regulator). The usual power supply would be USB from a computer or a wall-wart micro-USB 5V power source (the same as used by a Raspberry Pi). On battery, the regulator should be safe to around 300+ mA of continuous load (under 350 mA), but this is dependent on ambient temperature being around 30°C or less. On USB, the allowed sustained output would be lower, because the higher 5V input from the USB causes more heat in the regulator.

Power use is around 10 mA at idle for the base model, higher if attached devices are in use. The WiFi board with power-management enabled will use around 12 mA when idle (so base consumption for this model is 22 mA), rising to around 100 mA at most times when not idle, and peaking at up to 300 mA when transmitting.

Because this board can operate off a battery or USB, the way to turn off the processor while still allowing the battery to charge via USB is to connect a switch between the Enable (EN) pin and ground. When closed (the “on” switch position) it will turn off the voltage regulator, powering down the Feather, while still allowing the battery charger to draw from the USB (5V input). The pin has an internal pull-up that’s always active, so you don’t need to provide one or do anything in software.

To reset the board when connected to USB, double-click the reset button (not single-click as on an ordinary Arduino). This is often necessary to get the board in a state where it will accept software from the Arduino development environment.


Inputs / Outputs


This section notes a few important details not easily found.

Warning: because Feathers operate at 3.3V, applying 5V to a pin will likely permanently damage the chip.

Additionally, feather pins are more limited than those of a typical Arduino. Pins are grouped (I’m not sure what the group structure is) and a group may not exceed 65 mA of load, however any single pin should not exceed 10 ma (much less than the 40 mA allowed on an Uno), and the recommended limit is 7 mA. At 3.3V, this implies a resistance of at least 471 Ohms (with standard resistors, 570 Ohms should be used to provide a safety margin).

Pin #13 is, as on an ordinary Arduino, connected to the on-board LED.

There are a total of 10 analog pins, although only A0 to A5 are marked as such on the board and a couple appear to be reserved for special uses. Pins D8 and D9 are also analog pins.

Analog pins A0 - A5, in addition to analog input, can be used as Digital I/O. A0 can also provide true analog output (not PWM), while A1 - A5 can provide PWM.

Pin #9 (aka A7) is connected to the LiPoly and can be used to measure the battery voltage and estimate charge level. This pin may produce unexpected results if used for other purposes as it “floats” around 2V due to the battery circuit.

Pins using internal pull-up / pull-down resistors have resistances from 20 kOhm to 60 kOhm (40 kOhm nominal). For external pull-up / pull-down resistors, a good value is probably around 4.7 kOhm. This will result in less than 1 mA of current load (@ 3.3V) when in use, but provide much faster response than the internal resistors. Still, the internal ones work fine for many applications.

Note: I have seen some online comments about the Arduino Zero not having pull-up resistors built in. I’m not sure where that comes from, as it’s the same general Atmel SAMD21 family as the Feather, and I think the same model, so it ought to have them. But the Feather, which uses an Atmel SAMD21G18 CPU, definitely has pull-ups. They’d documented in its data sheet, and I don’t think the SPI library would work without them (and it works just fine, at least on the touchpanel and rotary encoder I’ve tried it with).

The Serial port associated with the USB differs from that on a stock Arduino, but this detail is hidden by the board definition. Serial.print and similar commands can be used with USB without modification.