ArduinoNanoEveryでGPSデータロガーの製作その1
以前作ったのはセンサ2系統の電流、電圧ロガーだったので、デバッグ用のシリアル通信が1ポートあれば良かった。なので在庫の、Arduino Pro miniを使ったのだけど、今度はそうはいかない。

GPSのデータをシリアル通信で読み出しながら、センサのログを取りたいので、プログラムのアップロードとモニタ用のシリアルポートがもう一つ必要。
なので、最近よく使っているArduinoNanoEveryを使うことにした。
SDカード読み書きの接続は、SPIのMISO,MOSI,SCKを前回作った回路を参考に接続。
GPSのシリアル受信は、RXD1に接続。




プログラムの書き込みとシリアルモニタはSerialで、GPSの受信は、Serial1を使う。
後はGPSのメッセージを読み込んで、必要な部分だけ抜き出して、文字列を作って、
その後に、アナログ入力の0,1,2,3の値を追加してSDカードに書き出すのを1秒ごとに繰り返すだけ。



あと、追加するとすれば、アナログ入力値を使用するセンサに応じて補正計算。
初期かしてセンサの値のばらつきを較正するとか。


データロガーの製作をもう一度
過去に、リポバッテリーでドローンを飛ばすときの電流、電圧ロガーを作った。
実物はこんな感じ。
データはMicroSDカードに記憶される。SDカードアダプタを使って配線。
プログラムについてはArduinoのサンプルを利用。

 

回路図はこの程度のスケッチ、でもよく見ると作った基板と、回路がちょっと違ってる感じもあって、雑な記録で過去の自分がいまいち信用ならない。



もう一度、違うデータのロガーを作りたいので、これから部品集めととりあえずブレッドボードで試作。
Arduino Nano Everyを使ったマイクロマウス、ソフトウェア移植
以前作ったArduinoのマイクロマウスのソフトを移植しました。

以前のものはこちら。
https://cpu4edu.net/articles/20017.shtml
以前のプログラムのダウンロードはこちらからー>Arduinoマイクロマウス
https://cpu4edu.net/download.shtml

今回移植したプログラムもダウンロードできるようにしました。
基板の設計データも追加しました。
こちらから。
Arduino マイクロマウス(Nano Every 版)
https://cpu4edu.net/download.shtml

動かしてみた動画はこちら。
後は、しきい値やステップ数を調整すれば小さな迷路なら走れるようになると思います。



alt
ヘッダ付きArduino Nano Every マイクロコントローラ
Arduino Nano Every の EveryTimer
もう一つ、ライブラリマネージャーに登録されているタイマーライブラリで、EveryTimerを試しました。

これは、最初に以下のように使えます。
使いにくいところは、常にtimerをアップデートしないといけないところ。
delay(1000)で1秒待ってたりすると、その間タイマーが止まってしまいます。


#include

EveryTimer timer;

void TimerHandler1()
{
static bool toggle1 = false;
digitalWrite(LED_BUILTIN, toggle1);
toggle1 = !toggle1;
}

void setup(){
timer.Every(1000, TimerHandler1);
}

void loop()
{
timer.Update();
}



Arduino nano every のタイマ―割込み
Arduino Nano Every は以前のArduino UNO など Atmega328 で使えた、TimerOneやMsTimer2
が使えません。

探してみたらArduino Nano Everyで使いやすいタイマーありました。ライブラリマネージャーでmegaAVR_TimerInterrupt が検索すると出てきて、インストールして、TimerInterruptTest.ino を起動すると1秒間隔でLEDがON-OFFします。サンプルは長いです。

でも、timer1だけ抜き出すと簡単。
これでloop内のdelay(1000)で止まってるけど100ms毎にLEDを点滅。文字数制限のため変数名短縮、最初の2行はincludeの前にdefine入れとかないとエラーになります。


#define USE_TIMER_1 true // これをinclundeの前で定義しないとエラーになる
#define TIMER1_INTERVAL_MS 1000

#include "megaAVR_TimerInterrupt.h"

void TimerHandler1()
{
static bool toggle1 = false;
digitalWrite(LED_BUILTIN, toggle1);
toggle1 = !toggle1;
}

void setup()
{
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
ITimer1.init();
ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS , TimerHandler1);
}

void loop()
{
delay(10000);
}


- CafeLog -