Arduinoに挑戦

2009-08? Arduino400


目次


PIC 18F14K50 + Arduino ATmega8 計画

Arduinoなんて、やったこともないのに、無謀にもUSB-PIC+ATmega8という組み合わせで挑戦中です。

時系列

  • ATmega8(秋月で200円)の電源とTx/Rxを配線.
  • MCHIPのUSBシリアルエミュレータのHEXを焼く.
  • 通電
  • MCHIPのUSB infをインストール
  • Arduinoを起動
  • スケッチを流し込む
  • シリアルが停止エラー シリアルポートが(Windowsの)エラーを吐いてとまる。

しかたがないので、

  • ATmega8を抜く。
  • 2番ピンと3番ピン(Rx/Tx)をショート。
  • エコーバックテスト中。

エコーバックしません。

  • Tx/Rxをテスターで計るとほぼ5V。
  • teratermのコンソールでキーを入力すると微妙に電圧が変わるので、Txは行われているっぽい。
  • エコーバックが帰ってこない。どんなボーレートでも。

PICはヘタレです。






なんとなくエコーバックまでパス。

  • その後、PCを取り替えただけでUSB-シリアルファームはエコーバックを返すようになりました。
  • Arduinoをインストール、日本語化したのち、LEDブリンクを書き込んでみました。

https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/ard-err1.jpg

  • 残念です。
  • 普通にTeratermで接続してキーを打っても、文字は何も返ってきません。
  • これでは、何が悪いのかさっぱり・・・。
  • ATmega8のRxDはちゃんと+5Vになっていますが、TxDは通電後数秒で0Vになります。
  • 現在ATmega8の動作を疑っているところ。

ただし、

  • ここでヘタれてリアルRS232CをATmega8に繋いだら負けです。






ATmega8もなんとなく動いているようで・・・

  • SCK(pin19)にテスターを当てると、1秒単位で上下している。
  • ローダーは生きているっぽい。
  • 水晶は16MHzを与えている。
  • fuseはたぶん合っている。
  • シリアル経由でいじっても返答なし。
  • board.txtを見る限りだと19200bps
  • ブートローダーのソース見るしかないのかな?

ソースを見ながら見よう見まね。

E:\Program files\arduino-0016>w32term -b19200 -c5
19200
Entering TerminalMode: Escape=^A <==ここですばやく '1' ' ' を入力すると、
 AVR ISP 

おお、返答は帰ってくる。

Arduino IDEからuploadを試みた。

  • 確率は低いが、たまにアップロードがうまくいくことがある。
  • しかし、プログラムが動いたのかどうか分からない。
    • AVRライターで読んで調べてみるとしよう。
  • 調べてみた。
    • 何かを書き込んでいる形跡はあった。
    • が、AVRライターで読み出したHEXとは似ても似つかない。字化け?それとも消さずに書いてる????
    • たぶん実行不可だろう。

つまり、今の状態を一言で表すならば、

  • とてつもなく不安定!






とてつもなく不安定なArduinoを飼いならす。

https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/arduino14k1.jpg https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/arduino14k2.jpg

  • 写真はPIC 18F14K50とATmega8の混載基板(Arduino機能互換をめざして奮闘中の奴)


  • とりあえず、USB-PICの問題を切り離したいと思った。
  • PIC 18F14K50をICソケットから外す。
  • シールド接続用に用意した20ピンのピンヘッダー(メス)に電源とRx/Txを配線して、AVR-USB(V-USB)仕立てのUSB-シリアル変換シールドを接続できるようにしてみた。

USBシリアル変換シールド(ATtiny2313) https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/tn2313-c.jpg

  • Arduino IDEに接続。
  • LEDブリンクをビルドして焼く。
  • 一応動いているようです。


USB-シリアル変換シールド上でのATmega8の挙動ですが、どうも理解できない点がありました。

  • Arduinoのブートローダー(hardware/bootloaders/atmega8/ATmegaBOOT.hex)をそのまま焼いていますが、
  • こいつは起動直後にSCKのLEDを非常に短く(10回位)点灯したのち消灯します。
  • 19200bpsで待ち受けます。
  • 「1」「空白」という文字を受け取ったら、'AVR ISP'という返答を返します。(ブートローダーが生きている証拠。)
  • 文字を送っても(送らなくても)10秒くらいたつと、勝手にアプリを起動してしまいます。
  • アプリが起動してしまうと、ブートローダーとして機能しないので、Arduino IDEからは制御できません。

こんなもんなんでしょうか?

あと、気になったのは、

  • Arduino IDEのアップロードは成功してもメッセージを出さない(LED点灯は開始される)ことがあって、転送が終わったのかわかりにくい。
  • 転送が終わってもプログラムがすぐに開始されるわけでなく、ブートローダーのタイムアウトを待っている(10秒くらいたって起動する)という動作が非常に緩慢というか転送が遅いのと誤解される。
  • 比較的サイズの大きいアプリ(Melody)は転送に失敗することが多い。
  • いまだにMelodyが正常実行できていない。
  • Melodyの出力ポートがpin9(Xtal)になっている(バグ???)






とてつもなく不安定なArduinoの謎

ブートローダーのソースを読んでみる。

  • ATmegaBOOT.c

概要

  • getch()は6秒間なにも文字が来なければ、勝手に0番地にジャンプ(アプリを実行)してしまう仕様になっていた。
  • それ以外に、アプリを起動する方法が記述されていなかった。(app_start()を明示的に行うコマンドなど存在しない。)
  • BOOTモードとアプリモードの切り替えジャンパーなどは存在しない。
  • えーと、割り込みベクターを0番地側に戻すレジスタがあるはずなんだけど、ノータッチのようだ。
  • 長いスケッチの書き込みが失敗する原因については不明。

なんかこのブートローダーはすごく投げやりなつくりになっている気がするのは気のせい?

  • もっとも、avrdude.exeから見てこいつはライターに見えないといけないので、start()が出来ないのは仕様なのかもしれないけれど・・・。






他のArduinoではどうなっている?

http://arduino.cc/en/uploads/Main/

http://arduino.cc/en/uploads/Main/Arduino-Diecimila-schematic.pdf

http://arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

  • USB式のやつは、DTR信号でリセットを掛けることが出来るので、アプリを強制中断してスケッチの書き換えが可能。
  • DTRを0.1uF経由でRESETに繋いでる。イタリア人は野蛮だ。RTS#は_NMなので実装しないらしい。

つまり、DTRコントロールが無いUSB-PIC18F経由の場合は、スケッチの書き込み直前にUSB再接続とか、手動リセットが必要なわけだね。






ATmegaBOOT_168.cを読んでみる。

  • ATmega168ではブートジャンパーが設定されている。
    • PIND6だ。
    • ATnmega1280ではPINF7とPINF6らしい。
    • PIND6は設定されているが、ATmega168ではapp_start()コールはコメントアウトだった。
  • ATmegaBOOT_168.cでは、ブートローダーのコマンドに合致しない文字が5回以上来たら、強制的にapp_start()するようにもなっている。
  • おそらく、シリアル未接続のゴミ文字捨てなんだろう。
  • また、'j'コマンドでも app_start()するので、少しはましか。
  • 全体的にATmega8は放置プレイ中らしい・・・。

秋月に18F14K50を頼んだときについでに買っておいたATmega168があったなぁ・・・。

  • 300円なので、500円Arduinoになってしまうけど。






仕組みが分かってしまえば、動かすのはカンタン。

  • DTRによるリセットがPICでは不可能なので、
  • Arduinoにuploadする直前(6秒の猶予しかない)にUSB接続してuploadすればブートローダーは受け付けてくれる。
  • 一応LEDブリンクとFirmataのサンプルが書き込めて、なんとなく実行出来ているようだ。
  • USB-シリアルはPIC 18F14K50に戻した。
  • PICのファームは、とてもやる気ない実装だった。
  • RS232Cの処理に割り込みやFIFOが一切使われていない。
  • これだと取りこぼしが発生するのではないかと思ったが、受信FIFO(ハードウェア)は2バイト用意されているらしい。
  • Arduinoの19200bpsならギリギリセーフかもしれない。






Arduino-0017がリリースされました。

  • http://www.arduino.cc/
  • 0017に入れ替えました。
  • シリアルコンソールが少し変わって独立Windowになったようです。
  • 手製のArduino互換機はリセットがちゃんと掛かるようになったので、とても安定に動作しています。
  • シリアル関係のExampleをいろいろ試してみたのですが、115200bpsだとPICが反応しないようです。
  • 57600bpsまでは一応動作しているようでした。

で、相変わらずスケッチ転送後の実行が6秒待たされます。

  • ATmegaBOOT_168_ng.hexのタイムスタンプは変更されていますがHEXの内容は同一でした。
  • ATmegaBOOT_168.cの内容も同一でした。


改良(案)

  • ATmega8からATmega168に換装する。 --- 済み
    • これによりブートローダーは'j'コマンドですぐにapp_start()するようになる。(?)
    • と、思ったが、改善しない。
    • ATmega_BOOT_168_ng.hex を焼いた。
    • ボード選択も168_NGを選択した。
  • PIC18FのSerialEmulator(ファーム)を鍛えあげる。
    • せめて割り込み駆動に。
    • 最低でもDTR信号をどれかのpinに出せるように。
    • RB6端子にDTR信号を出すファームをコンパイルしてPIC側ブートローダーで書き込みました。
  • DTRリセットを配線する。(0.1uF接続というところが気になる。イタリア人は野蛮だ)
    • 配線しました。一応ArduinoIDEからリセットが掛かるようになりました。
  • ボーレートをdefaultの19200から、57600とかもっと上にする。
    • これは実際のところ、Flashの書き込みWaitがあるのであんまり上げても速くはならない。