以前のチュートリアルでは、GPSモジュールをコンピューターとインターフェースする方法とGSMとGPSを使用して車両を追跡する方法について学びました。また、Arduinoと加速度計を使用して車両事故警報システムを構築しました。ここでも同じプロジェクトを構築していますが、今回はMSP430ランチパッドと振動センサーを使用して車両の事故を検出します。したがって、このプロジェクトでは、振動センサーとMSP430ランチパッドとのインターフェースについても説明します。あなたはここでより多くのMSP430プロジェクトを見つけることができます。
ここでは、振動センサーモジュールが車両の振動を検出し、MSP430ランチパッドに信号を送信します。次に、MSP430はGPSモジュールからデータをフェッチし、GSMモジュールを使用してSMS経由でユーザーの携帯電話に送信します。 LEDは事故警報信号としても点灯します。このLEDは何らかのアラームに置き換えることができます。事故の場所は、GPSモジュールからの緯度と経度から導出されたGoogleマップリンクの形式で送信されます。 最後のデモビデオをご覧ください 。
GPSモジュール は、追跡位置に関連するデータをリアルタイムで送信し、NMEA形式で非常に多くのデータを送信します(下のスクリーンショットを参照)。NMEA形式は複数の文で構成されており、必要な文は1つだけです。この文は$ GPGGAから始まり 、座標、時間、その他の役立つ情報が含まれています。この GPGGA は、全地球測位システム修正データと呼ばれ ます。NMEAセンテンスとGPSデータの読み取りについて詳しくはこちらをご覧ください。
文字列内のコンマを数えることで、$ GPGGA文字列から座標を抽出できます。$ GPGGA文字列を見つけて配列に格納すると、Latitudeは2つのコンマの後に、Longitudeは4つのコンマの後に見つけることができます。これで、この緯度と経度を他の配列に入れることができます。
以下は、$ GPGGA文字列とその説明です。
$ GPGGA、104534.000,7791.0381、N、06727.4434、E、1,08,0.9,510.4、M、43.9、M,, * 47 $ GPGGA、HHMMSS.SSS、latitude、N、longitude、E、FQ、NOS、HDP 、高度、M、高さ、M 、、チェックサムデータ
識別子 |
説明 |
$ GPGGA |
全地球測位システムの修正データ |
HHMMSS.SSS |
時間、分、秒、ミリ秒の形式の時間。 |
緯度 |
緯度(座標) |
N |
方向N =北、S =南 |
経度 |
経度(座標) |
E |
方向E =東、W =西 |
FQ |
品質データを修正する |
NOS |
使用されている衛星の数 |
HDP |
精度の水平希釈 |
高度 |
高度(海抜メートル) |
M |
メーター |
高さ |
高さ |
チェックサム |
チェックサムデータ |
GSMモジュール
SIM900は完全なクアッドバンドGSM / GPRSモジュールであり、顧客や愛好家が簡単に使用できるように組み込むことができます。SIM900 GSMモジュールは、業界標準のインターフェースを提供します。SIM900は、低消費電力で音声、SMS、データにGSM / GPRS 850/900/1800 / 1900MHzのパフォーマンスを提供します。市場で簡単に入手できます。
- AMR926EJ-Sコアを統合したシングルチッププロセッサを使用して設計されたSIM900
- 小型のクアッドバンドGSM / GPRSモジュール。
- GPRS対応
ATコマンド
ATは注意を意味します。このコマンドは、GSMモジュールを制御するために使用されます。Arduinoを使用した以前のGSMプロジェクトの多くで使用した通話とメッセージング用のコマンドがいくつかあります。GSMモジュールのテストには、ATコマンドを使用しました。ATコマンドGSMモジュールを受信した後、OKで応答します。これは、GSMモジュールが正常に機能していることを意味します。以下は 、このプロジェクトでここで使用したATコマンドです。
ATE0エコーオフ用
AT + CNMI = 2,2,0,0,0
ATD
AT + CMGF = 1
AT + CMGS =”携帯電話番号”
>>これでメッセージを書くことができます
>>メッセージを書いた後
Ctrl + Zはメッセージコマンド(10進数で26)を送信します。
HEXでENTER = 0x0d
(GSMモジュールの詳細については、ここでさまざまなマイクロコントローラーを使用したさまざまなGSMプロジェクトを確認してください)
振動センサーモジュール
このMSP430事故警報システムプロジェクトでは、振動または突然の変調を検出する振動センサーモジュールを使用しました。振動センサーモジュールは、モジュールに応じてデジタル出力のHIGH / LOWロジックを提供します。この例では、アクティブHIGHロジック振動センサーモジュールを使用しました。これは、振動センサーが振動を検出するたびに、マイクロコントローラーにHIGHロジックを与えることを意味します。
回路の説明
この車両事故警報システムプロジェクトの回路接続 は簡単です。ここで、GPSモジュールのTxピンは MSP430 Launchpad(ハードウェアシリアル)のデジタルピン番号P1_1に直接接続されており、5vはGPSモジュールに電力を供給するために使用されます。ここでソフトウェアシリアルライブラリを使用することにより、ピンP_6とP1_7でのシリアル通信を許可し、それぞれRxとTxにして、GSMモジュールに接続しました。12ボルト電源はGSMモジュールに電力を供給するために使用されます。振動センサは、 P1_3に接続されています。LEDは事故検出を示すためにも使用されます。残りの接続は回路図に示されています。
プログラミングの説明
このプロジェクトのプログラミングは、GPS部分を除いて簡単です。完全なコードはプロジェクトの最後に提供されます。MSP430でコードを記述またはコンパイルするために、Arduinoと互換性のあるEnergiaIDEを使用しました。Arduino IDE機能のほとんどは、このEnergiaIDEで直接使用できます。
そのため、まず最初に、必要なライブラリを含め、ピンと変数を宣言しました。
#include
与えられた機能は、振動センサー信号の読み取りに使用されます。この機能は、小さな振動や誤った振動もフィルタリングします。
#define count_max 25 char SensorRead(int pin)//デバウンスでswを 読み取る{ char count_low = 0、count_high = 0; do { delay(1); if(digitalRead(pin)== HIGH) { count_high ++; count_low = 0; } else { count_high = 0; count_low ++; } } while(count_low <count_max && count_high <count_max); if(count_low> = count_max) がLOWを返す; それ以外の場合は HIGHを返します。 }
以下の関数は振動を検出し、 gpsEvent() 関数を呼び出してGPS座標を取得し、最後に Send() 関数を呼び出してSMSを送信します。
void loop() { if(SensorRead(vibrationSensor)== HIGH) { digitalWrite(led、HIGH); gpsEvent(); Send(); digitalWrite(led、LOW); delay(2000); } }
指定された関数は、GPSモジュールからGPS文字列を取得し、それらから座標を抽出して、10進形式に変換します。
void gpsEvent() { char gpsString; char test = "RMC"; i = 0; while(1) { while(Serial.available())// GPSからのシリアル受信データ { charinChar =(char)Serial.read(); gpsString = inChar; // GPSからの受信データを一時的な文字列stri ++ に保存します。if(i <4) { if(gpsString!= test)//正しい文字列をチェック i = 0; }
int次数= 0; 度= gpsString-48; 次数* = 10; 度+ = gpsString-48; int minut_int = 0; minut_int = gpsString-48; minut_int * = 10; minut_int + = gpsString-48; int minut_dec = 0; minut_dec + =(gpsString-48)* 10000; minut_dec + =(gpsString-48)* 1000; minut_dec + =(gpsString-48)* 100; minut_dec + =(gpsString-48)* 10; minut_dec + =(gpsString-48); float minut =((float)minut_int +((float)minut_dec / 100000.0))/ 60.0; 緯度=((float)degree + minut);
そして最後に、 Send() 関数を使用して、コードのこの部分に挿入されているユーザー番号にSMSを送信します。
void Send() { GSM.print( "AT + CMGS ="); GSM.print( '"'); GSM.print(" 961 **** 059 "); //携帯電話番号を入力 GSM.println( '"'); delay(500); // GSM.print( "Latitude:"); // GSM.println(latitude); GSM.println( "事故が発生しました"); delay(500); // GSM.print( "経度:"); // GSM.println(logitude); GSM.println( "リンクをクリックして場所を表示"); GSM.print( "http://maps.google.com/maps?&z=15&mrt=yp&t=k&q="); GSM.print(latitude、6); GSM.print( "+"); GSM.print(logitude、6); GSM.write(26); delay(4000); }
完全なコードとデモビデオ を以下に示します。コード内のすべての機能を確認できます。