denko-piboard 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +154 -132
- data/Rakefile +0 -5
- data/board_maps/README.md +59 -0
- data/board_maps/orange_pi_zero_2w.yml +85 -0
- data/board_maps/radxa_zero3.yml +88 -0
- data/board_maps/raspberry_pi.yml +95 -0
- data/denko_piboard.gemspec +6 -7
- data/examples/digital_io/bench_out.rb +22 -0
- data/examples/digital_io/rotary_encoder.rb +31 -0
- data/examples/display/ssd1306.rb +43 -0
- data/examples/i2c/bitbang_aht10.rb +18 -0
- data/examples/i2c/bitbang_search.rb +24 -0
- data/examples/i2c/bitbang_ssd1306_bench.rb +29 -0
- data/examples/i2c/search.rb +24 -0
- data/examples/led/blink.rb +10 -0
- data/examples/led/fade.rb +22 -0
- data/examples/led/ws2812_bounce.rb +36 -0
- data/examples/motor/servo.rb +16 -0
- data/examples/pi_system_monitor.rb +10 -8
- data/examples/pulse_io/buzzer.rb +34 -0
- data/examples/pulse_io/infrared.rb +25 -0
- data/examples/sensor/aht10.rb +17 -0
- data/examples/sensor/dht.rb +24 -0
- data/examples/sensor/ds18b20.rb +59 -0
- data/examples/sensor/hcsr04.rb +16 -0
- data/examples/sensor/neat_tph_readings.rb +32 -0
- data/examples/spi/bb_loopback.rb +31 -0
- data/examples/spi/loopback.rb +37 -0
- data/examples/spi/output_register.rb +38 -0
- data/lib/denko/piboard.rb +11 -2
- data/lib/denko/piboard_base.rb +18 -64
- data/lib/denko/piboard_core.rb +148 -130
- data/lib/denko/piboard_core_optimize_lookup.rb +31 -0
- data/lib/denko/piboard_hardware_pwm.rb +27 -0
- data/lib/denko/piboard_i2c.rb +59 -82
- data/lib/denko/piboard_i2c_bb.rb +48 -0
- data/lib/denko/piboard_infrared.rb +7 -44
- data/lib/denko/piboard_led_array.rb +9 -0
- data/lib/denko/piboard_map.rb +121 -38
- data/lib/denko/piboard_one_wire.rb +42 -0
- data/lib/denko/piboard_pulse.rb +11 -68
- data/lib/denko/piboard_servo.rb +8 -7
- data/lib/denko/piboard_spi.rb +44 -74
- data/lib/denko/piboard_spi_bb.rb +41 -0
- data/lib/denko/piboard_tone.rb +15 -26
- data/lib/denko/piboard_version.rb +1 -1
- data/scripts/99-denko.rules +9 -0
- data/scripts/set_permissions.rb +131 -0
- metadata +45 -17
- data/ext/gpiod/extconf.rb +0 -9
- data/ext/gpiod/gpiod.c +0 -179
- data/lib/gpiod.rb +0 -6
data/lib/denko/piboard_spi.rb
CHANGED
@@ -1,100 +1,70 @@
|
|
1
1
|
module Denko
|
2
2
|
class PiBoard
|
3
|
+
def spi_flags(mode)
|
4
|
+
mode ||= 0
|
5
|
+
raise ArgumentError, "invalid SPI mode #{mode}" unless (0..3).include? mode
|
3
6
|
|
4
|
-
|
5
|
-
|
6
|
-
# Default to SPI mode 0 when none given.
|
7
|
-
config = mode || 0
|
8
|
-
raise ArgumentError, "invalid SPI mode #{config}" unless (0..3).include? config
|
9
|
-
|
10
|
-
# Default to :msbfirst when bit_order not given.
|
11
|
-
bit_order ||= :msbfirst
|
12
|
-
unless (bit_order == :msbfirst) || (bit_order == :lsbfirst)
|
13
|
-
raise ArgumentError, "invalid bit order #{bitorder}"
|
14
|
-
end
|
15
|
-
|
16
|
-
# Bits 14 and 15 control MSBFIRST (0) or LSBFIRST (1) for MOSI and MISO respectively.
|
17
|
-
# Use same order for both directions like Arduino does.
|
18
|
-
config |= (0b11 << 14) if bit_order == :lsbfirst
|
19
|
-
|
20
|
-
# Use SPI1 interface instead of SPI0.
|
21
|
-
# Setting bit 8 means we're using SPI1.
|
22
|
-
config |= (0b1 << 8)
|
23
|
-
|
24
|
-
# Bits 5-7 set leaves all CE pins free, and allows any GPIO to be used for chip enable.
|
25
|
-
# We toggle separately in #spi_transfer.
|
26
|
-
config |= (0b111 << 5)
|
7
|
+
# Flags is a 32-bit mask. Bits [1..0] are the SPI mode. Default to 0.
|
8
|
+
config = mode
|
27
9
|
|
28
10
|
return config
|
29
11
|
end
|
30
12
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# Make SPI config mask.
|
37
|
-
config = spi_config(mode, bit_order)
|
13
|
+
def spi_transfer(index, select, write:[], read:0, frequency: 1_000_000, mode: 0, bit_order: nil)
|
14
|
+
# Default frequency. Flags just has mode.
|
15
|
+
frequency ||= 1_000_000
|
16
|
+
flags = spi_flags(mode)
|
17
|
+
handle = spi_open(index, frequency, flags)
|
38
18
|
|
39
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
digital_write(
|
19
|
+
# Handle select_pin unless it's same as CS0 for this interface.
|
20
|
+
digital_write(select, 0) if select && (select != map[:spis][index][:cs0])
|
21
|
+
bytes = LGPIO.spi_xfer(handle, write, read)
|
22
|
+
spi_close(handle)
|
23
|
+
digital_write(select, 1) if select && (select != map[:spis][index][:cs0])
|
44
24
|
|
45
|
-
|
46
|
-
write_bytes = write.pack("C*")
|
47
|
-
read_bytes = Pigpio::IF.spi_xfer(pi_handle, spi_handle, write_bytes)
|
25
|
+
spi_c_error("xfer", bytes, index) if bytes.class == Integer
|
48
26
|
|
49
|
-
#
|
50
|
-
|
51
|
-
|
52
|
-
# Chip enable high. select_pin == 255 means no chip enable (mostly for APA102 LEDs).
|
53
|
-
digital_write(select_pin, 1) unless select_pin == 255
|
54
|
-
|
55
|
-
# Handle spi_xfer errors.
|
56
|
-
raise StandardError, "spi_xfer error, code #{read_bytes}" if read_bytes.class == Integer
|
57
|
-
|
58
|
-
# Handle read bytes.
|
59
|
-
if read > 0
|
60
|
-
message = ""
|
61
|
-
|
62
|
-
# Format like a microcontrolelr would. Limit to number of bytes requested.
|
63
|
-
i = 0
|
64
|
-
while i < read
|
65
|
-
message = "#{message},#{read_bytes[i].ord}"
|
66
|
-
end
|
27
|
+
# Update component attached to select pin with read bytes.
|
28
|
+
self.update(select, bytes) if (read > 0 && select)
|
29
|
+
end
|
67
30
|
|
68
|
-
|
69
|
-
|
70
|
-
end
|
31
|
+
def spi_listen(*arg, **kwargs)
|
32
|
+
raise NotImplementedError, "PiBoard#spi_listen not implemented yet"
|
71
33
|
end
|
72
34
|
|
73
|
-
|
74
|
-
def spi_listen
|
35
|
+
def spi_stop(pin)
|
75
36
|
end
|
76
37
|
|
77
|
-
|
78
|
-
|
38
|
+
def spi_listeners
|
39
|
+
@spi_listeners ||= Array.new
|
79
40
|
end
|
80
41
|
|
81
42
|
private
|
82
43
|
|
83
|
-
|
84
|
-
|
85
|
-
def spi_open(frequency, config)
|
86
|
-
# Give SPI channel as 0 (SPI CE0), even though we are toggling chip enable separately.
|
87
|
-
@spi_handle = Pigpio::IF.spi_open(pi_handle, 0, frequency, config)
|
88
|
-
raise StandardError, "SPI error, code #{@spi_handle}" if @spi_handle < 0
|
44
|
+
def spi_mutex(index)
|
45
|
+
spi_mutexes[index] ||= Mutex.new
|
89
46
|
end
|
90
47
|
|
91
|
-
def
|
92
|
-
|
93
|
-
@spi_handle = nil
|
48
|
+
def spi_mutexes
|
49
|
+
@spi_mutexes ||= []
|
94
50
|
end
|
95
51
|
|
96
|
-
def
|
97
|
-
|
52
|
+
def spi_open(index, frequency, flags=0x00)
|
53
|
+
# Always use 0 (SPI CS0) for channel. We are toggling chip enable separately.
|
54
|
+
handle = LGPIO.spi_open(index, 0, frequency, flags)
|
55
|
+
spi_c_error("open", handle, index) if handle < 0
|
56
|
+
handle
|
57
|
+
end
|
58
|
+
|
59
|
+
def spi_close(handle)
|
60
|
+
result = LGPIO.spi_close(handle)
|
61
|
+
if result < 0
|
62
|
+
raise StandardError, "lgpio C SPI close error: #{result} for handle #{handle}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def spi_c_error(name, error, index)
|
67
|
+
raise StandardError, "lgpio C SPI #{name} error: #{error} for /dev/spidev#{index}"
|
98
68
|
end
|
99
69
|
end
|
100
70
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Denko
|
2
|
+
class PiBoard
|
3
|
+
attr_reader :spi_bbs
|
4
|
+
|
5
|
+
def spi_bbs
|
6
|
+
@spi_bbs ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def spi_bb_interface(clock, input, output)
|
10
|
+
# Convert the pins into a config array to check.
|
11
|
+
ch, cl = gpio_tuple(clock)
|
12
|
+
ih, il = input ? gpio_tuple(input) : [nil, nil]
|
13
|
+
oh, ol = output ? gpio_tuple(output) : [nil, nil]
|
14
|
+
config = [ch, cl, ih, il, oh, ol]
|
15
|
+
|
16
|
+
# Check if any already exists with that array and return it.
|
17
|
+
spi_bbs.each { |bb| return bb if (config == bb.config) }
|
18
|
+
|
19
|
+
# If not, create one.
|
20
|
+
hash = { clock: { handle: ch, line: cl },
|
21
|
+
input: { handle: ih, line: il },
|
22
|
+
output: { handle: oh, line: ol } }
|
23
|
+
|
24
|
+
spi_bb = LGPIO::SPIBitBang.new(hash)
|
25
|
+
spi_bbs << spi_bb
|
26
|
+
spi_bb
|
27
|
+
end
|
28
|
+
|
29
|
+
def spi_bb_transfer(select, clock:, input: nil, output: nil, write: [], read: 0, frequency: nil, mode: nil, bit_order: nil)
|
30
|
+
interface = spi_bb_interface(clock, input, output)
|
31
|
+
select_hash = select ? { handle: gpio_tuple(select)[0], line: gpio_tuple(select)[0] } : nil
|
32
|
+
|
33
|
+
bytes = interface.transfer(write: write, read: read, select: select_hash, order: bit_order, mode: mode)
|
34
|
+
self.update(select, bytes) if (read > 0 && select)
|
35
|
+
end
|
36
|
+
|
37
|
+
def spi_bb_listen(*arg, **kwargs)
|
38
|
+
raise NotImplementedError, "PiBoard#spi_bb_listen not implemented yet"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/denko/piboard_tone.rb
CHANGED
@@ -2,38 +2,27 @@ module Denko
|
|
2
2
|
class PiBoard
|
3
3
|
# CMD = 17
|
4
4
|
def tone(pin, frequency, duration=nil)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# pigpio doubles wave times on 64-bit systems for some reason. Halve it to compensate.
|
10
|
-
half_wave_time = (250000.0 / frequency).round
|
5
|
+
if @hardware_pwms[pin]
|
6
|
+
@hardware_pwms[pin].frequency = frequency
|
7
|
+
@hardware_pwms[pin].duty_percent = 33
|
8
|
+
sleep duration if duration
|
11
9
|
else
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# Standard wave setup.
|
17
|
-
new_wave
|
18
|
-
wave.tx_stop
|
19
|
-
wave.clear
|
20
|
-
wave.add_new
|
21
|
-
|
22
|
-
# Build wave with a single cycle that will repeat.
|
23
|
-
wave.add_generic [
|
24
|
-
wave.pulse(pin_mask, 0x00, half_wave_time),
|
25
|
-
wave.pulse(0x00, pin_mask, half_wave_time)
|
26
|
-
]
|
27
|
-
wave_id = wave.create
|
10
|
+
raise ArgumentError, "maximum software PWM frequency is 10 kHz" if frequency > 10_000
|
11
|
+
cycles = 0
|
12
|
+
cycles = (frequency * duration).round if duration
|
28
13
|
|
29
|
-
|
30
|
-
|
31
|
-
|
14
|
+
sleep 0.05 while (LGPIO.tx_room(@gpio_handle, pin, LGPIO::TX_PWM) == 0)
|
15
|
+
LGPIO.tx_pwm(@gpio_handle, pin, frequency, 33, 0, cycles)
|
16
|
+
end
|
32
17
|
end
|
33
18
|
|
34
19
|
# CMD = 18
|
35
20
|
def no_tone(pin)
|
36
|
-
|
21
|
+
digital_write(pin, HIGH)
|
22
|
+
end
|
23
|
+
|
24
|
+
def tone_busy(pin)
|
25
|
+
LGPIO.tx_busy(@gpio_handle, pin, LGPIO::TX_PWM)
|
37
26
|
end
|
38
27
|
end
|
39
28
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
#
|
2
|
+
# A system ruby must be installed at /usr/bin/ruby
|
3
|
+
# Change path/to/set_permissions.rb to the full path where you saved the permissions script
|
4
|
+
# Ensure the USERNAME constant, in that copy of the script, is set to your Linux username as a string literal.
|
5
|
+
#
|
6
|
+
SUBSYSTEM=="gpio*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb gpio"
|
7
|
+
SUBSYSTEM=="i2c*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb i2c"
|
8
|
+
SUBSYSTEM=="spidev*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb spi"
|
9
|
+
SUBSYSTEM=="pwm*", ACTION=="add", PROGRAM="/usr/bin/ruby /path/to/set_permissions.rb pwm"
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
# `whoami` returns the name of the user running this script.
|
4
|
+
#
|
5
|
+
# If you automate this to run on startup (as root), you must put
|
6
|
+
# your literal Linux username here instead. If not, it will attempt
|
7
|
+
# to load a map from root's home, and root will get permissions, not you.
|
8
|
+
#
|
9
|
+
USERNAME = `whoami`.strip
|
10
|
+
|
11
|
+
GPIO_GROUP_NAME = "gpio"
|
12
|
+
I2C_GROUP_NAME = "i2c"
|
13
|
+
SPI_GROUP_NAME = "spi"
|
14
|
+
PWM_GROUP_NAME = "pwm"
|
15
|
+
|
16
|
+
MAP_FILENAME = ".denko_piboard_map.yml"
|
17
|
+
$added_to_group = false
|
18
|
+
|
19
|
+
# Create groups and add the user to them as needed.
|
20
|
+
def group_setup(group_name)
|
21
|
+
group_line = `egrep -i "^#{group_name}" /etc/group`
|
22
|
+
|
23
|
+
if group_line.empty?
|
24
|
+
`sudo groupadd #{group_name}`
|
25
|
+
end
|
26
|
+
|
27
|
+
unless group_line.match(/#{USERNAME}/)
|
28
|
+
`sudo usermod -aG #{group_name} #{USERNAME}`
|
29
|
+
puts "Added user #{USERNAME} to group #{group_name}. "
|
30
|
+
$added_to_group = true
|
31
|
+
else
|
32
|
+
puts "User #{USERNAME} already in group #{group_name}. "
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Change gpiochip ownership and permissions.
|
37
|
+
def setup_gpio
|
38
|
+
gpiochips = $map["pins"].each_value.map { |pin_def| pin_def["chip"] }.uniq
|
39
|
+
group_setup(GPIO_GROUP_NAME) unless gpiochips.empty?
|
40
|
+
gpiochips.each do |chip_index|
|
41
|
+
`sudo chgrp #{GPIO_GROUP_NAME} /dev/gpiochip#{chip_index}*`
|
42
|
+
`sudo chmod g+rw /dev/gpiochip#{chip_index}*`
|
43
|
+
puts "Set permissions for /dev/gpiochip#{chip_index}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Change I2C ownership and permissions
|
48
|
+
def setup_i2c
|
49
|
+
i2cs = $map["i2cs"].keys
|
50
|
+
group_setup(I2C_GROUP_NAME) unless i2cs.empty?
|
51
|
+
i2cs.each do |i2c_index|
|
52
|
+
dev = "/dev/i2c-#{i2c_index}"
|
53
|
+
`sudo chgrp #{I2C_GROUP_NAME} #{dev}`
|
54
|
+
`sudo chmod g+rw #{dev}`
|
55
|
+
puts "Set permissions for #{dev}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Change SPI ownership and permissions
|
60
|
+
def setup_spi
|
61
|
+
spis = $map["spis"].keys
|
62
|
+
group_setup(SPI_GROUP_NAME) unless spis.empty?
|
63
|
+
spis.each do |spi_index|
|
64
|
+
dev = "/dev/spidev#{spi_index}"
|
65
|
+
`sudo chgrp #{SPI_GROUP_NAME} #{dev}*`
|
66
|
+
`sudo chmod g+rw #{dev}*`
|
67
|
+
puts "Set permissions for #{dev}.*"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def setup_pwm
|
72
|
+
# Change PWM ownership and permissions
|
73
|
+
pwms = $map["pwms"]
|
74
|
+
unless pwms.empty?
|
75
|
+
group_setup(PWM_GROUP_NAME)
|
76
|
+
print "Exported and set permissions for: /sys/class/pwm/{"
|
77
|
+
end
|
78
|
+
|
79
|
+
i = 0
|
80
|
+
pwms.each_value do |hash|
|
81
|
+
i += 1
|
82
|
+
chip = hash["pwmchip"]
|
83
|
+
chan = hash["channel"]
|
84
|
+
chip_dir = "/sys/class/pwm/pwmchip#{chip}"
|
85
|
+
channel_dir = "/sys/class/pwm/pwmchip#{chip}/pwm#{chan}"
|
86
|
+
|
87
|
+
# Chip dir permissions
|
88
|
+
`sudo chgrp -RH #{PWM_GROUP_NAME} #{chip_dir}`
|
89
|
+
`sudo chmod -R g+rw #{chip_dir}`
|
90
|
+
|
91
|
+
# Export
|
92
|
+
`sudo echo #{chan} > #{chip_dir}/export` unless Dir.exist?(channel_dir)
|
93
|
+
|
94
|
+
# Channel dir permissions
|
95
|
+
`sudo chgrp -RH #{PWM_GROUP_NAME} #{channel_dir}`
|
96
|
+
`sudo chmod -R g+rw #{channel_dir}`
|
97
|
+
|
98
|
+
print channel_dir.gsub("/sys/class/pwm/", "")
|
99
|
+
print ", " unless i == pwms.length
|
100
|
+
end
|
101
|
+
puts "}"
|
102
|
+
end
|
103
|
+
|
104
|
+
# Load map
|
105
|
+
home = Dir.home(USERNAME)
|
106
|
+
yaml_path = home +"/#{MAP_FILENAME}"
|
107
|
+
$map = YAML.load_file(yaml_path)
|
108
|
+
puts
|
109
|
+
|
110
|
+
case ARGV[0]
|
111
|
+
when "gpio"
|
112
|
+
setup_gpio
|
113
|
+
when "i2c"
|
114
|
+
setup_i2c
|
115
|
+
when "spi"
|
116
|
+
setup_spi
|
117
|
+
when "pwm"
|
118
|
+
setup_pwm
|
119
|
+
else
|
120
|
+
setup_gpio
|
121
|
+
setup_i2c
|
122
|
+
setup_spi
|
123
|
+
setup_pwm
|
124
|
+
end
|
125
|
+
|
126
|
+
# Notify user
|
127
|
+
if $added_to_group
|
128
|
+
puts
|
129
|
+
puts "User #{USERNAME} has been added to new group(s). Log out, then log back in for this to take effect."
|
130
|
+
end
|
131
|
+
puts
|
metadata
CHANGED
@@ -1,70 +1,98 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: denko-piboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vickash
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: lgpio
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1
|
19
|
+
version: '0.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: denko
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.14'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
41
|
-
description:
|
42
|
-
and component classes to be used directly on a Raspberry Pi.
|
40
|
+
version: '0.14'
|
41
|
+
description: Use Linux single-board-computer GPIO, I2C, SPI and PWM in Ruby
|
43
42
|
email: mail@vickash.com
|
44
43
|
executables: []
|
45
|
-
extensions:
|
46
|
-
- ext/gpiod/extconf.rb
|
44
|
+
extensions: []
|
47
45
|
extra_rdoc_files: []
|
48
46
|
files:
|
49
47
|
- LICENSE
|
50
48
|
- README.md
|
51
49
|
- Rakefile
|
50
|
+
- board_maps/README.md
|
51
|
+
- board_maps/orange_pi_zero_2w.yml
|
52
|
+
- board_maps/radxa_zero3.yml
|
53
|
+
- board_maps/raspberry_pi.yml
|
52
54
|
- denko_piboard.gemspec
|
55
|
+
- examples/digital_io/bench_out.rb
|
56
|
+
- examples/digital_io/rotary_encoder.rb
|
57
|
+
- examples/display/ssd1306.rb
|
58
|
+
- examples/i2c/bitbang_aht10.rb
|
59
|
+
- examples/i2c/bitbang_search.rb
|
60
|
+
- examples/i2c/bitbang_ssd1306_bench.rb
|
61
|
+
- examples/i2c/search.rb
|
62
|
+
- examples/led/blink.rb
|
63
|
+
- examples/led/fade.rb
|
64
|
+
- examples/led/ws2812_bounce.rb
|
65
|
+
- examples/motor/servo.rb
|
53
66
|
- examples/pi_system_monitor.rb
|
54
|
-
-
|
55
|
-
-
|
67
|
+
- examples/pulse_io/buzzer.rb
|
68
|
+
- examples/pulse_io/infrared.rb
|
69
|
+
- examples/sensor/aht10.rb
|
70
|
+
- examples/sensor/dht.rb
|
71
|
+
- examples/sensor/ds18b20.rb
|
72
|
+
- examples/sensor/hcsr04.rb
|
73
|
+
- examples/sensor/neat_tph_readings.rb
|
74
|
+
- examples/spi/bb_loopback.rb
|
75
|
+
- examples/spi/loopback.rb
|
76
|
+
- examples/spi/output_register.rb
|
56
77
|
- lib/denko/piboard.rb
|
57
78
|
- lib/denko/piboard_base.rb
|
58
79
|
- lib/denko/piboard_core.rb
|
80
|
+
- lib/denko/piboard_core_optimize_lookup.rb
|
81
|
+
- lib/denko/piboard_hardware_pwm.rb
|
59
82
|
- lib/denko/piboard_i2c.rb
|
83
|
+
- lib/denko/piboard_i2c_bb.rb
|
60
84
|
- lib/denko/piboard_infrared.rb
|
85
|
+
- lib/denko/piboard_led_array.rb
|
61
86
|
- lib/denko/piboard_map.rb
|
87
|
+
- lib/denko/piboard_one_wire.rb
|
62
88
|
- lib/denko/piboard_pulse.rb
|
63
89
|
- lib/denko/piboard_servo.rb
|
64
90
|
- lib/denko/piboard_spi.rb
|
91
|
+
- lib/denko/piboard_spi_bb.rb
|
65
92
|
- lib/denko/piboard_tone.rb
|
66
93
|
- lib/denko/piboard_version.rb
|
67
|
-
-
|
94
|
+
- scripts/99-denko.rules
|
95
|
+
- scripts/set_permissions.rb
|
68
96
|
homepage: https://github.com/denko-rb/denko-piboard
|
69
97
|
licenses:
|
70
98
|
- MIT
|
@@ -78,15 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
106
|
requirements:
|
79
107
|
- - ">="
|
80
108
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
109
|
+
version: '3'
|
82
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
111
|
requirements:
|
84
112
|
- - ">="
|
85
113
|
- !ruby/object:Gem::Version
|
86
114
|
version: '0'
|
87
115
|
requirements: []
|
88
|
-
rubygems_version: 3.
|
116
|
+
rubygems_version: 3.5.20
|
89
117
|
signing_key:
|
90
118
|
specification_version: 4
|
91
|
-
summary:
|
119
|
+
summary: Linux SBC GPIO in Ruby
|
92
120
|
test_files: []
|