今日から、専攻科1年の4週実験が始まった。 Arduinoを使って制御をテーマに実験をおこなってもらう。 実験の概要説明の後、歯みがきロボコンで使ったオムニホイールやら、 興味があったら触ってもらおうと購入しておいた、3軸加速度センサーの 説明を行い、自分たちのテーマを決めてもらった。 簡単なArduinoの実験後の相談で、オムニホイールの車体制御に決まったようだ。
3軸加速度センサーの実験
学生さんが3軸加速度センサーを使わないことが決まったので、 プロコンなどでも使ってもらうために、こちらで実験してみる。 購入しておいたセンサーは、MMA7260Q搭載三軸加速度センサモジュール。 データシートを見ると、Vcc=3.3[V]となっているので、以下のように配線した。
(( MMA7260Q )) Vcc : 3.3[V] GND : GND(0V) X : A0 Y : A1 Z : A2 GS1 : GND // 1.5Gまでの測定の場合 GS2 : GND *SLP: 3.3[V] // SleepさせないのでHIGH
動作確認のためのプログラムで、以下を記述。
void setup() { Serial.begin( 9600 ) ; } int x = 0 , y = 0 , z = 0 ; void loop() { x = analogRead( 0 ) ; y = analogRead( 1 ) ; z = analogRead( 2 ) ; Serial.print( x ) ; Serial.print( "," ) ; Serial.print( y ) ; Serial.print( "," ) ; Serial.println( z ) ; }
このプログラムを動かすと、加速度なしの状態で330〜350ぐらいの範囲で 激しく変動している。1G加速度方向では500ぐらいの値が出ている。 このままではノイズが激しいし、オフセットを引いてノイズ除去を行った。 指数移動平均 の手法(α=1/16)を使用。
int base = 335 ; // 中心値 int x = 0 , y = 0 , z = 0 ; void loop() { x = (15 * x + (analogRead( 0 ) - base) ) / 16 ; y = (15 * y + (analogRead( 1 ) - base) ) / 16 ; z = (15 * z + (analogRead( 2 ) - base) ) / 16 ; Serial.print( x ) ; Serial.print( "," ) ; Serial.print( y ) ; Serial.print( "," ) ; Serial.println( z ) ; }
この状態で、平置きするとZ軸方向で165の値が得られた。 様々な方向にブレッドボードを移動して、方向に応じた加速度の変化も確認できた。
# それにしてもノイズ変動が大きいなぁ…
Processing + Firmata
試しに、Processing でデータを収集しながら、表示するプログラムを手抜きで 書いてみた。
Arduinoには、"SimpleAnalogFirmata"を書き込んでおく。
[開く]-[Firmata]-[SimpleAnalogFirmata] で Compile & Writeしておく。
(( Processing )) import processing.serial.* ; import cc.arduino.* ; Arduino arduino ; color black = color( 0 , 0 , 0 ) ; color white = color( 255 , 255 , 255 ) ; void setup() { size( 400 , 400 ) ; println( Arduino.list() ) ; arduino = new Arduino( this , Arduino.list()[ 0 ] , 57600 ) ; } int m = 335 ; int x = 0 , y = 0 , z = 0 ; void draw() { background( white ) ; stroke( black ) ; x = arduino.analogRead( 0 ) - m ; y = arduino.analogRead( 1 ) - m ; z = arduino.analogRead( 2 ) - m ; //println( x + "," + y + "," + z ) ; int xx = int( x * sqrt(3.0)/2.0 - y * sqrt(3.0)/2.0 ) ; int yy = int( - x * 0.5 - y * 0.5 + z) ; line( 200 , 200 , 200 + xx , 200 - yy ) ; }
もっとサクサク動くかと思ったが、カクカクだなぁ。 draw() だと、リアルタイムに描画処理の中から呼び出されないかな… Processingを使い込んでいないからなぁ…