Я пытаюсь управлять двумя сервоприводами одновременно, используя Arduino UNO и Arduino Motor Shield. Мои сервоприводы модифицированы, чтобы они могли работать с постоянным движением.
Когда я отправляю первый заказ myservoP.write(180);
(полная скорость), он работает нормально; однако, когда я пытаюсь приказать моему сервоприводу изменить направление ( myservoP.write(0);
), мой Arduino немедленно дает сбой и перезагружается.
Сначала я думал, что это может быть проблема с питанием, но после тестирования с помощью моей программы (перечисленной ниже) я начинаю думать, что это проблема с буфером или памятью. Без задержек Arduino вылетает примерно через 10 итераций. С задержкой (10) он рухнет примерно через 90 итераций. С задержкой (20) Arduino может повторить полный цикл 5 раз, от начала до конца. С 6-й попытки снова вылет.
Вот мой код:
#include <Servo.h>
Servo myservoL;
Servo myservoP;
int i;
void setup()
{
delay(2000);
myservoL.attach(9); // attaches the servo on pin 9 to the servo object
myservoP.attach(10); // attaches the servo on pin 10 to the servo object
Serial.begin(9600);
}
void loop()
{
for(i=180; i>=0; i--)
{
delay(20);
Serial.println(i);
myservoP.write(i);
myservoL.write(i);
}
for(i=0; i<=190; i++)
{
delay(20);
Serial.println(i);
myservoP.write(i);
myservoL.write(i);
}
Если Arduino не сбрасывается, когда сервоприводы не подключены, то, вероятно, происходит то, что сервоприводы потребляют много тока, и поэтому напряжение батареи падает настолько, что Arduino перезагружается.
Попробуйте использовать два отдельных блока батарей: один для питания Arduino, а другой для питания двигателей (не забудьте соединить заземление двух блоков батарей вместе).
попробуйте увеличить время задержки до 5000 вместо 20, чтобы сервоприводам требовалось достаточно времени для завершения вращения:
#include <Servo.h>
Servo myservoL;
Servo myservoP;
int i;
void setup()
{
delay(2000);
myservoL.attach(9); // attaches the servo on pin 9 to the servo object
myservoP.attach(10); // attaches the servo on pin 10 to the servo object
Serial.begin(9600);
}
void loop()
{
for(i=180; i>=0; i--)
{
delay(5000 );
Serial.println(i);
myservoP.write(i);
myservoL.write(i);
}
for(i=0; i<=190; i++)
{
delay(5000 );
Serial.println(i);
myservoP.write(i);
myservoL.write(i);
}
Дополнение к ответу Нейта: если вы хотите сохранить одну батарею как для двигателей, так и для Arduino, вам следует ограничить ток, потребляемый сервоприводами, путем некоторого замедления перед изменением направления, например, половинной скорости через 20 мс, 0 об/мин после еще 20 мс, прежде чем изменить направление. Если вы меняете направление обоих двигателей одновременно, вы должны задержать один из них, скажем, на 20 мс, чтобы еще больше снизить пиковый ток.
Прежде чем вы это сделаете, вы можете контролировать напряжение питания arduino, предпочтительно с «осциллографом, установленным на «одиночный», триггерным нисходящим наклоном ~ 4,5 В. Это должно сказать вам, если питание Arduino падает, когда двигатели меняют направление.
Крис Стрэттон
Марчин
Крис Стрэттон
Марчин
Марчин