Commander le servomoteur à l'aide d'un potentiomètre

Commander le servomoteur à l’aide d’un potentiomètre

Si vous avez suivi les tutoriels de @Jicehel et @Tombuino sur le servomoteur et les potentiomètres :

Pourquoi ne pas combiner l’usage simultané de ces deux périphériques ? :slightly_smiling_face:

Démonstration

servopot-12fps-32c

Câblage

Le brochage que j’ai choisi ici est le suivant :

Servo META Description
Rouge VBAT Alimentation par la batterie
Marron GND Masse
Orange 10 Broche de commande
Pot META Description
VCC 3V3 Alimentation
GND GND Masse
SIG A3 Broche de lecture

Programmation

Voici le code de commande du servomoteur par un potentiomètre :

/**
 * Scroll down to read the full code...
 */

#include <Gamebuino-Meta.h>
#include <Servo.h>

const uint8_t SERVO_PIN = 10;
const uint8_t POT_PIN   = A3;

const uint8_t W2 = .5f * gb.display.width();
const uint8_t H2 = .5f * gb.display.height();
const uint8_t R1 = 30;
const uint8_t R2 = 16;
const uint8_t R3 = 5;

constexpr char *FORMAT = "%03u";
constexpr char *LABEL  = "SERVO";

const float_t ARROW[] = { -PI/2, PI/4, 3*PI/4, -PI/2 };

struct Pot {

    uint8_t  pin;
    uint16_t reading;
    float_t  ratio;

    Pot(uint8_t pin) { this->pin = pin; }

    void read() {
        reading = analogRead(pin);
        ratio   = reading / 1024.f;
    }

};

Servo servo;
Pot   pot(POT_PIN);

void setup() {
    gb.begin();
    servo.attach(SERVO_PIN);
}

void loop() {

    gb.waitForUpdate();
    pot.read();
    
    servo.write(180*(1-pot.ratio));

    gb.display.clear();
    gb.display.setColor(BLUE);
    gb.display.drawCircle(W2, H2, R1);
    for (uint8_t a=0; a<=180; a += 15) {
        float_t t = PI*a/180;
        uint8_t x = W2 - (R1-4)*cos(t);
        uint8_t y = H2 - (R1-4)*sin(t);
        gb.display.fillCircle(x, y, 1);
    }
    
    gb.display.setColor(LIGHTBLUE);
    gb.display.print(W2-10, H2-3, LABEL);
    
    gb.display.setColor(WHITE);
    gb.display.printf(W2 - 6, H2 + 4, FORMAT, (uint8_t)(180*pot.ratio));

    for (uint8_t i=0; i<3; ++i) {
        float_t t  = PI*pot.ratio;
        float_t t1 = ARROW[i  ] - PI/2 + t;
        float_t t2 = ARROW[i+1] - PI/2 + t;
        uint8_t x1 = W2 - R2*cos(t) + R3*cos(t1);
        uint8_t y1 = H2 - R2*sin(t) + R3*sin(t1);
        uint8_t x2 = W2 - R2*cos(t) + R3*cos(t2);
        uint8_t y2 = H2 - R2*sin(t) + R3*sin(t2);
        gb.display.drawLine(x1, y1, x2, y2);
    }

}
3 Likes

C’est en sorte un croisement de deux tutos :wink:
Bravo @Steph , ça rend vraiment très bien.

3 Likes

Oh que c’est beau ! Une petite appli bien propre qui permet en plus de s’amuser avec deux accessoires à la fois. Merci de partager cela avec nous ^^.

2 Likes

On fait ça 3 fois et on a un bras sans main. On en rajoute 2 autres et on a un poigné et une pince même si pour la pince on a d’autres solutions. Bon après il y a un peu d’habillage à faire autour des servos mais nos amis de gamebuino semblent maitriser totalement la fabrication de pièces en bois :slight_smile:
Flèches gauch / droite pour controler la rotation du bras, haut bas pour controler la première partie du bras. A et B pour monter ou descendre la deuxième. Le potentiomètre 1 controle la rotation du poignet et le potentiomètre 2 l’ouverture de la pince…

L’usage combiné du joystick serait tout indiqué pour un projet comme celui-là :wink:

1 Like