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 ?
Démonstration
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);
}
}