振り幅が不安定になることがあります。安定した制御のために、ちゃんとしておかないといけないようです。単純にカムか押し棒で旗を振ることを考えてみます。駆動モータとその減速機構の音も含めて、出直しです。CMOSのオペアンプ。安価に買えて便利だった「LMC6482」、秋月が扱いを止めてしまいました。他の部品店ではむちゃ高価に。(水)回路設計はデータシートの熟読から。スペックをちゃんと調べろ!8ピンのATtiny85、14ピンのATtiny84のA/D入力絡みでちょいと失敗。・内蔵のADCを使ってアナログ電圧を測定。できるだけ低くしたい。1.1Vを外に引っ張り出せれれば良いんだが、tiny85もtiny84もそれはできない。・基準電圧を外部に持たせて、Arefピンに供給か。こんな考えで回路を組んだのです。・ATtiny85の場合VccかArefか、内部の1.1Vあるいは2.56V。・ATtiny84の場合VccかArefか、内部の1.1V。この基準電圧選択で「内部の1.1Vが使えるんだから、Arefピンに外部の基準電圧として1.1Vを加えてもかまわないだろう」と、勝手に推測。・ATtiny85・ATtiny84いずれのチップもAref:外部基準電圧の最小値は「2.0V」。外部から1.1Vを入れると・・・A/Dから全ビットHのデータが出てきます。「Arefに入れてる電圧が低いんやぁ」の原因に到達するのにえらく手間取りました。I/Oの初期化ルーチンで、A/Dの基準電圧をVccや内部電圧に切り替えると正しく変換。おもわく通りのデータが出てきます。ところがArefにして外部からの1.1Vだとアウト。その後、データシートを熟読したら「最小2.0V」という記述を発見したという次第です。Aref電圧も徐々にアップすると、1.5Vくらいからデータが出始め、2.0Vのちょい手前から安定になるという挙動でした。Pico:32bitマイコンがバグを生むこの検証用スケッチを書いてみました。★2は引き算結果を(word)でキャストしています。時間待ち関数から抜け出せません。UNOでもオーバーフロー発生部分を無事に通過できます。2466符号なし16bit値同士の減算、オーバーフローが起こっても16bitならうまく「差」が算出されます。FFFF・03E8」となり、不要な上位の「FFFF」は捨てられて下位の16bit値、「03E8」が出てきます。16進の03E8は10進で1000。1000ms待ちが動きます。-64536」とマイナスの値になってしまいます。比較が行われるのです。結果、1000msの経過がチェックできません。今回の例では、減算値ms_0は65002と固定されています。ms_1が0~65535の間を変化しても、1000を越える値は出てきません。いつまでたってもこのdelayルーチンから抜け出せないのです。なんかおかしい」と気が付くわけですが、もっと複雑な処理で、異常の出現まで時間がかかるような場合や、条件が重なった時だけ発生するものだと、むちゃ怖いバグになってしまいます。8bitマイコンで正しく動いていたルーチンを32bitマイコンに持ってくると、転けてしまって動かない。考えておかないと、こんなことが現実に起こります。昔のルーチンを借用する時はどうぞ気をつけてください。UNOの「int」は16ビット。Picoになると「int」は32ビットに。UNOだとついついRAMをケチりたくなって、255までの数値でOKなら「byte」でと「スケッチ」を書いてしまいます。