Arduino400
2009-08 Arduinoに挑戦 HIDmon-14K50 mcc18
目次
Arduino400とは:†
PIC18F14K50 + ATmega8 = Arduino400
- 400円(Chipのみの値段)でArduino互換機を制作してみました。
- 写真はPIC 18F14K50とATmega8の混載基板(Arduino機能互換)
- Arduino単独での動作試験を行ったため、20P拡張シールドコネクタに無駄な配線(TxD/RxD)が残っています。
マイコンチップ以外の主要部品:
部品名 | 単価 | 個数 | 価格 |
秋月ユニバーサルC基板 | 1 | 70円 | |
USB-Bコネクタ | 1 | 50円 | |
ポリスイッチ | (6個入り300円) | 1 | 50円 |
12MHz水晶 | 1 | 50円 | |
16MHz水晶 | 1 | 50円 | |
LED | 20円 | 3 | 60円 |
C,R少々。 | 100円くらい? |
たぶん合計で1000円はいかないと思います。(800円くらい)
但し、PICライターとAVRライターが必要です。(借りてくるとか誰かに焼いてもらうとか・・・)
特徴†
- プログラム可能デバイスが2個もあって
大変です面白いです。 - それぞれにブートローダーが焼かれていて、それぞれのファームをブートローダー経由で書き込めます。
- PIC側だけで、HIDmon/HIDboot としての使い道もあるので、Arduinoに飽きたらPICで各種USBデバイスを書いて遊べます。
- その気になれば、Arduino側のファームとPIC側にUSBデバイスを書いてその中に仕込んだシリアル通信を経由することで
- 任意の各種USBデバイス+Arduinoで書いたファームの協調動作のようなアプリまで書くことが出来ます。
それぞれのチップの面倒見るのが大変ですが。
マイコン | PIC 18F14K50 | 18F2550 | AVR ATmega8 | AVR ATmega168 | |
Flash ROM容量 | 16kB*1 | 32kB | 8kB | 16kB | |
SRAM容量 | 768Byte*2 | 2kB*3 | 1kB | ← | |
EEPROM容量 | 256Byte | ← | 512Byte | ← | |
動作クロック | 48MHz(実質12MHz)*4 | ← | 16MHz | 16MHz(最大20MHz)*5 | |
処理系 | C18/sdcc/MPASM | ← | gcc(WinAVR) | ← | |
8bit演算MIPS値 | 12MIPS*6 | ← | 16MIPS | 最大20MIPS | |
参考価格(秋月調べ) | 200円 | 400円 | 200円 | 300円 |
どこが面白い?
- PICとAVRは犬猿の仲なのに、PICをUSB-Serial仲介役にしてArduino互換を構成していること。
- すなおにFT232RLを使わないのは配線が微細で難しいのと、素直すぎて面白くないから。
- 実はArduino互換機を作るのが目的ではなくて、PICのUSB-Serial Emulatorの性能評価テストを行うのが目的で、 AVR側はシリアル転送試験ツールとして使用する予定だったが、ついでにArduinoになるので、そっちも試そうと・・・。
回路図†
PIC側
AVR側
http://arduino.cc/en/uploads/Main/Arduino-Pro-schematic.pdf
PICとAVRの接続方法
PIC TxD -------------> AVR RxD PIC RxD -------------> AVR TxD PIC RB6(DTR) ---||---> AVR Reset 0.1uF
RB6(DTR信号)を0.1uF経由でAVRのReset端子に接続します。
DTRリセット問題†
- DTRをAVRのResetにつなぐ時にキャパシタを挟む方法では、AVRのReset端子に瞬間的に10V近い電圧が掛かったり 負電圧が掛かるという問題があります。(これは本家Arduinoの設計上の問題だと思います。)
- なので、DTRをOC出力(抵抗PullUP)にしてAVR Resetにつなぐべきではありますが、これにも落とし穴があります。
- PCと接続中(通信中)は通常DTRはHレベル(負論理の場合Lレベル)ですが、ArduinoをPCと接続せずスタンドアロン 動作させるときはDTRアサートされずLレベル(負論理の場合Hレベル)となり、両立しません。(どちらかの状態でリセットが掛かりっぱなしとなります)
- FT232RLではDTR#端子の論理反転をチップに記憶させることが出来るようです。(たぶんArduinoでは正論理TTL???)
- 現状のPICのファームウェアをそのままコンパイルするとDTRは負論理(TTLレベル)に固定されています。
改善案としては、
- (1)キャパシタ0.1uFと直列に100Ω程度を挟む。そして、AVRのReset端子をダイオードクランプして高電圧や負電圧から守る。
- (2)PICファームを改良してDTRを正論理TTL OC出力にするか、もしくはArduino Reset専用の出力端子を新設する。その場合はAVR Reset端子に直結して抵抗プルアップにする。
ファームウェアダウンロード†
PIC側
- 旧バージョン
AVR側
- http://www.arduino.cc/
- Arduino-0017をダウンロードして、PCにインストールします。
ATmega8に焼く場合は以下のHEXを使用します。
arduino-0017/hardware/bootloaders/atmega8/ATmegaBOOT.hex
ATmega168に焼く場合は以下のHEXを使用します。
arduino-0017/hardware/bootloaders/atmega/ATmegaBOOT_168_ng.hex
- ATmega168を選択した場合、Arduino400ではなくなります。(Arduino500になります)
- (Flashエリアが2倍にグレードアップします。)
- PIC 18F14K50の代わりにPIC 18F2550を使用することも可能です。
- (その場合はArduino700になります。PIC側のFlashエリアも2倍になります。)
- PIC 18F2550用のUSB-シリアル変換ファームは特に用意していませんが、ソースファイルを元に作ること が出来ます。(変更箇所は2、3箇所程度で済むと思います。)
PIC側はUSB-シリアル変換器として動作させていますが、HIDmon-14K50ブートローダー兼デバッグモニタ
をあらかじめ焼いておくとPIC側のファームアップデートやUSB付きPICの学習にも対応できるのでお勧めです。
予定†
- HIDaspから各種ブートローダーが書き込めるようにしたい。
- PICspxツールを作成しましたのでご利用ください。
- ATmega8のブートローダーをもう少しブラッシュアップしたい。
- シリアルのボーレートを上げたい。(115200をデフォに)
- Arduino2313計画。
- Piclearno計画。
*1 同じ処理を書いてコードサイズを比較するとPIC18はAVRの2倍〜3倍くらいのFlash(ガソリン)を消費する。つまり燃費の悪い車のようなもの。ガソリンがぶのみして、なおかつ遅い。ぐずでのろまなマイコンだ。
*2 うち256byteはUSB SIE側との共有(DualPort RAM)になっている
*3 うち1kByteはUSB SIE側との共有(DualPort RAM)になっている
*4 1命令実行に最低4クロック必要なので実質12MHz
*5 20MHz動作させる場合は水晶を20MHzに換装して、ブートローダーのクロック設定(シリアル接続ボーレート計算値)も書き換えないといけません。
*6 たしかに12M Instruction/秒であるが、何故か実際のコード効率はAVRの1/3〜1/10程度しかない。おまけにFlash使用量は無駄に多い。元々PICというのはProgrammable ICだったわけで、16pinとか18pinのロジックICもどきにプログラム能力を持たせたのが間違いの元だろう。