2013/05/04

加速度センサで角度検出してみるの巻

【2014/10/12 記事更新】


前回の記事(http://nekolab.blogspot.jp/2013/05/arduino.html)で、加速度センサ(ADXL345)を動かしてみました。


今回は、センサから得た値の計算をして、センサの傾きを検出してみようと思います。


前回の記事で、加速度センサに傾き検出が~、と書いてましたが、加速度センサは重力加速度も検出するというコメントを頂きました。


と、いうことはですよ、重力がどの向きにかかっているのかを検出することで、センサがどれだけ傾いているかを検出できるということですね。

スマホの画面の向きが変わるやつとかはこれを利用してるのか...知らなかったです。
加速度センサで傾きが分かるとは思わなかったので。



デバイスはArduinoで、前回と大体同じです。


ちょこっとだけプログラムが変わっています。

センサの値を取得するのは前回の記事と変わりません。


このセンサの値ですが、重力加速度がそのまま出力されているわけではありません。

センサに設定してあるスケール(今回は±16g)の範囲で、13bitの分解能(高分解能モードの場合)で出力されます。

出力が1だけ変化したときの重力加速度の変化は、

(16 + 16) / 2^13 = 0.00390635

と、約3.9mgです。


センサ出力の値に0.0039を掛けると、重力加速度に変換できます。

ただしこれは、±16gのスケールと13bitの分解能の場合です。
センサの設定が違えば、この値も変わってきます。



センサの値を重力加速度に変換できたら、X軸の回転角と、Y軸の回転角を求めます。



上図で、OX向きをX軸の回転軸とします。同様にY軸もOYを回転軸とします。

OZは重力加速度で、常に1gの大きさがあります。

また、上図には書いてませんが、角OXZ、角OYZ、角XOYは直角です。


この図で、θxがXの回転軸の角度、θyがYの回転軸の角度です。

θx、θyを求めれば、センサがどれだけ傾いているかがわかります。



上図は、OXZの三角形を抜き出したものです。


これからθxを求めるには、OZとOYの大きさが分かっていれば求められます。

OZは重力加速度なので常に1です。

OYはY軸方向の加速度で、センサの出力から求められます。


よって、θxは、

θx = sin^-1(OY / 1)[rad]

で求められます。


sin^-1はアークサインで、直角三角形の斜辺と求めたい角に接しない辺の長さから、求めたい角の大きさを求める三角関数です。

また、この計算結果は弧度法(ラジアン)で与えられるため注意が必要です。(C言語のmath.hの場合)



同様に、θyについても計算を行うと、もう片方の軸の角度を求めることができます。



さて、これを実際にArduinoで実装してみます。


#include
#include

int acc_address = 0x53;
long acc_x, acc_y, acc_z;
double g_x, g_y, g_z;
double x_rol, y_rol;


void setup()
{
  Serial.begin(9600);
  
  Wire.begin();
  
  Wire.beginTransmission(acc_address);
  Wire.write(0x31);
  Wire.write(0x0B);
  Wire.endTransmission();
  
  Wire.beginTransmission(acc_address);
  Wire.write(0x2d);
  Wire.write(0x08);
  Wire.endTransmission();
  
  delay(1);
}

void loop()
{
  Wire.beginTransmission(acc_address);
  Wire.write(0x32);
  Wire.endTransmission();
  Wire.requestFrom(acc_address, 6);
  if(Wire.available() > 5){
    acc_x = Wire.read();
    acc_x = (Wire.read() << 8) | acc_x;
    acc_y = Wire.read();
    acc_y = (Wire.read() << 8) | acc_y;
    acc_z = Wire.read();
    acc_z = (Wire.read() << 8) | acc_z;
  }
  
  
  g_x = acc_x * 0.0039;
  g_y = acc_y * 0.0039;
  g_z = acc_z * 0.0039;
  
  x_rol = asin(g_y / 1) * (180 / 3.1415);
  y_rol = asin(g_x / 1) * (180 / 3.1415);
  
  Serial.println(g);
  Serial.print("X_rol:");Serial.println(x_rol);
  Serial.print("Y_rol:");Serial.println(y_rol);
  
  delay(100);
}


大体こんな感じです。

シリアル通信で、PCに傾きの値を送信しています。



しかし、この加速度センサは、静止状態では傾きが分かりますが、水平方向に加速度が働くと、正しい値を得られません。

逆に、傾いた状態で、水平方向の加速度を測定することもできません。


じゃあどうするか?

加速度センサ以外のセンサを使って、傾きを検知すればいいのではないか?と思います。


というわけで、ジャイロセンサと加速度センサを使って、傾きと加速度を検出できるようにしたいと思います。


でもまだやってないので、また今度です。


【2014/10/12追加】
加速度センサとジャイロセンサを使って、傾きを検出する方法を書きました。
https://sites.google.com/site/nekolabwiki/electronic/posturecontroll

以下、参考文献、またはサイト
http://www.geology.smu.edu/~dpa-www/robo/balance/inertial.pdf
https://sites.google.com/site/yamagajin/home/filter
http://www.slideshare.net/rogy01/6-32797657

2013/05/03

加速度センサーをArduino使って読み取ってみる

部の顧問の先生から、こんなモジュールを頂きました。


加速度センサ(ADXL345)と方位センサ(HMC5883L)とジャイロセンサ(ITG-3200)が一つの基板にまとめられたモジュールです。

ストロベリーリナックスで売られてました。
一個で一万円ぐらいします。

学生の自分にはなかなか手が出せませんね。


せっかく頂いたので、使ってみようじゃないかということで、使ってみました。


このモジュール、Arduinoを使えと言わんばかりに、Arduinoのシールドにはんだ付け済みでした。

手元にArduinoがあるので、これで動かしてみます。




今回は3つあるセンサのうちの一つ、加速度センサ「ADXL345」というセンサを使ってみます。
http://www.analog.com/static/imported-files/jp/data_sheets/ADXL345_jp.pdf




このセンサは、SPI通信か、I2C通信を用いて、通信をします。

センサは基板にはんだ付けされていて、このモジュールではI2C通信はできません。
そのため、I2C通信を使います。


ADXL345の使い方を簡単にまとめてみます。



・ADXL345を測定モードにする
POWER_CTL(0x2D)のD3をセット。


・測定レンジを変える
DATA_FORMAT(0x13)のD0,D1で測定レンジを変えられる。
D0 = 0, D1 = 0 : ±2g
D0 = 1, D1 = 0 : ±4g
D0 = 0, D1 = 1 : ±8g
D0 = 1, D1 = 1 : ±16g


・最大分解能モードにする
DATA_FORMAT(0x13)のD3をセット。


・サンプリング周波数を変える。
BW_RATE(0x2C)のD0:D3を変えることで、サンプリング周期を変えられる。


Rate (Hz)  Bandwidth (Hz)    Rate Code
3200         1600          1111
1600         800                    1110
800           400                    1101
400           200                    1100
200           100                    1011
100           50                     1010
50             25                     1001
25             12.5                   1000
12.5           6.25                   0111
6.25           3.13                   0110
3.13          1.56                    0101
1.56           0.78                   0100
0.78           0.39                   0011
0.39           0.20                   0010
0.20           0.10                   0001
0.10           0.05                   0000


・X,Y,Z方向の加速度を取得する。
0x32~0x37に、1軸につき2バイトずつ、データが格納されています。

データは2の補数で格納されています。

それぞれレジスタを読みだして、マスタ側で、加速度に変換してください。




他にもFIFOなど、機能がたくさんあるので、興味がある方はデータシートを参照してください。



それと、このセンサは、傾けても値が変化します。

前後左右に動かしても値が変化するので、平行移動で値が変化しているのか、回転したことで値が変化しているのかが分からなくなるので、どうすればいいのかを検討中です。

データシートを見た限りでは、傾きを検出しないようにする方法が分からなかったです。


加速度センサはどれもこういう感じなのかなぁ...?

ジャイロセンサがあるので、それで補正するようなことをしないといけないんですかね?
大変だなぁ...。

2013/05/01

いいアイデアをどんどん出すための手法、ブレインストーミング法について

話し合いで、いろいろなことを決めるときに、どうやって話し合いを進めたらいいのか?

そういう疑問を持ったことがある人は多いと思います。
自分もそうです。



例えば、高専ロボコン。
現在、自分がぶち当たっている課題です。

高専ロボコンに出場するロボットや戦略には、斬新なアイデアが必要不可欠です。
そのために、ルールブックを読み込み、アイデアを考えます。


しかし!
個人のアイデアでは限界があります。

そのため、多人数で話し合いをして、アイデアを出し、決定するという手法を取ると思います。



顧問の先生の話によると、多人数でアイデアを出すときに使える手法「ブレインストーミング法」というものがあるそうです。

この手法をググってみたところ、結構情報が豊富だったので、自分用にまとめてみました。



ブレインストーミング法(BS法)は、集団思考、集団発想法などとも言います。

集団でアイデアを出し、お互いのアイデアを連結したり、新たな発想を生み出して、よりよいアイデアを出そうというのが目的です。


では、ブレインストーミング法の基本原則についてまとめてみます。



①質より量
とにかく、たくさんアイデアを出すことが大切です。


②相手のアイデアを否定しない
否定されたら、それ以上発想が広がらなくなってしまいます。
これでは、たくさんアイデアが出なくなってしまいます。


③自由でユニークなアイデアを歓迎する
誰も考えつかないようなアイデアを重要視します。


④アイデアの連結と結合
他の人のアイデアから連想してアイデアを出したり、アイデア同士を繋げて、新しいアイデアを出すように心がけます。
他人のアイデアと重複していると思っても、発表すると、思わぬ発見があるかもしれません。



この基本原則を、話し合いのメンバーが理解しておかなければいけません。



そして、具体的にどうやって話し合いを進めるのか、です。
普通の話し合いと、若干似ています。(そもそも普通の話し合いとは...)



1.話し合いの人数
5人から7人の少人数に分かれるのが良いです。
多くても10人程度が限界です。


2.役割分担
進行役と書記を決めます。


3.対象となる議題、問題についての説明
これは、事前に理解しておくといいかもしれません。


4.アイデア出し
議題への理解が終わったら、メンバーにアイデアをどんどん出してもらいます。
書記の人は、そのアイデアを記録しておきます。


5.アイデアを分類して整理
アイデアを分類して、重複するアイデアや実現が不可能なアイデアを取り除きます。


これが話し合いの進め方です。




さらに、ブレインストーミングを活性化させる方法があります。


・悪いアイデアを受け入れ、良いアイデアへ繋げようとする。
一見悪いアイデアも、他のアイデアと組み合わせたり、他人からの視点だと、いいアイデアに化けるかもしれません。


・出すアイデアの数の目標を設定する。
アイデア出しが停滞することがあるので、目標を設定すると活性化しやすいです。
アイデアが出やすい議題は、時間を目標に設定。
アイデアが出にくい議題は、アイデアの数を目標に設定すると良いと思います。


・最初に「何がしたいのか」、その後に「それがどうしたら実現できるのか」を考える。


・「そもそも、何で○○なんだっけ?」と考える。
この問いかけを脳内で行うと、アイデアが出やすくなるそうです。
いろいろ考えると、本質が見えなくなることが多いので、原点回帰する方法のひとつでしょうね。


・広い場所でブレインストーミングを行う。
座って話すだけではなく、立って歩けるような環境が良いです。
身体を動かすと、発想しやすくなります。


・発想を刺激するものを用意する。
おもちゃ、ぬいぐるみ、クレヨンなど。
カラフルなものを見たり、さわり心地がいいものをいじったりすることで、五感が刺激され、アイデアが出やすくなるそうです。


・元気のあるうちに話し合う。
疲れたら、アイデアを出すどころではないですからね。
出来るだけ集中して、話を進めます。



いくらか、 ブレインストーミング法について解説しているサイトからの情報を集めてみました。


参考サイト

・NAVERまとめ 斬新なアイデアを量産出来るブレインストーミングのやり方とコツ
http://matome.naver.jp/odai/2134084375628143501


・寂しいブレストにならないために、知っておきたい10のテクニック
http://media.looops.net/sociama/2012/09/04/brainstorming/





とはいえ、あくまで方法論。

実際に試してみてどうだったかを、また報告したいと思います。



では、これぐらいで。

FETモタドラ設計 その3 -モータノイズ編(アンダーシュート)-

どーも、Nekosanです。


今年の高専ロボコンのルール発表されましたね。結構前ですが。

今年はなかなか難しい課題な気がします、例年に比べて、ですが。

まあそれはいいのです。あんまりそのことをブログに書いちゃうとメンバーに怒られそうなのでこれぐらいで。



ロボコンのルールも発表されたので、モータドライバの開発も急がないといけません。

かといって、ロボコンのアイデアの考案もしないといけないので、ここ最近やってませんでしたが、そろそろ再開します。




前回は、ブートストラップコンデンサの容量を決定しました。

今回は、ブートストラップ方式で問題となる(らしい)、フローティング電源のアンダーシュートについて考えて、設計を進めたいと思います。


自己解釈が結構多いので、間違っている部分もあると思いますが、ご了承を。



IR社のアプリケーションノートをいろいろ見てみると、多くの資料で、Vs端子(ハイサイドFETのソース端子、ローサイドFETのドレイン端子)がアンダーシュートしやすいと書かれています。


アンダーシュートとは、波形が定常値(この場合はGND電位)よりも、下がってしまうことです。
また、下に突出してしまった波形のことを言ったりもします。

ちなみに、この逆、上方向に突出してしまった波形のことをオーバーシュートといいます。


このアンダーシュートが5Vを超えると、IR2110の出力が一時的にラッチ(入力を受け付けない状態)してしまいます。そういう仕様です。

また、アンダーシュートが定格を超えると、ICが破壊されてしまいます。


今まで、何回かICをぶっ壊してきましたが、もしかしたら原因がこれかもしれません。



このアンダーシュートは、通常動作、ショート、電源シャットダウンなどの高いストレスがかかった時で、かつ、di/dtが大きいこと(スイッチング速度が速い)で観測されます。



つまりは、電流が急激に変化したときに発生するということですかね。

負荷がモータなどの誘導性負荷なのが原因っぽい。


アプリケーションノートを見てみると、アンダーシュートが発生する原因について書かれているみたいです。
http://www.irf-japan.com/technical-info/designtp/dt97-3j_rev.pdf


これを参考に、アンダーシュートが発生する原因を考えたいと思います。
ここからは自己解釈が若干入っているので注意です。


ハイサイドFETがONで、モータに電流が流れている状態から、ハイサイドFETがオフになった状態を考えます。
すると、モータに電流が流れなくなります。

モータはコイルなので、電流が流れなくなると、電流を流そうとします。
そのため、今まで流れていた向きに電流を流そうとして、起電力が発生します。

いわゆる逆起電力ってやつですね!

もし、このときの回路にフリーホイールダイオード(FETのドレインソース間に並列に接続されているダイオードのこと)が無かったら、モータで発生した起電力を下げるために流す電流を流せないため、大きく電位差がモータ両端に発生します。

しかし、今回の回路では、フリーホイールダイオードをつけているため、モータ→ダイオードという電流の経路が確保できるため、電流の変化率が小さくなります。


これで、モータの逆起電力による電圧の変化を抑えることができます。


が!
これでは終わらないらしいです。

このフリーホイールダイオードには、逆起電力による負荷電流が流れます。

この電流が流れる経路は、導線なので、浮遊インダクタンスがあります。
小さなコイルが接続されているようなものです。だって導線だもの。

この浮遊インダクタンスによって、Vs端子の電位がGNDよりも小さくなってしまうとのことです。



と、ここまで書きましたが、ぶっちゃけよく分からないです。

なんとなくは分かりますが、いまいちパッとしない感じがしますけど、あんまり考えても設計が進まないので、こういうもんだと思うことにします、今は。



原理はいまいち分かりませんでしたが、原因は、配線の浮遊インダクタンスということです。

つまりは、その対策をすれば大丈夫だということ。


アプリケーションノートにも、対策が書かれています。

詳しくは先ほどのデータシートの第7項:一般的推奨条項に詳しく書かれています。
他のアプリケーションノートにも同じようなことが書かれています。


概要をまとめると、


1.寄生要素(配線のインダクタンスなど)を最小化する。

対策としては、
・パワー素子は太くて、まっすぐな線で繋ぐ。配線にループや分岐がないこと。
・電力回路内では相互接続したリンクを避けること。
・パワー素子の高さを低くして、リードインダクタンスの影響を抑えること。
・パワー素子を近接して配置すること。
が、書かれています。


2.制御ICの配線

・VsはローサイドFETのドレイン端子に近づけるように接続すること。
・COMはローサイドFETのソース端子に近づけるように接続すること。
・制御ICをパワー素子にできる限り近接して配置すること。


3.各所のカップリングの改善

・ブートストラップコンデンサの容量を0.47uF以上にすること。このとき、低ESRのコンデンサを最低でも一つは使用する。
・Vcc端子とCOM端子の間には低ESRのコンデンサを接続すること。容量はブートストラップコンデンサの10倍にすること。
・これらのデカップリングコンデンサはそれぞれのピンに直接接続すること。


これらを適用すれば、Vsのアンダーシュートによる影響は最小化できます。


これでもアンダーシュートが大きすぎる場合は、スイッチング速度を減らすしかありません。

スイッチング速度を減らすには、ゲート抵抗を大きくします。

ゲート抵抗については、次の記事に回したいと思います。
さすがに記事の量が多くなったので疲れました。



というわけで、今回は浮遊インダクタンスによるアンダーシュートのノイズについての記事でした。

これを元に、次の設計を進めたいと思います。



では、これぐらいで。
しーゆーあげいん!

人気の投稿