¿Cómo hacer que el robot se mueva con precisión? Descripción y características de Studuino Platform Robotics

imagen

Se le pidió a la organización en la que trabajo que realizara un pequeño seminario web de robótica para el Salón Internacional de Educación de Moscú 2020, que se realizó en un formato en línea. El tema de la presentación me quedó abierto y me dieron un conjunto educativo sobre robótica. Así que me familiaricé con los productos de la corporación japonesa ArTeC (esto no es publicidad y no soy un empleado de ArTeC, es solo mi experiencia personal al comunicarme con sus productos). Después del seminario web, decidí escribir este artículo, ya que en Rusia los kits de Lego Education eran bastante populares, y esta fue la primera vez que me encontré con este diseñador japonés.

El artículo está dividido en dos partes. La primera parte será útil para aquellos que eligen un kit para robótica educativa. En la segunda parte, examiné el uso de un kit para resolver un problema aplicado que puede ocurrir en la vida.

Entonces, si alguien está interesado en qué tipo de kit robótico es y qué se puede hacer con él, le pido un gato. ¡Entonces vamos!

Como base de construcción, el diseñador usa solo unas pocas partes básicas a partir de las cuales puede ensamblar estructuras bastante complejas.

Bloques base de ArTeC Designer
ArTeC Designer Bloques base

imagen
Modelos de ejemplo de piezas de diseñador

Debido a las características específicas de las piezas: el orden escalonado de los agujeros y las espigas para la conexión, no siempre es rápido encontrar la combinación correcta de piezas para lograr el resultado. De las ventajas, a diferencia de Lego: todas las partes son lo suficientemente grandes, perdiendo mucho más difícil. La segunda ventaja es que no tiene que hurgar en busca de la parte necesaria durante mucho tiempo, porque solo hay 5-6 piezas de piezas básicas (la diferencia en el color de las piezas no cuenta). Hay una desventaja: siempre que las partes sean completamente nuevas, su separación a veces se convierte en un tormento, por lo que se aferran fuertemente entre sí. Para ayudar a desengancharlos, viene una herramienta especial que está en el kit.

Además de los bloques básicos en el conjunto, hay un par de variedades de ruedas y engranajes, así como una cremallera.

Ahora sobre lo que se incluye en la parte electrónica de este kit robótico. El sitio web japonés tiene una cantidad bastante grande de diferentes sensores y módulos. Por supuesto, tenía muchos menos, pero los que ya tenían un cierto margen para la creatividad.

Para el llenado de la unidad de control principal, los japoneses hicieron su versión de la placa Arduino, finalizándola, y la llamaron Studuino. Le agregaron un controlador de control de motor de CC y trajeron una línea para conectores de 3 pines (BLS-3 estándar, estos se colocan en servos). En cada uno de estos conectores hay alimentación: más y menos, así como uno de los pines de la placa Arduino. Todos los conectores están firmados, por lo que es difícil cometer un error al conectarse a ellos.

Plataforma Studuino
Plataforma Studuino

Para compatibilidad con escudos Arduino estándar en lugares estándar, hay conectores similares a Arduino.

La principal diferencia con la placa Arduino es que el voltaje del controlador es 3.3V. Esto se explica por el hecho de que el módulo de control central recibe alimentación a través del compartimento de la batería suministrado para 3 baterías AA (4,5 V en total). La batería, desafortunadamente, no se proporciona, ni siquiera se puede comprar en el sitio web del fabricante como una opción adicional.

El tablero está ubicado en una caja de plástico, a la que puede unir las partes base del diseñador y otros elementos.

Unidad Central ArTeC
Unidad Central ArTeC

Como actuadores, el fabricante ofrece dos motores de CC con cajas de engranajes y hasta 8 servoaccionamientos de su propio diseño (su número puede variar según la configuración del kit). Los motores están conectados a través de conectores especiales que se encuentran en la placa.

Motores de corriente continua con engranajes y su conexión
Motores de CC con cajas de engranajes y su conexión

Es posible ensamblar con bastante facilidad y rapidez la construcción más simple que se le viene a la mente: una máquina robot con dos motores, que controla y puede hacer que se mueva en la dirección correcta.

Máquina robot simple con dos motores de corriente continua.
Máquina robot simple con dos motores de corriente continua.

Los motores se controlan configurando los estados lógicos de los terminales D2, D4, D3 para el motor, que está conectado a los conectores M1 y D7, D8, D5 para el motor conectado al conector M2 en la placa Studuino. Es a estas conclusiones que los desarrolladores de la placa Studuino conectaron en paralelo un chip controlador de motor. Usar estas conclusiones conectando su circuito allí, y al mismo tiempo usando los motores al mismo tiempo, fallará.

Considere cómo controlar un motor que está conectado al conector M1. Al establecer un estado lógico diferente de los terminales D2 y D4, es posible lograr la rotación del motor en la dirección deseada. Por ejemplo: con D2 - 1 y D4 - 0, el motor gira en sentido horario, y si D2 - 0 y D4 - 1, entonces el motor gira en sentido antihorario. También es necesario establecer la velocidad de rotación del motor configurando el valor PWM en el pin D3; puede estar en el rango de 0 a 255. Si el valor es 0, el motor no rotará, y si el valor es 255, obtendremos la velocidad máxima de rotación. El controlador del motor también permite un cambio instantáneo en la dirección de rotación del motor y admite el modo de frenado del motor. Para desacelerar el motor, se debe establecer el mismo estado lógico igual a 1 en los terminales D2 y D4.

Por cierto, no hay pines D3 y D5 en los conectores que tienen 3 pines (GND, VCC, SIG) en la placa Studuino, pero están en el conector Arduino estándar, que los desarrolladores dejaron para mantener la compatibilidad de la plataforma.

Del mismo modo, el motor está controlado, que está conectado al conector M2. Para él, la dirección de rotación se especifica a través del estado de los terminales D7 y D8, y la velocidad de rotación por el terminal D5.

El programa más simple que escribí hizo que la máquina robot se moviera así:


Los servos se pueden conectar a los conectores que están resaltados en rojo en la placa: D2, D4, D7, D8, D9, D10, D11, D12.

Conexión de servo
Conexión de servoaccionamientos

Es en estos pines donde el microcontrolador AtMega168 tiene un PWM, que es necesario para controlar los servoaccionamientos. Si conecta el número máximo de servos, puede obtener un diseño interesante. En aras de la demostración, armé un simple análogo de un robot andante e intenté programarlo un poco. El resultado se puede ver en el video:


Lo único que debe recordar es que si planea usar tanto motores de CC como servos al mismo tiempo, entonces no puede usar 2 motores de CC y 8 ​​servos al mismo tiempo, ya que tienen salidas comunes controladas por el microcontrolador. Puede realizar las siguientes configuraciones: 2 motores de CC + 4 servos, 1 motor de CC + 6 servos o use solo 8 servos.

En cualquier kit robótico, además de los actuadores, debe haber sensores que sean los "ojos" y "oídos" de cualquier robot. Ellos también están aquí. En mi set había los siguientes sensores: un sensor de luz, un sensor de sonido, un sensor de aceleración, dos sensores IR, un sensor táctil, así como LED (verde, rojo, azul, blanco) y un piezodinámico.

Sensores en un conjunto
Sensores en un conjunto

Los sensores se conectan a la unidad central utilizando los cables que vienen con el kit. Para fijar los sensores en el modelo de robot en las carcasas, tienen puntas con las que se pueden unir a la estructura. Reuní y programé un par de diseños simples para observar el funcionamiento de los sensores.

Así es como funciona el sensor táctil:


Y así es como funciona el sensor de luz:


Si no hay suficientes sensores estándar en el conjunto y desea expandir su funcionalidad, puede usar fácilmente la placa de prueba sin soldadura y conectar los circuitos allí, como en una placa Arduino estándar.

Características mejoradas de reclutamiento
Marcación mejorada

El siguiente punto importante para cualquier kit robótico es la disponibilidad de un entorno de programación conveniente. Aquí, el fabricante ofrece tres opciones de programación diferentes.

Nivel de entrada: diseñado para los usuarios más pequeños, aquellos que aún no saben leer, pero que ya están dando sus primeros pasos en el mundo adulto de la robótica. Para ellos, se ofrece el entorno de programación más simple: el pictograma.

Programación de iconos
Programación de iconos

Aquí puede extraer pictogramas con acciones básicas en el programa (avanzar, encender, encender el LED, etc.) y configurar sus parámetros básicos.

Cuando se domina este nivel o sus capacidades se vuelven insuficientes para resolver las tareas, puede ir al siguiente paso y comenzar a usar el entorno de programación Scratch para la plataforma Studuino.

Programación Scratch para Studuino
Programación de scratch para Studuino

Ya hay más opciones de programación: puede usar variables y matrices, expresiones lógicas y aritméticas, subrutinas, así como configurar de manera más flexible varios bloques para su ejecución.

Cuando estas capacidades no son suficientes, puede continuar con la programación en Arduino IDE y obtener el control total sobre todas las capacidades de hardware de la plataforma Studuino. Para usar la placa Studuino en el IDE de Arduino, debe configurar el entorno de acuerdo con las instrucciones del sitio web del fabricante (para que el entorno vea la plataforma Studuino en la lista de placas compatibles).

Completo con software de programación, el fabricante da un conjunto de instrucciones para ensamblar diferentes modelos y programarlos. El software en sí está disponible de forma gratuita en el sitio web del fabricante.

Ahora intentemos resolver un pequeño problema práctico usando este conjunto.

Imagine que tenemos un robot que debe moverse hacia adelante y hacia atrás en el almacén y debemos detenerlo en los lugares indicados. Si el robot no está controlado, ocurrirá un accidente. Un ejemplo de tal accidente se muestra aquí:


Se puede mover el robot hacia adelante y hacia atrás usando motores de CC o servos. Los servodriveres resuelven el problema de cómo detener el robot en el lugar correcto (puede establecer con precisión el ángulo de rotación del servo). Esta solución tiene una limitación (usaremos un servo de un conjunto con una rueda fija en él): los servos no pueden rotar en un ángulo de más de 180 grados y, por lo tanto, el movimiento de nuestro robot se limitará a la mitad de la longitud de la revolución de la rueda en el servo, pero generalmente desea más.

Utilizaremos un motor de CC con un reductor del conjunto para avanzar y retroceder. Estos motores no tienen retroalimentación. Después de arrancar el motor, no podemos decir qué tan lejos viajó el robot. Puede detectar el tiempo durante el cual el robot recorre la distancia requerida durante el funcionamiento del motor y utilizar estos retrasos en el programa para detener el robot en el lugar correcto. Este método tiene un inconveniente importante: la velocidad del motor depende del voltaje que se le suministra y del esfuerzo requerido. Dado que las baterías se usan en el robot, que después de un tiempo se descargarán ligeramente y su voltaje disminuirá, al mismo tiempo el robot comenzará a recorrer una distancia más corta y será necesario seleccionar el tiempo nuevamente.

La opción más simple que puede usar es un robot, al pasar el punto deseado, toca el sensor táctil, que será una señal de parada en el lugar correcto.

Hice cambios en mi diseño agregando sensores táctiles en el robot y coloqué elementos a lo largo de la ruta del robot para que el robot los tocara con sensores táctiles cuando se movía.


El video muestra que el robot llega al final del "almacén" y toca la "pared" con el sensor, luego vuelve a la "pared" opuesta del almacén y allí también toca. Después de eso, el proceso se repite. Por lo tanto, hay dos puntos que el robot "sabe" con certeza: estos son los puntos cuando se activa el sensor táctil.

Programa de scratch touch para Studuino
Un programa con sensores táctiles en el lenguaje Scratch para Studuino

A veces, esto es suficiente para resolver la tarea. ¡Pero queremos más!

Hice cambios en el diseño y el programa del robot y esto es lo que obtuve:


Consideremos con más detalle qué tanto más decidí exigirle al robot. Decidí que dos puntos de interrupción no son suficientes para mí y quiero más. Para esto, utilicé un sensor IR, que está incluido en el kit. Lo fijé en una plataforma en movimiento, y debajo arreglé una tira de papel con líneas negras dibujadas previamente por el marcador, en la que el robot tendría que detenerse. También eliminé uno de los sensores táctiles del robot (en el lado derecho).

Robot IR
Robot con sensor IR

Como resultado, obtuve un diagrama clásico del dispositivo de uno de los ejes de una impresora 3D o una máquina CNC. Cuando se enciende, la impresora no sabe dónde está y se dirige hacia un lado (hasta que es tocada por el interruptor de límite), y luego considera este punto a cero y comienza a contar su posición en este eje.

En este diseño, la cuenta regresiva ocurre en rayas negras sobre papel. El número de estas bandas se conoce de antemano, por lo que cuando llegue a la última banda, puede volver al punto de referencia cero. El programa Scratch para Studuino se presenta a continuación.

Programa Scratch IR Robot para Studuino
Programa Scratch IR Robot para Studuino

Si observa cuidadosamente el programa, puede ver valores incomprensibles de 40 y 50, con los cuales se compara el valor del sensor IR. Para comprender estos números, debe recordar un poco sobre qué señales se pueden leer desde diferentes sensores. Hay sensores digitales y analógicos. Los sensores digitales tienen un número fijo de posiciones y se mueven de una posición a otra bruscamente y sin valores intermedios. Mayormente utilizados sensores con dos posiciones. Los sensores táctiles son el ejemplo más llamativo de un sensor digital: hasta que se presiona el sensor, da un valor lógico de 1, y cuando se presiona, un valor lógico de 0 (en este constructor y con estos sensores este es el esquema, pero hay esquemas donde se hace al revés: presionado - 1, no presionado - 0).Los sensores analógicos describen una relación inextricable entre la señal y el voltaje o la corriente en la salida y no tienen valores fijos. El sensor IR emite una señal de luz analógica, que puede depender de varios factores, como la luz ambiental, el voltaje de la batería e incluso la temperatura ambiente.

La señal analógica se convierte linealmente en un número, para Scratch for Studuino, en el rango de 0 a 100. Esto se hace para simplificar el trabajo con ellos a los usuarios finales (este entorno de programación se desarrolló por primera vez para enseñar a los niños). En el IDE de Arduino, se emite un rango "honesto" de valores de 0 a 1023, que corresponde al convertidor ADC de 10 bits que está presente en el controlador Atmega168. Si observa las diferencias en los gráficos entre la señal digital y la analógica, queda claro por qué la señal analógica es un rango de valores.

Señal analógica (izquierda) y digital (derecha)
Señal analógica (izquierda) y digital (derecha) El

sensor infrarrojo, que se utiliza para determinar la línea de etiqueta negra, funciona según el principio de capturar la señal reflejada. Se pueden ver claramente dos elementos en la figura: LED IR y fotodetector IR.

Sensor de infrarrojos
Sensor IR

Si coloca un obstáculo frente al sensor desde el cual se reflejarán los rayos IR, cuanto mejor se reflejen desde el obstáculo (dependiendo de la distancia al obstáculo o el tipo de obstáculo), más serán recogidos por el fotodetector IR y el sensor regresará más. valor para el usuario durante su encuesta.

Los números 40 y 50 se seleccionan empíricamente. En mi caso, el sensor mostró, estando por encima de una superficie blanca, valores de aproximadamente 65-75. Sobre la superficie negra, el sensor devolvió valores en el rango de 18-25. El número 40 es el momento en que el sensor comienza a cambiar de una superficie blanca a negra, y el número 50 es el momento de transición de una superficie negra a blanca. Estas cifras se toman con un pequeño margen para bloquear el error en la medición del sensor. Al desarrollar un diseño real, es necesario tener en cuenta las condiciones bajo las cuales el sensor tomará lecturas (iluminación externa, la ubicación del sensor, etc.), porque todos estos factores afectarán las lecturas del sensor. Es posible que deba desarrollar un algoritmo para ajustar constantemente estos valores según las condiciones externas.

Resumiré un pequeño resultado. Se consideraron dos posibles soluciones al problema de mover el robot por el almacén. Ambas opciones requerían "etiquetas" externas adicionales, que guiaban al robot. ¿Hay alguna manera de prescindir de ellos? Para que el robot, por ejemplo, sepa a qué ángulo ha girado el eje del motor y, según el valor del ángulo, ha decidido detenerse o seguir adelante. Hay una solución simple a este problema: el uso de un motor con un codificador (sensor de ángulo).

El conjunto tiene motores de CC con engranaje, pero no tienen un codificador. Se me ocurrió la idea: ¿tal vez podría intentar hacer un codificador simple a partir de las partes del diseñador, especialmente porque los engranajes del conjunto tienen un módulo bastante grande (tamaño de diente)?

Los elementos principales del codificador.
Los elementos principales del codificador.

El principal problema era elegir la ubicación y fijar el sensor IR para que se cruza con el diente del engranaje cuando gira. Como resultado, obtuve un diseño de prueba, que se muestra en la figura a continuación.

Modelo de prueba de codificador
Modelo de prueba del codificador

Como puede ver en la imagen de arriba, el sensor IR está fijo para que el engranaje cruce su área de medición de trabajo con sus dientes durante la rotación. Enfrente (en el otro lado del engranaje) del sensor IR, adicionalmente coloqué un obstáculo trabajando en la reflexión de los rayos infrarrojos para obtener datos más correctos del sensor. Cuando el engranaje gira y el sensor IR mide la reflexión de la señal, habrá valores grandes cuando haya un diente delante del sensor y valores más pequeños cuando haya un "agujero" entre los dientes del engranaje.

El programa para trabajar con el codificador se desarrolla en Arduino IDE. Para probar la eficacia de mi idea, escribí un programa simple que hacía que el motor girara a una velocidad constante y emitía continuamente valores desde el sensor IR a la consola de depuración.

Texto del programa
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

void setup() {
  Serial.begin(9600);       //      
  pinMode(M1_A, OUTPUT);    //       " "
  pinMode(M1_B, OUTPUT);    
  analogWrite(M1_PWM, 100); //    
  digitalWrite(M1_A, HIGH); //    
  for (int i=0; i < 2000; i++) {    //   2000    -
    Serial.println(analogRead(SENSOR_PIN));   //      
  }
  digitalWrite(M1_A, LOW);  //   
}

void loop() {
}


De acuerdo con los datos que el programa mostraba en la consola, obtuve el siguiente gráfico:

Gráfico de los valores del sensor IR durante la rotación del engranaje
Gráfico de cambios en los valores del sensor IR durante la rotación del engranaje

La naturaleza del gráfico se asemeja a la forma de los dientes de un engranaje, lo que sugiere que, de hecho, dichos datos pueden usarse para controlar la rotación del motor utilizando el engranaje del conjunto del diseñador como un disco codificador. Para eliminar la histéresis de "rebote", se implementa de la siguiente manera (símbolos en el gráfico): MEDIO es el valor promedio entre los valores máximo y mínimo de las lecturas del sensor IR, ANCHO es la desviación de MEDIO a un valor mayor o menor para crear una cierta "banda de error" »Mediciones de señal (el ancho total de esta banda es 2 * ANCHO). MEDIO y ANCHO se utilizarán en el algoritmo de control de rotación del motor. El algoritmo para contar los dientes en el engranaje durante la rotación del motor se puede representar de la siguiente manera:

Algoritmo para contar dientes en el engranaje durante la rotación del motor
Algoritmo para contar dientes en el engranaje durante la rotación del motor.

El algoritmo utiliza la siguiente notación:

  • prev_state - estado del engranaje anterior;
  • cur_state - estado actual del engranaje;
  • cuenta - el número de dientes del engranaje contados;
  • tmp : lecturas del sensor IR.

El principio de contar los dientes del engranaje en este algoritmo se basa en la lectura constante de las lecturas del sensor IR y el cambio en el valor de la variable cur_state cuando el nivel de señal pasa por la línea superior o inferior de la "banda de error". Si el valor supera el límite superior, entonces la variable cur_state se vuelve igual a 1, lo que significa un diente de engranaje, y cuando se va más allá del límite inferior, la variable cur_state se vuelve igual a 0, lo que significa una falla entre los dientes de engranaje. La adición de la variable de conteo ocurre solo cuando cambia el estado de la variable cur_state.

A continuación se presenta un programa que usa este algoritmo. En él, describí una subrutina que espera hasta que el motor gira el engranaje por un número predeterminado de dientes y luego transfiere el control al programa principal.

Texto del programa
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

#define MIDDLE      550     //         
                            // ""
#define WIDTH       50      //      ,   
      //    -     
      // 

int enc_tooth = 0;          // ,    
int cur_state = 0;          //   :  (1)  "" (0)
int prev_state = 0;         //   
int tmp;                    //      

void init_enc() {
  enc_tooth = 0;
  cur_state = 0;
  prev_state = 0;

  //         cur_state
  //    ,   = 1,    ""      
  //   0      
  if (analogRead(SENSOR_PIN)>MIDDLE) {
    prev_state = 1;
    cur_state = 1;
    enc_tooth++;
  }  
}

void wait_by_count(int count) {
  //       count,       IR 
  //           ""
  while (enc_tooth <= count) {
    //    IR-    
    tmp = analogRead(SENSOR_PIN);

    //       +  ,    
    if ((tmp + WIDTH) > MIDDLE) {
      cur_state = 1;
    } else {
    //       -  ,    ""
      if ((tmp - WIDTH) < MIDDLE) {
        cur_state = 0;
      }
    }

    //       ,      
    // ,     ""   -  ""  
    if (cur_state != prev_state) {
    //   ,   0  - ,     
    // 
      enc_tooth += cur_state;
    
    //        
      prev_state = cur_state;
    }
  }
}

void setup() {
  //        
  Serial.begin(115200);

  //        ""
  pinMode(M1_A, OUTPUT);
  pinMode(M1_B, OUTPUT);

  //   
  init_enc();

  //    
  analogWrite(M1_PWM, 100);
 
  //    ,      1 (    
  //  0)
  digitalWrite(M1_A, 1);

  // ,    30  
  wait_by_count(30);
  
  //   
  digitalWrite(M1_B, 1);

  Serial.print("  = ");
  Serial.println(enc_tooth);

}

void loop() {
}


El programa arranca el motor y espera hasta que el engranaje gire 30 dientes, tal cantidad de dientes en el engranaje, y luego detiene el motor. A continuación se muestra un video que muestra el funcionamiento del programa:


En un trozo de papel blanco, que está pegado al engranaje, puede seguir su rotación en 360 grados.

Sobre esto quiero terminar este artículo. En conclusión, puedo decir que no me detuve en el modelo de codificador. Se ensambló una plataforma robótica completa con dos motores y dos codificadores (uno para cada rueda) y se realizó un programa para sincronizar la rotación de la rueda según los codificadores, pero este es un tema para otro artículo ... Una

Plataforma robot con codificadores basados ​​en sensores IR
plataforma robot con codificadores basados ​​en sensores IR

Como diseñador educativo en robótica, esta es una buena opción para aquellos niños (bueno, adultos) que desean unirse a tales clases, especialmente porque el fabricante hizo todo lo posible para maximizar el rango de edad de aquellos que pueden usar este producto (la presencia de diferentes entornos de programación) ) Puede comenzar con los elementos más simples y elementales, y después de obtener conocimientos básicos, pasar a otro nivel de desarrollo de robótica y electrónica.

All Articles