一定期間更新がないため広告を表示しています
JUGEMテーマ:鉄道模型
「オニコン格闘記のその3」です。オニコン格闘記と題していますが、ソフトをいじっている期間が途中保留になった期間も含め長期に渡るので、やってきた事を忘れないように備忘録的な視点で書いています。
前回まではオニの2つの角である「ろーたりーえんこーだ」を退治できる目途がつきました。今回はオニのパンツの縞模様の様にやたらに多いボタンについてです。オニコンに装備されているボタン数ですが、まず1番の見た目で特徴となる10連装の10キーと、「ろーたりーえんこーだ」付近のサイドに4つと「ろーたりーえんこーだ」にもスイッチ兼用で装備されています。併せて利用可能なボタン類は16個になります。よくもこれだけの数を付けれたなと思いました。ふと渡された回路図をみてみると。。。なんと全てが抵抗分割のアナログスキャン方式で設計されていました。これはオニです。普通タクトスイッチはデジタルプッツシュ式が一般的というかアナログスキャン方式はあまり使われないと思います。確かにアナログスキャン方式はモジュールPINへ繋ぐ数が少なくて済むメリットはありますが、あまり使われないのそれなりの理由があるわけで、例えば抵抗分割の設計が難しいとかアナログ値の読み取りでソフトを組むのが面倒などデメリットもあります。でももうブツは出来上がってしまっているので取り合えず数のまとまった10キー部分から手を付けることにしました。
まずはアナログキースキャンの理解を深めるため下記のサイトを参考に抵抗分圧の理想的な値を机上で検討してみました。
参考サイト抵抗分圧器を使った、多くのスイッチのセンシング「https://synapse.kyoto/tips/ResDiv/page001.html」
机上で出来上がっているブツの回路構成をみて考えてみましたが抵抗で分圧している値を計算してみると、抵抗値の配分が微妙に均等でないことが気になりました。どうやって決めたんだろ?この点をハード設計した方に問い合わせたところ、どこかのArduinoの機器でつかわれている回路図を転用してきたとの回答でした。あ〜!5V電源のマイコンの回路を転用してしまっている。ESP32は3.3V電源のCPUです。当然搭載されているA/Dコンバータの特性も違ってきます。上手く動かせるのかな…
机上で考えていてもラチがあかなさそうなので、もう現物合わせでやってみるしかないと思い。10キーボタンを押したときに繋がれたピンのADCから値を返す動作確認用の下記スケッチを作って実際に動きを確かめてみることにしました。
------------------------- -------------------------------
/********************************
*BUTTON keyscan
*******************************/
int readButtons1(){
int PushBtnNo;
int inSW1 = analogRead(25); //keyscan read SW1 -> GPIO-25
int inSW2 = analogRead(26); //keyscan read SW2 -> GPIO-26
int inSW3 = analogRead(27); //keyscan read SW3 -> GPIO-27
int inSW4 = analogRead(14); //keyscan read SW4 -> GPIO-14
int inSW4 = analogRead(15); //keyscan read SW4 -> GPIO-15
int inSW5 = analogRead(13); //keyscan read SW5 -> GPIO-13
//Side Btn SW
if (inSW1 < 800){
Serial.print("BUTTON_SW34 ");
Serial.println(inSW1);
PushBtnNo = 34; //BUTTON_SW34;// 実測値= 0.780V 0
return PushBtnNo;
}
if (inSW1 < 1300){
Serial.print("BUTTON_SW3 ");
Serial.println(inSW1);
PushBtnNo = 3; //BUTTON_SW3;// 実測値= 1.180V 0
return PushBtnNo;
}
if (inSW1 < 1700){
Serial.print("BUTTON_SW4 ");
Serial.println(inSW1);
PushBtnNo = 4; //BUTTON_SW4; // 実測値= 1.500V 448
return PushBtnNo;
}
if (inSW2 < 800){
Serial.print("BUTTON_SW56 ");
Serial.println(inSW2);
PushBtnNo = 56; //BUTTON_SW56; // 実測値= 0.780V 0
return PushBtnNo;
}
if (inSW2 < 1300){
Serial.print("BUTTON_SW5 ");
Serial.println(inSW2);
PushBtnNo = 5; //BUTTON_SW5; // 実測値= 1.180V 0
return PushBtnNo;
}
if (inSW2 < 1700){
Serial.print("BUTTON_SW6 ");
Serial.println(inSW2);
PushBtnNo = 6; //BUTTON_SW6; // 実測値= 1.500V 448
return PushBtnNo;
}
//Main Btn SW
if (inSW4 < 110){
Serial.print("BUTTON_SW7 ");
Serial.println(inSW4);
PushBtnNo = 7; //BUTTON_SW7; // 実測値= 0.11V 0
return PushBtnNo;
}
if (inSW4 < 680){
Serial.print("BUTTON_SW8 ");
Serial.println(inSW4);
PushBtnNo = 8; //BUTTON_SW8; // 実測値= 0.680V 448
return PushBtnNo;
}
if (inSW4 < 1550){
Serial.print("BUTTON_SW9 ");
Serial.println(inSW4);
PushBtnNo = 9; //BUTTON_SW9; // 実測値= 1.435V 912
return PushBtnNo;
}
if (inSW4 < 2500){
Serial.print("BUTTON_SW10 ");
Serial.println(inSW4);
PushBtnNo = 10; //BUTTON_SW10; // 実測値= 2.210V 1200
return PushBtnNo;
}
if (inSW4 < 3450){
Serial.print("BUTTON_SW11 ");
Serial.println(inSW4);
PushBtnNo = 11; //BUTTON_SW11; // 実測値= 2.830V 1456
return PushBtnNo;
}
//Main Btn SW12-SW16
if (inSW5 < 110){
Serial.print("BUTTON_SW12 ");
Serial.println(inSW5);
PushBtnNo = 12; //BUTTON_SW12; // 実測値= 0.11V 0
return PushBtnNo;
}
if (inSW5 < 680){
Serial.print("BUTTON_SW13 ");
Serial.println(inSW5);
PushBtnNo = 13; //BUTTON_SW13; // 実測値= 0.680V 448
return PushBtnNo;
}
if (inSW5 < 1550){
Serial.print("BUTTON_SW14 ");
Serial.println(inSW5);
PushBtnNo = 14; //BUTTON_SW14; // 実測値= 1.435V 912
return PushBtnNo;
}
if (inSW5 < 2500){
Serial.print("BUTTON_SW15 ");
Serial.println(inSW5);
PushBtnNo = 15; //BUTTON_SW15; // 実測値= 2.210V 1200
return PushBtnNo;
}
if (inSW5 < 3450){
Serial.print("BUTTON_SW16 ");
Serial.println(inSW5);
PushBtnNo = 16; //BUTTON_SW16; // 実測値= 2.830V 1456
return PushBtnNo;
}
//Rotary Btn SW
if (inSW3 < 850){
Serial.print("BUTTON_SW1&2 ");
Serial.println(inSW3);
PushBtnNo = 120; //BUTTON_SW1&2; // 実測値= 0750V 912
return PushBtnNo;
}
if (inSW3 < 1300){
Serial.print("BUTTON_SW1 ");
Serial.println(inSW3);
PushBtnNo = 1; //BUTTON_SW1; // 実測値= 0.1520V 0
return PushBtnNo;
}
if (inSW3 < 1700){
Serial.print("BUTTON_SW2 ");
Serial.println(inSW3);
PushBtnNo = 2; //BUTTON_SW2; // 実測値= 1.480V 448
return PushBtnNo;
}
//Btn No Push
Serial.println("BUTTON_ERRORR");
Serial.println(inSW1);
Serial.println(inSW5);
PushBtnNo = 0; //ERRORR;
return PushBtnNo;
}
現物の確認方法は、ボタンを押した時につながっている先のピンのADCの値を読んで戻す値をシリアルデバックのログに表示させて1つ1つ確認してゆきました。
この時点ではとりあえず10キーを押した時はそれなりの値が読めそうなことがわかりました。だだしこの後、オニが立ちはだかって奈落の底に落ちていくことになります。。
(C) 2024 ブログ JUGEM Some Rights Reserved.