水上ドローン仕組みは完成。
水上ドローン。一通り思った通りに動かせるようになりました。
学生もちょっと教えただけで自由に操縦できるようになりましたので素直に動いてる感じです。
youtubeに動画をアップしたのでリングを貼ります。
この次は、Pixhawkで自動操縦してみます。
学生もちょっと教えただけで自由に操縦できるようになりましたので素直に動いてる感じです。
youtubeに動画をアップしたのでリングを貼ります。
この次は、Pixhawkで自動操縦してみます。
ArduinoNanoEveryでGPSデータロガーその3、完成
ブレッドボードで作った回路をハンダ付けして作り直しました。
使ったのは、ブレッドボード同じ配線でハンダ付けできる基板。
複雑でない回路なら割と便利に使えます。
複雑な回路は穴が裏でつながってて接点数が足りなくなるので裏で適当にカットして使えばOKです。

センサーは、温度センサを4本取り付けました。
3mのケーブルの途中に4か所取り付けて、0(水面)、1,2,3mの水深の温度をGPSで座標と一緒にとるロガーにしました。
防水のためにタッパーに入れて蓋に穴を開けて、ホットボンドで固定。
ボートに乗せて走らせながら、ちょっと水がかかるくらいなので、このくらいで十分でしょう。

Arduino Nano Every (シングルボード)
使ったのは、ブレッドボード同じ配線でハンダ付けできる基板。
複雑でない回路なら割と便利に使えます。
複雑な回路は穴が裏でつながってて接点数が足りなくなるので裏で適当にカットして使えばOKです。

センサーは、温度センサを4本取り付けました。
3mのケーブルの途中に4か所取り付けて、0(水面)、1,2,3mの水深の温度をGPSで座標と一緒にとるロガーにしました。
防水のためにタッパーに入れて蓋に穴を開けて、ホットボンドで固定。
ボートに乗せて走らせながら、ちょっと水がかかるくらいなので、このくらいで十分でしょう。

Arduino Nano Every (シングルボード)
ArduinoNanoEveryのアナログリファレンス
ArduinoNanoEveryのアナログ入力に温度センサを接続して温度を測ろうと思ってます。
使用する温度センサは、COMSでS-8100Bというのが4つ在庫でありました。
データシートではおおよそ、
-30度で出力2V
90度で出力1V
となってますので測定電圧をVoutとするとおよそ
Temp=90-(Vout-1.0)*120
で計算できます。
次にArduinoNanoEveryのアナログ入力を5Vリファレンスで測定すると分解能が10ビットなので
5/1024=0.0049V
センサ出力が120度/Vだとすると最小分解能が0.097度となります。
約0.1度の分解能なのでそのままでもよさそうですがもう少し高精度に測ろうと思ったら、アナログリファレンスを変えることが考えられます。
analogReference()の説明のページ
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
には、ボードによって選択できるリファレンス電圧とタイプが記載されていますが、ArduinoNanoEveryがどのタイプが使えるかはピンときませんでした。
そこで、搭載されているAtmega4809のデータシートを探すと以下にありました。
https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega4808-4809-Data-Sheet-DS40002173A.pdf
176/551ページ18.51にあります。
0.55, 1.1, 1.5, 2.5, 4.3Vの内部リファレンスが使えると書いてあります。
この値と先のanalogReference()の説明のページとを比較すると、どうやら Arduino megaAVR Boards (Uno WiFi Rev2)のリファレンスと同じようなので、
analogReference(INTERNAL2V5);
をプログラムに追加してみたらうまくコンパイルが通りました。
2.5Vリファレンスにすれば、温度センサの出力範囲に収まって分解能も2倍で約0.05度になります。
校正して使えば相対的な温度差は詳しくとれる感じになるんじゃないかと思います。
使用する温度センサは、COMSでS-8100Bというのが4つ在庫でありました。
データシートではおおよそ、
-30度で出力2V
90度で出力1V
となってますので測定電圧をVoutとするとおよそ
Temp=90-(Vout-1.0)*120
で計算できます。
次にArduinoNanoEveryのアナログ入力を5Vリファレンスで測定すると分解能が10ビットなので
5/1024=0.0049V
センサ出力が120度/Vだとすると最小分解能が0.097度となります。
約0.1度の分解能なのでそのままでもよさそうですがもう少し高精度に測ろうと思ったら、アナログリファレンスを変えることが考えられます。
analogReference()の説明のページ
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
には、ボードによって選択できるリファレンス電圧とタイプが記載されていますが、ArduinoNanoEveryがどのタイプが使えるかはピンときませんでした。
そこで、搭載されているAtmega4809のデータシートを探すと以下にありました。
https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega4808-4809-Data-Sheet-DS40002173A.pdf
176/551ページ18.51にあります。
0.55, 1.1, 1.5, 2.5, 4.3Vの内部リファレンスが使えると書いてあります。
この値と先のanalogReference()の説明のページとを比較すると、どうやら Arduino megaAVR Boards (Uno WiFi Rev2)のリファレンスと同じようなので、
analogReference(INTERNAL2V5);
をプログラムに追加してみたらうまくコンパイルが通りました。
2.5Vリファレンスにすれば、温度センサの出力範囲に収まって分解能も2倍で約0.05度になります。
校正して使えば相対的な温度差は詳しくとれる感じになるんじゃないかと思います。
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秒ごとに繰り返すだけ。

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