Некорректная работа скетча от внешнего питания, от usb - все ок.
- Войдите на сайт для отправки комментариев
Всем здравствуйте!
Суть проблемы: делаю проект бесполезной коробки, при питании от usb скетч работает отлично, от внешнего питания выполняется неполностью. Использую Arduino Nano, процессор ATmega328P, скетч использует 28% памяти устройства, глобальные переменные используют 11% динамической памяти.
Подробнее:
Схема подключения №1 - все движения четкие, но скетч выполняется не полностью. После 20-го движения (в коде переменная r) начинается круг заново, при чем с третьего движения. Используется бокс для 3-х батареек АА.
Схема подключения №2 - делает первые 5 движений, потом или зависает, или совсем делает обрывистые движения, даже близко не похожие на истинные. В общем, картина хуже чем при подключении по схеме №1. Использую бокс для кроны.
В чем заключается проблема, что я не так делаю? От usb все работает четко и в полном объеме.
Заранее спасибо.
ПС: элементы питания все 100% рабочие. Скетч и схемы подключения прилагаю.
#include <Servo.h> //используем библиотеку для работы с сервоприводом
Servo servo; //объявляем переменную servo типа Servo
int BUTTON=6; //назначаем пин кнопки
int r=1; //
int n=14;//начальное положение
int v=60;//выглянул
int p=75;//недошёл
int pd=100; // почти дошел наоловину
int pdp=113; // почти дошел полностью
int k=130;//конечное
int t=350; //время до дотягивания
int tb=280; // время быстрого выключения
int y=0;
int x=1;
int Testmove =0; // номер движения r по списку
void setup() //процедура setup
{
Serial.begin(9600);
pinMode (BUTTON,INPUT_PULLUP);
servo.attach(3); // привязываем серву к порту 3
}
void loop() //процедура loop
{
if (Testmove != 0) { r = Testmove; }
servo.write(n);
if (digitalRead(BUTTON)== LOW)
{ if (r > 23) { r = 1; }
if (r == 1) { move_1(); }
else if (r == 2) { move_1(); }
else if (r == 3) { move_3(); }
else if (r == 4) { move_4(); }
else if (r == 5) { move_5(); }
else if (r == 6) { move_6(); }
else if (r == 7) { move_7(); }
else if (r == 8) { move_8(); }
else if (r == 9) { move_1(); }
else if (r == 10) { move_10(); }
else if (r == 11) { move_11(); }
else if (r == 12) { move_6(); }
else if (r == 13) { move_6(); }
else if (r == 14) { move_12(); }
else if (r == 15) { move_13(); }
else if (r == 16) { move_1(); }
else if (r == 17) { move_15(); }
else if (r == 18) { move_6(); }
else if (r == 19) { move_18(); }
else if (r == 20) { move_6(); }
else if (r == 21) { move_19(); }
else if (r == 22) { move_6(); }
else if (r == 23) { move_20(); }
if (Testmove == 0) { r++; }
}
}
// Библиотека характеров
void move_1() //обычный
{
servo.write(k);
delay(t);
servo.write(n);
}
void move_3() // выглянул, подождал, выключил
{
delay(450);
servo.write(v); delay(1000);
servo.write(k); delay(t);
servo.write(n);
}
void move_4() //выключил, подождал, выглянул
{
servo.write(k); delay(t);
servo.write(n); delay(500);
servo.write(v); delay(1200);
servo.write(n);
}
void move_5() // медленно вышел, резко переключил, медленно ушел, выглянул, медленно ушел
{ for (int y = 18; y < 90; y = y + 8 )
{
servo.write(y);
delay(60);
}
delay(750);
servo.write(130); delay(150);
for (int y = 130; y > 18; y = y - 1 )
{
servo.write(y);
}
delay(300);
servo.write(p); delay(900);
for (int y = 70; y > 18; y = y - 1 )
{
servo.write(y);
delay(50);
}
}
void move_6() // быстро выключил
{
servo.write(k); delay(tb);
servo.write(n);
}
void move_7() // бесится
{
servo.write(k); delay(t);
servo.write(p); delay(t);servo.write(k);delay(t);
servo.write(p); delay(t);servo.write(k);delay(t);
servo.write(p); delay(t);servo.write(k);delay(t);
servo.write(n);
}
void move_8() // выключил, вернулся в исх, выключил, медленно в исходное
{
servo.write(k); delay(t);
servo.write(n); delay(700);
servo.write(k); delay(1700);
for (int y = k; y > 18; y = y - 1 )
{
servo.write(y);
delay(60);
}
}
void move_10()// выключил, подержал, отошел, выключил, спрятался, выглянул, спрятался
{
servo.write(n);
servo.write(k); delay(t);
servo.write(p); delay(1400);
servo.write(k); delay(135);
servo.write(n); delay(tb);
servo.write(v); delay(1300);
servo.write(n);
}
void move_11()// выглянул, в исходное, медленно выглянул, быстро выключил
{
delay(2000);
servo.write(p);delay(800);
servo.write(n); delay(800);
for (int y = 18; y < 80; y = y + 2 )
{
servo.write(y);
delay(65);
}
servo.write(k); delay(125);
servo.write(n); delay(t);
}
void move_12()// трясётся, тут нужно покапатся что б он стукался об крышку
{
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(k);delay(tb);
}
void move_13()// выглянул, спрятался, злится, бесится, в исходное, быстрое выключение
{
servo.write(p); delay(1000);
servo.write(n);delay(2000);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(p);delay(tb);
servo.write(k);delay(tb);
servo.write(n);delay(800);
servo.write(k);delay(tb);
}
void move_15() // пугает что выключит, прячется, медленно выходит, пугает, уходит, пугает, выключает
{
servo.write(pdp); delay(tb);
servo.write(n); delay(tb);
servo.write(pdp); delay(1000);
servo.write(n); delay(tb);
servo.write(pdp); delay(750);
servo.write(n); delay(600);
for (int y = 18; y < 90; y = y + 2 )
{
servo.write(y);
delay(65);
}
delay(2000);
servo.write(pdp); delay(1200);
servo.write(n); delay(tb);
servo.write(pdp); delay(800);
servo.write(80); delay(1600);
servo.write(k); delay(170);
}
void move_18()// почти выключил 3 раза, 2 раза стукнулся об крышку, задержка, выключил, исходное
{
servo.write(pdp); delay(300);
servo.write(n); delay(300);
servo.write(pdp); delay(300);
servo.write(n); delay(300);
servo.write(pdp); delay(300);
servo.write(n); delay(1000);
servo.write(v-5); delay(60); servo.write(n); delay(60);
servo.write(v-5); delay(60); servo.write(n); delay(60);
servo.write(v-5); delay(60); servo.write(n); delay(1300);
servo.write(k); delay(tb);
servo.write(n);
}
void move_19()// злится, выглянул, спрятался, злится, пугает, злится, выключил, отошел, еще раз выключил, злится, выглянул, на исходную
{
delay(1500);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(p); delay(900);
servo.write(n); delay(1400);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(pdp); delay(500);
servo.write(p); delay(500);
servo.write(pdp); delay(500);
servo.write(n); delay(1400);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(k); delay(tb);
servo.write(p); delay(900);
servo.write(k); delay(1700);
servo.write(n); delay(700);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(v-15); delay(60); servo.write(v-25); delay(60);
servo.write(p); delay(1300);
servo.write(n); delay(1300);
servo.write(pdp); delay(tb);
delay(1800);
servo.write(p); delay(500);
servo.write(k); delay(tb);
servo.write(p); delay(tb);
servo.write(k); delay(tb);
servo.write(n);
}
void move_20()// пугает, исходная, выключил быстро, выглянул, медленно спрятался, выглянул, приблизился, выключил 2 раза, медленно проверил 2 раза, спрятался
{
servo.write(pdp); delay(400);
servo.write(n); delay(900);
servo.write(k); delay(300);
servo.write(n); delay(tb);
servo.write(p); delay(800);
for (int y = p; y > 18; y = y - 2 )
{
servo.write(y);
delay(20);
}
delay(100);
servo.write(p); delay(1500);
for (int y = p; y < pdp; y = y + 3 )
{
servo.write(y);
delay(40);
}
delay(1500);
servo.write(k); delay(tb);
servo.write(pdp); delay(tb);
servo.write(k); delay(tb);
servo.write(pdp); delay(2300);
for (int y = pdp; y < k; y = y + 1 )
{
servo.write(y);
delay(55);
}
for (int y = k; y > pdp; y = y - 1 )
{
servo.write(y);
delay(55);
}
for (int y = pdp; y < k; y = y + 1 )
{
servo.write(y);
delay(55);
}
for (int y = k; y > pdp; y = y - 1 )
{
servo.write(y);
delay(55);
}
delay(2000);
servo.write(p); delay(1300);
servo.write(n); delay(800);
servo.write(k); delay(tb);
servo.write(p); delay(tb);
servo.write(k); delay(tb);
servo.write(p); delay(tb);
servo.write(k); delay(tb);
servo.write(n);
}


Батарейки подсаживаются. Мультиметр для контроля подключите параллельно источнику питания.
На обоих картинках явно недостаточно питания. Для ардуино минимум для 100% стабильности - 4.7В. Три пальчиковых почти всегда будут ниже этого порога.
Серво рассчитаны на 6В и 120мА, если совсем без нагрузки. С нагрузкой до 800мА. Ни три пальчиковых, ни крона этого обеспечить не могут.
Сходил купил мультиметр и пачку дюраселловских батареек. И оказалось, что мои новые дешманские батарейки, которые купил до этого, почти что сели уже.
На новых дюраселловских все работает отлично, ОГРОМНОЕ СПАСИБО sadman41!
пс: промучился 2 дня с разными схемами подключения и тд :D