2004年07月

作業日記トップへ

07月03日(土)  07月04日(日)  07月15日(木)  07月17日(土)  07月25日(日)  07月28日(水) 

2004年07月28日(水)

LBC完成

やっと、 LBC(Little Burning Core:©宮田耕自氏)が出来上がる。 Miyata's Robot Factoryの 「ナイト○イダー」風 イルミネーションプログラムも正常に動作。 リセットボタンも問題ないようだ。 ちょっとLEDが暗すぎる気はするが・・・

さて、問題は開発環境・・・ GDLは分割コンパイルができないようなので、gccにしないといけないとは思う・・・ どうせgccを使うならLinuxにしたいところだが、 ユーザインタフェースはWindowsで作ることになるだろう・・・ と、やっぱり宮田さんお勧めのCygwin+gccか・・・

秋月のCDを注文していると時間がかかるので、 ストロベリー・リナックス - H8マイコンの説明にしたがって 環境整備開始。 しかし、Cygwinのダウンロードが意外と時間がかかり、 しかももう少しのところでダウンロードエラー。 今日は時間切れ。

2004年07月25日(日)

やっとCADで「かめ」が描けました

やっと、Inventorで「かめ」が描けました。 どうも使い方がよく分からないです・・・ まぁ、描けたから良しとしましょうか。 大分修正したい個所はありますけど・・・ 先に進むことにします。

次はプラ板加工とLBC作成だ。

2004年07月17日(土)

モーションクリエータの画面を作ってみました

わざわざWin32APIでユーザインタフェースを作るというのも酔狂な話ですが、 とりあえず画面だけ作ってみました。 何もプログラムしていない状態です。

最初は機能は最低限でよいのですが、 「モーション編集」だけどのようにしようか迷っています。 あと、送信データの仕様ね・・・

ブラケットも描いてみました

プラ板仕様のサーボブラケットも描いてみました。 まだまだInventorに慣れていないので、大分時間がかかってしまいました。 しかも、ぜんぜん納得がいかない出来栄えです・・・

反対軸は、ブッシュとレニーネジで描いてみました。

2004年07月15日(木)

量産型「かめ」に着手

皆さんがROBO-ONEのために日々がんばっている中、 量産型8自由度かめ型ロボット製作に入ることにしました。

今回のポイントは、マイコンとパソコンのプログラムです。 マイコンは宮田さんに許可をいただき、 Little Burning Coreを元に機能縮小版で製作することにしています。

パソコン側は、昨年度のメンバー平沢氏達が作ってくれたモーションクリエーター「himitsu soft」をもとにして、 こちらも機能縮小版でやってみようと思っています。 (機能縮小してばっかりですが・・・)
ちなみにこのソフト、BCCを使ってC言語でWin32APIを利用しています。

第2回親子ふれあいROBOT PARTYに持っていった写真の「かめ」は、 MicroMGと浅草ギ研のブラケットに、 プラ板で外装をつけたものです。 今回は予算の都合上S03Tとプラ板で作ることになりました。 (CNCと時間があればブラケット自作なんですけどねぇ・・・)

なにはともあれ、今までのように行き当たりばったりというわけにもいきませんから、 Inventorで、設計を始めようと思います。 (2足はしばらく後回しですが、技術的にはかなり流用できるはずです)

というわけで、GWServo S03T 2BBを描いてみました。

次は、裏軸作りをして、 プラ板を想定したブラケット作りです。

2004年07月04日(日)

MicroMGの反対軸を作る

Inventorでの設計が進んでないのですが、 やっとパーツが来たので早速MicroMGの裏軸作りが可能かどうか確認してみました。


MicroMGの裏ブタに穴あけ位置がわかるように紙を張りました。


穴あけやカレイナットの圧入のために、 木片をケースに入る大きさに切り、 押さえにしました。
オプティカルセンターポンチでポンチを打ち、 ボール盤で穴をあけ、 万力でカレイナットを圧入します。


するとこのようになります。 うん、なかなか・・・


ベアリングとレニーネジで反対軸を作ったところです。 後は、もう一つ作って両面テープで貼り付けて強度をみてみることにします。

2004年07月03日(土)

ハイパーターミナルからモータを動かす

baさんから質問があって思い出したのですが、 私はふだんシリアル通信でデータを送受信する場合1バイトの数値(0から255)として送っていて、 文字列として送っていなかったんですよね。 1バイトの数値で送ったほうがデータ数が抑えられるのでそうしているのですが、 文字列を送るプログラムも作ってみる必要がありそうです。

というわけで、以前作ったボードで モータ番号とモータ角度を指定するプログラムを作ってみました。 急いで作った上に動作確認をきちんとしていません(@@)/ 間違いなどありましたらお知らせください。

サンプルプログラム

/*
  指定したON時間でパルスを出す。(pwm10.c)
  シリアルで3桁の数字をもらう
  2004/07/03(Sat)
*/

#include<3664.h>
#include<sci.c>
#define PWM_W  5000 /* 2.5mS */

int on_w[24]={
2000,2000,2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,2000,2000,
};

int i=0,n=0;
int motn, angle;
char motnc[3], angc[4];

int main(void)
{
  
  DI;
  TW.TMRW.BYTE=0x4f;      /* FTIO端子を全てPWM出力に設定 */
  TW.TCRW.BYTE=0xb1;      /* クロックとして、内部クロックの1/8を使用 FTIOB,C,Dの初期値は0 */
  TW.TIERW.BYTE=0x71;     /* TSRWのIMFAによる割り込みを利用 */
  TW.TCNT=0x0000;         /* TCNの初期化 */
  TW.GRA=PWM_W;            /* 2.5mS */
  TW.TMRW.BIT.CTS=1;      /* TCNTカウンタスタート */
  IO.PCR5=0xff;
  IO.PCR1=0x03;
  IO.PDR5.BYTE=0x01;
  IO.PDR1.BYTE=0x00;
  TW.GRB=PWM_W-on_w[n];
  TW.GRC=PWM_W-on_w[n+8];
  TW.GRD=PWM_W-on_w[n+16];
  EI;
  InitSCI3(br57600);        /* シリアルポートの初期化 */

  while(1){
    while(1){
      rs_puts("input motor num:");
      while(SCI3.SSR.BIT.RDRF==0){  /* 受信データがフルになるまで待つ */
        ;
      }
      motnc[0]=rs_getc();
      motn=(motnc[0]-'0')*10;
      while(SCI3.SSR.BIT.RDRF==0){
        ;
      }
      motnc[1]=rs_getc();
      motn+=motnc[1]-'0';
      motnc[2]=NULL;
    rs_puts ("\n\r");
      if(motn>=0 && motn<24){
        rs_puts("motor num:");
        rs_puts(IntToDec(motn, 2, motnc));
        rs_puts ("\n\r");
        break;
      }else{
        rs_puts("bat num:");
        rs_puts(IntToDec(motn, 2, motnc));
      }
    }
  
    while(1){
      rs_puts("input motor angle:");
      while(SCI3.SSR.BIT.RDRF==0){  /* 受信データがフルになるまで待つ */
        ;
      }
      angc[0]=rs_getc();
      angle=(angc[0]-'0')*100;
      while(SCI3.SSR.BIT.RDRF==0){
        ;
      }
      angc[1]=rs_getc();
      angle+=(angc[1]-'0')*10;
      while(SCI3.SSR.BIT.RDRF==0){
        ;
      }
      angc[2]=rs_getc();
      angle+=angc[2]-'0';
      rs_puts ("\n\r");
      if(angle>=0 && angle<250){
        rs_puts("motor angle:");
        angc[3]=NULL;
        rs_puts(angc);
        break;
      }else{
        rs_puts("bat angle:");
        rs_puts(IntToDec(angle, 3, angc));
      }
    }
    rs_puts ("\n\r");
    on_w[motn]=10*angle+500;
  }
  return(0);
}

void int_timerw(void)
{
  if(TW.TSRW.BIT.IMFA==1){
    TW.TSRW.BIT.IMFA=0;
  }
  n++;
  if(n==8){
    n=0;
  }
  TW.GRB=PWM_W-on_w[n];
  TW.GRC=PWM_W-on_w[n+8];
  TW.GRD=PWM_W-on_w[n+16];
  switch(n){
    case 0:
      IO.PDR5.BYTE=0x01;
      IO.PDR1.BYTE=0x00;
      break;
    case 1:
      IO.PDR5.BYTE=0x02;
      IO.PDR1.BYTE=0x00;
      break;
    case 2:
      IO.PDR5.BYTE=0x04;
      IO.PDR1.BYTE=0x00;
      break;
    case 3:
      IO.PDR5.BYTE=0x08;
      IO.PDR1.BYTE=0x00;
      break;
    case 4:
      IO.PDR5.BYTE=0x10;
      IO.PDR1.BYTE=0x00;
      break;
    case 5:
      IO.PDR5.BYTE=0x20;
      IO.PDR1.BYTE=0x00;
      break;
    case 6:
      IO.PDR5.BYTE=0x00;
      IO.PDR1.BYTE=0x01;
      break;
    case 7:
      IO.PDR5.BYTE=0x00;
      IO.PDR1.BYTE=0x02;
      break;
    }
}

作業日記トップページへ

トップページへ

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送