Sin la conexión por Jack y USB no funciona bien mi codigo

Buenas a todos,

Tengo un problema con el proyecto que estoy realizando. El proyecto consiste en controlar un estructura mecánica mediante dos motores de DC y un potenciometro anclado mecánicamente al eje de giro de uno de ellos, esto con el fin de saber la posición angular, ademas para visualizar las variables utilizo un LCD de 16x2 y para ingresar las ordenes un teclado. Los motores los alimento externamente con una fuente de DC a través de un integrado L293D (el cual sirve para controlar giro y velocidad puesto que es un puente H). El problema consiste en que el programa funciona correctamente solo cuando tengo conectado la fuente externa al arduino y ademas lo alimento mediante el USB.

Nota: LCD y Teclado los alimento del arduino. Tambien del arduino saco las señales para controlar en el integrado L293D el giro y la velocidad (PWM a través del Enable del integrado).

Si intento trabajar solo con la Fuente externa de DC (7 V- 1000mA) cuando le doy orden que giren los motores el Arduino se reinicia.

Dejo el codigo a ver quien me puede ayudar! Gracias!!!

#include <PID_v1.h>
#include <LiquidCrystal.h>
#include<Keypad.h>

//Codigo para funcionamiento de teclado
const byte filas =4;
const byte columnas =4;
byte pinsFilas[filas] = {13, 12, 11, 10}; // Filas 1,2,3,4
byte pinsColumnas[columnas] = {9, 8, 7, 6}; //Columnas 1,2,3,4

char teclas[filas][columnas] = {
{‘1’,‘2’,‘3’,‘A’},
{‘4’,‘5’,‘6’,‘B’},
{‘7’,‘8’,‘9’,‘C’},
{’*’,‘0’,’#’,‘D’}
};

Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);
//Termina Codigo para funcionamiento de teclado
char tecla;

#define PIN_INPUT 0
#define PIN_OUTPUT 3
double Setpoint, Input, Output;
double Kp=5, Ki=5, Kd=0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd,DIRECT);
double angulocontrolado;
int pinMotorSentidoA=22; //5-22 (CABLE MORADO)
int pinMotorSentidoB=24; //6-24 (CABLE AMARRILLO)

LiquidCrystal lcd(30, 32, 34, 36, 38, 40);

long previousMillis=0;
long interval=150;

void setup() {

lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(“SISTEMA DE REHABILITACION”);
lcd.setCursor(0,1);
lcd.print(“by: Jaime Rodriguez Pretelt”);
LCD_DERECHA ();
LCD_IZQUIERDA ();
LCD_CENTRO ();
myPID.SetMode(AUTOMATIC);
pinMode(pinMotorSentidoA, OUTPUT); //Declara los pines como salida
pinMode(pinMotorSentidoB, OUTPUT); //Declara los pines como salida
lcd.clear();
}

void loop() {

ParoSentidoGiro ();
delay(100);
tecla =teclado.getKey();
opcionesDeInicio ();

if (tecla ==‘A’||tecla ==‘B’){
while (tecla !=’*’){
switch (tecla) {
case ‘A’:

while (tecla !=’*’){

IngresoDeVelocidad ();
ParoSentidoGiro ();
delay(100);

if (tecla==‘0’||tecla==‘1’||tecla==‘2’||tecla==‘3’||tecla==‘4’||tecla==‘5’){
lcd.clear();
while (tecla !=’*’){
VelocidadPWM(tecla);
ControlDifencial ();
ImprimirAnguloLCD ();
delay(100);
tecla =teclado.getKey();
}
}

tecla =teclado.getKey();
}
break;
case ‘B’:
IngresoDeAngulo ();
delay(2000);
break;
default:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("* para salir");
delay(100);
} //Fin del switch
tecla =teclado.getKey();
}//Fin del while asterisco
}//Fin del If tecla A o B

} //Fin del loop

////////////////////////////////////FUNCIONES PROGRAMA////////////////////////

/////FUNCION lEER EL POTENCIOMETRO Y PROMEDIAR PARA OBTENER UN DATO ESTABLE//////
double FiltroPotenciometro(){
double SumaValorPot=0;
double PromedioValorPot=0;
double ValorPot=0;
double ValorPotenciometroFiltrado=0;
for (int i=0; i < 400; i++){
ValorPot= analogRead(PIN_INPUT);
SumaValorPot=ValorPot+SumaValorPot;
}
PromedioValorPot=SumaValorPot/400;
ValorPotenciometroFiltrado=PromedioValorPot;
return ValorPotenciometroFiltrado;
}
/////////////////////FUNCIONES DE SENTIDO DE GIRO/////////////////////////
void SentidoDeGiroDerecha (){
pinMode(pinMotorSentidoA, HIGH); //Declara los pines como salida
pinMode(pinMotorSentidoB, LOW); //Declara los pines como salida
}

void SentidoDeGiroIzquierda (){
pinMode(pinMotorSentidoA, LOW); //Declara los pines como salida
pinMode(pinMotorSentidoB, HIGH); //Declara los pines como salida
}

void ParoSentidoGiro (){
pinMode(pinMotorSentidoA, LOW); //Declara los pines como salida
pinMode(pinMotorSentidoB, LOW); //Declara los pines como salida
}
///////FUNCION PID////////////////////////////////////////////////////////////
void ControlPIDangulo(double angulocontrolado){
Setpoint=angulocontrolado;
Input = FiltroPotenciometro();
myPID.Compute();
myPID.SetSampleTime(190);
analogWrite(PIN_OUTPUT, Output);
if(Input<Setpoint){
myPID.SetControllerDirection(DIRECT);
SentidoDeGiroIzquierda ();
}
if(Input>Setpoint){
myPID.SetControllerDirection(REVERSE);
SentidoDeGiroDerecha ();
}
if(Input==Setpoint){
myPID.SetControllerDirection(DIRECT);
ParoSentidoGiro ();
}
}
//////////////////////////////////FUNCIONES PARA MOVER MENSAJE POR LA PANTALLA LCD///////////////////////////////////
void LCD_DERECHA (){
for (int posicion = 0; posicion < 13; posicion++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(50); //Normal en 500
}
}

void LCD_IZQUIERDA () {
for (int posicion = 0; posicion < 29; posicion++) {
// scroll one position right:
lcd.scrollDisplayRight();
// wait a bit:
delay(50); //Normal en 500
}
}

void LCD_CENTRO (){
for (int posicion = 0; posicion < 16; posicion++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(50); //Normal en 500
}
}
//////////////////////////////////FUNCION IMPRIMIR ANGULO EN LCD/////////////////////////////////////////////
void ImprimirAnguloLCD (){
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
double SensorPotFilt=FiltroPotenciometro();
double angulo=map(SensorPotFilt,0,1023,0,165);
lcd.setCursor(0,1);
lcd.print(“Angulo:”);
lcd.print(angulo);
}
}
///////////////////////////////////////MOVIMIENTO SENOIDAL-VELOCIDAD PWM/////////////////////////////////////////////////

void VelocidadPWM(char tecla){
char velocidad = tecla;
if (velocidad==‘0’){
analogWrite(PIN_OUTPUT,0);
lcd.setCursor(0,0);
lcd.print(“Velocidad:”);
lcd.print(velocidad);
}
if (velocidad>=‘1’ && velocidad<=‘5’){
int SalidaPWM = map(velocidad,‘1’,‘5’,215,255);
analogWrite(PIN_OUTPUT,SalidaPWM);
SentidoDeGiroIzquierda ();
lcd.setCursor(0,0);
lcd.print(“Velocidad:”);
lcd.print(velocidad);
}
}
////////////////////////////////MOVIMIENTO SENOIDAL-CONTROL DIFERENCIAL////////////////////////////////////////////////////////

void ControlDifencial (){
//double comprobar=FiltroPotenciometro();
double comprobar=analogRead(PIN_INPUT);
double comprobarang=map(comprobar,0,1023,0,165);
if (comprobarang < 10){
ParoSentidoGiro ();
SentidoDeGiroIzquierda ();
}
if (comprobarang > 65){
ParoSentidoGiro ();
SentidoDeGiroDerecha ();
}
}
/////////////////////////////////OPCIONES DE INICIO//////////////////////////////////////////////////////////////////////////
void opcionesDeInicio (){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“A:Movimiento S.”);
lcd.setCursor(0,1);
lcd.print(“B:Control Angulo”);
}
/////////////////////////////////IngresoDeVelocidad///////////////////////////////////////////////////////////////////////
void IngresoDeVelocidad (){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Teclee Velocidad”);
lcd.setCursor(0,1);
lcd.print(“entre: (0-5)”);
}
////////////////////////////////IngresoDeAngulo///////////////////////////////////////////////////////////////////////////
void IngresoDeAngulo (){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Ingrese Angulo”);
lcd.setCursor(0,1);
lcd.print(“Entre: (0-65)”);
}