Arduino, Rasperry y algo más

Categoría: Software

El «Hola mundo» de mi brazo robótico

Conseguido el primer hito de este proyecto. He conseguido que el brazo responda a la acción de cuatro potenciómetros a través de un arduino. No tiene nada especial, ha sido casi un corta y pega de los ejemplos de la librería «servo» de arduino.

El esquema del montaje que he realizado es este:

No tiene ningún misterio. Los servos están controlados por salidas pwm y los potenciómetros son leídos por pines analógicos. He usado la alimentación del arduino por que no van a funcionar nunca dos servos a la vez.

Antes de empezar con el código, un consejo sobre el montaje: aseguraros de que montáis los servos de tal forma que coincida uno de sus topes de giro con los topes físicos del robot. Si se hace mal toca recolocar todo el servo para lo que suele hacer falta desmontar medio robot.

El código que he usado es este:

servo#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

float angulo1=90.0;
float angulo2=90.0;
float angulo3=90.0;
float angulo4=90.0;
float poten1;
float poten2;
float poten3;
float poten4;

void setup() {
    
    servo1.attach(9); // Base
    servo2.attach(10); // Brazo 1
    servo3.attach(11); // Brazo 2
    servo4.attach(12); // Pinza
    set_servo();
}

void loop() {
    poten1 = analogRead(A0); // Base
    poten2 = analogRead(A1); // Brazo 1
    poten3 = analogRead(A2); //Brazo 2
    poten4 = analogRead(A3); // Pinza

    angulo1 = map(poten1, 0, 1023, 0, 180);
    if(angulo1 >= 180){
        angulo1 = 180;
    }else if(angulo1 <= 0){
        angulo1 = 0;
    }

    angulo2 = map(poten2, 0, 1023, 0, 180);
    if(angulo2 >= 180){
        angulo2 = 180;
    }else if(angulo2 <= 0){
        angulo2 = 0;
    }

    angulo3 = map(poten3, 0, 1023, 0, 180);
    if(angulo3 >= 180){
        angulo3 = 180;
    }else if(angulo3 <= 0){
        angulo3 = 0;
    }
    
    angulo4 = map(poten4, 0, 1023, 0, 180);
    if(angulo4 >= 180){
        angulo4 = 180;
    }else if(angulo4 <= 0){
        angulo4 = 0;
    }

    set_servo();
}

void set_servo(){
    servo1.write(angulo1);
    servo2.write(angulo2);
    servo3.write(angulo3);
    servo4.write(angulo4);
}

El código es sumamente sencillo. Una vez definidos los pines, solo nos queda leer la posición de los potenciómetros, mapear su resultado del rango 0 – 1024 a 0 – 180 (180 son los grados de movimiento de los servos que yo he usado) y llevar los servos a la posición indicada.

En este punto podemos reducir el ángulo de giro de los servos. Por ejemplo, la pinza no usa el giro completo del servo. Podemos recolocar el servo para que la pinza use, un rango medio del giro del servo (de 15º a 105º). Lo conseguimos mapeando la lectura del potenciómetro en el rango de 10º a 105º, logrando poder ejercer presión (a costa de vida útil del servo) manteniendo su apertura.

Y eso es todo. El brazo se muevo como esperaba. Podría haber usado un control mas adecuado, con botones o un par de joysticks, pero el objetivo final es manejarlo desde un ordenador.

Como usar dos LCD con un arduino (I)

En el foro español de Arduino hubo un compañero que me dijo, con razón, que con una sola pantalla de 2×16 la información que puedo mostrar es limitada. Pero no quiero subir mucho el presupuesto ni tengo mas pines libres, y dandole vueltas al asunto se me ocurrió que sería  estupendo poder poner una pantalla por cada corredor. No son muy caras (menos de 10 euros), pero no tengo tantos pines libres.

La cuestión de los pines libres me tenia totalmente atascado, hasta que di con la solución: usar puertas lógicas y un pin de control. Os pongo un esquema (escaneado, no he sido capaz de hacer con KiCad y paso de hacerlo con un programa de dibujo):

Gestor de Carreras 1.0. Código comentado

Me encanta enseñar el código que escribo. ¿Por que?. En parte por un poco de orgullo. Pero también para que los demás puedan mostrarme mis errores o como puedo optimizar el rendimiento de lo que he escrito y para que los pocos que saben menos que yo tengan un algo que copiar, tal y como hago muchas veces. Creo que esa es una parte esencial del software libre, la reutilización de porciones de código así, por ejemplo, cuando he necesitado escribir en la LCD no he creado la librería, he utilizado una de código libre.

Gestor de Carreras 1.0 Primera versión definitiva.

Esta es la primera versión totalmente funcional del Gestor de Carreras de  Arduslot. Está basada en el hardware publicado en la anterior entrada. Sus características son:

  • Soporte para dos corredores.
  • Pantalla LCD retroiluminada (variable, pero se puede dejar fija con una resistencia normal o anaular) de 16×2 caracteres.
  • Necesita una sistema de detección de paso en la pista que sustituya a los botones «Corredor 1» y «Corredor 2». Yo he usado la pista de SuperSlot  (Scalextric fuera de España) y la de Scalextric (o SCX fuera de España). Se puede conectar poniendo un conector jack con lo que el uso de la pista de SCX es inmediato. Mas adelante presentare un sistema propio basado en fotodiodos.
  • Semáforo de 4 luces, tipo fórmula 1.
  • Altavoz con volumen regulable (se puede sustituir por un zumbador y/o dejar el volumen fijo con una resistencia normal)
  • Permite realizar tres tipos de carreras:
    1. Carrera a Número de Vueltas: Gana el primer corredor que da el número de vuelta determinado al principio.
    2. Carrera de resistencia: Es una carrera de una duración determinada en la que gana el que de más vueltas en un tiempo definido al principio, en horas (0 a 24)  y minutos (0 a 59).
    3. Entrenamientos. Sin límites. La carrera se acaba cuando se pulsa un botón.
  • En todos los tipos de carreras se guarda, para cada corredor el tiempo y el número de la vuelta rápida.

DESCARGA del archivo

Carrera a número de vueltas y entrenamientos

Ya tiene pinta de lo que quiero lograr: cuenta vueltas, calcula tiempos de vuelta y vuelta rápida y permite elegir entre los dos tipos de carreras (me falta la de resistencia, pero supongo que no tardará mucho, pues básicamente es lo mismo pero con diferentes condicionantes). Una vez funcione la carrera de resistencia añadiré el control del segundo corredor, lo que conllevará un pequeño aumento del hardware, que publicaré en cuanto lo tenga disponible.

El semáforo

Este es el primer código que creo para Arduino. Realmente es el primer código que escribo desde que hace años abandoné mi Spectrum y su Basic, y desde entonces los lenguajes y técnicas de programación han cambiado un «poquito». Este es el código:

Publicacion de la galeria de fotos

Después de mucho  y duro trabajo 😉 con el servidor, que lo he montado yo entero, ya puedo publicar mis fotos bajo mi propio dominio:

www.arduslot.es/galeria/ ROTO http://juanjofrancia.es/el-garaje/

Está realizado con Gallery, con un tema que quiero modificar un poco y adaptarlo a mis gustos. Y de paso aprender un poco de PHP sobre archivos CSS, pues me parece más sencillo que modificar WP, con el que me quiero meter después.

ACTUALIZACIÓN

Abril 2020. En pleno confinamiento general en España y medio mundo por la pandemia de SARS-CoV-2, causante de la covid-19, he decidido actualizar el blog en otro alojamiento.

La nueva dirección es:

http://juanjofrancia.es/el-garaje/

Funciona con WordPress & Tema de Anders Norén