できること

第18回 Arduinoでパーツやセンサを使ってみよう~加速度センサ編(その2)

DSC_0308

前回は加速度センサの基本的な使い方を学びました。今回は前回作成した水平カメラデバイスをさらに発展させて、手持ちバージョンの作成に挑戦します。センサを扱うだけであれば、ブレッドボードとArduinoとセンサ、そして少しの電子部品があれば試すことはできますが、実際に何か実用的なデバイスに仕上げようとする場合、電子回路以外の機構を実現させるための素材選びや、ケースなどの外観の設えなど考えなければいけない点がたくさんでてきます。今回は、手持ちバージョンの作成を通して、それらの点について体感しながら学んでいきたいと思います。

今回の電子工作レシピ

完成までの時間目安:90分
必要なパーツ

デバイスの設計を考える

まず、はじめにデバイスの設計を考えて、必要な物品をそろえます。電子回路部分は前回利用した回路を基本とするので良いですが、今回手持ちバージョンを作るにあたり、どのような素材やパーツを利用して構成すれば良いか考えてみます。

写真1 前回作成した水平カメラ台

写真1 前回作成した水平カメラ台

 

前回作成した水平カメラ台を振り返ると、単純に台から伸びている部分を利用すれば、手持ちバージョンとして利用ができそうなので、それを元に仕様を固めていきましょう。おおよその完成イメージを頭に思い描きながら、ざっくりと設計図を書いてみました(図1)。

図1 水平カメラデバイス手持ちバージョンの設計図

図1 水平カメラデバイス手持ちバージョンの設計図

 

ひとまず、このようなイメージでデバイスを作っていきたいと思います。詳細なサイズについてあらかじめ決めても良いのですが、サーボモータとケースを接続する部分はどのようにしたら良いか、強度や加工のしやすさなどのように実際にパーツをそろえるにあたり、さまざまな素材の扱いに慣れている・パーツなどに詳しいなど慣れている方以外は、まずはホームセンターなどに行って、並んでいる商品を眺めながらこれらの詳細を詰めていくほうが、うまくいく可能性が高いです。

筆者も実際にサーボモータをしっかりと固定できるパーツが設計の段階で思い浮かばなかったため、ホームセンターで直接探すことにしました。本当は、華麗に3Dモデルを作成して、オリジナルのデバイスを作成したいのですが、3Dプリンターは今回利用するカメラ台として利用した際に、強度が足りない可能性があるため、断念しました。また、それ以外にもオリジナルでパーツを作る場合、iModelaのような素材を3次元で切り出すCNCフライスなどもありますが、ちょっと難易度が高くなってしまうため、今回は手軽にホームセンターでそろう部品で挑戦してみます。

さっそくパーツを買ってきた

写真2 ホームセンターで素材を購入

写真2 ホームセンターで素材を購入

ホームセンターでいろいろな商品を見て悩みながら、デバイスの作成に利用できそうな素材をいろいろと購入してきました。今回、サーボモータの接続部分が肝になりそうなので、実際にホームセンターにサーボモータを持って行き、商品と見比べながら購入してきました。

デバイスを組み立ててみる

さっそく組み立ててみます。今回、持ち手部分は加工のしやすい木材にしました。木材なら糸ノコなどがあればある程度の複雑な形でも切り出せます。次にサーボとの接続部分は、強度を確保したいので金属の部品を利用してみます。

写真3 サーボモータの接続に利用できそうな金属部品

写真3 サーボモータの接続に利用できそうな金属部品

写真4 持ち手に設置するサーボ

写真4 持ち手に設置するサーボ

写真5 持ち手にサーボモータが入るように糸ノコで加工。

写真5 持ち手にサーボモータが入るように糸ノコで加工。

写真6 持ち手にサーボモータをはめ込む

写真6 持ち手にサーボモータをはめ込む

写真7 サーボモータと金属部品を接続〜穴をうまく活用してネジで接合(裏)

写真7 サーボモータと金属部品を接続〜穴をうまく活用してネジで接合(裏)

写真8 サーボモータと金属部品を接続〜穴をうまく活用してネジで接合(表)

写真8 サーボモータと金属部品を接続〜穴をうまく活用してネジで接合(表)

サーボモータについている白いプラスチックの接続パーツは中心以外の穴はとても小さいですが、ネジを回しても壊れない強度を持っているので、写真7のように直接ネジを回せます。

写真9 サーボモータと接続

写真9 サーボモータと接続

これで、一つ目のサーボモータの設置は問題なさそうですね。次に二つ目のサーボモータを取り付ける方法を考えて見ます。

写真10 ビスとナットで固定

写真10 ビスとナットで固定

一つ目のサーボモータを接続した際に、利用した金属部品にサイズの違うちょうどよさそうなものがあったので、今回はそれを利用してビスとナットで二つ目のサーボモータを固定しました。

写真11 ビスとナットで固定して、二つ目のサーボモータに台座も設置

写真11 ビスとナットで固定して、二つ目のサーボモータに台座も設置

ひととおりくみ上げた後、確認のため手動でサーボモータの接続部分を確認しましたが、強度などは問題なさそうです。

デバイスを仮組みしてみる

サーボモータ以外のパーツを設置する前に、いったん仮組みしてみます。

写真12 デバイスを仮組みしてみる

写真12 デバイスを仮組みしてみる

Arduino UNOだとちょっと大きいですね。しかも配線の都合上ブレッドボードが2枚になるとさらにかさばってしまいます・・・。

そんなときは、第14回のラジコンカー制作に利用したArduino Pro Miniを利用して小型化をします。

写真13 Arduino Pro Miniと加速度センサ

写真13 Arduino Pro Miniと加速度センサ

Arduino Pro Miniを利用すれば、ブレッドボード1枚にすべて部品を載せられますね。ということで、さっそく回路を組み立てます。まず加速度センサ部分を組み立てますが、回路は前回やったArduino UNOと同じです。Pro Miniの場合、接続する位置が変わりますので基板に書いてある文字を見ながら組み立ててみます。

図2 Arduinoに加速度センサを接続する回路

図2 Arduinoに加速度センサを接続する回路

写真14 回路を組み立てる

写真14 回路を組み立てる

ブレッドボード1枚で収まりましたね!

写真15 デバイスに設置

写真15 デバイスに設置

ブレッドボードの裏面は両面テープになっているので、手持ち部分にはりつけます。

加速度センサのパラメータを調整

ある程度形ができてきたところで、加速度センサの値を調整してみましょう。前回のプログラムを利用してサーボモータをつなぐ前にセンサの数値を確認してみます。また、今回は手で持った場合、加速度センサは横を向いた状態が初期状態になるので、それを考慮してプログラムにも反映させます。

図3 加速度センサの数値確認

図3 加速度センサの数値確認

 

//********************************
//加速度センサの値を取得するプログラム
//********************************
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
}
void loop()
{
long x , y , z ;
x = y = z = 0 ;
x = analogRead(3) ; // X軸
y = analogRead(4) ; // Y軸
z = analogRead(5) ; // Z軸
Serial.print("X:") ;
Serial.print(x) ;
Serial.print(" Y:") ;
Serial.print(y) ;
Serial.print(" Z:") ;
Serial.println(z) ;
delay(50) ;
}

デバイスを水平にした状態でXYZ軸の初期状態を記録しておいて、次に前後左右90度ずつ倒してのXY軸に対して数値の最小・最大を計測して記録します。(この最小・最大の値が加速度センサの中心=水平の値)
その数値を元に、サーボモータを動かすプログラムに反映させます。

今回は、
X軸がMin 355 – Max 751 | 中心553 (前後198)
Y軸がMin 316 – Max 758 | 中心 536 (220)

でした。今回利用するサーボモータSG90は回転角度が90度になっていますので、45度を水平状態として、上下(左右)に最大45度(0度〜90度)傾いても平行を保つようなプログラムで実装します。

図4 完成回路図

図4 完成回路図

 

//********************************
//加速度センサの値を取得するプログラム2
//********************************
#include <Servo.h>
Servo myservoX;
Servo myservoY;
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
myservoX.attach( 5 );
myservoY.attach( 6 );
}
void loop()
{
int i ;
long x , y;
// 各データを100回読み込んで平均化する
x = y = 0 ;
for (i=0 ; i < 100 ; i++) {
x = x + analogRead(0) ; // X軸を読み込む
y = y + analogRead(1) ; // Y軸を読み込む
}
x = x / 100 ;
y = y / 100 ;
int rotateX = (x-198)/7.8888; //角度を求める式
Serial.print("X:") ;
Serial.print(x) ;
Serial.print(" ") ;
Serial.print(rotateX) ;
int rotateY = (y-220)/7.02;
myservoY.write( 90-rotateY );
Serial.print(" Y:") ;
Serial.print(y) ; // Y軸
Serial.print(" ") ;
Serial.println(rotateY) ; // Y軸
delay(10) ;
}

いよいよカメラをのせて実験!

完成したので、いよいよカメラを載せて実験してみます。

写真16 スマホを台座に設置

写真16 スマホを台座に設置

さあ、うまく動くでしょうか!?

 

いざスイッチオン!あれれ、まるで生まれたての小鹿!

何も載せていない時は比較的スムーズに動いていましたが、スマホを載せたとたんサーボモータががんばろうとする気持ちはわかるのですが、やや力不足・・・。これが産みの苦しみというものでしょうか、重いスマホは難しいみたいです・・・。
この状態で、改良する場合、考えられる方法は、サーボモータを強力なものに変更するか、スマホを軽いものにするくらいでしょうか。USB接続のウェブカメラやGoPROのような小型なカメラだとうまくいきそうですね。サーボモータを換える場合は、実際に台座に載せるカメラの重さに応じて条件を満たすサーボモータを用意する必要があります。サーボモータは主に回転角度、動作速度、トルク、動作電圧、サイズに気をつけて選定します。今回利用したSG90では、トルクは1.8kgf・cm、動作速度0.1秒/60度、動作電圧4.8V(~5V)とあります。今回はやや力不足だったので、トルクを今よりも強力なもので選定する必要がありますね。
サーボモータに必要なトルクは下記の公式で求められます。ただ、実際に計算する際に重心などはなかなか求めづらいため、大体の数字を当てはめて公式を利用することになりますね。

サーボモータに必要なトルク = 重心 × 距離 × 角度

まとめ

今回、水平カメラデバイス手持ちバージョンを実装しましたが、その過程でデバイスを構成する素材の選定から、いざ組みあがってからの問題点などが出てきましたね。今回作成したこの水平カメラデバイス、一般的にはステディカムやカメラジンバルという名称で流通しています。最近はクワッドコプターなどの流行でクワッドコプターに乗せるカメラ台としていろいろな製品が発売されていますね。
販売されている製品のようなレベルまで仕上げるには、たとえば動画を撮影する際にはサーボモータが回る際の「ジジジッ」という音が問題になるため、サーボモータの代わりにブラシレスモータというモータを利用したり、動きの滑らかさを出すために、加速度センサも今回利用した3軸センサではなく、さらに多軸のジャイロ付センサを利用したり、プログラムも振動を抑えるための処理を加えたりと、さまざまな工夫が必要になってきます。
こういう工夫を重ねながら、一つ一つ電子回路部品や素材の特性を学びながら取り組んでいくのが電子工作のだいごみですね。

次回は、Arduinoで「音」を扱ってみたいと思います!

アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

ロボコニストが伝授!ぼくらの就職活動