artoo-arduino 1.1.0 → 1.2.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/Gemfile.lock +15 -17
- data/README.md +8 -63
- data/artoo-arduino.gemspec +4 -3
- data/examples/analog_sensor.rb +31 -0
- data/examples/{firmata_blink_led.rb → blink_led.rb} +1 -1
- data/examples/{firmata_blink_led_with_toggle.rb → blink_led_with_toggle.rb} +1 -1
- data/examples/{firmata_button_and_led.rb → button_and_led.rb} +0 -0
- data/examples/{firmata_dc_motor_speed.rb → dc_motor_speed.rb} +1 -1
- data/examples/{firmata_dc_motor_speed_h-bridge_2_pins.rb → dc_motor_speed_h-bridge_2_pins.rb} +1 -1
- data/examples/{firmata_dc_motor_switch.rb → dc_motor_switch.rb} +1 -1
- data/examples/{firmata_dc_motor_switch_h-bridge_2_pins.rb → dc_motor_switch_h-bridge_2_pins.rb} +1 -1
- data/examples/{firmata_led_brightness.rb → led_brightness.rb} +1 -1
- data/examples/led_brightness_with_analog_input.rb +29 -0
- data/examples/{firmata_led_with_button_toggle.rb → led_with_button_toggle.rb} +1 -1
- data/examples/{firmata_maxbotix.rb → maxbotix.rb} +2 -2
- data/examples/{firmata_motor.rb → motor.rb} +1 -1
- data/examples/motor_speed_with_analog_input.rb +30 -0
- data/examples/{firmata_servo.rb → servo.rb} +1 -1
- data/examples/{firmata_wiichuck.rb → wiichuck.rb} +0 -0
- data/lib/artoo-arduino/version.rb +1 -1
- data/lib/artoo/adaptors/firmata.rb +51 -9
- data/test/adaptors/firmata_test.rb +30 -0
- metadata +43 -48
- data/examples/littlewire_blink_led_with_toggle.rb +0 -17
- data/examples/littlewire_button_and_led.rb +0 -16
- data/examples/littlewire_dc_motor_speed.rb +0 -31
- data/examples/littlewire_maxbotix.rb +0 -19
- data/lib/artoo/adaptors/littlewire.rb +0 -63
- data/lib/artoo/drivers/board.rb +0 -10
- data/lib/artoo/drivers/button.rb +0 -43
- data/lib/artoo/drivers/led.rb +0 -59
- data/lib/artoo/drivers/maxbotix.rb +0 -44
- data/lib/artoo/drivers/motor.rb +0 -167
- data/lib/artoo/drivers/servo.rb +0 -49
- data/lib/artoo/drivers/wiichuck.rb +0 -61
- data/lib/artoo/drivers/wiiclassic.rb +0 -139
- data/lib/artoo/drivers/wiidriver.rb +0 -103
- data/test/adaptors/littlewire_test.rb +0 -25
- data/test/drivers/firmata_board_test.rb +0 -21
- data/test/drivers/led_test.rb +0 -92
- data/test/drivers/maxbotix_test.rb +0 -25
- data/test/drivers/motor_test.rb +0 -204
- data/test/drivers/servo_test.rb +0 -43
- data/test/drivers/wiichuck_test.rb +0 -11
- data/test/drivers/wiiclassic_test.rb +0 -11
- data/test/drivers/wiidriver_test.rb +0 -54
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Maxbotix ultrasonic range finder driver behaviors for Firmata
|
6
|
-
class Maxbotix < Driver
|
7
|
-
COMMANDS = [:range].freeze
|
8
|
-
|
9
|
-
attr_accessor :last_reading
|
10
|
-
|
11
|
-
def initialize(params={})
|
12
|
-
@last_reading = 0.0
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
# @return [float] last range reading in inches
|
17
|
-
def range
|
18
|
-
return ( 254.0 / 1024.0 ) * 2.0 * last_reading
|
19
|
-
end
|
20
|
-
|
21
|
-
# @return [float] last range reading in cm
|
22
|
-
def range_cm
|
23
|
-
return (last_reading / 2.0) * 2.54
|
24
|
-
end
|
25
|
-
|
26
|
-
# Sets values to read from ultrasonic range finder
|
27
|
-
# and starts driver
|
28
|
-
def start_driver
|
29
|
-
every(interval) do
|
30
|
-
update(connection.analog_read(pin))
|
31
|
-
end
|
32
|
-
|
33
|
-
super
|
34
|
-
end
|
35
|
-
|
36
|
-
# Publishes events according to the ultrasonic rangefinder value
|
37
|
-
def update(value)
|
38
|
-
last_reading = value
|
39
|
-
publish(event_topic_name("update"), "range", range)
|
40
|
-
publish(event_topic_name("range"), range)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/artoo/drivers/motor.rb
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
class Motor < Driver
|
6
|
-
|
7
|
-
COMMANDS = [:stop, :start, :on?, :off?, :toggle, :speed, :min, :max, :forward, :backward, :current_speed].freeze
|
8
|
-
|
9
|
-
attr_reader :speed_pin, :switch_pin, :current_speed
|
10
|
-
|
11
|
-
def initialize(params={})
|
12
|
-
super
|
13
|
-
|
14
|
-
additional_params = params[:additional_params]
|
15
|
-
@speed_pin = additional_params[:speed_pin]
|
16
|
-
@switch_pin = additional_params[:switch_pin] if additional_params[:switch_pin]
|
17
|
-
|
18
|
-
@forward_pin = additional_params[:forward_pin]
|
19
|
-
@backward_pin = additional_params[:backward_pin]
|
20
|
-
|
21
|
-
@current_state = :low
|
22
|
-
@current_speed = 0
|
23
|
-
|
24
|
-
# digital: just to switch the motor on or off, no speed control
|
25
|
-
# analog: speed control
|
26
|
-
@current_mode = :digital
|
27
|
-
|
28
|
-
@current_direction = :forward
|
29
|
-
|
30
|
-
@@modules_to_include = modules_to_include
|
31
|
-
|
32
|
-
class << self
|
33
|
-
@@modules_to_include.each do |m|
|
34
|
-
include m
|
35
|
-
end if @@modules_to_include
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def digital?
|
41
|
-
@current_mode == :digital
|
42
|
-
end
|
43
|
-
|
44
|
-
def analog?
|
45
|
-
@current_mode == :analog
|
46
|
-
end
|
47
|
-
|
48
|
-
def stop
|
49
|
-
if digital?
|
50
|
-
change_state(:low)
|
51
|
-
else
|
52
|
-
speed(0)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def start
|
57
|
-
if digital?
|
58
|
-
change_state(:high)
|
59
|
-
else
|
60
|
-
speed(@current_speed.zero? ? 255 : @current_speed)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def min
|
65
|
-
stop
|
66
|
-
end
|
67
|
-
|
68
|
-
def max
|
69
|
-
speed(255)
|
70
|
-
end
|
71
|
-
|
72
|
-
def on?
|
73
|
-
if digital?
|
74
|
-
@current_state == :high
|
75
|
-
else
|
76
|
-
@current_speed > 0
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def off?
|
81
|
-
!on?
|
82
|
-
end
|
83
|
-
|
84
|
-
def toggle
|
85
|
-
on? ? stop : start
|
86
|
-
end
|
87
|
-
|
88
|
-
def change_state(state)
|
89
|
-
@current_state = state
|
90
|
-
@current_speed = state == :low ? 0 : 255
|
91
|
-
connection.digital_write(@speed_pin, state)
|
92
|
-
end
|
93
|
-
|
94
|
-
# Set motor speed
|
95
|
-
# @param [Integer] value (must be an integer between 0-255)
|
96
|
-
def speed(value)
|
97
|
-
@current_mode = :analog
|
98
|
-
raise "Motor speed must be an integer between 0-255" unless (value.is_a?(Numeric) && value >= 0 && value <= 255)
|
99
|
-
@current_speed = value
|
100
|
-
connection.pwm_write(speed_pin, value)
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
def modules_to_include
|
105
|
-
if @forward_pin and @backward_pin
|
106
|
-
[BidirectionalWithForwardBackwardPins]
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
module BidirectionalWithForwardBackwardPins
|
112
|
-
|
113
|
-
# Sets movement forward
|
114
|
-
# @param [Integer] speed
|
115
|
-
def forward(speed = nil)
|
116
|
-
direction(:forward)
|
117
|
-
speed ? self.speed(speed) : start
|
118
|
-
end
|
119
|
-
|
120
|
-
# Sets movement backward
|
121
|
-
# @param [Integer] speed
|
122
|
-
def backward(speed = nil)
|
123
|
-
direction(:backward)
|
124
|
-
speed ? self.speed(speed) : start
|
125
|
-
end
|
126
|
-
|
127
|
-
def forward?
|
128
|
-
@current_direction == :forward
|
129
|
-
end
|
130
|
-
|
131
|
-
def backward?
|
132
|
-
(not forward?)
|
133
|
-
end
|
134
|
-
|
135
|
-
private
|
136
|
-
def change_state(state)
|
137
|
-
@current_state = state
|
138
|
-
@current_speed = state.zero? ? 0 : 255
|
139
|
-
if state == :high
|
140
|
-
direction(@current_direction)
|
141
|
-
speed(@current_speed) if speed_pin
|
142
|
-
elsif state == :low
|
143
|
-
direction(:none)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def direction(direction)
|
148
|
-
@current_direction = direction
|
149
|
-
case direction
|
150
|
-
when :forward
|
151
|
-
forward_pin_level = :high
|
152
|
-
backward_pin_level = :low
|
153
|
-
when :backward
|
154
|
-
forward_pin_level = :low
|
155
|
-
backward_pin_level = :high
|
156
|
-
when :none
|
157
|
-
forward_pin_level = :low
|
158
|
-
backward_pin_level = :low
|
159
|
-
end
|
160
|
-
|
161
|
-
connection.digital_write(@forward_pin, forward_pin_level)
|
162
|
-
connection.digital_write(@backward_pin, backward_pin_level)
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
data/lib/artoo/drivers/servo.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Servo behaviors for Firmata
|
6
|
-
class Servo < Driver
|
7
|
-
COMMANDS = [:move, :min, :center, :max, :current_angle].freeze
|
8
|
-
|
9
|
-
attr_reader :current_angle
|
10
|
-
|
11
|
-
# Create new Servo with angle=0
|
12
|
-
def initialize(params={})
|
13
|
-
super
|
14
|
-
|
15
|
-
@current_angle = 0
|
16
|
-
end
|
17
|
-
|
18
|
-
# Moves to specified angle
|
19
|
-
# @param [Integer] angle must be between 0-180
|
20
|
-
def move(angle)
|
21
|
-
raise "Servo angle must be an integer between 0-180" unless (angle.is_a?(Numeric) && angle >= 0 && angle <= 180)
|
22
|
-
|
23
|
-
@current_angle = angle
|
24
|
-
connection.servo_write(pin, angle_to_span(angle))
|
25
|
-
end
|
26
|
-
|
27
|
-
# Moves to min position
|
28
|
-
def min
|
29
|
-
move(0)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Moves to center position
|
33
|
-
def center
|
34
|
-
move(90)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Moves to max position
|
38
|
-
def max
|
39
|
-
move(180)
|
40
|
-
end
|
41
|
-
|
42
|
-
# converts an angle to a span between 0-255
|
43
|
-
# @param [Integer] angle
|
44
|
-
def angle_to_span(angle)
|
45
|
-
(angle * 255 / 180).to_i
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/wiidriver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Wiichuck driver behaviors for Firmata
|
6
|
-
class Wiichuck < Wiidriver
|
7
|
-
|
8
|
-
# Update button and joystick values
|
9
|
-
# @param [Object] value
|
10
|
-
def update(value)
|
11
|
-
begin
|
12
|
-
super
|
13
|
-
|
14
|
-
adjust_origins
|
15
|
-
update_buttons
|
16
|
-
update_joystick
|
17
|
-
|
18
|
-
rescue Exception => e
|
19
|
-
Logger.error "wiichuck update exception!"
|
20
|
-
Logger.error e.message
|
21
|
-
Logger.error e.backtrace.inspect
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Adjust x, y origin values
|
26
|
-
def adjust_origins
|
27
|
-
set_joystick_default_value(:sy_origin, data[:sy])
|
28
|
-
set_joystick_default_value(:sx_origin, data[:sx])
|
29
|
-
end
|
30
|
-
|
31
|
-
# Publishes events for c and z buttons
|
32
|
-
def update_buttons
|
33
|
-
publish(event_topic_name("c_button")) if data[:c] == true
|
34
|
-
publish(event_topic_name("z_button")) if data[:z] == true
|
35
|
-
end
|
36
|
-
|
37
|
-
# Publishes event for joystick
|
38
|
-
def update_joystick
|
39
|
-
publish(event_topic_name("joystick"), {:x => calculate_joystick_value(:sx, :sx_origin), :y => calculate_joystick_value(:sy, :sy_origin)})
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def get_defaults
|
45
|
-
{
|
46
|
-
:sy_origin => nil,
|
47
|
-
:sx_origin => nil
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
def parse(value)
|
52
|
-
return {
|
53
|
-
:sx => decode_value(value, 0),
|
54
|
-
:sy => decode_value(value, 1),
|
55
|
-
:z => generate_bool(decode_value(value, 5) & 0x01),
|
56
|
-
:c => generate_bool(decode_value(value, 5) & 0x02)
|
57
|
-
}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/wiidriver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Wiiclassic driver behaviors for Firmata
|
6
|
-
class Wiiclassic < Wiidriver
|
7
|
-
|
8
|
-
# Update buttons and joysticks values
|
9
|
-
# @param [Object] value
|
10
|
-
def update(value)
|
11
|
-
begin
|
12
|
-
super
|
13
|
-
|
14
|
-
adjust_origins
|
15
|
-
update_buttons
|
16
|
-
update_left_joystick
|
17
|
-
update_right_joystick
|
18
|
-
update_triggers
|
19
|
-
|
20
|
-
rescue Exception => e
|
21
|
-
Logger.error "wiiclassic update exception!"
|
22
|
-
Logger.error e.message
|
23
|
-
Logger.error e.backtrace.inspect
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Adjust all origins
|
28
|
-
def adjust_origins
|
29
|
-
set_joystick_default_value(:ly_origin, data[:ly])
|
30
|
-
set_joystick_default_value(:lx_origin, data[:lx])
|
31
|
-
set_joystick_default_value(:ry_origin, data[:ry])
|
32
|
-
set_joystick_default_value(:rx_origin, data[:rx])
|
33
|
-
set_joystick_default_value(:rt_origin, data[:rt])
|
34
|
-
set_joystick_default_value(:lt_origin, data[:lt])
|
35
|
-
end
|
36
|
-
|
37
|
-
# Update button values
|
38
|
-
def update_buttons
|
39
|
-
update_button("a_button", :a)
|
40
|
-
update_button("b_button", :b)
|
41
|
-
update_button("x_button", :x)
|
42
|
-
update_button("y_button", :y)
|
43
|
-
update_button("home_button", :h)
|
44
|
-
update_button("start_button", :+)
|
45
|
-
update_button("select_button", :-)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Publish button event
|
49
|
-
def update_button(name, key)
|
50
|
-
publish(event_topic_name(name)) if data[key] == true
|
51
|
-
end
|
52
|
-
|
53
|
-
# Publish left joystick event
|
54
|
-
def update_left_joystick
|
55
|
-
publish(event_topic_name("left_joystick"), {:x => calculate_joystick_value(:lx, :lx_origin), :y => calculate_joystick_value(:ly, :ly_origin)})
|
56
|
-
end
|
57
|
-
|
58
|
-
# Publish right joystick event
|
59
|
-
def update_right_joystick
|
60
|
-
publish(event_topic_name("right_joystick"), {:x => calculate_joystick_value(:rx, :rx_origin), :y => calculate_joystick_value(:ry, :ry_origin)})
|
61
|
-
end
|
62
|
-
|
63
|
-
# Publish triggers events
|
64
|
-
def update_triggers
|
65
|
-
publish(event_topic_name("right_trigger"), calculate_joystick_value(:rt, :rt_origin))
|
66
|
-
publish(event_topic_name("left_trigger"), calculate_joystick_value(:lt, :lt_origin))
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def get_defaults
|
72
|
-
{
|
73
|
-
:ry_origin => nil,
|
74
|
-
:rx_origin => nil,
|
75
|
-
:ly_origin => nil,
|
76
|
-
:lx_origin => nil,
|
77
|
-
:rt_origin => nil,
|
78
|
-
:lt_origin => nil
|
79
|
-
}
|
80
|
-
end
|
81
|
-
|
82
|
-
def parse(value)
|
83
|
-
return parse_joysticks(value).
|
84
|
-
merge(parse_buttons(value)).
|
85
|
-
merge(parse_triggers(value)).
|
86
|
-
merge(parse_dpad(value)).
|
87
|
-
merge(parse_zbuttons(value))
|
88
|
-
end
|
89
|
-
|
90
|
-
def parse_joysticks(value)
|
91
|
-
{
|
92
|
-
:lx => decode_value(value, 0) & 0x3f,
|
93
|
-
:ly => decode_value(value, 1) & 0x3f,
|
94
|
-
:rx => ((decode_value(value, 0) & 0xC0) >> 3) | ((decode_value(value, 1) & 0xC0) >> 5) | (decode_value(value, 2)[7]),
|
95
|
-
:ry => decode_value(value, 2) & 0x1f
|
96
|
-
}
|
97
|
-
end
|
98
|
-
|
99
|
-
def parse_buttons(value)
|
100
|
-
{
|
101
|
-
:a => get_bool_decoded_value(value, 5, 4),
|
102
|
-
:b => get_bool_decoded_value(value, 5, 6),
|
103
|
-
:x => get_bool_decoded_value(value, 5, 3),
|
104
|
-
:y => get_bool_decoded_value(value, 5, 5),
|
105
|
-
:+ => get_bool_decoded_value(value, 4, 2),
|
106
|
-
:- => get_bool_decoded_value(value, 4, 4),
|
107
|
-
:h => get_bool_decoded_value(value, 4, 3)
|
108
|
-
}
|
109
|
-
end
|
110
|
-
|
111
|
-
def parse_triggers(value)
|
112
|
-
{
|
113
|
-
:lt => ((decode_value(value, 2) & 0x60) >> 3) | ((decode_value(value, 3) & 0xC0) >> 6),
|
114
|
-
:rt => decode_value(value, 3) & 0x1f
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
def parse_dpad(value)
|
119
|
-
{
|
120
|
-
:d_up => get_bool_decoded_value(value, 5, 0),
|
121
|
-
:d_down => get_bool_decoded_value(value, 4, 6),
|
122
|
-
:d_left => get_bool_decoded_value(value, 5, 1),
|
123
|
-
:d_right => get_bool_decoded_value(value, 4, 7)
|
124
|
-
}
|
125
|
-
end
|
126
|
-
|
127
|
-
def parse_zbuttons(value)
|
128
|
-
{
|
129
|
-
:zr => get_bool_decoded_value(value, 5, 2),
|
130
|
-
:zl => get_bool_decoded_value(value, 5, 7)
|
131
|
-
}
|
132
|
-
end
|
133
|
-
|
134
|
-
def get_bool_decoded_value(value, offset1, offset2)
|
135
|
-
generate_bool(decode_value(value, offset1)[offset2])
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|