Hola,
me pasa una cosa muy rara y no se que puede ser.
cargo el sketch a la placa arduino (es para controlar dos motores, utilizo un modulo con un L298).
conecto el monitor serial y me da unos valores correctos, miro la salidas que van conectadas al Enable del modulo L298 y con el osciloscópio y dan un pwm correcto. Miro las salidas que van conectadas a In1, In2, In3, In4, y parece que cambian correctamente para cambiar de sentido de giro.
hasta aquí todo parece correcto, ahora viene lo raro, desconecto el usb y conecto una fuente de alimentación a 9V para alimentar arduino y el modulo L298, se encienden las luces del arduino (on, L y la del driver que controla los motores)y no hace nada, miro con el osciloscopio y no tengo señal de pwm a la salida del arduino ni señal en los pines de dirección.
Alguien sabe que puede estar pasando?
/* codigo del blog de roboblogs, lectura de la IMU con el filtro complementario
falta incorporar el control PID i salida de los motores */
#include <Wire.h>
//Direccion I2C de la IMU
#define MPU 0x68
//Ratios de conversion
#define A_R 16384.0
#define G_R 131.0
//Conversion de radianes a grados 180/PI
#define RAD_A_DEG = 57.295779
//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;
//Angulos
float Acc[2];
float Gy[2];
float Angle[2];
int llanta_I= 10;
int llanta_D= 11;
void setup()
// Se inicia la comunicación por I2C con el dispositivo MPU, y se “activa” enviando el comando 0.
// También se inicia el puerto de série para ver los resultados.
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
pinMode (llanta_I, OUTPUT);
pinMode (llanta_D, OUTPUT);
}
void loop()
{
//Leer los valores del Acelerometro de la IMU
Wire.beginTransmission(MPU);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
//Se calculan los angulos Y, X respectivamente.
Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
//Leer los valores del Giroscopio
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
//Calculo del angulo del Giroscopio
Gy[0] = GyX/G_R;
Gy[1] = GyY/G_R;
//Aplicar el Filtro Complementario
Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0]; //filtro angulo X
Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1]; //filtro angulo Y
//Mostrar los valores por consola
//Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("\n");
//Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("\n---------\n");
delay(10); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida
/* ____________________________
control de los motores
____________________________
*/
int atras=0;
int adelante=0;
int ab= floor (3*(float (Angle[1]))); // convierto el angulo Y a un valor que va de 257 a -257 y lo guardo en la variable (ab)
// Serial.print(ab); Serial.print("\n---------\n");
ab= (ab*3); /* se multipica por 3 para que el valor ab (que es el pwm de los motores) llege a los 255 o -255 más rapidamente,
aproximadamente a los 30 grados
*/
if (ab < -255)
{
ab=-255;
}
if (ab > 255)
{
ab=255;
}
if (ab>0){
atras= ab; // PWM de los motores atras (las dos ruedas funcionan al tiempo)
}
if (ab<=0){
adelante=(-1*ab); // PWM los motores van hacia adelante
}
Serial.println(atras);
Serial.println("\n-------------/n");
Serial.println(adelante);
// Sentido de giro de los motores
if (adelante != 0){ // no se permite que se envie el comando hacia adelante y hacia atras al tiempo
if (atras == 0){
analogWrite(llanta_I,adelante);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
analogWrite(llanta_D,adelante);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
}
if (atras != 0){ // no se permite que se envie el comando hacia adelante y hacia atras al tiempo
if (adelante == 0){
analogWrite(llanta_I,atras);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
analogWrite(llanta_D,atras);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
}
// Serial.print(ab); Serial.print("\n---------\n");
}
Solucionado.
he vuelto a probar, y resulta que haciendo un reset al arduino ya funciona correctamente cuando es alimentado a través de una fuente de alimentación.