Saludos,
para un nuevo tipo de robot he necesitado crear una nuevas placas de control que pasare a comentar en una serie de publicaciones. Como siempre indicar que esta serie de post si bien pueden ayudar a alguien con el mismo problema o me sirven de recordatorio de como lo hice para futuros proyectos.
Figura 1 y 2 de la
placa protoripo
|
Nota: La placa tiene un conector para una alimentación externa
de los motores, para los test y las pruebas he realizado un puente para que la alimentación
la obtenga directamente del I2C (normalmente a 3v o 5v). Con los motores micro metal
Gearmotors LP (Low power), funciona sin problemas.
Empleamos el PIC16F1509
el modelo superior del PIC16F1503,
mas memoria mas pines mas tamaño y la oportunidad de emplear los 4 PWM para
obtener un control de la velocidad de
los motores.
El driver empleado es DRV8833, que pille hace
poco y funciona bastante bien a la vez que es pequeño el formato TSSOP, puede
controlar dos motores DC o un motor paso a paso, es el empleado en drivers
A4899. El DRV8833 admite una tensión de trabajo entre 2,7V -10,8V.
Conexiones
Pic
|
Driver 01
|
Driver 02
|
Función
|
RA5
|
NSLEEP
|
NSLEEP
|
High
para ON
|
RC5
|
AIN1
|
PWM1 à
pwm1 en el pic
|
|
RC4
|
AIN2
|
M1
|
|
RC3
|
BIN1
|
PWM2 àpwm2
en el pic
|
|
RC6
|
BIN2
|
M2
|
|
RB7
|
LED
|
||
RA0
|
I/O
o ANALOGICA
|
||
RA1
|
I/O o ANALOGICA
|
||
RA2
|
AIN1
|
PWM4
à pwm3 en el pic
|
|
RC0
|
AIN2
|
M4
|
|
RC1
|
BIN1
|
PWM3
à pwm4 en el pic
|
|
RC2
|
BIN2
|
M3
|
|
RB4
|
SDA
|
||
RB6
|
SCL
|
Control de motores
Los PWM los usaremos para
poner la velocidad y con los M1,M2,M3 y M4 cambiaremos la dirección.
setup_pwm1(PWM_ENABLED|PWM_OUTPUT); set_pwm1_duty(0);
setup_pwm2(PWM_ENABLED|PWM_OUTPUT); set_pwm2_duty(0);
setup_pwm3(PWM_ENABLED|PWM_OUTPUT); set_pwm3_duty(0);
setup_pwm4(PWM_ENABLED|PWM_OUTPUT); set_pwm4_duty(0);
El Timer 2 es el que se encarga del funcionamiento de los PWM, por criterio propio sin ninguna base le he dado un ciclo de desbordamiento de 10 ms.
setup_timer_2(T2_DIV_BY_16,251,10);//1,0
ms overflow, 10,0 ms interrupt 100Hz
Con esto tenemos que calcular la resolucion que tendremos para poder controlar los pwm, si trabajas normalmente con arduino, la resolución es de 1Byte 0..255. Aqui tenemos que calcularla para al menos tener el control.
Modo individual
En este modo cada mensaje será una instrucción para un
motor. Encendido, apagado, el orden lo impondrá el máster. Si enviamos con un
delay determinado, obligaremos al programa ha estar pendiente de la resolución
de la primera opción. Este modo es utiñl si se tiene diferentes procesos que se han de controlar por el master.
Control Master
|
Control Master
enviando delay
|
M1 àforward 100%
M2 àreverse 50%
delay 100
M1 Stop
delay 300
M2 stop
|
M1à forward 100%, delay 100
M2àreverse 50%, delay 300
|
M1 y M2 se inician a la vez y pasado 100 ms M1 se
para y M2 se detiene pasado 300ms mas.
|
M1 se pone en marcha y pasado 100ms se detiene. M2 se pone en marcha
y se detiene pasado 300ms
|
·
Control Modo
individual.
o
Velocidad del motor à motor[0..3], dir (0:forward ,1:reverse) y
pwm(0..255)
o
Velocidad del motor /tiempoà
motor[0..3], dir(0,1),pwm(0..255),delay(int16)
o
Stop motor à motor[0..3]
Modo Coordinado
En este modo hay que definir que aplicación vamos a
realizar. Por ejemplo, imaginaremos que queremos hacer el control de un
vehículo con tracción a las cuatro ruedas.
Dirección: Forward, Backward, Lef, Right, Turn_left,
Turn_right, Stop
Palabra de control 1
byte
|
|||||
Stop
|
M1
|
M2
|
M3
|
M4
|
Dirección
|
0001
|
x
|
x
|
x
|
x
|
STOP
|
0000
|
0
|
0
|
1
|
1
|
Forward
|
0000
|
1
|
1
|
0
|
0
|
Backward
|
0000
|
1
|
0
|
1
|
0
|
Left
|
0000
|
0
|
1
|
0
|
1
|
Right
|
0000
|
1
|
1
|
1
|
1
|
Turn_Left
|
0000
|
0
|
0
|
0
|
0
|
Turn_Right
|
·
Control Modo coordinado
o
Velocidad :Palabra de control,
pwm(0..255)
§
0001 xxxx --> Stop
§
0000 0011 --> Forward
§
0000 1100 --> Backward
§
0000 1010 --> Left
§
0000 0101 --> Right
§
0000 1111 --> Turn_left
§
0000 0000 --> Turn_right
o
Velocidad/tiempo definido: Palabra de control,
pwm(0..255)
o
Velocidad/tiempo: Palabra de control,
pwm(0..255),delay(int16)
Ejemplo de funcion de control de los motores:
void motor_con_all(int control, int16 pwm)
{
if(!bit_test(control,4)) //non STOP
{
if(!bit_test(control,3)) {
output_low(PIN_C4);
set_pwm1_duty(pwm);
} else{
output_high(PIN_C4);
set_pwm1_duty(max-pwm);
}
if(!bit_test(control,2)) {
output_low(PIN_C6);
set_pwm2_duty(pwm);
} else{
output_high(PIN_C6);
set_pwm2_duty(max-pwm);
}
if(!bit_test(control,1)) {
output_low(PIN_C0);
set_pwm3_duty(pwm);
} else{
output_high(PIN_C0);
set_pwm3_duty(max-pwm);
}
if(!bit_test(control,0)) {
output_low(PIN_C2);
set_pwm4_duty(pwm);
} else{
output_high(PIN_C0);
set_pwm4_duty(max-pwm);
}
}else
{
stop_all();
}
}
{
if(!bit_test(control,4)) //non STOP
{
if(!bit_test(control,3)) {
output_low(PIN_C4);
set_pwm1_duty(pwm);
} else{
output_high(PIN_C4);
set_pwm1_duty(max-pwm);
}
if(!bit_test(control,2)) {
output_low(PIN_C6);
set_pwm2_duty(pwm);
} else{
output_high(PIN_C6);
set_pwm2_duty(max-pwm);
}
if(!bit_test(control,1)) {
output_low(PIN_C0);
set_pwm3_duty(pwm);
} else{
output_high(PIN_C0);
set_pwm3_duty(max-pwm);
}
if(!bit_test(control,0)) {
output_low(PIN_C2);
set_pwm4_duty(pwm);
} else{
output_high(PIN_C0);
set_pwm4_duty(max-pwm);
}
}else
{
stop_all();
}
}
Instrucciones I2c para controlar el driver
cmd
|
datos
|
función
|
0x01
|
--
|
Led
on
|
0x02
|
--
|
Led off
|
0x10
|
Motor,
direc, pwm
|
control
motor individual
|
0x11
|
Motor,direc,pwm
|
control motor individual con delay por defecto
|
0x12
|
Motor,direc,pwm,delayH,delayL
|
control
motor individual con delay enviado
|
0x15
|
Control,pwm
|
Control motores
|
0x16
|
Control,pwm
|
Control
motores con delay por defecto
|
0x17
|
Control pwm, delayH,delayL
|
Control motores con delay enviado
|
0x20
|
delayH,delayL
|
Cambio
delay
|
0x30
|
--
|
Leer la entrada analógica A0
|
0x31
|
--
|
Leer
la entrada analógica A1
|
0x32
|
--
|
Leer variable de control 4660
|
0x40
|
--
|
Activar
el driver( activo por defecto)
|
0x41
|
--
|
Desactivar el driver
|
Las entradas A0 y A1 en este ejemplo se emplean como entradas analogicas que se pueden conectar a la placa, tambien podrian emplearse para conectar un enconder a uno de los motores y controlar el numero de vueltas que da.
Anakleto.
No hay comentarios:
Publicar un comentario