Arduino, Rasperry y algo más

Categoría: Hardware

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 (II)

En un post del foro español de Arduino surgió el tema de como conectar las dos LCD y expuse el método que publiqué en esta entrada (Como usar dos LCD con un arduino (I) ) y que consiste en el uso de puertas lógicas,. Entre otras cosas se comentó otro método que permite hacer lo mismo que expuse anteriormente. El post en en cuestión está aquí.

La solución que se propuso es declarar ambas LCD en el programa de la siguiente forma:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd2(12, 10, 5, 4, 3, 2);

Dos consideraciones a este método:

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):

Primera revisión del hardware del gestor de carreras

Hasta ahora todo lo que he publicado servía para controlar «carreras» de un solo corredor, lo cual no tiene mucho sentido ni es mi objetivo. Para ello necesito otro «sensor de pista» (en el prototipo un pulsador). Y como me he dado cuenta de una carencia fundamental en el diseño a la hora de manejar la entrada de datos (¡¡No puedo retroceder!!) lo cual no es importante en el menú, pero en el caso de las carreras a número de vueltas o de resistencia es muy importante si queremos que sean a un tiempo determinado, p.e., y nos pasamos con el botoncito.

Pues esos cambios, dos botones más, van conectados así:

Prototipo de Arduslot v2

Hardware de pruebas del Gestor de carreras

Este es el diseño sobre protoboard en el que voy a desarrollar el Arduslot:

Funciona con WordPress & Tema de Anders Norén