Ajuda com programação de um projeto (Motor de Passo/Sensor Ultrassônico)

Meu objetivo é fazer com que o Motor de Passo gire de 90 em 90 graus no sentido horário e anti-horário, enquanto isso o Sensor Ultrassônico que está acoplado deverá detectar se há um obstáculo em sua frente, e ativar um motor de vibração correspondente a direção em que está o obstáculo. O circuito individualmente está funcionando normalmente, porém quando em conjunto apenas o Motor de Passo executa sua função de maneira correta, os motores de vibração parecem não estar recebendo nenhum sinal quando há um obstáculo na frente do Sensor Ultrassônico. Segue a programação:

#include <Ultrasonic.h>
#include <Stepper.h>

const int stepsPerRevolution = 500;
long int distancia;

Ultrasonic ultrassom(3,2);
Stepper myStepper(stepsPerRevolution, 9,11,10,12);

void setup() {

myStepper.setSpeed(60);

pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
Serial.begin(9600);
}

void loop(){

long int distancia = ultrassom.Ranging(CM);

//Gira o motor no sentido horario a 90 graus (4x)-------------------

myStepper.step(-512);
delay(100);
if (distancia < 15){
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(-512);
delay(100);
if (distancia < 15){
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(-512);
delay(100);
if (distancia < 15){
digitalWrite(5, HIGH);
delay(1000);
digitalWrite(5, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(-512);
delay(100);
if (distancia < 15){
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
}
delay(2000);
//Gira o motor no sentido anti-horario a 90 graus (4x)-------------

myStepper.step(512);
delay(100);
if (distancia < 15){
digitalWrite(5, HIGH);
delay(1000);
digitalWrite(5, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(512);
delay(100);
if (distancia < 15){
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(512);
delay(100);
if (distancia < 15){
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);
}
delay(2000);
//-----------------------------------------------------------------
myStepper.step(512);
delay(100);
if (distancia < 15){
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
}
delay(2000);
}

Olá,

Para facilitar a ajuda edita a mensagem anterior, selecciona o código e clica no botão </> para o formatar (ou pressiona Ctrl+E).

O ciclo de execução do loop() parece ser muito longo por causa dos delays(). Especialmente quando a variável distância é inferior a 15.

Não podes reduzir os tempos nesses delays?

O ideal seria evitar usar a função delay() porque bloqueia o programa. Existem alguns tutoriais que explicam como substituir a função delay() pela função millis() com algumas alterações no modo de controlo do programa. Por exemplo o tutorial da Adafruit Ditch the delay() . Encontrei outro em Português: Como substituir a função delay() por millis() no Arduino.

Experimenta realizar esses tutoriais e depois aplicar esse modo de funcionamento ao teu programa.

1 Like

Não entendo esse código, você poderia postar os códigos funcionais separadamente?
Saudações.