Arduino UNOとNEO-6MモジュールでGPS目的地通知装置を作る
必要な部品と用品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| NEO-6M GPSモジュール | 1 | 外部アンテナ内蔵、EEPROM内蔵、3-5V動作、デフォルト9600bps、NMEA文対応 |
| LED(汎用) | 1 | 到着通知用 |
| L293D デュアルHブリッジ モータードライバー | 1 | 振動モーター駆動用 |
| 振動ディスクモーター | 1 | 着信通知用 |
| スナップ可能プロトボード | 1 | |
| 9V電池 | 1 | |
| 9V-バレルジャック コネクタ | 1 | |
| ケース | 1 | プロジェクト収納用 |
| ジャンパーワイヤー | 1式 |
必要な工具
- はんだごて
- ワイヤーストリッパー
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
はじめに:問題と解決策
交通渋滞は大きな時間の無駄です。出発地から目的地までどれくらいかかるか予測するのは困難です。2ヶ月前に都市に引っ越してきた筆者は、毎日2時間以上渋滞に巻き込まれ、「この時間を有効活用できないか」と考えました(公共交通機関利用)。
渋滞中にできる生産的な活動:
- 現在および将来のプロジェクトについて考え、計画する
- UdemyやCourseraなどで動画学習やeラーニングを行う
電子工作はいつも筆者を刺激します。そこで、ArduinoとGPSモジュールを使った「目的地通知装置」を製作しました。目的地に近づくとLED点灯や振動モーターで知らせます。両方の回路を用意しています。
まず緯度・経度を取得して目的地を設定し、現在地からの距離を計算。閾値以内になったら通知をオンにするというシンプルなロジックです。
部品と工具の詳細
NEO-6M GPSモジュール
GPS(全地球測位システム)は位置、時刻、速度を取得できます。本モジュールの特徴:
- 外部アンテナ・EEPROM内蔵
- インターフェース:RS232 TTL
- 電源:3V〜5V
- デフォルトボーレート:9600bps
- 標準NMEA文対応
4ピン構成:VCC、RX、TX、GND。ArduinoとはソフトウェアシリアルでTX/RXを接続するだけです。
| GPSピン | Arduino接続 |
|---|---|
| VCC | VIN |
| RX | ソフトウェアシリアルTXピン |
| TX | ソフトウェアシリアルRXピン |
| GND | GND |
L293D IC
16ピンのモータードライバーICで、2つのDCモーターを同時制御可能。マイコンからの微弱な信号をモーター駆動用の大電流信号に変換します。
TinyGPS++ライブラリ
位置情報を扱いやすい形式で取得できるライブラリ。位置以外にも以下が取得可能:
- 日付・時刻
- 速度・方位
- 高度
- 衛星数
- HDOP(水平精度低下率)
緯度・経度の取得
配線は記事末尾のFritzingファイルを参照してください。疑問点はコメントで質問可能です。
位置取得用Arduinoコード
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop() {
while (ss.available() > 0) {
gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print("Latitude= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude= ");
Serial.println(gps.location.lng(), 6);
}
}
}
注意: TinyGPS++ライブラリのインストールが必要です。配線後、シリアルモニタを9600bpsで開くと緯度・経度が表示されます。受信開始まで時間がかかる場合があり、GPSモジュールのLEDが点滅すれば受信中です。
LEDによる目的地通知
取得した緯度・経度を目的地として設定し、現在地からの距離を計算。閾値(例:50m)以内でLEDを点灯させます。
コード(LED版)
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int ledPin = 13;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(ledPin, OUTPUT);
}
void loop() {
while (ss.available() > 0) gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
} else if (millis() - last > 5000) {
Serial.println();
if (gps.location.isValid()) {
static const double Dest_LAT = 18.786254, Dest_LON = 73.880798;
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
Serial.print(F("Distance to Destination ="));
Serial.print(distanceToDest / 1000, 6);
if (distanceToDest / 1000 < 0.050000) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data. Check wiring."));
last = millis();
Serial.println();
}
}
距離(km)が0.05(50m)未満でLEDが点灯します。この値は用途に合わせて調整してください。
完成版:振動モーター通知
プロトタイプが動作したら、Arduino、GPS、モーター・ドライバー、9V電源をケースに収納します。
L293D接続
- 5VをEnable 1、Vs、Vssに接続
- デジタル出力ピン(6、7)をInput 1、2に接続
- Arduino GNDをL293Dの両GNDピンに接続
- Output 1、2をモーター端子に接続
コード(振動モーター版)
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int motorpin1 = 6;
int motorpin2 = 7;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
}
void loop() {
while (ss.available() > 0) gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
} else if (millis() - last > 5000) {
Serial.println();
if (gps.location.isValid()) {
static const double Dest_LAT = 18.786254, Dest_LON = 73.880798;
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
Serial.print(F("Distance to Destination ="));
Serial.print(distanceToDest / 1000, 6);
if (distanceToDest / 1000 < 0.050000) {
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH);
} else {
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, HIGH);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data. Check wiring."));
last = millis();
Serial.println();
}
}
目的地に近づくと振動モーターが作動し、到着を知らせます。楽しい製作を!
提供コードファイル
- Read_Lat_Lng.ino(緯度経度取得)
- Destination_notifier_LED.ino(LED通知版)
- Destination_notifier_motor.ino(振動モーター通知版)
回路図(Fritzingファイル)
- read_lat_lng.fzz
- destination_notifier_led.fzz
- destination_notifier_motor.fzz
製造プロセス
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- JX Wave Generator – Arduino互換DDS発振器(OLEDディスプレイ搭載)
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- Arduino MegaとNEO-6M GPSモジュールの接続:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- ArduinoとTEA5767で作る高性能FMラジオ受信機