En este artículo, se explicará cómo se puede controlar tanto la velocidad como el sentido de giro de una hélice motorizada utilizando el driver L9110H. Este componente es comúnmente utilizado para el manejo de pequeños motores DC que operan con voltajes entre 2.5 y 12V. En este caso, se utilizará un motor DC de 5V y una corriente máxima de 800mA. La hélice motorizada con el driver L9110H es fabricada por «KEYES» y se puede adquirir en algunas tiendas de electrónica en línea por alrededor de 6€, bajo el nombre de «Fan motor».
En este texto, se presenta un sistema que ya viene montado y soldado en un PCB y que permite controlar un motor DC de 5V. El sistema cuenta con 4 pines de conexión, 2 de los cuales se utilizan para la alimentación (+VCC y GND) y los otros 2 para el control del motor (INA e INB). El pin INA se utiliza para variar la velocidad del motor mediante pulsos PWM, lo que implica que se debe conectar a un pin digital de Arduino que permita la salida digital pulsada. En el programa de control, se utiliza el pin digital 9 para esta conexión. Por otro lado, el pin INB se utiliza para cambiar el sentido de giro del motor.
Si este pin se encuentra en nivel BAJO (LOW), el motor girará en un sentido y si está en nivel ALTO (HIGH), girará en el sentido contrario. En el programa de control, se utiliza el pin digital 8 para esta conexión.
Lista de Materiales
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Fan Motor (KEYES)
- Protoboard
- Cables de conexión
Código del programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
/* TITULO: Control de una hélice con motor DC y driver L9110H. AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa se controlar una hélice con motor DC (Fan Motor) mediante el driver L9110H. A través del monitor serie podremos seleccionar las diferentes opciones de velocidad y sentido de giro del motor DC, además de poder realizar dos tipos difrentes de parada (con freno motor y sin él). ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| INA del "Fan motor" | [ ]GND -| R |- 8[ ] | INB del "Fan motor" | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - La alimentación y la masa del "Fan Motor" van directamente conectadas a +5V y GND respectivamente. */ // Declaración de constantes globales #define MOTOR_PWM 9 // Pin digital 9 para el pin INA (Velocidad PWMM del motor) #define MOTOR_GIRO 8 // Pin digital 8 para el pin INB (Sentido de giro del motor) #define PWM_LENTO 100 // PWM para la velocidad lenta #define PWM_RAPIDO 255 // PWM para la velocidad rápida #define RETARDO_GIRO 1000 // Retardo para el cambio del sentido de giro del motor boolean entrada_valida; // Variable para el control del MENU byte c; // Variable que almacena el carácter recibido por el puerto serie int anterior = 0; // Variable que almacena el número de la secuencia del MENU void setup() { Serial.begin(9600); pinMode(MOTOR_GIRO, OUTPUT); // Pin digital 8 como salida pinMode(MOTOR_PWM, OUTPUT); // Pin digital 9 como salida digitalWrite(MOTOR_GIRO, LOW); // MOTOR_DIR a nivel BAJO digitalWrite(MOTOR_PWM, LOW); // MOTOR_PWM a nivel BAJO } void loop() { // Dibuja el MENU a través del monitor serie Serial.println("--------------------------------"); Serial.println("---------- MENU ----------"); Serial.println("--------------------------------"); Serial.println("1 - AVANCE RAPIDO"); Serial.println("2 - HACIA ADELANTE"); Serial.println("3 - PARADA SUAVE"); Serial.println("4 - MARCHA ATRAS"); Serial.println("5 - RETROCESO RAPIDO"); Serial.println("6 - FRENO MOTOR"); Serial.println("X - CUALQUIER TECLA SACA MENU"); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); do { // Espera el siguiente carácter enviado desde el monitor serie while(!Serial.available()) ; // Se mantiene en un bucle de espera c = Serial.read(); // Almaceno el carácter recibido Serial.write(c); // Evalúo el carácter recibido switch(c) { case '1': // AVANCE RAPIDO Serial.println("\n--------------------------------"); Serial.println( "AVANCE RAPIDO!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); if(anterior!=2) { // Se detienen los motores brevemente antes del cambio del sentido de giro digitalWrite(MOTOR_GIRO, LOW); digitalWrite(MOTOR_PWM, LOW); } if(anterior == 3 || anterior == 4) { delay(RETARDO_GIRO); // Retardo para el cambio del sentido de giro } // Ajusta la velocidad y el sentido de giro del motor digitalWrite(MOTOR_GIRO, HIGH); // Sentido de giro -> Hacia adelante analogWrite(MOTOR_PWM, 255-PWM_RAPIDO); // Velocidad -> Rápida entrada_valida = true; anterior = 1; break; case '2': // HACIA ADELANTE Serial.println("\n--------------------------------"); Serial.println( "HACIA ADELANTE!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); if(anterior!=1) { // Se detienen los motores brevemente antes del cambio del sentido de giro digitalWrite(MOTOR_GIRO, LOW); digitalWrite(MOTOR_PWM, LOW); } if(anterior == 3 || anterior == 4) { delay(RETARDO_GIRO); // Retardo para el cambio del sentido de giro } // Ajusta la velocidad y el sentido de giro del motor digitalWrite(MOTOR_GIRO, HIGH); // Sentido de giro -> Hacia adelante analogWrite(MOTOR_PWM, 255-PWM_LENTO); // Velocidad -> Lenta entrada_valida = true; anterior = 2; break; case '3': // PARADA SUAVE Serial.println("\n--------------------------------"); Serial.println( "PARADA SUAVE!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); // Se detienen los motores digitalWrite(MOTOR_GIRO, LOW); digitalWrite(MOTOR_PWM, LOW); entrada_valida = true; break; case '4': // MARCHA ATRAS Serial.println("\n--------------------------------"); Serial.println( "MARCHA ATRAS!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); if(anterior!=4) { // Se detienen los motores brevemente antes del cambio del sentido de giro digitalWrite(MOTOR_GIRO, LOW); digitalWrite(MOTOR_PWM, LOW); } if(anterior == 1 || anterior == 2) { delay(RETARDO_GIRO); // Retardo para el cambio del sentido de giro } // Ajusta la velocidad y el sentido de giro del motor digitalWrite(MOTOR_GIRO, LOW); // Sentido de giro -> Hacia atrás analogWrite(MOTOR_PWM, PWM_LENTO ); // Velocidad -> Lenta entrada_valida = true; anterior = 3; break; case '5': // RETROCESO RAPIDO Serial.println("\n--------------------------------"); Serial.println( "RETROCESO RAPIDO!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); if(anterior!=3) { // Se detienen los motores brevemente antes del cambio del sentido de giro digitalWrite(MOTOR_GIRO, LOW); digitalWrite(MOTOR_PWM, LOW); } if(anterior == 1 || anterior == 2) { delay(RETARDO_GIRO); // Retardo para el cambio del sentido de giro } // Ajusta la velocidad y el sentido de giro del motor digitalWrite(MOTOR_GIRO, LOW); // Sentido de giro -> Hacia atrás analogWrite(MOTOR_PWM, PWM_RAPIDO); // Velocidad -> Rápida entrada_valida = true; anterior = 4; break; case '6': // FRENO MOTOR (No utilizar con frecuencia) Serial.println("\n--------------------------------"); Serial.println( "FRENO MOTOR!!!" ); Serial.println("--------------------------------"); Serial.print(">> Selecciona una opcion... "); // Se invierte el sentido de giro del motor y se para digitalWrite(MOTOR_GIRO, HIGH); digitalWrite(MOTOR_PWM, HIGH); entrada_valida = true; break; default: Serial.println("\n"); // Si se introduce un carácter que no está en el MENU, se vuelve a mostrar el MENU entrada_valida = false; break; } } while(entrada_valida == true); } |
gracias