Написал программу для своего робота, управляемого с тв пульта. В целом норм, но когда я решил сделать функцию включения/выключения заметил глюк. Если выключить и понажимать кнопки движения на пульте, то включается не с первого раза, а с первой попытки просто дергается. Вот, собственно, код: Код (Text): #include <Servo.h> #include <IRremote.h> Servo myservo1; Servo myservo2; int cycle = 2; int ugol = 90; boolean servo = myservo1.attached(); int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { myservo1.attach(9); myservo2.attach(6); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { unsigned long value = results.value; switch(value) { case 2223303699: if(servo = true) { ugol = 170; myservo1.write(170); } break; case 2223271059: if(servo = true) { ugol = 0; myservo1.write(0); } break; case 2223250659: if(servo = true) { ugol = 90; myservo1.write(90); } break; case 2223290439: myservo2.writeMicroseconds(1750); delay(600); myservo2.writeMicroseconds(1500); delay(500); break; case 2223252699: if(cycle == 2) { myservo1.detach(); myservo2.detach(); --cycle; } else { myservo1.attach(9); myservo2.attach(6); myservo1.write(ugol); ++cycle; } break; } irrecv.resume(); // Receive the next value } }
Подозреваю, что сервы питаются прямо от ардуины. При включении они просаживают питание и плата перезагружается. Об этом можно судить по помигиванию светодиода L13. В этом дело?
Эх 2223252699 — это вкл/выкл я так понимаю?! Так вот, при выключении вы делаете `myservo.detach`. Затем при нажатии кнопок направления вы вызываете `myservo.writeMicroseconds` по сути на детачнутую серву. Я, если честно на вскидку вообще не понимаю почему возникает какая-то реакция. Вы проверяете значение булевой переменной `servo`, но при этом его никак не изменяете: выставляете единожды в начале программы. Я не пойму что вы этим хотели добиться. Быть может вы имели в виду: Код (Text): case 2223252699: if(cycle == 2) { myservo1.detach(); myservo2.detach(); servo = false; // вот... --cycle; } else { myservo1.attach(9); myservo2.attach(6); myservo1.write(ugol); servo = true; // ...и вот ++cycle; } break; ?
Да, спасибо, это и имел ввиду, сегодня проверю. Я раньше с функцией attached не работал, вот и сделал ошибку)
Спасибо, заработало! Только мне пришлось еще в самой программе кое что подправить, я оператор сравнения неправильно написал)