Arduino + GPSモジュール-宛先通知機能
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
|
このプロジェクトについて
はじめに:問題と解決策
交通渋滞が大きな時間の浪費になる可能性があることは誰もが知っています。また、出発地から目的地までの所要時間を予測することは不可能です。
2ヶ月前に街に来たとき、渋滞の問題が私に影響を与えました。私は毎日2時間以上ジャムで立ち往生しています。そして、なぜ今回は何かをするのに利用できないのだろうと感じました。
注:私は公共交通機関を利用しています。 :-)
渋滞に巻き込まれている間にできることは他にもたくさんあります!
以下のもののいくつかは、楽しいだけでなく生産的でもあります:
- 現在および将来のプロジェクトについて、時間を使って考え、計画します。
- 時間を活用して、自分自身を教育したり、教育ビデオを視聴したり、UdemyやCourseraなどのeラーニングコースを受講したりできます。
そしてもちろん作成 エレクトロニクス関連のものは常に私にインスピレーションを与えます。そこで、ArduinoとGPSモジュールを使用して宛先通知機能を構築しました。つまり、目的地の近くにいるときはいつでも、LEDの点灯または振動(ミニ振動モーターを使用)によって通知します。 LEDと振動モーターの両方に回路を提供しました。
そのためには、まず緯度と経度を見つけて場所を定義する必要があります。場所を見つけたら、緯度と経度の値を使用して場所までの距離を見つけ、範囲を維持することで通知機能をオンにできます。ロジックは単純ですよね?!
それでは始めましょう.......
部品とツール:
宛先通知機能を使用するために必要な部分は次のとおりです。
- Arduino UNO
- NEO-6MGPSモジュール
GPS 全地球測位システムの略で、旅行中の位置、時間、速度を決定するために使用できます。
<図>- このモジュールには、外部アンテナと内蔵EEPROMがあります。
- インターフェース:RS232 TTL
- 電源:3V〜5V
- デフォルトのボーレート:9600 bps
- 標準のNMEAセンテンスで動作します
NEO-6M GPSモジュールには、VCC、RX、TX、およびGNDの4つのピンがあります。モジュールはTXピンとRXピンを使用したシリアル通信を介してArduinoと通信するため、配線をこれ以上簡単にすることはできません。
NEO-6MGPSモジュールのArduinoUNOへの配線
VCC VIN
ソフトウェアシリアルで定義されたRXTXピン
ソフトウェアシリアルで定義されたTXRXピン
GND GND
L293D IC
<図>L293Dは、最大2つのDCモーターを任意の方向に同時に制御できる16ピンモータードライバーICです。
L293Dを使用する理由
モータードライバーICまたはモータードライバーへの入力は低電流信号です。回路の機能は、低電流信号を高電流信号に変換することです。この高電流信号は、モーターに送られます。
TinyGPS ++ライブラリ :
TinyGPS ++ライブラリを使用すると、場所に関する情報を便利でわかりやすい形式で簡単に取得できます。
TinyGPS ++ライブラリを使用すると、場所だけでなく、より多くの情報を取得できます。簡単な方法で、場所に加えて、次の情報を取得できます。
>>日付
>>時間
>>速度
>>コース
>>高度
>>衛星
>> hdop
緯度と経度の取得: <図>
接続をより明確にするために、プロジェクトの最後に提供されているフリッツファイルをダウンロードすることをお勧めします。疑問がある場合は、コメントでお気軽にお問い合わせください。
ロケーションキャプチャ用のArduinoコード:
#include
#include
static const int RXPin =4、TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS ++オブジェクト
TinyGPSPlus gps;
// 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 ++ライブラリ
回路図に従って接続し、上記のコードをアップロードします。ボーレート9600でシリアルモニターを開くと、次の出力が表示されます
注: 緯度と経度を取得するには、受信機が信号をキャプチャする必要があるため、時間がかかる場合があります。信号を受信し始めると、GPSモジュールのLEDが点滅します。
<図>
LEDによる宛先通知:
そこで、私のアイデアが機能することを確認するために、LEDを使用して宛先に通知するプロトタイプを作成しました。そこで、前のコード(Read_Lat_Lng.ino)から目的地の緯度と経度の値を追加し、現在の場所から目的地までの距離を見つけました。そして、LEDが点灯しなければならない範囲を設定するためにそれを使用しました。
<図> <図>
コード:
#include
#include
static const int RXPin =4、TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS ++オブジェクト
TinyGPSPlus gps;
// GPSデバイスへのシリアル接続
SoftwareSerial ss(RXPin、TXPin);
//統計情報の場合5秒ごとに発生
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())
{
シリアル。 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())
{
// 'Dest_LAT'を置き換えて現在地に基づく「Dest_LON」値
//Read_Lat_Lng.inoから緯度と経度を見つけることができます
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 ( "宛先までの距離="));
Serial.print(distanceToDest / 1000、6); // *目的地までの距離を出力します
if(distanceToDest / 1000 <0.050000)//ここでdistanceToDest / 1000が0.050000未満の場合、LEDがオンになります。したがって、要件に応じて*距離を目的地まで変更します。
{
digitalWrite(ledPin、HIGH);
}
else
{
digitalWrite(ledPin、LOW);
}
}
if(gps.charsProcessed()<10)
Serial.println(F( "警告:GPSデータがありません。配線を確認してください。"));
last =millis();
Serial.println();
}
}
コードをアップロードすると、シリアルモニターに次のように表示されます。
<図>したがって、宛先までの距離を使用して、出力操作(通知)を実行する必要がある範囲を定義できます。
最後の1つ!
OK、私のプロトタイプはうまくいきました。次に、プロジェクトを、Arduino、GPSモジュール、ドライバーIC付きモーター、および9V電源を収納できるボックスに入れたいと思います。
<図> <図>L293DICへの接続
<図>- 5Vを接続して、L293Dで1、Vs、Vssを有効にします
- デジタル出力ピン(6と7を使用)をL293Dの入力1と入力2に接続します。
- ArduinoのGNDをL293Dの同じ側にある両方のGNDピンに接続します
- 最後に、L293Dの出力1と出力2をモーターピンに接続します。
コード:
#include
#include
static const int RXPin =4、TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS ++オブジェクト
TinyGPSPlus gps;
// GPSデバイスへのシリアル接続
SoftwareSerial ss(RXPin、TXPin);
//統計情報の場合5秒ごとに発生
unsigned long last =0UL;
int motorpin1 =6;
int motorpin2 =7;
void setup()
{
シリアル.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.i sValid())
{
//現在地に基づいて「Dest_LAT」と「Dest_LON」の値を置き換えます
//Read_Lat_Lng.inoから緯度と経度を見つけることができます
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)//ここでdistanceToDest / 1000が0.050000未満の場合、LEDがオンになります。したがって、要件に応じて*距離を目的地まで変更します。
{
digitalWrite(motorpin1、LOW);
digitalWrite(motorpin2、HIGH);
}
else
{
digitalWrite(motorpin1、 HIGH);
digitalWrite(motorpin2、HIGH);
}
}
if(gps.charsProcessed()<10)
Serial.println(F( "警告:GPSデータがありません。配線を確認してください。"));
last =millis();
Serial.println();
}
}
ハッピーメイキング!
コード
- Read_Lat_Lng.ino
- Destination_notifier_LED.ino
- Destination_notifier_motor.ino
Read_Lat_Lng.ino Arduino
#include#include static const int RXPin =4、TXPin =3; static const uint32_t GPSBaud =9600; // TinyGPS ++ objectTinyGPSPlus gps; // GPSへのシリアル接続deviceSoftwareSerial 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); }}}
Destination_notifier_LED.ino Arduino
#include#include static const int RXPin =4、TXPin =3; static const uint32_t GPSBaud =9600; // TinyGPS ++ objectTinyGPSPlus gps; // GPSへのシリアル接続deviceSoftwareSerial ss(RXPin、TXPin); // 5秒ごとに発生する統計の場合sunsignedlong 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()){//現在地に基づいて 'Dest_LAT'と 'Dest_LON'の値を置き換えます//Read_Lat_Lng.inoから緯度と経度を見つけることができますstaticconst 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( "宛先までの距離=")); Serial.print(distanceToDest / 1000、6); // *目的地までの距離を出力しますif(distanceToDest / 1000 <0.050000)//ここでdistanceToDest / 1000が0.050000未満の場合、LEDがオンになります。したがって、要件に応じて*距離を目的地まで変更します。 {digitalWrite(ledPin、HIGH); } else {digitalWrite(ledPin、LOW); }} if(gps.charsProcessed()<10)Serial.println(F( "警告:GPSデータがありません。配線を確認してください。"));最後=ミリ秒(); Serial.println(); }}
Destination_notifier_motor.ino Arduino
#include#include static const int RXPin =4、TXPin =3; static const uint32_t GPSBaud =9600; // TinyGPS ++ objectTinyGPSPlus gps; // GPSへのシリアル接続deviceSoftwareSerial ss(RXPin、TXPin); // 5秒ごとに発生する統計の場合sunsignedlong 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()){//現在地に基づいて 'Dest_LAT'と 'Dest_LON'の値を置き換えます//Read_Lat_Lng.inoから緯度と経度を見つけることができますstaticconst 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( "宛先までの距離=")); Serial.print(distanceToDest / 1000、6); // *目的地までの距離を出力しますif(distanceToDest / 1000 <0.050000)//ここでdistanceToDest / 1000が0.050000未満の場合、LEDがオンになります。したがって、要件に応じて*距離を目的地まで変更します。 {digitalWrite(motorpin1、LOW); digitalWrite(motorpin2、HIGH); } else {digitalWrite(motorpin1、HIGH); digitalWrite(motorpin2、HIGH); }} if(gps.charsProcessed()<10)Serial.println(F( "警告:GPSデータがありません。配線を確認してください。"));最後=ミリ秒(); Serial.println(); }}
回路図
read_lat_lng_l3VSL54w0k.fzz destination_notifier_led_c7qaqTImXg.fzz destination_notifier_motor_fGc8OV6Y0w.fzz 製造プロセス