ArduinoISPを試す2012/12/07 23:59

Arduinoを使って、生ATmega328PとかにOptiboot等のブートローダを書き込めるらしい。

とりあえずArduinoは何でも良いみたいなので、ちびでぃ~のPROを使用した。
ATMega8L搭載、内蔵発振8MHzで動いてる互換機だ。

ターゲットマイコンは、まっさらなATmega328P。
こいつに、Optiboot(内蔵発振8MHz)を書き込んでみる。

まずは、ちびでぃ~のPROにArduinoISPを書き込む。
ArduinoIDEを起動し、「ファイル」 - 「スケッチの例」 - 「ArduinoISP」を開いて、
コンパイル → 書込み を行う。
これでちびでぃ~のPROが、ブートローダ書込み機になってくれた。

そしてちびでぃ~のPROと生ATmega328Pを接続。

(ちびでぃ~の)   (生ATmega328P)
    VCC --- VCC(7,20ピン)
    GND --- GND(8,22ピン)
    D10 --- RESET(1ピン)
    D11 --- MOSI(17ピン)
    D12 --- MISO(18ピン)
    D13 --- SCK(19ピン)

ArduinoIDEで「ツール」- 「マイコンボード」 - 「[Optiboot] ATmega328P 8MHz」を選択。
「ツール」 - 「書込装置」 - 「Arduino as ISP」を選択。
「ツール」 - 「ブートローダを書き込む」で書込み開始。
1分くらいで書き込めた。

なお、書込み対象マイコン用のブートローダ作成や、マイコンボード設定をやっておく必要がある。
今回は以前作ったのを利用した。


ちなみに今回、配線ミスしてATmega328Pをホントに焼いてしまった。
VCCとGNDを逆に配線してしまったんで、ごらんのとおり。

溶けたブレッドボード

ブレッドボードが、熱で見事に変形しています。
配線チェックを行ってからUSBを繋ぐのは基本ですね・・・

なお、驚いた事に焼いたATmega328Pは生きていた。
意外と頑丈なんだな。

マルツパーツ館 博多千代店2012/12/05 22:00

今日初めて、マルツパーツ館博多千代店に行ってみた。

想像してたより狭い。
天神にあるカホパーツセンターの半分くらいの広さだろうか。

だけど、カホパーツよりマイコン関係の商品は多いみたい。
今回は時間が無くってあまり見れなかったけど、今度じっくり見て回りたい。

あまり時間の無い中、STM32L-DISCOVERYを買ってしまった。
面白そうなマイコンボードだなぁと興味を持ってたヤツだったんだけど、
現物を見てしまって思わず衝動買い。

とりあえずネットで情報集め中だけど、Arduinoみたく簡単じゃないっぽいな。
開発環境がバシッと用意されてるんじゃないのね・・・
初心者には厳しいおもちゃだなぁ。

引き出しの奥で眠ってしまいそうな予感・・・

7segduino真似てみる その22012/12/02 21:56

7segduinoだけど、ネットで調べてみるとカソードコモンでもライブラリは対応してるみたい。
  mySseg.setKcommon();
と宣言してやれば、問題なく動いてくれるようだ。

とりあえずブレッドボードで試作してみよう。
7segduinoのサイトを見ながら、時間かかりながらも完成。

7segduinoのライブラリの中に入っているサンプルスケッチ
「hello_7seg_Kcommon.pde」を書き込む。
これはカソードコモン用のスケッチで、7セグLEDに「HELLo 7SEG.」とスクロール表示させる。
起動直後「HE」とだけ表示されて消えた。失敗か?

配線チェックしても問題ないので、もう一度起動してみた。
再度「HE」とだけ表示されて消えたけど、ちょっと待ったら「HELLo 7SEG.」とスクロール表示された。
起動直後はそうなるみたい。

って事で基盤に組み立て開始。
数時間かかりながらもなんとか完成した。

7SegクローンF

7SegクローンB

7セグLEDの左にある6+2のピンソケットは、Analog1~5、Digital5、VCC、GNDに接続されている。
その他の入出力ピンは、すべて7セグLEDの表示用で消費。

とりあえず照度センサーのAMS302をA3ピンに接続して、照度を測ってみた。
下記はスケッチ

#include <Sseg.h>
Sseg mySseg = Sseg(4, 8, 11, 13, 14, 2, 10, 12, 3, 6, 7, 9);

int voutPin = 3; 

int lx = 0;
void setup()
{
  mySseg.setKcommon();
  mySseg.begin();
}

void loop()
{
  long sumreading = 0;
  
  // R1の電圧を10回取得
  for (int i=1; i <= 10; i++){
    int reading = analogRead(voutPin);
    sumreading = sumreading + (long)reading;
    
    // 7セグLEDに表示
    mySseg.writeNum(lx);
    mySseg.updateWithDelay(100);
  }
  // AD値をmVに変換( *5000/20 /1024)
  float voltage = ((long)sumreading * 500) / 1024;

  // 電圧から電流を求める I=E/R (R=1000)
  float microamp = (voltage * 1000) / 1000;

  // 電流をlxに変換
  float lxf = microamp / (470 / 100);

  lx = (int)lxf;
}

実は7segduinoのサンプルスケッチと、ネットで拾ったものを融合しただけ。

照度測定

照度に変換する式は調整する必要があるだろう。
それにしてもLEDが明るすぎ。
前面にフィルターでも貼るかな。

7segduino真似てみる2012/12/01 21:51

Arduino互換機に7segduinoという物がある。
4桁7セグメントLEDを組み込んだ、ATMega328P搭載Arduinoだ。
7セグの大きさにちょうど収めて製作してあり、とてもコンパクトでかっこいい。

手元に4桁7セグを1個持ってたので、これを真似して7セグ一体型Arduinoを作ってみる。
7segduinoみたくコンパクトじゃなくって、普通の基盤で作るんだけどね。
ちなみにライブラリが公開されているので、スケッチ書くのは簡単になる。

7segduinoは上記のとおりATMega328Pを搭載している。
しかし以前作った互換機と違い、外部水晶発振子ではなく内部発振モードで動くようになっている。
どうせなら同じ仕様でと思い、内部発振のFuse値はどうしたらいいかを調査。

hFuse : DE
lFuse : F2
eFuse : 05

で良いっぽことは分かったけど、ブートローダーも専用で作ったほうが良いらしいことも発見した。
だけど、ブートローダーの作り方がいまいち分からない・・・
ATMega328P用のOptiboot 内部発振8MHz用が欲しいんだけど、そのものずばりを解説してるHPが見当たらない。

\arduino-1.0.1\hardware\arduino\bootloaders\optiboot\Makefile というファイルに、欲しいブートローダーの設定を追記してomake.batを実行すれば良い
らしい事はわかったんだけど、どんな追記をすればいいんだ。

とりあえずMakefileを眺めていると、「atmega328_pro8: TARGET = atmega328_pro_8MHz」って記述を発見。
あれ?これでいけるんじゃね?

ってことで、コマンドプロンプトでこのディレクトリに移動し
> omake atmega328_pro8
を実行すると
「optiboot_atmega328_pro_8MHz.hex」というブートローダーが作成された。

で、生のATMega328Pにこれを焼いてみた。

いつものようにFT232RLとATMega328Pを接続してavrdude-GUIを起動。

hFuse : DE
lFuse : F2
eFuse : 05

で「Write」ボタンを押して、Command Line Optionの「-B 4800」を削除する。
Flash欄にさっき作った「optiboot_atmega328_pro_8MHz.hex」を選択して、
「Erase - Write - Verify」ボタンを押す。
これでブートローダーの書込みは完了したはず。

328P内部発振FUSE

次はArduinoIDEの設定。
\arduino-1.0.1\hardware\arduino\boards.txt の最後に、下記を追加。

############################################################

atmega328o8.name=[Optiboot] ATmega328P 8MHz
atmega328o8.upload.protocol=arduino
atmega328o8.upload.maximum_size=32256
atmega328o8.upload.speed=115200
atmega328o8.bootloader.low_fuses=0xf2
atmega328o8.bootloader.high_fuses=0xde
atmega328o8.bootloader.extended_fuses=0x05
atmega328o8.bootloader.path=optiboot
atmega328o8.bootloader.file=optiboot_atmega328_pro_8MHz.hex
atmega328o8.bootloader.unlock_bits=0x3F
atmega328o8.bootloader.lock_bits=0x0F
atmega328o8.build.mcu=atmega328p
atmega328o8.build.f_cpu=8000000L
atmega328o8.build.core=arduino

############################################################

そして、マイコンボードは今追加した「[Optiboot] ATmega328P 8MHz」を選択する。

とりあえずBlinkを書き込んでみたら1秒おきにLEDが点滅してくれたので、
内部発振モードで動くATMega328P版Arduino製作は成功したようだ。

いよいよ基盤に組み立てようと思ったけど、ふと7セグLEDの仕様が気になり調べてみた。
7segduinoのパーツリストを見ると、アノードコモンの表記。
手元にある7セグLEDはカソードコモン・・・ダメじゃん。

秋月にアノードコモンを注文する事にして、次回に持ち越しだな。

Japaninoの外部発振モード化2012/11/29 23:10

Japaninoは、8MHzの水晶発振子が設置されている。
だけど、これが生かされていなくて内部発振モードで動いているらしい
せっかく水晶発振子がついてるのにもったいない。

なので、内部発振モードから、水晶発振子を使う外部発振モードに切り替えてみた。

作業としては単純に、FUSE値を変更すれば良いっぽい。

まずはJapaninoにFT232RLを接続。
(FT232RL)    (Japanino)
       RI   --- RESET
       DSR --- D13 (SCK)
       DCD --- D11 (MOSI)
       CTS --- D12 (MISO)
       VCC --- +5V
       GND --- GND

Japanino

avrdude-GUIを起動し、
 ・avrdude.exe Fileに、avrdude-serjtagのavrdude.exeを選択
 ・Programmerに、「FT232R Synchronous BitBang (diecimila)」を選択
 ・Deviceに、「ATmega168(m168)」を選択
 ・Command Line Optionに、「-P ft0 -B 4800」と記入
 ・Portは空欄
でFuse欄の「Readボタン」を押す。

FUSE値(作業前)

 hFuse = DD
 lFuse = C6
と入力し「Write」ボタンを押す。

FUSE値(作業後)

これで外部発振モードになった・・・はず。
とりあえず動いてるからいいかな~