読者です 読者をやめる 読者になる 読者になる

そのボード、僕が積んでおきます。

たくさんの電子工作基板が積みっぱなしになってるので、頑張って工作しようとしていますが、どんどん溜まっていっております。

ArduinoでLチカしたその後に【前編】長文注意

Lチカを超える

Arduinoを最初に買ったのは、多分2009年、Arduino Duemilanoveだったと思う。

その当時は今と違ってネット上にもそれほど情報が多くなく、当時島根県にいて通販でArduinoだけを買ってしまった僕にとって、できることはLチカだけだった。

「電子回路で論理回路を組まなくても、簡単なプログラムで処理ができるんだなぁ」というそのくらいの感想。電子回路が苦手でソフトウェアのプログラミングはわかる僕にとって、電子回路が身近になるかもしれない、といううっすらとした感覚はあったけど、決して「これはすごい」と感じるまではいかなかった。

 

結果、2012年までそのままArduinoを放置してしまった。

 

なんでまたやろうと思ったのか、今となっては覚えていない。ただ、その時、書店に並んでいるこの本を手にとった。 

Arduinoをはじめよう 第2版 (Make:PROJECTS)

Arduinoをはじめよう 第2版 (Make:PROJECTS)

 

 この本は、本当にArduinoの、思想というか、考え方のようなことがしっかりと書いてあって、初学者が読むのには最適な本。今見てもやっぱり面白い。

後半半分以上はリファレンスになっている。最新の情報は、Arduino本家

Arduino - Referenceを見るのが良いが、この本になったリファレンスは、電車の中などで、Arduinoがどんなことができるのかを知るのに眺めるのにも最適だ。

Arduinoを持っていて、この本をもし買っていないのなら、是非買うことをおすすめする。

 

そして、この本を楽しむのに最適なキットがこれ。Arduinoを持ってる人に取ってはArduinoがかぶっちゃうけど、正直2つ3つ持ってても困らないので、これ買っちゃってもいいと思う。 

Arduinoをはじめようキット

Arduinoをはじめようキット

 

 余談だけど、このキットに含まれている部品は、比較的よく使うものなので、同じ部品をある程度揃えておくと色々役に立つと思う。参考までにキットにはこんなものが含まれている。

 

  • Arduino Uno R3(マイコンボード) 1個
  • 堅いジャンパワイヤ 1セット
  • 柔らかいジャンパワイヤ10本セット 1セット
  • 1kオーム抵抗(茶黒赤金) 3本
  • 330オーム抵抗(橙橙茶金) 1本 「Prototyping Lab」P.106
  • 10kオーム抵抗(茶黒橙金) 2本
  • 270オーム抵抗(赤紫茶金) 1本
  • ブレッドボード 1個
  • USBケーブル 1本
  • LED 3個(3種類)
  • タクトスイッチ 1個
  • CdSセル 1個
  • MOS-FET 1個
  • ダイオード 1本
  • ガイドシート 1枚 写真、説明

 

実際この本で試せることはとても限られている。Lチカから一歩踏み出すギリギリといったところ。でも、この本を読んでしまえば、もっとArduinoのことを知りたくなっているに違いない。実際、この後数冊、Arduinoの書籍を購入した。

ただ、他の本は、あまり僕には刺激的じゃなくって、悶々としたままに過ごしていたが次に出会った刺激的な本がこちら。

 

Making Things Talk ―Arduinoで作る「会話」するモノたち (Make:PROJECTS)

Making Things Talk ―Arduinoで作る「会話」するモノたち (Make:PROJECTS)

 

この本では一気に「何かを作る」というところに話が進む。「なるほど、こういうふうにすればこんなことができるのか」という、自分ができることの範囲が一気に広がったイメージ。ただ、これ、本当に全くこの時の自分でできる気がしなかった。でも、できることのイメージを持つってことはとても大切だ。

 

この中間的なものとして、この本などはちょうどいいだろう。 

Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ (Make:PROJECTS)
 

こういった、他の人がどんなものを作ったのかを見るのはいい刺激になる。定期的に開催されているMake: Japan | Maker Faireなどに行くのもいいと思う。今回のエントリーでは、いろいろな人が作ったArduinoもしくはArduino互換のデバイスも紹介したい。

 

さて、そうしてArduinoに興味持っちゃって、Lチカまではしたよ、という人に、僕がArduino(とか、他のマイコンプラットフォームなど)にはまっていった経験から、次の一歩はこんなことしたらいいんじゃないの?という情報をおすすめしてみたい。

 

方針

ArduinoでLチカできた状態というのは、Arduinoでの最低限のお作法が理解できたという証拠。ピンの働きの最低限の制御ができるようになったというところ。

 

ここから先は、色々な入力が使えるようになって、色々な出力ができるようになると楽しい。上手く動いたことが直感的にわかることが重要だと思っている。面白ければ続けられる。

 

なので、色々な入出力を試すことと、その入出力の制御に関しては、できれば純正もしくは誰かが作ったライブラリを使わせてもらうことにしよう。楽しいのが一番!あとは組み合わせていけば色々なものが作れるようになっているはずだ。

 

ということで、スタート。

 

ぼんやりLチカしてみる

基本的なLチカは、ピンから「HIGH」と「LOW」を出力することで、LEDが「点く」と「消える」を処理するもの。いわばONとOFFのデジタル処理。

これを「うっすら点く」とか「徐々に消える」などのアナログ的な処理をするのがPWM(pulse width modulation)という機能。実際にはONとOFFを高速で繰り返し、ONの時間がどの程度多いのか、で明かりの強さをコントロールする技術。

Arduinoのピンのうち、~が付いているピンで利用することができる。digitalWrite()ではなくanalogWrite()を使い、値もHIGHとLOWではなくて、0〜255を使う。0の時は消灯、255は完全点灯、その中間で数字が大きいほうが明るく点く。

 

Arduinoチュートリアル 基礎編

この説明にもある通りExamplesの中の03.AnalogのFadingをまずは試してみて欲しい。このスケッチだと、LEDのアノードを9ピンに、カソードをGNDピンに接続する。

 

また他には、少し詳しい説明は例えばここなど。

PWMを使って明るさを制御する | 3Dプリンターの比較・価格・3D素材なら、Japanese Makers

 

点いたり消えたりのLEDに比べて、なんとなく「鼓動」っぽい感じがする。シューティングゲーム古典の名作「ゼビウス」でも敵は赤い光を鼓動のように光らせてなんとなく意思を持っているように感じられるように作られている。

どんなテンポで光らせるとどう感じられるのか、色々試してみるだけでも遊べるだろう。

 

フルカラーLEDを使ってみる

http://akizukidenshi.com/img/goods/L/I-01444.jpg

Lチカで利用したLEDは、単色で光るLEDだったと思うけど、ひとつの部品の中に「R(ed)」「G(reen)」「B(lue)」の3色のLEDが入っていて、その3つのLEDの光をコントロールすることで、その組み合わせで色々な色を光らせることができるのがフルカラーLEDと呼ばれるもの。

 

例えばこんな商品

角型フルカラーLED OSTA71A1D−A アノードコモン (10個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

RGBフルカラーLED 5mm4本足 OSTA5131A カソードコモン 10個入: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

 

各色をHIGHとLOWで処理すれば、各色ON,OFFの全8パターン、すなわち8色で光らせることができる。RだけHIGHにすれば赤、RとGをHIGHにすれば黄色、と言った具合だ。全部をHIGHにすれば白だ。

各色をanalogWrite()で処理すれば、各色256で、論理的には約1600万色のパターンを表示可能となる。これだけ細かいの人間の目ではあまり差が感じられないので「フルカラー」と呼ばれる。

 

フルカラーLEDは全部で4つのピン、RGBそれぞれに対応するピン3本と、残る1本は「コモン」と呼ばれるピンで、LEDのアノード側がまとめられているか、カソード側がまとめられているかのパターンがある。アノード側がまとめられている場合はそのピンをVCCなどに接続、カソード側がまとめられている場合はそのピンをGNDなどに接続して使う。

それらをそれぞれ「アソードコモン」「アノードコモン」と呼び、複数のLEDを扱う部品ではよく出てくるキーワードになる。

 

これまでのLチカは、HIGHアクティブの回路、すなわちピンをHIGH(analogWriteなら255)にすれば光る、というものだったと思うが、ここではせっかくなので「アノードコモン」のフルカラーLEDを用いて、「LOWアクティブ」の回路を作ってみる実験をしてて欲しい。

 

例えばここなどを参考に

フルカラーLEDの実験

 

この回路では、analogWriteの数値が大きくなればなるだけ暗くなるので、好みの色がどうやったら作れるか、試してみたい。

 

色というのは、結構ダイレクトにイメージを伝えてくれる。赤ければ「危険」とか「熱い」とか、青なら「安全」とか「冷たい」とか。こういうイメージを利用すればこんな工作ができる。

 僕が以前作ったものがこれ。

f:id:hine:20150127030020j:plain

これは、ガンダムの頭部にフルカラーLEDを仕込んだもの。CIツールであるJenkinsでのテスト結果がオールグリーンなら目が緑色に、エラーが出れば赤に、ガンダムの目が光るというデバイスだ。残念なことに光った写真が手元になかったのでわかりにくいし、実は写真の状態では制御はArduinoじゃないけど、Arduinoとつないで使うこともできるようになっている。

フルカラーLEDが使えるというだけで、色々と面白い工作ができるようになる。

 

ボタンを使ってみる

http://akizukidenshi.com/img/goods/C/P-03647.JPG

人間の意志をデバイスに伝えるには、どうしてもヒューマンインターフェイスが必要となる。その最も基本的なのが、このタクトスイッチと呼ばれる押しボタン。

タクトスイッチ(黒色): パーツ一般 秋月電子通商 電子部品 ネット通販

 

例えば、ここなんかにArduinoでの使い方の説明がある。

Arduino Tutorial

大抵の入門書でLチカの後はタクトスイッチを追加して、LEDのON/OFFをコントロールしてみるようになっているはずだ。

Lチカがピンからの出力であるのに対して、タクトスイッチはピンで入力を読むことになる。この2つを 入出力の基礎ができるようになる。

 

コマンドはdigitalRead()を使う。

 

写真タイプのタクトスイッチの面白いところというか注意点としては、タクトスイッチから2つのピンが出ているけれど、それぞれ2つずつは最初からつながっているという点。ボタンはその2つのペアをつなぐためのスイッチになっている。

 

簡単な説明をすると片方をVCC側のラインにつなぎ、もう片方をArduinoのデジタルピンにつなぎ、そのピンをpinMode()で入力(INPUT)に指定。ボタンを押している時はdigitalRead()がHIGHを返してくる。(本当はプルダウン抵抗が必要なので、記事を参考に抵抗も入れること)

この回路は、上のフルカラーLEDでも触れたが、アクティブの時に値がHIGHになるHIGHアクティブの回路となっている。

 

ところが、pinMode()にはINPUT_PULLUPという指定ができる。詳しくは以下の記事を見るといいと思うが、これを使いLOWアクティブなスイッチ回路を使うとずいぶんとシンプルな配線になる。

意外と知られていない?INPUT_PULLUP | スイッチサイエンス マガジン

このやり方だと、ボタンを押していないときにHIGH、ボタンを押すとLOWの値がとれる、LOWアクティブな装置になる。

直感とは逆なイメージもあるが、ボタンを離れた場所に設置する場合などに、ボタンがONでなければボタン側にはGNDにつながるラインがくることになるので、途中で線のトラブルが合った時などにも比較的安全だ、ということで、LOWアクティブの方がいいという話を聞いた。

なによりも、部品点数を減らせるのは魅力的なので、ぜひともこのLOWアクティブなタクトスイッチの使い方をマスターしておきたい。

 

音を出してみる

http://akizukidenshi.com/img/goods/L/P-01251.JPG

圧電サウンダ(スピーカー)という部品を使って、Arduinoから音を出してみる。視覚の次は聴覚に訴えてみよう、という試み。

Lチカと同じように、出力ピンとGNDだけで使えるのでとてもお気軽で、その割に効果が大きい。

 

圧電サウンダと言うのはこういう部品

圧電スピーカー(圧電サウンダ)(13mm)PKM13EPYH4000−A0: パーツ一般 秋月電子通商 電子部品 ネット通販

圧電スピーカー(圧電サウンダ)SPT08(2個入): パーツ一般 秋月電子通商 電子部品 ネット通販

 

一番簡単に使うなら、片側を出力ピンに、もう片方をGNDに接続し、Arduinoの標準のtone()命令を使うのがいい。

Arduino - Tone

Arduino 日本語リファレンス

arduino使い方:圧電スピーカでメロディを鳴らす

 

ArduinoのExamplesの02.Digitalの中にtoneMelodyというサンプルがあり、このコードを読むと使い方がわかるだろう。Examplesでは8番ピンを利用しているようだ。

音を使うことができるようになれば、見えない場所、視覚に頼れない場合などでもフィードバックができるようになる。赤いLEDの点滅と警告音の組み合わせがあれば、強い注意を引く事もできるだろう。

 

なお、tone()コマンドを使うと、3番ピンと11番ピンのPWMが使えなくなってしまうので注意。

 

応用編としては、tone()命令では単音しか出力できないが、6重和音まで出力できるライブラリを作っている人がいる。

PWMDAC_Synthライブラリ Wiki - SourceForge.JP

この人がこのライブラリを使って作ったArduino互換の電子楽器「CAmiDion」はとてもおもしろいので、チャンスがあれば作ってみて欲しい。

f:id:hine:20141207191510j:plain

CAmiDion - MIDI Chord Helper Mobile - 簡単に和音を弾ける電子楽器

 

情報を表示する1(7セグメントLED)

http://akizukidenshi.com/img/goods/L/I-00639.jpg

7セグメントLED(数字をデジタルで表示できる)を用いれば、簡単な情報を表示できるようになる。

超高輝度赤色7セグメントLED表示器 1文字アノードコモン ボディ黒 A−551SRD: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

 

7セグメントLEDも、それぞれのセグメントにLEDが入っている、LEDの集まりのような部品。フルカラーLEDと同じように、アノードコモンとカソードコモンのものがある。

 

内部的にはたくさんのLEDが入っているだけなので、適切な抵抗を入れておく必要がある。Lチカも、フルカラーLEDも、そしてこの7セグメントLEDも、LEDを光らせるのにArduinoの5Vはちょっと強すぎることが多いのでデータシートなどから計算した抵抗を入れることが望ましい。厳密に計算通りでなくてもザクっといくつかの抵抗持っておいて、手持ちのもので近いものを使えばいいんじゃないかと思う。

試してみるだけの時などは、面倒なのでLEDにはとりあえず270Ωや330Ωとかの抵抗入れてしまっているけど、本当はちゃんと計算した方がいい。

LEDの電流制限抵抗の求め方

LEDの抵抗値計算

とは言え、計算して求められた抵抗値に一致する抵抗を持っているかというと持っていないことも多いし、じゃあ色々な数値の抵抗を予め用意するのも大変。ということで、僕は可変抵抗器を幾つか用意している。

半固定ボリューム (1kΩ) 3362P−1−102LF: パーツ一般 秋月電子通商 電子部品 ネット通販

半固定ボリューム (1kΩ): パーツ一般 秋月電子通商 電子部品 ネット通販

多回転半固定ボリューム たて型 3296W (1kΩ): パーツ一般 秋月電子通商 電子部品 ネット通販

これらの可変抵抗を100Ω、1KΩ、10KΩくらいのバリエーションで5〜10個ずつくらい買っておくと、色々な回路で特定の抵抗値が必要になった時に便利だ。

 

話を戻そう。

 

7セグメントLEDの作例は、ここなんかを参考にするといい。

arduinoで1桁7セグLEDをカウントアップ。 - つくったブログ

 

原理は比較的簡単。各ピンがそれぞれどこかのセグメントに対応しているので、対応している場所のピンをコントロールしてあげるだけ。

 

0から9の数字、あとは工夫次第でアルファベット的な表示なんかもできる。例えばこれで数字を表示できるようになれば、ランダムで数字を表示する電子サイコロ、なんかもつくることが可能になる。

タクトスイッチと、スピーカーを合わせれば、簡単なゲームも作れてしまう。ArduinoではなくPICでの作例だけど、こんな感じで4つものを実装している例もある。

松田工作の親子で電子工作: 7セグLEDゲーム×4

 

情報を表示する2(ドットマトリクスLED)

http://akizukidenshi.com/img/goods/2/I-05163.jpg

8x8のLEDを一つにまとめたもの。ちょっとしたグラフィック表示的にも使える。

赤色ドットマトリクスLED 8x8ドット OSL641501−ARA: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

理屈上16pinが必要。この8+8の出力で8x8の64個のLEDがコントロールできるマトリックスの概念はものすごく重要。覚えておくと応用が効く。このあとで出てくるボタンのマトリックス化にも同じ考え方が使われる。

 

応用としては、利用するピン数の削減のために、マルチプレクス使ったり、IC使ったりする例をあげておく。

 

  • Charlieplexing

http://ikkei.akiba.coocan.jp/ikkei_Electronics/WelCome_files/Charlieplexing%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E8%80%83%E5%AF%9F.pdf

Charlieplexing 7SEG LED by ikkeiモジュールとドライブモジュール | メモたんくメモたんくCharlieplexingは7セグメントLEDでも有効

 

Charlieplexingを用いたArduino互換機としては、


これがとてもおもしろい。小さなドットマトリクスLEDのデバイス。これだけの部品でこんなデバイスが作れるんだ!とビックリすること間違いなし。

 

  • 3出力を8出力に変換するIC、74HC138を利用する

3ピンだけで8ピン分の出力をコントロールすることができるようになるのが、この74HC138というICを用いた作例。

8x8ドットマトリクスLED #1 - 思い出はいつまでも

 

PCとデータのやりとりをする(シリアル通信)

ArduinoはUSBケーブルで接続したPCとの間でシリアル通信で情報のやりとりができる。これそのものは地味だけど、プログラムのデバグをしたりにも役に立つ。

 

Arduino - Serial

Arduinoを始めよう!(1)シリアル通信編 | Think IT(シンクイット)

arduinoIDEの使い方:シリアルモニターの使い方

 

Arduino側でSerial.begin(9600)して、ArduinoIDEのツールからシリアルモニタを開くと、Arduinoとのシリアル通信が可能な状態となる。お手軽につなげるので使わない手はない。

 

応用編としては、シリアル通信が使えれば、Chrome packaged Apps APIで、ブラウザからJavaScriptで数値を取るウェブアプリが作れる。

JavaScript + Chrome Packaged Apps API を使用したシリアル通信Webアプリ | Tech-Sketch

加速度センサーをコントローラーにしたゲームを作ってみたことがあるけど結構面白かった。自分でもゲームコントローラー作れるんだなぁ。

 

やばい、まだまだ書きたいことがあるのだけれど、かなり長くなってしまった。ちょっとずつ書き溜めてるのでこのままだとしばらく公開できないかもしれない、ということで、ひとまずここまでを前編としてひとまず公開する。

 

そして、後編に続く。