#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pinos do motor de passo
int stepPin1 = 0;
int stepPin2 = 4;
int stepPin3 = 5;
int stepPin4 = 16;
// Pino do potenciômetro
int potPin = 34;
// Configuração do LCD (endereço, largura, altura)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variáveis para controle do motor
int motorPosition = 0; // Posição atual do motor
int lastPotValue = 0; // Valor anterior do potenciômetro
int stepsPerUpdate = 10; // Passos por ajuste
int stepsPerRevolution = 512; // Passos por rotação completa
void setup() {
// Configurar pinos do motor de passo como saída
pinMode(stepPin1, OUTPUT);
pinMode(stepPin2, OUTPUT);
pinMode(stepPin3, OUTPUT);
pinMode(stepPin4, OUTPUT);
// Inicializar o LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Posicao:");
// Inicializar a comunicação serial (opcional para depuração)
Serial.begin(9600);
}
// Função para acionar o motor de passo
void stepMotor(int step) {
switch (step) {
case 0:
digitalWrite(stepPin1, HIGH);
digitalWrite(stepPin2, LOW);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin4, LOW);
break;
case 1:
digitalWrite(stepPin1, HIGH);
digitalWrite(stepPin2, HIGH);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin4, LOW);
break;
case 2:
digitalWrite(stepPin1, LOW);
digitalWrite(stepPin2, HIGH);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin4, LOW);
break;
case 3:
digitalWrite(stepPin1, LOW);
digitalWrite(stepPin2, HIGH);
digitalWrite(stepPin3, HIGH);
digitalWrite(stepPin4, LOW);
break;
case 4:
digitalWrite(stepPin1, LOW);
digitalWrite(stepPin2, LOW);
digitalWrite(stepPin3, HIGH);
digitalWrite(stepPin4, LOW);
break;
case 5:
digitalWrite(stepPin1, LOW);
digitalWrite(stepPin2, LOW);
digitalWrite(stepPin3, HIGH);
digitalWrite(stepPin4, HIGH);
break;
case 6:
digitalWrite(stepPin1, LOW);
digitalWrite(stepPin2, LOW);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin4, HIGH);
break;
case 7:
digitalWrite(stepPin1, HIGH);
digitalWrite(stepPin2, LOW);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin4, HIGH);
break;
}
}
// Função para atualizar a posição no LCD
void updateLCD() {
lcd.setCursor(0, 1); // Linha 2
lcd.print("Passos: ");
lcd.print(motorPosition);
lcd.print(" "); // Limpa caracteres antigos
}
void loop() {
// Ler o valor do potenciômetro
int potValue = analogRead(potPin) / 10; // Reduz o intervalo para facilitar o controle
// Determinar a quantidade de passos a mover
int stepsToMove = (potValue - lastPotValue) * stepsPerUpdate;
// Mover o motor se houver diferença
if (stepsToMove != 0) {
int direction = (stepsToMove > 0) ? 1 : -1; // Direção do movimento
stepsToMove = abs(stepsToMove);
for (int step = 0; step < stepsToMove; step++) {
motorPosition += direction;
// Limitar a posição para dentro de uma revolução
if (motorPosition >= stepsPerRevolution) {
motorPosition -= stepsPerRevolution;
} else if (motorPosition < 0) {
motorPosition += stepsPerRevolution;
}
// Acionar o motor
stepMotor(motorPosition % 8);
delay(2); // Ajustar a velocidade
}
// Atualizar o LCD com a nova posição
updateLCD();
}
// Atualizar o último valor do potenciômetro
lastPotValue = potValue;
// Pequeno atraso para suavizar as leituras
delay(50);
}