2021年10月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

最近のトラックバック

« 2014年6月 | トップページ | 2014年8月 »

2014年7月

2014年7月 5日 (土)

知らないとソン!? Arduinoの小ネタ色々

 知っている人には当たり前だけど、知らないでいるとソンしちゃうかもっていうArduinoの小ネタを集めてみました。

 2015/2/10 追記:Arduino IDE 1.6.0が公開されました。1.5.x Betaからのバージョンアップですが、Betaが取れて今後はこちらがメジャーバージョンになる様です。しかしながら、以下の記事は1.0.x系(最終?バージョンは1.0.6)を対象に書かれている部分も有りますのでご注意下さい。

◯回路と連動したスケッチ(プログラム)の小ネタ

■アナログ入力ピンはデジタル入出力ピンとしても使える
 意外とこれを知らずにArduinoのピンが足りないと悩んでる方が多いんですよね。Arduino Unoの場合、アナログ入力ピンの0〜5番をデジタル入出力ピンの14〜19として使えます。
 例えば出力に使いたければ pinMode(14,OUTPUT); と設定して、digitalWrite(14,HIGH); で出力などと普通のデジタル入出力ピンと同様です。
 これはArduino mini/Pro/Pro mini/FioなどATmega328P/168使用のマイコンボードでも同じに使えます。
 またArduino Mega 2560ではアナログ入力ピンの0〜15をデジタル入出力ピンの54〜69として使えます。Arduino LeonardoはUnoと似ていますが、番号はちょっとずれてアナログ入力ピンの0〜11番がデジタル入出力ピンの18〜29として使えます。もっともアナログ入力ピン番号6〜11は元々デジタル入出力ピンの場所にあるのですが。

その際、A0〜A5などとマクロ定義されたピン番号を使うと便利
 上記の小ネタ、マイコンボードが違うと配置上は同じアナログ入力ピンなのにデジタル入出力ピンとして使う番号が違っていると共通化出来なくて不便ですね。そこであらかじめシステムで設定されているマクロA0〜A5を使うと、その違いを吸収出来ます。先の例なら pinMode(A0,OUTPUT); と設定して、digitalWrite(A0,HIGH); で出力という感じです。これならArduino Uno/Mega/Leonardoなどで共通のスケッチを書く事が出来ますね。Arduino Unoだけで使う場合でも一々何番に対応するのか思い出さずに済みます。

INPUT_PULLUPを使うとプルアップ抵抗を省略出来る
 デジタル入出力ピンで押しボタンスイッチなどを繋ぐ場合、押されていない時の入力電圧を作るためプルダウンあるいはプルアップ抵抗が必要ですよね。ところがこの内のプルアップ抵抗はマイコンチップ内部に同等の機能を持ってるのです。ピンモードの設定でINPUT_PULLUPキーワードを使用すると有効になるので、外部のプルアップ抵抗を省略出来ます。
 例えば pinMode(2,INPUT_PULLUP); といった感じ。これで2番ピンがマイコン内部の抵抗を介して電源レベルに繋がるので、あとは2番ピンにボタンを繋ぎ、ボタンのもう片方をGNDに繋げばOKです。digitalRead(2) ではボタンが押されていない時にHIGH、押された時にLOWになるので、それに対応したコードを書いてください。
 こちらの記事もご参照ください。「意外と知られていない?INPUT_PULLUP」

◯Arduino言語の小ネタ

Arduino言語のベースはC++
 これは多くの方がお分かりかと思いますが、Arduino言語のベースはC++です。これにArduinoの独自のファイル群が裏で付け足されているので、ユーザーが書くスケッチ(プログラム)は非常に簡潔になる様に出来ています。C++そのものは奥の深い割と難しい言語かもしれませんが、Arduinoでは(C++以前の)C言語をちょっとかじった位の知識で書ける様に出来ています。
 ところでArduino IDEそのものはJAVAで開発されていて、IDEの元になったProcessingはその言語もJAVAベースです。なのでArduino言語もJAVAベースと勘違いされやすいですが、C++ベースなのでお間違いなく。

printしたい文字列はF関数で囲むと変数メモリの節約になる
 シリアルやLCDに文字列を出力したい場面も結構有りますね。ところがやたらとprint関数を使うとSRAM(変数などに使われるメモリ)を無駄に消費してしまいます。なぜかというと、たとえ出力したい物が""で囲んだ文字定数だとしても、AVRマイコンの仕組み上、起動時にFlash(プログラムが格納されるメモリ)からSRAMに丸々コピーされ、それが実行時に読み出されるからです。
 そこで、print関数に書く文字定数は(マクロ定義された)F関数で囲みましょう。これを使うと直接Flashから読み出しながらprintしてくれるので、SRAMの消費を抑えられます。例 Serial.print("TEST"); Serial.print(F("TEST")); といった感じです。特にバグも無さそうなのに動作が不安定の場合、SRAMが不足している事が考えられますので、こちらの対策をしてみて下さい。

◯Arduino IDEの小ネタ

ライブラリはArduino IDEフォルダのlibrariesに入れるより、スケッチフォルダにlibrariesフォルダを作って入れる方が楽
 Arduinoの魅力は各種センサやアクチュエータ(出力機器)のライブラリが色々発表されている事ですね。そこでそれらのライブラリをダウンロードして取り込む必要が有るのですが、どこに保存したら良いでしょうか?Arduino IDE標準のライブラリが置かれているフォルダを探し出して、そこに入れ込む方もいらっしゃる様です。でもこれって結構めんどうな場所にありますよね。
 実はスケッチを保存しているフォルダにlibrariesフォルダを作成してそこにダウンロードしたスケッチを置く事が出来ます。Windowsなら「ドキュメント」→「Arduino」→「libraries」、macなら「書類」→「Arduino」→「libraries」になると思います。Arduino IDEが置かれているフォルダは管理者権限が無いと開けなかったり面倒ですが、スケッチを保存しているフォルダならアクセスも簡単ですね。
 ところで、残念ながら今の所librariesフォルダは階層管理する事が出来ません。ダウンロードしたライブラリ毎のフォルダを直接librariesフォルダの中に置いて下さい。本当はlibrariesフォルダの下にSparkFunとかAdafruitとかSeeedStudioなんてフォルダを作ってまとめたいんですけどね。

ライブラリを手動でフォルダに入れた時は、Arduino IDEを再起動しないと認識しない
 さて、ライブラリを適切なフォルダに保存したのに、Arduino IDEにそのライブラリも「スケッチの例」も出て来ないと焦った方もいらっしゃるでしょう。ライブラリは起動時にチェックされてIDEのメニューに登録される様なので、その場合、一旦Arduino IDEを終了し、再度立ち上げて下さい。

■ライブラリの取り込みには「Add Library…」を使うと便利
 ここまでライブラリの取り込み方法を説明して来ましたが、実はArduino IDEのメニューから「スケッチ」→「ライブラリを使用」→「Add Library…」を使うと簡単です。ダイアログからフォルダもしくはzipファイルを選択するだけでスケッチフォルダの下のlibrariesフォルダにコピーを作成し、直に使用可能に設定してくれます。これは便利ですね。

■追加マイコンボードのサポートファイルもスケッチフォルダに置ける
 ライブラリ程ダウンロードする機会は少ないと思いますが、Arduino互換機で専用のサポートファイルをダウンロードして使う場合が有ります。その時もArduino IDEのあるフォルダには追加せず、スケッチフォルダの下に「hardware」フォルダを作ってそこに置く事が出来ます。ライブラリ同様Arduino IDEを再起動させて認識させましょう。

Arduino IDE左下にカーソルの現在位置行番号が表示される
 本当に小ネタ中の小ネタですが、気が付かないと分からないのでご紹介です。Arduino IDEの左下に表示されてる数字、なんだろう?と思われた方も多いはず。これがカーソルの現在行番号なんですね。ちなみに右には選択しているマイコンボード名とシリアルポート名が表示されています。

スケッチをアップロード出来ない原因のほとんどは、マイコンボードやシリアルポートの選択間違い
 Arduinoあるあるネタですね。自分では間違ってないつもりでもまったくの思い込みだったなんて事が結構あります。上のネタに有る様にArduino IDE右下の表示で確認出来ます。そこが間違っていないようならこちらの記事をご参照下さい。「Arduinoトラブルシューティング アップロード編」

インデントの自動整形が出来る
 インデントが綺麗に整ったコードはとても読みやすいですね。だけどコードを作成している時にいちいち揃えるのは面倒と思う方もいらっしゃるでしょう。そんな方のための機能がメニューの「ツール」→「自動整形」です。書式のお作法に特にこだわりが無い様でしたらこれで十分。

ArduinoをAVRライターにする事が出来る
 Arduinoのマイコンチップに書かれているブートローダーがおかしくなったりした時の修復や、自作でArduinoを作りたい時などにAVRライターが必要になります。今では買っても3000円ちょっとですが、1台Arduinoを持っているならそれをAVRライターとして使う事が出来ますので、活用しましょう。Arduini IDEのメニュー「ファイル」→「スケッチの例」→「Arduino ISP」でスケッチを呼び出してArduinoに書込むだけでArduinoをAVRライターとして使う事が出来ます。
 詳しくはこちらの記事をご参照ください。「Arduino を AVR  プログラマ(ISP: In-System Programmer)として使う」
 上記記事中にArduini Unoが出て来ませんが、Arduino Duemilanoveと同様に使用出来ます。原文(英語)ではUnoも追加されています。
 もし、AVRライターで書き込みに失敗してマイコンチップが反応しなくなったら、こちらの記事を参考に修復をお試しください。「ATmega48/88/168/328用のヒューズリセッターをArduinoで作る」

◯マイコンボードの機種別

Arduino Unoを使いたいのにUSBケーブルを忘れたら、プリンタ用のUSBケーブルを転用する
 Arduino Uno(あるいはArduino Mega 2560)を買ったり、学校や職場から持ち帰ったのにUSBケーブルを買い忘れた/持ち帰り忘れたなんて事態の時には、パソコンとプリンタを繋ぐUSBケーブルを見てみて下さい。そこにUSBの標準A-標準Bケーブルがあるはずです。これがArduino Unoにも使えますね。諦めずに楽しい週末工作を。

Arduino Pro MiniとArduino Miniは別の製品
 小型のArduinoとして人気のArduino Pro Miniですが、Arduino IDEで選択する時にちょっと探しにくいです。マイコンボード選択のリストでは Arduini Mini が先に出て来ますが、こちらは別の製品です。もうちょっと下に Arduino Pro or Pro Mini がいくつか出て来ますので、こちらから該当のスペックの物を選んで下さい。回路的にはほとんど同等の物なのですが、スケッチの転送速度が違っているので、正しく選ばないとスケッチのアップロードが出来ません。
 ちなみにArduino Pro MiniはアメリカのSparkFunがライセンス生産していて、Arduino MiniはイタリアのArduinoチーム本家の製品です。何故か日本ではライセンス生産版の方が数多く流通している様ですね。

Japaninoは最新のArduino IDEでも使える
 学研「大人の科学マガジンVol.27 テクノ工作セット」 付録のJapaninoは書店で買えるArduino互換機で、説明書(雑誌本体)が付いているのでこれから入る方も結構いらっしゃる様です。ところが残念な事に発売からかなり時間が経っているので、ダウンロード出来る対応IDEのバージョンが随分古い物になってしまいました。折角ですから最新のIDEで使いたい物ですね。実は最新Arduino IDEでも「ツール」→「マイコンボード」→「Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168 」もしくは「Liliypad Arduino w/ ATmega168」を選べば使えます。
 専用IDEと同様に「マイコンボード」のリストに「Japanino」を表示させて選択出来る様にしたい方は、Japanino_サポートファイル「japanino_.zip」 をダウンロードして解凍し、スケッチフォルダに「hardware」フォルダを作って、その中に解凍した「Japanino」フォルダを置いて下さい。
 USBシリアル変換チップのドライバもメーカーサイトから最新版をダウンロードした方が良い様です。CP210x USB - UART ブリッジ VCP ドライバ

Arduino Leonardoの0,1ピンに出ているシリアルはSerialではなくSerial1
 基板形状やピンソケットの配置はArduino UnoにそっくりなArduino Leonardoですが、色々とUnoとは違う所があって中々の曲者です。その内の一つがシリアル機能の扱いですね。UnoではPCとの接続もピンソケットの入出力ピン0,1番もSerialで兼用されていますが、LeonardoではPCとの接続にはSerialで変わらない物の、ピンソケットの入出力ピンはSerial1を使ってアクセスします。XBeeなどのシリアルを使ったデバイスとの通信にはスケッチの該当箇所を変更しないといけませんのでご注意ください。
 その他Arduino Leonardoには、気が付きにくいUnoとの違いも色々あるので、いずれ1つの記事としてまとめたいと思っています。

 さて、色々な小ネタをご紹介しましたが、いかがでしたでしょうか?もし追加でこれも入れて欲しいなど、ご要望・ご意見がありましたら、ぜひTwitterの@maris_HYへご連絡ください。よろしくお願いします。
 もちろんこちらのブログにコメントいただいても結構です。ただし投稿後、こちらの手作業で公開するまでは書込まれたコメントが表示されませんので、ご注意ください。
2014/07/09 追加マイコンボードのサポートファイルの項目とJapaninoサポートファイルのダウンロードを追記しました。

« 2014年6月 | トップページ | 2014年8月 »

ウェブページ

無料ブログはココログ