//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

GPSによる測位の試験


スケッチ(プログラム)の見通しを良くするためにGYSFDMAXBを制御する機能をC++クラス化し、配線を少し修正してから照度センサーを追加しました。テストに使用したスケッチはNMEAセンテンスの中のGGA(Global Positioning System Fix Data)センテンスからデータを測位結果を得るようにしたものです。

IMG_2048

次はBluetoothモジュールとArduinoをシリアル接続して、Arduino側でシリアル割り込みの機能を付加し、Konashi(Bluetoothモジュール)からの要求に対して直近の計測データを返す処理を実装してみようと思います。

以前ならこういうことはやろうと思わなかったことですが、敷居がすごく低くなりました。素晴らしいですね。

Arduinoのスケッチ(プログラム)

#include "GYSFDMAXB_GPS.h"
#include "BME280.h"
#include "L3GD20.h"

// Softwareシリアルで使うデジタルピン番号
const byte rxPin = 10;
const byte txPin = 11;
// 照度センサーから値を読み込むアナログピン番号
const byte illumPin = 0;

SoftwareSerial mySerial(rxPin, txPin);
GYSFDMAXB_GPS GPS(&mySerial);
BME280 BME;
L3GD20 GYRO;
int illuminance = 0;

// GPSレシーバーの設定
void beginGPS() {
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 Hz更新レート
  GPS.sendCommand(PGCMD_ANTENNA);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);
}

// BME280温湿度・気圧センサーの設定
void beginBME() {
  if(!BME.begin(
    BME280_ADDRESS, 
    BME.BME280_STANDBY_1000, 
    BME.BME280_FILTER_OFF, 
    BME.BME280_SPI3_DISABLE, 
    BME.BME280_TEMP_OVERSAMPLING_1, 
    BME.BME280_PRESS_OVERSAMPLING_1, 
    BME.BME280_MODE_NORMAL, 
    BME.BME280_HUMID_OVERSAMPLING_1)) {
    Serial.println("Unable to initialize BME280 sensor");
    while(true);
  }
}

// L3GD203軸ジャイロセンサーの設定
void beginGYRO() {
  if(!GYRO.begin(GYRO.L3GD20_RANGE_250DPS)) {
    Serial.println("Unable to initialize L3GD20");
    while(true);
  }  
}

void setup() {
  Serial.begin(57600);
  while(!Serial) {
    ;  
  }

  Serial.println("Hello");

  beginGPS();
  beginBME();
  beginGYRO();
  
}

// 計測したデータをJSON形式に変換
String jsonResult() {
  String str = "{";
  str += "\"gps.hour\":"; str += GPS.data.hour; str +=",";
  str += "\"gps.minute\":"; str += GPS.data.minute; str +=",";
  str += "\"gps.seconds\":"; str += GPS.data.seconds; str +=",";
  str += "\"gps.milliseconds\":"; str += GPS.data.milliseconds; str +=",";
  str += "\"gps.year\":"; str += GPS.data.year; str +=",";
  str += "\"gps.month\":"; str += GPS.data.month; str +=",";
  str += "\"gps.day\":"; str += GPS.data.day; str +=",";
  str += "\"gps.fix\":"; str += GPS.data.fix; str +=",";
  str += "\"gps.quality\":"; str += GPS.data.fixquality;
  if(GPS.data.fix) {
    str += ",";
    str += "\"gps.latitude\":"; str += GPS.data.latitude; str += GPS.data.lat; str +=",";
    str += "\"gps.longitude\":"; str += GPS.data.longitude; str += GPS.data.lon; str +=",";
    str += "\"gps.speed\":"; str += GPS.data.speed; str +=",";
    str += "\"gps.angle\":"; str += GPS.data.angle; str +=",";
    str += "\"gps.altitude\":"; str += GPS.data.altitude; str +=",";
    str += "\"gps.sattelites\":"; str += GPS.data.satellites;
  }
  str += ",";
  
  str += "\"illuminance\":"; str += illuminance; str +=",";

  str += "\"temperature\":"; str += (double)BME.data.temperature; str +=",";
  str += "\"pressure\":"; str += (double)BME.data.pressure; str +=",";
  str += "\"humidity\":"; str += (double)BME.data.humidity; str +=",";
  
  str += "\"degree.x\":"; str += (int)GYRO.data.x; str +=",";
  str += "\"degree.y\":"; str += (int)GYRO.data.y; str +=",";
  str += "\"degree.z\":"; str += (int)GYRO.data.z;

  str += "}";
  return str;
}


uint32_t timer = millis();

// 計測
void loop() {
  String json;

  if(GPS.newSentenceReceived()) {
    if(!GPS.parse(GPS.lastSentence()))
      return;
  }
  if(timer > millis()) timer = millis();

  if(millis() - timer > 2000) {
    timer = millis();
    illuminance = analogRead(illumPin);
    BME.read();
    GYRO.read();
    json = jsonResult();
    Serial.println(json);
  }
}

計測したデータ

{
  "gps.hour":10,                /* 時 */
  "gps.minute":27,              /* 分 */
  "gps.seconds":10,             /* 秒 */
  "gps.milliseconds":0,         /* ミリ秒 */
  "gps.year":16,                /* 年 */
  "gps.month":3,                /* 月 */
  "gps.day":11,                 /* 日 */
  "gps.fix":1,                  /* 測位の可否 */
  "gps.quality":1,              /* 測位品質 */
  "gps.latitude":3521.68N,      /* 緯度 */
  "gps.longitude":13932.27E,    /* 経度 */
  "gps.altitude":32.20,         /* 海抜高度 */
  "gps.sattelites":5,           /* 測位利用衛星数 */
  "illuminance":50,             /* 照度 */
  "temperature":16.36,          /* 気温 */
  "pressure":1018.05,           /* 気圧 */
  "humidity":56.56,             /* 湿度 */
  "degree.x":1,                 /* X軸傾き */
  "degree.y":0,                 /* Y軸傾き */
  "degree.z":0                  /* Z軸傾き */
}


注意
小さなメモリで動いているマイコンなので、JSON文字列を作るときにバッファオーバーフローのような現象が出ました。キーの名前を短くするなどの対応をして解決しました。
I2C対応のセンサーモジュールはArduinoよりも低電圧で動作するものが多いので、信号の電圧レベル変換が必要らしいです。近々、回路を修正します。

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

評価

ブログ統計

  • 593,676 ヒット

カテゴリー

アーカイブ

カレンダー

2016年3月
« 2月   4月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  
%d人のブロガーが「いいね」をつけました。