ATMEGA644Pを搭載したAVR-DEV-AM644RXのArduino化(Sanguino化?)を試みてみました。すでにAVR-DEV-AM644RXがお手元にある方は、すぐにでも試してみてはいかがでしょうか。
グラフィックLCDなどを既にお持ちであれば、AVR-DEV-AM644RXの基板とATMEGA644PだけのセットAVR-BASE-AM644RXで手軽にトライアルできます。
AVR-DEV-AM644RXをArduino化するためのハードウェアの修正はきわめて簡単で、10分もあれば終わってしまいます。まずは、Sanguinoの回路構成を確認してください。
作業内容は以下の通りです。
まず、Arduinoのタイミング関係の基礎となる16MHzのクリスタルとそのセラミックコンデンサを追加します。
次に、ブートモニタ用のLEDをPB0(PIN1)に追加します。LEDには、電流制限用の1KΩ程度の抵抗を直列に接続し、PB0に1が出力された場合にLEDが発光するように接続します。AVR-DEV-644RXにはもともと2個のLEDが実装されていますが、以下のような理由で新たにLEDを追加します。
Sanguinoのソフトウェアパッケージに同梱されている標準のブートローダは、その稼働状況を示すために、PB0に接続されているLEDを利用するように構成されています。AVR-DEV-644RXの標準のLEDは他のピンに接続されているため、Sanguinoの標準のブートローダでは利用できません。そこで、ブートローダーの書き換え(といってもピンマッピングの1行程度の修正?)をしなくて良いように、LEDを追加しました。
なお、AVR-DEV-644RXのPB0は、もともとグラフィックスLCDのR/W制御用に割り当てられていますので、ブートプロセスが終わったスケッチ実行時には、グラフィックLCDの制御に用いられ、その状態が追加されたLEDに表示されることになります。
最後に、スケッチのアップロード時にオートリセットが実行されブートローダーが自動実行できるように、リセット回路を追加します。
Sanguinoは、シリアルのRTSをリセットのトリガーに利用しているようですが、ここでは、Arduinoの一般的な方法であるDTRを利用することにしました。まず、DSUB9コネクタの4番ピンとRS232レベルコンバーターのADM232A相当のICの8番ピンを接続します。その出力となる9番ピンとATMEGA644Pのリセット信号用の9番ピンを0.1μFのコンデンサで接続します。(配線の絶縁対策は忘れずにX-()
これで、オートリセットができるようになりました。
AVR-DEV-AM644RX固有の接続情報を含め、Sanguinoでのデジタルポート、アナログポートのピン構成を示します。
AVR-DEV-AM644RXでは、グラフィックLCDがI/Oピンの多くの部分を占めていますが、グラフィックLCDが必要ない用途であれば、それをソケットからはずすことにより、ほとんどのI/Oピンをスケッチで自由に利用できるようになります。
どのような経緯あるいは制約があったのかわかりませんが、標準(ATMEGA168版)のArduinoでは、PDポートからデジタルI/Oピンの番号が振られているのに対して、Sanguinoでは、PBポートから番号が振られており、若干の注意が必要です。
デジタルポート
Arduinoポート | 端子名 | 接続先 | 備考 |
---|---|---|---|
D0 | PB0 | GLCD:R/~W、ブートモニタLED | |
D1 | PB1 | SW2 | |
D2 | PB2/INT2 | GLCD:RES | |
D3 | PB3/OC0A | GLCD:CL | PWM |
D4 | PB4/OC0B/~SS | LED2 | PWM |
D5 | PB5/MOSI | ||
D6 | PB6/MISO | ||
D7 | PB7/SCK | ||
D8 | PD0/RXD0 | USB:TX | |
D9 | PD1/TXD0 | USB:RX | |
D10 | PD2/RXD1/INT0 | SW1 | |
D11 | PD3/TXD1/INT1 | SW3 | |
D12 | PD4/OC1B | LED1 | PWM |
D13 | PD5/OC1A | PWM | |
D14 | PD6/OC2B | GLCD:A0 | PWM |
D15 | PD7/OC2A | PWM | |
D16 | PC0/SCL | ||
D17 | PC1/SDA | ||
D18 | PC2 | GLCD:~CS1 | |
D19 | PC3 | GLCD:~CS2 | |
D20 | PC4 | GLCD:DB4 | |
D21 | PC5 | GLCD:DB5 | |
D22 | PC6 | GLCD:DB6 | |
D23 | PC7 | GLCD:DB7 |
アナログポートはデジタルI/Oとして利用できるのは、標準のArduinoと同様ですが、デジタルI/Oピン番号の振り方が、アナログピン番号と逆順に振られているので注意が必要です。
アナログポート
Arduinoポート | 端子名 | 接続先 | 備考 |
---|---|---|---|
A0/D31 | PA0 | GLCD:DB0 | |
A1/D30 | PA1 | GLCD:DB1 | |
A2/D29 | PA2 | GLCD:DB2 | |
A3/D28 | PA3 | GLCD:DB3 | |
A4/D27 | PA4 | ||
A5/D26 | PA5 | ||
A6/D25 | PA6 | ||
A7/D24 | PA7 |
AVR-DEV-AM644RXの主要な出力装置であるグラフィックLCDを利用するためには、その液晶をリフレッシュするための2KHz程度のクロックを供給する必要があります。もともとArduino対応を想定していなかったAVR-DEV-AM644RXでは、このクロックをTimer0のPWM機能で生成することを想定しており、PB3/OC0AピンがグラフィックLCDのクロックピンに接続されています。
しかしながらArduinoでは、Timer0はシステムの中核の計時機能として利用されており、自由に設定を変更して利用することができません。ただし、analogWrite関数を利用したPWM機能を利用することにより、PB3/OC0AピンからTimer0に基づくPWM出力を行い、グラフィックLCDにクロックとして供給することができます。肝心の周波数はArduinoの計時機能にかかわるため、安易に変えることはできませんが、そのままの周波数(グラフィックLCDに要求されている周波数に比べると少々低いのですが。。。。)をグラフィックLCDに与えると、かなりマージンがあるようで問題なく表示されることを確認できました。(もちろん規格外なので、動作保証は出来ません)
ちなみに、出力されるPWMクロックの周波数は約977Hzで、グラフィックLCDが要求しているクロック周波数のほぼ半分です。なお、Arduinoの公式サイトのanalogWriteの説明では、PWM出力の周波数は490Hzと書かれていますが、Timer0に基づくOC0A, OC0Bに関しては誤りで、その2倍の周波数が正解です。
これは、analogWriteに関するcoresのソースを読めば一目瞭然で、Timer0由来のPWMは、高速PWMを利用しているのに対し、Timer1/Timer2由来のPWMはフェーズ・コレクトPWMを利用しており、プリスケーラやカウント数の設定が同じでも、周波数が2倍異なることになります。
各PWMピンの出力周波数の違いは、測定器があれば簡単に確認できますが、圧電サウンダを持っているならば、それを接続すると、出力される音が1オクターブ異なるため、耳で確認することができます。(絶対音階 or 具体的な周波数はわからないけど。。。 :-P)
D3(PB3/OC0A)
analogWrite(3, 128) ;