盲導ステッキナビゲーター:Arduinoと1Sheeldで作る視覚障害者支援デバイス
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| 1Sheeld ボード | 1 | スマホのセンサー・通信機能をArduinoで利用可能にするシールド |
| Arduino UNO | 1 | メインマイコン |
| Androidスマートフォン | 1 | GPS・SMS・Bluetooth提供用(1Sheeldアプリ必須) |
| リレー汎用 | 1 | 外部回路制御用(本プロジェクトでは未使用?) |
| トグルスイッチ | 1 | 緊急SOSボタン用 |
| 超音波距離センサー HC-SR04 | 2 | 上部・下部障害物検知用(ステッキ先端と中間に配置) |
| DC振動モーター | 2 | 障害物検知時の触覚フィードバック用(PVCパイプ内蔵) |
| ジャンパーワイヤー | 1式 | 配線用 |
| 9V電池(またはモバイルバッテリー) | 1 | Arduino電源用 |
使用アプリ・ソフトウェア
- Arduino IDE
- 1Sheeldスマホアプリ(Google Play / App Store)
プロジェクト概要
従来の白杖では地面の凹凸や階段、頭上の障害物を検知しにくいという課題を解決するため、超音波センサー2個と振動モーター2個をステッキ(PVCパイプ)に内蔵し、上方・前方の障害物を振動パターンで通知する支援デバイスを開発しました。さらに1Sheeld経由でスマホのGPS機能を利用し、トグルスイッチ操作で現在地(緯度・経度)とGoogleマップリンクを守護者や緊急連絡先へSMS送信する機能を実装しています。
卒業研究として6ヶ月かけて製作。電源持続時間の課題(9V電池では短い)や、盲人の方がスマホ操作できない問題(点字対応スマホの不在)など改善点も明確になっています。
動作手順
Step 1: 電源投入
9V電池をUSB電源アダプター経由でArduino UNOに接続。将来的にはソーラーパネル等での長時間駆動化が望まれます。
Step 2: Bluetoothペアリングと1Sheeldアプリ設定
スマホと1SheeldをBluetooth接続し、1SheeldアプリでGPSシールドとSMSシールドを有効化します。盲人の方自身でスマホ操作するのは困難なため、介助者が事前に設定するか、将来的には点字対応や音声操作対応のカスタムアプリ開発が必要です。
Step 3: 障害物検知と振動フィードバック
- 下部センサー(ステッキ先端):距離 < 40cm で振動モーター1(Vib1)を連続振動(段差・穴検知)
- 上部センサー(ステッキ中間):距離 < 100cm で振動モーター1を間欠振動(200ms ON/OFF)(頭上の障害物・枝等検知)
- 振動パターンはコード内の閾値・タイミングで調整可能
Step 4: GPS位置情報と緊急SOS通知
- 1SheeldのGPSシールドから緯度・経度を取得(8桁精度で文字列化)
- トグルスイッチ(SWピン)が押されたら(LOW)、以下のメッセージをSMS送信:
"I need Help! I'm at latitude: [lat] and longitude: [lon] Google Maps - https://www.google.co.in/maps/place/[lat],[lon]"
- 送信先電話番号はコード内の
PhoneNumber定数で設定(守護者や緊急サービス) - 送信後3秒待機で多重送信防止
Step 5: 調整可能パラメータ
- ステッキの長さ(ユーザー身長に合わせて調整可能)
- 検知距離閾値(コード内の
40cm/100cmを変更) - 振動パターン(継続時間・間隔)
ソースコード
#define CUSTOM_SETTINGS
#define INCLUDE_GPS_SHIELD
#define INCLUDE_SMS_SHIELD
#include <OneSheeld.h>
#include <string.h>
#define trigPinL 4
#define echoPinL 5
#define trigPinH 6
#define echoPinH 7
#define Vib1 12
#define Vib2 13
#define SW 8
boolean isInRange = false;
float lat;
float lon;
String PhoneNumber = "0134087286"; // 要変更:緊急連絡先番号
String Message;
String Message1;
String Message2;
char latitude[10];
char longitude[10];
void setup() {
pinMode(trigPinL, OUTPUT);
pinMode(echoPinL, INPUT);
pinMode(trigPinH, OUTPUT);
pinMode(echoPinH, INPUT);
pinMode(Vib1, OUTPUT);
pinMode(Vib2, OUTPUT);
pinMode(SW, INPUT);
OneSheeld.begin();
// Serial.begin(9600);
}
void loop() {
long durationL, distanceL, durationH, distanceH, MixDist;
// 下部センサー測定
digitalWrite(trigPinL, LOW);
delayMicroseconds(2);
digitalWrite(trigPinL, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinL, LOW);
durationL = pulseIn(echoPinL, HIGH);
distanceL = (durationL/2) / 29.1; // cm換算
// 上部センサー測定
digitalWrite(trigPinH, LOW);
delayMicroseconds(2);
digitalWrite(trigPinH, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinH, LOW);
durationH = pulseIn(echoPinH, HIGH);
distanceH = (durationH/2) / 29.1;
// 下部障害物:40cm未満で連続振動
if (distanceL > 40) { digitalWrite(Vib1, HIGH); }
if (distanceL < 40) { digitalWrite(Vib1, LOW); }
// 上部障害物:100cm未満で間欠振動
if (distanceH < 100) {
digitalWrite(Vib1, HIGH);
delay(200);
digitalWrite(Vib1, LOW);
delay(200);
}
// GPS位置取得(コメントアウトされている範囲判定ロジック)
// if(GPS.isInRange(30.0831008,31.3242943,100)) { ... }
// 緊急スイッチ押下でSMS送信
lat = GPS.getLatitude();
lon = GPS.getLongitude();
Message1 = String(lat, 8);
Message2 = String(lon, 8);
if (digitalRead(SW) == 0) { // スイッチON(LOW)で送信
Message = "I need Help! I'm at latitude: " + Message1 + " and longitude: " + Message2;
Message = "Google Maps - https://www.google.co.in/maps/place/" + Message1 + "," + Message2;
SMS.send(PhoneNumber, Message);
delay(3000);
}
delay(1000);
}
回路図・設計ファイル
- Fritzingファイル:
OneSheeldTONGKAT.fzz(Schematicsセクションからダウンロード)
プロジェクトドキュメント・動画
- 卒業研究レポート:FYP 1、FYP 2
- ポスター:FYP 1、FYP 2
- デモ動画:Video 1、Video 2
今後の改善点・展望
- 電源長寿命化:ソーラーパネル搭載や大容量リチウム電池化
- スマホ操作の自動化:専用カスタムAndroidアプリで起動時自動的にGPS/SMS有効化、または音声操作対応
- 小型化・軽量化:Arduino Pro MiniやESP32への移行、基板化
- 検知精度向上:複数超音波センサーの融合、IMUによる姿勢補正
- 商品化・普及:オープンソースハードウェアとして設計公開し、世界中の視覚障害者支援に役立てたい
英語力不足で説明が至らない点がありますが、添付資料・リンクで詳細を確認できます。ご意見・ご質問歓迎します。
製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduino Nanoで37LEDルーレットゲームを自作:ヨーロピアンスタイル完全再現
- ATtiny85ミニアーケード:スネークゲーム - 手のひらサイズOLEDゲーム機の製作
- ポータブル距離検出器:Arduino Nano自作キット(HC-SR04、18650電源、3Dプリントケース付き)
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
- Arduino Nano と OpenCV で実現する自律顔追跡ロボットカー
- 銅メッキプロジェクト:Arduino UNOで作るスマート電気メッキシステム
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- Arduinoシフトレジスタで美しい光のシーケンスを作成