Arduino no dispone de potencia suficiente para mover actuadores (un motor es un actuador por ejemplo). La función de Arduino es la de procesar (el control) y no la de ejecutar acciones. Su función es la de mandar ejecutar acciones a «drivers» que realicen el trabajo sucio.
Por ejemplo un sensor de temperatura metería datos a Arduino y este los procesa y manda orden a los controladores para que actúen. Si el actuador es un diodo led no existe mucho problema pero si es un motor de corriente continua la cosa se complica.
De todos modos con un transistor, un diodo y una resistencia si que podremos hacer que el motor se mueva a diferente velocidad, apagarlo y encenderlo. Ese será nuestro driver.
Antes de ponernos manos a la obra
Es importante saber que es un transistor. Aquí unos vídeos muy buenos:
El transistor puede funcionar como interruptor (uno o cero) pero también como amplificador.
Los pines PWN (en un «arduino uno» son el 3,5,6,9,10 y 11) nos permitirán generar señales «analógicas» (véase playground.arduino.cc/ArduinoNotebookTraduccion/Appendix3 ).
El cometido de este articulo es mover un motor CC a diferente velocidad y controlarlo. Para ello usaremos los pines PWN, un transistor TIP120, un motor de 6V (podemos alimentar el arduino (IN4001) con una pila a 9v y conectar a Vin en vez de al pin 5v), una resistencia (220Ω) y un diodo.
Controlar un motor de estos es posible pero en velocidad y poco más, es decir, no es un motor paso a paso que ese si que nos permite controlar las vueltas que da.
Las conexiones y el código
Aquí vemos las conexiones que he realizado (el transistor no es PNP es NPN):
Aquí puede verse el código:
int motorPin = 3; int speed = 0; void setup(){ pinMode(motorPin, OUTPUT); Serial.begin(9600); while(!Serial); Serial.println("Velocidad de 0 a 255"); } void loop(){ if (Serial.available()){ if (speed >= 0 && speed <= 255){ analogWrite(motorPin, speed); Serial.println(speed); speed = speed+1; delay(100); }else{ speed=0; analogWrite(motorPin, speed); Serial.println(speed); delay(2000); speed=255; analogWrite(motorPin, speed); Serial.println(speed); delay(2000); speed=0; analogWrite(motorPin, speed); Serial.println(speed); delay(2000); } } }
Lo interesante es que escupe por el puerto serie conectado a un PC la velocidad. Esto nos será de utilidad para usar en otro post futuro, concretamente con el que da fin a la serie de entradas sobre C y SDL en GNU+Linux.
Y es por eso que tenía la necesidad de dejarlo publicado. Al menos para que el post de cierre de esa serie tuviese sentido.
Saludos cordiales.