前回ARM-First boardとI/FしたD1 RBOT/LCD Keypad Shield ですが、今回は
HiLetgo® OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F
とI/Fしました。
今回は、A/D変換についても簡単に説明します。何それ?と思った方は、以下読んで頂ければ必ずA/D変換の本質/基本が理解頂けます。
A/D変換とは簡単に言うと、線形(アナログ)のものを非線形(デジタル)なもので近似することです。
例えば、円は多角形で近似できます。でも多角形の角を幾ら増やしてもその近似は近似であって円にはなりません。円周率を計算しても無限に数点以下の桁数が増えます。
これは、何角形で円を近似しているかと等価なんですね。
LCD Keypad ShieldとWeMos D1 CH340ボードのI/Fして、NTP Clockを動作させている様子
液晶に表示される文字は、セルを組み合わせて表示されます。これもある意味A/D変換と言えると思います。
LCD Keypad Shieldのピン配置
HiLetgo® OTA WeMos D1 CH340 WiFi 開発ボードのピン配置
テスト用のコード(MicroPythonでなくてC言語です。)は、以下の通りです。
A0への電圧入力値から、SELECT/LEFT/UP/DOWN/RIGHT/RESETのどのボタンが押下されているか検知します。
A0から取り込まれた電圧値は、10ビットのデジタル信号に変換されます。その結果を液晶に表示します。
10ビット256(8ビット)*4(2ビット) の組み合わせが可能です。
/* D1 ROBOT/LCD KeyPad Shield A0 switch test & tuning for WEMOS D1 R1 ESP8266 ESP-12F */
// Last update 2020/11/08
// include the LCD library code:
#include <LiquidCrystal.h>
// WEMOS D1 R1 ESP8266 ESP-12F
const int rs = 0, en = 2, d4 = 4, d5 = 14, d6 = 12, d7 = 13 ;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// Set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop() {
int ADCdata = analogRead(A0); // 10bits A/D converter
lcd.setCursor(0, 0);
if (ADCdata < 20) { //
lcd.print("RIGHT ");
}
else if (ADCdata < 210) { //
lcd.print("UP ");
}
else if (ADCdata < 420) { //
lcd.print("DOWN ");
}
else if (ADCdata < 610) { //
lcd.print("LEFT ");
}
else if (ADCdata < 830) { //
lcd.print("SELECT");
}
else {
lcd.print("None ");
}
lcd.setCursor(0, 1);
lcd.print(ADCdata); lcd.print("/1023 ");
delay(500);
}
WEMOS D1 R1 ESP8266 ESP-12Fの電源電圧を3.3Vdc(そのスペックでは、2.5V~3.6Vが動作範囲)です。
3.3Vを1023(10ビット)とすると、max. 3.3Vを1024の諧調(デジタル値:0~1023)で近似しています。
これは、もっともシンプルなPAM(pulse amplitude modulation)というA/D変換方式の簡易形です。
繰り返しになりますが、近似されたアナログ信号をどの様なルールで符号化(デジタル化)するかという一言に尽きます。
ここまでが、A/D変換の話になります。
V(電圧) = I(電流)*R(抵抗)の関係があります。
従って、I:電流が一定の場合に抵抗値と電圧値は比例関係にあります。
830/1024 * 3.3 以上の電圧では、ボタンが押下されていないことを意味します。
830/1024 * 3.3 未満で610/1024 * 3.3 以上の電圧では、SELECTが押下されていることを意味します。
610/1024 * 3.3 未満で420/1024 * 3.3 以上の電圧では、LEFTが押下されていることを意味します。
420/1024 * 3.3 未満で210/1024 * 3.3 以上の電圧では、DOWNが押下されていることを意味します。
210/1024 * 3.3 未満で20/1024 * 3.3 以上の電圧では、UPが押下されていることを意味します。
20/1024 * 3.3 未満の電圧が、RIGHT が押下されていること意味します。
VCC=5Vdc、AD0=A0、R2は、2.2kΩとした方が実測値と理論値が近くなります。
LCD Keypad ShieldのA0は、4.7kΩの抵抗でプルダウンしています。従ってどのボタンも押下されていない場合のA0への入力電圧は、
5V*4.7/6.9 = 3.4V となります。(少々 3.3Vより高い)
R2 | R3 | R4 | R5 | R6 | 合成 | 理論値 | 設定値 | |||||
Open | 2200 | 4700 | 3.405797 | 理論 | 実測 | ARM-First | ESP8266 | |||||
Select | 330 | 620 | 1000 | 3300 | 5250 | 2479.899 | 2.649522 | 883.1741 | 866.6667 | 850 | 830 | |
Left | 330 | 620 | 1000 | 1950 | 1378.195 | 1.925825 | 641.9416 | 633.3333 | 650 | 610 | ||
Down | 330 | 620 | 950 | 790.2655 | 1.321397 | 440.4656 | 400 | 450 | 420 | |||
Up | 330 | 330 | 308.3499 | 0.614647 | 204.8823 | 200 | 250 | 210 | ||||
Right | 0 | 0 | 0 | 0 | 0 | 0 | 50 | 20 |
※ 以上で紹介した回路図は、一部推定を含みます。
取扱いに関しては、各自の責任に於いてお願い致します。
【参照記事】