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