When I started my project to create a robot, I had only a vague idea of the required computer hardware. Reading about other robot projects, Arduino and Raspberry Pi are mentioned. Both are important computers, but for very different purposes. In my microcontroller blog series, I want to investigate Arduino, Raspberry PI, their hardware functions and connection options.
The Arduino is a real go-getter of do-it-yourself projects. Since its inception 2012 it has provided the platform for countless hobbyist’s projects, from home appliances, IOT to robots. Different hardware revisions exist, yet the most common one is the classic Arduino Uno Rev3.
This article details the hardware, GPIO pins, and the supported connection protocols of the Arduino Uno.
Arduino Uno Rev 3 / Arduino Nano
The Arduino Uno Rev 3 has this hardware:
Microcontroller: ATmega328P / ATmega328P Flash Memory: 32KB SRAM: 2KB EEPROM: 1KB ClockSpeed: 16MhZ GPIO: 20 (14 digital, 6 analog)
The Arduino has 14 digital pins that can be used as input or output pins.
All digital pins are configured as output pins by default. However, they can be explicitly configured with the method
setPinMode(pinNumber, mode), where mode is either
The input state - which is translated to true/false bases on the voltage - are
LOW. To obtain the state, use the method
digitalRed(pinNumber). The mode
INPUT_PULLUP reverses the values of
LOW, and the receiving end of the wire should be connected to ground.
To output a digital signal, the Pins need to be configured with the method
pinMode(pinNumer, OUTPUT). To write a value, the method
digitalWrite(pinNumber, Value), where value is either
The Arduino has 6 analog pins.
Input mode is also the default behavior of analog pins. The Arduino board uses a 10bit analog-to-digital converter, delivering the values 0 to 1023. These pins can be configured explicitly with
setPinMode(pinNumber, mode). With
analogRead(pinNumber, the current signal value can be read. If the pin mode is set to
INPUT_PULLUP, the obtained values will be influenced.
Because the Arduino board has no digital to analog converter, the analog pins can only be configured as digital output pins with
setPinMode(pinNumber, OUTPUT), where the pin number is prefixed with an
Source: Arduino Store
The Arduino provides the following functions via its pins:
- PWM: Pulse width modulation is a signaling technique in which a digital signal is switching rapidly between two states - high and low - in a certain frequency. Pins 3, 5, 6, 9, 10, 11 can be used for PWM. The available modulation patterns are caped by the Arduinos AT32P clock rate of 1000Hz
- UART: Digital Pins 0 (RX) and DP 1 TX can be used to directly connect two devices with each other. The UART protocol creates a serial connection, data is transmitted asynchronously, and the data is times with a clock signal along the one wire. Technically, the UART connection can also be established via the USB port - the Arduino has a built-in serial to USB converter.
- I2C: The SCL and SDA Pins can be used to connect the Arduino to an I2C bus. The I2C protocol also creates a serial connection, but enables multiple server/client connection of up to 128 devices. The protocol is standardized, yet different implementation with different command subsets exist. The communication flow is typically initiated by the server: Actively polling the clients for new data.
- SPI: The SPI protocol is a synchronous serial communication between one server and several clients, where both can actively send data. SPI is a common protocol for interfacing with sensors. The Arduino provides pins for two different SPI bus: The dedicated ICSP pins, and DP 10 to 13
In addition to the explained protocols, there is another category of pins: Interrupt pins. In normal, uninterrupted program flow, the Arduino runs its program continuously, without end. When an interrupt pin becomes active, this program flow is stopped to call an interrupt handler. To use this feature, the pins need to be explicitly programmed with
The final pin type is interrupt pins, they allow incoming signals to gain priority over the microcontrollers current function. Interrupts are defined with
attachInterrupt(vectorNumber, callbackFunction, CHANGE). The
vectorNumber references special space in the Arduinos memory, and when this memory changes, the callback function is executed. Only pins 2 and 3 can be configured as interrupt pins.
The Arduino is the established work horse of many do-it-yourself projects. Despite its age of almost 10 years, it is versatile, fast, cheap and has a huge catalog of libraries to interface many different types of hardware. This article detailed the GPIO pins of the Arduino: Its digital and analog pins, how to set and read data, and finally, which protocol It supports. In the next article, I will investigate the GPIO of the Raspberry Pi.