ホーム » 2010 » 11月 » 02

日別アーカイブ: 2010年11月2日

2010年11月
« 10月   12月 »
 123456
78910111213
14151617181920
21222324252627
282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

Arduinoで3軸加速度センサーを使ってみた

今日から、専攻科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を使い込んでいないからなぁ…

ビューテーブルとデータベース設計の導入説明

データベースのSQLの説明の最後としてビューテーブルを説明し、 次章のデータベース設計の導入として、ERモデルの説明を行う。

ビューテーブルと外部スキーマ

データベースでは、3階層スキーマアーキテクチャ(内部スキーマ・概念スキーマ・外部スキーマ) で扱う場合が多い。 特に、"CREATE VIEW … AS " は、概念スキーマから外部スキーマを構成する 時に使われる重要な機能。 "CREATE TABLE"で作られた実テーブルから、"CREATE VIEW"で作り出された ビューテーブルを 使うと、SQLを簡潔に表現できるようになったり、不要なカラムなどを隠蔽化してデータ保護を 実現できるようになる。 その一方で、VIEWを使うことで更新異常を発生する場合もある。

この他にも、GRANT文によるアクセス制限や、COMMIT/ROLLBACK文によるトランザクション処理の紹介を行う。

最後に、COBOLなどで使われる埋め込み型SQLの事例を、教科書例で簡単に紹介。

データベース設計の基礎

教科書の3章のデータベースの設計の導入部を説明する。

データベースでは、設計が悪いと、更新不整合が発生する。 (a)修正不整合(1項目修正が、全レコード修正が必要となる場合)、 (b)挿入不整合(項目の1つに追加があっても、他項目がそろわない) (c)削除不整合(1レコード削除で、関連する項目が消えてしまう)

データベース設計では、実体関連モデル(ERモデル:Entity-Relation model)が使われる。 実体とは、モデル化しようとする対象で独立した存在となれるもの。 実体が持つ色々な特性は属性と呼ばれる。 属性の取りうる値の集合を定義域、同一種類の実体の集まりを実体集合と呼ぶ。 関連とは、実体同士の相互関係をモデル化したもの。

実体関連図(ER図)では、実体を長方形、関連をひし形、属性を楕円で表現する。 属性で、キーとなるものには下線をつけて表す。

ER図で調べると、実際にはもっと細かい規定で表現が行われている。 参考:IDEF1X表記とIE表記