CH340G USBシリアル変換とUSBaspを使ってみる (Arduino)

前回はAVRボードとして確認しました。
今回はArduinoボードとして使ってみたいと思います。

下記のサイトよりATmega/ATtiny記述ファイルアーカイブを利用させて頂きました。
kosakalab   Arduino IDEでATtiny他の開発(AVRISP編)

hardware.zip(2014.09.04版)をホームディレクトリのsketchbook以下にダウンロード展開します。

Arduino IDEを起動するとマイコンボードにMCUが増えていると思います。
画面によってはボード一覧がはみだしてしまいますのでディレクトリ以下のboards.txtを編集する事により使わないMCUを表示より削除できます。
システムのデフォルトボードも同様に編集可能です。(root権限が必要)
/usr/share/arduino/hardware/arduinoにboards.txtがあります。コピーをとってから編集します。

atmega-ar01
新しいATmega168Pとクリスタルを取り付けてUSBケーブルを差し込んでみます。
LEDが一瞬光ってUSBaspが認識されます。
またArduino IDEからシリアルポートが確認できると思います。
なぜか上記サイトから頂いたファイルの中にはATmega168Pのクリスタル設定がありません。
ATmega328Pの設定を参照してATmega168Pの設定を書き足します。(間違いがあるかもしれません)

$ vi ~/sketchbook/hardware/atmega/boards.txt
avr168p16.name=ATmega168P / Ext.16MHz
avr168p16.upload.maximum_size=16384
avr168p16.bootloader.low_fuses=0xff
avr168p16.bootloader.high_fuses=0xdd
avr168p16.bootloader.extended_fuses=0x00
avr168p16.bootloader.path=dummy
avr168p16.bootloader.file=dummy.hex
avr168p16.bootloader.unlock_bits=0x3F
avr168p16.bootloader.lock_bits=0x3F
avr168p16.build.mcu=atmega168p
avr168p16.build.f_cpu=16000000L
avr168p16.build.core=arduino:arduino
avr168p16.build.variant=standard

Arduino IDEを再起動するとATmega168P / Ext.16MHzがみえます。

新品のATmega168Pのfuseは以下のようになっています。

$ avrdude -c usbasp -p m168 -v
avrdude: Device signature = 0x1e940b
avrdude: Expected signature for ATMEGA168 is 1E 94 06
avrdude: safemode: lfuse reads as 62
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as 1

arduino01
内臓RC 1MHzになっているのでクリスタル16MHzにします。
SLOW SCKを切り替えます。
マイコンボードからATmega168P / Ext.16MHzを選択
書込装置からUSBaspを選択
ブートローダーを書き込むをクリックします。
書き込みには低速を選んでいるので1分少しかかります。
指定したFuse以外はすべてクリア、デフォルトに戻しているような感じです。
(Fuse設定だけならavrdudeですぐ終わります)
SLOW SCKをノーマルに戻します。

ここからはターミナルでブートローダーを焼き込みます。

$ cd /usr/share/arduino/hardware/arduino/bootloaders/atmega
$ avrdude -F -c usbasp -p m168 -U flash:w:ATmegaBOOT_168_diecimila.hex

オプションで –F を指定しないと怒られて書込してくれません。
.bashrcにalias登録を書いておくとコマンドが短くなりますね。
ほかのライタを使う場合はターミナルから -c で指定すればそのライタが優先されます。

$ vi ~/.bashrc
alias avrdude='avrdude -c usbasp -F'

$ source ~/.bashrc

書込が完了するとLEDが点滅を始めます。
ここからはもうArduino(MODOKI)になりました。シリアルで通信ができます。
ツール–マイコンボード–Arduino Diecimila or Duemilanove w/ ATmega168 を選択
Hello worldを書込、実行してみます。以下のスケッチを作成

void setup() {
    Serial.begin(9600);
    pinMode(13, OUTPUT);
}
 
void loop() {
  Serial.println("Hello world.");
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

hellow03
これまではUSBaspで書込を行っていため白色LEDがピカピカしていましたが今はシリアルから書込しているためUSBaspは黙っている事がわかります。

LEDは1秒間隔で点滅、シリアルコンソールを開けばHellow worldも同時に出力されます。

avrdude stk500_getsync() not in sync resp=0x80
もしこんなメッセージが出ていたら正常に書込を行っていません。
シリアルからはDTR信号でリセットをかけているようです。
CH340GのDTRがAE-ATmega基板のリセットに接続されているか確認します。
コンパイルが終わって書込(赤い文字)に変わったときにリセットボタンを押してやると正常に書込が終了することでも確認できると思います。

今度はこのスケッチをATmega88V(INT 8MHz)に書き込んでみます。
88Vは88の低電圧判で88Pとはシグネチャーが違います。
boards.txtに以下を追記します。

avr88.name=ATmega88 / Int.8MHz
avr88.upload.maximum_size=8192
avr88.bootloader.low_fuses=0xe2
avr88.bootloader.high_fuses=0xdd
avr88.bootloader.extended_fuses=0x07
avr88.bootloader.path=dummy
avr88.bootloader.file=dummy.hex
avr88.bootloader.unlock_bits=0x3F
avr88.bootloader.lock_bits=0x3F
avr88.build.mcu=atmega88
avr88.build.f_cpu=8000000L
avr88.build.core=arduino:arduino
avr88.build.variant=atmega_int

arduino05
mcuをATmega88Vに取り替えて先ほどと同じようにATmega88 / Int 8MHzを選択、ブートローダーを書き込む

マイコンボードに書き込むを実行すると今度はUSBaspから書き込んでくれます。
(以前のバージョン(1.01)の時にはファイル–書込装置を使って書き込む–からしかUSBaspから書き込んでくれなかった記憶があったのですが)

以上、簡単なスケッチでしか確認をしていませんが正しいマイコンボード(MCU)を選択すればブートローダーを焼き込んであるMCUはシリアルでブートローダーのないMCUはUSBaspからマイコンボードに書き込んでくれます。

*MCUの選択によってはArduinoを誤操作により書き換えてしまうことがあるのでArduinoとして使用している時はISPコネクタを外しておくのがいいかもしれません。

ロックビットは適宜設定します。

3.3v、5vの選択はAT-AEmega基板のスイッチで選択するだけですのでI/Oの選択はデバイスあるいはターゲットの電圧に合わせるだけで済むと思います。
atmega-ar03
普段はLEDろうそくを灯してインテリアとして、または実用的にUSBハブに、気が向いたらAVR,Arduinoの電子工作としていろいろ遊べそうです。

ATtiny13aボードとミニブレッドボード

atmega-ar04