Arduino nano no funciona bien alimentado externamente

hola gente. que tal.
me decido a pedir ayuda porque no veo donde le erro.
no soy programador. apenas estoy aprendiendo algo.

programe un nano ch340 para manejar un servo mg996R a base de 3 botones.
boton1 aumenta de cero a 180 grados.
boton2 baja hasta cero grado.
boton 3 de emergencia baja repentinamente a cero grado.
mas un led indicando cuando el servo esta a mas de cero grado.

aqui el problema:
cuando lo alimento con la bateria del auto a Vin, el proyecto funciona mal.
acciona erraticamente el servo.
y sobre todo al tocar boton de emergencia el servo empieza a bajar a cero grado muy de a poco.

el arduino esta alimentado con un 7805 y el servo se alimenta tambien con ese regulador. tiene resistores pull down las entradas. y no se como hacer que funcione bien.
a continuacion el simple codigo:

// gammax f
//

#include <Servo.h>
Servo servo1;

int led = 9;
int servopin = 8;
int angulo = 0;
int buttonPin1 = 6;
int buttonPin2 = 7;
int buttonPin3 = 5;
int buttonState1 = 0;
int buttonState2 = 0; 
int buttonState3 = 0;

void setup() {
  servo1.attach(servopin);  
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  servo1.write(angulo); 
  pinMode (led, OUTPUT); 
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  if (buttonState1 == HIGH)
  {
    angulo++;
    if (angulo >= 180)
    {
      angulo = 180;   
    }
  }

  if (buttonState2 == HIGH)
  {
    angulo--;
    if (angulo <= 0)
    {
      angulo = 0;
    }
  }
 if (buttonState3 == HIGH)
 {
     angulo = 0;
    }
    
    if (angulo> 0)
    {
      digitalWrite (led, HIGH);
    }
 if (angulo== 0)
    {
      digitalWrite (led, LOW);
    }
 
  servo1.write(angulo);
  delay(20);
 
  }

gracias. espero encontrar una respuesta a este problema.
saludos.

hola bro!
ahi esta el servo que uso.
y el diagrama dibujado sencillamente.
ahora despues de probar varias veces no funciona. no mueve el servo.
y titila el pin led de la placa cuando apreto los botones.
ya mate 2 nanos usando 12 volts directos. por eso le puse un 7805 to220.

Moderador:
Por favor, lee las Normas del foro y edita el título y tu código usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


En el título debes retirar la palabra Ayuda y deja lo demás. No ha problema pero el foro es de ayuda asi que es inútil ponerlo.
Si tenes dudas, lee el punto 5 de las normas del foro.

Primer problema. No uses el NANO para alimentar el servo.
Según que servo sea, consumen mas de lo que puede entregar el NANO.
No veo tu 7805 en el esquema, si te refieres al del nano primero no lo es y segundo no puede entregar mas de 500mA en condiciones especiales y menos que menos alimentado con 12V porque te pasará lo que ya has contado que quemaras cuanto NANO conectes de este modo.
Alimenta el servo con 5V de fuente externa.
Comparte GND con el NANO y ahora las cosas van a funcionar.
Al Servo le debes entregar máximo 6V pero 5V sería lo adecuado.
Repito: que no vengan del NANO:

A mi tambien me gustaria ver a donde conectas el 7805, ademas supongo que por simplificar no has dibujado las resistencias de los led ni las de PULL_DOWN de los puertos de lectura ¿verdad?.

holarda.
el 7805 no esta en el diagrama pero de él salen los 5 volts.
cambie a alimentar el servo desde la salida del regulador pero hace lo mismo.
les subo el circuito completo pero no use flags y es un trstorno.
circuito CC

obvien el rele. es un agregado que no esta en la placa por ahora.
saludos.

pd. creen que con un Uno R3 funcionaria mejor?

Me lo estaba imaginado, los 5V del 7805 no deben ir al Vin, debes conectarlos a la patilla 5V del nano.
Saludos.

enserio? pero el pinout del nano indica alimentar ahi.
o yo entendi cualquier cosa.

Vamos a ver... El pin Vin va conectado directamente a un regulador de tension, (no me acuerdo cual), que es como el 7805 y que tambien necesita unos cuantos voltios mas de los 5 para que trabaje bien. Su salida de 5v va conectada a la linea interior que alimenta todos los chip y componentes de la placa y a la cual va conectada la patilla de 5V.
O sea, que puedes alimentas al nano con entre unos 7V minimo por Vin o con 5V por esa patilla marcada con 5V, saltandote en este caso el regulador interno.

bueno, probe con un UNO y alimente con otro regulador al servo.
no entiendo porque al pulsar el boton para que el servo suba de angulo se enciende el led L del UNO. no asi con los otros pulsadores.
y a veces va subiendo de angulo el servo mientras presiono y de repente se vuelve a cero solo.

alimento con 12V y de ahi a un 7807 al arduino y otro 7805 para el servo.

Prueba este código, a diferencia del tuyo, no hace cosas cuando presionas con lo que incrementas o decrementas el contador a lo loco, sino que lo hace por vez, eso si no hay rebotes en tus pulsadores.

#include <Arduino.h>

// gammax f
//

#include <Servo.h>
Servo servo1;

int led = 9;
int servopin = 8;
int angulo = 0;
int buttonPin1 = 6;
int buttonPin2 = 7;
int buttonPin3 = 5;
int buttonState1, buttonState1Ant = 0;
int buttonState2, buttonState2Ant = 0;
int buttonState3, buttonState3Ant = 0;

void setup() {
  servo1.attach(servopin);  
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  servo1.write(angulo); 
  pinMode (led, OUTPUT); 
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);

  if (buttonState1 == HIGH && , buttonState1Ant == LOW) {
    angulo++;
    if (angulo >= 180)  {
      angulo = 180;   
    }
  }
  buttonState1Ant = buttonState1;

  if (buttonState2 == HIGH && , buttonState2Ant == LOW) {
    angulo--;
    if (angulo <= 0)    {
      angulo = 0;
    }
  }
  buttonState2Ant = buttonState2;

  if (buttonState3 == HIGH && , buttonState3Ant == LOW) {
      angulo = 0;
  }
  buttonState3Ant = buttonState3;
    
  if (angulo > 0)  {
    digitalWrite (led, HIGH);
  }
  if (angulo== 0)  {
    digitalWrite (led, LOW);
  }
 
  servo1.write(angulo);
  delay(20);
}