概要
M5StickCを使って、導通確認と電圧測定だけができる簡易テスターを作ってみました。ワンバイナリで無印+Plusの両対応になります。
作成物
#include <M5Lite.h>
const int inputBeepPin = 26;
const int inputAnalogPin = 36;
hw_timer_t *timer;
QueueHandle_t xQueue;
TaskHandle_t taskHandle;
const int16_t listCount = 1000;
int16_t list[listCount];
int16_t listIndex = 0;
// タイマー割り込み
void IRAM_ATTR onTimer() {
int16_t data;
// データ取得
data = analogRead(inputAnalogPin);
// キューを送信
xQueueSendFromISR(xQueue, &data, 0);
}
// 実際のタイマー処理用タスク
void task(void *pvParameters) {
int16_t data;
int drawX = 9999;
// 画面初期化
M5.Lcd.fillRect(0, 8 * 3, M5.Lcd.width(), M5.Lcd.height(), DARKGREY);
// 初期値設定
data = analogRead(inputAnalogPin);
for (int i = 0; i < M5.Lcd.width(); i++) {
list[i] = data;
}
while (1) {
// タイマー割り込みがあるまで待機する
xQueueReceive(xQueue, &data, portMAX_DELAY);
// 過去履歴更新
list[listIndex] = data;
listIndex++;
listIndex = listIndex % M5.Lcd.width();
int16_t minVal = 4096;
int16_t maxVal = 0;
for (int i = 0; i < M5.Lcd.width(); i++) {
minVal = min(minVal, list[i]);
maxVal = max(maxVal, list[i]);
}
// X軸計算
drawX++;
if (M5.Lcd.width() <= drawX) {
// 右端まで行ったら初期化
drawX = 0;
}
// 実際の処理
int drawY = map(4095 - data, 0, 4095, 8 * 3, M5.Lcd.height() - 1);
M5.Lcd.fillRect(drawX, 8 * 3, 16, M5.Lcd.height(), DARKGREY);
M5.Lcd.drawPixel(drawX, drawY, WHITE);
Serial.println(data);
M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 0);
M5.Lcd.printf("min %5.3fV\n", 3.3 * minVal / 4095);
M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 1);
M5.Lcd.printf("max %5.3fV\n", 3.3 * maxVal / 4095);
M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 2);
M5.Lcd.printf("now %5.3fV\n", 3.3 * data / 4095);
}
}
void setup() {
M5.begin();
pinMode(inputBeepPin, INPUT_PULLUP);
pinMode(inputAnalogPin, ANALOG);
pinMode(M5_LED, OUTPUT_OPEN_DRAIN);
digitalWrite(M5_LED, HIGH);
M5.Beep.setVolume(1);
// 画面
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("M5StickC Tester");
M5.Lcd.println(" GPIO26 LowBeep");
M5.Lcd.println(" GPIO36 AnalogIn");
// キュー作成
xQueue = xQueueCreate(1, sizeof(int16_t));
// Core1の優先度5でタスク起動
xTaskCreateUniversal(
task, // タスク関数
"task", // タスク名(あまり意味はない)
8192, // スタックサイズ
NULL, // 引数
5, // 優先度(大きい方が高い)
&taskHandle, // タスクハンドル
APP_CPU_NUM // 実行するCPU(PRO_CPU_NUM or APP_CPU_NUM)
);
// 4つあるタイマーの1つめを利用
// 1マイクロ秒ごとにカウント(どの周波数でも)
// true:カウントアップ
timer = timerBegin(0, getApbFrequency() / 1000000, true);
// タイマー割り込み設定
timerAttachInterrupt(timer, &onTimer, true);
// マイクロ秒単位でタイマーセット
timerAlarmWrite(timer, 20 * 1000, true);
// タイマー開始
timerAlarmEnable(timer);
}
void loop() {
static bool beep = false;
M5.update();
if (!digitalRead(inputBeepPin)) {
if (!beep) {
beep = true;
M5.Beep.tone(1000, 1000000);
digitalWrite(M5_LED, LOW);
}
} else {
if (beep) {
beep = false;
M5.Beep.mute();
digitalWrite(M5_LED, HIGH);
}
}
delay(1);
}
M5StickCとM5StickC Plusの両対応なのでM5Lite.hを使っています。
上記ライブラリなので、標準環境とは違っています。

上記のような画面で、導通確認とアナログ入力ができます。
GPIO26は導通確認で、プルアップしてあるGPIO26をLOWに落とすことで音とLEDが光ります。

こんな感じで使います。

アナログ入力はGPIO36の電圧を測定しています。ポテンションメーターをつなげてみました。画面上に最小値、最大値、現在値が表示されます。ちょっとした動作確認に使うことができると思います。
使ってみた

実は昔に購入したフットスイッチがあります。まったく動作確認せずに放置中でした、、、
購入した商品はすでに販売していませんが、上記みたいなのを送料込みで500円ちょっとで購入しました。

横からみるとスイッチとバネがあるだけのかんたんな作りです。フットスイッチはミシン用は安いんですが、見た目が悪いんですよね。音楽用は見た目がいいけれど、お高い、、、
あれ、今見たらそこそこ安いのもありますね。購入したのはタトゥーマシン用のフットスイッチです。音楽用と同じ作りかな?

受け側も必要になるので購入してあります。
かったのはこれかな? モノラルじゃなくてステレオを購入している、、、
さて、動作確認をしていきたいと思います。ジャックにテスターを接続して、フットスイッチを踏んだらピーとなったので導通です。スイッチとしては普通の動作ですね。
ソケットは3端子ありますが、右側に2つ並んでいる端子で上側と、左側の端子がスイッチを踏むと導通しました。間違ってステレオ用のソケットを購入してしまいましたが、まあ大丈夫そうです。
まとめ
フットスイッチの使いみちはありません!
買ってみたかっただけです。そのうち何かに使うかな。。。
今回は導通とアナログですが、簡易オシロスコープ的なのも今後作ってみたいと思います。M5Stackにも対応したかったのですが、手元にあるのがボトムなしのBASICとFireなので気軽に取り出せるGPIOがないのです、、、
コメント