デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
必要な部品と用品
| Arduino Nano R3 | ×1 |
| CJMCU-530 (VL53L0X) ToFレーザー距離センサー | ×1 |
| KY-040 ロータリーエンコーダー(プッシュスイッチ付き) | ×1 |
| SSD1306 OLEDディスプレイ(128×64、I2C) | ×1 |
| パッシブブザー | ×1 |
| 10kΩ 抵抗 | ×2 |
プロジェクトについて
子供の成長記録を手軽にデジタル化するための「デジタル身長計(スタディオメーター)」です。ドアフレーム上部に取り付け、レーザー距離センサー(Time-of-Flight方式)で頭頂部までの距離を測定し、オフセット(床からセンサーまでの距離)を引いて身長を算出します。
ステップ1: 使用センサー - VL53L0X (STMicroelectronics)
- 原理: 940nm不可視レーザーの飛行時間(ToF)で絶対距離を測定。反射率の影響を受けにくく、最大2mまで測定可能。
- 安全性: Class 1レーザー製品、目に安全。
- インターフェース: I2C通信(アドレス 0x29)。OLEDもI2Cのため、SDA/SCLに2×10kΩプルアップ抵抗が必要。
- モジュール: CJMCU-530ブレークアウトボードを使用。
ステップ2: 取り付け位置と動作
- ドアフレームの中央上部に設置(壁に近すぎるとクロストーク/干渉で誤測定)。
- 床からセンサー下面までの距離を正確に測り、オフセット値として設定(0〜2.55m)。
- 電源投入後、真下に立ち静止する。2.5秒以上同一距離が継続したら測定確定、ブザーで「成功音」を鳴らしOLEDに身長表示保持。
ステップ3: オフセット校正手順
- ロータリーエンコーダーの押しボタンを押す → 校正モード突入(OLEDに「CAL」表示)。
- ノブを回してオフセット値を設定(時計回り=増、反時計回り=減)。
- 再度ボタン押下で確定 → 異なる2音のビープ音で完了通知。
- 1分間操作なければタイムアウトでキャンセル(値変更なし)。
- 設定値はEEPROMに不揮発保存され、再起動後も保持。
ステップ4: ソフトウェア設計
- ライブラリ: Pololu
VL53L0Xライブラリ(ST公式APIより簡潔)。
GitHub: pololu/vl53l0x-arduino - 動作モード: HIGH ACCURACY + LONG RANGE 設定(測定速度は遅くなるが精度・距離優先)。
- メインループ: 連続測定 → 前回値と比較 → 2.5秒安定で確定 → オフセット減算 → 身長表示 → 成功音再生。
- EEPROM: オフセット値(float, 4バイト)をアドレス0〜3に保存。
ステップ5: 筐体・組み立て
- 3Dプリント筐体(STLファイル提供:
HTAY.stl)。レーザー窓はガラス/アクリルカバーなしで露出(カバーありだとクロストーク補正が複雑になるため)。 - OLED、ロータリーエンコーダー、ブザー、センサーを筐体に固定、配線。
ソースコード
完全なスケッチ HTAY.ino はGitHubまたはダウンロードで入手可能です。主要構造:
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
VL53L0X sensor;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
#define ENC_A 2
#define ENC_B 3
#define ENC_BTN 4
#define BUZZER 5
float offset = 0.0; // EEPROMから読み出し
bool calibMode = false;
unsigned long lastStableTime = 0;
int lastDist = -1;
void setup() {
// ピン設定、I2C初期化、センサー初期化(HIGH_ACCURACY/LONG_RANGE)
// OLED初期化、EEPROMからオフセット読み出し
// エンコーダー割り込み設定
}
void loop() {
if (calibMode) {
// エンコーダーでオフセット調整表示、ボタンで確定/キャンセル
} else {
int dist = sensor.readRangeSingleMillimeters();
if (dist == lastDist) {
if (millis() - lastStableTime > 2500) {
// 測定確定
float height = offset - dist/10.0; // cm単位
displayHeight(height);
playSuccessTone();
}
} else {
lastDist = dist;
lastStableTime = millis();
displayLive(dist);
}
}
}
回路図
I2Cバス: SDA=A4, SCL=A5 に VL53L0X と SSD1306 を並列、2×10kΩプルアップ。ロータリーエンコーダー: A相=D2, B相=D3, SW=D4(内部プルアップ使用)。ブザー=D5。全て3.3V/5V兼用動作可能。
ファイル
HTAY.ino- メインスケッチHTAY.stl- 3Dプリント筐体モデル- 回路図画像
製造プロセス
- Raspberry Pi & HDC2010:I2C温湿度センサー完全セットアップガイド
- OpenSensorsで空気質を測定: ArduinoとPythonによるガイド
- Raspberry PiにTGS2600ガスセンサーを接続して有毒ガスを検知
- 湿度センサーの検証とキャリブレーションで精密測定を実現
- ArduinoでユニバーサルIRリモコンを自作:ステップバイステップガイド
- K30 CO2センサで室内空気質をリアルタイム監視する
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
- サーミスタを使った温度測定: Arduinoステップバイステップガイド
- 人材採用・定着の課題解決:タイトな労働市場で勝つための戦略
- 産業IoTレディネス診断:インダストリー4.0成功への準備はできているか?