Независимый поток данных от энкодера

Тема в разделе "Arduino & Shields", создана пользователем Константин_Ли, 24 июн 2019.

Метки:
  1. репа на гитхабе , но тут не принципиально, её взял чтобы просто проверить правильно ли была реализована работа с энкодером раньше, принцип работы там простейший.
     
  2. Понял, буду знать, сейчас сделаю без его либы
     
  3. Убрал библиотеку от автора с плохой репутацией.
    Код (C++):
    #include <Button.h>

    #include <TinyGPS++.h> //gps libraries
    #include <SoftwareSerial.h>

    #include <Cotsp.h>

    Button BL(8);  //L
    Button BS(9);  //S
    Button BR(10); //R

    #define DIR 5
    #define PWM 6

    #define CLK 3
    #define DT 2

    //gps objs
    static const int RXPin = 12, TXPin = 11;
    static const uint32_t GPSBaud = 9600;
    TinyGPSPlus gps;
    SoftwareSerial ss(RXPin, TXPin);

    Cotsp cotsp;

    bool dr = true;
    int rp = 0; int heading;
    int rotation, value;

    bool FS = true;
    bool mode = true;

    bool onSunrise = false;

    static void updateGps() {
      while (ss.available())
        gps.encode(ss.read());
    }

    static void updateEnc() {
      value = digitalRead(CLK);
      if (value != rotation) {
        if (digitalRead(DT) != value) {
          rp ++;
        } else {
          rp--;
        }
        Serial.print("Encoder: ");
        Serial.println(rp);
      }
      rotation = value;
      heading = rp / 173.81;
    }

    static void smartDelay(unsigned long ms) {
      unsigned long start = millis();
      do {
        updateGps();
      } while (millis() - start < ms);
    }

    static void printInf() {
      /*
        if (mode)
        Serial.println("Mode: following");
        else
        Serial.println("Mode: returning");
        Serial.println("Year: " + String(int(gps.date.year())) + "; month: " + String(int(gps.date.month())) + "; day: " + String(int(gps.date.day())) + "; hour: " + String(gps.time.hour()) + "; minute: " + String(gps.time.minute()) + "; hour.minute: " + String(gps.time.hour() + gps.time.minute() / 60.));
        Serial.println("Your coordinates: " + String( gps.location.lat()) + " " + String( gps.location.lng()));
        Serial.println("Azimuth (degrees): " + String(cotsp.azimuth));
        Serial.println("Altitude (degrees): " + String(cotsp.altitude));
        Serial.println("Sunset Time: " + String(cotsp.SunsetTime));
        Serial.println("Sunrise Time: " + String(cotsp.SunriseTime));
        Serial.println("Sunset azimuth: " + String(cotsp.SunsetAzimuth));
        Serial.println("Sunrise azimuth: " + String(cotsp.SunriseAzimuth));
        if (dr)
        Serial.println("Direction: right");
        else
        Serial.println("Direction: left");*/

      Serial.println("Heading: " + String(heading) + "; RP: " + String(rp));

    }

    static void RR() {
      dr = true;
      digitalWrite(DIR, HIGH);
      digitalWrite(PWM, LOW);
    }
    static void RL() {
      dr = false;
      digitalWrite(DIR, LOW);
      digitalWrite(PWM, HIGH);
    }
    static void SR() {
      digitalWrite(DIR, HIGH);
      digitalWrite(PWM, HIGH);
      while (!checkGPS()) {
        Serial.println("satellite search..");
        smartDelay(1000);
      }

      while (ss.available())
        gps.encode(ss.read());

      cotsp.UpdateSunCoordinates(gps.date.year(), gps.date.month(), gps.date.day(), gps.location.lat(), gps.location.lng(), gps.time.hour() + (gps.time.minute() / 60.));

    }

    static bool checkGPS() {
      if (gps.charsProcessed() < 10)
        return false;
      return true;
    }

    static bool sw(double phi, double destphi) {
      double delta = destphi - phi;
      if (0 <= delta and delta <= 180 or - 360 <= delta and delta <= -180) {
        return true; //R
      }
      else {
        return false; //L
      }
    }

    void following() {
      updateEnc();

      if (FS) {
        cotsp.UpdateSunsetCoordinates(gps.date.year(), gps.date.month(), gps.date.day(), gps.location.lat(), gps.location.lng(), gps.time.hour() + (gps.time.minute() / 60.));
        cotsp.UpdateSunriseCoordinates(gps.date.year(), gps.date.month(), gps.date.day(), gps.location.lat(), gps.location.lng(), gps.time.hour() + (gps.time.minute() / 60.));
        FS = false;
      }
      cotsp.azimuth = 90;
      dr = sw(heading, cotsp.azimuth);

      if (heading == int(cotsp.azimuth)) {
        SR();
        //mode = false;
      }
      else if (dr) {
        RR();
      }
      else {
        RL();
      }

      if (cotsp.SunsetTime <= gps.time.hour() + (gps.time.minute() / 60.)) {
        SR();
        mode = false;
      }

      printInf();
    }

    void returning() {
      if (onSunrise) {
        if (cotsp.SunriseTime <= (gps.time.hour() + (gps.time.minute() / 60.)))
          mode = true;
        smartDelay(1000);
      }
      else {
        updateEnc();

        dr = sw(heading, cotsp.SunriseAzimuth);

        if (heading == int(cotsp.SunriseAzimuth)) {
          SR();
          onSunrise = true;
        }
        else if (dr) {
          RR();
        }
        else {
          RL();
        }
      }

      printInf();
    }

    void setup() {
      Serial.begin(9600);
      Serial.println("start");

      ss.begin(GPSBaud);

      BL.begin(); BS.begin(); BR.begin();

      pinMode(DIR, OUTPUT);
      pinMode(PWM, OUTPUT);

      attachInterrupt(0, updateEnc, CHANGE);
    }

    void loop() {
      if (BL.pressed()) {
        Serial.println("Rotate left");
        while (!BL.pressed()) {
          updateEnc();
          RL();
          Serial.println(String(heading) + "; " + String(rp));
        }
        Serial.println("Stop rotate left");
        SR();
      }

      if (BR.pressed()) {
        Serial.println("Rotate right");
        while (!BR.pressed()) {
          updateEnc();
          RR();
          Serial.println(String(heading) + "; " + String(rp));
        }
        Serial.println("Stop rotate right");
        SR();
      }

      if (BS.pressed()) {
        while (!checkGPS()) {
          Serial.println("satellite search..");
          smartDelay(1000);
        }
        Serial.println("BS");
        while (!BS.pressed()) {
          if (mode) {
            following();
          }
          else {
            returning();
          }
        }
        SR();
        delay(100); //without this delay serial port for some reason does not work
        Serial.println("Stop rotate following");
      }
    }
     
  4. b707

    b707 Гуру

    заглянул, у него в либе таймаут - щелчок не чаще раз в 50мс. Можете попробовать уменьшить, но лучше тврениями Гайвера вообще не пользоваться
     
  5. b707

    b707 Гуру

    стало лучше?
     
  6. он на валу мотора, для подавления дребезга используется триггер шмитта. И он используется для получения информации о положение вала мотора. Скорость обращение постоянная, около двух оборотов в минуту.
     
  7. сейчас не на рабочем месте, завтра протестирую и отпишусь
     
  8. parovoZZ

    parovoZZ Гуру

    и как же он борется?
    Вообще, кроме как энкодером, возможно измерить действительные обороты вала двигателя?
     
  9. b707

    b707 Гуру

    А вот тут я думаю вы ошибаетесь.
    Про определение положения вала ТС нигде не писал. Понятно, что энкодер KY-040 для этого не подходит, но проблема совсем не в этом.
    А проблема у ТС в том, что при опросе GPS и без него он получает разные данные с энкодера. Об этом написано в первом сообщении.
     
  10. parovoZZ

    parovoZZ Гуру

     
  11. b707

    b707 Гуру

    parovoZZ,
    KY-040 - не абсолютный энкодер
    обычный механический инкрементальный. один из самых трешевых
     
  12. parovoZZ

    parovoZZ Гуру

    также верно утверждение, что абсолютный энкодер - это точно не KY-040. Т.е. у ТС либо абсолютный энкодер, либо KY-040. Почему-то все решили, что именно последнее верно. Почему?
     
  13. parovoZZ

    parovoZZ Гуру

    ну он же не пишет, какой именно у него энкодер?
     
  14. parovoZZ

    parovoZZ Гуру

    механический??? На вал двигателя???
     
  15. parovoZZ

    parovoZZ Гуру

    несогласия нет, но и согласия тоже.
     
  16. parovoZZ

    parovoZZ Гуру

    это в вашей среде нелогично, потому как она гетерогенная. Я живу в гомогенной среде и что происходит в среде гетерогенной мне индифферентно. Это и есть то состояние, в существование которого вы не верите.
     
  17. DetSimen

    DetSimen Спамовредитель Модератор

    Лично я - гетеросексуал. Так и жыву.
     
  18. parovoZZ

    parovoZZ Гуру

    вот у них и спрашивайте. Я к ним себя не причисляю.
     
  19. parovoZZ

    parovoZZ Гуру

    Я и бутылка)) И таких в толпе множество((
     
  20. b707

    b707 Гуру

    Вообще-то логично было бы наоборот - тот, кто живет в гомогенной среде - даже не подозревает о существовании других вероятностей :)
    Ты гетерогенный с гомогенным не спутал?