Некорректная работа скетча от внешнего питания, от usb - все ок.

ARDARD
Offline
Зарегистрирован: 29.04.2020

Всем здравствуйте!

Суть проблемы: делаю проект бесполезной коробки, при питании от 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); 

  }


  

sadman41
Offline
Зарегистрирован: 19.10.2016

Батарейки подсаживаются. Мультиметр для контроля подключите параллельно источнику питания.

rkit
Offline
Зарегистрирован: 23.11.2016

На обоих картинках явно недостаточно питания. Для ардуино минимум для 100% стабильности - 4.7В.  Три пальчиковых почти всегда будут ниже этого порога.

Серво рассчитаны на 6В и 120мА, если совсем без нагрузки. С нагрузкой до 800мА. Ни три пальчиковых, ни крона этого обеспечить не могут.

ARDARD
Offline
Зарегистрирован: 29.04.2020

Сходил купил мультиметр и пачку дюраселловских батареек. И оказалось, что мои новые дешманские батарейки, которые купил до этого, почти что сели уже. 

На новых дюраселловских все работает отлично, ОГРОМНОЕ СПАСИБО sadman41

пс: промучился 2 дня с разными схемами подключения и тд :D