Arduino Mega を 6 軸ロボット アームに接続しています。6 つの割り込みはすべてエンコーダーに接続されています (1 つのエンコーダー ピンは割り込みに、もう 1 つは通常のデジタル入力に)。割り込みは次のコードで処理されます。
void readEncoder1(){
//encoders is a 2d array, where the first d is the axis, and the two pin numbers
//first pin is on an interrupt (CHANGE), and second is a standard digital in
if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) {
positions[0]++;
} else {
positions[0]--;
}
if(servoEnable){
updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly
}
}
これは、アームを特定の位置にロックしたままにするように設計されています。arduino がモーターの位置が特定のしきい値だけずれていることを検出すると、モーターに供給される電力を更新してアームを所定の位置に保ちます。
問題は次のとおりです。2 つまたは 3 つ (またはそれ以上) の軸に負荷がかかっている場合 (位置を維持するには常に更新が必要)、または軸が移動している場合、Arduino はシリアル入力で無傷のコマンドを受信しなくなり、いくつかの文字が削除されます。 . 割り込みは明らかに非常に高速に実行されており、何らかの理由でコマンドが破損しています。これを回避する方法はありますか?アーキテクチャ的に、私はこれを正しく行っていますか? 私の主な本能は、たとえば 100 ミリ秒間隔でメインの実行ループで updatePositions() を呼び出すことです。これにより、割り込みのオーバーヘッドが大幅に削減されますか? 私の質問は、6 つのエンコーダーすべてが脈動している場合でも、信頼できるシリアル コマンドを Arduino にどのように取得するかということになると思います。