Arduino Nanoで抵抗器を効率仕分け:シンプルで時間短縮な自作オームメーター
必要な部品と材料
- Arduino Nano R3 ×1
- 抵抗器 100Ω、1kΩ、10kΩ、100kΩ、1MΩ 各1本(基準抵抗用)
- 0.96インチ OLEDディスプレイ(I2C接続) ×1
- ジャンパーワイヤー
必要な工具
- 3Dプリンター(ケース造形用)
- はんだごて
使用ソフトウェア
- Arduino IDE
プロジェクト概要
プロジェクト完成後に抵抗器が山のように余り、カラーコードを確認して仕分けするのが面倒……そんな「ずぼら」なあなたのための、究極の「ずぼらオームメーター」を作ります。既知の抵抗器をいくつか用意し、Arduinoとディスプレイを組み合わせるだけで、未知の抵抗値を瞬時に測定・表示できる装置です。
原理:電圧分割と自動レンジ切替
電圧分割回路の式 Vout = Vin × R2 / (R1 + R2) を利用します。基準抵抗(R1)と未知抵抗(R2)を直列につなぎ、中点電圧をArduinoのアナログピンで読み取ります。基準抵抗と未知抵抗の値が近いほど測定精度が高まるため、複数の基準抵抗(100Ω〜1MΩ)をデジタルピンで切り替え、読み取り値が最も適切な範囲(約350〜800)に入るものを自動選択します。
回路図

I2C OLEDの場合、Arduino NanoのA4(SDA)、A5(SCL)に接続します。
スケッチのポイント
void loop()内で、最も大きい基準抵抗(1MΩ)から順にデジタルピンをOUTPUT/HIGHにし、アナログ値を読み取ります。- 読み取り値が350未満または800超なら、そのピンをINPUT(高インピーダンス)に戻し、次の基準抵抗へ移ります。
- 適切な基準抵抗が見つかったら、電圧分割式から未知抵抗値
Ruを算出し、標準的な抵抗値(E24系列など)に丸めます。 - 丸め処理は、測定値に応じて10Ω、100Ω、1kΩ…単位で四捨五入するよう改良済みです(元コードでは5kΩ付近で誤差が出るため修正)。
実装例:ブレッドボード上の試作

ケースへの組み込み
3Dプリントしたケースに基板とディスプレイを収め、抵抗器を挿すだけで測定できるよう小さな穴を設けました。基準抵抗は省スペース化のため基板上ではんだ付けしています。

使い方
仕分けしたい抵抗器をケースの穴に差し込むだけで、OLEDに抵抗値が表示されます。作業机の上をスッキリ片付けられます。
完全なスケッチ
Adafruit_SSD1306ライブラリを使用しています。ライブラリマネージャからインストールしてください。ビットマップ画像はお好みで差し替え可能です。
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ビットマップデータ(省略)
int R1 = 100, R2 = 1000, R3 = 10000;
long R4 = 100000, R5 = 1000000;
long Rn;
int D2=2, D3=3, D4=4, D5=5, D6=6;
float raw=0, Vout=0, Ru=0;
int Analogohm = A0;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { for(;;); }
display.clearDisplay();
display.drawBitmap(0,0, myLOGO, 128, 64, WHITE);
display.display();
delay(2000);
}
void loop() {
// 1MΩ基準で測定
pinMode(D2, OUTPUT); pinMode(D3, INPUT); pinMode(D4, INPUT); pinMode(D5, INPUT); pinMode(D6, INPUT);
digitalWrite(D2, HIGH);
raw = analogRead(Analogohm);
Rn = R5;
if (raw < 350 || raw > 800) {
// 100kΩへ
digitalWrite(D2, LOW); pinMode(D2, INPUT);
pinMode(D3, OUTPUT); digitalWrite(D3, HIGH);
raw = analogRead(Analogohm);
Rn = R4;
if (raw < 350 || raw > 800) {
// 10kΩへ
digitalWrite(D3, LOW); pinMode(D3, INPUT);
pinMode(D4, OUTPUT); digitalWrite(D4, HIGH);
raw = analogRead(Analogohm);
Rn = R3;
if (raw < 350 || raw > 800) {
// 1kΩへ
digitalWrite(D4, LOW); pinMode(D4, INPUT);
pinMode(D5, OUTPUT); digitalWrite(D5, HIGH);
raw = analogRead(Analogohm);
Rn = R2;
if (raw < 350 || raw > 800) {
// 100Ωへ
digitalWrite(D5, LOW); pinMode(D5, INPUT);
pinMode(D6, OUTPUT); digitalWrite(D6, HIGH);
raw = analogRead(Analogohm);
Rn = R1;
}
}
}
}
Vout = 5.0 * (raw / 1024.0);
Ru = (Rn * Vout) / (5.0 - Vout);
// 標準値へ丸め
if (Ru < 70) Ru = 10 * round(Ru/10);
else if (Ru < 700) Ru = 100 * round(Ru/100);
else if (Ru < 7000) Ru = 1000 * round(Ru/1000);
else if (Ru < 70000) Ru = 10000 * round(Ru/10000);
else if (Ru < 700000) Ru = 100000 * round(Ru/100000);
else Ru = 1000000 * round(Ru/1000000);
Resistance(Ru);
delay(1000);
}
void Resistance(long Ru) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(F("Resistor value:"));
display.setCursor(20,25);
display.setTextSize(2);
display.print(Ru);
display.print(F(" Ohm"));
display.drawBitmap(0,0, myBitmap, 128, 64, WHITE);
display.display();
delay(2000);
}
設計ファイル
- ケース上部:
cap_yLoQKngMli.obj - ケース下部:
box_AnzsFPqgfe.obj
製造プロセス
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
- RGB 32バンド オーディオスペクトラムビジュアライザー - Arduino LEDマトリックスプロジェクト
- Arduino UNOで作る精密反応速度テスター
- ゼロオーム抵抗器のメリットと実用例:ジャンパー線の代替として