{"id":1795,"date":"2020-05-26T17:52:56","date_gmt":"2020-05-26T17:52:56","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=1795"},"modified":"2020-11-02T00:50:37","modified_gmt":"2020-11-02T00:50:37","slug":"manejo-preciso-de-servos-en-arduino-grados-y-milisegundos","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/manejo-preciso-de-servos-en-arduino-grados-y-milisegundos\/","title":{"rendered":"Manejo preciso de servos en Arduino: grados y milisegundos"},"content":{"rendered":"
Siendo miembro de grupos donde uno se entera de diversos problemas que se les presentaron a otros, a veces uno que resulta b\u00e1sico pero nunca se le ha presentado. En este caso se trat\u00f3 de un problema con el manejo de un servo que es el m\u00e1s vendido para los que se inician, y que a dem\u00e1s viene con los kits b\u00e1sicos de Arduino: el mini o micro servo SG90<\/a><\/strong>. El problema se presenta con la biblioteca Servo<\/strong>, pero tambi\u00e9n puede ocurrir con otro programa. Una se\u00f1al se comprueba con osciloscopio. Por suerte dispongo tanto de uno antiguo, con pantalla CRT, como de los que se pueden comprar ahora dentro de la familia Arduino, dotado de un pantalla TFT.<\/p>\n Despu\u00e9s de algunas mediciones, me di cuenta de que el funcionamiento de la biblioteca Servo.h<\/strong> de Arduino deja un poco que desear, ya veremos por qu\u00e9. Pero tambi\u00e9n ofrece una herramienta (en la funci\u00f3n servo.attach<\/strong>) que, bueno, puede ser que no hayamos investigado y que por algo est\u00e1 disponible. Esto puede parecer algo para principiantes, pero hasta que uno empieza a tener estas complicaciones no se da cuenta, y luego de tener una comprensi\u00f3n mejor se logra usar la biblioteca de servo de Arduino con facilidad y dominando lo que hace.<\/p>\n Funci\u00f3n write()<\/strong><\/p>\n La raz\u00f3n de ser de una biblioteca es que uno se pueda desentender del manejo de programa espec\u00edfico de un elemento conectado a una placa de microcontrolador, y bueno, la biblioteca Servo<\/a><\/strong> de Arduino fue hecha para facilitar el control de los servos con un m\u00ednimo de c\u00f3digo y complicaciones. La p\u00e1gina de referencia de Arduino para el comando write()<\/a><\/strong>, que es parte de la biblioteca Servo.h<\/strong>, trae el siguiente c\u00f3digo de ejemplo:<\/p>\n Este c\u00f3digo de ejemplo le indica a un servo, conectado en este caso al pin 9, que se mueva a su posici\u00f3n central (que se define como 90\u00b0). Si se tratara de un servo de rotaci\u00f3n continua, esto detendr\u00e1 el movimiento del servo\u2026 pero este es tema para otro art\u00edculo.<\/p>\n Al correr este peque\u00f1o programa de demostraci\u00f3n, los servos que se han conectado a ese pin se colocar\u00e1n en sus posiciones centrales. Pero bueno, si lo consideramos desde la faceta mec\u00e1nica, este punto medio puede que en algunos servos no sea exactamente el centro del arco completo del recorrido.
\n<\/a>
\nMe dije \u2014ya que he manejado servos desde antes de que apareciera Arduino\u2014 que el problema deb\u00eda ser una se\u00f1al de posicionamiento incorrecta. Para entender bien de qu\u00e9 hablo, le pueden dar una mirada al art\u00edculo Servos: caracter\u00edsticas b\u00e1sicas<\/a><\/strong>.<\/p>\n#include <Servo.h>\r\n\r\nServo myservo;\r\n\r\nvoid setup() \r\n{ \r\n myservo.attach(9);\r\n myservo.write(90); \/\/ set servo to mid-point (colocar el servo en el punto medio)\r\n} \r\n\r\nvoid loop() {}\r\n<\/pre>\n
\n<\/a>
\nUn pulso con un ancho de 1.500 microsegundos debe corresponder a 90\u00b0, posici\u00f3n definida como el punto central del recorrido. Los servos m\u00e1s comunes aceptan entradas de 1.000 \u00b5s (1 ms) a 2.000 \u00b5s (2 ms), y 1.500 \u00b5s (1,5 ms) correspondientes a la posici\u00f3n central. Para un servo con un recorrido de 0 a 180\u00b0, esto ser\u00eda 90\u00b0.
\n
\n