Arduino400

2009-08 Arduinoに挑戦 HIDmon-14K50 mcc18


目次


Arduino400とは:

PIC18F14K50 + ATmega8 = Arduino400

  • 400円(Chipのみの値段)でArduino互換機を制作してみました。

/ATMEL_AVR/jpg/PIC/arduino14k1.jpg /ATMEL_AVR/jpg/PIC/arduino14k2.jpg

  • 写真はPIC 18F14K50とATmega8の混載基板(Arduino機能互換)
  • Arduino単独での動作試験を行ったため、20P拡張シールドコネクタに無駄な配線(TxD/RxD)が残っています。

マイコンチップ以外の主要部品:

部品名単価個数価格
秋月ユニバーサルC基板170円
USB-Bコネクタ150円
ポリスイッチ(6個入り300円)150円
12MHz水晶150円
16MHz水晶150円
LED20円360円
C,R少々。100円くらい?

たぶん合計で1000円はいかないと思います。(800円くらい)

但し、PICライターとAVRライターが必要です。(借りてくるとか誰かに焼いてもらうとか・・・)

  • --->最も廉価なHIDaspxライターにて、両方のチップにファームを書き込むことが可能です。PICspxを参照してください。

特徴

  • プログラム可能デバイスが2個もあって大変です面白いです。
  • それぞれにブートローダーが焼かれていて、それぞれのファームをブートローダー経由で書き込めます。
  • PIC側だけで、HIDmon/HIDboot としての使い道もあるので、Arduinoに飽きたらPICで各種USBデバイスを書いて遊べます。
  • その気になれば、Arduino側のファームとPIC側にUSBデバイスを書いてその中に仕込んだシリアル通信を経由することで
  • 任意の各種USBデバイス+Arduinoで書いたファームの協調動作のようなアプリまで書くことが出来ます。

それぞれのチップの面倒見るのが大変ですが。

マイコンPIC 18F14K5018F2550AVR ATmega8AVR ATmega168
Flash ROM容量16kB*132kB8kB16kB
SRAM容量768Byte*22kB*31kB
EEPROM容量256Byte512Byte
動作クロック48MHz(実質12MHz)*416MHz16MHz(最大20MHz)*5
処理系C18/sdcc/MPASMgcc(WinAVR)
8bit演算MIPS値12MIPS*616MIPS最大20MIPS
参考価格(秋月調べ)200円400円200円300円

どこが面白い?

  • PICとAVRは犬猿の仲なのに、PICをUSB-Serial仲介役にしてArduino互換を構成していること。
  • すなおにFT232RLを使わないのは配線が微細で難しいのと、素直すぎて面白くないから。
  • 実はArduino互換機を作るのが目的ではなくて、PICのUSB-Serial Emulatorの性能評価テストを行うのが目的で、 AVR側はシリアル転送試験ツールとして使用する予定だったが、ついでにArduinoになるので、そっちも試そうと・・・。

回路図

PIC側

/ATMEL_AVR/jpg/PIC/sch14k50.png

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側

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計画。

*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もどきにプログラム能力を持たせたのが間違いの元だろう。