Yet Another GPIO gem for Raspberry Pi

But why ?

Because making a new wheel is always fun !

There is already plenty of GPIO libraries for Raspberry Pi :

But none of them support interruptions to trigger events. I mean proper interruption without pooling within an infinite loop (and sometimes a sleep). For example, rpi-gpio gem is very good but the wait_for_edge() method is not available (yet).

This implementation is based on the Sysfs interface and so do not support integrated pull-down an pull-up resistors. See official kernel documentation for more details.

NOTE: The pin number specified in the initializer uses BCM numbering.

Permissions

Please note that lib require read/write access to the GPIO Sysfs subdirectory /sys/class/gpio/. If your script is not running as root, add your user to the gpio group. On most Raspberry Pi compatible distributions, an UDEV event will automatically set proper permissions once the port is exported.

Using interruptions

The implementation of the interrupt hander is based on Sysfs and uses the select(2) syscall, according to the offical linux kernel documentation. You can find an example in C here : Attentes passives sur GPIO.

Another implementation using poll(2) in ruby : Evented GPIO on Raspberry PI with Ruby

Example

require 'ya_gpio'

led     = YaGPIO.new(23, YaGPIO::OUTPUT)
button1 = YaGPIO.new(22, YaGPIO::INPUT)
button2 = YaGPIO.new(25, YaGPIO::INPUT)

# Turn the led on when button 1 is pressed and 
# off when released
button1.set_interrupt(YaGPIO::EDGE_BOTH) do |high|
  if high
    led.high
  else
    led.low
  end
end

# Stop the wait() loop when button 2 is pressed
button2.set_interrupt(YaGPIO::EDGE_RISING) do |high|
  YaGPIO::resume
end

puts "ready"
YaGPIO::wait([button1, button2])
puts "wait() loop terminated"

If your application needs to listen to other file descriptors, you can override the wait() method to include those FDs in the select() call. See lib/ya_gpio.rb source file for more information.

Testing

This module is fully tested on Raspberry Pi and has testing with rspec. To run them :

bundle install
bundle exec rake spec

API documentation

The API documentation is available in the Yard format. To generate it under the doc directory, run :

bundle exec rake yard

License

Copyleft 2019 - Nicolas AGIUS - GNU GPLv3