RCduino

2012年10月29日

RCduino

RCduinoでPB6/PB7(Port20/21)にLEDを接続

RCduinoでPort20/21にLEDを接続

RCduinoという呼び名はボードの名前ではなく、Arduino IDEの認識するArduinoのコア(ソフトウエア)の名称です。RCduinoは内部RC発信器で動作させることで、これまでのArduinoの機能 に加えて、PB6/PB7がデジタル20/21ピンとして使えます。

表紙の写真はEMSLのDiavolinoという互換機基板のクリスタルの端子にピンコネクタを付けて実験をしているところです。LEDの点滅が確認できました。

1. はじめに

Arduinoはクロックとして水晶発信器またはセラロックを使うのが一般的です。コストを下げるため、AVR内蔵のRC発信器を利用することも可能です。例えば、学研の大人の科学付録の「Japanino」は外部発信器を持っているにも関わらず、初期設定では内部発振になっていますが、それでも正常に動作します。
RC発振の場合には、動作クロックが8Mhzになります。また、発振周波数の精度が悪くなったり、温度特性が悪化したりいろいろと制限があります。 7segduinoも基本回路としてRC発振を採用しています。

7segduinoの小型版を作成途中で、RCduinoというアイデアを思いつきました。内蔵のRC発振器を使う場合、水晶発振器をつないでいた端子(PB6/PB7)も活用することが可能です。現在のArduinoでは、ユーザプログラムからPB6/PB7を使うようにすることもできますが、ライブラリなどはそのまま利用出来ません。そこで、Arduinoのコアを拡張してみました。

2. 拡張する

RCduinoという名称で新しいArduinoのコアを定義します。とはいっても、2ピンを新しく定義するだけなので非常に簡単です。この拡張を行うことで、デジタルピンが2本追加になります。拡張方法は次の通りです。

コアを拡張する
(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

3. 利用する

(1) Arduinoのブートローダの設定
予め、利用するArduinoのMega328にはRC発振用のブートローダを書き込んでおいて下さい。

RC発振用ブートローダは例えばこんな物です。
また、ヒューズビットの設定も必要です。

HFUSE = DA
LFUSE = F2
EFUSE = 05

(2) Arduino IDE
Arduino IDEを立ち上げなおすと、マイコンボードでRCduinoが選択できます。
スケッチの中から、PB6/PB7をPORT20/PORT21として利用可能です。

ポートを少しでも多く利用したい場合、配置の都合でどうしてもPB6/PB7を利用したい場合には便利です。


一般に販売されているArduinoではPB6/PB7にクリスタルが接続されていて利用出来ません。クリスタルを取り除く必要が有ります。

7segduinoの小型版はなるべく7セグメントユニットのピンに近い位置のAVRのピンを割り当てたかったため、PB6,PB7も使えるRCduinoを採用しています。

7segduino mini

7segduino mini

4. リンク

こちらのホームページで試して頂きました。

激安Arduino

NanoBoardAGで2つのモーターを使う方法@WorldStethoscope Swiki

涵養塾 arduino 1.0.1 で NanoBoardAGで2つのモーターを使う方法

Arduino 1.0でも同様の改造で動作する様です。

お試しあれ。

  1. コメントはまだありません。
コメントは受け付けていません。