Curso Arduino y robótica: Servomotores – Movimiento senoidal

En esta sesión vamos a crear un movimiento muy particular para nuestros servomotores.

Este tutorial nace de una idea basada en la librería Oscillator, creada por el maestro maker Obijuan, y que extiende el concepto de movimiento senoidal aplicado a servomotores para aplicar a modelos de robot bípedos y otros modelos de robot reptantes.

La ciencia de una onda

Una onda se define como la propagación de una perturbación en el espacio.

Lo que tenemos que saber es que estos movimientos periódicos se representan como aparece en la figura y se describen por los siguientes parámetros:

 

Periodo

El periodo define cuan rápido es una onda en volver al estado en el que se encontraba al empezar. Como es una función periódica, este movimiento será más lento cuento más alto es el periodo y viceversa.

Amplitud de una onda

La amplitud de una onda es el intervalo máximo de desplazamiento. Aplicado a un motor se traduce en los límites máximo y mínimo que puede moverse.

Desfase de una onda

El desfase entre dos ondas es el desplazamiento que existe de una con otra. Las fases se pueden medir desde una referencia que será el cero. La diferencia entre las dos fases de dos ondas, será el desfase relativo.

Si lo aplicamos a dos motores, podemos decir que el movimiento de uno empiece a 30º, mientras que otro puede empezar a 120º.Por lo que el desfase entre los motores será de 90º.

 

 

Programacion senoidal

Nuestro objetivo es aplicar lo que hemos aprendido hasta ahora para simular el movimiento ondulatorio a nuestros servomotores. De esta manera observaremos las posibilidades de aplicar un modo de

 

Por un lado, vamos a utilizar

#include "Arduino.h"

int A;
int T;
int O;
int position;

void setup() {
  Serial.begin(9600);

  A = (int)(100);
  T = (int)(1000);
  O = (int)(0);
  position = (int)(0);

}

void loop() {
  position = A * sin((((2 * M_PI) / T) * millis()) );
  Serial.println(position);

}

 

Como podremos ver en la imagen , la onda se propaga en la amplitud definida, y aunque el periodo no se identifica con el tiempo definido en el eje horizontal, al aplicar una variable de tiempo en una función el resultado es el deseado.

*El eje horizontal no representa el tiempo que transcurre.

Aún así vamos a mejorar un poco el programa, ya que como dijimos en un tutorial anterior sobre los eventos temporales aplicados en un bucle, la ejecución de demasiadas instrucciones en el bucle no es necesario, así que le vamos a definir un espacio de tiempo para que nuestro servomotor se mueva de forma oscilatoria. Nosotros ejecutaremos la acción cada 50 ms.

Una vez realizado este paso, vamos a mover el servomotor. Pero antes, hemos de recordar los límites en los que se mueve nuestro servomotor y los límites de la función. Es por este motivo que vamos a utilizar la función map.

#include <Servo.h>

int A;
int T;
int O;
int position;
unsigned long auxtimer;

Servo motor;

void setup() {
  Serial.begin(9600);

  motor.attach(11);
  A = (int)(100);
  T = (int)(3000);
  O = (int)(100);
  position = (int)(0);

}

void loop() {
  if( millis() - auxtimer > 50){
    auxtimer = millis();
    position = A * sin((((2 * M_PI) / T) * millis() + O ) );
    position = (map(position,-1 * A, A, 90 - A/2 , (90 + A/2)));
    Serial.println(position);
    motor.write(position);

  };

}

Una vez realizado esta pequeña utilidad, no vamos a extendernos más, pero una de las aplicaciones es usar varios motores sincronizados para generar movimientos de lo más entretenidos.
De todas formas, en el siguiente apartado explicamos un poco , cómo podemos descargarnos y utilizar la librería Oscillator y reaprovechar este modelo de funcionamiento.

Aplicaciones de la librería Oscillator

Oscillator es una librería que proporciona un sistema de locomoción mediante ondas periódicas que nace de ArduSnake;  en la que varios motores se pueden sincronizar con un periodo y una amplitud definida.

Desde el siguiente enlace podemos acceder al repositorio Github de Obijuan para descargarnos la librería.

Esta librería es la que se utiliza para poner en funcionamiento el robot OttoZowi; sobre 4 servomotores nos  proporciona una extensión hacer que nuestros robots anden.

Para este apartado, serán necesarios los archivos Oscillator.h y Oscillator.cpp para integrar la librería dentro del IDE de Arduino y poder realizar nuestras primeras pruebas.

Para instalar una librería Arduino no oficial, en el siguiente tutorial explicamos cómo realizar los pasos para incluir librerías externas.

Tendremos una clase definida como Oscillator. Esta clase es la que escribiremos para instanciar un objeto, al igual que definíamos Servo; y proporcionar una dinámica a modo de onda para nuestros motores.

De la misma manera que la librería Servo, se pueden asociar motores al objeto con la función attach.

Para establecer los valores de periodo, amplitud y fase se deben utilizar las funciones.

  • SetT() -> Set T(Period)
  • SetA() -> Set Amplittude
  • SetO() -> Set Offset – Nos permitirá definir la diferencia de movimiento entre un servomotor y otro.

 


#include <Servo.h>
#include <Oscillator.h>

const unsigned char CMD_STOP = 'S'; //-- Stop the oscilaltor
const unsigned char CMD_PLAY = 'P'; //-- Play the oscillator

Oscillator osc;

void setup()
{
//-- Configure the serial comunication with PC
Serial.begin(9600);

//-- Attach the oscillator to servo
osc.attach(10);
osc.SetT(1000);
osc.SetA(100);
osc.SetO(40);
}

//-- Incoming byte from the PC
unsigned char serialdata;

void loop()
{

osc.refresh();
  if (Serial.available()) {

    //-- Read the byte and modify the oscillator state
    //-- acording to the command received
    serialdata= Serial.read();
    switch(serialdata){
      case CMD_STOP:     //-- Stop command
        osc.Stop();
        break;
      case CMD_PLAY:     //-- Play command
        osc.Play();
        break;
    }
  }
}

 


Una vez completado este tutorial, puedes acceder al siguiente nivel.

 

Los ejercicios de código, proyectos y recursos que desarrollaremos durante el curso se pueden consultar a través de nuestro Github.

Documentacion ZaragozaMakerSpace Github

 

 

Deja un comentario

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

3 + diecinueve =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.