Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Arduinoで簡易的GPSロガー(三軸加速度つき)をつくる

GPSのF9P、三軸加速度、そしてOpenLogをつかって、GPSロガーを作ってみます。

実際のところ

回路構成

Arduino UNO R3 + SparkFun F9P + SparkFun ADXL335 + SparkFun OpenLog + 電源用モバイルルーター

動作クロックが16MHzですが、今回の用途では問題なく動きました。
RAM使用領域が77%なので、これ以上色々載せると少し厳しいかもしれません。
余裕をみたいなら、Nucleo等々の高性能ボードを使うのも一考。

スクリプト

文字列はsprintfで生成してシリアル、OpenLogニそれぞれに渡すことで、少しでもメモリと計算量を節約してます。
また、加速度はクライアント側で対応式にコンバートする想定。
時刻はISO8601記法で、JST変換も加速度と同様クライアント側対応……。

#include <Wire.h> //Needed for I2C to GPS

#include "SparkFun_Ublox_Arduino_Library.h" //http://librarymanager/All#SparkFun_Ublox_GPS
#include "SparkFun_Qwiic_OpenLog_Arduino_Library.h"

OpenLog myLog; //Create instance

SFE_UBLOX_GPS myGPS;

long lastTime = 0; //Simple local timer. Limits amount if I2C traffic to Ublox module.
  
char buf[90];//sprintf用バッファ

int year,month,day,hour,minute,second; //GPS Time
int x, y, z; //Accel data
long latitude,longitude, altitude; //GPS Location 
const int ledPin = 13; //Status LED connected to digital pin 13
const byte OpenLogAddress = 42; //Default Qwiic OpenLog I2C address

void setup()
{
  Wire.begin();
  myLog.begin(); //Open connection to OpenLog (no pun intended)

  Serial.begin(115200);
  while (!Serial); //Wait for user to open terminal

  if (myGPS.begin() == false) //Connect to the Ublox module using Wire port
  {
    Serial.println(F("Ublox GPS not detected at default I2C address. Please check wiring. Freezing."));
    while (1);
  }

  char buf[90];//sprintf用バッファ
  
  myLog.append("gpsdata.txt");

  myGPS.setI2COutput(COM_TYPE_UBX); //I2CをUBX用に限定
  myGPS.saveConfiguration(); //設定を保存
  Serial.println("+++++++++++++++++++++++++");
  myLog.println("+++++++++++++++++++++++++");

}


void loop()
{
  printGPSTime();
  printGPSLocationData();

  x =  (analogRead(A0));
  y =  (analogRead(A1));
  z =  (analogRead(A2));
  sprintf(buf, "%s,%d,%d,%d", buf, x, y, z );  
  Serial.println(buf);
  myLog.print(buf);
  myLog.println();
  myLog.syncFile();
}

void printGPSTime() {
    //ISO8601に則るがバッファ制限っで年度はつけない
    year   = myGPS.getYear();
    month  = myGPS.getMonth();
    day    = myGPS.getDay();                                           
    hour   = myGPS.getHour();
    minute = myGPS.getMinute();
    second = myGPS.getSecond();
    
    sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02dZ", year, month, day, 
                                               hour, minute, second );

    lastTime = millis(); //Update the timer
}

void printGPSLocationData() {
    latitude  = myGPS.getLatitude();
    longitude = myGPS.getLongitude();
    altitude  = myGPS.getAltitude();
    sprintf(buf, "%s,%ld,%ld,%ld", buf, latitude,longitude,altitude);
}