Всем привет. Возможно я пложу темы, извините, но похожих тем много , а схожей проблемы я не нашёл. Суть проблемы такова - вот видео . Цель - заставить ехать робота вперёд, пока расстояние до препятствия будет более 50 см, если меньше, то включаем один двигатель из двух до тех пор , пока расстояние не увеличется, после чего включаем 2 двигаеля. Проблема в том , что если просто использовать скетч без условий (включить двигатели оба и не измерять расстояние), то оба двигателя одновременно довольно шустро крутятся , если же вставить код определения расстояния и условия то получается картина что когда нужно чтобы крутилось 2 привода - они еле крутятся рывками как видно на видео (иногда вообще не предсказуемо - то быстро то медленно), а вот когда расстояние меньше 50 и нужно включить 1 двигатель для поворота, то он вполне нормально работает. Вот скетч 01 #include <AccelStepper.h> 02 #include <AFMotor.h> 03 #include "Ultrasonic.h" 04 AF_Stepper motor1(48, 1); 05 AF_Stepper motor2(48, 2); 06 Ultrasonic sonic(22, 24); 07 const int Trig = 22; //Ultrasonic 08 const int Echo = 24; 09 int time_us; 10 int distance_sm; 11 int dist; 12 13 14 15 // you can change these to DOUBLE or INTERLEAVE or MICROSTEP! 16 void forwardstep1() { 17 motor1.onestep(FORWARD, DOUBLE); 18 } 19 void backwardstep1() { 20 motor1.onestep(BACKWARD, DOUBLE); 21 } 22 void forwardstep2() { 23 motor2.onestep(FORWARD, DOUBLE); 24 } 25 void backwardstep2() { 26 motor2.onestep(BACKWARD, DOUBLE); 27 } 28 29 AccelStepper stepper1(backwardstep1, forwardstep1 ); // use functions to step 30 AccelStepper stepper2(forwardstep2, backwardstep2); // use functions to step 31 32 void setup() 33 { 34 Serial.begin(9600); // set up Serial library at 9600 bps 35 Serial.println("Stepper test!"); 36 stepper1.setMaxSpeed(100); 37 stepper1.setSpeed(100); 38 stepper2.setMaxSpeed(100); 39 stepper2.setSpeed(100); 40 41 } 42 void loop() 43 { 44 dist=sonic.Ranging(CM); 45 Serial.println(dist); 46 if (dist>0 & dist<50) { 47 // stepper1.runSpeed(); 48 stepper2.runSpeed(); 49 } 50 else 51 { 52 stepper2.runSpeed(); 53 stepper1.runSpeed(); 54 } 55 } Вродебы проблема в том , что если расстояние большое то функция определения расстояния тормозит двигатели, подскожите пож как избаиться от это проблемы?
А как выглядит передаточная характеристика у дальномера, как показания дальномера на самом деле зависят от расстояния до препятствия?
Подаем на ножку Trig сигнал, длительностью 10мкс, что запускает генератор, создающий пачку коротких импульсов на передатчике ( 8 шт ). Далее, приемник получает отраженный сигнал и на ножке Echo генерируется прямоугольный сигнал, длина которого пропорциональна времени между излучением импульсов и детектированием их приемником. Реальное время, за которое звук дойдет до приемника, конечно же, составит копейки. Что бы по нему определить расстояние, можно воспользоваться нехитрой формулой: s=vt/2, s — расстояние, v — скорость звука, t — время получения сигнала на приемнике. С выхода Echo идет уже сформированный сигнал, с достаточно большой длительностью. Заглянув в даташит, мы увидим формулу пересчета: s = t/58, s — расстояние, t — длительность импульса Echo, s — расстояние в сантиметрах. На форумах говрят , что проблема возникает ещё из за блокирующих функций с помощью которых измеряется расстояние(delayMicroseconds();, и pulseIn(); dist=sonic.Ranging(CM) ) Как обойти их.?
Эмм... не, я про другое. Пусть X - расстояние до препятствия, измеренное линейкой, а Y - то же расстояние, но измеренное этим дальномером. Какая зависимость Y(X) получается экспериментальным путем?
может я не понял вопроса, но как я понимаю,чем больше расстояние тем дольше измеряется онное, соответственно больше задержка , соответственно эта задержка влияет на моторы.
Теоретически, да. Вы предполагаете, что датчик работает идеально и имеет линейную передаточную характеристику. В реальности на процесс измерения влияет взаимное расположение в пространстве всех поверхностей, на которых звуковые волны могут преломляться, отражаться и поглощаться. Вот о том и вопрос был, насколько в реальности датчик близок к своим теоретическим основам и как именно он ведет себя в условиях, которые у вас реализуются.
По поводу разных задержек и взаимных блокировок - да, в принципе оно возможно. Но я предлагаю сначала локализовать источник проблемы. Он может быть в том, что в реальности измеряемая величина ведет себя не так, как мы думаем, либо в том, что есть неполадки в исполнительных механизмах, а измерение расстояний и принятие решения о действиях выполняется корректно. Первое проверить и отсечь можно очень просто.
Ультразвуковой дальномер я конечно еще не тестил, Но сдается мне, что он как и инфракрасный выдает значения задом наперед. т е если расстояние большое , то он выдает <100 , а если маленькое >500(где-то так) функция map в помощь
Там одним map-ом не отделаться, у того же ИК зависимость не то что просто нелинейная, так еще и немонотонная, а map() - это линейное преобразование, потому для обработки показаний ИК бесполезно.
Обратное преобразование по таблице (кусочно-линейное или более высокого порядка) + логику для разрешения неоднозначности, если таковая в показаниях дальномера будет.
Есть в документации. Но можно и самостоятельно построить. Это даже лучше, получите практический опыт по калибровке датчика.