#include <stdio.h>
#include "pico/stdlib.h"
// -------- PINOS DO MOTOR --------
#define COIL_A 14 // A+
#define COIL_B 13 // B+
#define COIL_C 12 // A-
#define COIL_D 11 // B-
// -------- PINOS DOS BOTÕES --------
#define BTN1 16 // horário
#define BTN2 17 // anti-horário
// -------- PINOS DAS CHAVES --------
#define CH1 4
#define CH2 5
#define CH3 6
// -------- MATRIZES DOS MODOS --------
// MONOFÁSICO (4 passos)
bool mono[4][4] = {
{1,0,0,0}, // A+
{0,1,0,0}, // B+
{0,0,1,0}, // A-
{0,0,0,1} // B-
};
// BIFÁSICO (4 passos)
bool bi[4][4] = {
{1,1,0,0}, // A+ B+
{0,1,1,0}, // B+ A-
{0,0,1,1}, // A- B-
{1,0,0,1} // B- A+
};
// SEMI-PASSO (8 passos)
bool semi[8][4] = {
{1,0,0,0}, // A+
{1,1,0,0}, // A+ B+
{0,1,0,0}, // B+
{0,1,1,0}, // B+ A-
{0,0,1,0}, // A-
{0,0,1,1}, // A- B-
{0,0,0,1}, // B-
{1,0,0,1} // B- A+
};
// Vetor dos pinos
uint8_t coils[4] = {COIL_A, COIL_B, COIL_C, COIL_D};
int main() {
stdio_init_all();
// Inicializa as bobinas
for (int i = 0; i < 4; i++) {
gpio_init(coils[i]);
gpio_set_dir(coils[i], GPIO_OUT);
}
// Inicializa botões
gpio_init(BTN1); gpio_set_dir(BTN1, GPIO_IN); gpio_pull_up(BTN1);
gpio_init(BTN2); gpio_set_dir(BTN2, GPIO_IN); gpio_pull_up(BTN2);
// Inicializa chaves
gpio_init(CH1); gpio_set_dir(CH1, GPIO_IN); gpio_pull_up(CH1);
gpio_init(CH2); gpio_set_dir(CH2, GPIO_IN); gpio_pull_up(CH2);
gpio_init(CH3); gpio_set_dir(CH3, GPIO_IN); gpio_pull_up(CH3);
int passo = 0;
while (true) {
// Leitura das chaves (inversão por causa do pull-up)
bool S1 = !gpio_get(CH1);
bool S2 = !gpio_get(CH2);
bool S3 = !gpio_get(CH3);
// Leitura dos botões (inversão por causa do pull-up)
bool horario = !gpio_get(BTN1);
bool antihorario = !gpio_get(BTN2);
// -------- DETERMINA MODO PELO COMBINADO --------
int modo = 0;
int total_passos = 4;
if (S3==0 && S2==0 && S1==1) {
modo = 1; // monofásico
total_passos = 4;
}
else if (S3==0 && S2==1 && S1==0) {
modo = 2; // bifásico
total_passos = 4;
}
else if (S3==1 && S2==0 && S1==0) {
modo = 3; // semi-passo
total_passos = 8;
}
else {
// modo inválido → motor desligado
for (int i = 0; i < 4; i++)
gpio_put(coils[i], 0);
continue;
}
// -------- CONTROLE DO SENTIDO --------
if (horario && !antihorario) {
passo++;
}
else if (antihorario && !horario) {
passo--;
}
else {
// Nenhum botão OU os dois pressionados → motor parado
for (int i=0; i<4; i++)
gpio_put(coils[i], 0);
sleep_ms(5);
continue;
}
// Loop circular (ring buffer)
if (passo >= total_passos) passo = 0;
if (passo < 0) passo = total_passos - 1;
// -------- ESCREVE O PASSO NO MOTOR --------
for (int i = 0; i < 4; i++) {
if (modo == 1) gpio_put(coils[i], mono[passo][i]);
else if (modo == 2) gpio_put(coils[i], bi[passo][i]);
else if (modo == 3) gpio_put(coils[i], semi[passo][i]);
}
sleep_ms(4); // velocidade do motor
}
}