Mira&Luna's nursery lab

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

手作りGPSロガー  6回目 「マイクロSDカード」

f:id:miraluna:20180107122526j:plain:w350

Mira f:id:miraluna:20180105114819j:plain:w30          🎀目次へ🎀

自作GPSロガーの作り方。第6回目。
今回はGPSで受信した緯度と経度をマイクロSDカードに記録する方法。スロットのつなぎ方とプログラムについて紹介します。

上の写真は秋月電子さんの
マイクロSDカードスロットDIP化キット
[AE-MICRO-SD-DIP] 300円。

基板にマイクロSDのスロットを設置できるキットです。
はんだ付けに慣れている人なんかは、キットの代わりに変換アダプタ(SDカード型の、マイクロSD とセットで売られたりしているもの)から直接配線したりできるみたいだけど、私ははんだを始めたばかりの初心者。
そんな技術はありません。
恥ずかしながら、下の写真のようにはんだがころころと玉のようになってます。
どうして溶けてくれないの? どうしてはじいちゃうの? と苦労していた頃です。練習して、今はもう少し上手になったと思う。

f:id:miraluna:20180103123548j:plain:w300
  ↑ はんだが玉になっている。大変だったんだから。


線の配置について説明します。
f:id:miraluna:20180107161934p:plain

この基板からは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モジュールをつなげていきたいと思います。

続く。


5回目」へ        「7回目」へ

       ★目次へ