Superb Garbages 2

千野純一(chinorin)のはてなダイアリーの続きです。

抵抗分圧ボタンの製作

・限られたピンで複数のボタンの状態を検知するやつが必要になったので、抵抗分圧ボタン(って呼ぶのかどうか知らないけど、マイコンのA/Dコンバータと抵抗の分圧を使ってアナログピン1本だけで複数のボタンについて状態を検知する仕組み)をサクっと作った。工作始めてわりと初期に知った「とんちを感じる回路」で、ブレッドボードで実験はしたけど実際に制作って感じのことはしていない気がする。

・今回は5ボタン。いろいろと余裕があるので超適当に、電圧がだいたい1Vくらいの間隔になるようにして、ユニバーサル基板に実装するので部品や配線がおおむね配置通りとなる回路図を書いた。

・ANALOG INPUTで検知する電圧は、どのボタンも押してない状態だと0V。ボタンを押すと、そこに書かれてるくらいの電圧を検知するはず。計算式は、プルダウン抵抗÷(プルダウン抵抗+ボタンと直列の抵抗)×Vcc電圧 となっている*1。例えば一番右のボタンなら 10÷57×5=0.87 *2。理論値なので、検知の際は適度に幅をもって処理する。

・今回は同時押しは考慮しない。現状でも計算すればある程度はできると思うけど、必要なときは 0:1:2:4:8 みたいな2進数チックな比になる定数を採用するとあらゆる同時押しの組み合わせが重複せず検知しやすくなったりする。これ豆。

・で、Arduino Leonardo(というかPro Micro)で受け取るのでADCは10bit。0~1023の1024段階なので、各ボタンを押したときにanalogReadすることで得られる値(の理論値)は 検知電圧÷Vcc電圧×1023 で求められる。つまり左からそれぞれ 1023, 836, 607, 409, 178 となり、何も押してない状態はゼロ、と。ま、適当に前後50くらいの幅をざっくりとっとけば大丈夫っしょ。

・ふっふっふ。ここでこうして、こうじゃ!

・今をときめく人工知能つまり俺 いやその懐かしいハンドルネームはどうでもいいのよ。ChatGPT先生にお越しいただきました。

・お書き賜れたスケッチも正しいように見える。っていうか既存のスケッチに機能を追加するのでこれの大部分はいらないことにここで気づいたが、でもまあ、読んでArduino言語での書き方を思い出す助けになったってことで⋯。

#define FBPIN 21

// 中略
// 以下setup()の中に書く

  pinMode(FBPIN, INPUT);

// 中略
// 以下main()⋯とは限らないな。ぐるぐる回ってボタンとか検知してる場所に書く

  int fb=analogRead(FBPIN);  // Five Buttons
  switch (!0){

    case (fb>=910):
    // (一番左のボタンを1として)1の処理
    delay(500); // 1回処理したら時間をあけないと押したまま判定で何度も実行しちゃう
    break;

    case (fb<=710 && fb>=900):
    // 2の処理
    delay(500);
    break;

    case (fb<=700 && fb>=510):
    // 3の処理
    delay(500);
    break;

    case (fb<=500 && fb>=300):
    // 4の処理
    delay(500);
    break;

    case (fb<=290 && fb>=100):
    // 5の処理
    break;
  }
  

・えっ、C言語⋯じゃなかったArduino言語で switch(1) みたいなのやっちゃだめなんですの? Cは偽が0でそれ以外はぜんぶ真ってことだから偽を反転してるんだが(まー調べたらCの言語仕様として比較演算子の戻り値は真は1で偽は0ということだが、Arduino言語はどうなのか。まあ同じだろうけどw)、検索してもこう書いてる人全然見かけない⋯⋯いやいや、論理的には合ってるからわかりゃーしねえよ。それとも switch(1==1) みたいに書けばいいのか⋯?

・あっ、あーあー、Arduino言語はCと違ってtrueとfalseがあるんでした。ごめんなさい。switch(true) っと。(そもそもそういう問題でもないような?)


コンパイルエラーにつきifとelse ifに書き直した。else ifってぱっと見分岐がそれぞれ等価である感じがしないからきらーい。

*1:つまりANALOG INPUTで測っているのはプルダウン抵抗(10kΩの抵抗)にかかる電圧。

*2:抵抗の値はkを取り除いているが、結局抵抗の値の比をみるだけなので答えは同じ。