Arduinoに挑戦
目次
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ブリンクを書き込んでみました。
- 残念です。
- 普通に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を飼いならす。†
- 写真はPIC 18F14K50とATmega8の混載基板(Arduino機能互換をめざして奮闘中の奴)
- とりあえず、USB-PICの問題を切り離したいと思った。
- PIC 18F14K50をICソケットから外す。
- シールド接続用に用意した20ピンのピンヘッダー(メス)に電源とRx/Txを配線して、AVR-USB(V-USB)仕立てのUSB-シリアル変換シールドを接続できるようにしてみた。
- 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があるのであんまり上げても速くはならない。