Память для джойстика

Тема в разделе "Arduino & Shields", создана пользователем sashok, 17 май 2016.

  1. sashok

    sashok Нерд

    Сочинил передатчик на модуле NRF24L01 на управление тремя моторами с двух джойстиков теперь понадобилась дополнительная фишка Подскажите возможно ли по таймеру отсчитать сколько времени был отклонен джойстик и занести в епром а так же запомнить последнее показание со входа этого же джойстика? И как это сделать? Нужно вроде этого нажал кнопку замигал светодиод отклонил стик например на 50 процентов подержал 3 секунды нажал эту же кнопку светодиод потух контроллер запомнил время и положение. Потом нажал вторую кнопку контролер передал данные, из епрома. Сам примерно представляю как занести в епром показания со стика. Вот у меня получился такой код
    Код (C++):

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <EEPROM.h>

    }
     
    Последнее редактирование: 21 май 2016
    Рязанский_Ардуинщик нравится это.
  2. sashok

    sashok Нерд

    Почитав еще статьей понял что нет необходимости записывать в епром нужно завести пару переменных в одну записывать показания джойстика во вторую время. Вопрос меняется подскажите пожалуйста как сделать отсчет времени при отклонении джойстика запомнить его и как занести в переименую максимальное значение полученное с аналогово входа?
     
  3. ostrov

    ostrov Гуру

    Отсчет времени делать проще всего так:
    Код (C++):
    unsigned long timerT;
    ....
    timerT = millis();
     
    Далее разница между millis() и timerT будет являться временем прошедшим с запоминания переменной в миллисекундах.

    Максимальное значение запоминаете так: создаете переменную типа int, при измерениях analogRead() постоянно сравниваете результат с этой переменной, если результат больше, то записываете его в переменную.
    Код (C++):
    vol = analogRead(A0);
    maxVol = max(vol, maxVol);
     
  4. sashok

    sashok Нерд

    Спасибо! Попробую изобразить.
     
  5. sashok

    sashok Нерд

    Суть передатчика такова
    Два режима Рабочий режим и Запись при включении запускаем рабочий режим
    в нем управляем тремя движками Можно управлять джойстиками или нажав на грибок
    переключаем управление на соответствующий потенциометр
    у каждой оси свой потенциометр и индикатор режима если горит то потенциометр если не горит то джойстик
    далее нажав кнопку запись (аналоговая клава) загорелся индикатор записи переключаем циклично все три оси
    на запись замигал индикатор первой оси
    Отклонил стик первой оси записал время удержания стика и значение на входе
    снова нажал кнопку запись замигал индикатор второй оси записал вторую ось
    снова нажал кнопку запись замигал индикатор третьей оси записал третью ось
    снова нажал кнопку запись перешел в рабочий режим В рабочем режиме
    нажал кнопку старт передал значение на входе по таймеру
    Код делал по найденным примерам.
    Посмотрите правильно ли я вас понял?
    Код ниже
     
  6. sashok

    sashok Нерд

    Код (C++):

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    #define CE_PIN   9
    #define CSN_PIN 10

    #define JOYSTICK_X A1 //Джойстик ось Х
    #define JOYSTICK_Y A2 //Джойстик ось Y
    #define JOYSTICK_Z A3 //Джойстик ось Z
    #define POT_X A4 //потенциометр ось X
    #define POT_Y A5 //потенциометр ось Y
    #define POT_Z A6 //потенциометр ось Z
    #define BUTON A7 // аналоговые кнопки
    int val_1;  //переменная для оси X
    int val_2;  //переменная для оси Y
    int val_3; //переменная для оси Z
    int val_4; //переменная для аналоговых кнопок
    int maxVolX; //Максимальное значение джойстика
    int maxVolY;
    int maxVolZ;
    const int Xbutton = 2;
    const int Ybutton = 3;
    const int Zbutton = 4;
    const int Xled = 5;
    const int Yled = 6;
    const int Zled = 7;

    int flagVork = 0;
    int flagX = 0;
    int flagY = 0;
    int flagZ = 0;

    int regimMemor = 1;
    int regimX = 0;
    int regimY = 0;
    int regimZ = 0;

    int radioBut;
    int Key0;
    int Key3;
    int KeyWork;
    int KeyAuto;
    boolean Memor = true;
    const int ledMemory = 8;

    unsigned long currentTime;
    unsigned long TimeX, TimeZ, TimeY;

    int ledState = LOW; // ledState used to set the LED
    unsigned long previousMillis = 0;        // will store last time LED was updated
    const long interval = 300;           // interval at which to blink (milliseconds)

    const uint64_t pipe = 0xF0F0F8F110FL; // Define the transmit pipe
    RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
    int joystick[4];  // 2 element array holding Joystick readings
    //int joystick[2];
    void setup()
    {
      // Serial.begin(9600);
      radio.begin();
      radio.openWritingPipe(pipe);
      pinMode(Xbutton, INPUT);
      pinMode(Xled, OUTPUT);
      digitalWrite(Xled, LOW);
      pinMode(Ybutton, INPUT);
      pinMode(Yled, OUTPUT);
      digitalWrite(Yled, LOW);
      pinMode(Zbutton, INPUT);
      pinMode(Zled, OUTPUT);
      digitalWrite(Zled, LOW);
      currentTime = millis();
    }//--(end setup )---


    void loop()
    {
      ///////////////////////////////////////////////////////////////////////////
      if (Memor == true)// Рабочий режим
      {
        digitalWrite(ledMemory, LOW);
        work();
        if (KeyRadio() == KeyAuto && regimMemor == 4)
        {

          currentTime = millis();
          AutoStart();
        }
        if (KeyRadio() == KeyWork && flagVork == 0) //если кнопка нажата
        {
          Memor = false; //прерывем рабочий режим
          regimMemor++;
          flagVork = 1;
          if (regimMemor > 4) // если режим больше 3 переходи к режиму 1
          {
            regimMemor = 1;
          }
        }
        if (KeyRadio() == Key0 && flagVork == 1) //Key0 //если кнопка НЕ нажата
        {
          flagVork = 0; //обнуляем переменную "knopka"
        }
        if (regimMemor == 1) //первый режим  ось Х
        {
          digitalWrite(Xled, flash());//мигаем светодиодом X
          Memor = false;
          memoryX(); // запись в переменную
        }
        if (regimMemor == 2) //второй режим ось Y
        {
          digitalWrite(Yled, flash()); // мигаем светодиодом Y
          Memor = false;
          memoryY();
        }
        if (regimMemor == 3) //третий режим ось Z
        {
          digitalWrite(Zled, flash()); // мигаем светодиодом Z
          Memor = false;
          memoryZ();
        }
        if (regimMemor == 4) //четвертый режим переходим в рабочий режим
        {
          Memor = true;
        }
      }

      // кнопки аналоговые
      val_4 = analogRead(BUTON), val_3 = map(val_3, 0, 1024, 192, 255);
      joystick[3] = val_4;

      radio.write( joystick, sizeof(joystick) );
    }


    int KeyRadio()
    {
      analogRead(BUTON);
      if (radioBut > 1000) return Key0;
      //if (radioBut < 50)   return Key1;
      //if (radioBut < 250)  return Key2;
      if (radioBut > 450)  return Key3;
      if (radioBut > 650)  return KeyWork;
      if (radioBut > 850)  return KeyAuto;
      return Key0;
    }

    int flash()
    {
      currentTime = millis();
      if (currentTime - previousMillis >= interval)
      {
        // save the last time you blinked the LED
        previousMillis = currentTime;
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;
      }
    }


    //////////////////////////////////////////////////////////////
    void work()
    {
      if (digitalRead(Xbutton) == HIGH && flagX == 0) //если кнопка нажата и перемення flag равна 0 , то ...
      {
        regimX++;
        flagX = 1;
        if (regimX > 1) //ограничим количество режимов
        {
          regimX = 0;
        }
      }
      if (digitalRead(Xbutton) == LOW && flagX == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
      {
        flagX = 0; //обнуляем переменную flag
      }
      if (regimX == 0) //первый режим, режим джойстика
      {
        digitalWrite(Xled, LOW); //выключаем светодиод
        val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63);
        joystick[0] = val_1;
      }
      if (regimX == 1) //второй режим, режим потенциометрa
      {
        digitalWrite(Xled, HIGH); //включаем  светодиод
        val_1 = analogRead(POT_X), val_1 = map(val_1, 0, 1024, 0, 63);
        joystick[0] = val_1;
      }

      // ось Y
      if (digitalRead(Ybutton) == HIGH && flagY == 0) //если кнопка нажата и перемення flag равна 0 , то ...
      {
        regimY++;
        flagY = 1;
        if (regimY > 1) //ограничим количество режимов
        {
          regimY = 0;
        }
      }
      if (digitalRead(Ybutton) == LOW && flagY == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
      {
        flagY = 0; //обнуляем переменную flag
      }
      if (regimY == 0) //первый режим, режим джойстика
      {
        digitalWrite(Yled, LOW); //выключаем светодиод
        val_2 = analogRead(JOYSTICK_Y), val_2 = map(val_2, 0, 1024, 64, 127);
        joystick[1] = val_2;
      }
      if (regimY == 1) //второй режим, режим потенциометрa
      {
        digitalWrite(Yled, HIGH); //включаем светодиод
        val_2 = analogRead(POT_Y), val_2 = map(val_2, 0, 1024, 64, 127);
        joystick[1] = val_2;
      }

      // ось Z
      if (digitalRead(Zbutton) == HIGH && flagZ == 0) //если кнопка нажата и перемення flag равна 0 , то ...
      {
        regimZ++;
        flagZ = 1;
        if (regimZ > 1) //ограничим количество режимов
        {
          regimZ = 0;
        }
      }
      if (digitalRead(Zbutton) == LOW && flagZ == 1) //если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
      {
        flagZ = 0; //обнуляем переменную flag
      }
      if (regimZ == 0) //первый режим режим джойстика
      {
        digitalWrite(Zled, LOW); //выключаем светодиод
        val_3 = analogRead(JOYSTICK_Z), val_3 = map(val_3, 0, 1024, 128, 191);
        joystick[2] = val_3;
      }
      if (regimZ == 1) //второй режим режим потенциометрa
      {
        digitalWrite(Zled, HIGH); //включаем светодиод
        val_3 = analogRead(POT_Z), val_3 = map(val_3, 0, 1024, 128, 191);
        joystick[2] = val_3;
      }
    }

    //____________________Запись_________________//
    void memoryX()
    {
      if (Memor == false)// Прерываем рабочий режим
      {
        currentTime = millis();  // считываем время, прошедшее с момента запуска программы
        digitalWrite(ledMemory, HIGH);
        // ось Х
        val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63);
        joystick[0] = val_1;// передаем данные
        if (val_1 > 85 && val_1 < 95) // шевельнули джойстик
        {
          val_1 = maxVolX , maxVolX = map(maxVolX, 0, 1024, 0, 63); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX;
          TimeX = currentTime;// записываем новое значение
        }
      }
    }

    void memoryY()
    {
      if (Memor == false)
      {
        currentTime = millis();  // считываем время, прошедшее с момента запуска программы
        digitalWrite(ledMemory, HIGH);
        // ось Y
        val_2 = analogRead(JOYSTICK_Y), val_2 = map(val_2, 0, 1024, 64, 127);
        joystick[1] = val_2;
        if (val_2 > 85 && val_2 < 95) // шевельнули джойстик
        {
          val_2 = maxVolY , maxVolY = map(maxVolY, 0, 1024, 64, 127); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX;
          TimeY = currentTime;// записываем новое значение
        }
      }
    }

    void memoryZ()
    {
      if (Memor == false)
      {
        currentTime = millis();  // считываем время, прошедшее с момента запуска программы
        digitalWrite(ledMemory, HIGH);
        // ось Z
        val_3 = analogRead(JOYSTICK_Z), val_3 = map(val_3, 0, 1024, 128, 191);
        joystick[2] = val_3;
        if (val_3 > 85 && val_3 < 95) // шевельнули джойстик
        {
          val_3 = maxVolY , maxVolZ = map(maxVolZ, 0, 1024, 128, 191);
          TimeZ = currentTime;
        }
      }
    }

    void AutoStart()
    {
      digitalWrite(ledMemory, flash());
      regimX = 0;
      regimY = 0;
      regimZ = 0;
      if (currentTime <= (TimeX )) // сравниваем текущий таймер с константой TimeX
      {
        joystick[0] = maxVolX;
      }
      if (currentTime <= (TimeY ))
      {
        joystick[1] = maxVolY;
      }
      if (currentTime <= (TimeY ))
      {
        joystick[3] = maxVolZ;
      }
    }
     
     
    Последнее редактирование: 19 май 2016
  7. sashok

    sashok Нерд

    Что то я не пойму какая из этих переменных будет сохранять максимальный уровень отклонения стика? И что произойдет если я отпущу стик переменная поменяет свое значение?
     
  8. ostrov

    ostrov Гуру

    Макксимальная будет в maxVol до тех пор, пока его не обнулят. Когда обнулят зависит от вас.
     
  9. sashok

    sashok Нерд

    Спасибо! Посмотрите в моем случае правильно сделал? Железо просто еще жду в пути. Проверить не на чем.
    vol заменил на volumX
    analogRead(A0) у меня уже в val_1;
    maxVol = max(vol, maxVol); заменил на maxVolX = max(volumX, maxVolX);
    Код (C++):
    void loop() {
      // put your main code here, to run repeatedly:

    }
    void memoryX()
    {
      if (Memor == false)// Прерываем рабочий режим
      {
        currentTime = millis();  // считываем время, прошедшее с момента запуска программы
        digitalWrite(ledMemory, HIGH);
        // ось Х
        val_1 = analogRead(JOYSTICK_X), val_1 = map(val_1, 0, 1024, 0, 63);
        joystick[0] = val_1;// передаем данные
        if (val_1 > 85 && val_1 < 95) // шевельнули джойстик
        {
          volumX =  val_1;
          maxVolX = max(volumX, maxVolX);
          maxVolX = map(maxVolX, 0, 1024, 0, 63); // Будем передавать в режиме запуска автомата joystick[0] = maxVolX;
          TimeX = currentTime;// записываем новое значение
        }
      }
    }
     
  10. sashok

    sashok Нерд

    И еще один вопрос возник объясните пожалуйста что происходит в этой строке Что означает ? и :
    Код (C++):
    digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
     
    Последнее редактирование: 21 май 2016
  11. ostrov

    ostrov Гуру

    Я бы записал это короче и понятнее:
    Код (C++):
    output=!output;
    digitalWrite(13, output);
    тоже самое.
     
  12. ZAZ-965

    ZAZ-965 Гуру

  13. sashok

    sashok Нерд

  14. ZAZ-965

    ZAZ-965 Гуру

    В данном случае да. В общем - однострочная запись if-then-else.
     
  15. sashok

    sashok Нерд

    :) Да теперь то понятнее стало:) Для новичка
     
  16. ZAZ-965

    ZAZ-965 Гуру

    Код (C++):

    //Запись
    output==HIGH ? output=LOW : output=HIGH
    //читается как
    if (output==HIGH)        
          output=LOW;
    else
          output=HIGH;
     
  17. ostrov

    ostrov Гуру

    Тогда уж можно так:
    Код (C++):
    output = !output;
     
    Volk65 нравится это.
  18. sashok

    sashok Нерд

    Спасибо! Значит правильно я понял.