Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

手作りGPSロガー 9回目 最終回 「プログラムを書き込んでいよいよ実装」

f:id:miraluna:20180111120142j:plain:w300        🎀目次へ🎀

Mira f:id:miraluna:20180105114819j:plain:w30
f:id:miraluna:20180111114955p:plain

自作GPSロガーの作り方。第9回目。最終回!

配線図を載せようと作ってみたんだけど、うまく書けない。
きっと理工系の人が見たら、でたらめなんでしょうね。
Fritzingというツールも初めて。

私、いつも配線図は手書きのメモだけだから。

でも、GPSロガーを作ろうとしている人の役に立てばと、恥ずかしいけれど載せます。


〇配線

こうしてみるとそれほど配線は多くないわね。8x8LEDのほうがマイコンの端子を多く使うし。

各モジュールとの具体的なつなぎ方は過去の記事にあるので、分かりにくい時にはそちらを見てね。

★「液晶ディスプレイ」の配線と表示のことならこちら
★「マイクロSDカード」に記録する方法とスロットのつなげ方はこちら
★「GPS受信モジュール」の配線と受信プログラムはこちら

配線図の左上の部分では電源から3.7vと3.3vを作って、それぞれを異電圧の電源としています。
3.7vはバッテリーが3.7v出力なのでそのまま。
3.3vは3端子レギュレーターを使って作っています。

・使用モジュール
 3.7v - 「みつは(ATmega328)」「GPS受信機」
 3.3v - 「液晶ディスプレイ」「GPS受信機(RX線)」「マイクロSDカードスロット」

液晶ディスプレイは省電力が必要な場合に消しておけるように、主電源のスイッチとは別にスイッチを設置した。どうしても長い間宿に泊まれないようなときには、液晶を切ってログだけとれるようにね。きっとルナが上手に使ってくれるでしょう。

マイクロSDカードを使う人はくれぐれも電圧に注意してね。5vの電気を直接流すとカードが壊れちゃうんだって。抵抗のつなぎ方だけで分圧できるから、試験運転の時にも減圧してくださいね。

配線図は規則とか作法とかを知らないので、参考図として見てください。実際に実装したI²CのLCDは、端子が上の4本だけです。端子の名前も本当はSDAとSCLです。こんな仮の図でごめんなさいね。
一番左上にあるバッテリーにつながるコネクタのところ、図の上ではマイナス線がつながっていないけど、それぞれのGND端子はみんなここにつながります。


〇プログラム   ArduinoGPS logger>sketch

以下は、緯度と経度を液晶ディスプレイに表示して、マイクロSDカードに記録するスケッチです。
電源を入れると新しいフォルダを作り、そこに連続して記録します。

#include <Wire.h>
#include <ST7032.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <TinyGPS++.h>
#include <SD.h>

File sd;
TinyGPSPlus gps;
const int cs = 10; //SDカードのチップセレクト
const int rx=8,tx=9; //GPS受信機の通信線 (逆転注意)
SoftwareSerial ss(rx,tx); //GPSとの通信
ST7032 lcd;
char dayfile[16];
int fileNo =0;

void setup(){
lcd.begin(8,2); //8x2のLCD
lcd.setContrast(20); //コントラスト
lcd.clear(); //液晶画面のクリア
Serial.begin(9600); //みつは通信速度
ss.begin(9600); //GPS通信速度
if(!SD.begin()){ //SDカードがない場合
while(1){
lcd.print("Not find SD "); //液晶に表示 SDカードを入れてから電源を入れなおす
delay(350);
}
}
fileName_make(); //ファイルを作る
SdFile::dateTimeCallback(&dateTime); //ファイルに日付をつける。
}

void loop(){
sd =SD.open(dayfile,FILE_WRITE); //SDカードを開く
while(ss.available()>0){ //GPS受信ができている間
if(gps.encode(ss.read())){ //GPSのデータを読んで
log_sd(); //このプログラムは下にあります
}
}
sd.close(); //SDカードを閉じる
}

void fileName_make(){ //ファイル名を作る 2018.1.9.の記事参照
String d;
while(1){
d = "Log";
if(fileNo < 10){
d +="00";
}else if(fileNo < 100){
d +="0";
}
d +=fileNo;
d +=".TXT";
d.toCharArray(dayfile,16);
if(!SD.exists(dayfile)) break;
fileNo++;
}
}

void log_sd(){ //緯度と経度をSDカードに書くプログラム
if(gps.location.isValid()){ //GPSから位置情報を得られていれば
String n;
String m;
n = String(gps.location.lat(),6); //緯度情報を取得
m ="N";
m +=n;
lcd.setCursor(0,0); //液晶ディスプレイの上段に
lcd.print(m); // Nを付けて表示
sd.print(n); //SDカードに緯度を記録
sd.print(","); //SDカードに「,」を記録
n = String(gps.location.lng(),6); //経度情報を取得
m ="E";
m +=n;
lcd.setCursor(0,1); //液晶ディスプレイの下段に
lcd.print(m); //Eを付けて表示
sd.println(n); //SDカードに経度を記録
sd.flush(); //SDカードに書き込んだ記録を保存
}else{
lcd.print("Not Find GPS "); //位置情報を得られるまで、表示
//スイッチを入れてからGPSを捉えるまではこの表示
}
}
//以下のプログラムでログファイルにつける日付を取得する(2019.1月修正)
/*(2020.8月追記)やっぱり以下のコードでは日付を取得できていないかも。ごめんなさい。私にはまだちょっと難しいです。*/
void dateTime(uint16_t* date,uint16_t* time){
uint16_t year =(gps.date.year());
uint8_t month =(gps.date.month()),day=(gps.date.day()),
hour=(gps.time.hour()),minute=(gps.time.minute()),second=(gps.time.second());
*date =FAT_DATE(year,month,day);
*time =FAT_DATE(hour,minute,second);
}


以上、緯度経度記録用GPSロガーのプログラムです。

※スペースが消えて左揃えになり、読みにくいとは思いますがご容赦ください。
※このプログラムでうまく動作しないときは、ライブラリがないのかもしれません。その場合はこの記事 ↓ を参考にしてくださいね。
Arduinoでライブラリを使うための準備




このプログラムをみつはに書き込んで、ICソケットに挿し込めば……
GPSロガーの  完成!

f:id:miraluna:20180111120123j:plain:w300


感慨深いわねえ。


実際にこれを使ってログを取ると……
f:id:miraluna:20180131100546p:plain:w350
こんな感じで表示することができるわ。

上の写真は実際にルナとカタリが自転車で移動した一日のルートを表したもの。旅のルートと詳細については、明日からルナが紹介していきます。



これで全9回の「手作りGPSロガー」の紹介は終わり。
作成・紹介はミラでした。

f:id:miraluna:20180105114819j:plain:w400



続きの+αの記事はこちらから

miraluna.hatenablog.com


高度を記録できる+βの記事はこちらから

miraluna.hatenablog.com


8回目」へ          「+α」へ

        ★目次へ