ラズパイでラジコン製作(Rev#2-4)

2024-04-22 linux raspi /posts/2024/2024-04-24-raspi-car-with-control.png

ラズパイカーの操作性をちょっと向上させる改造をしました。 sinatraで作ったコントロール画面のJavaScriptに機能追加して、キーボードで各モーターを制御できるようにしました。この手のパターンを展開するコードはCopilotが得意で、サクサクと提案が出てきます。人間が決めるのは、どのキーにどの役割を割り当てるかという部分くらい。

今回、一番の苦労ポイントは動画撮影(笑) 撮ってたつもりが再生ボタンが押せてなかったり、トリミングしたらデータが壊れたり。この辺り手法を固めてく必要があるかおしれません。


// show range value in text
function setSpeed(id,newValue) {
    document.getElementById("value-"+id).innerHTML = Number(newValue).toFixed(2);
    // send speed to server using fetch API
    fetch("/set-speed?motor="+id+"&speed="+newValue);
    document.getElementById("range-"+id).value = Number(newValue).toFixed(2);
}

function addSpeed(id,delta) {
    let newValue = parseFloat(document.getElementById("range-"+id).value) + delta;
    if (newValue > 1.0) {
        newValue = 1.0;
    }
    if (newValue < -1.0) {
        newValue = -1.0;
    }
    document.getElementById("range-"+id).value = newValue;
    setSpeed(id,newValue);
}

document.getElementById("range-left").oninput = function() {
    setSpeed(this.id.replace("range-",""),this.value);
};

document.getElementById("range-right").oninput = function() {
    setSpeed(this.id.replace("range-",""),this.value);
};

document.getElementById("stop").onclick = function() {
    document.getElementById("range-left").value = 0;
    document.getElementById("range-right").value = 0;
    setSpeed("left","0.0");
    setSpeed("right","0.0");
};

setSpeed("left","0.0");
setSpeed("right","0.0");

window.addEventListener("keydown", (e) => {
    switch(e.key){
    case "w":
        addSpeed("left",0.1);
        break;
    case "x":
        setSpeed("left","0.0");
        break;
    case "s":
        addSpeed("left",-0.1);
        break;
    case "o":
        addSpeed("right",0.1);
        break;
    case ".":
        setSpeed("right","0.0");
        break;
    case "l":
        addSpeed("right",-0.1);
        break;
    }
});