ikkei blog

電子工作やパズルのブログです。主にLEDを使った電子工作をやっています。

delay( 10000 ); これかぁ

2024年12月17日 08時22分57秒 | 組み込みソフト
同じ著者の別の本にあったのがこれです。
こちらはラズパイなのでOSがあります。
OSがあれば無限ループを終端においてOSから起動できるので
このときsleepするのはいいでしょう。

Pythonのtime.sleep(1) は Arduinoのdelay(1000) ですから
これをそのまま Arduino に持ってきたんでしょう。



delay( 10000 ); 再び

2024年12月15日 21時56分04秒 | 組み込みソフト
風呂に入っている時に
ひょっとして dealy 関数に何か消費電流低減とかの技があったりするのか?
と思って風呂上がってさっそく実験してみました。
プログラムはこれ

loop(
    while(true){
        delay( 10000 );
    }
}

ESP32

delay 無し 79.7mA
delay( 1 );  49.7mA
delay( 10 );  48.6mA
delay( 100 );  48.6mA
delay( 1000 );  48.5mA
delay( 10000 );  48.5mA

うーーん、確かに効果はある。10以上にしても変わらないけどね。
delay関数の中でsleepとかしてるんだろうか?

ならば、UNOならどうなんだろう?

Arduino UNO

delay 無し 51.0mA
delay( 1 );  61.0mA
delay( 10 );  61.2mA
delay( 100 );  61.2mA
delay( 1000 );  61.2mA
delay( 10000 );  61.2mA

あれれ?UNOだとdelayの方が消費電流多いね。

ここまでやって気が付いた。
無限ループで動作止めてる時の消費電流気にしてどうすんだ!

結論
ESP32のdelay関数は消費電流が小さくなる。
だけど無限ループに入れるdelayはやっぱり意味がない。

おまけ
デバッグで動作を止める時私は
while(1);
と1行で済ませてます。

ET West

2022年07月29日 09時34分08秒 | 組み込みソフト
昨日は大阪グランフロントで開催されているET Westに行って来ました。
29日もやってます。
ETロボコンもだいぶ変わりましたね。


と思ったら、ラズパイ4使ってるじゃないですか。
よく見ると他のブースもラズパイだらけ、組込みイコールラズパイになってますね。
どこにも在庫ないはずだわー。



Lフワ

2022年04月07日 22時50分22秒 | 組み込みソフト
LEDをじわーっと明るくすることをLフワと言うらしいのですが、Lチカに比べてちょっとコツがあります。

まず、LフワのためにPWM出力を利用します。
デューティを0から255まで増加させます。
しかし、これを実際に見るとじわーっと変化しないのです。

これは、人間の感覚が対数に比例しているからなのです。
このグラフの対数を見るとわかりやすいかと思います。
急に明るくなって変化が小さくなっていますね。



また、このグラフからデューティを50%にしても明るさは7割程度にしかならない。
明るさを半分にするにはデューティを30%くらいにしなければいけない。
と言うこともわかりますね。

(対数はLog 1が0なので、そこが原点になるようにずらして描いてます。式は後述)

と言うことはじわーっとリニアに光るようにするにはPWMを対数の逆関数の指数関数で増やせばいいことになります。



しかし、組み込みでは容量の小さな8ビットマイコンだったりするので指数関数を使うのは処理が重いです。
あらかじめ計算したデータを配列に置く方法だと、滑らかに変化させようとするとデータを細かくしてたくさん必要になって容量を圧迫します。


そこで、組み込みの世界では指数関数の代わりに二次関数を使います。


このグラフを見てください。
どうです?
2乗のグラフがほとんど指数関数に近いのが分かると思います。



2乗するだけなら容量も必要としませんし8ビットマイコンの整数演算でも速く処理できます。
ただしオーバーフローには注意してくださいね。


ATtiny402のフェードインスケッチ
http://ikkei.akiba.coocan.jp/ikkei_Electronics/ATtiny402.html
はこのようにして書いています。変化の時間やタイミングを簡単に変えられるようにconstrain()やmap()などのArduinoの関数をうまく利用しています。
興味のある人はコードを解析してみてください。


グラフの式
リニア y = x
対数  y = log( 1 + 0.9x) * 10
指数  y = (10^(x/10) – 1) / 0.9
2乗  y = x*x