①ADコンバーターの入力ピンにボリュームからの電圧を投入。
②この電圧を監視し、変動があれば万歩計に出力する
この実例です。
今回のサンプルソースでは、tiny13の3番ピンADC2から電圧を拾い、5番ピンPB0に万歩計を接続して上位8ビットの値を表示しようとしています。
(入力電圧を変えるために使ってるボリュームは一部で有名なセリアの100円アンプのもの、単に手元に適当なボリュームがなかったからなのですが。昨今100円ショップに依存しておりまする)
tiny13の動きは以下のようになっています。
①ADC2より電圧のAD変換値を取得。
②現在保持している値よりADC2の値が大きければ1パルス入れカウントアップ。
③逆に小さければ、万歩計をリセット。
④最初に戻る。
こう組む事によって、メインループの中で、ボリュームの手操作に健気に万歩計がついてくるという動作となりました。(映像暗くてすんません)
うまく使えば完成品の表示装置として使えるんじゃないかな…とも。
ソースコードは以下のとおりです。
例によってコンパイルにはavr-gccを使っています。
自分はMacOSXでビルドしております。
#include <avr/io.h>
#include <util/delay.h>
#define cbi(addr,bit) addr &= ~(1<<bit)
#define sbi(addr,bit) addr |= (1<<bit)
void delayms(int ms) {
int n;
for(n = 0 ; n<ms ; n++)
_delay_ms(1);
}
void pulseOut(int ms,int wait) {
cbi(PORTB,0);
//指定ミリ秒間出力0を維持
delayms(ms);
sbi(PORTB,0);
delayms(wait);
}
//指定チャネルからADC値を8ビット取得
uint8_t getADC(uint8_t ch)
{
ADCSRA |= _BV(ADEN);
ADCSRA |= _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);
sbi(ADMUX,ADLAR);//上位8bit
ADMUX |= ch;//ADCchセット
sbi(ADCSRA,ADIF);
sbi(ADCSRA,ADSC);
loop_until_bit_is_set(ADCSRA,ADIF);
return ADCH;
}
int main(void)
{
int rstwait = 500;//resetパルス幅
int clkwidth = 2;//Sigパルス幅
int clkwait = 10;//パルスの待ち時間
uint8_t outvalue = 0;//万歩計への出力数値
int innervalue;
//AD変換可能なポートを入力に設定
DDRB = ~0b00111100;
PORTB = 0b00111100;
//ポートB0を出力に設定
sbi(DDRB,0);
//万歩計に0.5秒間0を入れて初期リセット
pulseOut(rstwait,clkwait);
innervalue = 0 ;
//メインループ
while(1){
//①ADC2より電圧のAD変換値を取得。
outvalue = getADC(2);
if ( outvalue == innervalue ) {
_delay_ms(200);
} else if ( outvalue > innervalue ) {
//②現在保持している値よりADC2の値が大きければ
//1パルス入れカウントアップ
pulseOut(clkwidth,clkwait);
innervalue++ ;
} else if ( outvalue < innervalue) {
//③逆に小さければ、万歩計をリセット。
pulseOut(rstwait,clkwait);
innervalue = 0 ;
}
}
return 0;
}
昨日ダイソーに寄ったので万歩計仕入れてきました
返信削除iPodみたいですね、これ
さっそくバラしてみたいと思います。
バラしてみたけどよくこんなもん108円で売れるわ…と思った
削除液晶の実装方法もなかなか
ソルダリングのコストを抑えてるんですかね
なのに組み上がったらまず確実に動くという
いやもう本当、中身はコストダウンの工夫の塊で感心するばかりです。
返信削除液晶接合部は、ハンダづけだと作業効率が悪いんでしょうね。
あのスポンジみたいなものがどこかで購入できないかとちょっと思うとこはあります。
パーツとして流用するならケースごと考えないとダメそうではありますが
アイロンプリント基板でなんかできないかな。
万歩計の裏のアルミをひっぺがしてLED入れてバックライトつけてみたがイマイチです。
返信削除液晶の裏側にもう少し空間があれば光が拡散するのだけど。