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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +15 -17
  3. data/README.md +8 -63
  4. data/artoo-arduino.gemspec +4 -3
  5. data/examples/analog_sensor.rb +31 -0
  6. data/examples/{firmata_blink_led.rb → blink_led.rb} +1 -1
  7. data/examples/{firmata_blink_led_with_toggle.rb → blink_led_with_toggle.rb} +1 -1
  8. data/examples/{firmata_button_and_led.rb → button_and_led.rb} +0 -0
  9. data/examples/{firmata_dc_motor_speed.rb → dc_motor_speed.rb} +1 -1
  10. data/examples/{firmata_dc_motor_speed_h-bridge_2_pins.rb → dc_motor_speed_h-bridge_2_pins.rb} +1 -1
  11. data/examples/{firmata_dc_motor_switch.rb → dc_motor_switch.rb} +1 -1
  12. data/examples/{firmata_dc_motor_switch_h-bridge_2_pins.rb → dc_motor_switch_h-bridge_2_pins.rb} +1 -1
  13. data/examples/{firmata_led_brightness.rb → led_brightness.rb} +1 -1
  14. data/examples/led_brightness_with_analog_input.rb +29 -0
  15. data/examples/{firmata_led_with_button_toggle.rb → led_with_button_toggle.rb} +1 -1
  16. data/examples/{firmata_maxbotix.rb → maxbotix.rb} +2 -2
  17. data/examples/{firmata_motor.rb → motor.rb} +1 -1
  18. data/examples/motor_speed_with_analog_input.rb +30 -0
  19. data/examples/{firmata_servo.rb → servo.rb} +1 -1
  20. data/examples/{firmata_wiichuck.rb → wiichuck.rb} +0 -0
  21. data/lib/artoo-arduino/version.rb +1 -1
  22. data/lib/artoo/adaptors/firmata.rb +51 -9
  23. data/test/adaptors/firmata_test.rb +30 -0
  24. metadata +43 -48
  25. data/examples/littlewire_blink_led_with_toggle.rb +0 -17
  26. data/examples/littlewire_button_and_led.rb +0 -16
  27. data/examples/littlewire_dc_motor_speed.rb +0 -31
  28. data/examples/littlewire_maxbotix.rb +0 -19
  29. data/lib/artoo/adaptors/littlewire.rb +0 -63
  30. data/lib/artoo/drivers/board.rb +0 -10
  31. data/lib/artoo/drivers/button.rb +0 -43
  32. data/lib/artoo/drivers/led.rb +0 -59
  33. data/lib/artoo/drivers/maxbotix.rb +0 -44
  34. data/lib/artoo/drivers/motor.rb +0 -167
  35. data/lib/artoo/drivers/servo.rb +0 -49
  36. data/lib/artoo/drivers/wiichuck.rb +0 -61
  37. data/lib/artoo/drivers/wiiclassic.rb +0 -139
  38. data/lib/artoo/drivers/wiidriver.rb +0 -103
  39. data/test/adaptors/littlewire_test.rb +0 -25
  40. data/test/drivers/firmata_board_test.rb +0 -21
  41. data/test/drivers/led_test.rb +0 -92
  42. data/test/drivers/maxbotix_test.rb +0 -25
  43. data/test/drivers/motor_test.rb +0 -204
  44. data/test/drivers/servo_test.rb +0 -43
  45. data/test/drivers/wiichuck_test.rb +0 -11
  46. data/test/drivers/wiiclassic_test.rb +0 -11
  47. 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
@@ -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
@@ -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