Servomotor
Un servomotor es un tipo especial de motor que se mueve a una posición concreta y permanece en la misma hasta que se le hace moverse hacia otra. Normalmente puede rotar hasta 180 grados.
Aunque es posible accionar el servomotor directamente enviándole un número de pulsos de una cierta frecuencia y anchuras variables (PWM), existe una biblioteca para Arduino que permite hacer funcionar un servomotor de un modo más sencillo.
En el circuito de la figura, el cable rojo del servomotor se conecta a la alimentación (5V), el negro a tierra (GND) y el blanco a la salida 6 de la placa Arduino. Asimismo, se conectan tres LEDs a las salidas 9, 10 y 11.
El accionamiento de un potenciómetro genera una salida cuya tensión está comprendida entre 0 y 5V, la cual se conecta a la entrada analógica A2 de la placa Arduino.
Al comenzar a moverse, el servomotor consume más corriente que cuando está en movimiento. La colocación de un condensador de 100 μF entre los pines de alimentación y tierra del servomotor - el cátodo del condensador (raya negra) debe conectarse a tierra - suaviza cualquier cambio de tensión que pueda darse. Los condensadores de desacoplo reducen - o desacoplan - los posibles cambios causados por los componentes del resto del circuito. Asimismo, es conveniente conectar otro condensador a los pines de alimentación y tierra del potenciómetro.
En la función de inicialización (setup()), además de inicializar el monitor serie, los pines de salida para los LEDs (9, 10 y 11) y el pin analógico de entrada para el potenciómetro (A2), al objeto MyServo declarado previamente se le asigna el pin 6 de la placa Arduino, al cual se conecta el dispositivo fÃsico (servomotor) mediante el cable correspondiente.
El bucle de control del programa (función loop()) lee de la entrada analógica A2 el valor de salida del potenciómetro, comprendido entre 0 y 1023. La función map() permite escalar el valor obtenido en un rango entre 0 y 179 grados, el cual servirá para accionar el servomotor mediante el pin 6 de la placa Arduino.
En cada iteración se indica a través del monitor serie el valor de salida del potenciómetro (PotValue) asà como el valor de posición enviado a la entrada del servomotor (ServoAngle) mediante una invocación al método write() sobre el objeto MyServo.
También es posible consultar directamente al servomotor acerca de su posición actual invocando el método read() sobre el objeto MyServo, el cual devuelve un valor expresado en grados. Una vez que el servomotor se ha posicionado, los LEDs se encienden para un ángulo igual o superior a 90º.
Finalmente, el retardo de 25 milisegundos proporciona el tiempo necesario al servomotor para que se mueva a su nueva posición - si ésta ha variado con respecto a la que tenÃa en la iteración anterior - antes de que se le indique otra posición en la siguiente iteración.