ロータリーエンコーダー

2相出力のふつうの秋月で200円で売ってるやつを使った


マウスのホイールなどの中にも入っているセンサーで、上のツマミの部分を回すと両端の2つのピンからon-on・on-off・off-on・off-offの4状態を送ってくる。
中央のピンに5V入れて、両端の出力ピンは10kΩの抵抗でGNDにプルダウンしてArduinoのデジタルIOピンに入れた。

以前にも使ったことある。


プログラム

nodeとarduino-firmata npmでarduinoを制御した


こういうRotaryEncoderクラスを作った。回転させると”rotate”イベントを発行してくれる。

RotaryEncoder.coffee
events = require 'eventemitter2'
ArduinoFirmata = require 'arduino-firmata'

module.exports = class RotaryEncoder extends events.EventEmitter2
constructor: (@arduino, @pinA, @pinB) ->
console.log "set rotary encoder pin : #{@pinA} and #{@pinB}"
@state = 0

if @arduino.isOpen()
@initPins()

@arduino.on 'connect', =>
@initPins()

@arduino.on 'digitalChange', (e) =>
@pastState = @state
@state = @getState()
if (@state+3+1)%3 is @pastState
@emit 'rotate', 'right'
else if (@state+3-1)%3 is @pastState
@emit 'rotate', 'left'

initPins: ->
@arduino.pinMode @pinA, ArduinoFirmata.INPUT
@arduino.pinMode @pinB, ArduinoFirmata.INPUT

getState: ->
if @arduino.digitalRead @pinA
if @arduino.digitalRead @pinB
return 2
else
return 0
else
if @arduino.digitalRead @pinB
return 1
else
return 3


使う
path = require 'path'
ArduinoFirmata = require 'arduino-firmata'
RotaryEncoder = require path.resolve 'RotaryEncoder'

arduino = new ArduinoFirmata().connect()
rotenc = new RotaryEncoder arduino, 4, 3 ## digital pin 4,3を使う

rotenc.on 'rotate', (direction) ->
console.log "#{direction}に回った"

arduino-firmata npmはデジタルIOピンの状態が変化した時に発行してくれる、on “digitalChange”イベントがあるのでこういうハードウェアも簡単にイベント駆動で扱える。