Equilibrio Instructable Robot (12 / 14 paso)

Paso 12: Cargar el código

Una vez haya hecho el robot finalmente su tiempo para subir el código y dar el robot un funcionamiento de prueba. He proporcionado la carga justa de código terminado y experimento con la constante de PID para lograr el equilibrio adecuado.

CÓDIGO:

 #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // not necessary if using MotionApps include file // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // is used in I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif MPU6050 mpu; #define OUTPUT_READABLE_YAWPITCHROLL bool dmpReady = false; // set true if DMP init was successful uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU uint8_t devStatus; // return status after each device operation (0 = success, !0 = error) uint16_t packetSize; // expected DMP packet size (default is 42 bytes) uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer[64]; // FIFO storage buffer // orientation/motion vars Quaternion q; // [w, x, y, z] quaternion container VectorInt16 aa; // [x, y, z] accel sensor measurements VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements VectorFloat gravity; // [x, y, z] gravity vector float euler[3]; // [psi, theta, phi] Euler angle container float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector static int pot1Pin = A0; static int pot2Pin = A1; static int pot3Pin = A2; float Kp = 0; float Ki = 0; float Kd = 0; float targetAngle = 8.5; float currAngle = 0; float pTerm = 0; float iTerm = 0; float dTerm = 0; float integrated_error = 0; float last_error = 0; float K = 1; // ================================================================ // === INTERRUPT DETECTION ROUTINE === // ================================================================ volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } // ================================================================ // === INITIAL SETUP === // ================================================================ void setup() { // join I2C bus (I2Cdev library doesn't do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif Serial.begin(115200); while (!Serial); Serial.println(F("Initializing I2C devices...")); mpu.initialize(); Serial.println(F("Testing device connections...")); Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); Serial.println(F("Initializing DMP...")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 factory default for my test chip if (devStatus == 0) { Serial.println(F("Enabling DMP...")); mpu.setDMPEnabled(true); Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady = true; packetSize = mpu.dmpGetFIFOPacketSize(); } else { Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); } pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(pot3Pin, INPUT); pinMode(pot1Pin, INPUT); pinMode(pot2Pin, INPUT); pinMode(A3, OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } // ================================================================ // === MAIN PROGRAM LOOP === // ================================================================ void loop() { if (!dmpReady) return; while (!mpuInterrupt && fifoCount < packetSize) { } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if ((mpuIntStatus & 0x10) || fifoCount == 1024) { mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); } else if (mpuIntStatus & 0x02) { while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); mpu.getFIFOBytes(fifoBuffer, packetSize); fifoCount -= packetSize; #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); Serial.print("ypr\t"); Serial.print(ypr[0] * 180/M_PI); Serial.print("\t"); Serial.print(ypr[1] * 180/M_PI); Serial.print("\t"); Serial.println(ypr[2] * 180/M_PI); #endif Kp = map(analogRead(pot1Pin), 0, 1024, 0, 255); Ki = map(analogRead(pot2Pin), 0, 1024, 0, 20); Kd = map(analogRead(pot3Pin), 0, 1024, 0, 20); Serial.print("Kp: "); Serial.print(Kp); Serial.print(" Ki: "); Serial.print(Ki); Serial.print(" Kd: "); Serial.println(Kd); currAngle = (ypr[1] * 180/M_PI); Drive_Motor(updateSpeed()); Serial.print("speed: "); Serial.println(updateSpeed()); } } float updateSpeed() { float error = targetAngle - currAngle; pTerm = Kp * error; integrated_error += error; iTerm = Ki * constrain(integrated_error, -50, 50); dTerm = Kd * (error - last_error); last_error = error; return -constrain(K*(pTerm + iTerm + dTerm), -255, 255); } float Drive_Motor(float torque) { Serial.print("torque: "); Serial.println(torque); if (torque >= 0) { // drive motors forward digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(12, LOW); digitalWrite(13, HIGH); } else { // drive motors backward digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); torque = abs(torque); } analogWrite(A3,torque); } 

Si las conexiones se siguen exactamente recibirá los motores girando en dirección al menos una, si no volver a los pasos anteriores y revise las conexiones de nuevo. Cuando todo sale bien obtendrás resultados como se muestra en el vídeo de la prueba anterior. A continuación voy a dar algunas instrucciones sobre cómo obtener resultados de las constantes del PID.

Ajuste de las constantes del PID:

  1. En primer lugar, aumentar el valor proporcional girando lentamente el potenciómetro proporcional. Prueba el equilibrio del robot para cada vuelta del potenciómetro.
  2. Entonces cuando el robot oscila de lado a lado como un péndulo entonces aumentas la Integral y derivados constante potenciómetros.
  3. Esta es la parte más difícil porque solamente en ciertos valores de equilibrio eficaz puede lograrse en el robot. Mi sugerencia sería que varían los valores y determinar los valores ideales para tu robot. Tenga en cuenta que estos valores varían de un robot a robot.

____________________________________________

Tenga en cuenta que este es mi primer robot equilibrio acertado. Así que tengo el robot de equilibrio pero sin duda hay margen para mejorar. En el futuro quiero hacer un robot equilibrio controlado más preciso del PID con características adicionales tal vez en el futuro.

Artículos Relacionados

3D Instructables Robot impresos

3D Instructables Robot impresos

Se trata de una impresión 3d del Instructables Robot, hay cuatro piezas que montan para crearlo, dos piernas, un cuerpo y la cabeza. Yo estoy entrando en el desafío RobotEncontrar archivos STL aquí en thingiversePaso 1: Diseñar e imprimir las piezas
Cruz Instructables Robot

Cruz Instructables Robot

Fijé una solicitud en este tema del foro para el concurso de robot de Instructables! Aunque no obtengo ninguna respuesta pero estaba realmente sorprendido y emocionado cuando una sierra Instructables ha lanzado finalmente 'Instructables robot concurs
Estante del cuadro de Instructables Robot

Estante del cuadro de Instructables Robot

Hacer Robot útil en vez de apenas colgando alrededor. Hacer este estante de knicknack práctico con una imagen del Instructables Robot.Puesto por la entrada para dejar las llaves o usarlo como un soporte de carga para sus dispositivos electrónicos. Gr
Instructables Robot--Modelo de papel

Instructables Robot--Modelo de papel

este es un instructivo que muestra cómo puede hacer su propio modelo de Instructables RobotUtilicé elementos de photoshop para crear la red para el modelo y para colorearlo y añadir detalles, en general esto me tomó un día para el diseño pero sólo ta
Camiseta de Hockey de Instructables Robot

Camiseta de Hockey de Instructables Robot

equipo Ibles. Ahora sale el disco outta aquí.¿Qué es Fn más masculinas que conseguir preparaban para un partido de hockey... o no? Hay no hay creadores de patata del sofá. Bien, necesitas un jersey auténtico equipo para darle ese aspecto agresivo e i
Instructables Robot dispensador de T.P.

Instructables Robot dispensador de T.P.

si eres inexperto en el bordado, una forma simple pero divertida para aprender algunos de los puntos básicos es el uso de lona plástica.  Se puede cortar y decorado y azotado juntos para crear objetos 3D. Los puntos básicos utilizados en el trabajo c
Caja de Instructables Robot de pie

Caja de Instructables Robot de pie

Este Instructable le mostrará cómo crear un cuadro de Instructables Robot de pie!Asegúrese de no perder pasos #16-18 especialmente si usted es el administrador de la comunidad revisar este Instructable para los concursos de en que mi futuro auto entr
Tarjeta pop-up de Instructables Robot!

Tarjeta pop-up de Instructables Robot!

te amo, amo, nos amamos el Instructables Robot!Yo quería hacer una tarjeta pop-up Instructable en el aprecio de todos los trabajadores y ' iblers que hacen posible este sitio! Qué mejor manera de hacerlo que to hacer un pop-up de nuestro favorito rob
Sostenedor de papel higiénico de Instructables Robot

Sostenedor de papel higiénico de Instructables Robot

los que suerte de tener tienda de madera en la escuela secundaria pueden han tenido que hacer un juego de sujetalibros de horsie. Un primer proyecto muy básico que consiste sólo en algunos cortes, pegamento, tal vez de uñas y un montón de lijado. Fue
USB Powered Instructables Robot lámpara de la noche

USB Powered Instructables Robot lámpara de la noche

un par de días atrás estaba navegando en internet y descubrí que podríamos cualquier gadget de energía con una potencia de 5V y 100mA (500mA en algunas condiciones especiales) conectando a un puerto USB, así que pensé que haría un principiantes instr
Tip Windows 7 - cambiar el icono de una carpeta y tener el Instructables Robot como su icono de carpeta de Instructables! ¿

Tip Windows 7 - cambiar el icono de una carpeta y tener el Instructables Robot como su icono de carpeta de Instructables! ¿

Por lo tanto, usted ha sido salir leer toneladas de ' ibles y han estado ahorrando de PDF y de imágenes para proyectos que gustaría probar uno de estos días y ahora necesita una carpeta en el escritorio o en la carpeta documentos así almacenarlas, de
Circuito arte: Instructables Robot

Circuito arte: Instructables Robot

Desde que era un niño estaba fascinado con la conexión entre arte y tecnología. La fascinación comenzó cuando primero VI arte de silicio en el Discovery Channel. Ahora que hago circuitos de mi, quiero show tributo a quienes siguen para mantener vivo
Pegamento caliente del bastidor: Instructables Robot {LED retroiluminada}

Pegamento caliente del bastidor: Instructables Robot {LED retroiluminada}

este Instructables no es sólo el Instructables Logo - The Robot, pero también sobre Bastidor de pegamento caliente!!!!!! ... Se le muestra cómo puede hacer su propio modelo de Instructables Robot!... Que también puede doblar como una fresca luz de la
Caso del DIY Instructables Robot iPhone

Caso del DIY Instructables Robot iPhone

En este tutorial que te mostraré cómo hacer un tejido de moda iPhone caso con algunos contemporáneo chevron estampado tela, un caso de iPhone simple y un parche de premio de instructables. Muestra tu espíritu de Instructables haciendo y colocar este