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があるのであんまり上げても速くはならない。
 
 





