Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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