This is an old revision of the document!
No doubt, Arduino became the most widespread name in the development boards world, particularly among enthusiasts, educators, amateurs, and hobbyists, driving de-facto the embedded systems market for years.
Using cheap Atmel AVR microcontrollers, delivered along with development board and peripherals of almost any kind, including sensors and actuators, where you do not need to develop your PCB nor solder to obtain the fully functional device, all that triggered a new era where almost anyone can afford to have a development set and start playing the way only professionals used to do. Moreover, Arduino was not only the hardware but also the programming idea, delivering a simple development environment that is easy to use for beginners. Perhaps the most crucial impact of the Arduino on daily use was to spread the idea of taking automation control from the industry and bringing it on a massive scale to regular life, homes, cars, and toys to automate daily life.
The beginnings of the Arduino are dated to the year 2003 in Italy. Their most popular development board was delivered to the market in the fall of 2010. While AVRs microcontrollers are considered to be embedded systems more than IoT, and most of the early Arduino boards didn't offer any network interface, even then, it is essential to understand the idea of how to work with SoCs, so we start our guide here. However, many extension boards are suitable for the standard development boards (so-called shields) that offer wired and wireless networking for Arduino. Also, their clones, made mainly by Chinese manufacturers, evolved into more sophisticated products, integrating, i.e. Arduino Mega 2560 and ESP8266 SoC into one development board.
Initially, all Arduino development boards were using ATMEL's MCUs. It is no longer the case due to the demand for integrated radio communication that ATMEL's MCUs lack.
At the moment of writing this book, the Arduino family contains 4 main branches:
There are also a dozen retired products that are still present on the market, such as the LilyPad series, which was intended to become intelligent jewellery and smart clothing, or the Yun series - the first of real IoT devices made by Arduino, that were designed to run Linux distribution.
The Arduino boards work by reacting on signals at inputs that are received from various sensors and, after executing a set of instructions, an output is generated to respond to the environment. The input signal can be generated by pressing a button, receiving the radio or light signal, hearing the sound, perceiving an image of the situation using a camera, resulting from the environmental sensor measurement, and many others. The output actions on the environment are done using output elements like actuators, blinking LEDs, audio devices, and others. The set of instructions which is executed to handle both sensors and actuators is created using the Arduino programming language that is based on an open-source programming framework called Wiring and the Arduino Software (IDE) that is based on Processing. In the IoT and embedded devices built nowadays the most important element is the microcontroller or System on Chip. It is not common to add peripheral elements external to the microcontroller, so the choice of this element influences almost all hardware parameters and the set of peripherals of the board. Because there are many versions of Arduino boards available, only the selection of them is presented in the following chapters.
The initial, still very popular version of the Arduino board - Arduino Uno is based on the ATmega328P microcontroller. The same chip is used in e.g. Arduino Nano, and Pro Mini. Arduino Leonardo or Micro is based on ATmega32u4 which has a USB interface built in. The Arduino Mega board is created with an extended microcontroller ATmega2560 which has many more interface pins.
There are three different types of memory on the Arduino board: flash memory, SRAM and EEPROM. All of them are usually built into the main microcontroller so their type determines amount of the memory available.
The flash memory stores the Arduino code, and it is a non-volatile type of memory. That means the information in the memory is not deleted when the power is turned off.
The SRAM (static random access memory) is used for storing values of variables when the program of Arduino is running. This is the volatile memory that keeps information only until the power is turned off, or the board is reset.
The EEPROM (electrically erasable programmable read-only memory) is a non-volatile type of memory that can be used as long-term memory storage.
Uno | Leonardo | Micro | Mega | Nano | Pro Mini | |
---|---|---|---|---|---|---|
Microcontroller | ATmega328p | ATmega32u4 | ATmega32u4 | ATmega2650 | ATmega328p | ATmega328p |
Flash (kB) | 32 | 32 | 32 | 256 | 32 | 32 |
SRAM (kB) | 2 | 2 | 2.5 | 8 | 2 | 2 |
EEPROM (kB) | 1 | 1 | 1 | 4 | 1 | 1 |
Peripherals are all functional units which play the roles of external elements of the CPU. In Arduino boards, they are mainly implemented internally in the microcontroller, so the number and type of peripherals depend on the microcontroller version. Peripherals include Timers, Communication and networking interfaces, GPIOs, Analog comparators and converters, and supervisory units.
The basic Arduino boards do not implement any networking connectivity. This capability to use Ethernet, WiFi, Bluetooth, ZigBee, and other wireless protocols can be added with an external module or shield. Example shields are Arduino Ethernet Shield, WiFly Shield, Arduino Wi-Fi Shield, Electric Imp Shield, XBee Shield, Cellular Shield SM5100B and GPS Shield. In the simplest version, the WiFi module like Espressif ESP01S can be connected to Arduino's serial port and programmed with a set of AT commands.
Communication interfaces for Arduino are used to send and receive information to and from other external devices. Standard interfaces for Arduino are UART, I2C (also called TWI - Two-Wire Interface), SPI, and USB.
Timers are implemented as the essential elements of almost every microcontroller. These units can operate in timer mode or counter mode. In the first mode, they count pulses generated internally in the microcontroller. This makes it possible to generate square signals of specified frequency, signal periodic interrupts, or generate a PWM output signal. In counter mode, it is possible to count the number of external pulses. In selected Arduino boards there are 8-bit and 16-bit timers, an additional real-time clock with a separate generator, and a watchdog timer that can work as a supervisory unit which resets the microcontroller in case of software hang-up.
Uno | Leonardo | Micro | Mega | Nano | Pro Mini | |
---|---|---|---|---|---|---|
USB | 1 USB B | 1 Micro | 1 Micro | 1 USB B | 1 Mini | – |
UART | 1 | 1 | 1 | 4 | 1 | 1 |
I2C | 1 | 1 | 1 | 1 | 1 | 1 |
SPI | 1 | 1 | 1 | 1 | 1 | 1 |
8-bit Timer | 1 | 1 | 1 | 2 | 1 | 1 |
16-bit Timer | 2 | 2 | 2 | 4 | 2 | 2 |
Watchdog Timer | 1 | 1 | 1 | 1 | 1 | 1 |
Real-time clock | 1 | - | - | 1 | 1 | 1 |
Arduino boards do not contain specialised video chips. The size of their memory does not allow them to generate, capture, or even store complex high-resolution images. The most common approach to display images is connecting the LCD, OLED or TFT display with an SPI port. Connecting the camera is even more complicated. None of the microcontrollers used in basic Arduino boards have an adequate camera port to convey high-speed video signals. An answer to this challenge is the Arducam which implements the camera itself and the hardware to capture the image to the RAM. It can be connected to an Arduino board with an SPI interface allowing it to read and process the image data at the main processor speed.
Digital Input/Output Pins Digital input/output (I/O) pins are contacts on the Arduino board that can receive or transmit a digital signal. The status of the pin can be set either to 0 which represents LOW signal or to 1 – HIGH signal. The maximum current of the pin output is 40 mA.
Pulse Width Modulation Pulse Width Modulation (PWM) is a function of a pin to generate a square wave signal, with a variable length of the HIGH level of the output signal. The PWM is used for digital pins to simulate the analogue output.
Analog Pins Analog pins convert the analogue input value to a 10-bit number, using Analog Digital Converter (ADC). This function maps the input voltage between 0 and the reference voltage to numbers between 0 and 1023. By default, the reference voltage is set to a microcontroller operating voltage. Usually, it is 5 V or 3.3 V. Also, other internal or external reference sources can be used, for example, AREF pin.
Uno | Leonardo | Micro | Mega | Nano | Pro Mini | |
---|---|---|---|---|---|---|
Digital I/O | 14 | 20 | 20 | 54 | 22 | 14 |
PWM | 6 | 7 | 7 | 12 | 6 | 6 |
Analog pins | 6 | 12 | 12 | 16 | 8 | 6 |
Power and Other Pins