Arduinoより2ピン多く使えるRCduino
Arduinoより2ピン多く使えるRCduino
Arduinoはクロックとして水晶発信器またはセラロックを使うのが一般的です。コストを下げるため、AVR内蔵のRC発信器を利用することも可能です。例えば、学研の大人の科学付録の「Japanino」は外部発信器を持っているにも関わらず、初期設定では内部発振になっていますが、それでも正常に動作します。
RC発振の場合には、動作クロックが8Mhzになります。また、発振周波数の精度が悪くなったり、温度特性が悪化したりいろいろと制限があります。 7segduinoも基本回路としてRC発振を採用しています。
7segduinoの小型版を作成途中で、RCduinoというアイデアを思いつきました。内蔵のRC発振器を使う場合、水晶発振器をつないでいた端子(PB6/PB7)も活用することが可能です。現在のArduinoでは、ユーザプログラムからPB6/PB7を使うようにすることもできますが、ライブラリなどはそのまま利用出来ません。そこで、Arduinoのコアを拡張してみました。
RCduinoという名称で新しいArduinoのコアを定義します。とはいっても、2ピンを新しく定義するだけなので非常に簡単です。この拡張を行うことで、デジタルピンが2本追加になります。拡張方法は次の通りです。
1.コアを拡張する
(1) hardware/arduino/cores/arduinoをコピーして別のフォルダを作成します。
hardware/arduino/cores/RCduino
(2)ソースコードにPB6/PB7の定義を追加します。
pins_arduino.cの最後の部分に以下を追加します。
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, /* 0 */
PD,
PD,
PD,
PD,
PD,
PD,
PD,
PB, /* 8 */
PB,
PB,
PB,
PB,
PB,
PC, /* 14 */
PC,
PC,
PC,
PC,
PC,
PB, /* 20 */
PB, /* 21 */
};
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 8, port B */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(0), /* 14, port C */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6), /* 20 port B */
_BV(7), /* 21 port B */
};
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER, /* 0 - port D */
NOT_ON_TIMER,
NOT_ON_TIMER,
// on the ATmega168, digital pin 3 has hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
#else
TIMER2B,
#endif
NOT_ON_TIMER,
// on the ATmega168, digital pins 5 and 6 have hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
NOT_ON_TIMER,
#else
TIMER0B,
TIMER0A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER, /* 8 - port B */
TIMER1A,
TIMER1B,
#if defined(__AVR_ATmega8__)
TIMER2,
#else
TIMER2A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, /* 14 - port C */
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, /* 20 */
NOT_ON_TIMER, /* 21 */
};
#endif
3.ボードの定義を追加する
boards.txtに以下を追加します。
RCduino.name=RCduino / atmega328p
RCduino.upload.protocol=stk500
RCduino.upload.maximum_size=30720
RCduino.upload.speed=57600
RCduino.bootloader.low_fuses=0xf2
RCduino.bootloader.high_fuses=0xda
RCduino.bootloader.path=atmega
RCduino.bootloader.file=ATmegaBOOT_168_atmega328_rc_8MHz.hex
RCduino.bootloader.unlock_bits=0x3F
RCduino.bootloader.lock_bits=0x0F
RCduino.build.mcu=atmega328p
RCduino.build.f_cpu=8000000L
RCduino.build.core=RCduino
4.利用する
Arduinoを立ち上げなおすと、マイコンボードでRCduinoが選択できます。
PB6/PB7をPORT20/PORT21として利用可能です。
ポートを少しでも多く利用したい場合、配置の都合でどうしてもPB6/PB7を利用したい場合には便利です。
但し、一般に販売されているクリスタルの実装されたArduino互換機では利用出来ません。改造してクリスタルを取り除く必要が有ります。表紙の写真はEMSLのDiavolinoという互換機基板のクリスタルの端子にピンコネクタを付けて実験をしているところです。LEDの点滅が確認できました。
7segduinoの小型版はなるべく7セグメントユニットのピンに近い位置のAVRのピンを割り当てたかったため、PB6,PB7も使えるRCduinoを採用しています。
※紛らわしいのですが、RCduinoという呼び名はボードの名前ではなく、Arduino IDEの認識するArduinoのコア(ソフトウエア)の名称です。RCduinoは内部RC発信器で動作させることで、これまでのArduinoの機能に加えて、PB6/PB7がデジタル20/21ピンとして使えます。
お試しあれ。
2011年7月2日土曜日
RCduino