2/20/2020

Driver 4 Servomotores por i2c


Saludos, 

continuando con mis prototipos, hoy os presento una placa para controlar 4 servomotores, vendría a substituir la placa que os mostré en la entrada anterior , pero con otro tipo de motores. Empleamos el PIC16F1509 el modelo superior del PIC16F1503, más memoria más pines más tamaño y la oportunidad de emplear los 4 PWM para obtener un control de los servomotores.



Figura 1 placa del prototipo


Los servomotores funcionan a una frecuencia de 50 Hz , eso equivale a un ciclo de reloj de 20 ms, y el régimen de trabajo se desarrolla entre 1 y  2 ms. Este dato puede variar en función de los Servomotores que empleemos.  La placa dispone de un conector de alimentación extra para los servos, para los test y las pruebas he empleado la tensión propia del i2c y los servomotores DFR0399 un micrometal de 75:1 con control de servo. En este caso en vez de controlar la posición, controlamos la velocidad y la dirección.


Conexiones


Pic
Función
RC5
Servo01 à pwm1 en el pic
RC3
Servo02 àpwm2 en el pic
RB7
LED
RA0
I/O o ANALOGICA
RA1
I/O o ANALOGICA
RA2
Servo03 à pwm3 en el pic
RC1
Servo04 à pwm4 en el pic
RB4
SDA
RB6
SCL

Control de los ServoMotores


Al emplear el modelo PICF1509 podemos usar los cuatro PWM del pic para que nos generen un pulso con una frecuencia de 50Hz, o lo que es lo mismo 20 ms. Que el tiempo que necesitan la mayoría de los servos para funcionar.

Esto lo conseguimos:
  • Para conseguir este intervalo de tiempo en el Timer 2, es necesario poner el reloj interno del pic a 8Mhz en vez de los 16Mhz que permite.

setup_timer_2(T2_DIV_BY_16,250,10);      //2,0 ms overflow, 20,0 ms interrupt

  • .Vamos a hacer algunos números.



  • .        El setup de los PWM


setup_pwm1(PWM_ENABLED|PWM_OUTPUT);
setup_pwm2(PWM_ENABLED|PWM_OUTPUT);
setup_pwm3(PWM_ENABLED|PWM_OUTPUT);
setup_pwm4(PWM_ENABLED|PWM_OUTPUT);

 

 

Modo individual


El control se simplifica mucho. Convertimos en valor de ángulo en su equivalente para el ancho del pulso del pwm.



  •         Posición del servomotor àservo[0..3], ángulo[0..180]
  •         Posición del servomotor con delay predefinido àservo[0..3], ángulo[0..180]
  •         Posición del servomotor con delay àservo[0..3], ángulo[0..180], delay(int16)

 Ejemplo de código  control de cada servo individual

void servo_individual(int servo, int angle)
{
   switch(servo)
     {
         case 0:
               set_pwm1_duty(angle);
               break;
         case 1:
               set_pwm2_duty(angle);
               break;
         case 2:
               set_pwm3_duty(angle);
               break;
         case 3:
               set_pwm4_duty(angle);
               break;
     }
}

Modo Coordinado


En este modo va en función de la aplicación que vamos a realizar. Si empleamos en ejemplo de los motores, el control de un vehículo con tracción a las cuatro ruedas. En este sentido el ángulo se interpreta como velocidad.

0°
90°
180°
Máxima velocidad ßß
Stop
Máxima velocidad àà


Dirección àForward, Backward, Lef, Right, Turn_left, Turn_right, Stop


·        Modo coordinado        
o   Instrucción àPalabra de control, ángulo (0..180)
§  0001 xxxx à Stop
§  0000 0011 à Forward
§  0000 1100 à Backward
§  0000 1010 à Left
§  0000 0101 à Right
§  0000 1111 à Turn_left
§  0000 0000 à Turn_right
o   Instrucción con delay predefinido à Palabra de control, ángulo (0..180)
o   Instrucción con delayà Palabra de control, ángulo (0..180),delay(int16)

Ejemplo de función en Modo coordinado

void servomotor_con_all( int control,int angle)
{
   if(!bit_test(control,4))  //non STOP
   {
      if(!bit_test(control,3)) set_pwm1_duty(angle);     
      else  set_pwm1_duty(180-angle);
      if(!bit_test(control,2)) set_pwm2_duty(angle);     
      else set_pwm2_duty(180-angle);
      if(!bit_test(control,1)) set_pwm3_duty(angle);     
      else set_pwm3_duty(180-angle);
      if(!bit_test(control,0)) set_pwm4_duty(angle);     
      else set_pwm4_duty(180-angle);
      
   }else   stop_all();  

}



El control mediante PWM simplifica mucho el tipo de control, tanto el individual como el coordinado.

Instrucciones I2c para controlar el driver


cmd
Datos
Función
0x01
--
Led on
0x02
--
Led off
0x10
ServoMotor, ángulo
control motor individual
0x11
ServoMotor,ángulo
control motor individual con delay por defecto
0x12
ServoMotor,ángulo,delayH,delayL
control motor individual con delay enviado
0x15
Control,ángulo
Control Servomotores
0x16
Control,ángulo
Control Servomotores con delay por defecto
0x17
Control,ángulo, delayH,delayL
Control Servomotores 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



Esta placa esta interesante pues ofrece poder controlar diferentes servos sin tener que saturar a la cpu, con varias placas de este tipo conectadas a un máster se podría controlar un hexapodo mediante mensajes de i2c. Mi obsesión por este protocolo es alta.


Anakleto.

2/03/2020

Driver 4 motores DC por i2c



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(255-pwm);
      }
      if(!bit_test(control,2)) {
           output_low(PIN_C6);
           set_pwm2_duty(pwm);   
      } else{
          output_high(PIN_C6);
          set_pwm2_duty(255-pwm);
      }
      if(!bit_test(control,1)) {
           output_low(PIN_C0);
           set_pwm3_duty(pwm);   
      } else{
          output_high(PIN_C0);
          set_pwm3_duty(255-pwm);
      }
      if(!bit_test(control,0)) {
           output_low(PIN_C2);
           set_pwm4_duty(pwm);   
      } else{
          output_high(PIN_C0);
          set_pwm4_duty(255-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.