// programa PID desde cero
#include <Wire.h>
//Direccion I2C de la IMU
#define MPU 0x68
//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX;
int TiempoMuestreo=1;
milisegundos
// tiempo de muestreo Se encuentra en
unsigned long pasado=0;
// tiempo pasado (Se hace para
asegurar tiempo de muestreo)
unsigned long ahora;
float Ref=-0.2;
double Y;
double error;
double U;
// referencia
// Salida
// error
// Seal control
// constantes del controlador
int Kp=2000;
int llantaI=10;
// llanta Izquierda
int llantaD=11;
// llanta derecha
void setup()
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}
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();
Y=float(AcX)/17000;
ahora=millis();
//Cada valor ocupa 2 registros
// medicin de la planta
// tiempo actual
int CambioTiempo= ahora-pasado;
actual- pasado
// diferencia de tiempo
if(CambioTiempo >= TiempoMuestreo)
muestreo
// si se supera el tiempo de
{
error = Ref - Y;
// error (Lazo cerrado)-- Feedback
U=Kp*error;
// Seal de control
pasado=ahora;
// actualizar tiempo
if (U < -255)
// lmites de saturacin de la seal de control
{
U=-255;
}
if (U > 255)
// lmites de saturacin de la seal de control
{
U=255;
}
int atras=0;
int adelante=0;
if (U>0){
adelante=U;
// PWM de los motores atras y adelante (las dos
ruedas funcionan al tiempo)
}
if (U<0){
atras =abs(U);
}
Serial.println(U);
if (adelante != 0){ // no se permite que se envie el comando hacia
adelante y hacia atras al tiempo
if (atras == 0){
analogWrite(llantaI,adelante);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
analogWrite(llantaD,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(llantaI,atras);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
analogWrite(llantaD,atras);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
}