google-site-verification: google3bd66dd162ef54c7.html

Arduinoで作る簡易LEDストロボスコープ、回路とスケッチ

 昨日の記事の続き。簡易LEDストロボの回路図などです。

▼回路図
簡易ストロボの回路図
 ATmega328Pを使ってますが、ピンが余りまくってます。最終的には単三2本を昇圧して電源を供給する予定です。

 左がパワーLEDの点灯回路。R1でC1を充電しておいてQ1でドカンと電流を流してLEDを点灯させてます。Q1をONさせっ放しにするとライトとして使えるようにR1の値を決めてます。また、R1があるとプログラムが変な状態になってもLEDを壊す恐れが無いので安心です。

 右下のSW1は周波数を2倍にするスイッチで、ストロボマーカーの誤判定を防止するのに役立ちます。

 発光周期はVR1で設定し、ADCで読むことでプログラムに伝えています。

▼ボリューム角度と回転数の関係
ADCの値と回転数の関係
 ボリュームの回転角に対して回転数の値が対数で変化するようにします。こうするとレンジ切り替えなしのワンダイヤルで500~50000rpmという広い回転数範囲を操作性をあまり損なわないで指定できるようになります。
 またボリュームの角度変化に対し、ストロボマーカーの動きの変化速度が全域にわたって一定になる、という効果もあります。

スケッチは、
/*
LEDストロボスコープ動作確認用
ボリュームの値をADCで読み、LEDの点灯周期を変化させる。
ボリュームの確度に対し点灯周波数はべき乗のカーブで変化。
設定範囲は500~50000rpm
表示機能は今のところ無し。
by ラジオペンチ 2012/10/6
http://radiopench.blog96.fc2.com/
*/

int led = 13;
unsigned int adValue = 0; // ADCの値
float expValue; // べき乗の値
float freq; // 設定周波数
float rpm; // 回転数(rpm)

unsigned long interval; // 単位はμs
unsigned long onTime; //
unsigned long offTime; //
unsigned int duty = 100; // 点灯デューティ

void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
pinMode(8, OUTPUT); // ストロボ用LED
pinMode(9, INPUT); // 周波数二倍スイッチ
digitalWrite(9, HIGH); // Pull UP
}

// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led,HIGH);
adValue = analogRead(5); // ボリュームの値を読む
expValue = 2 * adValue / 1024.0; // 1から40を得るための換算
rpm = 500.0 * pow(10, expValue); // 500から50000rpmの値を得る
digitalWrite(led, LOW);

freq = rpm / 60.0;
interval = 1000000.0 / freq; // μs単位でインターバルを決定

if(digitalRead(9) == LOW){
interval= interval >> 1; // 2倍スイッチが押されていたら周期を半分に
}
onTime = (interval/duty);
offTime = interval - onTime -690; // 690はADCとpow( )のディレイ補正値

digitalWrite(8, HIGH); // ストロボON
delayMicroseconds(onTime);
digitalWrite(8, LOW); // ストロボOFF

usDelay(offTime); // 光らせた後で待つ。こうした方がたぶんADCの値が安定?
}

void usDelay(unsigned long t){ // delayMicosecondsを32ビットに拡張
unsigned int x;
unsigned int y;
unsigned int n = 0;
x = t /10000UL; // 
while(n < x){
delayMicroseconds(10000); // 商の数だけ繰り返す
n++;
}
y= t % 10000UL; // 余り
delayMicroseconds(y);
}

▼ブレッドボード
簡易ストロボのブレッドボード
 今後は液晶を追加して回転数とか周波数とかを表示させる予定です。

 Arduino IDEでプログラムを作って、USBaspでISP書き込みをやってますが、シリアルモニタとか使えないのでデバッグが苦しくなってきました。素直にArduino-UNOを使った方が楽だったみたいです。そのうち乗り換えるか。

 あと、このスケッチでは時間の調整にdelayとdelayMicroseconds関数を使っていますが、液晶表示とかやると時間精度の確保が難しくなってくるはずです。割り込みを使って処理をすればいいのですが、マイクロ秒単位で
割り込みを設定する関数はArduinoには容易されていないようです。micros()関数で絶対時刻を見ながら処理を進める方向でやってみようかと思っていますが、はたしてどうなるやら。
関連記事

tag : 回転数測定 対数変換

コメントの投稿

管理者にだけ表示を許可する

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード