Помогите с составлением кода

Тема в разделе "Arduino & Shields", создана пользователем MadRat, 4 сен 2017.

  1. MadRat

    MadRat Нуб

    Добрый день!
    Недавно понадобилось сделать на ардуинке небольшой проект, а именно электрофокусер с ик управлением. Так вот, возникла сложность с кодом... (В программирование я пока не очень силен, хотя и пытаюсь активно его учить.) Я хотел бы реализовать работу фокусера таким способом: чтоб я мог просто держать кнопку на пульте, и шаговик не переставая бы крутился, пока я не отпущу кнопку, как это можно сделать?
    Заранее спасибо)

    Код (C++):
    //Stepper with IR remote

    #include "Stepper.h"
    #include "IRremote.h"

    /*----- Variables, Pins -----*/
    #define STEPS  32   // Number of steps per revolution of Internal shaft
    int  Steps2Take;  // 2048 = 1 Revolution
    int receiver = 6; // Signal Pin of IR receiver to Arduino Digital Pin 6

    /*-----( Declare objects )-----*/
    // Setup of proper sequencing for Motor Driver Pins
    // In1, In2, In3, In4 in the sequence 1-3-2-4

    Stepper small_stepper(STEPS, 8, 10, 9, 11);
    IRrecv irrecv(receiver);    // create instance of 'irrecv'
    decode_results results;     // create instance of 'decode_results'

    void setup()
    {
      irrecv.enableIRIn(); // Start the receiver
    }

    void loop()
    {
    if (irrecv.decode(&results)) // have we received an IR signal?

      {
        switch(results.value)

        {

          case 0xFF629D: // UP button pressed
                          small_stepper.setSpeed(500); //Max seems to be 700
                          Steps2Take  =  20;  // Rotate CW
                          small_stepper.step(Steps2Take);
                          delay(20);
                          break;

          case 0xFFA857: // DOWN button pressed
                          small_stepper.setSpeed(500);
                          Steps2Take  =  -20;  // Rotate CCW
                          small_stepper.step(Steps2Take);
                          delay(20);
                          break;
                         
        }
       
          irrecv.resume(); // receive the next value
      }


    }
     

    Вложения:

    • l7GmrgwYDr4.jpg
      l7GmrgwYDr4.jpg
      Размер файла:
      198,7 КБ
      Просмотров:
      601
    • V1TSugmi0Rc.jpg
      V1TSugmi0Rc.jpg
      Размер файла:
      193,5 КБ
      Просмотров:
      477
    • xJFXpftzW-g.jpg
      xJFXpftzW-g.jpg
      Размер файла:
      217,4 КБ
      Просмотров:
      499
  2. qwone

    qwone Гик

    Ик очень глючный.
     
    MadRat нравится это.
  3. MadRat

    MadRat Нуб

    Да, скорее всего, но пока вроде работает нормально...
     
  4. qwone

    qwone Гик

    Ик первым байтом посылает код кнопки, а потом повтор. Так что организовать режим вращаем, пока нажата кнопка сложно.
     
  5. rkit

    rkit Гуру

    И чего же сложного в том. чтобы запомнить код, который повторяем?
     
  6. qwone

    qwone Гик

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

    sslobodyan Гик

    ТС, особых сложностей нет, да и пультик не глючный - это его нормальная штатная работа.
    Алгоритм примерно такой. Принимаете правильную рабочую команду и запоминаете ее код в переменной. Отрабатываете. Если кнопку на пульте не отпустить, то он отсылает команду повтора, причем обычно таких команд две и они чередуются между собой дабы приемная сторона поняла, что команда повторяется без ошибок. Поэтому получив на следующем опросе приемника команду повторения (любую из двух) - смотрим в переменную, где запомнили предыдущую рабочую команду и выполняем соответствующий ей код. И еще нужен контроль тайм-аута. Типа если не было никаких команд в течении определенного времени (0.5с например), то запомненная рабочая команда очищается дабы не было сработки на повтор без принятия новой рабочей команды.
     
  8. Тимати

    Тимати Нерд

    Попытайтесь заменить шаговик на коллекторник, с ним работать проще