04 | 2017/05 | 06
- 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 31 - - -
プロフィール

かずべい

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ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Arduinoで気圧、高度計を作る。

2014.06.06 17:46|工作
いつもお世話になっている「ラジオペンチ」さんの記事を見ていて私も作りたくなったので、多少変更を加えて作ってみようとした。

ラジオペンチさんは結構年配の方だと思いますが、発想力がすごくていつも感心させられます。

100均で買ってきたアナログ時計を改造して、気圧高度計を自作されています。
URL=>radiopench.blog96.fc2.com/blog-entry-460.html

私は液晶派なので、アナログ回路の部分を外して、液晶表示のみにして尚且つ、おなじみのリチウムイオン電池で駆動が出来るようにしてみました。

全体の回路図です。(クリックすれば大きな画像で表示できます)
koudokei_R.jpg 
左側の部分が5Vへの昇圧回路部分です。

右下の部分が3.3Vへの降圧部分です。気圧センサーをI2C接続している関係上3.3Vが必要になります。また、レベルコンバーターとして2N7000を使っています。

本当はこれにMicroSDにログを取るように回路を組んでいたのですが、ずーとファイルを書き続けているため、電源を切るタイミングが分からない(ファイルオープン中に切るとふぁにるが壊れてしまう)ため、今回は目で見て楽しむだけにしました。

とりあえず、いつものようにブレッドボードによる試験をやってみました。

こんな感じです。

DSC01412_R.jpg

とりあえずうまく動きました。しかし高度が全く安定しません。自分で書いたスケッチではないため原因が分からないので、放置することにしました。(またそのうち修正してみます)

気圧の方はどうやら安定しているようで、丁度今の低気圧の状態を表しています。今度天気になったら1000HPを越すでしょう。

スケッチはラジオペンチさんのスケッチをそのまま流用して、アナログ時計のコントロールの部分や、LED操作の部分をコメントアウトして使っています。

ラジオペンチさんにはいつも感謝です。(ありがとうございます)

次はEagleを使って基盤を作っているところです。

いつも思うのですが、個人でプリント基板を起こすのは、片面基板が精一杯ですが、両面基板が簡単に作れたらいいなと思います。

液晶シールドを載せるだけで、どうあがいても絶対にジャンパーが必要になるんです・・・

まあ素人の工作と割り切ってやってますからいいですけど、それでも出来るだけジャンパーを少なくするように部品の配置を色々模索しています。

出来上がったらまたアップしますね。

つづく・・・
スポンサーサイト

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

ArduinoでGPSロガー作成。

2014.05.21 19:00|工作
以前から記事にしているGPSロガーですが、結論から言うと期待通りには動きません。

まず、MicroSDに書き込みをしないため、後からグーグルアースなどで軌跡を見ることが出来ません。

次にGPSが電波は補足しているのですが、数値が全く変わりません。

うだうだしていても仕方が無いので、ひょっとしたらに期待して、思い切って基板起こしをしてきました。

いつものようにエッチングして部品を取り付けて、アクリルケースのMicroSDが入る所を加工して、結構時間をかけてやってみました。

出来上がりの写真です。

DSC01407_R.jpg 

下にある電池ケースは単3電池ではなくて、18650のリチウムイオン電池のケースです。

リチウムイオン電池は3.7V(最大4.2V)あるため、DCコンバーターで5Vに昇圧して、その後SD等に使えるように3.3Vに降圧もしています。

MicroSDの下にあるのが5Vの昇圧回路で左にあるのが3.3Vの降圧回路です。

裏面です。(ブチルテープで止めてあるだけです。)

DSC01408_R.jpg 

一箇所ジャンパーが飛ばしてあるのは、回路上問題があって、バッテリーを入れるだけでGPSと液晶のバックライトに電気が流れるため、本来のジャンパーをやめて、こちら側にしました。

MicroSDを入れるスリットです。(細く加工しなければいけなかったので難しかったです)

DSC01409_R.jpg 

ふたを開けたところです。

DSC01410_R.jpg 

本来はGPSを外に取り付けようと思っていたのですが、内側に変更しました。

部品面正面です。

DSC01411_R.jpg 

なかなかきれいに出来て気に入ったんですが・・・

結局基板にしてやっても症状は改善せず、無駄に終わりました。

左上のヘッダーピンにUSBアダプターを付けると、スケッチの書き換えも出来ますので、また暇な時にでもスケッチの見直しをして見たいと思います。

しかしたまに書けたりするもんですから理由が分かりません。

ちなみにかけた時には、表示が崩れる奇病も発生しています。

ひょっとしてやっぱりDCコンバーターの電力不足によるものかもしれません。

一応スペックでは5Vも3.3Vも150mAhまで耐えれるらしいのですが、回路の組み方では50mAhぐらいしか流せないとの情報もありますし・・・

まあ長い間(約3ヶ月ぐらい)悩んだGPSロガーは、一応これにて終了と言うことで、次なる獲物を探してまたネット徘徊します。

つづく・・・

PS.

その後ファイル名を自動連番方式から、固定ファイル名にしてやったらうまく動作するようになりました。

シリアルポートで、変数を見ながらやってみてもへんな所が無いだけにとても不思議です。

とりあえず動作するようになったので、近所をうろうろして来て見ました。

ポケットに入れていましたので、衛星の電波が少し辺になっている所もありますが、まあまあ思っていたような性能でした。

その時の軌跡です。

ルート_R 

ソフトは「ルートコンバーター」と言うソフトで見てみました。

とりあえずこれにていったん終了と言うことで・・・

つづく・・・

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

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

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("***************");

}

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

つづく・・・

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

HobbyKingのGPSモジュールは失敗でした。

2014.03.24 21:45|工作
3週間まってやっと届いたHobbyKingのGPSモジュールですが、早速ブレッドボードで動作確認してみましたが、全く言うことを聞きませんでした。

実際には動作はしているようなんですが、出力されるデータが全く意味不明の文字化けだらけで、動作させることが出来ませんでした。

シリアルのボーレートとかも色々調整してみましたが、全くだめでした。

やっぱりこのGPSモジュールは、ラジコン用に作られているのではないかなと思います。

別のブレッドボードで、単品で作動させても文字化けは直りませんでした。

安物買いはだめですね。(引き続き調査はしてみようと思います)

また、このユニット自体はネットで検索しても、情報がなかなか無くて、制御させる方法が分かりませんでした。

仕方が無いので、有名なGPSモジュールを再度購入することにしました。

秋月で売っているGT-723Fを購入しました。


元々このユニットを使うことを前提で作られた回路ですから、これなら動作すると思います。

明日ぐらいには届くと思いますので、結果はまたアップします。

つづく・・・

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

GPSロガーを作るために、シュミレーション。

2014.03.12 17:57|工作
HobbyKingで販売している、安価なGPSモジュールをベースにGPSロガーを作ってみようと思い、色々調べていた所参考になるページを見つけた。=>www.rinku.zaq.ne.jp/brass/ucom/robo/GPS.html

モジュール自体は違う型番で作られているようですが、仕様を調べてみる限りでは同じように使えそうな感じです。

こんなのです。

NEO-6M GPS Module

裏側はこんなのです。

NEO-6M GPS Module

実際物が来るまでに、ブレッドボードで他の部分を組み立ててシュミレートしてみた。

全体はこんな感じです。

DSC01392_R.jpg 

ご覧のように、リチウムバッテリー(18650)を使用して、AVRのATMega328P-PUを動作させています。

MicroSDへの書き込みは、以前作成したMicroSDシールドを、変換基板を使って接続しています。

こんな感じで使います。

DSC01393_R.jpg 

次にLipoは3.7Vを出力するため(満タン時には4.2Vです)、5Vの電源を作る必要があります。

これにはHT7750Aと言うステップアップICを利用しました。

DSC01395_R.jpg 

この部分が昇圧回路です。非常にシンプルで、コイル、ダイオード、電解コンデンサー2個、セラミックコンデンサー。

以上の部品だけで5Vを作ることが出来ます。

回路についてはネットで検索すると、山ほど出てきますので、大変参考になりました。

次にMicroSDシールドについては別で、3.3Vが必要なため、こんなものを使いました。


アマゾンで扱っています。真ん中に5Vを入力すると、左右に3.3Vが出てくるレギュレーターです。
URL=>www.amazon.co.jp/gp/product/B00BVWGNEI/ref=oh_details_o03_s00_i00

送料込みで600円ぐらいですが、高いか安いかは別にして1つ持っておくと便利です。

実際にはこんな風に使います。

DSC01394_R.jpg 

ブレッドボードの電源ラインにそのまま取り付けられるので、とても便利です。

まだ、GPSユニットが届いていないため、全体のチェックは出来ませんので、温度を測るICでMCP9700というものを利用して、ひとまずは温度計として作動させて、その時の各種パラメーターを、MicroSDに書き込む所までを実験してみました。

結構色々ありましたが、とりあえず動作はするようです。

これの全体の回路図は以下の通りです。(クリックすれば大きな図になります)

GPS_TEMP_SD.png 
例によって、AVR単体で動作するように組んで見ました。

後はGPSユニットがこの回路に対応するかどうかです。

普通郵便で注文したので、もう1週間音沙汰無しです。(毎度の事ですが・・・)

ユニットが届いたら続きをレポートしますね。

つづく・・・

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

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