Arduino Unoのシールド基板で、アナログセンサのデバッガーを作ってみた
アナログセンサのデバッガーを、Arduinoシールドで作ってみました。analogRead値をOLEDに表示しているだけでですが、シリアルモニターで確認する手間が省けてだいぶラクになりましたのでその作り方をご紹介いたします。ここで言うデバッガーとは、プログラミングでよく使う機能と同様で、センサが壊れていないかどうかを動作チェックするツールになります。
ゴール(完成イメージ)
アナログセンサデバッガーの完成イメージがこちらの動画になります。動画では、可変抵抗や土壌センサを接続して、ArduinoのADC(ADコンバータ)の値をOLEDに表示している様子を下記のリンクからショート動画でご覧いただけます。Arduino UnoのADCの分解能は10bitですので、0〜1023までの値を取ります。
Arduinoシールドでアナログセンサのデバッガーつくってみた - YouTube
つかうもの
はじめに、この記事で使うものをご紹介いたします。
Arduino Uno
KKHMFさんから出ているArduino Unoの互換品を使用しました。正規品より値段が安く買えるので選んでみました。本家のArduino Unoとまったく同様に動作します。
Arduino Unoであれば他の製品でも構いませんが、Arduino Uno専用のシールドを使いますのでESP32やPro microだと端子がハマりませんのでご注意ください。
▼ Arduinoがいっぱいありすぎてよく分からない方は、こちらの記事で初心者向けの解説をしてます。
Arduino Uno シールド
今回はじめてArduino Uno シールドというものを使ってみました。Arduino Unoの端子にピッタリ合うように作られているユニバーサル基板になります。KEYESTUDIOさんから販売されているものです。10枚セットなのでなかなかお買い得です。
こちらのシールドにはヘッダーピンは付属してませんので別途ご用意ください。
ブレッドボードで組む場合と違ってハンダ付の必要はありますが、ある程度やりたいことが決まっていて、日常的にそれを使いたい場合はこのように少しガッツリと電子回路を作っておくと便利そうです。万が一飽きたりして使わなくなっても、Arduino Unoから簡単に脱着できますので、Arduinoボードの再利用は可能です。
OLED液晶ディスプレイモジュール
アナログセンサの値をディスプレイに表示するために、I2C接続できるOLEDの液晶ディスプレイモジュールを使いました。それほど大きなものは必要ないので、低価格で販売されているこちらの0.91インチで小型のものを使うことにしました。
\OLEDの使い方はこちら/
アナログセンサ
アナログセンサはなんでも構いません。土壌センサやCdSセル、可変抵抗も立派なアナログデバイスです。
アナログセンサデバッガーのシールド基板制作
次の図のように、Arduino UnoとOLEDを配線します。OLEDの電源はArduinoの5Vに繋ぎます。また、OLEDのSCLとSDA端子をArduinoのSCLとSDA端子に接続します。
もちろん可変抵抗はさまざまなアナログセンサに置き換わるため、シールド基板への半田付けは行いません。その代わり写真のように、メスのピン端子を設置しておきました。端子のそばから配線が伸びてますが気にしないでください。オレオレ規格のアナログセンサ端子をつなげるようにした線ですので。
アナログセンサデバッガーのプログラミング
U8g2ライブラリのインストール(OLED SSD1306用)
Arduino IDEのライブラリマネージャーから「u8g2」の単語で検索し、次の写真の通りoliver氏によってリリースされているライブラリをインストールします。
このU8g2ライブラリは、SSD1306のチップが搭載されたOLEDに文字の表示を簡単にできるようにしてくれるライブラリです。I2C通信の難しい知識は必要なく、数行で文字表示ができるので大変便利です。 Githubリポジトリ にサンプル例がたくさん掲載されてますので目を通しておくと良いです。
スケッチ(ソースコード)
アナログセンサデバッガーのスケッチは次の通りです。
/**
* @file AnalogSensorDebugger.ino
* @author Toshihiko Arai
* @brief Dispaly adc value to OLED.
* @version 1.0
* @date 2022-11-08
*
* @copyright Copyright (c) https://101010.fun 2022
*
*/
#include <U8g2lib.h>
#define SENSOR_PIN A0
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
void setup(void) {
pinMode(SENSOR_PIN, INPUT);
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_8x13_tf);
u8g2.drawStr(0, 10, "Analog Sensor");
u8g2.drawStr(0, 23, "Debugger");
u8g2.sendBuffer();
delay(3000);
}
void loop(void) {
int val = analogRead(SENSOR_PIN);
char buf[10];
snprintf(buf, 10, "%d", val);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_8x13_tf);
u8g2.drawStr(0, 10, "ADC value:");
u8g2.drawStr(0, 23, buf);
// u8g2.setFont(u8g2_font_fub35_tf);
// u8g2.drawStr(0, 35, "199.9");
u8g2.sendBuffer();
delay(100);
}
128x32のディスプレイなので U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C を宣言してますが、ディスプレイサイズが違う場合はそれに合わせて変更する必要がありますのでご注意ください。drawStr 関数が文字列で指定する必要があるため、int型を snprintf でchar型に変換してます。