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はカソードコモン・・・ダメじゃん。

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

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が明るすぎ。
前面にフィルターでも貼るかな。

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

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

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

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

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

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

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

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/10 23:36

ちっちゃいものくらぶさんで、あたらしいArduino互換機の頒布をやっていた。
「世界一安い 組込機器の開発環境」を謳う、ちびでぃ~の壱。

USBシリアルモジュール付で800円(送料込)。
ATMEGA8Lを搭載した互換機で、AVR書込み用ISP端子がついている。
外部クリスタル発信子は付いていないけど、後付けが出来るみたい。

他のAVRマイコンにプログラムを書込む事に特化した、ちびでぃ~のって事か。

さっそく組立完了。
ピンヘッダ/ソケットの足を曲げる所に手間取ったくらいで、他はさっくり終了。

次にArduinoIDEの設定。

arduinoフォルダの中にある、hardware\arduino\boards.txt の末尾に下記を追加。

############################################################
atmega8o8.name=[Optiboot] ATmega8 RC8MHz
atmega8o8.upload.protocol=arduino
atmega8o8.upload.maximum_size=7680
atmega8o8.upload.speed=115200
atmega8o8.bootloader.low_fuses=0x94
atmega8o8.bootloader.high_fuses=0xDC
atmega8o8.bootloader.path=optiboot
atmega8o8.bootloader.file=optiboot_atmega8-8m.hex
atmega8o8.bootloader.unlock_bits=0x3F
atmega8o8.bootloader.lock_bits=0x0F
atmega8o8.build.mcu=atmega8
atmega8o8.build.f_cpu=8000000L
atmega8o8.build.core=arduino
atmega8o8.build.variant=standard
############################################################

ArduinoIDEで「ツール」- 「マイコンボード」 - 「[Optiboot] ATmega8 RC8MHz」を選択。
「ファイル」 - 「スケッチの例」 - 「ArduinoISP」を開いて、コンパイル → 書込み を行う。
これでちびでぃ~の壱がAVR書込み装置になってくれた。

ちびでぃ~の壱のISP端子とターゲットAVRマイコンのつなぎ方は下記。

(ちびでぃ~の壱)   (ターゲットAVRマイコン)
    1ピン --- MISO(18ピン)
    2ピン --- VCC(7,20ピン)
    3ピン --- SCK(19ピン)
    4ピン --- MOSI(17ピン)
    5ピン --- RESET(1ピン)
    6ピン --- GND(8,22ピン)

ピンソケットを正面に見て、左上が1ピン、その下が2ピン、右下が6ピンになる。
実際に接続するとこんな感じ。
左がちびでぃ~の壱で、右が生ATmega328P。

ちびでぃ~の壱

avrdude-GUIを起動してFuse値を見てみる。
・Programmerに、「Atmel AVR ISP (avrisp)」を選択
・Deviceに、「ATmega328P(m328p)」を選択
・Command Line Optionに、「-B 19200」と記入
・Portに、「COM4」を選択 (←自分の環境に合わせる)

Fuse欄の「Read」を押してみると、値が正常に読み込まれた。

Avrdude

あとは、FlashにArduinoのブートローダなり、Atmel Studioで作ったHEXファイルなりを指定して書き込めばいいみたい。
いずれATtinyでも買って、ArduinoじゃないAVRマイコン開発やってみたいな。