Проблема с шаговым двигателем.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем IgOrKIPiA, 31 окт 2017.

  1. sslobodyan

    sslobodyan Гик

    encoder.tick(); должен опрашиваться постоянно, а у вас только в начале цикла. внутри delay()также опрос не производится
    newPos = encoder.getPosition(); там, где надо получить текущую позицию энкодера
     
  2. IgOrKIPiA

    IgOrKIPiA Нуб

    Спасибо буду пробовать исправлять!
     
  3. IgOrKIPiA

    IgOrKIPiA Нуб

    Так мне и надо чтобы энкодер работал до нажатия кнопки, дальше он мне не нужен. Выбрал энкодером 8 , 10 или 14, нажал на кнопку (здесь энкодер не нужен) поехал движок,выполнился опрос всех герконов и вернулся в первоначальное меню.
    Код (C++):
    void loop()
    {
    lcd.setCursor(0, 0);
    lcd.print(" Please Select: ");
    static int pos = 0;
    encoder.tick();
    int newPos = encoder.getPosition();
    if (pos < newPos) result++;
    if (pos > newPos) result--;
    if (result > 3) result = 1;
    if (result < 1) result = 3;
    if (pos != newPos) pos = newPos;
    if (result == 1)
    {
    lcd.setCursor(0, 1);
    lcd.print("        8        ");    
    }
    if (result == 2)
    {
    lcd.setCursor(0, 1);
    lcd.print("       10       ");    
    }
    if (result == 3)
    {
    lcd.setCursor(0, 1);
    lcd.print("       14       ");    
    }                                                   //Мне нужно чтобы опрашивался до этого места и всё
    // ждем отпускания кнопки
     while ( !D2_Read ) delay_ms(50);
     // ждем нажатие кнопки
     while ( D2_Read ) delay_ms(50);
     lcd.setCursor(0, 0);
     lcd.print("POZICIONIROVANIE");
     // делаем шажки пока не упремся в геркон
     while ( !D3_Read +D4_Read + D5_Read  + D6_Read)
    {
     myStepper_28BYJ.step( 1 );
    }
     
    На просторах интернета я не нашёл ни одного примера где newPos = encoder.getPosition(); в loop встречается больше 1 раза и encoder.tick(); везде стоит в начале цикла вместе с newPos = encoder.getPosition(); Помоему я чего-то не догоняю?
     
  4. IgOrKIPiA

    IgOrKIPiA Нуб

    Помоему вся проблема у меня в:
    / ждем отпускания кнопки
    while(!D2_Read ) delay_ms(50);
    // ждем нажатие кнопки
    while( D2_Read ) delay_ms(50);
    Цикл со старта доходит до этого места и ждёт когда я нажму кнопку.
     
  5. sslobodyan

    sslobodyan Гик

    Я вроде намекнул на то, что encoder.tick() должен отрабатываться чаще, чем будут замыкаться/размыкаться контакты энкодера.
    В этом месте
    Код (C++):
    // ждем нажатие кнопки
    while( D2_Read ) delay_ms(50);
    encoder.tick() вообще отсутствует. А крутиться там МК будет пока не нажмете кнопку. Даю наводку - таки надо добавить тик внутрь этого вайла и уменьшить интервал ожидания. И так везде, где МК тратит много времени или зацикливается. Иначе с энкодером можно работать по прерываниям, там оно как бы само считается ;)
     
    IgOrKIPiA нравится это.
  6. IgOrKIPiA

    IgOrKIPiA Нуб

    Попробовал сделать так:
    Код (C++):
    // ждем нажатие кнопки
    while ( D2_Read )
    {
    delay_ms(5);
    encoder.tick();
    newPos = encoder.getPosition();
    lcd.setCursor(0, 0);
    lcd.print("POZICIONIROVANIE");
    }
    и со всех сторон пытался подоткнуть encoder.tick(); и задержку выставил (5) энкодер усиленно мне не поддаётся, что я делаю не так?
     
  7. sslobodyan

    sslobodyan Гик

    Вы должны максимально часто вызывать tick(), а getPosition только там, где реально контролируете изменения. Это пока для контроля энкодера используется постоянное чтение состояния выводов, то есть поллинг. Но реально это очень плохой стиль. Необходимо использовать прерывания - пускай контроллер сам считает куда и что провернулось. Почитайте вот это http://www.mathertel.de/Arduino/RotaryEncoderLibrary.aspx там в разделе Interrupts как раз описано что надо делать. В двух словах - хотя бы один из выводов должен висеть на ноге с внешним прерыванием. Затем настраиваете обработчик этого прерывания на вызов tick(). Только в этом одном месте. А считывать состояние можете в любом месте кода.
     
    IgOrKIPiA нравится это.