GPIO and Python?
-
Hi everyone. I just got my Onion Omega a couple of days ago. I'm a hardware person, but I've been away from software for a while. I'm learning Python, but I'd like to be able to control the GPIO pins directly from my Python code. Is that possible now? If not, is it coming soon?
-
Im not the offical word, But In my logic The onion omega runs linux, What else runs linux a rasberry pi, a rasberry pi also has gpio's and a Python library.
So based off of that logic I would have to guess that that python library would work. I could be 100% wrong and that library could be pi specific.
The only way to know is to try. Give it a shot and let us know. https://pypi.python.org/pypi/RPi.GPIO
-
@chris-mccaslin Thanks for the suggestion. I wasn't able to install that library, but that may be because I'm not familiar enough with Linux to understand what it needs. I did figure out how to access the ports through the filesystem (/sys/class/gpio). If nothing else gets posted before I get my code packaged nicely, I'll post it for others.
-
I've posted some simple code at https://github.com/BravoPapa/OmegaGPIO on GitHub.
-
Is it possible to use Interrups (Falling;Rising;Change) like I know it from Arduino?
I would like to read a rotery-encoder with my onion.ioThanks in advance.
-
@Uwe-Stahl209 While I know little about Python, I have written some C++ code that provides a library and access program for GPIO control in general - this includes code for catching and acting on interrupts. In case it is of any use for you, while I have posted information on it in this community, the information can best be found at https://github.com/KitBishop/new-gpio - see the documentation in the PDF file there - new-gpio.pdf
-
Yes, this I know, but a Python library would be nice as well
A general question: On AVR devices you have "real" interrupts in the sense that special pins provide this functionality.
Is is possible on Omega as well? Or is you code just looking for pin-change with the ordinary read functionality of the pin status?Yours
Uwe
-
@Uwe-Stahl209 I'm too new to Python and the Omega to add interrupts to my code. I'm not sure that Python can handle interrupts directly, but I could be wrong.
-
@Uwe-Stahl209 The code I referenced above does use "real" interrupts via the use of the Omega library gpio-irq and usage of the /sys/kernel/debug/gpio-irq system file system.
As I said I don't know much about Python and what facilities it provides in connection with interrupts. My guess is that some sort of wrapper code would be needed to provide such functionality (as I am doing and have largely working for Java).
Also, while I don't know what you want to do with the interrupts in Python - i.e. to be able to respond to interrupts within Python code or to just run some Python code when a pin change occurs I would draw you attention to the capability of the new-gpio program to run ANY command in response to an interrupt on a pin. Just use a command like:
- new-gpio irq <pin-number> <irq-type> "<command" <optional-debounce>
Where:- <pin-number> is the relevant pin
- <irq-type> is one of rising or falling or both - depending upon what pin level change you want to trigger the interrupt
- <command> is the command to be executed when the interrupt occurs. So long as you have not stopped interrupt handling on the pin by using the irqstop command to new-gpio for the pin this command will be executed each and every time the interrupt occurs (i.e. the pin undergoes the relevant change)
- <optional-debounce> is a delay time in milliseconds to allow for debounce handling on noisy switches
More information can be found in the documentation in new-gpio.pdf file I supplied.
- new-gpio irq <pin-number> <irq-type> "<command" <optional-debounce>
-
Hi!
I want to read a Rotary-Encoder and do some other stuff like sending data via serial output.On Arduino this is normally made with an interrupt pin.
So I don't get it: Can I use your library in Python? Or could I use your program to run a small Python script that somehow sends the rotary-value to my main Pythons script where all the rest is done?Thanks,
Uwe
-
@Uwe-Stahl209 A few more comments that may assist you:
-
On the Omega, all GPIO pins are capable of generating interrupts, unlike on the Arduino where there is a limited number of pins that can generate interrupts
-
Interrupt handling is done on the hardware level and needs C/C++ to handle it. On the Arduino, all code is written in C/C++ and functions are provided that enable you to catch and react to the interrupts. My libnew-gpio code provides similar C/C++ functionality for interrupt handling.
-
To handle interrupts in any other language (e.g. Python) requires the ability for that language to call the relevant C/C++ (e.g. via wrapper functions) to gain that functionality. I know how to do this for Java (and have done so) but I do not know how to do this for Python - perhaps someone else does.
-
While as I have said, I don't know much about Python, if, as your message suggests, one Python script can send a message to another Python script, then your suggestion may work. Lets say you have two Python scripts:
- python-a that reads you rotary encoder values and sends a message to python-b indicating that the encoder value has changed
- python-b that can handle messages from python-a
Then something like the following might work:
- new-gpio irq <pin-number> <irq-type> "command to run python-a" <debounce-if-required>
run python-b
-
-
@Brian-Piersel Thanks for the simple-to-use code! I've written a simple Python script that imports your omega_gpio script and controls three of four relays on a relay module to light various combinations of RGB LEDs on a light strip (the script is fairly well documented, so further description is probably not necessary here):