Шаговый двигатель и датчик расстояния

кто может подсказать,как увеличить скорость шаговых двигателей,когда они используются в связке с датчиком расстояния.когда запускаю двигатель без датчиков,джостиков,то скорость одна,когда в программу к шаговому двигателю добавляю датчик расстояния,то скорость шагового двигателя становится меньше.спасибо

Элементарно, Ватсон!
Нужно устранить причину, по которой скорость становится меньше.

Мало вводных.
Но предположу , что датчик слишком медленный.

А я предположу, что при правильно написанной программе скорость датчика не играет никакой роли.

1 лайк

ну я так предпологаю,что много времени МК уходит на алгоритмы датчика.только как с этим бороться?

Полагаю, что там дилэи напиханы для чтения ультрасоника.

1 лайк

когда подключаю шаговый двигатель чисто в стандартном примере из библиотеки GyverStepper, то работает как надо ,скорость увеличивается и уменьшается в зависимости от того,какую задашь.но когда добавляю датчик расстояния (шаговик должен крутиться в одну либо другую сторону в зависимости от данных с датчика) она сразу становится меньше.

Значит, либо библиотека кривая (по поводу библиотеки - к Гайверу, у него свой форум есть), либо неправильно добавляете.

в ультразвуковом датчике еще более менее скорость,но все равно меньше чем,без него.а когда подключаешь инфракрасный датчки расстояния,скорость становится еще меньше, чем на ультразвуковом.эти делей можно как-то обойти?

@Geka777 , чем Вы двигатель крутите?
Правильно - таймером. Подозреваю, что у Вас как-то иначе.

Без осмотра нормальный врач рецепт не выписывает.

#include <GyverStepper.h> 

GStepper<STEPPER2WIRE> stepper(2048, 5, 6, 7);//step,dir,en


unsigned int dist_sm;
unsigned int condist_sm;
unsigned int puls;

void setup() { 
Serial.begin(9600);
stepper.setRunMode(KEEP_SPEED);
stepper.setSpeed(1000);


pinMode(9,OUTPUT);
pinMode(8,INPUT);
digitalWrite(9 ,HIGH);
delayMicroseconds(10);
digitalWrite(9,LOW);
puls = pulseIn(8,HIGH);
condist_sm = puls/58;

}

void loop() {

puls = 0;  
digitalWrite(9 ,HIGH);
delayMicroseconds(10);
digitalWrite(9,LOW);
puls = pulseIn(8,HIGH);
dist_sm = puls/58;


if(dist_sm > condist_sm+2){

  stepper.reverse(0); 
   stepper.tick();

} else if(dist_sm < condist_sm -2){

  stepper.reverse(1); 
   stepper.tick();
  
}

}

pulseIn() и тормозит.

так это можно как-то поправить или нет?

Что значит “может”?
Именно оно не только может, но и влияет.
А поправить - переписать с нуля на другом принципе, я уже писал об этом.

В принципе - можно поправить. Справитесь ли - вот в чем вопрос. Заколхозить можно на библиотеке TimerOne, заставив её тикать степпером.

У нас уже ночь, я откланиваюсь.

понял ,спасибо

По моему, вам надо оптимизировать алгоритм.
Сейчас у вас двигатель делает один шаг после одного измерения расстояния. Вам действительно надо замерять расстояние по 300 раз в секунду (цифра примерная т.к. не знаю какое у вас расстояние.) Возможно лучше измерять расстояние например 10 раз в секунду (но не с задержками delay,) и задавать мотору количество шагов которое он должен отработать, чтобы исправить ошибку.

В датчике расстояния в библиотеке применен Deley

Для того чтобы он не тормозил работу шагового двигателя нужно сделать работу в “многопоточном режиме” которого у ардуино нет. Однако Deley можно обойти через цикл void yield()

То есть :

void () {
(код датчика расстояния)
}

void yield(){
(код шагового двигателя)
}

А мужики-то и не знали ))