Last Updated on
Raspberry PI can be used to interface real world from its GPIO as, for example, by Controlling a stepper motor. Furthermore, you can also use Raspberry PI to dialog with some devices (like Arduino) by using serial USB port.
In this guide I’ll show you how to connect your Raspberry PI to a serial USB port and read its values with Python from terminal (without Desktop environment). For this purpose, we’ll use Pyserial and its terminal tool.
What We Need
For this post I’m going to use a Raspberry PI Zero W and an Arduino Uno R3. Steps should work also with newer Raspberry PI boards.
As usual, I suggest adding from now to your favourite ecommerce shopping chart all needed hardware, so that at the end you will be able to evaluate overall costs and decide if continuing with the project or removing them from shopping chart. So, hardware will be only:
- Raspberry PI Zero W (including proper power supply or using a smartphone micro usb charger with at least 3A) or newer Raspberry PI board
- micro SD card (at least 16 GB, at least class 10)
- Arduino Uno R3 board or compatible board (you can also consider Elegoo starter kit, which comes with a special coupon for peppe8o.com readers)
Raspberry PI Environment Preparation
Before all, please refer to Install Raspbian Buster Lite in your Raspberry PI article to install Raspberry PI OS. Furthermore, Rasbpian Buster Lite comes with Python pre-installed.
Now we must configure Arduino Uno with its first sketch. For this purpose, you have 2 option:
- Connecting Windows PC with Arduino via Arduino IDE
- Connecting Raspberry PI to Arduino only via terminal (from Raspbian Buster Lite)
Before installing Pyserial, we need to get pip:
sudo apt install python3-pip
Now we can go on to install Pyserial:
pip3 install pyserial
Test Installation And Read Console
To read our console, we need now to connect Raspberry PI USB port to Arduino one. For testing purposes I’ll show you results from my weather system (procedure will be soon available on peppe8o.com, stay tuned!):
Arduino must be configured to send data via COM port with a Serial.print command inside its running sketch. Remember to append carriage return (text “\n”) to each data sample in your Arduino sketch, in order to have different rows for each reading.
In this configuration, you can simply use Pyserial miniterm tool to list available ports and their output. Use command python -m serial.tools.miniterm, then enter device port and receive port data on screen. Use CTRL+] to close connection:
pi@raspberrypi:~ $ python3 -m serial.tools.miniterm --- Available ports: --- 1: /dev/ttyACM0 'ttyACM0' --- 2: /dev/ttyAMA0 'ttyAMA0' --- Enter port index or full name: /dev/ttyACM0 --- Miniterm on /dev/ttyACM0 9600,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- 20.0;61.0 20.0;61.0 20.0;61.0 --- exit ---
You can also go directly on port reading, if you already know its name, just by appending port name. In my example correct port is /dev/ttyACM0 (please refer Connecting Raspberry PI to Arduino only via terminal from Raspbian Buster Lite to know how to discover your port), so direct command will be:
pi@raspberrypi:~ $ python3 -m serial.tools.miniterm /dev/ttyACM0 --- Miniterm on /dev/ttyACM0 9600,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- 20.0;61.0 20.0;61.0 20.0;61.0 --- exit ---
Using Pyserial Inside Python Programs
Also this operation is really simple. You need to import serial library and call port opening. Create a file named “test.py”:
and include the following code:
import serial ser=serial.Serial('/dev/ttyACM0',9600) readedText = ser.readline() print(readedText) ser.close()