BBB 0.1.2 → 0.1.3
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 +7 -0
- data/BBB.gemspec +1 -0
- data/lib/BBB.rb +2 -0
- data/lib/BBB/components/esc.rb +46 -0
- data/lib/BBB/pins/io/ain.rb +5 -7
- data/lib/BBB/pins/io/cape.rb +19 -0
- data/lib/BBB/pins/io/gpio.rb +3 -1
- data/lib/BBB/pins/io/i2c.rb +52 -0
- data/lib/BBB/pins/io/pin_mapper.rb +34 -5
- data/lib/BBB/pins/io/pwm.rb +13 -11
- data/lib/BBB/version.rb +1 -1
- data/spec/pins/io/i2c_spec.rb +11 -0
- metadata +33 -29
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d18e3e61eefcd87ec52cd8b251cd6799597573cd
|
4
|
+
data.tar.gz: 4c282e7e33f04bc98aad8f2d0f4c41ad46208add
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 87f7819d093f819abcb8bf98e4aab0561cb29716887b49fb3b507b18b00586689f9a158cd097e9f27402fcd8cd56208034a444dd130e307e1c176e95ab149098
|
7
|
+
data.tar.gz: 22c811e2ed74ce86a22e3ddbb4e609f2d998e88a846f0e9ee735787ce38ae77b2531564896744cc034465bac9d0e36ae88093a047682aaa18a834b6d2adf7650
|
data/BBB.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_dependency "json"
|
21
|
+
spec.add_dependency "i2c"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
23
|
spec.add_development_dependency "rake"
|
23
24
|
spec.add_development_dependency "rspec"
|
data/lib/BBB.rb
CHANGED
@@ -8,9 +8,11 @@ require "BBB/exceptions"
|
|
8
8
|
|
9
9
|
require "BBB/pins/io/pin_mapper"
|
10
10
|
require "BBB/pins/io/mapped"
|
11
|
+
require "BBB/pins/io/cape"
|
11
12
|
require "BBB/pins/io/ain"
|
12
13
|
require "BBB/pins/io/gpio"
|
13
14
|
require "BBB/pins/io/pwm"
|
15
|
+
require "BBB/pins/io/i2c"
|
14
16
|
|
15
17
|
require "BBB/pins/pinnable"
|
16
18
|
require "BBB/pins/digital_pin"
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module BBB
|
2
|
+
module Components
|
3
|
+
class ESC
|
4
|
+
include Pinnable
|
5
|
+
uses Pins::PWMPin, Pins::DigitalOutputPin
|
6
|
+
|
7
|
+
attr_accessor :min_duty, :max_duty, :period
|
8
|
+
attr_reader :duty
|
9
|
+
|
10
|
+
def initialize(period=10e6, min_duty=0.8e6, max_duty=2e6)
|
11
|
+
@period = period
|
12
|
+
@min_duty = min_duty
|
13
|
+
@max_duty = max_duty
|
14
|
+
end
|
15
|
+
|
16
|
+
def after_pin_initialization
|
17
|
+
power.off!
|
18
|
+
pwm.period = period
|
19
|
+
pwm.duty = min_duty
|
20
|
+
pwm.run = 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def speed(value)
|
24
|
+
self.duty = min_duty + value * duty_range
|
25
|
+
end
|
26
|
+
|
27
|
+
def duty=(value)
|
28
|
+
@duty = value
|
29
|
+
pwm.duty = @duty
|
30
|
+
end
|
31
|
+
|
32
|
+
def duty_range
|
33
|
+
max_duty - min_duty
|
34
|
+
end
|
35
|
+
|
36
|
+
def pwm
|
37
|
+
pins.first
|
38
|
+
end
|
39
|
+
|
40
|
+
def power
|
41
|
+
pins.last
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/BBB/pins/io/ain.rb
CHANGED
@@ -3,6 +3,7 @@ module BBB
|
|
3
3
|
module IO
|
4
4
|
class AIN
|
5
5
|
include Mapped
|
6
|
+
include Cape
|
6
7
|
|
7
8
|
attr_reader :io, :position
|
8
9
|
|
@@ -22,18 +23,15 @@ module BBB
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def export
|
25
|
-
|
26
|
-
dir = Dir.glob(cape_dir)
|
27
|
-
if dir.length == 0
|
28
|
-
raise BoardError, "unable to access the capemgr directory: #{cape_dir}"
|
29
|
-
end
|
30
|
-
`echo cape-bone-iio > #{dir.first}`
|
26
|
+
`echo cape-bone-iio > #{cape_dir}`
|
31
27
|
end
|
32
28
|
|
33
29
|
def get_file_handle
|
34
30
|
dir = Dir.glob("/sys/devices/ocp.*/helper.*/")
|
35
31
|
file = File.expand_path("AIN#{pin_map.ain}", dir.first)
|
36
|
-
|
32
|
+
file = File.open(file, "r")
|
33
|
+
file.sync = true
|
34
|
+
return file
|
37
35
|
end
|
38
36
|
|
39
37
|
def self.setup
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BBB
|
2
|
+
module Pins
|
3
|
+
module IO
|
4
|
+
module Cape
|
5
|
+
def cape_dir
|
6
|
+
return @cape_dir if @cape_dir
|
7
|
+
|
8
|
+
cape_dir = "/sys/devices/bone_capemgr.*/slots"
|
9
|
+
dir = Dir.glob(cape_dir)
|
10
|
+
if dir.length == 0
|
11
|
+
raise BoardError, "unable to access the capemgr directory: #{cape_dir}"
|
12
|
+
end
|
13
|
+
@cape_dir = dir.first
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/BBB/pins/io/gpio.rb
CHANGED
@@ -27,11 +27,13 @@ module BBB
|
|
27
27
|
return @io unless @io.nil?
|
28
28
|
value_file = gpio_pin_dir + "/value"
|
29
29
|
@io = file_class.open(value_file, file_mode)
|
30
|
+
@io.sync = true
|
31
|
+
|
32
|
+
return @io
|
30
33
|
end
|
31
34
|
|
32
35
|
def write(value)
|
33
36
|
io.write(value_map[value])
|
34
|
-
io.flush
|
35
37
|
end
|
36
38
|
|
37
39
|
def read
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'i2c'
|
2
|
+
|
3
|
+
module BBB
|
4
|
+
module Pins
|
5
|
+
module IO
|
6
|
+
class I2C
|
7
|
+
include Mapped
|
8
|
+
include Cape
|
9
|
+
|
10
|
+
attr_reader :backend
|
11
|
+
|
12
|
+
##
|
13
|
+
# Initializes two I2C pins. The initializer takes the cape argument,
|
14
|
+
# where most other IO classes in the library take a position. This is
|
15
|
+
# because it seems more natural to indicate BB-I2C1 as opposed to
|
16
|
+
# figuring out that I2C1 is mapped to P9_18, and P9_17 (sda, scl) and
|
17
|
+
# then give those positions.
|
18
|
+
#
|
19
|
+
# @param cape [String] The cape name of the I2C chip.
|
20
|
+
#
|
21
|
+
def initialize(cape)
|
22
|
+
@cape = cape
|
23
|
+
self.export
|
24
|
+
end
|
25
|
+
|
26
|
+
def position
|
27
|
+
@cape
|
28
|
+
end
|
29
|
+
|
30
|
+
def export
|
31
|
+
tree = pin_map.devicetree
|
32
|
+
system("echo #{tree} > #{cape_dir}")
|
33
|
+
sleep(0.2) # Give the kernel time to load the cape
|
34
|
+
@backend = I2C.create(pin_map.path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def write(address, *params)
|
38
|
+
@backend.write(address, params)
|
39
|
+
end
|
40
|
+
|
41
|
+
def read(address, size, *params)
|
42
|
+
@backend.read(address, size, params)
|
43
|
+
end
|
44
|
+
|
45
|
+
def pin_map_key
|
46
|
+
:devicetree
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -18,8 +18,8 @@ module BBB
|
|
18
18
|
|
19
19
|
class Pin < Struct.new(:name, :gpio, :led, :mux, :key, :mux_reg_offset,
|
20
20
|
:options, :eeprom, :pwm, :ain, :scale); end
|
21
|
-
class UART < Struct.new(:devicetree, :rx, :tx); end
|
22
|
-
class I2C < Struct.new(:devicetree, :path, :sda, :scl); end
|
21
|
+
class UART < Struct.new(:devicetree, :rx, :tx, :filesystem); end
|
22
|
+
class I2C < Struct.new(:devicetree, :path, :sda, :scl, :filesystem); end
|
23
23
|
|
24
24
|
attr_reader :data
|
25
25
|
|
@@ -58,7 +58,11 @@ module BBB
|
|
58
58
|
def self.map(pin_symbol)
|
59
59
|
@map ||= convert(PIN_MAP_FILE)
|
60
60
|
begin
|
61
|
-
|
61
|
+
sym = pin_symbol.upcase
|
62
|
+
map = @map.pins.fetch(sym, nil)
|
63
|
+
map = @map.i2c.fetch(sym) if map.nil?
|
64
|
+
|
65
|
+
return map
|
62
66
|
rescue Exception => e
|
63
67
|
raise UnknownPinException, "Pin #{pin_symbol} could not be mapped"
|
64
68
|
end
|
@@ -155,6 +159,30 @@ module BBB
|
|
155
159
|
# "scl": "P9_17"
|
156
160
|
# }
|
157
161
|
#
|
162
|
+
# Mind you, the mapping actually turns some of these keys around. The
|
163
|
+
# resulting hash takes the "devicetree" as the main key, and adds the
|
164
|
+
# key of the JSON object "/dev/i2c-1" as the value of the key
|
165
|
+
# :filesystem in the resulting hash. So, to follow the example above,
|
166
|
+
# the "mapping" of the example above is:
|
167
|
+
#
|
168
|
+
# @example
|
169
|
+
# i2c = I2C.new
|
170
|
+
# i2c.devicetree = "BB-I2C1"
|
171
|
+
# i2c.filesystem = "/dev/i2c-1"
|
172
|
+
# i2c.path = "/dev/i2c-2",
|
173
|
+
# i2c.sda = "P9_18"
|
174
|
+
# i2c.scl = "P9_17"
|
175
|
+
#
|
176
|
+
# map = {:'BB-I2C1' => i2c}
|
177
|
+
#
|
178
|
+
# ** Beware **
|
179
|
+
#
|
180
|
+
# The filesystem and path properties are not always the same! Check for
|
181
|
+
# example the i2c-1, it is found under the JSON key of /dev/i2c-1 but
|
182
|
+
# maps it's path to /dev/i2c-2. It's rather odd...
|
183
|
+
#
|
184
|
+
# ** End of Beware **
|
185
|
+
#
|
158
186
|
# @param [Hash] data_hash with strings as keys and hashes as values
|
159
187
|
#
|
160
188
|
# @return [Hash] with strings of I2C folders as keys and I2C objects as
|
@@ -177,8 +205,9 @@ module BBB
|
|
177
205
|
info_hash.each_pair do |key, value|
|
178
206
|
instance[key] = value
|
179
207
|
end
|
208
|
+
instance[:filesystem] = filesystem
|
180
209
|
|
181
|
-
hash[
|
210
|
+
hash[instance.devicetree] = instance
|
182
211
|
end
|
183
212
|
|
184
213
|
return hash
|
@@ -187,7 +216,7 @@ module BBB
|
|
187
216
|
##
|
188
217
|
# Makes an underscored, lowercase form from the expression in the string.
|
189
218
|
#
|
190
|
-
#
|
219
|
+
# Copied from ActiveSupport::Inflections
|
191
220
|
# http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore
|
192
221
|
#
|
193
222
|
# Changes '::' to '/' to convert namespaces to paths.
|
data/lib/BBB/pins/io/pwm.rb
CHANGED
@@ -3,6 +3,7 @@ module BBB
|
|
3
3
|
module IO
|
4
4
|
class PWM
|
5
5
|
include Mapped
|
6
|
+
include Cape
|
6
7
|
|
7
8
|
attr_reader :handles, :position
|
8
9
|
|
@@ -23,29 +24,30 @@ module BBB
|
|
23
24
|
|
24
25
|
files.each do |file|
|
25
26
|
file_path = File.expand_path(file, path)
|
26
|
-
|
27
|
+
f = File.open(file_path, "r+")
|
28
|
+
f.sync = true
|
29
|
+
handles[file.to_sym] = f
|
27
30
|
end
|
28
31
|
|
29
32
|
return handles
|
30
33
|
end
|
31
34
|
|
32
35
|
def export
|
33
|
-
cape_dir = "/sys/devices/bone_capemgr.*/slots"
|
34
|
-
dir = Dir.glob(cape_dir)
|
35
|
-
if dir.length == 0
|
36
|
-
raise BoardError, "unable to access the capemgr directory: #{cape_dir}"
|
37
|
-
end
|
38
|
-
|
39
36
|
pin_map_key = pin_map.key # This calls the pin map, which raises an error in case pin can't be mapped.
|
40
|
-
|
41
|
-
system("echo
|
37
|
+
|
38
|
+
system("echo am33xx_pwm > #{cape_dir}")
|
39
|
+
system("echo bone_pwm_#{pin_map_key} > #{cape_dir}")
|
40
|
+
sleep(0.2) # This seems to be necessary for te driver to load
|
42
41
|
end
|
43
42
|
|
44
43
|
def write(symbol, value)
|
45
44
|
handle = handles[symbol]
|
46
45
|
handle.rewind
|
47
|
-
|
48
|
-
|
46
|
+
begin
|
47
|
+
handle.write(value)
|
48
|
+
rescue Errno::EINVAL
|
49
|
+
puts "Could not write the value #{value} to the handle #{symbol}"
|
50
|
+
end
|
49
51
|
return value
|
50
52
|
end
|
51
53
|
|
data/lib/BBB/version.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BBB::Pins::IO::I2C do
|
4
|
+
let(:i2c) { BBB::Pins::IO::I2C }
|
5
|
+
|
6
|
+
#it "initializes" do
|
7
|
+
#i2c.any_instance.should_receive(:system)
|
8
|
+
#i2c.any_instance.should_receive(:export)
|
9
|
+
#i2c.new("BB-I2C1").should_not raise_error
|
10
|
+
#end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,36 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: BBB
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Wilco van Duinkerken
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: json
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: i2c
|
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
|
+
- - '>='
|
28
39
|
- !ruby/object:Gem::Version
|
29
40
|
version: '0'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: bundler
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
45
|
- - ~>
|
36
46
|
- !ruby/object:Gem::Version
|
@@ -38,7 +48,6 @@ dependencies:
|
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
52
|
- - ~>
|
44
53
|
- !ruby/object:Gem::Version
|
@@ -46,33 +55,29 @@ dependencies:
|
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: rake
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - '>='
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - '>='
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: rspec
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- -
|
73
|
+
- - '>='
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '0'
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- -
|
80
|
+
- - '>='
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0'
|
78
83
|
description: Helper functions to ruby around on the BeagleBone Black
|
@@ -97,6 +102,7 @@ files:
|
|
97
102
|
- lib/BBB/application.rb
|
98
103
|
- lib/BBB/circuit.rb
|
99
104
|
- lib/BBB/components/analog_component.rb
|
105
|
+
- lib/BBB/components/esc.rb
|
100
106
|
- lib/BBB/components/led.rb
|
101
107
|
- lib/BBB/components/pinnable.rb
|
102
108
|
- lib/BBB/components/servo.rb
|
@@ -104,7 +110,9 @@ files:
|
|
104
110
|
- lib/BBB/pins/analog_pin.rb
|
105
111
|
- lib/BBB/pins/digital_pin.rb
|
106
112
|
- lib/BBB/pins/io/ain.rb
|
113
|
+
- lib/BBB/pins/io/cape.rb
|
107
114
|
- lib/BBB/pins/io/gpio.rb
|
115
|
+
- lib/BBB/pins/io/i2c.rb
|
108
116
|
- lib/BBB/pins/io/mapped.rb
|
109
117
|
- lib/BBB/pins/io/pin_mapper.rb
|
110
118
|
- lib/BBB/pins/io/pwm.rb
|
@@ -123,6 +131,7 @@ files:
|
|
123
131
|
- spec/pins/digital_input_pin_spec.rb
|
124
132
|
- spec/pins/digital_output_pin_spec.rb
|
125
133
|
- spec/pins/digital_pin_spec.rb
|
134
|
+
- spec/pins/io/i2c_spec.rb
|
126
135
|
- spec/pins/io/mapped_spec.rb
|
127
136
|
- spec/pins/io/pin_mapper_spec.rb
|
128
137
|
- spec/pins/pinnable_spec.rb
|
@@ -131,33 +140,26 @@ files:
|
|
131
140
|
homepage:
|
132
141
|
licenses:
|
133
142
|
- MIT
|
143
|
+
metadata: {}
|
134
144
|
post_install_message:
|
135
145
|
rdoc_options: []
|
136
146
|
require_paths:
|
137
147
|
- lib
|
138
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
149
|
requirements:
|
141
|
-
- -
|
150
|
+
- - '>='
|
142
151
|
- !ruby/object:Gem::Version
|
143
152
|
version: '0'
|
144
|
-
segments:
|
145
|
-
- 0
|
146
|
-
hash: -4269646228377431993
|
147
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
-
none: false
|
149
154
|
requirements:
|
150
|
-
- -
|
155
|
+
- - '>='
|
151
156
|
- !ruby/object:Gem::Version
|
152
157
|
version: '0'
|
153
|
-
segments:
|
154
|
-
- 0
|
155
|
-
hash: -4269646228377431993
|
156
158
|
requirements: []
|
157
159
|
rubyforge_project:
|
158
|
-
rubygems_version:
|
160
|
+
rubygems_version: 2.0.3
|
159
161
|
signing_key:
|
160
|
-
specification_version:
|
162
|
+
specification_version: 4
|
161
163
|
summary: Helper functions to ruby around on the BeagleBone Black
|
162
164
|
test_files:
|
163
165
|
- spec/application_spec.rb
|
@@ -170,8 +172,10 @@ test_files:
|
|
170
172
|
- spec/pins/digital_input_pin_spec.rb
|
171
173
|
- spec/pins/digital_output_pin_spec.rb
|
172
174
|
- spec/pins/digital_pin_spec.rb
|
175
|
+
- spec/pins/io/i2c_spec.rb
|
173
176
|
- spec/pins/io/mapped_spec.rb
|
174
177
|
- spec/pins/io/pin_mapper_spec.rb
|
175
178
|
- spec/pins/pinnable_spec.rb
|
176
179
|
- spec/pins/pwm_pin_spec.rb
|
177
180
|
- spec/spec_helper.rb
|
181
|
+
has_rdoc:
|