Проблемы с шаговиками и ультразвуковым датчиком в связке

Тема в разделе "Arduino & Shields", создана пользователем alexpzas, 21 сен 2013.

  1. alexpzas

    alexpzas Нуб

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

    . Цель - заставить ехать робота вперёд, пока расстояние до препятствия будет более 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 }

    Вродебы проблема в том , что если расстояние большое то функция определения расстояния тормозит двигатели, подскожите пож как избаиться от это проблемы?
     
  2. Unixon

    Unixon Оракул Модератор

    А как выглядит передаточная характеристика у дальномера, как показания дальномера на самом деле зависят от расстояния до препятствия?
     
  3. alexpzas

    alexpzas Нуб

    Подаем на ножку Trig сигнал, длительностью 10мкс, что запускает генератор, создающий пачку коротких импульсов на передатчике ( 8 шт ). Далее, приемник получает отраженный сигнал и на ножке Echo генерируется прямоугольный сигнал, длина которого пропорциональна времени между излучением импульсов и детектированием их приемником.
    Реальное время, за которое звук дойдет до приемника, конечно же, составит копейки. Что бы по нему определить расстояние, можно воспользоваться нехитрой формулой:
    s=vt/2, s — расстояние, v — скорость звука, t — время получения сигнала на приемнике.
    С выхода Echo идет уже сформированный сигнал, с достаточно большой длительностью. Заглянув в даташит, мы увидим формулу пересчета: s = t/58, s — расстояние, t — длительность импульса Echo, s — расстояние в сантиметрах.
    На форумах говрят , что проблема возникает ещё из за блокирующих функций с помощью которых измеряется расстояние(delayMicroseconds();, и pulseIn(); dist=sonic.Ranging(CM) ) Как обойти их.?
     
  4. Unixon

    Unixon Оракул Модератор

    Эмм... не, я про другое.
    Пусть X - расстояние до препятствия, измеренное линейкой, а Y - то же расстояние, но измеренное этим дальномером.
    Какая зависимость Y(X) получается экспериментальным путем?
     
  5. alexpzas

    alexpzas Нуб

    может я не понял вопроса, но как я понимаю,чем больше расстояние тем дольше измеряется онное, соответственно больше задержка , соответственно эта задержка влияет на моторы.
     
  6. Unixon

    Unixon Оракул Модератор

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

    Unixon Оракул Модератор

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

    Kosss Нерд

    Ультразвуковой дальномер я конечно еще не тестил, Но сдается мне, что он как и инфракрасный выдает значения задом наперед. т е если расстояние большое , то он выдает <100 , а если маленькое >500(где-то так)
    функция map в помощь
     
  9. Unixon

    Unixon Оракул Модератор

    Там одним map-ом не отделаться, у того же ИК зависимость не то что просто нелинейная, так еще и немонотонная, а map() - это линейное преобразование, потому для обработки показаний ИК бесполезно.
     
  10. Kosss

    Kosss Нерд

    А тогда что лучше использовать
     
  11. Unixon

    Unixon Оракул Модератор

    Обратное преобразование по таблице (кусочно-линейное или более высокого порядка) + логику для разрешения неоднозначности, если таковая в показаниях дальномера будет.
     
  12. Kosss

    Kosss Нерд

    а есть таблица заначений сенсора?
     
  13. Unixon

    Unixon Оракул Модератор

    Есть в документации. Но можно и самостоятельно построить. Это даже лучше, получите практический опыт по калибровке датчика.