lib/artoo/adaptors/firmata.rb in artoo-arduino-1.1.0 vs lib/artoo/adaptors/firmata.rb in artoo-arduino-1.2.0
- old
+ new
@@ -3,11 +3,11 @@
module Artoo
module Adaptors
# Connect to Arduino using Firmata
# @see http://rubydoc.info/gems/hybridgroup-firmata/0.3.0/Firmata/Board HybridGroup Firmata Documentation
class Firmata < Adaptor
- attr_reader :firmata
+ attr_reader :firmata, :i2c_address
# Creates connection with firmata board
# @return [Boolean]
def connect
require 'firmata' unless defined?(::Firmata::Board)
@@ -22,10 +22,20 @@
# @return [Boolean]
def disconnect
super
end
+ # device info interface
+ def firmware_name
+ firmata.firmware_name
+ end
+
+ def version
+ firmata.version
+ end
+
+ # GPIO - digital
def digital_write(pin, level)
firmata.set_pin_mode(pin, ::Firmata::PinModes::OUTPUT)
firmata.digital_write(pin, convert_level(level))
end
@@ -39,37 +49,69 @@
event = events.slice!(i)
value = event.data.first if !event.nil?
end
value
end
+
+ # GPIO - analog
+ # NOTE pins are numbered A0-A5, which translate to digital pins 14-19
+ def analog_read(pin)
+ firmata.set_pin_mode(digital_pin(pin), ::Firmata::PinModes::ANALOG)
+ firmata.toggle_pin_reporting(digital_pin(pin))
+ firmata.read_and_process
+ value = 0
+ while i = find_event("analog_read_#{pin}") do
+ event = events.slice!(i)
+ value = event.data.first if !event.nil?
+ end
+ value
+ end
+
+ def digital_pin(pin = 0)
+ pin + 14
+ end
+
+ # GPIO - PWM
def pwm_write(pin, level)
firmata.set_pin_mode(pin, ::Firmata::PinModes::PWM)
firmata.analog_write(pin, level)
end
+ # GPIO - servo
def servo_write(pin, angle)
firmata.set_pin_mode(pin, ::Firmata::PinModes::SERVO)
firmata.analog_write(pin, angle)
end
- def analog_read(pin)
- firmata.set_pin_mode(pin, ::Firmata::PinModes::ANALOG)
- firmata.toggle_pin_reporting(pin)
+ # i2c interface
+ def i2c_start(address)
+ @i2c_address = address
+
+ firmata.i2c_config(0)
+ end
+
+ def i2c_end
+
+ end
+
+ def i2c_read(size)
+ firmata.i2c_read_request(i2c_address, size)
firmata.read_and_process
- value = 0
- while i = find_event("analog_read_#{to_analog_pin(pin)}") do
+ value = []
+ while i = find_event(:i2c_reply) do
event = events.slice!(i)
- value = event.data.first if !event.nil?
+ value = event.data.first[:data] if !event.nil?
end
value
end
- def to_analog_pin(pin)
- pin - 14
+ def i2c_write(*data)
+ firmata.i2c_write_request(i2c_address, *data)
end
+ # helpers
def find_event(name)
events.index {|e| e.name == name.to_sym }
end
def events