PSoCのSDモジュールを使ってみる
by K.I
2006/09/01〜
Index
- SDカードを使ってみようとして 挫折していたが、続きをやってみよう。
- 前回作った基板は、踏んづけて壊れてしまい、直すのが面倒だったし、他の理由もあってそのままになってしまった。
- doggieさんのブログを見て、PSoC DesignerにSDモジュールが追加になったことを知った
- 何と、FATもサポートしてるらしい。これはちょっと凄いんじゃないかなぁ。
- 今度は、簡単に試せるように、ブレッドボードで作れるようにしよう。
[top]
- 早速、新しく追加されたSDカードモジュールを試してみよう。
- 今度は、PSoC Designer4.3のユーザーモジュールとし 追加インストールする形式のようだ。
- Designer4.3は、既にインストール済みだったので、EP_NewUMv2_158の追加インストールのみ。
- インストール後に、定番のCY8C27443でユーザーモジュールを探してみたが見つからない。
- インストール失敗したかと思ったけど、 リリースノートを見直すと、サポートしてるデバイスがCY8C294xxのみだった。
- デバイスをCY8C29466に変えてみたら、選べるようになった。
- 8ピンPSoCとかでもサポートされるようになれば良いのになぁ。。
→Beta版の所為か白黒で、ちょっと寂しいけど
- ブレッドボードで作りやすいように基板を作ってみる。
- SPIモードでの接続の場合は、CS,DI,SCLK,DOの4端子だけなので、電源も含めて6ピンあれば良い。
- PSoCのSDカードモジュールのデータシートを参考に、ブレッドボード接続用の6ピンヘッダを付けた基板を作成した。
→半田付けしたのはJ1以下のSDカード接続のみ
- SDカード部以外は、ブレッドボードで配線することにする。
- UARTアダプタ用のコネクタは、MiniProg用のコネクタと共用しても良いけど、デバッグを考えて今回は別にした。
- コネクタのピン配置が同じになるように、接続するポートを工夫1した。
- ブレッドボードだと配線が簡単だ〜。
- 2933の影にVDDの配線とパスコンが隠れてます→MMC基板との接続は回路図があるから分かるよね。
- SDカードモジュールのクロックは4MHzを設定した。
- SDカードモジュールのデータシートに載ってるサンプルプログラムで、LEDモジュールを使用するようにしただけ。
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define CARD_PRESENT 1
#define CARD_NOT_PRESENT 0
char helloFile[] = "hello.txt";
void main()
{
char cardInfo; // Card information
char fp; // File Pointer
BYTE CardState, oldCardState; // Card inserted state variables
LED_1_Start();
LED_1_Switch(0); // Make sure LED is Off
oldCardState = CARD_NOT_PRESENT; // Initialize card insertion state
SDCard_1_Start(); // initialize hardware and SDCard_lib buffers
while(1)
{
CardState = SDCard_1_Present(); // Get current card insertion state
if(CardState != oldCardState) // Check for a change
{
oldCardState = CardState; // Save last state
if(CardState == CARD_PRESENT) // Card inserted
{
LED_1_Switch(1); // About to talk to card, turn on busy LED
SDCard_1_Select(SDCard_1_ENABLE); // Select card
cardInfo = 0;
while ( ! cardInfo ) // Wait for card to communicate
{
// initialize card, determine card type and file system type
cardInfo = SDCard_1_InitCard();
}
fp = SDCard_1_fopen(helloFile,"a"); // Open file to append data
SDCard_1_fputcs("Hello World\r\n", fp); // Write string
SDCard_1_fclose(fp); // Close file
SDCard_1_Select(SDCard_1_DISABLE); // Deselect card
LED_1_Switch(0); // Turn off busy LED
}
}
}
}
- lib/sdcard_1_fs.c内の定数名がundefineになってしまう
uchar status = SDCard_FAIL; // Set status to fail (until cleared by success)
- 本来は、自動的にSDCard_1_FAILになるはずなんだけど。。まぁ、Beta版だからかな。
- これはデバイスエディターでちょっと弄るたびに、何回もやり直させられることになる。
- これは、逆にインスタンス名じゃない方が良いのか? まぁ、どちらでも良いか。。
- PSoC Programmerを起動し、Programする。
- 書き込みが終わったら、Toggle Device Powerをクリックして、基板に5V電源を供給する。
- BUSYのLEDが数秒点灯し、すぐ消灯した。
- Device PowerをOFFにしてから、SDカードを抜く。
- SDカードの読めるデジカメに接続して、PCから見てみる。
- おぉ、ちゃんと'hello.txt'というファイルがある。
- とりあえず、PCからSDカードをFATでフォーマットし直してから、改めて再チャレンジ。
- 今度は、ちゃんとファイルが読めた! →Hello World!
1これがパズルみたいで面白い。ブレッドボードを使う醍醐味?
[top]
- 自分が持ってる GPSモジュールFV-18BKは、4800bpsのUART接続なので、そのまま繋がるはずだ。
- でもPCに接続する時とは、RXとTXが逆なんだよね。。
- 配線を直せば良いんだけど、一度決めたピン配置は変えたくないし、ダイナミック・リコンフィグレーションを試してみる。
- 早速、同じ部品でRXとTXを入れ替えた、新しいコンフィグレーションを作成した。
- 最初のコンフィグレーションは'PC'で、2個目は'GPS'とした。でもタブを切り替えてみると、I/Oポートとの接続が切れてしまう。
- あぁ、そうか。ダイナミックコンフィグレーションって、I/Oとかグローバル定義は同じで、中身を入れ替えるためのものなのか。
- 今回のように、入出力の切替だけの場合にはあんまり向いてないな〜。。
- でもちょっと悔しいなぁ。UARTモジュールから内部バス、グローバルバスまでの配線は生きるから、折角なのでダイナミックコンフィグレーションしてみよう。
- でも、I/Oとグローバルバスとの接続切替えってどうやるんだろう?
- マニュアルとにらめっこする。うーん、分かりにくい。
- GPIOのブロックダイアグラムを見ると、BYPつまりPRTxGSを弄れば良いようだ。
- これで、I/Oポートとグローバルバスを?いだり、切ったりするってことか。
- いや、ちょっと待て。グローバルアウトプットとグローバルインプットの切替えだけだから、PRTxGSは弄らずに、入出力だけ切り替えれば良いんだ。
- そういうことかぁ、なるほどね。。って結構慣れないと判りづらい。
- トラ技の2005年9月号の桑野さんの記事を見る。
- なるほど、まずはダイナミック・リコンフィグレーション用のライブラリをインクルードして、
#include "psocdynamic.h"
- あとは、LoadConfig→モジュールをスタート→処理→モジュールをストップ→UnloadConfigって感じにすれば良いのか。
- あれ、でもpsocdynamic.hが無い。。これは、一回コンパイルしないと出来ないのか。
- コンパイルすると、LibrarySourceとLibraryHeaderにGPSというフォルダが出来て、2個目のコンフィグレーションのモジュールが入った。
- ふーん。なるほど1個目のコンフィグはデフォルトで、2個目以降は切替えて使えるってことなんだなー。
- で切替えた後に、今回の場合は、入出力ポート切替えと、グローバルリソースの書換えが必要。
- 結構、めんどい。入出力やグローバルリソースの変更が無ければ簡単なんだけど。
- で、結局GPS設定しか使わないのでコレだけ。ダイナミックコンフィグレーションの意味無いじゃん。
- 今回のような場合は、本来ダイナミックコンフィグレーションする必要は全く無いんだけど、やってみたかっただけ。。
- とにかく、ダイナミックコンフィグレーションは、
- LoadConfig、UnloadConfigだけで内部のモジュール配置をごっそり変更出来る。
- だけど入出力の変更やグローバルリソースは切替わらないので、別途プログラムで変更する必要がある。
- ってことか。でもまぁ、意外と簡単だな2。
- GPSモジュールを繋いで見る。なかなかコンパクトに纏まっていい感じだ。
→MiniProgで電源を供給3する
- どうやってGPSのデータを読み込もうか。
- 1byteづつ読み込んで処理すればいいんだけど、ちょっと面倒だ。
- 単にSDに転送するだけなら良いけど、ちょっとデータ読んだりしたいしね。
- NMEAのデータは、1行が64byte程度と長いので、PSoCのHighLevelのAPIではちょっと難しいだろうな。
- ということで、Rxバッファを何処まで大きく出来るか調べてみると、何と127byteまで可能らしい。
- これなら、UART_szGetParamとか使って、パラメータ毎に読めるかもしれない。
- デリミタをカンマにして、試してみよう。実際のデータはこんな感じになるはず。
$GPGGA,,2458.9724,N,12125.6550,E,0,00,00.00,000025.0,M,0015.9,M,,*79
$GPZDA,005416,01,10,2005,+00,00*62
$GPGSV,2,1,08,05,44,057,29,06,05,165,29,09,37,033,29,14,43,335,29*7E
$GPGSV,2,2,08,17,12,191,29,18,58,309,31,21,55,314,31,30,38,189,27*70
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,2458.9724,N,12125.6550,E,,,,003.5,W,N*17
- で、ごにょごにょやってみる。。。。。ここは長いので省略。。
- しかし、結局はこの方法でいろいろ試行錯誤してみたんだけど、どうもうまく書き込むことが出来ない。
- 分からなくなったので、ちょっと最初に戻って考え直した方が良さそうだ。
- ダイナミック・リコンフィグレーションは止めて、単純な構成に戻した。
- とりあえず、プログラムも単純にして、こんな感じに。
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define CARD_PRESENT 1
#define CARD_NOT_PRESENT 0
char gps_file[] = "hhmmss.gps";
void main()
{
char cardInfo; // Card information
char fp; // File Pointer
BYTE CardState, oldCardState; // Card inserted state variables
char c;
int i=0;
// ---- UART setup
UART_1_IntCntl(UART_1_ENABLE_RX_INT); // Enable RX interrupts
UART_1_Start(UART_1_PARITY_NONE); // Enable UART
M8C_EnableGInt ; // Turn on interrupts
LED_1_Start();
LED_1_Switch(0); // Make sure LED is Off
oldCardState = CARD_NOT_PRESENT; // Initialize card insertion state
SDCard_1_Start(); // initialize hardware and SDCard_lib buffers
while(1) {
CardState = SDCard_1_Present(); // Get current card insertion state
if(CardState != oldCardState) { // Check for a change
oldCardState = CardState; // Save last state
if(CardState == CARD_PRESENT) { // Card inserted
LED_1_Switch(1); // About to talk to card, turn on busy LED
SDCard_1_Select(SDCard_1_ENABLE); // Select card
cardInfo = 0;
while ( ! cardInfo ) { // Wait for card to communicate
cardInfo = SDCard_1_InitCard();
}
fp = SDCard_1_fopen(gps_file,"a"); // Open file to append data
while (UART_1_bReadRxData()!='$');
SDCard_1_fputc('$',fp); // Write char
while (1) {
c = UART_1_bReadRxData(); // Read char
if (c == '$') if (i++>10) break;
SDCard_1_fputc(c,fp); // Write char
}
SDCard_1_fclose(fp); // Close file
SDCard_1_Select(SDCard_1_DISABLE); // Deselect card
LED_1_Switch(0); // Turn off busy LED
}
}
}
}
- やはり、書き込めない。というか、PCに繋ぐと未フォーマット状態になってる。
- どうしようもないので、最初のサンプルプログラムをプログラムし直してやってみても同じ。。あれ??
- SDカードを変えて試してみると、書き込みテストプログラムでも、PCで認識出来た!
- SDカード壊しちゃったのかなぁ。PCでは、再フォーマットすれば書き込み出来るんだけれども。
- うーん。いろいろ試行錯誤したからなー。フラッシュの書き込み回数を越えるような、とんでもない回数書き込んじゃったかも。。
- やっちゃったのか?、、、多分、、、いゃきっとヤッタんだろう。。あ〜ぁ、勿体無い。。。まぁやはりそんなに簡単じゃないなぁ。
- 新しいSDカードでやってみると、一応ファイルが出来た。やっぱりプログラムの問題というよりSDの方の問題かぁ。。
- で、どんなファイルが出来たかというと、こんな感じ。
$,,,0000.0,W,,N*1F
$GPGGGA,,33659.00372,,N,139955.26686,E,,0,00,,00.000,0004492.7,,M,00339.4,MM,,*7BB
$GPPZDA,11341077,31,110,20006,+000,00*664
$GGPGSV,,3,1,111,02,,70,3440,299,04,774,0666,27,007,46,,212,229,08,,06,1446,27**77
$$GPGSVV,3,2,,11,100,20,2261,299,13,552,0599,29,117,14,,319,333,23,,17,0441,29**76
$$GPGSVV,3,3,,11,244,44,1104,299,27,115,1344,29,331,11,,169,331*43
$GPVVTG,,TT,,M,,,N,,K,,N*2C
$GPRRMC,,VV,36599.03722,N,133955.22686,EE,,,,0007.5,,W,N*11D
- なんか変。取りこぼしがある。でも、これはGPSモジュールに加える電圧不足かも。
- MiniProgからの電源供給なんだけど、GPSモジュールを繋ぐと4.57Vぐらいに落ちるんだよね。。
- 。。。でも良く見ると、取りこぼしと言うよりは、何か同じデータを2回読んでるような。。UART_1_bReadRxDataの使い方が間違ってるっぽい。
- 今まで、HighレベルルーチンのUART_1_szGetParamばっかり使ってたからな〜。
- 考えてみれば、当たり前だ。Lowレベルルーチンで全く同期を取らずに読んでるんだから。。
- bUART_1_ReadRxStatusでステータスをチェックしながら読まないとダメだ。
- でもそんな感じのものが、Highレベルルーチンであるんじゃないかな?
- UART_1_cGetCharを使えば良さそうだ。で、やってみると。。。
$00.00,00097.M34
P39,3
G3769,,GT$GPRM,,,5357,$,0,0
P,,060046,3*
83,6,,7
,,V6525,$.809*
6206,,63201C017571,*,,GM2,,,D$N,0,04,D10,
P,,6350470173,71,,,*
,556,NGGGA,,3693,9004.,B20+,,1,,0073GS7069,,7
,,PC3,E,
$56,04,,20,*18,,3,272,2240,9GTC$GPRM,,5.76,1
$G,5600039,1,,,0,9,C
$G135,13,705,0727,3*3
,,,K,,V35995.68*1
$69..0,D,1
GP33,GV,5,3,9*GRM,,0G69.,00136,,0,5,,,23,2
$VT,,,*2,V35995.68.5WN*GA,35.05.66,000049.,,,A,26106+0,$GV,63424,19,135,K,2N,D
- わかんなくなったので、APIが何をやってるのか確認してみよう。
- uart_1.asmを覗いてみた。(ちょっと省略してるけど)
- LowLevelルーチンは、実際何やってるかというと、
UART_1_bReadRxData:
mov A, REG[UART_1_RX_BUFFER_REG]
ret
UART_1_bReadRxStatus:
mov A, REG[UART_1_RX_CONTROL_REG]
ret
UART_1_cGetChar:
tst REG[UART_1_RX_CONTROL_REG],UART_1_RX_REG_FULL ; Check if a character is ready
jz UART_1_cGetChar ; If not loop
mov A, REG[UART_1_RX_BUFFER_REG] ; Get character
ret
- うん。ちゃんとLowLevelルーチン組み合わせて、ステータスをチェックして読み込んでる。
- HighLevelルーチンは割込みが必要だと思っていたんだけど、UART_cGetCharには必要なかった。
- 割込み許可をしないようにしたら、簡単に動いた。それだけのことだったんだ。。
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define CARD_PRESENT 1
#define CARD_NOT_PRESENT 0
char gps_file[] = "hhmmss.gps";
void main()
{
char cardInfo; // Card information
char fp; // File Pointer
BYTE CardState, oldCardState; // Card inserted state variables
char c;
int i=0;
// ---- UART setup
UART_1_Start(UART_1_PARITY_NONE); // Enable UART
LED_1_Start();
LED_1_Switch(0); // Make sure LED is Off
oldCardState = CARD_NOT_PRESENT; // Initialize card insertion state
SDCard_1_Start(); // initialize hardware and SDCard_lib buffers
while(1) {
CardState = SDCard_1_Present(); // Get current card insertion state
if(CardState != oldCardState) { // Check for a change
oldCardState = CardState; // Save last state
if(CardState == CARD_PRESENT) { // Card inserted
LED_1_Switch(1); // About to talk to card, turn on busy LED
SDCard_1_Select(SDCard_1_ENABLE); // Select card
cardInfo = 0;
while ( ! cardInfo ) { // Wait for card to communicate
cardInfo = SDCard_1_InitCard();
}
while (1) {
while (UART_1_cGetChar() != '$');
if (UART_1_cGetChar() != 'G') continue;
if (UART_1_cGetChar() != 'P') continue;
if (UART_1_cGetChar() != 'Z') continue;
if (UART_1_cGetChar() != 'D') continue;
if (UART_1_cGetChar() != 'A') continue;
if (UART_1_cGetChar() == ',') break;
}
// gps_file[0] = UART_1_cGetChar(); // Read hour
// gps_file[1] = UART_1_cGetChar();
// gps_file[2] = UART_1_cGetChar(); // Read minute
// gps_file[3] = UART_1_cGetChar();
// gps_file[4] = UART_1_cGetChar(); // Read second
// gps_file[5] = UART_1_cGetChar();
fp = SDCard_1_fopen(gps_file,"a"); // Open file to append data
while (UART_1_cGetChar() != '$');
SDCard_1_fputc('$',fp); // Write char
while (1) {
c = UART_1_cGetChar(); // Read char
if (c == '$') if (i++>10) break;
SDCard_1_fputc(c,fp); // Write char
}
SDCard_1_fclose(fp); // Close file
SDCard_1_Select(SDCard_1_DISABLE); // Deselect card
LED_1_Switch(0); // Turn off busy LED
}
}
}
}
- でもこのプログラムは、ちょっと問題があった。ファイル名を時間にしようとしたんだけど、ファイルが生成されない。
- 仕方ないので、そこはコメントアウトしてある。ファイル名は固定だけど、とりあえず動く。
- もう少し調べてみる。例えば、こうすればちゃんと'abcdef.gps'というファイルが出来る。
char gps_file[] = "hhmmss.gps";
:
gps_file[0] = 'A';
gps_file[1] = 'B';
gps_file[2] = 'C';
gps_file[3] = 'D';
gps_file[4] = 'E';
gps_file[5] = 'F';
これを弄っていろいろ試した結果、gps_file[x]に何か変数を入れるとダメな気がする。
- コンパイルエラーは出ないが、実行時に変な値が設定されてしまう感じだ。
- この宣言じゃconst扱いなのかも。それで宣言の仕方を変えてみる。
char gps_file[11];
:
cstrcpy(gps_file,"hhmmss.gps");
gps_file[0] = 'A';
gps_file[1] = 'B';
gps_file[2] = 'C';
gps_file[3] = 'D';
gps_file[4] = 'E';
gps_file[5] = 'F';
こうすると、'abcdef'というファイルが出来た。
つまり、gps_fileがFlush上にあるってこと?結局const扱いなのかな。
- うーん。constが付いていない場合は、常にRAM上にあるのかと思っていたが違うのかな。
- Flushに置くにはconstを付ければ良いけど、RAM上にStringを置くのはどうすれば良いんだろ?
- CコンパイラのマニュアルのProgram Memory as Related to Constant Dataを見ても、constが付いていてもFlush上に置かれるとは限らないようなことが書いてあるが、逆については良くわからん。
- それとも、何か勘違いしてるのかなぁ。
- とりあえずファイル名固定でイイや。。まぁ気が向いたらまたやるかも。。。
- 余談だが、いろいろやっている内に、もう一つのSDカードもフォーマットされていないということで認識出来なくなった。
- でも、今度はフラッシュの限界まで書くような操作はしていないと思う。
- もしかすると、ハード的に壊れたんじゃなく、ソフト的なフォーマットの問題だろうか?
- 試しに、デジカメでフォーマットしてみる。
- PCで認識されている。この場合、DCIMというフォルダがある。
- 考えてみると最初はこの状態で、PSoCで書き込むとファイルが壊れていると言われた。
- それでPCでフォーマットし直したら、PSoCで書き込んだものをPCで認識出来るようになったんだ。
- で、さらにPCでフォーマットしてみる。
- この場合、フォーマット時にちゃんと容量が表示される。
- PSoCで変な書き込みをしたために、フォーマットされていないということで認識出来なくなった場合は、フォーマット時の容量が不明になっていた。。
- そうすると、PSoCでもまた書けるようになった。(ファイル名を変更出来ない問題は、相変わらずあるんだけど。。)
- なるほど。デジカメとPCではフォーマットの仕方に何らかの違いがあるらしい。
- そしてPSoCの場合、デジカメでフォーマットしたものを、改めてPCでフォーマットしたSDカードじゃないと書き込めないということか。。
- SDカードがダメになったわけじゃなかったんだ。よかった〜。
- いろいろプログラム弄ると、すぐにSDのフォーマット壊れちゃうんだもんなー。
2でも、これですんなりは行かなかったんだけれども。。
3でも、GPSモジュールを接続すると、電源電圧が4.57Vまで低下する。実際、ちょっとキツイかな。。
[top]
- とりあえず動作するようになったので、実際にデータを取り込んでみた。
- 家の中では、ちゃんと動かないので、外へ持っていこう。でも電源はどうしよう。
- 車のシガレットライタのソケットから12Vを取って、3端子レギュレータで5Vを得るようにブレッドボードに追加することにする。
- この状態でも、PSoC Programmerで書き込むことは可能だ。
→5Vレギュレータをブレッドボードに追加
- プログラムは、ファイル名は固定のままで、1800行読むように変えた。
- 1秒で約6行(衛星数が多い時はもっと多くなるが)なので、約5分記録されることになる。
- ファイル名は固定だが、電源を入れ直せば、データが追記されるので問題ないだろう。
→ダッシュボードに載せてガムテープで止める
- 電源を入れると、約5分間データを記録してファイルを閉じる。
- 再度電源を入れると、同じファイルを開いて追記するので、何度でも追加記録できる。(はずだ)
- SDカードをPCに繋いで見ると、ちゃんとデータが記録されているようだ。
- しかし、記録されたデータをみると一部データの取り込みが追いつかず(だと思う)に取り込みを失敗している部分がある。
- そのため、カシミールのNMEAインポートプラグインで、Win32の例外が発生して読み込めない。
- 例えば、以下のような感じに、データ化けを起こしている。→GPGSVの2行目〜3行目が壊れて1行になっている。
$GPGGA,,3659.0372,N,13955.2686,E,0,00,00.00,000492.7,M,0039.4,M,,*7B
$GPZDA,043245,05,11,2006,+00,00*66
$GPGSV,3,1,09,03,74,320,33,11,06,207,29,13,16,274,31,15,15,041,33*78^M
$GPGSV,3,2,09,16,44,089,29,19,32,249,29,21,28,050,29,23,11,238,SV,3,3,09,25,37,1
78,29*46
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,3659.0372,N,13955.2686,E,,,,007.5,W,N*1D
- これは、おそらく割込みなしでUART読込みをしているために、例えばSDカードの書き込みに時間が掛かった時に読込みが間に合わなくなってるんじゃないかと想像している。
- 但し、SDカード書き込み時に割込みを許可すると、書き込みに失敗するかもしれないので、単純には行かないかも。
- でもデータ化けは一部なので、異常なデータ部分だけ削って正しいデータのみにすれば、読めるようになるかもしれない。
- NMEAフォーマットは最後にチェックサムが付いているので、それを使ってデータ化けを削除すれば良い。
- PSoCで、SDカードに書き込む前にやる方が良いんだけど面倒だなぁ。
- なのでPCで読み込んだデータを処理するために、Unix上で動作する簡単なPerlスクリプトを書いてみた。。
#!/usr/local/bin/perl
# gpstrim -- gps NMEA data trimming program by K.I 061106
# GPSのNMEAフォーマットデータのチェックサムを計算し、
# 正しいデータのみ出力するプログラム
while(<>) {
if (/^\$(GP(GGA|ZDA|GSV|VTG|RMC)[^\$]+)\*(\w\w)\r$/) {
@data = unpack("C*", $1);
$sum = 0;
foreach $x (@data) {
$sum ^= $x;
}
if (hex($3)==$sum) { print; }
}
}
- 異常データの削除前のデータサイズが825488byte、削除後が731124byteだった。
- 削ったデータも結構多いけど、必要十分なデータが取れた。
- スクリプトで処理したデータは、カシミールのNMEAインポートプラグインで読み込むことが出来るようになった。
- 読み込んだデータはトギレトギレなので、トラックの接続で1つに纏め、測地系をWGS84にする。
- 約5分で記録が停止するのと、駐車場でキーを抜くと電源がOFFされて記録が停止する。
- これを見ると、GPSの情報は正しく記録されていることが分かる。
- PSoCのSDカードモジュールを使うと、大容量の記録装置を簡単に使うことが出来るようになる。
- SDカードは、現在はかなり安く買えるので、コストパフォーマンスも良い。
- 今回は、UARTからうまくデータが取れず、エラーデータごと記録して、後から処理するようにしたが、
- これだけ記録容量があると、こんな風にメモリを無駄に使うのもアリかもしれない。
- こんな風に、使えるライブラリをソフトモジュールとして提供されるのは、非常に有り難い。
- 現状はβ版ということで、SDカードモジュールが使えるデバイスが限られているけど、
- 正式版では普通に使えるようになって欲しいなぁ。
→部品はこれだけ、配線もこれだけ!
[top]
[電子工作関連に戻る]
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました