タグ別アーカイブ: arduino

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
なんたって開発環境が最高!!チップの値段が最大のネック。。。

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を動かす覚書でした。

Illuminated Bouldering Wall System

この夏、秋葉原にb-pumpが出来るらしい!
そのニュースを聞いて昨日の俺のツイート

このアイデア、結構前から持ってたのよね。
実際に構築するとしたら具体的にどんな風になるのか?概略を絵にしてみた。

DSC03275

できるだけ既製品つかって開発は簡単に!って考えたらこんな感じになりました。
壁の裏にブロック毎にArduino+ether shieldを配置。ひとつのArduinoで16個のLEDをスタティック点灯。16ポート使えたよね??
IOの出力電流はそれぞれ40mAだから抵抗もなしで直結でいけるはず。明るさ足りないようならトランジスタかますか。。
ボルト穴毎にLED設置、穴の間隔は約20cmって考えると、一台のArduinoで80cm四方、コンパネ半分分ぐらいですかね。コンパネ1枚でArduinoとethernet shieldが2個づつ!って高いシステムになるなこりゃ。。。それとジブスとかにLED設置するのがめんどくさそ。。。

ユーザーインターフェースはwebアプリ。課題データベースとしてSQL使うかな。
WiFiルータでローカルエリアネットワークを構築し、お客さんは自分のスマホなりiPadなりノートPCとかで接続。192.168.1.100とかにアクセスしてもらってブラウザから操作。
ブラウザから課題を選択、グレードや人気順、新作順、壁の指定とかで検索可能!「トライする!」ボタンを押すと、課題で使うホールドだけが光る!って仕組み。
課題毎にコメントがつけられたり、お気に入り度を投票してもらったり。この課題情報は外からもHPでみられるようにしときましょう。(課題選択をローカルにしたのは、外部からアクセスしてLED点灯されても困るから)
LEDをフルカラーにする案もあるけど、一つのArduinoに接続できるLEDの数が1/3になっちゃうから(ダイナミック点灯にすれば大丈夫だけど、そうすると回路めんどくさいし。。基板起こす気もないし。。。)没で。

どおでしょう?
秋葉B-Pumpさん、採用しませんか??

ちなみに、このシステムでは、ホールドは全て透明なのにしないといけません。
現在市販されているクライミングホールドに透明なのを見たことがありません。強度&容量アップの為にレジンに混ぜるファインサンド等の為にどうしても透明には出来ないのかな?今度試しに作ってみますか!

もし、本気でこのシステムを導入したい!ってジムが出てきたら、ホッチホールドさんに相談してみよっかなーww