I used to build Arduino projects with sensors, but it felt like I was sacrificing these sensors when I started working with Raspberry Pi instead. Thankfully there are a few ways to get Arduino sensors working with Raspberry Pi, and that’s what I’ve explored in this guide to help anyone else transitioning from Arduino projects to Raspberry Pi.
Any Arduino sensor that has a digital output will work with the Raspberry Pi. The Raspberry Pi can connect to digital sensors using its GPIO, including via SPI, I2C, and UART. Analog Arduino sensors will not work with most Raspberry Pi models unless a separate analog-to-digital converter is used. The Raspberry Pi Pico however has analog inputs.
In this guide I look at:
- Connecting an Arduino to a Raspberry Pi (to guarantee Arduino sensors will work)
- Connecting sensors directly to the Raspberry Pi using SPI, I2C, and UART
- Using an ADC to connect analog sensors to the Pi
I’ve also included some steps to take to get started using a Raspberry Pi Pico to read analog sensors.
1. Connect an Arduino to the Raspberry Pi
Connecting an Arduino directly to the Raspberry Pi is the easiest way to get Arduino sensors working with a Raspberry Pi. The Arduino collects the sensor data and then sends it to the Raspberry Pi, typically using UART, I2C, or SPI (more on these later as they can also be used to connect some sensors directly to the Pi).
The biggest advantage of connecting an Arduino to the Raspberry Pi is that it is practically guaranteed that you will still be able to collect sensor data – if your sensor worked with Arduino, then you will be able to get those readings on your Raspberry Pi.
Some downsides however are that it takes up a lot of space, it can be more expensive (if you have to buy the addition of a Raspberry Pi or Arduino), and there’s extra wiring and software configuration (to get the I2C, SPI, UART, or whatever else working).
To connect Arduino to Raspberry Pi:
- Add code for using the
Serial
object to your Arduino sensor sketch - Import the
serial
library in Python on your Raspberry Pi - Setup code on each device to communicate
- Connect the respective Raspberry Pi pins to the Arduino pins
Be careful: The Raspberry Pi GPIO is only designed for 3.3V – do not connect a 5V Arduino to the 3.3V GPIO. Use a voltage divider circuit if you have a 5V Arduino (such as the Uno).
Check out the Arduino Serial reference here if you need help setting up your sketch. I also found this video helpful:
A Raspberry Pi Pico can be substituted for the Arduino in this sort of setup, I’ve touched on this further below.
2. Connect the sensor using SPI
If your Arduino sensor supports Serial Peripheral Interface (SPI), it can be connected to the Raspberry Pi using the SPI pins on the GPIO. An Arduino is not required. Only some sensors support SPI, such as this digital temperature sensor from MicroChip.
The advantage of connecting the sensor with SPI is that additional components are not needed. You can connect the SPI pins on the sensor directly to the GPIO on the Raspberry Pi. It can be a good idea to connect a small decoupling capacitor between the input voltage and the ground on the sensor side of the interface though. Using SPI also means that the sensor works without needing an Arduino.
A disadvantage of using SPI is that it requires extra code to work compared with a sensor that can be connected directly to the Raspberry Pi. While there are plenty of guide available (such as this one), it is an extra step to troubleshoot if something goes wrong while building your project.
To use SPI with a sensor on Raspberry Pi:
- Ensure SPI is enabled using raspi-config
- Wire the sensor to the Raspberry Pi GPIO
- Import the spidev library to your Python code
- Open an SPI connection to the sensor to start sending commands and receiving data
A more detailed tutorial can be found here.
3. Use an ADC to connect an analog sensor
An analog-to-digital converter (ADC) can be used to convert readings from an analog sensor for use on the Raspberry Pi. Analog sensors cannot be connected directly to the Raspberry Pi GPIO, unlike Arduino which can read from analog sensors. If you’re using a Raspberry Pi Pico, analog input is available (see below).
Analog sensors can be connected to an external ADC which is then responsible for communicating readings to the Raspberry Pi, typically over I2C. An example can be found here.
To use an ADC and analog sensors with the Raspberry Pi:
- Wire the analog sensor to the ADC, and the ADC to the I2C pins on the GPIO
- Ensure I2C is enabled using raspi-config
- Import the
smbus
library for Python to establish and communicate with I2C devices
Make sure the ADC uses 3.3V for its I2C communication.
4. Use a Raspberry Pi Pico and connect wirelessly
The Raspberry Pi Pico is designed to be more of a competitor to Arduino than the traditional Raspberry Pi boards. Fittingly, it pretty much supports every sensor I can think of that would work on an Arduino. This includes analog sensors. Analog Arduino sensors can be connected to a Raspberry Pi Pico directly.
The wireless version of the Raspberry Pi Pico can read in sensor data and then send that wirelessly to another device (such as the Raspberry Pi). This is similar to using an Arduino, but has the advantage of being wireless (noting that wireless Arduino models are typically more expensive than a Pico W).
To use an Arduino sensor on Raspberry Pi Pico:
- Connect the sensor to the respective pins on the Pico (GPIO pins 26, 27, or 28)
- Write code for the Pico to connect to WiFi, read the sensor, then send that data to another computer
- Write code for the Raspberry Pi to receive that data
I found the video below helpful for figuring out how to connect analog inputs to the Raspberry Pi Pico:
5. Connect the sensor to a digital pin
Arduino sensors that have a digital output will work with the Raspberry Pi. They can be connected to any of the GPIO inputs and powered from the 3.3V output on the GPIO. Examples of digital output sensors include proximity detectors (the digital setting on a range sensor), touch sensors, buttons, and similar “On/Off” types of sensors.
Sensors connected to the Raspberry Pi GPIO can be read from the command line (using the “character device” interface), or from code using one of the GPIO libraries available. Check out this reference if you need more info on the “character device” interface.
I also made a video looking at how to connect sensors to the Raspberry Pi, check it out below:
6. Use an I2C enabled sensor
I2C can be used to connect some sensors directly to the Raspberry Pi. Arduino sensors that support I2C are typically an analog sensor combined with some digital circuitry to handle the I2C communication – often it’s easier to connect the sensor directly using one of the other methods above.
Adafruit sell some examples of I2C sensors here.
While you can connect sensors to the Raspberry Pi using I2C, I’ve found that there isn’t as good a use case for it as using one of the other methods on this list. I2C is best used to communicate with external peripherals that use microcontrollers, such as cellular modems.
7. Use UART
Sensors that support UART can be connected directly to the Raspberry Pi using the UART pins on the GPIO. Any sensor that works with Arduino UART should work with the Raspberry Pi UART as well.