Управление моторами через шилд L298P

Здравствуйте! Столкнулся со следующей ситуацией. На базу трёхколёсной тележки установил Arduino UNO и шилд L298P, подключил два мотора и на один из них закрепил энкодер.
По условием задачи тележка проезжает на расстояние, равное 40 переключением энкодера и возвращается обратно.
Энкодер подключил к пину Arduino с прерыванием и для подсчёта создал счетчик.
Каждое направление движения описывается ограниченным циклом, после окончания которых переменная со счетчиком обнуляется.
Программа написана в блочной среде ardublock и тестировалась в ide
В реальности переменная обнуляется только один раз, подскажите в чем может быть проблема? Спасибо

int R = 0;

void interrupt_3(){
  R = R + 1;
  Serial.println(R);
}

void setup() {
  Serial.begin(9600);

  attachInterrupt(digitalPinToInterrupt(3),interrupt_3,RISING);
}

void loop() {
    while (R <= 40){
      pinMode(12,OUTPUT);
       pinMode(10,OUTPUT);
       digitalWrite(12,1);
       analogWrite(10,255);
       pinMode(13,OUTPUT);
       pinMode(11,OUTPUT);
       digitalWrite(13,1);
       analogWrite(11,255);
       }
    pinMode(12,OUTPUT);
     pinMode(10,OUTPUT);
     digitalWrite(12,1);
     analogWrite(10,0);
     pinMode(13,OUTPUT);
     pinMode(11,OUTPUT);
     digitalWrite(13,1);
     analogWrite(11,0);
     R = 0;
    delay(2000);
    while (R <= 40){
      pinMode(12,OUTPUT);
       pinMode(10,OUTPUT);
       digitalWrite(12,0);
       analogWrite(10,255);
       pinMode(13,OUTPUT);
       pinMode(11,OUTPUT);
       digitalWrite(13,0);
       analogWrite(11,255);
       }
    pinMode(12,OUTPUT);
     pinMode(10,OUTPUT);
     digitalWrite(12,1);
     analogWrite(10,0);
     pinMode(13,OUTPUT);
     pinMode(11,OUTPUT);
     digitalWrite(13,1);
     analogWrite(11,0);
     R = 0;
    delay(2000);


}



Вы ошиблись форумом - здесь ардублоком никто не пользуется.
Что же касается текста, совершенно непонятно, зачем Вы непрерывно бомбардируете контроллер одним и тем же набором команд, когда достаточно было послать их единственный раз.

А можно узнать, с какой целью эти строчки повторяются много раз в цикле?
Какая из них требует повторения более одного раза?

Особенно это касается операторов pinMode()

Вы меня простите, но ваш код - бессмысленный набор операторов.

Расстояние не измерятся в щелчках энкодера.
Объясните бытовым языком - как долго едет телега?

тележка меняет направленили нет , хоть когда то ? или вы думаете что раз счетчик не обнуляется - поэтому и не меняет ?

@Александр
начните с того, что объявите переменную и прерывании как volatile.
И неплохо бы позаботится об атомарном чтении ее в основной программе

Тележка едет вперед 200 мм, потом назад и далее не меняется направление

Ну вот я вижу, что вы строчки 47 и 51 бездумно скопировали с верхней части программы, по логике там направление должно быть обратное.
Но это не поможет, проблема не в этом.

Скорее всего он щёлкает, вися в дилэе.

кто запретил?

Так то длина, а не расстояние - понимать надо!
Если по мартышкам ездить, то можно и загреметь под фанфары.

Как можно это решить?

думаешь?
Через 2 сек дилай закончился, почему оно тогда не едет?

Этой проблемы я не вижу, написано, что “В реальности переменная обнуляется только один раз”, а по картинке счётчик растёт и всё. А как там его крутят - я хз. Может двигателем.

Двигатель не прекращает вращение

Вроде всё лишнее удалил:

volatile int R = 0;

void interrupt_3() {
    Serial.println(++R);
}

void setup() {
    Serial.begin(9600);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(3), interrupt_3, RISING);
}

void loop() {
    digitalWrite(12, 1);
    digitalWrite(13, 1);
    analogWrite(10, 255);
    analogWrite(11, 255);
    while (R <= 40) {};
    analogWrite(10, 0);
    analogWrite(11, 0);
    R = 0;
    delay(2000);
    digitalWrite(12, 0);
    digitalWrite(13, 0);
    analogWrite(10, 255);
    analogWrite(11, 255);
    while (R <= 40) {};
    analogWrite(10, 0);
    analogWrite(11, 0);
    R = 0;
    delay(2000);
}
2 лайка

Еще хотя бы defin’ами облагородить и вполне сносный код получится )))

Нельзя не отметить, что Serial.print из прерывания - не лучшая идея, тем более - на скорости 9600.