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