03 | 2014/04 | 05
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -
プロフィール

かずべい

Author:かずべい
かずべいのヘリライフへようこそ!
まだまだ初心者ですが楽しんでます。
所有機
T-REX450PRO(パチ物ばーかり)
・HKTAROT450-3GX
・TAROT450-3GX
・T-REX450L(3セル)
T-REX500EFL
T-REX550E(V2改)
T-REX600EFL
MultiCopter
・500mmY3 Tricopter type
・500mmFPV-Quad-X Type
JR Voyger50(エンジン機)
Walkela GeniusCP/V2
Phantom

最新記事

最新コメント

天気予報


-天気予報コム- -FC2-

最新トラックバック

月別アーカイブ

カテゴリ

来訪者数

リンク

検索フォーム

RSSリンクの表示

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

スポンサーサイト

--.--.-- --:--|スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

あれから、ずーーと悩んでいます。

2014.04.26 21:02|工作

前に記事にしていた、GPSロガーの作成なんですが、約1ヶ月になろうとしていますが、まだ解決していません。

液晶には緯度や経度等その他の表示は出るのですが、どうしてもMicroSDに書込みしてくれません。

具体的にはファイル名は起動する度に連番管理できるようにしていますが、ファイル名そのものは作成してくれるのですが、いざ書き込みをしようとすると、ファイルをオープンできないようで、何もデーターを書き込んでくれません。

それでも書き込みルーチンをずらしてみたり色々やってみたら、書き込みをする時もあり喜んでいたら、また書き込めなくなってしまいました。

色々考えるにDCコンバーターの容量が足りなくて、ファイルの書き込み時に電圧がドロップしているのではなかろうかとも考えています。

いやはや、電子工作は本当に難しいですね。

とりあえず、一度は動いたスケッチを載せておきます。

何かお気づきの点がありましたら、是非コメントをお願い致します。(Help me!!)

スケッチ====

/*温度と電圧を測定して、GPSのデータとともにSDに書き込む.
 Arduino1.0.5対応
*/

//
//ライブラリのインクルードとグローバル変数の宣言
//液晶とソフトウェアシリアルのインスタンスをつくる
//
#include <stdio.h>
//#include <avr/sleep.h>
#include <LiquidCrystal.h>
#include <SD.h>
#include <SoftwareSerial.h>

#define Rx 9
#define Tx 8

const int chipSelect = 10;
char dataString[500];
char tempString[20];
char maru = 0xdf;  // ゜を表示するため
char filename1[13] = "GPSLOG00.TXT";
char filename2[13] = "DATTIM00.CSV";

int timer;
boolean flag = true;
float temp = 0;
float tempp = 0;
int reading = 0;
float voltage = 0;
double batvol = 0;
double picvol = 0;

const int voutPin = A0;
const int vcheck = A2;

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
SoftwareSerial gps = SoftwareSerial(Rx,Tx);

//
//サブルーチン群
//

void dateTime(uint16_t* date, uint16_t* time)  //日付や時間を取得する
{
  uint16_t year = 0;  uint8_t month = 0, day = 0, hour = 0, minute = 0, second = 0;
  // GPSから日付と時間を
  hour = ((int)dataString[7] - 0x30) * 10 + (int)dataString[8] - 0x30 + 9;
  if (hour >= 24) hour -= 24;
  minute = ((int)dataString[9] - 0x30) * 10 + (int)dataString[10] - 0x30;
  second = ((int)dataString[11] - 0x30) * 10 + (int)dataString[12] - 0x30;
  day = ((int)dataString[57] - 0x30) * 10 + (int)dataString[58];
  month = ((int)dataString[59] - 0x30) * 10 + (int)dataString[60];
  year = (2000 + (int)dataString[61] - 0x30) * 10 + (int)dataString[62];
 
  // FAT_DATEマクロでフィールドを埋めて日付を返す
  *date = FAT_DATE(year, month, day);
  // FAT_TIMEマクロでフィールドを埋めて時間を返す
  *time = FAT_TIME(hour, minute, second);
}

void prn(){ //10秒に1回、位置と時間と温度を表示し、SDに書き込む

flag = !flag;
    // 時刻の取得とJSTの計算
int hour;
int i = 7;
  hour = ((int)dataString[i] - 0x30) * 10 + (int)dataString[i+1] - 0x30 + 9;
  if (hour >= 24) hour -= 24;

//
//緯度経度を表示
// 
  if (flag == true){
    int i=20;
     
    lcd.clear();
    lcd.setCursor(0,0);
     
    lcd.print("N : ");
    lcd.print(dataString[i]);
    lcd.print(dataString[i+1]);
    lcd.print(maru);
    lcd.print(dataString[i+2]);
    lcd.print(dataString[i+3]);
   
    i = 30;
    lcd.print(" N/S :");
    lcd.print(dataString[i]);
   
    i = 32;
   
    lcd.setCursor(0,1);
    lcd.print("E :");
    lcd.print(dataString[i]);
    lcd.print(dataString[i+1]);
    lcd.print(dataString[i+2]);
    lcd.print(maru);
    lcd.print(dataString[i+3]);
    lcd.print(dataString[i+4]);
  }
  else{    
//
// 温度を表示
//
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Tp:");
    lcd.print(tempp );
    lcd.print(maru);
    lcd.print("C");
//
//電圧を表示
//
    lcd.print(" ");
    lcd.print(batvol);
    lcd.print("V");
//
// 時刻を表示
//
    lcd.setCursor(0,1);
    lcd.print("Time => ");
    lcd.print(hour);
    lcd.print(":");
    lcd.print(dataString[i+2]);
    lcd.print(dataString[i+3]);
    lcd.print(":");
    lcd.print(dataString[i+4]);
    lcd.print(dataString[i+5]);
  }
// 
// SDにデータを書き込む
// 
   File dataFile = SD.open(filename1,FILE_WRITE);
   if(dataFile){
     dataFile.println(dataString);
     dataFile.close();
   }
   else{
     //Serial.println("error opening datalog.txt");
     //lcd.println("error opening !");
   }
   
   File timeFile = SD.open(filename2,FILE_WRITE);
   if(timeFile){
      int i = 7;
      timeFile.print(tempString);
      timeFile.print(hour);
      timeFile.print(":");
      timeFile.print(dataString[i+2]);
      timeFile.print(dataString[i+3]);
      timeFile.print(",");
      timeFile.println(batvol);
      timeFile.print("\r\n");
      timeFile.close();
   }
   else{
     //lcd.println("error opening !");
   }
   /*
   //電圧が一定以下になったら、パワーダウンモードに移行する
  if(batvol < 3.0){
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    lcd.clear();
    sleep_mode();
  }
  */
}

//
//データの先頭"$GPR"をみつける
//
void findDataTop(){
char c;
int i = 0;
  while(1){
    c = gps.read();while(c == -1) c = gps.read();
    if(c == '$'){
      dataString[i] = c;
      i++;
      c = gps.read();while(c == -1) c = gps.read();
      if(c == 'G'){
       dataString[i] = c;
       i++;
        c = gps.read();while(c == -1) c = gps.read();
        if (c == 'P'){
          dataString[i] = c;
          i++;
          c = gps.read();while(c == -1) c = gps.read();
          if(c == 'R'){
            dataString[i] = c;
            break;
          }
        }
      }
    }
    i = 0;
  }
}

//
// サブルーチン群おわり
//

void setup() {

  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Arduino GPSwTEMP");
  lcd.setCursor(0, 1);
  lcd.print("By Kazuaki Sako");
  //analogReference(INTERNAL);//精度を上げる場合設定するが、誤作動が多い。
  delay(2000);
 
  Serial.begin(9600);
 
  SdFile::dateTimeCallback( &dateTime );    //ファイルのタイムスタンプに利用
 
  pinMode(chipSelect, OUTPUT);
  pinMode(Tx,OUTPUT);
  pinMode(Rx,INPUT);
  //analogReference(INTERNAL);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("GPS Initializing");
 
  gps.begin(9600);
 
  delay(2000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("GPS Initial Done");
  delay(2000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Initializing SD!");
  delay(2000);
 
  //
  //SDカードドライブを初期化
  //
 
  if (!SD.begin(chipSelect)) {
  //Serial.println("Card failed, or not present");
    //lcd.print("Card failed !!");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MicroSD not fund");
    lcd.setCursor(0, 1);
    lcd.print("InsertSD & Reset");
    delay(2000);
    return;
  }
  //lcd.print("MicroSD fond !!");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("MicroSD is fund!");
  lcd.setCursor(0, 1);
  lcd.print(" Write MicroSD");
  delay(2000);
 
  //
  // create a new file_1
  //
  for (uint8_t i = 0; i < 10; i++) {
    filename1[6] = i/10 + '0';
    filename1[7] = i%10 + '0';
    if (!SD.exists(filename1)) {
      // only open a new file if it doesn't exist
      File dataFile = SD.open(filename1, FILE_WRITE);
      dataFile.close();
      break;  // leave the loop!
    }
  }
 
  //
  // create a new file_2
  //
  for (uint8_t i = 0; i < 10; i++) {
    filename2[6] = i/10 + '0';
    filename2[7] = i%10 + '0';
    if (!SD.exists(filename2)) {
      // only open a new file if it doesn't exist
      File timeFile = SD.open(filename2, FILE_WRITE);
      timeFile.close();
      break;  // leave the loop!
    }
  }

  timer = 0;
 
}

void loop() {
  int i = 0,gpsData = 7; //GPSデータは7行ある
  char c;
  int ii;
  float tempsum = 0;
  double batsum = 0;

  timer++;
 
  //
  //温度と電圧を測定(10回測定の平均値を利用する)
  //
  for(ii = 0; ii <= 10; ii++){
    //温度を測定
    reading = analogRead(voutPin);
    voltage = ((long)reading * 5000.0) / 1024.0;
    //voltage = ((long)reading * 1100) / 1024;    //Internalの場合
    temp = (voltage - 500.0) / 10.0;
    tempsum = tempsum + temp;
   
    //バッテリーの電圧を測定
    batvol = analogRead(vcheck);
    picvol = batvol;
    batvol *= 5.0;
    batvol /= 1024.0;
    batvol -= 0.28;        //電圧のオフセットを調整
    batsum = batsum + batvol;
  }

  temp = tempsum / 10;
  tempp = temp;
  batvol = batsum / 10;

//
//GPSデータを文字列に読み込む
//

 findDataTop();  //GPSデータのトップを待つ

 i = 4;   //$GPRの文字列分のシフト

  while(gpsData--){ //7回改行するまで読み込む
   while(1){
    c = gps.read();
       while(c == -1) c = gps.read();
       dataString[i] = c;
       i++;
       if(c == '\n') break;
   }
  }

  dataString[i] = '\0';

//
//温度データを文字列化
//
  i = 0;
  if(temp>10){
   tempString[i] = temp/10 + 0x30;
        i++;
        temp = temp - (temp / 10) * 10;
  }
  tempString[i] = temp + 0x30;i++;
  tempString[i] = ',';i++;
  tempString[i] = '\0';

  if (timer > 9 ){ //10回に1回、表示と書き込みをおこなう。
      prn();
      timer = 0;
  }
 
//
//シリアルにデータを出力(デバッグ用)
//
  //Serial.println(dataString);
  //Serial.println(tempString);
  //Serial.println("***************");

}

と、まあこんな感じのスケッチです。(色々な所からの登用で作成しました)

つづく・・・

スポンサーサイト

テーマ:ホビー・おもちゃ
ジャンル:趣味・実用

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
現在の閲覧者数: