2015年12月
    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年5月 | トップページ | 2014年7月 »

2014年6月

2014年6月19日 (木)

Arduinoトラブルシューティング アップロード編

 Arduinoを使っていると色々なトラブルに遭遇しますが、よくある事例やハマりやすい事例などを、トラブルシューティングとしてまとめたいと思います。全体ではインストール→コンパイル→アップロード→実行(回路・プログラム・PC連携)などが有ると思いますが、今回はアップロード編です。

■最初にする事
 なぜかArduinoにアップロードが出来ないなぁと思ったら、まず次の事を行いましょう。
  1. USBケーブルをPCから抜きましょう。(外部電源が有ったらそれも)
    電気的な問題が原因である可能性もあるので、まずは電源を断ちます。
  2. 深呼吸をして落ち着きましょう。
    あわててチェックしても見落としが必ず出ます。まずは落ち着いて下さい。
  3. Arduinoを置いている場所に問題が無いかチェックして下さい。
    Arduinoは基板がむき出しです。金属の上に置いてしまうと回路がショートしてしまいます。またパーツの切りくずの上に乗ってしまっている事もあり得るので、裏返して確認しましょう。
  4. 回路にミスが無いかチェックして下さい。
    回路でショートや断線や接続ミスが無いかチェックして下さい。特に電源のプラス(5Vや3.3V)とマイナス(GND)のショートがあると危険です。
    (回路のチェック方法やミスのあるあるについては、また別の機会に解説したいと思います。)
    回路のミスが見つけにくそうな場合、一旦すべての接続を外しArduino単体にして、以下のチェックを進めるとよいでしょう。
  5. デジタルI/Oの0番ピン,1番ピンの接続を外してみましょう。
    多くのArduinoボードではデジタルI/Oの0番ピン(D0:Rx),1番ピン(D1:Tx)をUSB-シリアル変換チップとの接続に兼用しています。ここに他の回路が繋がっているとアップロードが正しく行われない場合があります。一旦このピンへ繋がっているジャンパワイヤやシールドを外して下さい。
 電気的なミスがアップロードに影響している場合、アップロードが出来ないばかりか回路やArduinoやPCのUSB端子の破壊にも繋がりかねません。簡単な回路と思っても、念のためチェックしましょう。

■USBケーブルを挿す前にする事
 回路に間違いが無いと分かっても直にUSBケーブルを挿さないで下さい。その前にチェックしたい項目があります。
  1. Arduino IDEのマイコンボードの選択が合っているか確認して下さい。
    ここを間違ってるはずが無いって思い込みで時間をつぶしてしまう事例が多数見られます。思い込みは禁物です。「ツール」→「マイコンボード」で選択しているマイコンボードと使っているマイコンボードとが一致しているのを確認して下さい。またArduino IDEの右下の所にも選択中のマイコンボードとシリアルポートが表示されていますので、ここを見ても良いです。
  2. そもそもコンパイルに問題が無いか確認しましょう。
    Arduinoの扱いに慣れてくると、つい「検証」ボタンを使わずにスケッチを書いて直ぐに「アップロードボタン」で書き込みしてしまいがちです。ここで、そもそもコンパイルが上手くいっているのかどうか「検証」ボタンでチェックして下さい。
  3. シリアルポートの確認をする為に一覧を記録して下さい。
    現在はUSBケーブルを挿していないので、Arduinoに繋がるシリアルポートは存在していないはずです。このあとUSBケーブルを挿して認識されたポートが選択するべきポートになるので、まずは「ツール」→「シリアルポート」で一覧を表示させ、それを記録して下さい。スクリーンショットを取るかスマートフォンなどのカメラで撮影するのが簡単ですね。
    記録するのが終わったら、一旦一覧を閉じます。(開いたままでは変化を見られません)
 これでやっとUSBケーブルを挿す準備が出来ました。もう一度深呼吸してUSBケーブルをPCに差し込んで下さい。

■USBケーブルを差し込んでからする事
 やっとこれで、PCとArduinoが繋がります。次の手順でチェックしましょう。
  1. シリアルポートが増えているか確認し、それを選択して下さい。
    Arduini IDEで改めて「ツール」→「シリアルポート」の一覧を出すと、先ほど記録した一覧にない新たなポートが出現しているはずです。それが選択選択すべきシリアルポートです。
  2. mac OSXの場合「/dev/tty.〜」と「/dev/cu.〜」の2種類が同時に現れますがどちらを選んでも大丈夫です。
    WindowsでArduino Leonardo,micro,EsploraなどATmega32U4ベースのマイコンボードでファームが古い場合、挿した直後と正常起動後のポートが変わる場合があります。ボード上の「L」LEDの点滅が終わってからポートを確認して下さい。最新のファームの場合、「L」LEDが光らず直ぐに使える様になる様です。

    ※シリアルポートが増えない場合、次の問題が考えられます。
    ・USBシリアルアダプタ部のデバイスドライバがインストールされていない
     あるいはUSBシリアルアダプタ部が正しく認識されていない。
     → ドライバを正しくインストールする。
    ・USBケーブルに不具合がある。(断線している・充電専用ケーブルだった等)
     → ケーブルを交換する。
    ・USBポートに不具合がある。
     → 違うポートや違うパソコンで試してみる。
    ・USBシリアル変換チップが機能していない
     → アダプタの場合は他の物に交換する。
       マイコンボード上のチップの場合は、修理が難しいかもしれません。
  3. 実際のアップロードを行う
    やっとアップロードです。コンパイルのチェックはしているので、「アップロード」ボタンで書き込みを行って下さい。
    エラーメッセージが出ずに書き込みが行われたでしょうか?
  4. それでもアップロード出来なかった場合、リセット技を使ってみる
    Arduino IDEのアップロードボタンを押した後、コンパイルからアップロードに移行するタイミングでマイコンボード上のリセットボタンを押す技です。
    マイコンボードはリセットボタンから手が離れた時点からアップロードの送信待ちに入るので、コンパイル中にリセットボタンを押したままにし、アップロードに移行するタイミングでリセットから手を離すのもやってみましょう。
  5. パソコンを再起動してみる。
    もしかするとパソコンの方に原因があるかもしれません。念のため一度パソコンを再起動してからアップロードを試してみましょう。
■個別の事例
  • Windows 8/8.1 + Unoなど
    Windows 8から署名されたデバイスドライバ以外ではインストール手順が難しくなっています。最新のArduino IDE 1.0.5-r2では修正されているはずですが、上手くいかない場合、こちらの記事をご参照ください。
  • FTDIのUSBシリアル変換チップ + mac OSX
    Arduino Duemilanoveや同等の互換機、あるいはFTDIのチップを使ったUSBシリアル変換モジュールを外付けにしている場合、最新のIDEにはドライバが付いていないので、FTDIのダウンロードページからファイルを取得してインストールする必要があります。こちらの記事をご参照ください。
    またOSX 10.9の場合は、OSにapple製のFIDIチップ用ドライバがあらかじめインストールされていて、これがArduinoと相性が悪いようです。このドライバを使用しない様に設定し、FTDI製のドライバをインストールする必要があるそうですが、手順がまとまっているページを把握出来ていないので、検索等で調べて下さい。
  • Japanino + mac OSX
    Japaninoは学研の「大人の科学マガジンVol.27」の付録マイコンボードで、Arduino互換です。ですがUSBシリアル変換に純正のArduinoとは違った物を使っているためドライバの相性問題が出ています。大人の科学マガジン本誌やQ&Aにも書かれていますが、リセット技を使ってアップロードを行って下さい。
■他に考えられる原因
 ここまで色々試してみて上手くいかないようならマイコンボードそのものが正常に機能していない可能性もあります。Arduino Unoの様にマイコンチップが交換出来る場合は交換チップを入手して試してみるのも良いかもしれません。

 さて、今回はアップロード編としてArduinoのトラブルシューティングの手順をまとめてみました。こちらの方法で上手くいった場合、TwitterのIDをお持ちでしたら@maris_HYまでご報告いただけると幸いです。また上手くいかなかった場合も、お気軽にご相談ください。追加の情報もあれば、追記して行きたいと思います。

2014年6月15日 (日)

WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた

 AdafruitのWaveシールドは音声再生が出来るArduino用シールド(拡張基板)としてはかなり昔に開発され、半田付けによる組み立ても必要なキットでありながら、書籍Prototyping Labでも紹介されるなど長く人気を保っている製品です。

Uno_wave
Arduino UnoとWaveシールドV1.1
※ピンソケット、ICソケットなど自前の部品を足してあります。
 ところが、元々Arduinoの本流のArduino DuemilanoveやArduino Unoを対象に作られているため、Arduino MegaやArduino Leonardoでは、簡単に使用する事が出来ません。そこで、今回はこのWaveシールドをArduino MegaやArduino Leonardoで使える様にしてみました。

Arduino Megaで使う
 まずはArduino Megaで使ってみましょう。その前になぜこのWaveシールドがArduino Megaでそのままでは使えないかについて説明しなければいけませんね。このWaveシールドでは音声ファイルが入っているSDカードへのアクセスにSPIという通信方式が使われています。それに使用するSS,MISO,MOSI,SCKの4つのピンがあり、Arduino Unoではデジタル入出力ピンの10〜13に割り当てられています。ところがArduino Megaではこれがシールドが刺さっていない50(MISO),51(MOSI),52(SCK),53(SS)に出ているのです。使用すべきピンがArduino基板とシールドで違っているのでは正しく動くはずが無いですね。
 そこでArduino MegaでWaveシールドを使うにはこれらのピンをなんとかしてシールドの該当部分に繋がなくてはいけないという訳です。
 ところで、このSPIのピンのうちMISO,MOSI,SCKは実はArduino UnoでもArduino MegaでもArduino Leonardoでも6ピンヘッダのICSP端子にも繋がっているのです。なので、Arduinoチーム純正のEtherシールドやワイヤレスSDシールド等では、この端子を使ってSPI通信をする仕様になっています。
 実はこの事を利用して10〜13番ピンでSPI通信をするシールドをArduino MegaやArduino Leonardoで使える様にする変換シールドが製品として存在します。製品名がちょっと面白い?のですがトランスモグリシールドと言います。SparkFun Electronics製でスイッチサイエンスから入手する事が出来ます。
 このシールドをシールドを使えばMISO,MOSHI,SCKの配線を上手く繋ぎ直してくれるので、あとはArduino Megaの53番ピン(SS)をWaveシールドの10番ピンにジャンパワイヤで繋げばOKです。これだけでWaveシールドをWaveHCライブラリ(wavehc20110919.zip)で使用する事が出来ました。

Mega_wave
Arduino Mega 2560+トランスモグリシールド+Waveシールド

 またトランスモグリシールドの代わりになるシールドを自作する事も可能です。こちらの記事をご参照ください。

Arduino Leonardoで使う
 さて、こんどはArduino Leonardoですが、最初はArduino Megaと同じ手法で行けると思っていました。MISO,MOSI,SCKはトランスモグリシールド等で解決させるとしてSSはどこに出ているのかと回路図をチェックした所、なんとArduino LeonardoのSSピンはUSBシリアルの受信表示用LEDにのみ繋がっていて、ピンヘッダやピンソケットには出ていなかったのです。これは困りました。Waveシールドのライブラリ(WaveHC)はSDカードをSPI通信で有効にするピン(CS)を制御するためにSSピンを使う事に固定されいたのです。つまり表に出ていないピンをWaveシールドに接続しないと動かす事が出来ません。私は電子工作でなんとか出来なくも無いですが、見栄えも悪くなりますし、それが出来る人も非常に限られてしまいますね。
鳴かぬなら
 鳴かせてみよう
  Leonardo

まりす
 WaveシールドのライブラリがLeonardoに対応していない事態に臨んで。
 そこで、仕方なくライブラリに手を入れる事にしました。ライブラリで該当箇所を探り当て、CSピンをSS含め任意のピンに繋げられる様、改良を施しました。
 実際に変更したファイルはSdReader.h,SdReader.cpp,ArduinoPins.hの3つです。これをzipにまとめました。オリジナルのファイルと差し替えてお使いください。

※追記のライブラリファイルをお使いください。

 スケッチは、SdReader card; と書かれている所を SdReader card(CSのピン番号); とカッコ内にSDカードのCSとして使いたいピン番号(Waveシールドの場合、10)を追加する修正をして下さい。
 また、Serial通信をしている場合、Arduino Leonardoのお約束として、 Serial.begin(ボーレート); の直後に while (!Serial) { ; } を追加して下さい。
 これでArduino LeonardoでWaveシールドを使える様になります。

Leonardo_wave
Arduino Leonardo+トランスモグリシールド+Waveシールド

 またこのライブラリの改良を施せば、上記のArduino Megaで必要だったSSピン接続用のジャンパワイヤを不要に出来ます。もちろん今まで通りUnoで使用する事も問題有りません。

教訓。SPIを使ったArduino用のライブラリを作成する場合、ハードウェアSPIモジュールのSSピンは当てにせず、CSピンを任意に割り付け出来る様に書かないとLeonardoで使えない物になる。

◇2014/06/26 追記
DACの使用ピンも任意に変更出来る様にしました。
SdReader card(10);  // SDカードのCSピンを指定
WaveHC wave(2,3,4,5); // DACのLCS,CLK,DI,LATピンを指定
の様にスケッチを変更出来ます。
下のファイルをダウンロードしライブラリ全体を差し替えて下さい。

« 2014年5月 | トップページ | 2014年7月 »