Introduction: Proyecto Laboratorio De Mecatrónica (Two Wheel Balance Robot)

En este proyecto se mostrara, el funcionamiento y el como hacer para elaborar un "Two wheel balance robot" paso a paso y con explicación y concejos. Este es un sistema que consiste en que el robot no se debe caer, se debe de mantener en el punto 0 de su punto de gravedad del giroscopio, y así poder moverlo y que este regrese por si mismo a su posición original.

Step 1: Step 1: Material Requerido

o Mecánicos:

a. 1 metro de varilla roscada (3/8)

b. 14 tornillos M3 x .07 x 6

c. 24 tuercas M8 hex

d. 3 tornillos M4 x .07 x 6

e. Filamento PLA (500grs aprox)

o Electrónicos:

a. 1 interruptor switch

b. Arduino uno o nano

c. 2 motores nema 17

d. 2 drivers A4988

e. 3 resistencias 1k

f. HC-05

g. MPU-6050

h. 2 capacitores de 100uf o 47uf

i. Batería lippo 11.1 V

o Piezas fabricadas:

a. 3 placas de MDF (120 x 170 x 6 mm)

b. Placa PCB (8 x 14 cm aprox)

c. Soporte batería

d. 2 soporte para motor

e. 2 llantas

o Extras:

Softwares recomendados para la realización del proyecto.

a. Arduino IDE software

b. SolidWorks 2018

c. Kidcad software

Step 2: Step 2: Sistema Mecánico-estructura

El modelado de las piezas y estructura general se realizo en SolidWorks, primero se crearon las placas de MDF para checar el espacio disponible para posteriores usos. Estas placas son diferentes entre ellas, la placa inferior tendrá los orificios para los soportes de motores y batería, la central para nuestra PCB y la superior solo tendrá los orificios para darle su estructura.

Step 3: Step 3: Fabricación De Piezas 3D

Para el modelado de los soportes y llantas igualmente utilizamos SolidWorks, estos soportes pueden ser modificados si así lo desean, para un mejor funcionamiento, los soportes tienen orificios de .35 cm de diámetro, para una mejor sujeción.

Step 4: Step 4: Sistema Eléctrico/electrónico

En este paso utilizamos una PCB, para elaborar las conexiones correspondientes, haciendo el enlace entre el arduino, el modulo de Bluetooth HC-05, un giroscopio 6050 y los drivers de los motores. Las conexiones son las que se muestran en la imagen. Asegúrese de hacer las conexiones correctamente, ya que de no ser así puede ocasionar que el sistema no funcione correctamente y no lo obedezca.

Step 5: Step 5: Software

Para el programa utilizamos un arduino, a continuación anexamos una parte de la programación con su explicación correspondiente, al igual anexo link, con el codigo completo: https://github.com/mahowik/BalancingWii

Pos hold
configuracion

// default POSHOLD control gains

#define POSHOLD_P 2.00

#define POSHOLD_I 0.0

#define POSHOLD_IMAX 20 // degrees

#define POSHOLD_RATE_P 2.0

#define POSHOLD_RATE_I 0.08 // Wind control

#define POSHOLD_RATE_D 0.045 // try 2 or 3 for POSHOLD_RATE 1

#define POSHOLD_RATE_IMAX 20 // degrees

// default Navigation PID gains

#define NAV_P 1.4

#define NAV_I 0.20 // Wind control

#define NAV_D 0.08 //

#define NAV_IMAX 20 // degrees

#define MINCHECK 1100

#define MAXCHECK 1900

Aqui se modifica los gains para el poss hold del sistema.

Configuración gyro:

void Gyro_init() {

TWBR = ((F_CPU / 400000L) - 16) / 2; // change the I2C clock rate to 400kHz

i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x80); //PWR_MGMT_1 -- DEVICE_RESET 1

delay(5);

i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x03); //PWR_MGMT_1 -- SLEEP 0; CYCLE 0; TEMP_DIS 0; CLKSEL 3 (PLL with Z Gyro reference)

i2c_writeReg(MPU6050_ADDRESS, 0x1A, MPU6050_DLPF_CFG); //CONFIG -- EXT_SYNC_SET 0 (disable input pin for data sync) ; default DLPF_CFG = 0 => ACC bandwidth = 260Hz GYRO bandwidth = 256Hz)

i2c_writeReg(MPU6050_ADDRESS, 0x1B, 0x18); //GYRO_CONFIG -- FS_SEL = 3: Full scale set to 2000 deg/sec

// enable I2C bypass for AUX I2C

#if defined(MAG)

i2c_writeReg(MPU6050_ADDRESS, 0x37, 0x02); //INT_PIN_CFG -- INT_LEVEL=0 ; INT_OPEN=0 ; LATCH_INT_EN=0 ; INT_RD_CLEAR=0 ; FSYNC_INT_LEVEL=0 ; FSYNC_INT_EN=0 ; I2C_BYPASS_EN=1 ; CLKOUT_EN=0

#endif

}

void Gyro_getADC () {

i2c_getSixRawADC(MPU6050_ADDRESS, 0x43);

GYRO_ORIENTATION( ((rawADC[0]<<8) | rawADC[1])>>2 , // range: +/- 8192; +/- 2000 deg/sec

((rawADC[2]<<8) | rawADC[3])>>2 ,

((rawADC[4]<<8) | rawADC[5])>>2 );

GYRO_Common();

}

void ACC_init () {

i2c_writeReg(MPU6050_ADDRESS, 0x1C, 0x10); //ACCEL_CONFIG -- AFS_SEL=2 (Full Scale = +/-8G) ; ACCELL_HPF=0 //note something is wrong in the spec.

//note: something seems to be wrong in the spec here. With AFS=2 1G = 4096 but according to my measurement: 1G=2048 (and 2048/8 = 256)

//confirmed here: http://www.multiwii.com/forum/viewtopic.php?f=8&t...

#if defined(MPU6050_I2C_AUX_MASTER)

//at this stage, the MAG is configured via the original MAG init function in I2C bypass mode

//now we configure MPU as a I2C Master device to handle the MAG via the I2C AUX port (done here for HMC5883)

i2c_writeReg(MPU6050_ADDRESS, 0x6A, 0b00100000); //USER_CTRL -- DMP_EN=0 ; FIFO_EN=0 ; I2C_MST_EN=1 (I2C master mode) ; I2C_IF_DIS=0 ; FIFO_RESET=0 ; I2C_MST_RESET=0 ; SIG_COND_RESET=0

i2c_writeReg(MPU6050_ADDRESS, 0x37, 0x00); //INT_PIN_CFG -- INT_LEVEL=0 ; INT_OPEN=0 ; LATCH_INT_EN=0 ; INT_RD_CLEAR=0 ; FSYNC_INT_LEVEL=0 ; FSYNC_INT_EN=0 ; I2C_BYPASS_EN=0 ; CLKOUT_EN=0

i2c_writeReg(MPU6050_ADDRESS, 0x24, 0x0D); //I2C_MST_CTRL -- MULT_MST_EN=0 ; WAIT_FOR_ES=0 ; SLV_3_FIFO_EN=0 ; I2C_MST_P_NSR=0 ; I2C_MST_CLK=13 (I2C slave speed bus = 400kHz)

i2c_writeReg(MPU6050_ADDRESS, 0x25, 0x80|MAG_ADDRESS);//I2C_SLV0_ADDR -- I2C_SLV4_RW=1 (read operation) ; I2C_SLV4_ADDR=MAG_ADDRESS

i2c_writeReg(MPU6050_ADDRESS, 0x26, MAG_DATA_REGISTER);//I2C_SLV0_REG -- 6 data bytes of MAG are stored in 6 registers. First register address is MAG_DATA_REGISTER

i2c_writeReg(MPU6050_ADDRESS, 0x27, 0x86); //I2C_SLV0_CTRL -- I2C_SLV0_EN=1 ; I2C_SLV0_BYTE_SW=0 ; I2C_SLV0_REG_DIS=0 ; I2C_SLV0_GRP=0 ; I2C_SLV0_LEN=3 (3x2 bytes)

#endif

}

void ACC_getADC () {

i2c_getSixRawADC(MPU6050_ADDRESS, 0x3B);

ACC_ORIENTATION( ((rawADC[0]<<8) | rawADC[1])>>3 ,

((rawADC[2]<<8) | rawADC[3])>>3 ,

((rawADC[4]<<8) | rawADC[5])>>3 );

ACC_Common();

}

//The MAG acquisition function must be replaced because we now talk to the MPU device

#if defined(MPU6050_I2C_AUX_MASTER)

void Device_Mag_getADC() {

i2c_getSixRawADC(MPU6050_ADDRESS, 0x49); //0x49 is the first memory room for EXT_SENS_DATA

#if defined(HMC5843)

MAG_ORIENTATION( ((rawADC[0]<<8) | rawADC[1]) ,

((rawADC[2]<<8) | rawADC[3]) ,

((rawADC[4]<<8) | rawADC[5]) );

#endif

#if defined (HMC5883)

MAG_ORIENTATION( ((rawADC[0]<<8) | rawADC[1]) ,

((rawADC[4]<<8) | rawADC[5]) ,

((rawADC[2]<<8) | rawADC[3]) );

#endif

#if defined (MAG3110)

MAG_ORIENTATION( ((rawADC[0]<<8) | rawADC[1]) ,

((rawADC[2]<<8) | rawADC[3]) ,

((rawADC[4]<<8) | rawADC[5]) );

#endif

}

#endif

#endif

Step 6: Step 6: Consejos

1. Diseño Mecánico: Utilizar y hacer el diseño que mas les convenga, para el uso que se le quiere dar al robot, medir todo bien, para la hora de hacer cortes láser o impresiones en 3D, no tengan que volver a hacerlo y todo quede a la perfección.

2. Diseño eléctrico: Hacer su propia PCB, para que tengan bien ubicadas las conexiones que tienen que hacer, de igual manera hacer primero las conexiones en una protoboard, para comprobar que cuando la pongan en el PCB el funcionamiento sea el correcto y no tengan que agregar mas conexiones o volver a imprimir el PCB.

3. Diseño Software: Guiarse con la programación base expuesta, pero tratar de hacer su propia programación, para llegar a entender bien el funcionamiento y en caso de que no funcionar la programación saber como cambiar las instrucciones para que funcione correctamente.