Mira 🎀目次へ🎀
自作GPSロガーの作り方。第6回目。
今回はGPSで受信した緯度と経度をマイクロSDカードに記録する方法。スロットのつなぎ方とプログラムについて紹介します。
上の写真は秋月電子さんの
マイクロSDカードスロットDIP化キット
[AE-MICRO-SD-DIP] 300円。
基板にマイクロSDのスロットを設置できるキットです。
はんだ付けに慣れている人なんかは、キットの代わりに変換アダプタ(SDカード型の、マイクロSD とセットで売られたりしているもの)から直接配線したりできるみたいだけど、私ははんだを始めたばかりの初心者。
そんな技術はありません。
恥ずかしながら、下の写真のようにはんだがころころと玉のようになってます。
どうして溶けてくれないの? どうしてはじいちゃうの? と苦労していた頃です。練習して、今はもう少し上手になったと思う。
↑ はんだが玉になっている。大変だったんだから。
線の配置について説明します。
この基板からは10本の端子が出ているけれど、マイクロSD カードの端子は8本。9番と10番はカードの端子には接続していなくて、カードが入っていることを検出するもの。私はつながなかった。
では1番から順に説明していきます。
1番:(データ通信用)使いません。
2番:CS(チップセレクト) D10ピンにつなぎます。(私の場合)
3番:データ入力 D11ピン(MOSI)につなぎます。
4番:プラス電源用 3.3v電源につなぎます。
5番:CLK(クロック) D13ピン(SCK)につなぎます。
6番:グラウンド マイナス電源につなぎます。
7番:データ出力 D12ピン(MISO)につなぎます。
8番:(データ通信用)使いません。
9番:使いません。
10番:使いません。
実際つなぐのは6本だけね。
・動作を安定させるために、プラス電源とマイナス電源の間に0.1μFくらいのパスコン(バイパスコンデンサ)を入れるといいわよ。
注意:マイクロSDカードの通信線(2,3,5番)に5vを通すと、カードが壊れるそう
です。
5v電源を使う場合は、抵抗を使って分圧するなどしてください。
私の電源は3.7vだけど、一応3.3vの定電圧をとれるレギュレータを入れました。
〇プログラム
次にSDカードに情報を書き込むプログラム(Arduinoのスケッチ)を紹介します。
#include <SPI.h> //通信に使うライブラリ
#include <SD.h> //SDカードのライブラリFile sd;
const int cs = 10; // チップセレクトのピン番号
char dayfile[16]; // この後dayfileをつくります
int fileNo =0; //はじめは0からvoid setup(){
Serial.begin(9600); //通信設定
if(!SD.begin()){ //もしSDがなかったら
while(1){
lcd.print("Not find SD "); //液晶に"Not find SD"を表示します
delay(350); //そしてwhile(1)で無限ループ
}
}
fileName_make(); /* SDがあったら、ここでファイルを作ります
つまり、電源を入れるたびに新しいファイルを作ります*/
SdFile::dateTimeCallback(&dateTime); //ここで日付を入れます
}void loop(){
sd =SD.open(dayfile,FILE_WRITE); //カードを開きます
while(ss.available()>0){ //GPSを捉えているあいだ
if(gps.encode(ss.read())){ //GPSからのコードを読んで
log_write(); //log_write(後述)を実行します
}
}
sd.close(); //カードに記録して、閉じます
}void fileName_make(){ //前述の、ファイルを作るところ。番号をふります
String d; //「d」に名前を入れていきます
while(1){
d = "Log"; //まず「log」
if(fileNo < 10){
d +="00"; //10未満のファイルは十の位と百の位が「0」
}else if(fileNo < 100){ //10から99のファイルは百の位が「0」
d +="0";
}
d +=fileNo; //これも加えます。初めの中身は「0」
d +=".TXT"; //拡張子をTXTに指定するために加えます
d.toCharArray(dayfile,16); //名前のついたファイルの完成
if(!SD.exists(dayfile)) break; /*同じファイル名がないとき、 つまり
新しいファイル名になったときに、breakします
(While(1)のループから抜けます)*/
fileNo++; /*ループから抜けなければ、
ファイルNoをひとつ増やして、While(1)へ戻る*/
}
}void log_write(){ //ここが大事な記録用のプログラムよ
if(gps.location.isValid()){ //GPSから受信できていれば
String n;
String m;
n = String(gps.location.lat(),6); //緯度情報を入手
m ="N"; //液晶表示用のN
m +=n; //Nに緯度を加える
sd.print(n); //緯度だけをSDに書く
sd.print(","); //「,」を書く
n = String(gps.location.lng(),6); //経度情報を入手
m ="E"; //液晶用の...以下略
m +=n;
sd.println(n);
sd.flush(); //SDカードに記録
}else{
lcd.print("Not Find GPS "); //GPSから受信できなければ「Not Find GPS」を液晶に表示します
}
}
これはGPSロガーのスケッチから切り取ったソースだから、これだけ書き込んでもSDへは書き込まれない。
そこで試しにSDカードに書き込みをしてみたい方は、以下の試運転プログラムをArduinoに書き込んで試してみてね。
以下、「試運転プログラム」
#include <SPI.h>
#include <SD.h>File sd;
const int cs = 10; // チップセレクトをArduinoのD10へ
char dayfile[16];
int fileNo =0;void setup(){
Serial.begin(9600);
if(!SD.begin()){
return; }
fileName_make();
SdFile::dateTimeCallback(&dateTime);sd =SD.open(dayfile,FILE_WRITE);
sd.print("Hello. I'm Mira.");//この" "に入る言葉をカードに記録します。
sd.close();
}
void loop(){
}
void fileName_make(){
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++;
}
}
以上、「試運転プログラム」
プログラムを開始するたびに0番から順番をつけたテキストファイルが作られるわ。ファイルの中は「Hello. I'm Mira.」よ。自由に書き換えて試してみてね。
追記:)メモリーカードの容量について書かれていないことを教えていただいたので、使用容量についてちょっとだけ紹介します。
ルナとカタリが自転車で旅をしたときの記録をもとにして、おおまかな数値を出してみるわね。
(※ 緯度と経度のみを記録した場合の数値です。+βでは高度も記録するので、もっと容量を使うと思う。「+βの記事」)
二人は朝の7時か8時に出発して、3時か4時くらいにその日の宿泊地へ到着する。その時にGPSのスイッチを切っていたらしいんだけど、切り忘れて夜に切ることも多かったみたい。雨で午前中しか走らない時もあったんだって。そうすると、
・1日の記録(1つのログファイル)は3時間から12時間くらい。
ほとんどは1日に7時間くらい使っていたらしい。
・ファイルのデータ使用容量は1日に375KBから2624KB。
そのほとんどが800KBから1000KBの間に集中してる。
以上のことからおおまかに計算をすると、
「6~8時間で約1MB(1024KB)」に収まる程度。
ということが言えそうね。(2624KBという数値は1日だけ。何があったのかしら)
1日24時間記録をしても、5MBあれば足りそう。そうすると1GBの容量があれば200日以上のログを収められそうね。
一か月くらいのログなら256MB(何年か前まではこのくらいの容量が多かったらしく、中古屋さんでたまに見かけます)のカードで十分でしょうね。
でもこれは「緯度」と「経度」のみを記録する場合。これに「標高」とか「速度」とかも加えたら2倍、3倍になるかもしれないわ。
なったところで、大した使用容量ではないわね。
私は手もとに8GBのものしかなかったので、もったいないけどそれを使っています。
だんだん完成に近づいてきたけど、まだ肝心のGPSについて書いてないわね。次回はGPSモジュールをつなげていきたいと思います。
続く。
★目次へ★