福岡県大会

141026
嘉穂総合高校で行われた県大会にてエキシビション走行の機会を頂く。
ついでに記録用動画の撮影も。

年季の入ったコースのためか、各所でタイヤの滑って面白い。

運営の皆様、参加者の皆様お疲れ様でした

マイクロマウス九州大会

熊本高専で行われたマイクロマウス九州地区大会に参加してきた。
大会前日の昼から試走ができるため、一泊二日の旅程を組んでいたのだが・・・。

会場に到着して、一年ぶりな方々に挨拶と談笑。
それでは調整を始めよう。と、荷解きすると
マウスがない。
マウスがない。
探してもない。
やってもうた。
家に忘れてきた。
マウスを取りに帰ると、戻ってくるのは真夜中になってしまうため、
これにて試走日終了。

14102503
あぁ、懇親会楽しい。馬おいしい。

ホテルをキャンセルして、最終電車で自宅に戻る。

大会当日
最速経路を利用して再度熊本高専に。
色々と調整したいが、頭が回らず、そのまま競技開始。

本当に運よく、ふらつきながらも探索を終えて、
今回の目的である最短走行もできた。

14102505
結果は3位。

昼食は高専文化祭の出店で、お好み焼きとホットドックと焼き鳥と肉まんと揚げパンとうどんを食べる。
14102501

大変有意義な大会でした。

こつこつ


前壁による距離補正とコース情報のEEPROMへの保存。
赤外線センサのパルス発光が偶にミスるのを修正。
今年は制限時間内での最短走行成功を目指す。
九州大会ガンバロー

ハーフラインの誤検出対策

001
ハーフライン後にコーナが現れることは無い。
ハーフライン検出後は操舵角度を監視して、コーナに入った場合には通常走行に復帰する。
002
車線変更はハーフライン後120cm以内に設定される。そのため、130cmを超えてもハーフラインが無い場合には通常走行に復帰する。
003
センサーの跳ねの対策に、トレースラインが途切てもしばらくはトレースラインの監視を続け、誤検出の場合にはトレースラインの途切れ待ち処理に戻す。

落穂拾い

140927
ロボット競技の県大会を見学する。後輩たちの活躍を願うが・・・。

///////////////////////////////////
インターフェース11月号
高速120fpsムービーという紹介に釣られて買ったが、記事中ではデバイス使い方は紹介されず。続報に期待。

ハーフラインの検出条件

14092101
コーナー区間にハーフラインは設置されない。
操舵角度が大きい場合にはマーカー検出を無効にする。

14092102
S時コーナの途中にハーフラインは設置されない。
操舵速度が速い場合にはマーカー検出を無効にする。

材料変更

140913
とにかくオーバーハングを軽くしたい。
発砲スチロールでバンパーを作ると、発砲ウレタン製の半分以下の軽さになった。
が、当然ながら走行性能に変化無し。
そして見た目が悪い。

追記
元:5.1g
発砲スチロール1:2.3g
発砲スチロール2:2.2g

コース補修

1409061
カッティングマシンを入手したので
1409062
カッティングシートを切って
1409063
これを
1409064
こうする

カメラ制御コード

残り4つということで、だいたい1年前のコード公開

    /*
    PB.DR.BIT.B3 CLK
    PB.DR.BIT.B2 RESET
    PB.DR.BIT.B1 START
    PF.DRL.BIT.B1 STRB
    AN0 Image DATA
    PB.DR.BIT.B16 LOAD
    PE.DRL.BIT.B15 SIN
    PE.DRL.BIT.B14 SCLK

    PFC.PAIORL.BIT.B6 = 1; 右
    PFC.PAIORL.BIT.B7 = 1; 左
    PFC.PAIORL.BIT.B8 = 1; 同期
    PFC.PAIORL.BIT.B9 = 1; 中央
    PFC.PAIORL.BIT.B10 = 1;
    PFC.PAIORL.BIT.B11 = 1;
    PFC.PAIORL.BIT.B12 = 1;
    PFC.PAIORL.BIT.B13 = 1;
    PFC.PAIORL.BIT.B14 = 1;
    PFC.PAIORL.BIT.B15 = 1;
    */

    #include <machine.h>
    #include <stdarg.h>
    #include "iodefine.h"
    #include "sci.h"
    #include "7125sio.h"

    #define CLK_H PB.DR.BIT.B3=1
    #define CLK_L PB.DR.BIT.B3=0
    #define SCLK_H PE.DRL.BIT.B14=1
    #define SCLK_L PE.DRL.BIT.B14=0
    #define WAIT for(i=0;i<1000;i++){} /*======================================*/ /* プロトタイプ宣言 */ /*======================================*/ void main(void); unsigned char dipsw_getL( void ); unsigned char dipsw_getH( void ); void setReg(unsigned char data ); /*======================================*/ /* グローバル変数の宣言 */ /*======================================*/ unsigned int watc=0; unsigned char reg[16]; unsigned int h_cnt; unsigned int adcnt; unsigned char data[256]; /************************************************************************/ /* メインプログラム */ /************************************************************************/ void main( void ) { unsigned int pri_v,pri_h; int i,j; char dif,min,max,minad,maxad,out; unsigned char rf,lf,lsh; unsigned char blevel,wlevel; char mr,ml; unsigned char digisensor; /* マイコン機能の初期化 */ init_all(); //初期化 sci1_init(38400,8,0,1); reg[ 0]=0x00;//Image Capture Mode 0 = Continuous Mode reg[ 1]=0x10;//NA reg[ 2]=0x20;//Interrupt setting reg[ 3]=0x30;//Data Rate 0 = 1/4 reg[ 4]=(0x40|(dipsw_getL()+3));//露光時間 3=285fps 2=303fps 1=323fps reg[ 5]=0x50;//露光時間 reg[ 6]=0x60;//露光時間 reg[ 7]=0x70;//露光時間 reg[ 8]=0x86;//Gain reg[ 9]=0x90;//MSB setting reg[10]=0xA0;//Black level output reg[11]=0xB0;//Offset subtraction reg[12]=0xC0;//STRB reg[13]=0xD2;//NA reg[14]=0xE0;//Power save mode reg[15]=0xFE;//NA lsh=30+dipsw_getH()*10;// 1=100 2=120 3=140 //black=30~40 RESET: digisensor = 0x00; WDT.WRITE.WTCNT = 0x5A00; PB.DR.BIT.B2=0;//リセット H -> L

    CMT0.CMCNT = 0;
    CMT.CMSTR.BIT.STR0 = 1;//cmt0 スタート
    while(CMT0.CMCNT<150){CLK_H;CLK_L;}//200us待ち CMT.CMSTR.BIT.STR0 = 0;//cmt0 停止 CLK_H; CLK_L; PB.DR.BIT.B2=1;//リセット L -> H

    CMT0.CMCNT = 0;
    CMT.CMSTR.BIT.STR0 = 1;//cmt0 スタート
    while(CMT0.CMCNT<75){CLK_H;CLK_L;}//100us待ち CMT.CMSTR.BIT.STR0 = 0;//cmt0 停止 CLK_H; CLK_L; setReg(reg[ 0]); setReg(reg[ 1]); setReg(reg[ 2]); setReg(reg[ 3]); setReg(reg[ 4]); setReg(reg[ 5]); setReg(reg[ 6]); setReg(reg[ 7]); setReg(reg[ 8]); setReg(reg[ 9]); setReg(reg[10]); setReg(reg[11]); setReg(reg[12]); setReg(reg[13]); setReg(reg[14]); setReg(reg[15]); RESTART: CLK_H; CLK_L; PB.DR.BIT.B1=1;//スタート CLK_H; PB.DR.BIT.B1=0;//スタート信号戻す 920ns リセット開始から0.5ms後 CLK_L; CLK_H; i=0; WDT.WRITE.WTCNT = 0x5A00; //2.73ms以内にクリア NEXTREAD: while(PF.DRL.BIT.B1==0){//STRBシグナル待 CLK_L; CLK_H; } AD0.ADCR.BIT.ADST = 1;//AD変換開始 if(i==0){ PA.DRL.BYTE.H = digisensor;//xxxx x001 PA.DRL.BIT.B8 = 0; //mainCPUへの同期信号クリア } CLK_L;CLK_H; CLK_L;CLK_H;//STRB -> L
    CLK_L;CLK_H;

    while(AD0.ADCSR.BIT.ADF == 0);//AD変換終了まで待つ
    data[i] = AD0.ADDR0 >> 8; //値を保存

    i++;
    if(i<128){goto NEXTREAD;} //32*5= 160 setReg(0x21);//Set STOP=1 min=-10; max= 10; minad=0; maxad=0; //ライン重心計算 for(i=1;i<29;i++){ dif=data[i+95]-data[i+96]; //96 97 if(i<24 && dif5 && dif>max){max=dif;maxad=i;} //白→黒
    }
    if(min==-10 || max==10 ||(minad>maxad)){
    out=63;
    }else{
    out=(minad+maxad);
    }
    PA.DRL.BYTE.H = out<<2; /* ラインマーカしきい値計算 */ blevel=200; for(i=65;i<=91;i++){ if(blevel>data[i]){blevel=data[i];}
    if(blevel>data[i+32]){blevel=data[i+32];}
    }
    wlevel=blevel+lsh;

    digisensor=0x01;
    //左マーカ
    if(data[ 99]>wlevel || data[ 67]>wlevel){digisensor= digisensor | 0x40;}//0100 0000

    //右マーカ
    if(data[ 89]>wlevel || data[121]>wlevel){digisensor= digisensor | 0x04;}//0000 0100

    //中心ライン
    if(data[109]>wlevel || data[110]>wlevel || data[111]>wlevel || data[78]>wlevel){
    digisensor= digisensor | 0x10;}//中央線 0001 0000

    if(data[104]>wlevel || data[ 72]>wlevel){digisensor= digisensor | 0x20;} //左中マーカ
    if(data[116]>wlevel || data[ 84]>wlevel){digisensor= digisensor | 0x08;} //右中マーカ

    PA.DRL.BIT.B9 = 1;//

    PA.DRL.BIT.B8 = 1;//同期線L->H

    goto RESTART;

    }

    /************************************************************************/
    /* ディップスイッチ値読み込み */
    /* 戻り値 スイッチ値 0~15 */
    /************************************************************************/
    unsigned char dipsw_getL( void )
    {
    unsigned char sw=0;

    if(PE.PRL.BIT.B2==0){sw+=2;}
    if(PE.PRL.BIT.B3==0){sw+=1;}

    return sw;
    }

    /************************************************************************/
    /* ディップスイッチ値読み込み */
    /* 戻り値 スイッチ値 0~15 */
    /************************************************************************/
    unsigned char dipsw_getH( void )
    {
    unsigned char sw=0;

    if(PE.PRL.BIT.B0==0){sw+=2;}
    if(PE.PRL.BIT.B1==0){sw+=1;}

    return sw;
    }

    /************************************************************************/
    /* レジスタ書き込み */
    /* */
    /************************************************************************/
    void setReg( unsigned char data )
    {
    int wt=0;
    //SCLK_Lからスタート
    //adress
    if((data&0x80)==0x80){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x40)==0x40){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x20)==0x20){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x10)==0x10){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    //data
    if((data&0x08)==0x08){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x04)==0x04){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x02)==0x02){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;SCLK_L;
    if((data&0x01)==0x01){PE.DRL.BIT.B15=1;}else{PE.DRL.BIT.B15=0;}
    SCLK_H;
    PB.DR.BIT.B16=1;//LOAD_H
    CLK_H;
    PB.DR.BIT.B16=0;//LOAD_L
    SCLK_L;
    CLK_L;
    }

RMCR2014

140825
競技では運よく部門優勝と総合2位を頂きました。

ロボマガの記事の紹介をさせて頂いたプレゼンでは、長い上に分かり難く申し訳ない状態でしたが、Amazonの在庫がもう少しで無くなりそうなことから、ある程度は興味を持って頂けたのだと思っています。

技術交流会では、某チームが車体重量を測ってまわっていたり(次は横Gコンテストを期待)、モータを長持ちさせるノウハウを聞きに言ったら逆の回答がきたり、RXマイコン用のライブラリの情報を頂いたり。

参加者の皆様や大会を運営してくださったルネサスの皆様。ありがとうございました。