ArduinoNanoEveryでGPSデータロガーの製作、その2
実は困ったことがあって、1分近くすると途中でSDカードの書き込みエラーが起きて、いったんエラーが出てしまうとエラーが続く問題がありました。
いくつか原因を考えたのは、
・電源の問題
GPSもSDカードも同じ3.3Vから電源を取っていたが、GPS受信の際に電力を食ってSDカードの書き込みが不良になる?
ー>キャパシタたくさんつけて電源を補強したけど解決せず、とりあえずはGPSを5Vの別電源から取ってみる。
・メッセージのタイミングの問題
GPSのメッセージが長い時に1秒以上かかり、SDカード書き込みとのタイミングに不具合が生じているのかも?
プログラムを見直したら、メッセージを一通り読み取った後に必要な部分を抜き出して書き込みしてるので、1秒以上メッセージが流れても阻害されことはないはず・・・?
・もしかしたらバッファが影響?
処理中にGPSのメッセージが来て、シリアル受信バッファに文字がたまると何か影響が出るのかも?バッファに文字がたまってもSDカードを書き込みが終わった後に読みに行っているはずだが、念のため・・・
と思ってSDカード書き込みの前と後に、
if (Serial1.available()) {
・・文字受信ほか・・・
noInterrupts();
cardWrite(); // SDカード書き込み
interrupts();
}
と、割り込み禁止と許可を入れてみました。
するとSDカードの書き込みエラーが起こらなくなりました。
ということは、カード書き込み中に何らかの割り込みがおきてタイミングを狂わせてたようです。
考えられるのは、やっぱりシリアル受信のバッファに文字がたまる問題。
シリアル通信で発生する割り込みとしては、serialEventというのがありますがこれは使ってないのに、何かか影響してたんでしょうね。
とにかく問題は解決。
いくつか原因を考えたのは、
・電源の問題
GPSもSDカードも同じ3.3Vから電源を取っていたが、GPS受信の際に電力を食ってSDカードの書き込みが不良になる?
ー>キャパシタたくさんつけて電源を補強したけど解決せず、とりあえずはGPSを5Vの別電源から取ってみる。
・メッセージのタイミングの問題
GPSのメッセージが長い時に1秒以上かかり、SDカード書き込みとのタイミングに不具合が生じているのかも?
プログラムを見直したら、メッセージを一通り読み取った後に必要な部分を抜き出して書き込みしてるので、1秒以上メッセージが流れても阻害されことはないはず・・・?
・もしかしたらバッファが影響?
処理中にGPSのメッセージが来て、シリアル受信バッファに文字がたまると何か影響が出るのかも?バッファに文字がたまってもSDカードを書き込みが終わった後に読みに行っているはずだが、念のため・・・
と思ってSDカード書き込みの前と後に、
if (Serial1.available()) {
・・文字受信ほか・・・
noInterrupts();
cardWrite(); // SDカード書き込み
interrupts();
}
と、割り込み禁止と許可を入れてみました。
するとSDカードの書き込みエラーが起こらなくなりました。
ということは、カード書き込み中に何らかの割り込みがおきてタイミングを狂わせてたようです。
考えられるのは、やっぱりシリアル受信のバッファに文字がたまる問題。
シリアル通信で発生する割り込みとしては、serialEventというのがありますがこれは使ってないのに、何かか影響してたんでしょうね。
とにかく問題は解決。
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秒ごとに繰り返すだけ。
あと、追加するとすれば、アナログ入力値を使用するセンサに応じて補正計算。
初期かしてセンサの値のばらつきを較正するとか。
GPSのデータをシリアル通信で読み出しながら、センサのログを取りたいので、プログラムのアップロードとモニタ用のシリアルポートがもう一つ必要。
なので、最近よく使っているArduinoNanoEveryを使うことにした。
SDカード読み書きの接続は、SPIのMISO,MOSI,SCKを前回作った回路を参考に接続。
GPSのシリアル受信は、RXD1に接続。
プログラムの書き込みとシリアルモニタはSerialで、GPSの受信は、Serial1を使う。
後はGPSのメッセージを読み込んで、必要な部分だけ抜き出して、文字列を作って、
その後に、アナログ入力の0,1,2,3の値を追加してSDカードに書き出すのを1秒ごとに繰り返すだけ。
あと、追加するとすれば、アナログ入力値を使用するセンサに応じて補正計算。
初期かしてセンサの値のばらつきを較正するとか。
データロガーの製作をもう一度
Arduino Nano Everyを使ったマイクロマウス、ソフトウェア移植
以前作ったArduinoのマイクロマウスのソフトを移植しました。
以前のものはこちら。
https://cpu4edu.net/articles/20017.shtml
以前のプログラムのダウンロードはこちらからー>Arduinoマイクロマウス
https://cpu4edu.net/download.shtml
今回移植したプログラムもダウンロードできるようにしました。
基板の設計データも追加しました。
こちらから。
Arduino マイクロマウス(Nano Every 版)
https://cpu4edu.net/download.shtml
動かしてみた動画はこちら。
後は、しきい値やステップ数を調整すれば小さな迷路なら走れるようになると思います。
ヘッダ付きArduino Nano Every マイクロコントローラ
以前のものはこちら。
https://cpu4edu.net/articles/20017.shtml
以前のプログラムのダウンロードはこちらからー>Arduinoマイクロマウス
https://cpu4edu.net/download.shtml
今回移植したプログラムもダウンロードできるようにしました。
基板の設計データも追加しました。
こちらから。
Arduino マイクロマウス(Nano Every 版)
https://cpu4edu.net/download.shtml
動かしてみた動画はこちら。
後は、しきい値やステップ数を調整すれば小さな迷路なら走れるようになると思います。
ヘッダ付き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();
}
これは、最初に以下のように使えます。
使いにくいところは、常に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();
}