Adafruit BBIO is an API to enable GPIO, PWM, ADC, UART, SPI and eQEP (Quadrature Encoder) hardware access from Python applications running on the Beaglebone.
-
It is recommended to use an official BeagleBoard.org Debian image
- Currently recommended image: Debian 9.2 "Stretch" iot (2017-10-29)
- Install Linux kernel 4.14.x to enable non-root control of GPIO and PWM (commit)
- Currently recommended image: Debian 9.2 "Stretch" iot (2017-10-29)
-
Adafruit_BBIO supports Linux kernels 3.8 through 4.14
-
New versions of Adafruit_BBIO may break backwards compatibility. Please read the changelog.
Easiest:
sudo ntpdate pool.ntp.org
sudo apt-get update
sudo apt-get install build-essential python-dev python-pip -y
sudo pip install Adafruit_BBIO
Manual:
sudo ntpdate pool.ntp.org
sudo apt-get update
sudo apt-get install build-essential python-dev python-pip -y
git clone git://github.com/adafruit/adafruit-beaglebone-io-python.git
cd adafruit-beaglebone-io-python
sudo python setup.py install
Upgrade Adafruit_BBIO to latest version on PyPI:
sudo pip install --upgrade Adafruit_BBIO
Using the library is very similar to the excellent RPi.GPIO library used on the Raspberry Pi. Below are some examples.
Please note that there is no '0' prefix for the pin numbers. For example, pin 7 on header P8 is P8_7
.
Correct:
GPIO.setup("P8_7", OUT )
INCORRECT:
GPIO.setup("P8_07", OUT )
Refer to pins_t table[]
in common.c all the pin labels.
config-pin is now used on the official BeagleBoard.org Debian Jessie and Stretch images to control pin mode (e.g. pin mux).
debian@beaglebone:~$ config-pin -q P9_14
P9_14 Mode: pwm
debian@beaglebone:~$ config-pin -l P9_14
default gpio gpio_pu gpio_pd pwm
debian@beaglebone:~$ config-pin P9_14 gpio
debian@beaglebone:~$ config-pin -q P9_14
P9_14 Mode: gpio Direction: in Value: 0
debian@beaglebone:~$ config-pin P9_14 pwm
debian@beaglebone:~$ config-pin -q P9_14
P9_14 Mode: pwm
Import the library, and setup as GPIO.OUT or GPIO.IN::
import Adafruit_BBIO.GPIO as GPIO
GPIO.setup("P8_14", GPIO.OUT)
You can also refer to the pin names::
GPIO.setup("GPIO0_26", GPIO.OUT)
Setup the pin for output, and write GPIO.HIGH or GPIO.LOW. Or you can use 1 or 0.::
import Adafruit_BBIO.GPIO as GPIO
GPIO.setup("P8_14", GPIO.OUT)
GPIO.output("P8_14", GPIO.HIGH)
On-board LEDs (USR0-USR3) are handled by LED class driver rather than the GPIO pin driver.
They have a different path in the /sys/ filesystem.
Setup the pin for output and write GPIO.HIGH or GPIO.LOW::
import Adafruit_BBIO.GPIO as GPIO
import time
for i in range(4):
GPIO.setup("USR%d" % i, GPIO.OUT)
while True:
for i in range(4):
GPIO.output("USR%d" % i, GPIO.HIGH)
time.sleep(1)
for i in range(4):
GPIO.output("USR%d" % i, GPIO.LOW)
time.sleep(1)
Inputs work similarly to outputs.:
import Adafruit_BBIO.GPIO as GPIO
GPIO.setup("P8_14", GPIO.IN)
Polling inputs:
if GPIO.input("P8_14"):
print("HIGH")
else:
print("LOW")
Waiting for an edge (GPIO.RISING, GPIO.FALLING, or GPIO.BOTH:
GPIO.wait_for_edge(channel, GPIO.RISING)
or
GPIO.wait_for_edge(channel, GPIO.RISING, timeout)
Detecting events:
GPIO.add_event_detect("P9_12", GPIO.FALLING)
#your amazing code here
#detect wherever:
if GPIO.event_detected("P9_12"):
print "event detected!"
The PWM Duty Cycle range was reversed in 0.0.15 from 100(off)-0(on) to 0(off)-100(on). Please update your code accordingly.
import Adafruit_BBIO.PWM as PWM
#PWM.start(channel, duty, freq=2000, polarity=0)
#duty values are valid 0 (off) to 100 (on)
PWM.start("P9_14", 50)
PWM.set_duty_cycle("P9_14", 25.5)
PWM.set_frequency("P9_14", 10)
PWM.stop("P9_14")
PWM.cleanup()
#set polarity to 1 on start:
PWM.start("P9_14", 50, 2000, 1)
import Adafruit_BBIO.ADC as ADC
ADC.setup()
#read returns values 0-1.0
value = ADC.read("P9_40")
#read_raw returns non-normalized value
value = ADC.read_raw("P9_40")
config-pin P9.21 uart # UART2_TXD
config-pin P9.22 uart # UART2_RXD
config-pin P9.24 uart # UART1_TXD
config-pin P9.26 uart # UART1_RXD
sudo pip install pyserial
import Adafruit_BBIO.UART as UART
import serial
UART.setup("UART1")
ser = serial.Serial(port = "/dev/ttyO1", baudrate=9600)
ser.close()
ser.open()
if ser.isOpen():
print "Serial is open!"
ser.write("Hello World!")
ser.close()
- Use
config-pin
to set pin mode for SPI pins- SPI0
- SPI0_CS0:
config-pin p9.17 spi_cs
- SPI0_D0:
config-pin p9.21 spi
- SPI0_D1:
config-pin p9.18 spi
- SPI0_SCLK:
config-pin p9.22 spi_sclk
- SPI0_CS0:
- SPI1
- SPI1_CS0:
config-pin p9.20 spi_cs
- SPI1_CS0:
config-pin p9.28 spi_cs
- SPI1_CS1:
config-pin p9.19 spi_cs
- SPI1_CS1:
config-pin p9.42 spi_cs
- SPI1_D0:
config-pin p9.29 spi
- SPI1_D1:
config-pin p9.30 spi
- SPI1_SCLK:
config-pin p9.31 spi_sclk
- SPI1_CS0:
- SPI0
- Example:
from Adafruit_BBIO.SPI import SPI
#spi = SPI(bus, device) #/dev/spidev<bus>.<device>
# /dev/spidev0.0
spi = SPI(1,0)
print(spi.xfer2([32, 11, 110, 22, 220]))
spi.close()
# /dev/spidev0.1
spi = SPI(1,1)
print(spi.xfer2([32, 11, 110, 22, 220]))
spi.close()
# /dev/spidev1.0
spi = SPI(2,0)
print(spi.xfer2([32, 11, 110, 22, 220]))
spi.close()
# /dev/spidev1.1
spi = SPI(2,1)
print(spi.xfer2([32, 11, 110, 22, 220]))
spi.close()
To use the enhanced Quadrature Encoder Pulse (eQEP) module, please refer to the Encoder
module's documentation.
Install py.test to run the tests. You'll also need the python compiler package for pytest:
sudo pip install pytest
Execute the following in the root of the project:
sudo pytest
NOTE: sudo
should not be required when running Debian 9.2 "Stretch" iot (2017-10-29) with Linux kernel 4.14.x as udev configures group ownership and permission for GPIO and PWM
The BeagleBone IO Python library was originally forked from the excellent MIT Licensed RPi.GPIO library written by Ben Croston.
Written by Justin Cooper, Adafruit Industries. BeagleBone IO Python library is released under the MIT License.