Margay data logger v2.2. Back side with full-size SD card holder and pinout labels. Standard sized SD card for data storage and scale.
Project Margay is a micro scale environmental data logger designed based on the ALog series, it is designed to trade IO capabilities for cost and size, allowing for a very simple, but very useful data logger
Due to its small size and adaptability to its environment, Project Margay owes its name to the small Margay cat native to the forests of Central and South America.
A yawning margay cat
This includes a description of the PCB and component functionality
- ATMega1284p Processor
- 3.3v Logic
- On board full size SD card (for ease of field use)
- Extremely low sleep current
- Input voltage designed for use with easy to find alkaline batteries
- 0.1" Pitch headers can be populated with header pins and placed on a breadboard for prototyping
Significant components on the Margay v2.2.
- Microcontroller (computer) core
- ATMega1284p
- Arduino compatible
- programmable using C++
- 8 MHz
- Real-time clock
- DS3231M
- Temperature-compensated crystal for high accuracy (±5 ppm)
- Sensor and general-purpose connections
- Combined digital humidity and pressure sensor
- BME280
- Combined digital humidity and pressure sensor
- Data storage and return
- Local storage: SD card
- Power
- Coin cell battery - CR1220, 3V
- Power consumption
- IQ = <2.5μA (Estimated)
- Iout = 200mA, max (Regulated power supplied to sensors)
- Vin = 3.3 ~ 5.5v (Reverse polarity protected)
- User interface
- "Log" button
- "Reset" button
- Auxiliary LED
- RGB Status LED
IO
- 1 ADC, 18 bit
- 1 I2C Bus
- 1 UART Channel
- 2 GPIO Pins (one configurable as an 8 bit ADC)
- 1 PWM Channel (output configurable to 3.3v or VBat via a jumper on bottom of board)
- RGB Status LED
- Auxiliary LED
- Log Button
- Reset Button
- ATMega644p Processor
- 3.3v Logic
- On board full size SD card (for ease of field use)
- Extremely low sleep current
- Input voltage designed for use with easy to find alkaline batteries
- 0.1" Pitch headers can be populated with header pins and placed on a breadboard for prototyping
Features
IQ = 1.6mA
Iout = 50mA, max (Regulated power supplied to sensors)
Vin = 3.3 ~ 5.5v
IO:
- 1 I2C Bus
- 1 SPI Bus, with up to 2 CS pins
- 1 PWM Channel (output configurable to 3.3v or VBat via a jumper on bottom of board)
- RGB Status LED
- Auxiliary LED
- Reset Button
- Reconfigurable Button
Features
IQ = 2.5μA
Iout = 50mA, max (Regulated power supplied to sensors)
Vin = 3.3 ~ 5.5v (Reverse polarity protected)
IO
- 1 ADC, 18 bit
- 1 I2C Bus
- 1 SPI Bus, with up to 2 CS pins
- 1 PWM Channel (output configurable to 3.3v or VBat via a jumper on bottom of board)
- RGB Status LED
- Auxiliary LED
- Reset Button
- Reconfigurable Button
Features
IQ = <2.5μA (Estimated)
Iout = 200mA, max (Regulated power supplied to sensors)
Vin = 3.3 ~ 5.5v (Reverse polarity protected)
IO
- 1 ADC, 18 bit
- 1 I2C Bus
- 1 UART Channel
- 2 GPIO Pins (one configurable as an 8 bit ADC)
- 1 PWM Channel (output configurable to 3.3v or VBat via a jumper on bottom of board)
- RGB Status LED
- Auxiliary LED
- Reset Button
- Reconfigurable Button
Features
IQ = 1.68μA
Iout = 200mA, max (Regulated power supplied to sensors)
Vin = 3.3 ~ 5.5v (Reverse polarity protected)
IO
- 1 ADC, 18 bit
- 1 I2C Bus
- 1 UART Channel
- 2 GPIO Pins (one configurable as an 8 bit ADC)
- 1 PWM Channel (output configurable to 3.3v or VBat via a jumper on bottom of board)
- RGB Status LED
- Auxiliary LED
- Reset Button
- Reconfigurable Button
- Programmable using the Arduino IDE https://www.arduino.cc/en/main/software
- Custom bootloader and board definition for ATMega1284p available via https://github.com/NorthernWidget/Arduino_Boards
- Custom libraries from Northern Widget and the open-source community
- Primary data-logger functions
- Libraries available with each sensor, exposing a standard interface
- Open-source licensing via GNU GPL 3.0
Pinout is listed on bottom of board, and shown here for v2.2.
Margay data logger with pins, connectors, and interactive items annotated, top side.
Pins are colored following this convention:
- Ground: black
- Positive voltage: red
- Universal Serial Asynchronous Receiver--Transmitter (UART or USART) bus: blue
- Digital I/O: gray
- Analog measurement system: green
- I2C bus: purple
The jumper on the front of the board, to the right of "B+" and "Ax", connects an on-board reference resistor (10 kOhm in our builds) with the analog pin Ax to create a voltage divider in which the sensor between Ax and REF is on the GND side of the voltage divider.
Margay data logger annotated, bottom side. This is where the labels for the above pins are printed.
In this pinout, the name of each pin is shown, as well as the group of pins which it belongs to, a detailed description of the pins and callouts follows:
-
3v3, the switched 3.3v output rail, this rail can be turned on and off to disconnect power consumptive external devices
-
GND, the main output ground
-
BAT+, the positive connection for the battery line, voltage range 3.3v ~ 5.5v
-
BAT-, Negative battery connection, note: this pin is NOT interchangeable with GND, as BAT- is reverse voltage protected to prevent damage from plugging the battery in backwards
-
Vs, this is the switched PWM output, the voltage of this output is determined by a solder jumper on the bottom of the board, controlled by
VSwitch_Pin
- See information of limits and configuration below -
MOSI, this is the master out, slave in, pin for the SPI bus, which doubles as D5 when SPI and SD card are not used
-
MISO, this is the master in, slave out, pin for the SPI bus, which doubles as D6 when SPI and SD card are not used
-
SCK, this is the clock line for the SPI bus, which doubles as D7 when SPI and SD card are not used
-
CS, this is the chip select pin for the SPI bus, which doubles as both D11 and INT1 when external SPI is not used (Can be used even when SD card is used)
-
SCL, this is the dedicated serial clock line for the I2C bus
-
SDA, this is the dedicated serial data line for the I2C bus
- This is the auxiliary LED, which indicate TX and RX status using red and blue channels, green channel is controlled by
BuiltInLED
pin - This is the micro USB connection, which can be used for both programing via the Arduino IDE, and serial monitoring
- This is the primary RGB status LED, where the individual channels are controlled by D15, D14, and D13
- This is the reconfigurable push-button, generally used to initiate logging, it is read by
LogInt
pin - This is the hardware reset button, which will force the micro to return to the initial state after code upload
- This is the ICSP header, which can be used to burn the bootloader to the board or write programs to the chip without using the USB and bootloader
Pin Name | Pin Number (v0.0) | Pin Number (v1.0) | Pin Number (v2.x) | Function |
---|---|---|---|---|
SD_CS |
D4 | D4 | D4 | Chip select pin on SD card |
SD_CD |
D1 | D1 | D1 | Card detection pin for SD card, active low, AUX power must be on to use |
BuiltInLED |
D19 | D20 | D20 | Connected to green channel on AUX LED, on when pin is low |
RedLED |
D13 | D13 | D13 | Connected to red channel on STAT LED, on when pin is low |
GreenLED |
D15 | D15 | D15 | Connected to green channel on STAT LED, on when pin is low |
BlueLED |
D14 | D14 | D14 | Connected to blue channel on STAT LED, on when pin is low |
VRef_Pin |
A2 | A2 | A3 | Analog pin to read 1.8v on board reference, AUX power must be on to use |
ThermSensePin |
A1 | A1 | A1 | Analog pin to read thermistor voltage divider, AUX power must be on to use |
BatSensePin |
A0 | A0 | A2 | Analog pin to read battery voltage divider, AUX power must be on to use |
VSwitch_Pin |
D3 | D3 | D12 | Connected to MOSFET driver for Vs pin, active low |
Ext3v3Ctrl |
D12 | D19 | D22 | Turns on AUX power, active low |
I2C_SW |
N/A | D12 | D21 | Switches between on board I2C and external I2C |
PG |
D18 | D18 | D18 | Power good pin from core 3v3, can be used to test if core 3v3 is stable, pulled low when power is not stable |
ExtInt |
D11 | D11 | D11 | External interrupt and external chip select pin |
RTCInt |
D10 | D10 | D2 | Interrupt connected to RTC /INT line, active low |
LogInt |
D2 | D2 | A4 | Interrupt connected to LOG button, active low |
Jumper Selected | Logger Power Source | Current Limit, Avg [mA] | Power Limit, Avg [W] |
---|---|---|---|
VMain | USB | 220 | 0.5 |
VMain | Bat | 500 | 2.25 |
3v3 | USB | 220 | 0.5 |
3v3 | Bat | 450 | 2.0 |
Note: Instantanious current may exceed these values - these values corespond to the time averaged power consumption. This disctinction is most important when driving a load via PWM.
Device | Default address | Reprogrammable address | Function |
---|---|---|---|
DS3231 | 0x68 | N | Real-time clock |
MCP3421 | 0x6A | N | ADC |
BME280 | 0x77 | N | On-board barometric pressure, temperature, and relative humidity |
- SD Card
- FTDI USB-Serial converter
Assembling this data logger is possible by hand with sufficient skill and the following tools:
- Temperature-controlled soldering iron
- Hot-air rework station
- Equipment for stenciling with solder paste
- ESD-safe tweezers and workstation
- Solder wick
Mechanized assembly by a professional circuit-board assembly house, which is available in many parts of the world, may be preferred due to the complexity of this data logger board.
Go to https://www.arduino.cc/en/main/software. Choose the proper IDE version for your computer. For Windows, we suggest the non-app version to have more control over Arduino; this might change in the future. You will have to add custom libraries, so the web version will not work (at least, as of the time of writing). Download and install the Arduino IDE. Open it to begin the next steps.
Note: Users should see the code included below in the README and follow the directions indicated in http://northernwidget.com/tutorial. Some of the below information is deprecated.
Note: Currently, users should modify their Arduino libraries to include the most recent version 1 of SdFat; Margay is incompatible at present with version 2.
Before a data logger can receive programs via the convenient USB port, it must have a bootloader that tells it to expect to receive new programs that way. You can read more about bootloaders in general here: https://www.arduino.cc/en/Hacking/Bootloader.
Because you can't upload the bootloader via USB, you use the 2x3-pin 6-pin ICSP (also called ISP) header with a special device called an "in-circuit system programmer" (or just "in-system programmer; yup, that's what the acronym stands for).
Many devices exist to upload a bootloader including:
- The official AVR ISP mkII (no longer produced but available used)
- Using an Arduino as an ISP
- The versatile Olimex AVR-ISP-MK2
- The Adafruit USBtinyISP
Important note for Linux users: You must supply permissions to the Arduino IDE for it to be able to use the ICSP, or you will have to run it using sudo
. The former option is better; the latter is easier in the moment.
To upload the bootloader, do the following:
- Open the Arduino IDE. If you have not yet installed the Northern Widget board definitions, find and install them here (instructions provided): https://github.com/NorthernWidget/Arduino_Boards - the Margay board should be run using the "TLog v1" board definition.
- Select the desired board -- most likely ATMega1284p 8MHz under Northern Widget Boards.
- Plug the data logger into your computer via a micro-USB cable to provide power.
- Plug your ISP of choice into your computer (via a USB cable) and onto the 6-pin header. There are two ways to place it on; the header is aligned such that the ribbon cable should be facing away from the board while programming. If this fails without being able to upload, try flipping the header around.
- Go to Tools --> Programmer and select the appropriate programmer based on what you are using.
- Go to Tools --> Burn bootloader. Typically, within a few seconds, you learn whether you succeeded or failed. Hopefully it worked!
Note: Be sure to download and/or update drivers for your ISP.
This includes a usage guide to demo software which is provided to both test the hardware features of the board in general (the MargayHardwareTest file), and to set the device up as a logger using a TP-Downhole device as a sensor which runs on I2C. This logger demo tests all hardware on the board and ensures all required systems are connected and indicates the result of these tests using the Status LED on startup. A green light indicated all systems check out, and the device is ready to log, otherwise a red light indicates there is a problem, it is recommended to open up a serial monitor to determine which system is failing. If a green light is indicated, when the system is ready to log, logging is initiated by pressing the log button, which makes an initial log and starts a sequence of logs which will continue to occur every 15 minutes (by default) or by a different user defined time. In between logging events, the system is put to sleep to save power. Each time the log button is pressed, a new SD card file is created named "Logx.txt" where x increments with each button press, and each one of these individual files is initiated with a header to inform the user of the data columns used by the CSV type file.
To use this software the following libraries must be installed in the Arduino IDE:
Information on library instillation can be found on the Arduino site, the "Manual" instillation method should be used to ensure success
If you need to set a serial number on your Margay board, upload this sketch available in the "Software" folder within this repository.
Once the above testing sketch has been uploaded
Type SN Set
, followed by either a carriage return or a linefeed/newline character, to enter a prompt to set the serial number. This will give you three fields into which you can enter 4-digit hexadecimal (0-F) numbers:
- Board type; at Northern Widget, this is
0x4D02
for the Margay v2.2. If you are working with one of our boards, please use this number and enter a group ID and uniuqe ID as instructed. If you have built your own board, please do not use this number, as we would like to keep our series separate for the sake of recordkeeping (and not track every single 3rd-party built board out there) - Group ID: We use this to denote collaborative projects vs. internal use vs. general sales
- Unique ID: This is a monotonically increasing number.
If you wish to later read the serial number, type SN Read
.
@awickert @bschulz: Document other testing capabilities within the sketch?
As we provide all information about on board pins and their functionality, it is easy for a user to write their own code in the Arduino IDE to leverage the hardware capabilities of the Margay to whatever degree is desired. To do this, the Northern Widget board file can be used (as described above), or the MightyCore Board files can be used. These are the board files the Northern Widget ones were based on, but allow for more compilation options for the user. Full instructions for instillation and use are provided on the MightyCore GitHub page.
For the Margay (any model), the recommended settings are as follows:
Setting | Value |
---|---|
Board |
ATmega644 |
Pinout |
Standard |
Clock |
8MHz External |
Compiler LTO |
Disabled |
Variant |
644P/644PA |
BOD |
2.7v |
Margay_NoSensors.ino
#include "Margay.h"
// Include any sensor libraries.
// The Northern Widget standard interface is demonstrated here.
//Sensor mySensor;
// Instantiate classes
// Sensor mySensor; (for any Northern Widget standard sensor library)
Margay Logger;
// Empty header to start; will include sensor labels and information
String header;
// I2CVals for sensors
// Add these for any sensors that you attach
// These are used in the I2C device check (for the warning light)
// But at the time of writing, the logger should still work without this.
uint8_t I2CVals[] = {};
// Number of seconds between readings
// The Watchdog timer will automatically reset the logger after approximately 36 minutes.
// We recommend logging intervals of 30 minutes (1800 s) or less.
// Intervals that divide cleanly into hours are strongly preferable.
uint32_t updateRate = 60;
void setup(){
// No sensors attached; header may remain empty.
// header = header + mySensor.getHeader(); // + nextSensor.getHeader() + ...
Logger.begin(I2CVals, sizeof(I2CVals), header);
}
void loop(){
Logger.run(update, updateRate);
}
String update() {
initialize();
//return mySensor.getString(); // If a sensor were attached
return ""; // Empty string for this example: no sensors attached
}
void initialize(){
//mySensor.begin(); // For any Northern Widget sensor
// Other libraries may have different standards
}
A full index of the public variables and functions within the Margay data logger library is available at https://github.com/NorthernWidget-Skunkworks/Margay_Library. (currently under construction)
Note: Logger will not be able to wake up unless the clock (RTC) is powered.
Logging begins automatically once power is applied. If error conditions are found, they will be indicated by status lights, but the logger will attempt to continue if possible. The following should represent the light sequence.
- On power application
AUX
light will illuminate green, will stay on while testing
- After testing is complete
AUX
light will turn offSTAT
light will illuminate with various colors depending on the status of the logger- See "Status Codes" under "Troubleshooting" below for details
STAT
light will blink blue quickly once to indicate logging (or attempted logging) has begun
If an error code is received try the following steps:
General
- Disconnect and reconnect power, both USB and battery (Turn it off and back on again)
- Verify the quality of all screw terminal connections by gently tugging on the wires and making sure they stay in place, if not, remove and re-tighten the connection
- Ensure sensors and/or cables are not damaged, this can result in shorts or other problems
- Make sure batteries have sufficient voltage to run the logger, when the battery voltage drops below 3.3v, malfunctions can occur
The second LED (STAT) will have one of the colors below.
Green: All systems check out OK, logging will proceed
Orange: A sensor system is not registering properly, some sensor data may be missing or incorrect
- Verify correct polarity of sensor connection
- Ensure the right sensor is connected
- Verify the screw terminals are well connected to the wires (a loose connection can cause a failure)
- Make sure battery power is applied, some sensors can fail otherwise
Cyan: Clock time is incorrect, but logger is otherwise working correctly
- Connect the logger to a computer and reset the clock using the Northern Widget Time Set GUI
- Note and record the wrong time if the logger has been out in the field, alongside the current (correct) time, to correct the prior measurements
Pink: (looks like purple to some people): SD card is not inserted
- Insert the SD card, or make sure card is fully seated
Red: Critical on-board component is not functioning correctly, such as SD card or clock; Logging will likely not be able to proceed
- Attempt power cycle
- Try different SD card
- Disconnect all sensors
- If none of the previous steps remove the red light, contact Northern Widget for further support
Yellow, Fast Blinking: <50% battery capacity
- Replace batteries
Red, Fast Blinking: Batteries <3.3V, voltage too low to properly function
- If this error occurs while also connected over USB, check proper connection of batteries
- Replace batteries
- (<= Mrk 1.0) When using power from the external rail (the 3v3 on the screw terminals) it is always advised to have a battery connected to the board, even if connected via USB. The USB connection is able to power the core components, but not the external rail. We know this is annoying, but fear not, the Northern Widget team is working tirelessly to fix this for the Mrk 2.0!
- (<= Mrk 1.0) When using I2C on the device, external pullups (4.7kΩ ~ 10kΩ) are required. If using device strictly onboard the internal pullups on the ATMEGA seem sufficient, but if you add capacitance of a cable attaching to an external sensor, etc, this is often too much, since the internal pullups are very weak. This is also being fixed in the Mrk 2.0 version with dedicated switchable on board pullups.
- (All models) The external power rails and the switched battery rail should be enabled in hardware by default, however, it is our recommendation to explicitly define these pins (
Ext3v3Ctrl
) as outputs and drive themLOW
even if you never intend to switch them on and off. This prevents the rails from inadvertently being turned off due to a transient on the floating control line.
Support for this project provided by:
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.