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」ボタンを押す。
これでブートローダーの書込みは完了したはず。
次は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真似てみる その2 ― 2012/12/02 21:56
7segduinoだけど、ネットで調べてみるとカソードコモンでもライブラリは対応してるみたい。
mySseg.setKcommon();
と宣言してやれば、問題なく動いてくれるようだ。
とりあえずブレッドボードで試作してみよう。
7segduinoのサイトを見ながら、時間かかりながらも完成。
7segduinoのライブラリの中に入っているサンプルスケッチ
「hello_7seg_Kcommon.pde」を書き込む。
これはカソードコモン用のスケッチで、7セグLEDに「HELLo 7SEG.」とスクロール表示させる。
起動直後「HE」とだけ表示されて消えた。失敗か?
配線チェックしても問題ないので、もう一度起動してみた。
再度「HE」とだけ表示されて消えたけど、ちょっと待ったら「HELLo 7SEG.」とスクロール表示された。
起動直後はそうなるみたい。
って事で基盤に組み立て開始。
数時間かかりながらもなんとか完成した。
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」を押してみると、値が正常に読み込まれた。
あとは、FlashにArduinoのブートローダなり、Atmel Studioで作ったHEXファイルなりを指定して書き込めばいいみたい。
いずれATtinyでも買って、ArduinoじゃないAVRマイコン開発やってみたいな。
最近のコメント