タグ別アーカイブ: embedded

Night Runner Rainbow ATMega328P FUSE設定

【覚書】ナイトランナーレインボゥのフューズ設定、ブートローダー、Arduino IDEでの設定

チップ:ATmega328P
クロック:内蔵クロック 8MHz
電源電圧:3.3~5.0V

FUSE設定
 BODLEVEL = DISABLED
 RSTDISBL = [ ]
 DWEN = [ ]
 SPIEN = [X]
 WDTON = [ ]
 EESAVE = [ ]
 BOOTSZ = 1024W_3C00
 BOOTRST = [X]
 CKDIV8 = [ ]
 CKOUT = [ ]
 SUT_CKSEL = INTRCOSC_8MHZ_6CK_14CK_65MS

 EXTENDED = 0xFF (valid)
 HIGH = 0xDA (modified)
 LOW = 0xE2 (modified)

ブートローダー (Arduino)
 atmegaBoot_168_atmega328_pro8MHz.hex

Arduino IDEでのボード設定
 Arduino LilyPad
 Atmega328P

DSC02524

電池駆動Arduino

低消費電力Arduino互換システム。3V/8MHzで動いてます。
8MHz用にビルドしたArduinoのブートローダーと内蔵クロック/電源電圧3V用のフューズ設定を書き込んだATMega328P
Arduino用ボード設定ファイルにも設定を追加したのでArduino IDEがそのまま使えてそのまま書き込みできます。

この状態で基板起こそうかな。Denchi-Duinoとか命名してw
MobDuinoというのもいいかも。

内蔵8MHzのArduinoに関してはこのページを参考にしました。って自分のブログw
フューズはクロック設定とあとBOD (Brown Out Detection)の設定に注意。BODは1.8Vに設定しました。
標準のArduinoのBOD設定だと2.7Vになってるから電池で使うのには不適っす。

写真のブレッドボードではその他周辺として、RTC、気圧センサ、温度センサ、小型液晶、microSDカード、スイッチとかをつないでます。
基本ほとんどsleep状態。キー入力(Port Change Interrupt)かRTCからの1Hz割り込みで起きてるので、非常に低消費電力なシステムになってます。
でもAVRよか1800番台PICの方がはるかに低消費電力なんだよねぇ。。。値段も安いし。。。

このプロジェクト、ArduinoにこだわらずにPICにするかな。

でも一番のお気に入りはArduinoでもPICでもなくてNetduino
なんたって開発環境が最高!!チップの値段が最大のネック。。。

DSC02435

秘密兵器

【ハセツネに持ってったライト達】
ヘッドライトはPrinston TechのApex Proを改造したもの。リチウムイオン電池18650の4本仕様です。総容量は約40Wh、6V500mAでライト駆動しても12時間使えます♪1本~4本の何本でも動きます。インテリジェントなDC/DCコンバータ(入力電圧に応じてステップアップ/ステップダウンを自動切替)内蔵です。
4本使用の通常時は効率90%のステップダウンモードでドライブし、電池に優しく3.3Vで出力を停止する回路を組み込んでいます。これでもワイド側のランプのみなら余裕なのですが、スポットを多用してると容量足りなくなる可能性もあり。
そんな時はスイッチを切り替えて、「電池死ぬまで駆動モード」に切り替えます。すると今度はステップアップDC/DCモードになって残りの電力を全部使い切ります。これでまた数時間はLEDを光らせることができます。電池も死ぬけどね。。。

ハンドライトも同じ電池を使うものです。自作品。
ハイビームにすると3Aも流れて(18650は流せるんです!)明るさはなんと1000ルーメン♪危険ですww
ただ、ハイビームにすると1時間もちませんwww
PWMで出力を20%にした状態で5時間ぐらい使えます。これでも十分明るい。
電池はヘッデンと同じなので、ハンドライトの電池がなくなったらヘッデンのバッテリーボックスから1本借用すればいいしね。

今回走れる部分ではスポット、登りではワイドを基本に使い分けてましたが電池は最後まで持ちました。一部ガスっていたトコではハンドライトメインに使ってました。
今回のライトは大成功♪

もう一つの開発中の秘密兵器は実用に間に合いませんでした。。。来年のUTMF???TGG???には持って行きたいなぁ~

DSC01128

PrincetonTec APEX改 バッテリーライフテスト

PrincetonTecのヘッデン – APEX PRO、元々はCR123A×2本使いだったんだけど、長時間動作用に18650×2本直列のバッテリケース外付けに改造してました。これでトータル6時間以上動作。
ところが電圧高くなった分(6V→7.4V)放熱が問題に。。長時間連続点灯しておくと保護回路働いちゃって消えちゃうんです。
センサ(サーミスタ)が冷めた頃に再び電源投入でちゃんと点くんですけど一晩中つけっぱが予想されるレースとかじゃ困っちゃう。。

というわけで、18650×2本を並列にしたバッテリーケースを作りました。そして電池交換が簡単に出来るようにΦ2.5mmジャック&プラグをつけました。
電圧が下がった分暗くなりそうですけどどうなんだろ??中にDC/DC入ってれば関係ないし。。逆に電圧下がり過ぎると減電圧検出で電源供給カットされちゃうかも。。

そんな時は実験です。

まずはこのヘッデンの消費電流の測定

スポット、光量大 850mA
スポット、光量小 240mA
拡散、光量大   320mA
拡散、光量小   047mA

18650の容量はまあ2200mAhぐらいでしょうか、手持ちの中には3000mAhなんてのもありますが、、、

このヘッデン、通常は拡散モードの明るい方で使ってます。
平地や下り坂で飛ばす時はスポットを使うこともあるけど、まあ殆どは拡散モード。
とりあえず机上で拡散モードでのバッテリーライフを計算してみると。。

2200[mAh] * 2 / 320[mA] = 13.75[hour] = 13時間45分

90%ケースで考えても12時間22分
おお、日の長い5月なら一晩持ちますね。

そして実測、バッテリはフル充電。拡散モードの光量大で連続点灯。

【結果】
11時間30分で一度減電圧表示(LEDが2回点滅)、でもそのまま点灯し続けました。
14時間ちょうど連続点灯しました。ほぼ計算通り。すばらしい!
減電圧検出時はアラート返すだけなのですね。よかった。

このバッテリケースを2個作りました。バッテリ交換は接続のジャック&プラグを差し替えるだけ。
ふふふ、いいね♪

DSC09041

TDFNパッケージ

3mm×3mmで6ピンのTDFNパッケージで試作する事になったのでこのチップにリード線をはんだ付けしました。
今回のエントリはこの壮絶な細かい作業の記録です。


TDFNとは"Thin Dual Flat No Leads"という意味。その名の通りリードが出てません。BGAの小さいものってイメージしてもらうといいかも。
今回のチップのランドサイズは0.3mm×0.4mm。ここからリード線を引き出そうというのだから。。。


準備として、チップが動かない様に裏返して両面テープで適当なものに固定。
そして予備ハンダ。もちろん使うコテ先は極細。それでも小手先の径は1.5mm位あるのでこの作業が大変なのが容易に想像できます。


0.2mmのUEW線を各ランドにはんだ付けしたところ。
実はここまではそんなに大変じゃないんです。大変なのはここから。
なにが大変って、リード線の逆側をはんだ付けしていると、熱が伝わってチップ側に折角ハンダ付けしたとこがとれちゃうんです。
ピンセットで挟んで熱を伝えない様にと思っても、これまた大変。
同じチップを2個DIP化しましたけど、1個目はなんとかうまくできたけど、2個目は時間かかりすぎちゃって熱でチップがダメになっちゃいました。


ということで今回考えたのは、一旦面実装基板にはんだ付けする方法。
チップからのリード線の長さがながければ熱も伝わりにくくてやりやすいだろうと思ったから。


あと、チップを粘度の高い瞬間接着剤でコーティングしました。
というかこれだけでリード線とれないか。


さらにその基板のランドにジュンフロン線をはんだ付け。
こんだけ広いランドなら余裕っす


そして、8pinDIPサイズに切ったユニバーサル基板にはんだ付け。


高さがあって、ちょっといびつですが実験用だからいいんです。
これで8pinのソケットに挿して実験できます。

このパッケージ、小さくて製品にする時は最高なんだけど、DIPパッケージも用意してくれてたら実験の時とか嬉しんだけどな。。。
今回の試作でこのTDFN→DIP化が一番時間がかかりましたとさ。。。

DSC09000

拡張PIC

 使ってみたいけど、持っているライタ(秋月製)が対応していないので躊躇していたPICの18xxについに手を出した。
今回購入したのは使い勝手のよさそうな3種類。
12F1822, 16F1823, 16F1827
どれも超省電力モードがあったり、DAがついてたり、静電容量変化のタッチ入力があったりとなかなか高機能。
それでいて@80円からととても安くて嬉しいです。


ライタがないとタダのゴミになってしまうので、対応したライタも購入しました。Microchip純正のPICkit3
この手のライタツールがどんどん増える。。。PIC用だけで初代PIC Start 、自作ライタ、秋月ライタとこれと4つ目だ。
MPLABも対応してるのでMPLABから直接プログラムできるのが嬉しいですね。
あと、PICのオンチップデバッグ機能をつかってデバッグもできるらしいがまだ試してない。
デバッガが必要になるほど大規模なプログラムを書くかっていうのもある。


ISPのコネクタ(ピンヘッダ)を毎回配線するのもメンドクサイんでこんなケーブルをつくった。


こうやって、PICkit3と接続して、ブレボに挿せばISPできます。


PICkit3に付属のCDでMPLABとHI-TECH社のCコンパイラをインストールした。
いままではwiz-cというPIC用のCコンパイラ、というかIDEを使ってた。当時は一番安く手に入るCコンパイラだったと記憶してます。
wiz-cも有償バージョンアップしない限り新しいデバイスには対応しない様なのでここで再びMPLABに戻ってきたということで。
そしてお決まりのHello World

ターゲット電源をPICKitから供給できるのね。これは便利。
内蔵クロックの設定がメンドクサイかと思ったけど、OSCCONの設定をちゃんとしておけば問題なし。
データシート読んだけどヒューズでPLLはオフっておいてもレジスタの書き込みでON/OFFできるみたい。まだ試してない。
処理速度が必要な時は内蔵8MHz×4で32MHzで処理して、そんなに忙しくないときは4MHz、もちろん暇な時はスリープするといった具合にパワーマネジメントが細かくできそうで楽しそうです。

まあ、今回は、とりあえずの動作確認。
さくさくって書いて、LEDブリンキング完成。


PICKIt抜いて電池でも勿論動きます。
が??なぜか2.4Vじゃ動かなかったぽい??単にこのLEDのVFが2.4V以上だったのかな?きっとそうだな。

とりあえず開発環境のインストールと設定と動作確認ができた。
さあこれらを使っていろいろと作るぞぉ~~

DSC08854

LED Ring Light for Macro


最近工作のレポートでマクロ撮影を多用してます。
でも難しいんですよね。ライティングが。
ストロボたくと光っちゃうし、近づき過ぎちゃうとご覧のとおり影ができちゃったり。。
ということで、マクロ撮影用のリングライトを作ることにしました。



部品箱を漁ると、マキシムのMAX879というDC/DCが見つかりました。
入力1Vから動作して出力は可変。これ使えば電源がAA2本とかでいいかも。
という訳でブレボで実験。よしよし、ちゃんと計算どおり動いてます。



白色LEDは6000mcdっていうのが8本あったのでこれを使うことにしました。
IFは約17mAになってます。最大定格が25mAだからちょうどよいですね。
8本の合計が136mAでこのチップの最大容量以下だったのでよしとします。



LEDを固定する板は、1mm厚のアクリル板を10cm×10cmにカットし、その中を直径8cmの円形にくりぬきました。
サークルカッターで切ったんだけどなかなか切れませんね。。欲張って力入れると中心がずれたりするので、あまり力を入れずに何度もカットするのが正解でした。



LEDの固定はこんなふうにしました。
アクリル板にΦ1.0の穴を2.54ピッチで開けて、LEDの足を通して、その足をアクリル板の反対側に7.62mm角に切ったユニバーサル基板のランドに通してハンダ付け。これで固定しました。
これを丸い穴の周りに8個、間隔は適当です。。。



8個のLED全部配線したところ。抵抗はホントはチップの使いたかったんだけど、100ohmぐらいのチップのがなかった。。
一番小さいので1Kだったよ。。チップ抵抗の小さいのが欠品中です。補充しておかないと。



ブレボのDCDC回路につないで光らせてみたところ。
いいんじゃない?



この状態で試しに撮ってみた写真。
うわっ!照射角せまっ!!あとLEDの間隔広すぎっ!!
この口径ならLEDの数を倍にするとか、または口径を小さくするとかしたほうがよさそう。。
なんでこんなに口径を大きくしたのかというと。。。



このフィッシュアイコンバージョンレンズを使った時に使いたかったから。
このレンズつけるとストロボ使えないしね。



デコデコ回路はフリスクケースに入るサイズにカットしたユニバーサル基板に組みました。
Lとかキャパとか探せばチップのがあるはずなんだけどメンドクサイし、ケースにも余裕があるのでこブレボに使ったリードタイプをそのまま使いました。
たださすがに立てては入らないので寝かしてます。


AA2本の電池ケーススイッチ付きby秋月がフリスクケースとぴったりサイズ。
両面テープでフリスクケースと張り合わせて完成!



マクロコンバージョンレンズつけておもいっきり近づいて撮影。
変な影も出ないしよろしいんじゃないでしょうか?
光が青みがかっているのでホワバラを調整したほうがよさそうですね。



こおゆう写真を沢山撮るんですよ。
うーん、ツルツルしてるとこに光源が映り込むなぁ。。。
ディフーザーをなんかこしらえないとダメかな??
おいおい考えるとします。



フィッシュアイ付けたときはこんなふうになります。
なかなかイカツイっす。



マクロコンバージョンレンズ付けた時。
うーん、こっち用に口径の小さいリングライト作ろうかな。。

というわけで、サンデーナイト工作教室でした。


回路図はこれね

DSC08745

Crystal-less Arduino (8MHz)


ブレッドボードにATmega168さして、自作のArduinoアダプタさして実験中



問題なく動いてるのでアダプタ外して、ブレボにリセット回路とクロック回路組んでブレッドボードArduino

だがしかし、この回路、スピードもクロック精度も全然いらないんで外付けXtal使わないで内蔵RCクロックで動かしたい!
つうことでブートローダーを書き換える事にした


まずはヒューズの設定をどうするのかデータシートとにらめっこ
Calibrated internal RC oscillatorってことでCKSEL3..0は0010になります。


内蔵クロックに変更したので、スタートアップタイムも見直します。
14CK+65msということに



という訳で、ヒューズの設定は
Extended = 0xF8
High = 0xDD
Low = 0xE2
となりました。



ロックビットは変わらず 0xCF



さてさて、それではブートローダーを内蔵8MHz用にMakeしてやります。
"C:\Program Files\arduino-0022\hardware\arduino\bootloaders\atmega"のMakefileに以下追加します。


diecimila_8mhz: TARGET = diecimila_8mhz
diecimila_8mhz: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1'
diecimila_8mhz: AVR_FREQ = 8000000L
diecimila_8mhz: $(PROGRAM)_diecimila_8mhz.hex

そしてコマンドラインからMake diecimila_8mhzを実行


C:\Program Files\arduino-0022\hardware\arduino\bootloaders\atmega>make diecimila_8mhz
avr-gcc -g -Wall -O2 -mmcu=atmega168 -DF_CPU=8000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
ATmegaBOOT_168.c: In function 'main':
ATmegaBOOT_168.c:586: error: 'EEWE' undeclared (first use in this function)
ATmegaBOOT_168.c:586: error: (Each undeclared identifier is reported only once
ATmegaBOOT_168.c:586: error: for each function it appears in.)
make: *** [ATmegaBOOT_168.o] Error 1

げげっ!!エラってしまいました。。。
なんじゃい???

該当箇所、ATmegaBOOT_168.cの586行付近を見ると、


#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__)
while(bit_is_set(EECR,EEPE)); //Wait for previous EEPROM writes to complete
#else
while(bit_is_set(EECR,EEWE)); //Wait for previous EEPROM writes to complete
#endif

となってました。どうやらレジスタ名称がチップによって違うみたいです。ATMega128ではEEPEでそれ以外はEEWEなの??
EEPROM関係なのでeeprom.hを見てみると。。。EEWEって定義ありませんでした。
そりゃそうだ、そうエラーが言ってるもん。

なんでだ??
Arduinoフォーラム内を検索してみたらまさしく同じ問題に困ってた人が居ました。

どうやら、AVR Libcをバージョンアップしちゃった事による弊害だそうです。
ArduinoのブートローダーはAVRLibc1.6.7を使えって言ってるよ。

ですが、バージョンダウンさせるのも気が引けるので強引にいきます。

EEWEもEEPEも同じレジスタ、名前が違うだけです。
という訳でブートローダーのソースを修正!
eeprom.hをインクルードした直後に以下コードを追加しました。


/* Check for aliases. */
#if !defined(EEWE) && defined(EEPE)
# define EEWE EEPE
#endif

#if !defined(EEMWE) && defined(EEMPE)
# define EEMWE EEMPE
#endif

そして再びMake


C:\Program Files\arduino-0022\hardware\arduino\bootloaders\atmega>make diecimila_8mhz
avr-gcc -g -Wall -O2 -mmcu=atmega168 -DF_CPU=8000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
avr-gcc -g -Wall -O2 -mmcu=atmega168 -DF_CPU=8000000L '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -Wl,--section-start=.text=0x3800 -o ATmegaBOOT_168_die
cimila_8mhz.elf ATmegaBOOT_168.o
avr-objcopy -j .text -j .data -O ihex ATmegaBOOT_168_diecimila_8mhz.elf ATmegaBOOT_168_diecimila_8mhz.hex
rm ATmegaBOOT_168_diecimila_8mhz.elf ATmegaBOOT_168.o

これで内蔵8MHz用のブートローダが出来ました。
あとはこれをライタで書き込んで完成

Arduino IDEのボード定義ファイル、board.txtに内蔵8MHz、ATMega168用の定義を追加しました。


##############################################################
diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 8MHz

diecimila.upload.protocol=stk500
diecimila.upload.maximum_size=14336
diecimila.upload.speed=19200

diecimila.bootloader.low_fuses=0xf8
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0xE2
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila_8mhz.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

diecimila.build.mcu=atmega168
diecimila.build.f_cpu=8000000L
diecimila.build.core=arduino

これでボード一覧に追加されました。

外付けのXtal無しでもちゃんと動きました。
ただ、Arduinoライブラリのdelay()等が16MHz基準で作られているので時間が2倍になっちゃいました。。通信とかも気を付けないと。。



おまけ

ブレッドボード上にArduinoつくった時のAVRライタ接続用のアダプタを作りました。


AVRライタとこうつないで、


該当するピン位置に差し込んで使います。
ブートローダーさえ書いちゃえばあとはArduino IDEから書き込めるから不要だしね。もっと早く作っておけば良かった。

以上内蔵RCオシレータでブレッドボードArduinoを動かす覚書でした。

DSC08638

Bread Board PCB

秋月電子で売ってるブレッドボードと同じ配線、同じサイズのユニバーサル基板を使ってみました。
上の写真の左側がよく使うブレッドボード(部品ささってるけど気にしないで)、そして右がブレッドボード基板
ブレッドボードで実験した回路をそのまま置き換えてもいいし、ブレッドボードに組み立てる様にこの基板にいきなり組むのもやりやすい。

今回組んだのはこの回路
MAX16820は3mm角のTDFNと米粒みたいなチップ。ひっくり返して、UEWでDIPサイズに変換基板を自作しました。
ブレボで実験したけどそのままコピーじゃなくて新たにこの基板に回路組みました。というのもでかいブレボで実験しちゃったんでそのまま置き換えは出来なかったんです。

できた回路はこれ。
ユニバーサル基板で組んだ時とあまりサイズ変わらないじゃない?

ハンダ面はこんな感じ。
ちょっとランドが小さいですね。半田の乗りがイマイチでした。
使ったチップ(NE555)が古過ぎて足が酸化してたってえのがそもそもなんですけど。。

ユニバーサル基板で組む時は、部品のリードを折り曲げて配線に使ったりするんですけど、これだとはんだ付けし忘れってほとんどしないんですけど、ブレボ基板だとジャンパーワイヤを大量に使うので半田忘れしやすいです。
この回路も半田しわすれがあってすんなり動かなかったです。。。
逆に、部品のリードはまっすぐのままでカットするので部品交換したい場合は簡単に外せていいですね。
ブレボの置き換えじゃなくて、最初からこの基板で実験するのもありかも。

というわけでこの基板のいいとこと悪いとこ。あくまでも私の感想で。

良いとこ
ブレボで実験した回路そのまま
部品交換が楽
あんまり考えなくても回路が組める

欠点
ジャンパワイヤが沢山必要
部品密度がどうしても低くなる(基板がでかくなる)
はんだ付けの箇所が増えて面倒

というわけで一長一短ですね。
でもお気楽極楽電子工作には向いてると思います。