工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino UNOとNEO-6MモジュールでGPS目的地通知装置を作る

必要な部品と用品

部品数量備考
Arduino UNO1
NEO-6M GPSモジュール1外部アンテナ内蔵、EEPROM内蔵、3-5V動作、デフォルト9600bps、NMEA文対応
LED(汎用)1到着通知用
L293D デュアルHブリッジ モータードライバー1振動モーター駆動用
振動ディスクモーター1着信通知用
スナップ可能プロトボード1
9V電池1
9V-バレルジャック コネクタ1
ケース1プロジェクト収納用
ジャンパーワイヤー1式

必要な工具

使用するアプリとオンラインサービス

プロジェクト概要

はじめに:問題と解決策

交通渋滞は大きな時間の無駄です。出発地から目的地までどれくらいかかるか予測するのは困難です。2ヶ月前に都市に引っ越してきた筆者は、毎日2時間以上渋滞に巻き込まれ、「この時間を有効活用できないか」と考えました(公共交通機関利用)。

渋滞中にできる生産的な活動:

電子工作はいつも筆者を刺激します。そこで、ArduinoとGPSモジュールを使った「目的地通知装置」を製作しました。目的地に近づくとLED点灯や振動モーターで知らせます。両方の回路を用意しています。

まず緯度・経度を取得して目的地を設定し、現在地からの距離を計算。閾値以内になったら通知をオンにするというシンプルなロジックです。

部品と工具の詳細

NEO-6M GPSモジュール

GPS(全地球測位システム)は位置、時刻、速度を取得できます。本モジュールの特徴:

4ピン構成:VCC、RX、TX、GND。ArduinoとはソフトウェアシリアルでTX/RXを接続するだけです。

GPSピンArduino接続
VCCVIN
RXソフトウェアシリアルTXピン
TXソフトウェアシリアルRXピン
GNDGND

L293D IC

16ピンのモータードライバーICで、2つのDCモーターを同時制御可能。マイコンからの微弱な信号をモーター駆動用の大電流信号に変換します。

TinyGPS++ライブラリ

位置情報を扱いやすい形式で取得できるライブラリ。位置以外にも以下が取得可能:

緯度・経度の取得

配線は記事末尾の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接続

コード(振動モーター版)

#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();
  }
}

目的地に近づくと振動モーターが作動し、到着を知らせます。楽しい製作を!

提供コードファイル

回路図(Fritzingファイル)

製造プロセス

  1. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  2. JX Wave Generator – Arduino互換DDS発振器(OLEDディスプレイ搭載)
  3. Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
  4. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  5. Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
  6. Arduino MegaとNEO-6M GPSモジュールの接続:ステップバイステップガイド
  7. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  8. u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
  9. Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
  10. ゲーム用カスタムArduinoジョイスティックハンドルの製作
  11. ArduinoとTEA5767で作る高性能FMラジオ受信機