クルーズコントロールは,スロットル(アクセル)から手を離しても,コントローラ上では一定のスロットル開度を維持する機能です.
カートへ後付けしたスイッチ(ハンドル左側へ取り付け)をコントローラへの入力用に使っています.
ちまたの実車と同じように,所望のスロットル開度にした状態で,スイッチを長押し(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;
}
}