maly222
@maly222
Учусь основам робототехники.

Как управлять двумя шаговоми двигателями с помощью hc-rs04?

У меня есть 2 шаговых двигателя и ултрозвуковой датчик hc-rs04. И нужно сделать так чтобы когда hc-rs04 получит сигнал в радиусе 30 см шаговый двигатель замедлялся. Я смог подключит только один шаговый двигатель, и когда звуковой датчик уловил сигнал в ростояние 30 см шаговый двигатель замедлился. Но когда я попробовал сразу на два шаговых двигателя все перестало работат.
Вот код:

#include <Stepper.h>
const int stepsPerRevolution = 400;
const int stepsPerRevolution1 = 400;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); // Порты для двигателей
Stepper myStepper2(stepsPerRevolution1, 4,5,6,7);
const int trigPin = 12; // Подключение hc-rs04
const int echoPin =13;

long duration;
int distance;
long duration1;
int distance1;
void setup() {

   pinMode(trigPin, OUTPUT); 
   pinMode(echoPin, INPUT); 
   Serial.begin(9600); 

}

void loop() {
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(5);
   digitalWrite(trigPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   distance= duration*0.034/2;

   if (distance > 40) {
      myStepper.step(stepsPerRevolution);
  myStepper.setSpeed(25);

   }
      duration1 = pulseIn(echoPin, HIGH);
   distance1= duration1*0.034/2;
   if(distance1 > 30){
      myStepper2.step(stepsPerRevolution1);
  myStepper2.setSpeed(25);
 
   }
}
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
maly222
@maly222 Автор вопроса
Учусь основам робототехники.
Да уж. Я все таки нашел решение и возможно вы все псевдо программист ы меня не понимали, а возможно хотели чтобы я не смог написать код и ушел из робототехники чтобы у вас рабочее место не отнят. Короче кому надо вот код:

#include <CustomStepper.h>         
CustomStepper stepper(8, 9, 10, 11);  
CustomStepper stepper1(4,5,6,7); 
                    
const int trigPin = 12; 
const int echoPin =13;

long duration;
int distance;
void setup()
{
   pinMode(trigPin, OUTPUT); 
   pinMode(echoPin, INPUT); 
   Serial.begin(9600); 
  stepper.setRPM(26);               
  stepper.setSPR(4075.7728395);   
    stepper1.setRPM(26);                
  stepper1.setSPR(4075.7728395); 
}

void loop()
{
    digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(5);
   digitalWrite(trigPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   distance= duration*0.034/2;
   
        if (distance > 20) {
              stepper.setDirection(CCW);       
    stepper.rotate(1);   
  stepper.setRPM(1);                
  stepper.setSPR(4075.7728395); 
 stepper1.setDirection(CW);        
    stepper1.rotate(1);   
  stepper1.setRPM(1);                 
  stepper1.setSPR(4075.7728395); 
   }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@PRV1984
Зачем дважды подавать команду pulseIn. Можно один раз измерить расстояние и уже в условии выполнить необходимые действия, например вот так:

void loop() {
   digitalWrite(trigPin, LOW);
   delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(5);
   digitalWrite(trigPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   distance= duration*0.034/2;

   if (distance > 40) {
      myStepper.step(stepsPerRevolution);
      myStepper.setSpeed(25);
   }
   else if(distance > 30){
      myStepper2.step(stepsPerRevolution1);
      myStepper2.setSpeed(25);
   }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы