OPi.GPIO Documentation

Similar documents
git-pr Release dev2+ng5b0396a

BME280 Documentation. Release Richard Hull

Raspberry Pi Activity 2: My Binary Addiction...Reloaded

inflection Documentation

Custard Pi 5 - Breakout board with protection for 8 digital I/O and stacking connector for the Raspberry Pi GPIO

Gooligum Electronics 2015

dublincore Documentation

SF Innovations Ltd. User Instructions (5th January 2016) Contents. Introduction

agate-sql Documentation

Tailor Documentation. Release 0.1. Derek Stegelman, Garrett Pennington, and Jon Faustman

mp3fm Documentation Release Akshit Agarwal

Basic Electronics and Raspberry Pi IO Programming

invenio-formatter Documentation

Sensor-fusion Demo Documentation

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

sensor-documentation Documentation

Testworks User Guide. Release 1.0. Dylan Hackers

PyCon APAC 2014 Documentation

X Generic Event Extension. Peter Hutterer

retask Documentation Release 1.0 Kushal Das

TWO PLAYER REACTION GAME

Dellve CuDNN Documentation

twstock Documentation

Piexif Documentation. Release 1.0.X. hmatoba

Statsd Metrics Documentation

Piexif Documentation. Release 1.0.X. hmatoba

deepatari Documentation

Elegans Documentation

XStatic Documentation

utidylib Documentation Release 0.4

9 Output Devices: Buzzers

pydocstyle Documentation

disspcap Documentation

MCAFEE THREAT INTELLIGENCE EXCHANGE RESILIENT THREAT SERVICE INTEGRATION GUIDE V1.0

Feed Cache for Umbraco Version 2.0

jumpssh Documentation

SEAS Computing Facility Raspberry Pi Workshop 2: I/O Camera & Motion Sensor. October 21, 2017

RPi General Purpose IO (GPIO) Pins

BCS Raspberry Pi Launch Events Getting started with Raspberry Pi

Spotter Documentation Version 0.5, Released 4/12/2010

delegator Documentation

josync Documentation Release 1.0 Joel Goop and Jonas Einarsson

A Slice of Raspberry Pi

F28HS Hardware-Software Interface: Systems Programming

Grove - Digital Light Sensor

clipbit Release 0.1 David Fraser

SF Innovations Ltd. Custard Pi 3-8 Analogue input board for the Raspberry Pi GPIO. User Instructions (13th December 2016) Contents.

Asthma Eliminator MicroMedic Competition Entry

puppet-diamond Documentation

Imagination Documentation

Open Source Used In Cisco Configuration Professional for Catalyst 1.0

Flask-Sitemap Documentation

Django Mail Queue Documentation

Black Mamba Documentation

aiounittest Documentation

Daedalus Documentation

KEMP Driver for Red Hat OpenStack. KEMP LBaaS Red Hat OpenStack Driver. Installation Guide

abstar Documentation Release Bryan Briney

XEP-0099: IQ Query Action Protocol

mqtt-broker Documentation

TWO-FACTOR AUTHENTICATION Version 1.1.0

Transparency & Consent Framework

Grove - RTC User Manual

CuteFlow-V4 Documentation

Instagram PHP Documentation

ClassPad Manager Subscription

Imagination Documentation

Tenable Hardware Appliance Upgrade Guide

LANDISVIEW Beta v1.0-user Guide

DAQCplate Users Guide

VMware vcenter Log Insight Manager. Deployment Guide

MEAS HTU21D PERIPHERAL MODULE

Komodo CAN Interface. Komodo TM CAN Interface GUI. Komodo GUI User s Manual v1.50 Octorber 26, 2012

SopaJS JavaScript library package

Lua Script Logic. Timestamp (ms) Network interface #1. Volume

DATAGATE MK2. Box Contents. Additional Features (licenses) Features. Safety

MEAS TEMPERATURE SYSTEM SENSOR (TSYS01) XPLAINED PRO BOARD

webbot Documentation Release Natesh M Bhat

Packet Trace Guide. Packet Trace Guide. Technical Note

Splunk. Splunk. Deployment Guide

User Guide. Calibrated Software, Inc.

Bluetooth Low Energy in C++ for nrfx Microcontrollers

MatPlotTheme Documentation

Distinction Import Module User Guide. DISTINCTION.CO.UK

SDN Adaptive Load Balancing. Feature Description

RaRa Academy: Raspberry Pi. Karl Heinz Kremer - K5KHK

LCD Display 16x2 with Buttons

RSA Two Factor Authentication

Simba Cassandra ODBC Driver with SQL Connector

NTLM NTLM. Feature Description

ProFont began life as a better version of Monaco 9 which is especially good for programmers. It was created circa 1987 by Andrew Welch.

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Firebase PHP SDK. Release

Guest Book. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Quality of Service (QOS) With Tintri VM-Aware Storage

ExaFMM. Fast multipole method software aiming for exascale systems. User's Manual. Rio Yokota, L. A. Barba. November Revision 1

Inptools Manual. Steffen Macke

University of Hull Department of Computer Science

HCP Chargeback Collector Documentation

Migration Tool. Migration Tool (Beta) Technical Note

Transcription:

OPi.GPIO Documentation Release 0.3.1 Richard Hull and contributors Jan 01, 2018

Contents 1 Installation 3 2 API Documentation 5 2.1 Importing the module.......................................... 5 2.2 Pin Numbering.............................................. 5 2.3 Inputs................................................... 6 2.3.1 Pull up / Pull down resistors.................................. 6 2.3.2 Testing inputs (polling)..................................... 7 2.3.3 Interrupts and Edge detection.................................. 7 2.3.4 Threaded Callbacks....................................... 7 2.3.5 Switch debounce........................................ 8 2.3.6 Remove event detection..................................... 8 2.4 Outputs.................................................. 8 2.5 Methods................................................. 9 3 Contributing 13 3.1 GitHub.................................................. 13 3.2 Contributors............................................... 13 4 ChangeLog 15 5 The MIT License (MIT) 17 Python Module Index 19 i

ii

OPi-GPIO is a drop-in replacement library for RPi.GPIO for the Orange Pi Zero. Only the basic GPIO functions are replicated, using sysfs: this allows the GPIO pins to be accessed from user space. Contents 1

2 Contents

CHAPTER 1 Installation Note: The library has been tested against Python 2.7 and 3.4+. For Python3 installation, substitute pip3 for pip in the instructions below. Install the latest version of the library directly from PyPI: $ sudo pip install --upgrade OPi.GPIO 3

4 Chapter 1. Installation

CHAPTER 2 API Documentation 2.1 Importing the module To import the OPi.GPIO module: import OPi.GPIO as GPIO By doing it this way, you can refer to it as just GPIO through the rest of your script. 2.2 Pin Numbering Pins on Orange Pi Zero are named PxNN where x = A..Z and NN = 00..99. This implementation aims to paper over the cracks to make GPIO usage consistent across Raspberry Pi and Orange Pi. Quoting from the RPi.GPIO documentation: There are two ways of numbering the IO pins on a Raspberry Pi within RPi.GPIO. The first is using the BOARD numbering system. This refers to the pin numbers on the P1 header of the Raspberry Pi board. The advantage of using this numbering system is that your hardware will always work, regardless of the board revision of the RPi. You will not need to rewire your connector or change your code. The second numbering system is the BCM numbers. This is a lower level way of working - it refers to the channel numbers on the Broadcom SOC. You have to always work with a diagram of which channel number goes to which pin on the RPi board. Your script could break between revisions of Raspberry Pi boards. This library monkeys the original implementation (and the documentation, as you are about to find out), by adding a third numbering system that is SUNXI naming. 5

2.3 Inputs There are several ways of getting GPIO input into your program. The first and simplest way is to check the input value at a point in time. This is known as polling and can potentially miss an input if your program reads the value at the wrong time. Polling is performed in loops and can potentially be processor intensive. The other way of responding to a GPIO input is using interrupts (edge detection). An edge is the name of a transition from HIGH to LOW (falling edge) or LOW to HIGH (rising edge). 2.3.1 Pull up / Pull down resistors Note: Support for pull up / pull down resistors is not yet complete: if specified, a warning will be displayed instead, so that it is at least compatible with existing code, but without implemening the actual functionality. If you do not have the input pin connected to anything, it will float. In other words, the value that is read in is undefined because it is not connected to anything until you press a button or switch. It will probably change value a lot as a result of receiving mains interference. To get round this, we use a pull up or a pull down resistor. In this way, the default value of the input can be set. It is possible to have pull up/down resistors in hardware and using software. In hardware, a 10K resistor between the input channel and 3.3V (pull-up) or 0V (pull-down) is commonly used. The OPi.GPIO module allows you to configure the SOC to do this in software: GPIO.setup(channel, GPIO.IN, pull_up_down=gpio.pud_up) # or GPIO.setup(channel, GPIO.IN, pull_up_down=gpio.pud_down) (where channel is the channel number based on the numbering system you have specified - BOARD, BCM or SUNXI). 6 Chapter 2. API Documentation

2.3.2 Testing inputs (polling) You can take a snapshot of an input at a moment in time: if GPIO.input(channel): print('input was HIGH') else: print('input was LOW') To wait for a button press by polling in a loop: while GPIO.input(channel) == GPIO.LOW: time.sleep(0.01) # wait 10 ms to give CPU chance to do other things (this assumes that pressing the button changes the input from LOW to HIGH) 2.3.3 Interrupts and Edge detection An edge is the change in state of an electrical signal from LOW to HIGH (rising edge) or from HIGH to LOW (falling edge). Quite often, we are more concerned by a change in state of an input than it s value. This change in state is an event. To avoid missing a button press while your program is busy doing something else, there are two ways to get round this: the wait_for_edge() function the event_detected() function a threaded callback function that is run when an edge is detected 2.3.4 Threaded Callbacks OPi.GPIO manages a number of secondary threads for callback functions. This means that callback functions can be run at the same time as your main program, in immediate response to an edge. For example: def my_callback(channel): print('this is a edge event callback function!') print('edge detected on channel %s'%channel) print('this is run in a different thread to your main program') GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback) detection on a channel #...the rest of your program... # add rising edge If you wanted more than one callback function: def my_callback_one(channel): print('callback one') def my_callback_two(channel): print('callback two') GPIO.add_event_detect(channel, GPIO.RISING) 2.3. Inputs 7

GPIO.add_event_callback(channel, my_callback_one) GPIO.add_event_callback(channel, my_callback_two) Note that in this case, the callback functions are run sequentially, not concurrently. This is because there is only one thread used for callbacks, in which every callback is run, in the order in which they have been defined. 2.3.5 Switch debounce Note: Support for switch debounce is not yet complete: if specified, a warning will be displayed instead, so that it is at least compatible with existing code, but without implemening the actual functionality. You may notice that the callbacks are called more than once for each button press. This is as a result of what is known as switch bounce. There are two ways of dealing with switch bounce: add a 0.1µF capacitor across your switch. software debouncing a combination of both To debounce using software, add the bouncetime= parameter to a function where you specify a callback function. Bouncetime should be specified in milliseconds. For example: # add rising edge detection on a channel, ignoring further edges for 200ms for switch bounce handling GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200) or GPIO.add_event_callback(channel, my_callback, bouncetime=200) 2.3.6 Remove event detection If for some reason, your program no longer wishes to detect edge events, it is possible to stop them: GPIO.remove_event_detect(channel) 2.4 Outputs 1. First set up OPi.GPIO import OPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) 2. To set an output high: GPIO.output(12, GPIO.HIGH) # or GPIO.output(12, 1) # or GPIO.output(12, True) 8 Chapter 2. API Documentation

3. To set an output low: GPIO.output(12, GPIO.LOW) # or GPIO.output(12, 0) # or GPIO.output(12, False) 4. To output to several channels at the same time: chan_list = (11,12) GPIO.output(chan_list, GPIO.LOW) # all LOW GPIO.output(chan_list, (GPIO.HIGH,GPIO.LOW)) # first LOW, second HIGH 5. Clean up at the end of your program GPIO.cleanup() Note that you can read the current state of a channel set up as an output using the input() function. For example to toggle an output: GPIO.output(12, not GPIO.input(12)) 2.5 Methods OPi.GPIO.add_event_callback(channel, callback, bouncetime=none) Parameters channel the channel based on the numbering system you have specified (GPIO.BOARD, GPIO.BCM or GPIO.SUNXI). callback TODO bouncetime (optional) TODO OPi.GPIO.add_event_detect(channel, trigger, callback=none, bouncetime=none) This function is designed to be used in a loop with other things, but unlike polling it is not going to miss the change in state of an input while the CPU is busy working on other things. This could be useful when using something like Pygame or PyQt where there is a main loop listening and responding to GUI events in a timely basis. Parameters channel the channel based on the numbering system you have specified (GPIO.BOARD, GPIO.BCM or GPIO.SUNXI). trigger The event to detect, one of: GPIO.RISING, GPIO.FALLING or GPIO. BOTH. callback (optional) TODO bouncetime (optional) TODO OPi.GPIO.cleanup(channel=None) At the end any program, it is good practice to clean up any resources you might have used. This is no different with OPi.GPIO. By returning all channels you have used back to inputs with no pull up/down, you can avoid accidental damage to your Orange Pi by shorting out the pins. Note that this will only clean up GPIO channels that your script has used. Note that GPIO.cleanup() also clears the pin numbering system in use. 2.5. Methods 9

To clean up at the end of your script: GPIO.cleanup() It is possible that don t want to clean up every channel leaving some set up when your program exits. You can clean up individual channels, a list or a tuple of channels: GPIO.cleanup(channel) GPIO.cleanup( (channel1, channel2) ) GPIO.cleanup( [channel1, channel2] ) OPi.GPIO.event_detected(channel) This function is designed to be used in a loop with other things, but unlike polling it is not going to miss the change in state of an input while the CPU is busy working on other things. This could be useful when using something like Pygame or PyQt where there is a main loop listening and responding to GUI events in a timely basis. GPIO.add_event_detect(channel, GPIO.RISING) channel do_something() if GPIO.event_detected(channel): print('button pressed') # add rising edge detection on a Note that you can detect events for GPIO.RISING, GPIO.FALLING or GPIO.BOTH. Parameters channel the channel based on the numbering system you have specified (GPIO. BOARD, GPIO.BCM or GPIO.SUNXI). Returns True if an edge event was detected, else False. OPi.GPIO.getmode() To detect which pin numbering system has been set. Returns GPIO.BOARD, GPIO.BCM, GPIO.SUNXI or None if not set. OPi.GPIO.input(channel) Read the value of a GPIO pin. Parameters channel the channel based on the numbering system you have specified (GPIO. BOARD, GPIO.BCM or GPIO.SUNXI). Returns This will return either 0 / GPIO.LOW / False or 1 / GPIO.HIGH / True). OPi.GPIO.output(channel, state) Set the output state of a GPIO pin. Parameters channel the channel based on the numbering system you have specified (GPIO.BOARD, GPIO.BCM or GPIO.SUNXI). state can be 0 / GPIO.LOW / False or 1 / GPIO.HIGH / True. Output to several channels: You can output to many channels in the same call. For example: chan_list = [11,12] GPIO.output(chan_list, GPIO.LOW) GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)) # also works with tuples # sets all to GPIO.LOW # sets first HIGH and second LOW OPi.GPIO.remove_event_detect(channel) 10 Chapter 2. API Documentation

Parameters channel the channel based on the numbering system you have specified (GPIO. BOARD, GPIO.BCM or GPIO.SUNXI). OPi.GPIO.setmode(mode) You must call this method prior to using all other calls. Parameters mode the mode, one of GPIO.BOARD, GPIO.BCM, GPIO.SUNXI, or a dict or object representing a custom pin mapping. OPi.GPIO.setup(channel, direction, initial=none, pull_up_down=none) You need to set up every channel you are using as an input or an output. Parameters channel the channel based on the numbering system you have specified (GPIO.BOARD, GPIO.BCM or GPIO.SUNXI). direction whether to treat the GPIO pin as input or output (use only GPIO.IN or GPIO.OUT). initial (optional) When supplied and setting up an output pin, resets the pin to the value given (can be 0 / GPIO.LOW / False or 1 / GPIO.HIGH / True). pull_up_down (optional) When supplied and setting up an input pin, configures the pin to 3.3V (pull-up) or 0V (pull-down) depending on the value given (can be GPIO.PUD_OFF / GPIO.PUD_UP / GPIO.PUD_DOWN) To configure a channel as an input: GPIO.setup(channel, GPIO.IN) To set up a channel as an output: GPIO.setup(channel, GPIO.OUT) You can also specify an initial value for your output channel: GPIO.setup(channel, GPIO.OUT, initial=gpio.high) Setup more than one channel: You can set up more than one channel per call. For example: chan_list = [11,12] # add as many channels as you want! # you can tuples instead i.e.: # chan_list = (11,12) GPIO.setup(chan_list, GPIO.OUT) OPi.GPIO.setwarnings(enabled) OPi.GPIO.wait_for_edge(channel, trigger, timeout=-1) This function is designed to block execution of your program until an edge is detected. Parameters channel the channel based on the numbering system you have specified (GPIO.BOARD, GPIO.BCM or GPIO.SUNXI). trigger The event to detect, one of: GPIO.RISING, GPIO.FALLING or GPIO. BOTH. timeout (optional) TODO In other words, the polling example above that waits for a button press could be rewritten as: 2.5. Methods 11

GPIO.wait_for_edge(channel, GPIO.RISING) Note that you can detect edges of type GPIO.RISING, :py:attr GPIO.FALLING or GPIO.BOTH. The advantage of doing it this way is that it uses a negligible amount of CPU, so there is plenty left for other tasks. If you only want to wait for a certain length of time, you can use the timeout parameter: # wait for up to 5 seconds for a rising edge (timeout is in milliseconds) channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000) if channel is None: print('timeout occurred') else: print('edge detected on channel', channel) 12 Chapter 2. API Documentation

CHAPTER 3 Contributing Pull requests (code changes / documentation / typos / feature requests / setup) are gladly accepted. If you are intending to introduce some large-scale changes, please get in touch first to make sure we re on the same page: try to include a docstring for any new method or class, and keep method bodies small, readable and PEP8-compliant. Add tests and strive to keep the code coverage levels high. 3.1 GitHub The source code is available to clone at: https://github.com/rm-hull/opi.gpio 3.2 Contributors Simon Rowe (@srowe) Steven P. Goldsmith (@sgjava) 13

14 Chapter 3. Contributing

15

CHAPTER 4 ChangeLog Version Description Date 0.3.1 Added NanoPi DUO pin 2018/01/01 mappings 0.3.0 0.2.5 0.2.4 0.2.3 0.2.2 0.2.1 0.2.0 0.1.0 Added alternate pin mappings sysfs: set output() value to 0 or 1 Add compatibility for pull up/down and bouncetime params Make worker threads daemonic (can t exit otherwise) GPIO.setup() catches IOError and re-exports Minor bug fixes Additional tests Added edge detection and eventing Initial version 2017/12/31 2017/07/15 2017/05/27 2017/05/26 2017/03/28 2017/03/14 2017/03/14 2017/03/11 16 Chapter 4. ChangeLog

CHAPTER 5 The MIT License (MIT) Copyright (c) 2018 Richard Hull & Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software ), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PAR- TICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFT- WARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17

18 Chapter 5. The MIT License (MIT)

Python Module Index o OPi.GPIO, 5 19

20 Python Module Index

Index A add_event_callback() (in module OPi.GPIO), 9 add_event_detect() (in module OPi.GPIO), 9 C cleanup() (in module OPi.GPIO), 9 E event_detected() (in module OPi.GPIO), 10 G getmode() (in module OPi.GPIO), 10 I input() (in module OPi.GPIO), 10 O OPi.GPIO (module), 5 output() (in module OPi.GPIO), 10 R remove_event_detect() (in module OPi.GPIO), 10 S setmode() (in module OPi.GPIO), 11 setup() (in module OPi.GPIO), 11 setwarnings() (in module OPi.GPIO), 11 W wait_for_edge() (in module OPi.GPIO), 11 21