◆M5Stackを使い音声と7セグ表示で測定値を教えてくれる
◆測定項目は、ボタンBにて、操作し、
電圧、電流、抵抗、ロジックを切り替え、
音声出力と7セグ表示させます。
(その1は、電圧測定のみ)
(その1は、電圧測定のみ)
◆測定モードは、ボタンCにて操作し、
手動測定、自動測定、リピート測定としました。
①手動測定・・・・ ボタンAを押したとき測定し出力。
②自動測定・・・・ 値の変化があった時、測定し出力。
③リピート測定・・ 3,5,7,15,31秒間隔でリピート測定し出力。
◆ハードは、出来る限りシンプルにしました。
(その1は、抵抗2本とコンデンサ1個、ピンヘッダ)1.準備
①まず最初に、M5Stackで喋らせるためには、音声合成機能を準備します。
下記URLを参考に、導入し、
サンプル発生までが出来ていること前提としています。
*デモ版の為、ナ、マ行が「ヌ」と発音します。
②トーキングテスターは、上記「SampleTTS.ino」を改造します。
③M5Stackの標準のアナログ入力を使って、(GPIO36,35,26)
電圧、電流、抵抗測定及びロジックテスター作ります。
④アナログ入力については、色々誤差などが有り大変でした。
⑤詳しくは、下記URLが大変参考になり、ありがとうございました。
①ADコンバータのアッテネータの設定を選びます。
ブログのの内容と実際試してみて、「ADC_11db」を選びました。
以下ブログより抜粋(先人の方に感謝です。)
***********************************************************
// analogSetAttenuation(ADC_0db); //アッテネーターを設定
// analogSetAttenuation(ADC_2_5db);
// analogSetAttenuation(ADC_6db);
// analogSetAttenuation(ADC_11db);
***********************************************************
データーシートのリンクがすぐに出てこないのですが、
ADCのキャリブレーション方法について書いてある資料には、
誤差が少ない範囲として、
Atten0 (0dB)は、 100-950mV
Atten1 (-2.5dB)は、100-1250mV
Atten2 (-6dB)は、 150-1750mV
Atten3 (-11dB)は、 150-2450mV
となっていて、下の方もダメと書いてありましたorz
************************************************************
②上記より電圧測定範囲を1.2V~27V未満としました。
③電圧測定の入力部分は、抵抗分圧で10倍としました。
手持ち部品の関係で2MΩと220KΩとしましたが、
出来れば割り切れる1.8MΩと200KΩが良いです。
入 力◎-----2MΩ----+->GPIO36(ADC)
l
GND◎-+-220KΩ--+
l l
+-0.1uF----+-->GND
④AD変換後の電圧値の算出に
「(float)ad*3.3/4096.0*10.0」
・最後の10.0は、入力抵抗の分圧の分です。
の式を使って測定値を出していましたが、
テスター値との乖離があまりにもあり、使えませんでした。
⑤採用したのは、大まかな実測値と計算にて電圧値を算出しました。
結果、ほぼテスターと同じ様な値となりました。
・実測は、2V~27Vまで、1V間隔でAD変換値を記録し、vtblという
配列に保存しました。2V以下は0.1V間隔でltblに保存しました。
・基本値は、配列の位置とし、1Vの間は、1V間の差分を10で割り、
加算しました。
計算式の概略
ad=analogRead(AD_IN);
for (i=0;i<28;i++) {
if ((vtbl[i]<=ad)&&(ad<vtbl[i+1])) break;
}
v2=vtbl[i+1];
v1=vtbl[i];
v3=((ad-v1)/((v2-v1)/10.0))/10.0;
adt=i+v3;
シリアル出力
シリアル出力
ad=1076 i=10 v1=1060 v2=1182 v3=0.131148 adt=10.13
10.13ボルト.
ad :AD変換値
adt:測定電圧値(計算結果)
以上により、ほぼテスター値とほぼ同じくらいの制度となりました。
以上により、ほぼテスター値とほぼ同じくらいの制度となりました。
3.電流測定、抵抗測定、ロジック測定について
その1は、抵抗2本とコンデンサ1個の簡易版とし
電圧測定のみとします。
電圧測定のみとします。
4.測定値の7セグ表示について
①LCDの表示は、7セグメント表示が、かっこいいかなと色々検索してみましたら
M5.Lcd.drawString("V",140,200,4);
5.スケッチについて
①LCDの表示は、7セグメント表示が、かっこいいかなと色々検索してみましたら
M5.Lcd.drawString("V",140,200,4);
M5.Lcd.drawString(String(dt,2),x,80,7); <--の最後の数値を「7」にすることで
7セグ表示出来ました。隠しコマンドかな
*ライブラリの使用例ではサイズとなっている。
M5.Lcd.drawString("文字列", X, Y, {size}) 指定位置に文字列を表示
7セグ表示出来ました。隠しコマンドかな
*ライブラリの使用例ではサイズとなっている。
M5.Lcd.drawString("文字列", X, Y, {size}) 指定位置に文字列を表示
5.スケッチについて
**整理中
以上