#include <stdio.h>
#include <stdarg.h>
#include "hardware/i2c.h"
#include "pico_i2c_lcd.h"
#define sm_0 14
#define sm_1 13
#define sm_2 12
#define sm_3 11
#define btn_1 19 // horário
#define btn_2 27 // anti-horário
#define I2C_PORT i2c0
#define I2C_SDA 20
#define I2C_SCL 21
// Ajuste da ordem das bobinas — ESSENCIAL
uint8_t sm_pin[4] = { sm_1, sm_0, sm_3, sm_2 };
// Sequência monofásica
bool sm_monofasico[4][4] = {{1, 0, 0, 0},{0, 1, 0, 0},{0, 0, 1, 0},{0, 0, 0, 1}};
int main() {
stdio_init_all();
// LCD
i2c_init(I2C_PORT, 100 * 1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
lcd_init(I2C_PORT, 0x27, 16, 2);
lcd_clear();
lcd_set_cursor(0, 0);
lcd_printf("Stepper Motor");
// Inicializa pinos do motor
for (uint8_t i = 0; i < 4; i++) {
gpio_init(sm_pin[i]);
gpio_set_dir(sm_pin[i], GPIO_OUT);
gpio_put(sm_pin[i], 0);
}
// Inicializa botões
gpio_init(btn_1);
gpio_set_dir(btn_1, GPIO_IN);
gpio_pull_up(btn_1);
gpio_init(btn_2);
gpio_set_dir(btn_2, GPIO_IN);
gpio_pull_up(btn_2);
while (true) {
bool valor_btn_1 = !gpio_get(btn_1);
bool valor_btn_2 = !gpio_get(btn_2);
if (valor_btn_1 && !valor_btn_2) {
// SENTIDO HORÁRIO
for (uint8_t step = 0; step < 4; step++) {
for (uint8_t i = 0; i < 4; i++) {
// LCD mostra o step
lcd_set_cursor(0, 1);
lcd_printf("Step: %d Hor.", step);
gpio_put(sm_pin[i], sm_monofasico[step][i]);
}
sleep_ms(80);
}
}
else if (valor_btn_2 && !valor_btn_1) {
// SENTIDO ANTI-HORÁRIO
for (int8_t step = 3; step >= 0; step--) {
// LCD mostra o step
lcd_set_cursor(0, 1);
lcd_printf("Step: %d Anti.", step);
for (uint8_t i = 0; i < 4; i++) {
gpio_put(sm_pin[i], sm_monofasico[step][i]);
}
sleep_ms(80);
}
}
else {
// Nenhum botão – desliga bobinas
for (uint8_t i = 0; i < 4; i++) {
gpio_put(sm_pin[i], 0);
}
}
}
}