dino-piboard 0.13.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7c818f293ae8e78640d008dea2a231c80bbff914ac04bb940ff7776eeb63cee5
4
+ data.tar.gz: b6af65be62e98f36c54f61530a06be17724c50b081b3d692b46ff07ec8c80bbf
5
+ SHA512:
6
+ metadata.gz: 44b41a354d3f7596c3a31026729bf692c0316f0b88f8984b7202227623aca58761475731741e58c9b81049e5bd48465e10545bc2fa285c72c5385a5783b03b53
7
+ data.tar.gz: b6bc39739b03253c8a5811cf9c44521a3afc119f73e8466f099cf06e8700dba2cd2b270827e012f8c20c794492d90d78c8c54ffa4836915ebe44344de0a9a38d
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 dino-rb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # dino-piboard 0.13.0
2
+
3
+ This is an add-on to the [`dino`](https://github.com/austinbv/dino) gem. It adds support for the GPIO interface on Raspberry Pi single board computers. Unlike the main `dino` gem, which connects a computer running Ruby to an external microcontroller, this requires only a Pi.
4
+
5
+ `Dino::PiBoard` gives access to the Pi's own GPIO, and is a drop-in replacement for `Dino::Board`, which would represent an external microcontroller.
6
+
7
+ **Note:** This is not for the Raspberry Pi Pico (W) / RPP2040. That microcontroller is covered by the main gem.
8
+
9
+ ## Installation
10
+ **Note:** This gem is very new. It WILL NOT work with the version of `dino` (0.11.3) currently available on rubygems.org. Before installing `dino-piboard`, make sure to install the latest dino version (future 0.13.0) from the master branch source.
11
+
12
+ Install dino from source:
13
+ ```shell
14
+ sudo gem uninstall dino
15
+ git clone https://github.com/austinbv/dino.git
16
+ cd dino
17
+ gem build
18
+ sudo gem install dino-0.13.0.gem
19
+ ```
20
+
21
+ Install the pigpo C library:
22
+ ```shell
23
+ sudo apt-get install pigpio
24
+ ```
25
+
26
+ Install this gem:
27
+ ```shell
28
+ sudo gem install dino-piboard
29
+ ```
30
+
31
+ ## Example
32
+ Create a script, `led_button.rb`:
33
+ ```ruby
34
+ require 'dino/piboard'
35
+
36
+ # Create a board instance for the Raspberry Pi.
37
+ board = Dino::PiBoard.new
38
+
39
+ # LED connected to GPIO4.
40
+ led = Dino::LED.new(board: board, pin: 4)
41
+
42
+ # Momentary button connected to GPIO17, using internal pullup.
43
+ button = Dino::DigitalIO::Button.new(board: board, pin: 17, pullup: true)
44
+
45
+ # Led on when button is down (0)
46
+ button.down do
47
+ puts "Button down"
48
+ led.on
49
+ end
50
+
51
+ # Led is off when button is up (1)
52
+ button.up do
53
+ puts "Button up"
54
+ led.off
55
+ end
56
+
57
+ # Sleep main thread. Ctrl+C to quit.
58
+ sleep
59
+ ```
60
+
61
+ Run the script as root (pigpio can only be used as root):
62
+ ```shell
63
+ sudo ruby led_button.rb
64
+ ```
65
+
66
+ See [`examples`](https://github.com/austinbv/dino/tree/master/examples) in the main gem for more. Remove any `Dino::Board::Connection` and `Dino::Board` objects that the script sets up, and do `board = Dino::PiBoard.new` instead. Not all features are implemented yet though, nor can be implemented. See [Feautres](#features) below.
67
+
68
+ ## How It Works
69
+
70
+ This gem uses the [`pigpio_ffi`](https://github.com/dino-rb/pigpio_ffi) gem, which in turn uses [`ffi`](https://github.com/ffi/ffi) to map the functions of the [`pigpio`](https://github.com/joan2937/pigpio) C library. `pigpio` provides low-level access to the Raspberry Pi's GPIO interface.
71
+
72
+ Building on that, `Dino::PiBoard` plugs in as a (mostly) seamless replacement for `Dino::Board`. This allows `dino` features and component classes to be used directly on a Raspberry Pi, without an external microcontroller.
73
+
74
+ ## Features
75
+
76
+ ### Already Implemented
77
+ - Internal Pull Down/Up
78
+ - Digital Out
79
+ - Digital In
80
+ - PWM Out
81
+
82
+ ### To Be Implemented
83
+ - Tone Out
84
+ - Servo
85
+ - I2C
86
+ - SPI
87
+ - OneWire
88
+ - Infrared Out
89
+
90
+ ### Won't Be Implemented
91
+ - UART. It would wrap a [`rubyserial`](https://github.com/hybridgroup/rubyserial) instance. Use that directly instead.
92
+
93
+ ### Might Be Different
94
+ - Variable Digital Listen Timing (pigpio doesn't have a real way to do this, but glitch filter might be even better?)
95
+
96
+ ### Incompatible
97
+ - Handshake (no need, since running on the same board)
98
+ - EEPROM (can't mess with that. Use the filesystem instead)
99
+ - Analog IO (No analog pins on Raspberry Pi. Use an ADC or DAC over I2C or SPI)
@@ -0,0 +1,18 @@
1
+ require_relative 'lib/dino/piboard_version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'dino-piboard'
5
+ s.version = Dino::PiBoard::VERSION
6
+ s.licenses = ['MIT']
7
+ s.summary = "Use a Raspberry Pi's built-in GPIO as a board with the dino gem"
8
+ s.description = "Dino::PiBoard plugs in as a (mostly) seamless replacement for Dino::Board. This allows dino features and component classes to be used directly on a Raspberry Pi, without an external microcontroller."
9
+
10
+ s.authors = ["vickash"]
11
+ s.email = 'vickashmahabir@gmail.com'
12
+ s.files = Dir['**/*'].reject { |f| f.match /.gem\z/}
13
+ s.homepage = 'https://github.com/dino-rb/dino-piboard'
14
+ s.metadata = { "source_code_uri" => "https://github.com/dino-rb/dino-piboard" }
15
+
16
+ s.add_dependency 'pigpio_ffi'
17
+ s.add_dependency 'dino'
18
+ end
@@ -0,0 +1,99 @@
1
+ require 'pigpio_ffi'
2
+ require 'dino'
3
+
4
+ module Dino
5
+ class PiBoard
6
+ attr_reader :components, :high, :low
7
+
8
+ def initialize
9
+ @components = []
10
+
11
+ # Sample every 10us, using PCM peripheral. Keeps CPU usage down.
12
+ PiGPIO.gpioCfgClock(10, 1, 0)
13
+ PiGPIO.gpioInitialise
14
+
15
+ @low = 0
16
+ @high = 1
17
+ end
18
+
19
+ def finish_write
20
+ PiGPIO.gpioTerminate
21
+ end
22
+
23
+ def update(pin, message, time)
24
+ update_component(pin, message)
25
+ end
26
+
27
+ def update_component(pin, message)
28
+ @components.each do |part|
29
+ part.update(message) if part.pin.to_i == pin
30
+ end
31
+ end
32
+
33
+ def add_component(component)
34
+ @components << component
35
+ end
36
+
37
+ def remove_component(component)
38
+ # component.stop if component.methods.include? :stop
39
+ @components.delete(component)
40
+ end
41
+
42
+ # CMD = 0
43
+ def set_pin_mode(pin, mode=:input)
44
+ # Output
45
+ if mode.to_s.match /output/
46
+ PiGPIO.gpioSetMode(pin, 1)
47
+
48
+ # Input
49
+ else
50
+ PiGPIO.gpioSetMode(pin, 0)
51
+ # Only respond if level has been stable for 90us.
52
+ PiGPIO.gpioGlitchFilter(pin, 90)
53
+
54
+ # Pull down/up/none
55
+ if mode.to_s.match /pulldown/
56
+ PiGPIO.gpioSetPullUpDown(pin, 1)
57
+ elsif mode.to_s.match /pullup/
58
+ PiGPIO.gpioSetPullUpDown(pin, 2)
59
+ else
60
+ PiGPIO.gpioSetPullUpDown(pin, 0)
61
+ end
62
+ end
63
+ end
64
+
65
+ # CMD = 1
66
+ def digital_write(pin, value)
67
+ PiGPIO.gpioWrite(pin, value)
68
+ end
69
+
70
+ # CMD = 2
71
+ def digital_read(pin)
72
+ update(pin, PiGPIO.gpioRead(pin))
73
+ end
74
+
75
+ # CMD = 3
76
+ def pwm_write(pin, value)
77
+ PiGPIO.gpioPWM(pin, value)
78
+ end
79
+
80
+ # CMD = 6
81
+ def set_listener(set_pin, state=:off, options={})
82
+ if state == :on
83
+ PiGPIO.gpioSetAlertFunc(set_pin) do |pin, message, time|
84
+ update(pin, message, time)
85
+ end
86
+ else
87
+ PiGPIO._gpioSetAlertFunc(pin, nil)
88
+ end
89
+ end
90
+
91
+ def digital_listen(pin, divider=4)
92
+ set_listener(pin, :on, {})
93
+ end
94
+
95
+ def stop_listener(pin)
96
+ set_listener(pin, :off)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,5 @@
1
+ module Dino
2
+ class PiBoard
3
+ VERSION = '0.13.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dino-piboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ platform: ruby
6
+ authors:
7
+ - vickash
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pigpio_ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dino
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Dino::PiBoard plugs in as a (mostly) seamless replacement for Dino::Board.
42
+ This allows dino features and component classes to be used directly on a Raspberry
43
+ Pi, without an external microcontroller.
44
+ email: vickashmahabir@gmail.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - LICENSE
50
+ - README.md
51
+ - dino_piboard.gemspec
52
+ - lib/dino/piboard.rb
53
+ - lib/dino/piboard_version.rb
54
+ homepage: https://github.com/dino-rb/dino-piboard
55
+ licenses:
56
+ - MIT
57
+ metadata:
58
+ source_code_uri: https://github.com/dino-rb/dino-piboard
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubygems_version: 3.4.8
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Use a Raspberry Pi's built-in GPIO as a board with the dino gem
78
+ test_files: []