アットウィキロゴ

森本の活動報告

8/17



別府へ
説明していなかった変数についての説明を追加しました
GPS_main_program_final.cです


8/17



西原進んでんなぁ・・・
もう一週間にもなろうかというころなのに、未だに通信機の問題点が見つからない・・・
通信機とのにらめっこにはそろそろ負けてしまいそうです

  • 長距離通信ができない
1)電力不足?
→いや、通信機の電池はそのまんまだし

2)じゃあ回路に何か問題が?
→それなら通信すらできるはずがねぇ(でも回路間違ってたとこあったけど動いてたし・・・?)

3)まさか周波数帯がまずい?
→まさかww

てかどう考えたって、通信距離は回路の作り方とかプログラムとかに左右されない部分だと思うんだけどなぁ・・・

  • 回路電源が電池供給の時にかなりノイズがのる
1)電圧が変動してるとか?
→テスターで確認、変動は見られず

2)つながり方が違う?
→同じラインを通ってるんだけど

3)電池切れ!?
→確認しますたww

パソコン供給と電池供給で何が違うんだろう・・・
電池供給のとき、森井と一緒に大学でやったときとか、家でやったときとか、ノイズののり方が様々なんだよなぁ。時には少しだけだったり、また時にはすごいあったり・・・
こういう違いがあるってことは、回路に問題がありそうな気がするけど、
それならパソコン供給の時にも問題が出てるはずだし・・・
パソコン供給の場合に通らず、電池供給の場合に通る回路部分っていったら、レギュレータ付近しかないんだよなぁ
でもそのあたりも別におかしなとこはなさそうだったし・・・

早く皆帰ってきて~泣

あ、プリント基板の方はGPSと通信機はほぼ完成形です。
残りのモータ回路、気圧計、カメラ、加速度計、ジャイロあたりも回路でき次第うpしてもらえれば
そぃそぃっと作っちゃいますんで。


8/11



通信機がよくわからないので先にEAGLEでGPSの回路を作ってみた


      • こんな感じかな?
基板の大きさはだいたい約7×4.5cm
つまり一番最初に使った小さい基板の大きさに入るようにやってみたって感じ
電源辺りがよくわからないので今までどおりに作成してみた。
結局いろいろボタンを押しつつ手探りでやってった感じだなww



8/8



あげました
べっぷへ
もりい

(追加).cってやつだよ


8/6



とりあえずデータ保存はうまくいっていると思われるので、ROMを読み出すプログラムを作ってみた


上の#が10を示し、*が1を示しています。
つまり、今のデータが何番目に読み取ったものであるかを示してます。
これは、12回データを取った後に電池を抜いたので、13番目以降がおかしな値なのは妥当な結果
このプログラムを少しいじれば、GPSのデータを用いる際のプログラムに応用できるかと
とりあえずはGPSはこんなとこだろうかな



8/6



えと、数値シミュで詰んだのと、長らく進んでいなかったのとで、とりあえずROMをば・・・
とりあえず数値として保存して取り出すのはめんどくさそうだったので、
出ている値と保存した値が同じなら表示が出るようにだけしてみた


まぁわざわざ載せるようなものではないけど苦笑
ただこれ保存場所を変えてないから、一度保存すると確実に表示が出るってことに・・・汗
まぁ逆に言えば、その最初の一回ができたってことは
他何回もちゃんとできているだろうと推測
あとは、どのように保存先を変更しつつ保存していくか、だよなぁ

おつです。データ保存のアルゴリズムについてはミーティングの時にでも・・・。 byべっぷ


7/21



回路アップしました。
P1000032.JPGってやつです
あと、GPSの型式は『GH-82B2M-C-N』です
よろよろ



7/21



えと、しょうもないことに詰んでしまって申し訳ありません・・・
たった今、本番用試作回路完成しました。
回路図一応あげときました。
回路.jpgってやつです。

どこが間違っていたのか気づきましたが、
今や森本名物となろうかとしている、ネタミスでした・・・
完成したものの、なんだか複雑な気分です・・・


7/4



やった~~~~~~~~



とうとう来ましたよ来ましたよww
ヘッダの224、ターミネータの234、双方ともにちゃんと来てるっさ~~
勢いに乗ってそのまま処理まで↓


空白の部分はスペースを入れているだけです。


恐ろしく嬉しすぎるので、もう一度

やった~~~~~~~~


べっぷさんにはとても色々と助けてもらいました、ありがとうです↑↑


p.s.
ところで足立さん。
このデータを出力するにあたり、文字列を書く関数を考えてみました。
もしよかったら使ってみる or さらに改良してみてはどうでしょうか?
あの長いプログラムを一度書くだけで済みますw

void moji(int sel,int num) //二つの数字を前から持ってくる。
{
int k,h,temp,data;
unsigned int str[8] = {}; //とりあえず8つくらい入れる余裕をば・・・

  //ここからのスイッチ文で、selに入れた値に合う数値をmain関数から持ってくる。
  //もちろん、持ってくる数値はグローバルで定義
  //最初は直接selに入れて持ってこようとしたんだけど、
  //生の数を入れないと反応してくれなかったので断念・・・
  //なのでここは頑張って書いてください
  //俺は13ヵ所必要だったので、13個分書いてる訳っす
  switch(sel)
  {
   case 0:
    data = lat2;
    break;

   case 1:
    data = lat3;
    break;

   case 2:
    data = lat4;
    break;

   case 3:
    data = lon2;
    break;

   case 4:
    data = lon3;
    break;

   case 5:
    data = lon4;
    break;

   case 6:
    data = alt/10;
    break;

   case 7:
    data = alt%10;
    break;

   case 8:
    data = sp/10;
    break;

   case 9:
    data = sp%10;
    break;

   case 10:
    data = dir/10;
    break;

   case 11:
    data = dir%10;
    break;

   case 12:
    data = sat;
    break;

  //ここ本当は0でもいいわけだけど、デバッグの際にここから出た0なのか元々の値なのか
  //判別できないな、と思って、100にしてみた。それだけの理由
   default:
    data = 100;
    break;
  }

   //numに入れた数だけ文字に直していく・・・
   for(k=0;k<num;k++){
 
   //0かどうか
   if(data==0)
   {
  //0だったらdefaultに持ってってスペースにしたいなぁとか
    temp = 11;
   }else{
    temp = data%10;
   }

  //数値を文字列にする作業…。
  switch(temp)
  {
   case 0:
    str[k] = '0';
    break;

   case 1:
    str[k] = '1';
    break;

   case 2:
    str[k] = '2';
    break;

   case 3:
    str[k] = '3';
    break;

   case 4:
    str[k] = '4';
    break;

   case 5:
    str[k] = '5';
    break;

   case 6:
    str[k] = '6';
    break;

   case 7:
    str[k] = '7';
    break;

   case 8:
    str[k] = '8';
    break;

   case 9:
    str[k] = '9';
    break;

   default:
    str[k] = ' ';
    break;
  }
  if(data!=0)
   {
   //次の行
    data /=10;
   }
}

 //ここで早速書いちゃうw
 //文字列を元の位置に返したとこですぐに書くわけだし、
 //文字列を返すの面倒だしよくわかんないから、この方が安全↑↑
for(h=num;h>=0;h--){
 WriteUART1(str[h]);
 while(BusyUART1());
}
}




7/2



足立のリクエスト兼またまた疑問・・・
水曜の時点で出ていたデータ、もしかして元から入っていたよくわからんデータなのでは、と思い
x[ ]に適当に初期設定をしてみたら・・・な、なんと↓

imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (新しい画像.png)
      • やっぱ本来のデータ来てた訳ではないのね苦笑
とりあえず、2バイト目は値が変わっているということで、
これはちゃんと取れているということかな・・・
でもここも最大で127までしか値を取らないはずなんだけど、時々224と出てくる・・・
つまりヘッダを二回認識してる、ということ?
wait...表示のせいでタイミングがずれているのかと思い、そこを消してみたら・・・
ここから二つ目の疑問、ヘッダを認識しなくなったんだよね苦笑
wait表示消したとこで関係ないはずなんだけどな・・・

プログラム

<p30f4012.h>
<uart.h>


_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);


unsigned int config1 = UART_EN & UART_IDLE_CON & UART_RX_TX & UART_NO_PAR_8BIT & UART_1STOPBIT
                    & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;

unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR
                    & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

unsigned int config3 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT
                    & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;


int main(void)
{
int temp,i,j,n;
unsigned int x[23];

 //何かしら初期設定してみた
 for(i=0;i<23;i++)
 {
  x[i]=1111;
 }

 OpenUART1(config3,config2,10);

   //とりあえず始める
   putsUART1("start\n\r");
   while(BusyUART1());

 while(1)
 {
  OpenUART1(config1,config2,10);

  //1バイト受信
  while(!DataRdyUART1());
  x[0] = ReadUART1();
  
  //もしヘッダなら
  if(x[0]==0xe0)
  {
   break;
  }

   //そうでない時の確認
   OpenUART1(config3,config2,10);
   putsUART1("wait...");
   while(BusyUART1());
 }

  //23バイト目まで読み込む(ちなみにここ、for文使わずに地道に書いてもダメだった・・・)
  for(j=1;j<23;j++){
    while(!DataRdyUART1())
   x[j] = ReadUART1();
  }

 OpenUART1(config3,config2,10);

 unsigned int str[8] = {};

for(j=0;j<23;j++){
  for(i=0;i<8;i++){
 
   //0だったら無駄に割らないように・・・
   if(x[j]==0)
   {
    temp=0;
   }else{
    temp = x[j]%10;
   }

  //数値を文字列にする作業…。
  switch(temp)
  {
   case 0:
    str[i] = '0';
    break;

   case 1:
    str[i] = '1';
    break;

   case 2:
    str[i] = '2';
    break;

   case 3:
    str[i] = '3';
    break;

   case 4:
    str[i] = '4';
    break;

   case 5:
    str[i] = '5';
    break;

   case 6:
    str[i] = '6';
    break;

   case 7:
    str[i] = '7';
    break;

   case 8:
    str[i] = '8';
    break;

   case 9:
    str[i] = '9';
    break;

   default:
    str[i] = '?';
    break;
  }
  if(x[j]!=0)
  {
  //次の行
   x[j] /=10;
  }
}

 //シリアルで表示
putsUART1("\n\r");
while(BusyUART1());

for(n=7;n>=0;n--){
 WriteUART1(str[n]);
 while(BusyUART1());
}

}

//終了確認
putsUART1("\n\rEND\n\r");
while(BusyUART1());
return;
}





6/26



自分でできる限りやってみたんだけど、間違いが見つからない・・・
このプログラムでどこかおかしいとこあったら教えてください!!
これは、ただ単に来たデータをそのまま表示させるというだけのプログラムです。
とりあえず、どんなデータが来てるのかなぁとか
11001010みたいな形かなぁと予想しつつだけど


<p30f4012.h>
<uart.h>


_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);


unsigned int config1 = UART_EN & UART_IDLE_CON & UART_RX_TX & UART_NO_PAR_8BIT & UART_1STOPBIT& UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;

unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR& UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

unsigned int config3 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT& UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD;


int main(void)
{
int temp,i,j,n;
unsigned long x[23];

 OpenUART1(config1,config2,10);
 ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);

 while(!DataRdyUART1())
 x[0] = ReadUART1();      
 if(x[0]==0xe0){     //ヘッダの数字を読み込んだら、そこから22バイト分データをとる
  for(j=1;j<23;j++)
   x[j] = ReadUART1();
 }

 OpenUART1(config3,config2,10);
 ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);

 unsigned int str[8] = {};

 if(x>=10000000)        //なんか最初の一桁目が1か0かで、扱いが十進数と八進数で
  n=10;            //変わるっぽい??
 else
  n=8;

for(j=0;j<23;j++){          //ここから一気に23バイトのデータを送るつもり
 for(i=0;i<8;i++){
 
  temp = (unsigned long)(x[j]%n);

  //数値を文字列にする作業…。
  switch(temp)
  {
   case 0:
    str[i] = '0';
    break;

   case 1:
    str[i] = '1';
    break;

   case 2:
    str[i] = '2';
    break;

   case 3:
    str[i] = '3';
    break;

   case 4:
    str[i] = '4';
    break;

   case 5:
    str[i] = '5';
    break;

   case 6:
    str[i] = '6';
    break;

   case 7:
    str[i] = '7';
    break;

   case 8:
    str[i] = '8';
    break;

   case 9:
    str[i] = '9';
    break;

   default:
    str[i] = '?';
    break;
  }

  //次の位へいきます。
  x[j] /= n;
  }
 }


for(j=0;j<23;j++){
 for(i=7;i>=0;i--){
  WriteUART1(str[i]);
  while(BusyUART1());
 }
 putsUART1("\n\r");
 while(BusyUART1());
}
}

なんか一応23バイトずつ来てるんだけど、数字の表示が全て00000000なんだ汗
プログラムの問題・・・ReadUART()の使い方が違うんかなぁとか思ったり



6/19



今日森下さんから通信機を受け取りました。
使用するモデムを決めてまた連絡を、とのことでした。
二つ候補として教えられたモデムのデータシートがあるのであげておきます。
特徴としては、FX614は16ピン、回路作るのとかは比較的簡単、必要な電圧は5Vです。
MSM6947は28ピン、回路作るのとかはちょっと難で、必要な電圧は5V、12Vです。

また、秋山さんにGPSについて話を聞きに行ったところ、
使用するGPSが届くまでの代わりといって、GPSモジュールを貸してもらいました。
なので、早速GPSに手をつけようと思います。



6/3



今日自分もシリアル通信してみましたが、
Tera Term Proを使ってやってみたところ、うまくいきませんでした。
vistaってめんどい・・・

なので、vistaで使えるものを・・・ということで探したところ、
その後継作?ともいえるようなものを発見しました。
試しにこちらのTera Termでやってみたところ、一発でうまくいったので紹介しておきます。

上手くいかない場合は、こちらも試してみてください。

ちなみに、このプログラムは起動直後に使うポートの指定を行うみたいです。
また、べっぷのページにある通信速度などの設定は、
設定→シリアルポートで変更ができました。




5/27



電子回路シミュレータのフリーのやつを紹介しているサイトを発見↓
http://guutaranoheya.web.fc2.com/electronics/qucs.html
インストールがうまくいったので紹介
日本語化も簡単にできるし。

使用法を解説しているサイトはこちら↓
http://www.sp.es.yamanashi.ac.jp/~ohki/qucs/qucs.html



5/25



電波高度計について探してみたけどあまり成果を上げられず・・・
でも他にも同じようなことやってる人がいるっぽいし、何か抜け道があるはず

なんかその過程でちょっとGPSの問題について参考になるかもなページを発見↓


このページでは緯度経度で実験を行ってるけど、
高度についても同じようなことが言えるんでないかな。
うまくいけばGPSから十分信用に値するデータが得られるかも。




分担:


所属:




日付:タイトル


本文…とか。
最終更新:2009年08月22日 11:49