⬤ Servo · Intermédio
🦾 Servo Motor — Posição Precisa
⏱️ 30 min🧩 Servo.write() · Potenciómetro · Sequências · 2 Servos
🔄 Varredura com LCD
ex_servo.ino
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo sv;
int ultA = -1;
void mostrar(int a, const char* pos) {
if(a==ultA) return;
lcd.setCursor(0,1); lcd.print("Ang: ");lcd.print(a);lcd.print(" graus ");
lcd.setCursor(0,2); lcd.print(pos);lcd.print(" ");
ultA = a;
}
void setup() {
lcd.init(); lcd.backlight();
sv.attach(9); sv.write(90);
lcd.setCursor(0,0); lcd.print("Servo D9 Varredura");
}
void loop() {
for(int a=0; a<=180; a+=2) { sv.write(a); mostrar(a,"AVANCA"); delay(15); }
for(int a=180; a>=0; a-=2) { sv.write(a); mostrar(a,"RECUA "); delay(15); }
}
🎛️ Controlo por Potenciómetro e Sequências
ex_servo_pot_seq.ino
// Potenciómetro em A0
void loop_pot() {
int ang = map(analogRead(A0), 0, 1023, 0, 180);
sv.write(ang);
lcd.setCursor(0,1); lcd.print(ang); lcd.print(" graus ");
delay(20);
}
// Sequência programada
struct Pos { int ang; int ms; const char* n; };
const Pos seq[] = {{0,800,"Fechado"},{90,1200,"Meio "},{180,800,"Aberto "}};
void loop_seq() {
for(auto& p : seq) {
sv.write(p.ang);
lcd.setCursor(0,1); lcd.print(p.n);
lcd.setCursor(0,2); lcd.print(p.ang); lcd.print(" graus ");
delay(p.ms);
}
}
🦾 Dois Servos com Joystick
ex_2servos.ino
#include <Servo.h>
Servo sv1, sv2;
#define JX A0
#define JY A1
#define DZ 80
int a1=90, a2=90;
void setup() {
sv1.attach(9); sv1.write(90);
sv2.attach(10); sv2.write(90);
}
void loop() {
int dx = analogRead(JX)-512;
int dy = analogRead(JY)-512;
if(dx> DZ) a1=constrain(a1+2,0,180);
if(dx<-DZ) a1=constrain(a1-2,0,180);
if(dy> DZ) a2=constrain(a2+2,0,180);
if(dy<-DZ) a2=constrain(a2-2,0,180);
sv1.write(a1); sv2.write(a2);
lcd.setCursor(0,1); lcd.print("J1:");lcd.print(a1);lcd.print(" J2:");lcd.print(a2);lcd.print(" ");
delay(20);
}
🏆 Para ir mais longe
- Move dois servos em espelho: quando sv1 vai a 30°, sv2 vai a 150°
- Implementa modo GRAVAR: SW do joystick grava posição actual numa sequência de 5 slots
- Mede o tempo do SG90 de 0° a 180° — coincide com os 0.3s do datasheet?
- Cria gaveta automática: servo abre ao premir botão, fecha 5s depois