クルーズコントロールは,スロットル(アクセル)から手を離しても,コントローラ上では一定のスロットル開度を維持する機能です.

カートへ後付けしたスイッチ(ハンドル左側へ取り付け)をコントローラへの入力用に使っています.

ちまたの実車と同じように,所望のスロットル開度にした状態で,スイッチを長押し(1秒以上)するとクルーズコントロールがONになります.

クルーズコントロールがONの状態で,もう一度スイッチを押すと,解除されます(解除操作はスロットル操作をしながらでも可能).

適当な物理スイッチをマイコン・ボードに接続(PA_4)した後,

説明書で紹介しているサンプル・コードに,次のコードを追加すると使えます.

①グローバルに変数を定義します.

/*
Cruse Control
*/
DigitalIn ccButton(PA_4); //Cruse Control Button
bool ccFrag = 0; //1秒以上 ボタンを押すとフラグ立てる
bool ccOn = 0; // Cruse Controlの状態 1:ON  0:OFF
bool ccStart;
Timer ccStartTimer;

②whileループの先頭に次のコードを挿入します(元のプログラムからADCのコード3行を削除する).

while(1) {
   if(!ccOn){
       vr_ad=V_adc.read();        /*この行から3行は元のプログラムにも入っている*/
       vr1_ad_p=(vr_ad-Vr_adc_i)*1.3;  //adjust for accel device(throtle)
       vr1_ad+=(vr1_ad_p-vr1_ad)*0.2;  //0.1
       if(ccButton){
           if(!ccStart){
               ccStartTimer.reset();
               ccStartTimer.start();
               ccStart =1;
           }

           if(ccStartTimer.read_ms() > 1000){
               ccFrag = 1;
               //ccStart = 0;
               ccStartTimer.stop();
               pc.printf("ccStart%d\n", ccStart);
           }
        }else{
            if(ccFrag){
                if(ccStart) {
                    ccStartTimer.reset();
                    ccStartTimer.start(); 
                    ccStart = 0;  
                }
                if(ccStartTimer.read_ms() > 60){
                    ccOn = 1;
                    ccFrag = 0;
                    ccStartTimer.stop();
                    //ccStart =0;
                    pc.printf("CC On\n");
                    myled = 1;
                }
            }else{
                if(ccStart){
                    ccStartTimer.stop();
                    ccStart =0;
                }
            }
        }
    }else{
        if(ccButton){
            ccOn = 0;  //Cruse Control OFF
            pc.printf("CC OFF\n");
            myled = 0;
        }
    }