Proyecto con Arduino: operando un servo

Tras haber hecho las luces y el audio, y haberlos juntado, llega la parte de abrir y cerrar el casco accionado con una tarjeta RFID. Como con las luces, voy a trabajar de más sencillo a más complicado, empezando por un simple programita que cuando pulsas un botón mueve 100 grados el brazo de un servo.

El circuito es más simple que el mecanismo de un chupete:

El servo que he usado es un modelo SG90. Es un servo continuo, no de los que solo tienen un ángulo de 180º. Y no sé si el mío estaba defectuoso o leí mal la datasheet o yo qué sé, pero a la hora de programar me ha dado bastantes problemas (que comentaré en la parte “sobre el código”).

El código es casi el mismo que el de los LEDs con interrupciones, solo que cuando se pulsa el botón en vez de encender una luz se mueve un servo:

#include <Servo.h>

int boton = 3;
Servo servo1;
bool operarcasco = false;
bool cascoabierto = false;

long tiempo_anterior;
long diferencia;

int pos = 180;
byte ang_max = 100;

void setup() {
Serial.begin(9600);
pinMode(boton, INPUT);
servo1.attach(9);
servo1.write(pos);

attachInterrupt(digitalPinToInterrupt(boton), pulsacion, FALLING);
}

void loop() {
if(operarcasco){
Serial.println("operacasco");
operarcasco = false;
operarCasco();
}
}

void pulsacion(){
diferencia = millis() - tiempo_anterior;
tiempo_anterior = millis();
if(diferencia > 500){
operarcasco = true;
}
}

void operarCasco(){
if(cascoabierto == false){
for (pos = 180; pos >= 45; pos -= 1) {
servo1.write(pos);
delay(20);
}
Serial.println("casco abierto");
} else {
for (pos = 45; pos <= 180; pos += 1) {
servo1.write(pos);
delay(20);
}
Serial.println("casco cerrado");
}
cascoabierto = !cascoabierto;
}

Sobre el código:

La biblioteca Servo.h ya viene con el editor de Arduino así que no hace falta ni instalarla. Al parecer los servos continuos no funcionan como los de 180 grados, que cuando llamas a la instrucción write lo que les pasas es un ángulo, sino que lo que les pasas es la velocidad de giro en una dirección u otra. Al parecer 90 es “estate quieto”, 0 es “gira a toda velocidad a un lado” y 180 es “gira a toda velocidad a otro lado”.

Al parecer.

En primer lugar, en la datasheet no dice eso. De hecho creo que en la datasheet esa parte es una errata como una casa. Pero en posts en internet sobre este tema he visto que este modelo en concreto sí funciona así, o sea que modifiqué el código teniendo en cuenta esta información… y nada. El servo hacía cosas, pero moverse 100 grados a un lado y a otro no.

O sea que al final me dediqué a cambiar el valor que le pasaba al servo en la instrucción write hasta que el servo hizo lo que yo necesitaba que hiciera, y lo he dejado así (creo que se mueve 135 grados, no 100). Todo muy prueba y error. Esto funciona para mi servo, pero si o bien el mío está defectuoso, o bien el servo con el que lo hagáis no es ese modelo, seguramente este código o lo tengáis que cambiar o directamente no os valga para nada. De hecho para la versión final usaré otros dos servos y estoy bastante segura de que voy a tener que modificar el código para ellos.

O igual es que con servos continuos la biblioteca Servo.h no vale y hay que usar otra. Que podría ser. Lo investigaré y comentaré algo sobre el tema en próximos posts.

Sigo manteniendo los Serial.println porque aunque no servirán de nada en el montaje final, viene muy bien para depurar.

 

 

************************************************************

Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *