■ もっと使うゼ!! Arduino!!
前回に引き続き、今回もArduinoについて。前回はArduinoの基本の“キ”あたりをご紹介したが、今回は基本の“ホ”あたりを。前回紹介した作例より、ちょっぴり高度なものをいくつかお見せしたい。
|
イタリア生まれのマイコン(AVR)ボードことArduino。Arduinoはオープンソースハードウェア/ソフトウェアで、様々なタイプが存在する。ここで扱っているのは、現在最も普及していると思われるArduino Diecimilaだ
|
なお、作例(プロジェクト)の提供は武蔵野電波。てか、船田戦闘機さんらと武蔵野電波というユニット(!?)を作ったんですけど、船田氏はずっと以前からArduinoやWIRINGをイジってるので、手持ちのプロジェクトも豊富。その一部を以下にご紹介してみたい。
で、まずは、東洋人も欧米人も大好きだったりするフルカラーLEDを光らせるというもの。市販のフルカラーLEDをArduinoのソケットに直接挿し、Arduino言語により各ピンへ擬似的なアナログ出力を行い、フルカラーLEDをポワンポワンと光らせるという作例だ。
|
|
|
使用したフルカラーLED。足が4本あるデバイスで、いちばん長い足がアノード・コモン(+極)。その他の足はそれぞれデバイス内部の赤・緑・青のLEDのカソード(-極)へとつながっている。LEDが3個入ったデバイスなんですな
|
使用したフルカラーLEDはこんな姿で売られていた!! 東京・秋葉原の秋月電子通商にて200円だった。紙のデータシート付き
|
フルカラーLEDとArduinoは、このように接続する。フルカラーLEDのアノード・コモンをArduinoの4番ソケットに、赤のカソードを3番、青のカソードを5番、緑のカソードを6番につなぐのだ
|
このフルカラーLEDを光らせるわけだが、赤/緑/青のLEDを順繰り・滑らかに光らせるという点がポイント。動作としては単純だが、これをマイコンを使わない電子工作で行おうとすると、ちょいとタイヘン。だが、Arduinoなら、下記のようなソースで実現できる。
赤/緑/青のLEDを順繰りに光らせるサンプルプログラム(スケッチ)
// RGBぽわんぽわん by Musashinodenpa
int i;
int n_ms = 30;
void led_off()
{
analogWrite(3, 255); // 赤を消す
analogWrite(6, 255); // 緑を消す
analogWrite(5, 255); // 青を消す
}
void setup()
{
pinMode(4, OUTPUT); // anode common
digitalWrite(4, HIGH); // 4番は常時オン
led_off();
}
void loop()
{
// iの値が小さくなるにつれ明るく光る
for(i = 255; i > 210; i--) {
analogWrite(6, i);
delay(n_ms);
}
led_off();
for(i = 255; i > 150; i-=2) {
analogWrite(5, i);
delay(n_ms);
}
led_off();
for(i = 255; i > 200; i--) {
analogWrite(3, i);
delay(n_ms);
}
led_off();
}
|
|
|
|
【船田コメント】
Arduinoの“アナログ出力”は、オンとオフを高速に繰り返して、擬似的にオンとオフの中間の電圧を作っている。オン状態の長さを変えることで、電圧の高低を設定できる。たとえば、電源が5ボルトのとき、3ボルトを取り出したいとしたら、オンとオフの比率を3:2にする。これがいわゆるPWM。
ArduinoではanalogWriteという1個の命令でPWMを使えるようになっていて、先ほどの3ボルトを作る例だと、analogWrite(10, 153)とやれば約3ボルトが10番ピンに出てくる。153は256を3/5した値ね。
同じことをマイコン抜きの電子工作でやる場合、抵抗が2本あればできる。だけど、それでは電圧を変えられない。可変抵抗を使えば変えられるが、指で回してやらないといけない。自動的に狙った範囲で電圧を変えたいようなときは、マイコンでPWMするのが一番お手軽なんですな。そして、Arduinoなら、初期設定不要の命令1つでできちゃう。
なお、この手の回路を作る場合、LEDに対して直列に抵抗を入れて電流を絞ってやるのが定石。でも今回は、PWMしてるし、面倒だしってことで省略してみた。一線を越えてしまうと部品が壊れる可能性があるけれど、そうなったらなったでひとつの経験ということで、安直さを追求している。
|
|
|
|
|
|
■ ボタン操作でフルカラーLEDを自由に光らせる
上の作例のフルカラーLEDは、Arduino言語を書き換えれば光るタイミング等を変更できる。が、いちいちArduino IDEを使うのも面倒。というわけで、今度はボタン操作により、より自由にフルカラーLEDを光らせてみよう。
用意するものは、Arduinoの他に、上の作例で使ったフルカラーLED。それから、外部にスイッチを付けるために、ブレッドボードやジャンプワイヤ、抵抗器が要る。ブレッドボード上に載せるスイッチは、市販のタクトスイッチが便利だろう。
|
|
|
フルカラーLEDとArduinoの接続は、上記の作例と同じ。フルカラーLEDのアノード・コモンを4番、赤カソードを3番、青カソードを5番、緑カソードを6番、とする
|
ブレッドボード上にスイッチや抵抗(プルアップ用)を配置し、それぞれArduinoとジャンプワイヤでつなぐ。ブレッドボードなので、ハンダ付け不要。配線を間違えてもやり直しが利くのだ
|
ブレッドボード上の配線はこんな感じ。このとおり、というわけではなく、電気的な結線がこの配線と同じならOK
|
|
|
|
ジャンプワイヤはArduinoのソケットへこのように接続する
|
ジャンプワイヤがやや見づらいが、黒をGND(-極)、白を5V(+極)のソケットにつなぐ
|
この作例の回路図はこのようになる
|
ちなみに、ブレッドボードは電子パーツを扱うショップで売られていることが多い。様々なタイプが売られているが、この作例のスイッチ回路を作るなら、小さなものでも足りるだろう。ブレッドボードの構造についてはここでは触れないが、PC Watchでの新連載記事「武蔵野電波のブレッドボーダーズ」にてご紹介予定だ。
で、以下のソースコードをArduinoに書き込めば、完成。ボタンを押せば、それに対応した色でフルカラーLEDが光る。複数のボタンを同時に押せば、同時押ししたボタン色に応じ、LEDの色が混ざった状態で発光する。
RGB LEDとスイッチ:サンプルプログラム(スケッチ)
// RGB LEDとスイッチ by Musashinodenpa
int sw_red, sw_green, sw_blue;
void setup()
{
pinMode(11, INPUT); // 赤ボタン
pinMode(12, INPUT); // 緑ボタン
pinMode(13, INPUT); // 青ボタン
pinMode(4, OUTPUT); // anode common
digitalWrite(4, HIGH);
}
void loop()
{
sw_red = digitalRead(11); // オンオフを読み込む
sw_green = digitalRead(12);
sw_blue = digitalRead(13);
if(sw_red == LOW) { // LOWのときがオン
analogWrite(3, 200);
}
else {
analogWrite(3, 255);
}
if(sw_green == LOW) {
analogWrite(6, 200);
}
else {
analogWrite(6, 255);
}
if(sw_blue == LOW) {
analogWrite(5, 150);
}
else {
analogWrite(5, 255);
}
}
|
【動画】クリックで再生 ボタン操作でフルカラーLEDの発光色をコントロールできた。ちょっと楽しいですな。ソースコードを変えたりスイッチを付加したりすれば、トリッキーに光らせることも可能だろう
|
|
|
|
|
【船田コメント】
3つのボタンを同時に押すと、RGBの3色が混ざってほぼ白になる。完全な白に近づけるには、パラメータ(analogWriteの引数)を調整する必要がある。ただし、この回路のままで深掘りするのはオススメしない。部品の性能の限界を考慮していない、動作原理を一瞬確認するための回路だ。
とくに3ボタン同時押しは「さすがにこれはちょっとマズイかな」と思いながら一瞬だけやってほしい。部品が壊れる可能性がある。壊れたらイヤな人は、自分で試すのはやめておこう。もう少しまともな回路をPC Watchの新連載「武蔵野電波のブレッドボーダーズ」で紹介する予定。
なお、ボタン(プッシュスイッチ)の接続方法はArduinoサイトのサンプルのとおり。ボタンが押されていない間の電圧を一定に保つプルアップ抵抗が入っている。
|
|
|
|
|
|
■ 工夫次第で様々な回路・動作を実現可能
わりと単純な作例ではあるが、Arduinoに簡単な回路をつなげば、様々な動作をすぐに試せることをおわかりいただけたかと思う。後はアイデア次第&工夫次第。
LEDのかわりにリレーを使って外部のアクチュエータを制御したりすることも(裸のマイコンチップとリレーを使うよりは)容易に実現できる。Arduinoにはアナログ入力ピン(ソケット)があるので、各種センサからの信号を受け取り、マイコンによりその入力を処理し、処理結果を出力するようなこともできる。
例えば次の作例。これは、温度センサで感知した信号をArduinoが受け取り、温度上昇・降下に応じてフルカラーLEDの色が変わるというものだ。ArduinoによるRGB温度計、てな感じ。
この作例では、Arduino本体としてブレッドボードに直接挿せてパソコンとのUSB接続も可能なUSB Boarduinoを使用している。知る人ぞ知るLimorさん謹製のArduino互換ボードですな。日本国内でもキットとして購入できる(使用するにはハンダ付け作業が必要)。
さておき、以下に、実際の配線や回路図、使用したソースコードを掲載してみたい。
|
|
|
この作例に使用した“ブレッドボード上での使用にかな~り適したArduino互換機”ことUSB Boarduino。USBコネクタのサイズと比べるとわかるように、非常に小型である
|
完成したRGB温度計。色温度計じゃないヨ!! 温度によってフルカラーLEDの色が変わるんダ!! てゅーか、写真では見づらいが、手前にあるトランジスタのような黒いデバイスが温度センサ───ナショナルセミコンダクタ製のLM35Dを使用している
|
RGB温度計の回路図。主なパーツは、フルカラーLED、温度センサ(LM35D)、C-MOSオペアンプ(NJU7015/JRC製)あたり。あ、あとArduinoですな
|
RGB温度計サンプルプログラム(スケッチ)
// RGB温度計 by Musashinodenpa
int prev, t;
void black() {
analogWrite(3, 255);
analogWrite(5, 255);
analogWrite(6, 255);
}
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
prev = 0;
black();
}
void loop() {
t = analogRead(1); // ANALOG1から読み込む
Serial.println(t, DEC); // ホストPCへ送信
black();
if(t > prev) analogWrite(3, 192); // 温度が前回より高い=赤
else if(t < prev) analogWrite(5, 128); // 低い=青
else analogWrite(6, 220); // 変わらない=緑
prev = t;
delay(500);
}
|
|
|
|
【船田コメント】
このソースのポイントはanalogRead。ピンにかかっている電圧を1024段階の値として読み取る命令だ。回路にはオペアンプを入れて、温度センサの出力を増幅してからArduinoに渡しているが、温度の上がり下がりだけに着目するなら、なくてもいいのかもしれない。
ソースのなかにSerial.printlnという命令がある。これは読み取ったセンサの値をUSB経由でPCに送る目的で入れてある。PC側では、単純なシリアル通信によりこの値を取り込むことができる。
なお、上の動画撮影に使ったバージョンは、色の変化をなめらかにするため、このソースよりも少し複雑な処理をしている。掲載用のソースは簡単化のため単純に0.5秒おきの温度の上下でLEDの色を変化させるよう変更した。センサの出力の揺らぎに応じて、パカパカと目まぐるしく色がかわるので、かえってこっちのほうが面白かったかもしれない。
|
|
|
|
|
|
■ Arduinoでブロック崩し!?
最後に、Arduinoでこんなコトまでデキるよーん、という作例をヒトツ。
てか、結論から言うと「Arduinoでポン(Pong;ピンポンゲーム)を作った人がいるけど、ソレが可能ならゼヒ!! 我々はブロック崩しゲームを作ってゆきたい!!」と意気込んだ船田戦闘機さんが開発途中のプロジェクト。名付けて、Arkaduino。アルカノイド+アーデュイーノ=アルカデュイーノなのかーッ!! みたいな。
|
|
|
進行中のアルカデュイーノ(Arkaduino)プロジェクト。Arduinoはショート防止のために樹脂ケースに入れている。実際に使う場合、不意にショート事故を起こすのを防ぐため、こういったケースに入れての使用をオススメする
|
パドル(ボールを跳ね返す部分)の操作は可変抵抗(ボリューム)で行う
|
出力はNTSC。端子はRCAピン。つまり、テレビやビレオレコーダーのビデオ入力端子に接続し、画面上で動作を見ながら遊べるのだ
|
|
【動画】クリックで再生 開発途中のアルカデュイーノをプレイしている様子。やや見づらいが、ボリューム操作でパドルが動いていることがわかる。崩すべきブロックはまだなく、ボールがパドル等に当たって跳ね返る角度も一定だったりする。音も出ない。が、ボールの速度が徐々に上がっていく。案外、ソレだけでも楽しめたりしますヨ!!
|
|
|
|
|
【船田コメント】
Arduinoで作ったものを、○○デュイーノと呼ぶと愉快だと思った。
実をいうと、タイミングにシビアなビデオ表示モノは、Arduinoで作るには不向きな題材。でも、不完全で良ければできちゃう。完全を求めないゆるい態度であれこれ試してみるのがArduinoの楽しい使い方である。
ちなみに、アルカデュイーノはArduinoサイトで見つけたNTSC画像の表示例をベースにしている。全部自分で作るとなるとシンドイことでも、先人の功績を土台にするとラクだし速い。ありものに乗っかって素早く先に進めるのがオープンソースの魅力。アルカデュイーノも、もう少し完成度があがったら公開します。
|
|
|
|
|
|
てなわけで、食わず嫌いせず、イジってみると夢広がるArduinoの世界。イロイロやるには、すこ~しだけ電子工作の知識なんかも要るが、先人がたくさんプロジェクトを公開してくれている。これらを参考に、自分独自のプロジェクトを作って楽しんでみたりして欲しい!!
■ URL
Arduino(英文)
http://www.arduino.cc/
2008/07/07 13:41
|