Professional Documents
Culture Documents
TB6612FNG + Arduino TH
Cerrado martes, 10 de abril de 2012
//Motor A
//Motor B
void setup(){
pinMode(STBY, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
void loop(){
stop(); //stop
delay(1000);
stop();
delay(250);
if(direction == 1){
inPin1 = HIGH;
inPin2 = LOW;
}
if(motor == 1){
digitalWrite(AIN1, inPin1);
digitalWrite(AIN2, inPin2);
analogWrite(PWMA, speed);
}else{
digitalWrite(BIN1, inPin1);
digitalWrite(BIN2, inPin2);
analogWrite(PWMB, speed);
void stop(){
//enable standby
digitalWrite(STBY, LOW);
}
CONTROLAR DOS
MOTORES DC CON
ARDUINO Y DRIVER
TB6612FNG
SHARE ON:
— 18 AGOSTO, 2016
¿QUÉ ES UN TB6612FNG ?
El TB6612FNG es un controlador (driver) de motores que nos permite manejar dos motores de
corriente continua desde Arduino, variando tanto la velocidad como el sentido de giro.
El TB6612FNG puede ser considerado una versión mejorada del L298N. Al igual que esté,
internamente está formado por dos puentes-H, junto con la electrónica necesaria para simplificar su
uso, y eliminar posibles cortocircuito por errores de uso.
Sin embargo, en el caso del TB6612FNG los puentes-H están formados por transistores
MOSFET, en lugar de transistores BJT como en el L298N. Esto permite que el TB6612FNG tiene
mejor eficiencia y menores dimensiones que el L298N.
Además, el TB6612FNG no tiene la caída de tensión que sí tiene el L298N debido a sus
transistores BJT, que podían llegar a ser superiores a 3V. En su lugar, el TB6612FNG se comporta
como una pequeña resistencia de 0.5 Ohm.
Finalmente, la protección contra corrientes inducidas son algo más limitadas que las del L298N,
por lo que podemos tener algún reinicio de Arduino cuando alimentamos cargas medianas o grandes.
El TB6612FNG dispone de dos canales, por lo que es posible controlar dos motores de corriente
continua de forma independiente. También puede controlar un único motor paso a paso aunque, en
general, preferiremos usar controladores específicos.
En cada canal podemos controlar el sentido de giro y la velocidad, para lo cual admite una señal
PWM de frecuencia máxima de 100 kHz (muy por debajo del rango normal de PWM en Arduino)
PRECIO
El controlador TB6612FNG es un dispositivo barato. En un principio el TB6612FNG era más
caro que el L298N, pero los precios descendieron y en la actualidad el TB6612FNG es más barato
que el L298N.
Podemos encontrar un TB6612FNG por 1,10€ en vendedores internacionales de AliExpress o
eBay.
ESQUEMA DE MONTAJE
El esquema de montaje no es demasiado complicado. Por un lado, suministramos la tensión que
alimentará el motor desde una fuente de alimentación externa, mediante el pin VM. La tensión
máxima es de 15V.
Además, tenemos que alimentar la electrónica del módulo mediante el pin VCC. El rango de
tensión para VCC es 2.7 a 5.5V.
Para el control del módulo Los pines AIN1, AIN2 Y PWMA controlan el canal A, mientras que
los pines BIN1, BIN2, y PWMB controlan el canal B.
Finalmente, el pin STBY controla el modo Standby. Debemos ponerlo en HIGH para activar el
motor. Podemos conectarlo a un pin digital de Arduino, si queremos poder activar el modo Standby,
o conectarlo a VCC si queremos dejarlo permanentemente desconectado.
La conexión, vista desde Arduino quedaría de la siguiente forma.
EJEMPLOS DE CÓDIGO
El código necesario es similar al que vimos al ver el L298N. Igualmente, conviene que
agrupemos el código en funciones que podamos reutilizar, o el código crecerá rápidamente.
El siguiente código permite desplazar y girar un vehículo, actuando sobre ambos motores.
Empleamos el modo Standby para reducir el consumo cuando esté parado, alargando la batería.
11
14
15 enum moveDirection {
16 forward,
17 backward
18 };
19
20 enum turnDirection {
21 clockwise,
22 counterClockwise
23 };
24
25 void setup()
26 {
27 pinMode(pinAIN2, OUTPUT);
28 pinMode(pinAIN1, OUTPUT);
29 pinMode(pinPWMA, OUTPUT);
30 pinMode(pinBIN1, OUTPUT);
31 pinMode(pinBIN2, OUTPUT);
32 pinMode(pinPWMB, OUTPUT);
33 }
34
35 void loop()
36 {
37 enableMotors();
38 move(forward, 180);
39 delay(waitTime);
40
41 move(backward, 180);
42 delay(waitTime);
43
44 turn(clockwise, 180);
45 delay(waitTime);
46
47 turn(counterClockwise, 180);
48 delay(waitTime);
49
50 fullStop();
51 delay(waitTime);
52 }
53
56 {
57 if (direction == forward)
58 {
59 moveMotorForward(pinMotorA, speed);
60 moveMotorForward(pinMotorB, speed);
61 }
62 else
63 {
64 moveMotorBackward(pinMotorA, speed);
65 moveMotorBackward(pinMotorB, speed);
66 }
67 }
68
70 {
71 if (direction == forward)
72 {
73 moveMotorForward(pinMotorA, speed);
74 moveMotorBackward(pinMotorB, speed);
75 }
76 else
77 {
78 moveMotorBackward(pinMotorA, speed);
79 moveMotorForward(pinMotorB, speed);
80 }
81 }
82
83 void fullStop()
84 {
85 disableMotors();
86 stopMotor(pinMotorA);
87 stopMotor(pinMotorB);
88 }
89
90 //Funciones que controlan los motores
92 {
93 digitalWrite(pinMotor[1], HIGH);
94 digitalWrite(pinMotor[2], LOW);
95
96 analogWrite(pinMotor[0], speed);
97 }
98
100 {
103
105 }
106
108 {
111
113 }
114
116 {
118 }
119
121 {
En un proyecto complejo, estas funciones estarían integradas en los objetos que integran nuestro
modelo.
//bluetooth hc-06
int ledPin = 12; // usamos un pin de salida al LED
int state = 0; // Variable lectrura serial
void setup() {
pinMode(ledPin, OUTPUT); //Declara pin de Salida
digitalWrite(ledPin, LOW); //Normalmente Apagado
Serial.begin(9600);
}
void loop() {
//si el modulo a manda dato, guardarlo en estado.
if(Serial.available() > 0){
state = Serial.read();
} // esta parte del código es para solo 1 Carácter o Unidad.