スマートフォン等に内蔵されている加速度センサを利用したよくあるアプリケーションとして、マトリクス LED を用いた水平器を作ってみます。マトリクス LED の光点を水平器の気泡に見立てます。ブレッドボードを傾けると光点が泡のように移動します。
必要なパーツ
Arduino の電源は USB 経由で PC から供給します。必要なパーツは以下のとおりです。
- マトリクス LED OSL641501-ARA x1
- トランジスタアレイ TD62083APG x1
- 抵抗 180Ω x8
- 3 軸加速度センサモジュール KXR94-2050 x1
- Arduino UNO R3 x1
- ブレッドボード x2
- ジャンプワイヤ (適量)
回路図
マトリクス LED の制御
OSL641501-ARA には 8 本の入力端子と 8 本の出力端子があります。HIGH 状態の入力端子と LOW 状態の出力端子が交差する箇所に存在する LED が点灯します。赤色 LED における電圧降下が約 1.9V だとすると、LED を一つだけ点灯させた場合に流れる電流は (5V - 1.9V) / 180Ω = 17.2mA
となりますので、Arduino UNO のデジタル入出力ピン 0-13 はそれぞれ 20mA を越える電流を流せないことを考慮すると、同時に点灯できる LED は一つになってしまいます。そこで、トランジスタを 8 個内蔵したトランジスタアレイ TD62083APG を利用して、流れ出る電流は GND に直接流れるようにします。マトリクス LED 出力側のピンに接続された Arduino のピンは電流を流すかどうかをスイッチング制御する目的で利用します。これで 1 行すべてを同時に点灯できるようになりました。更に、ある一行だけを点灯させた状態を各行について順々に繰り返すダイナミック点灯で制御することを考えます。人間の目の残像効果があるため、高速に制御することで、全行が異なるパターンで同時に点灯しているように見えます。これで 8x8 = 64
LED をすべて制御できることになります。
今回は簡単のため、アナログ入力ピンをデジタル入出力ピンとして使用することはせず 0-13 の 14 ピンだけを用います。そのため 8 + 8 = 16
ピンに不足します。最上位の行と最下位の行は制御しないことにします。水平器の作成が目的ですので、大きな問題にはなりません。
また、今回の制御プログラムでは同時に点灯させる LED は最大で一つであることが保証されるため、実はトランジスタアレイを使用する必要がありません。将来的に文字等の記号を表現したくなることを想定して設置しています。
加速度センサからの値の取得
KXR94-2050 をモジュール化した秋月の商品を利用すると、アナログ入力ピンに接続するだけで簡単に 3 軸それぞれの加速度が読み取れます。高校の物理で学んだとおり、高速に基板を振り回したりしない限りは地球上で観測できる加速度は重力加速度だけです。そのため、水平に設置すると X 軸および Y 軸は 0g となり、Z 軸は 1g となります。データシートに記載のあるとおり、KXR94-2050 を 5V で動作させると、0g は 2.5V となり 1g 毎に +1V 出力電圧が変化します。範囲としては 0.5V-4.5V の -2g から +2g を測定できます。Arduino UNO の A/D 変換の分解能は 10 ビットですので 0-1023 の範囲で analogRead
できます。
今回は特に -0.5g から +0.5g の範囲を水平器で測定することにします。計算すると以下のような対応関係になります。
-0.5g -> 2.0V -> 409.6
+0.5g -> 3.0V -> 614.4
制御プログラム
410 から 614 の範囲をマトリクス LED の行列に比例対応させて点灯するように制御します。
const double A = 409.6;
const double B = 614.4;
const int convX[] = {0,1,7,2,6,4};
const int convY[] = {11,12,10,9,13,8};
void setMatrixLed(int k, int l) {
for(int i = 0; i < 14; ++i) {
digitalWrite(i, LOW);
}
digitalWrite(convX[k], HIGH);
digitalWrite(convY[l], HIGH);
delay(100);
}
void setup() {
// デジタル入出力用の PIN 0-13 を初期化
for(int i = 0; i < 14; ++i) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
}
void loop(){
// 2 軸の加速度を取得 (z 軸は今回は使用しません)
int x = analogRead(A0);
int y = analogRead(A1);
int k = min(max(0, (x - A) / (B-A) * 5), 5);
int l = min(max(0, (y - A) / (B-A) * 5), 5);
setMatrixLed(k, l);
}
記事内で用いられたハードウェア
関連記事
- 内蔵LEDを点灯させるまで (Arduino)Arduinoとは Arduino は初心者でも入門しやすいマイコンボードです。アルデュイーノと読みます。マイコンとは家電などに内蔵されている小さなコンピュータで、マイコンが必要とする周辺機器一式と一緒に一つのボードにまとめたものがマイコンボードです。数あるマイコンの中で特にArduinoにはAVRマイコンが使用されています。2005年にイタリアで開始されたオープンソースハードウェアのプロジェクト...
- 虚仮威しの防犯装置 (Arduino)人が接近すると防犯用の音を鳴らします。インターネットに接続してメール送信機能を追加すれば、虚仮威しどころか立派な防犯装置になります。センサの性能は視野角が約 120 度と広範囲で、距離もおおよそ 2m まで検知可能です。赤外線を発する人体や動物などが動くと反応します。自動ドアや照明の自動点灯にも応用されています。
- Arduino で作る温度と気圧の計測基板専用の IC を利用すると、簡単に温度や気圧を測定できます。インターネットに接続してグラフ化したりボットを作ったりと応用先は様々ですが、ここでは LCD に結果を表示する測定基板を作成します。 必要なパーツ 以下のパーツが必要になります。画像ではコンデンサを直列に接続したり抵抗を並列に接続したりしていますが、これは手元に適切な値のパーツがなかったためです。 高精度
- 電力の無駄遣い (定電圧電源)マイコンを含む様々な IC を動作させるためには定電圧電源が必要です。USB ケーブルなどで供給する場合を除き、定電圧を出力するための回路が必要になります。ここでは、乾電池 9V 形から得られる電圧を 5V に変換し、更に 3.3V に変換し、最後に 5V に昇圧するという電力の無駄遣いともとれる基板を作ります。動作させるものはマイコンではなく燦然と輝く LED です。汎用基板として様々な場面で利...
- Arduino で作る 7 セグメント LED タイマーArduino の入門として、4 桁の 7 セグメント LED でカウントアップタイマーを作ってみます。PIN の電流制限を考慮してトランジスタを使用する必要があったり、桁数が多いためダイナミック点灯制御を用いなければならなかったりと、単なる LED 点灯制御と比較して考えなければならない事項は多めです。