Skocz do zawartości

Błąd podczas uzywania biblioteki Adafruit_VL53L0X i setowaniu PINU


seba1412

Pomocna odpowiedź

Cześć wszystkim,

wydawało mi się, że jako osoba regularnie programująca na studiach w c++ nie przytrafi mi się taka sytuacja, a jednak...

Posiadam Arduino UNO oraz Win7.

Bawię się teraz czujnikiem odległości VL53L0X, pobrałem do niego gotową bibliotekę Adafruit_VL53L0X z Githuba, wypakowałem ją w folderze Arduino\libraries. Na początku chciałem sprawdzić czy czujnik nie jest uszkodzony oraz czy poprawnie wykonałem połączenia. Użyłem programu  testowego i wszystko działa poprawnie, czujnik podaje prawidłowe wartosci, następnie przeniosłem kod do mojego projektu i zaczęły się problemy.

Po 3 godzinach szukania błędów odkryłem że czujnik zawiesza się na jednej z metod, dokładnie tej:    

[linia 42] lox.rangingTest(&measure, true); // pass in 'true' to get debug data printout!

Po następnych 2 godzinach udało mi się ustalić kiedy tak się dzieje: zawsze gdy odkomentowuje linie ktora ustawia pin nr 5(wyjscie PWM) jako OUTPUT flow programu się zawiesza na wyżej wspomnianej metodzie. I nie mam zielonego pojecia dlaczego tak się dzieje. Przecież czujnik nie korzysta z tego pinu. Podłączyłem go do pinow SDA/SCL więc w jaki sposób wpływ może mieć na działanie kodu fakt czy ustawiam PIN5?? A to dopiero początek programowania, co jeśli w przyszłości będę potrzebował użyć innych pinów? Znów strace 5 godzin żeby się dowiedzieć że problemem jest uzycie pinu ktory przeciez po to jest na płytce??

Czy znacie możliwe przyczyny takiego dziwnego zachowania? Za wszelkie sugestie będę bardzo wdzięczny, moje pomysły się skonczyły, poniżej wklejam kod, może ktoś mi coś doradzi:

#include <Adafruit_VL53L0X.h>

#include <Keypad.h>

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

#define PWM_PIN 5

void setup() {
  Serial.begin(9600);
  Serial.println("A");
  if (!lox.begin()) {
    Serial.println(F("Failed to boot VL53L0X"));
    while (1);
  }
  Serial.println("B");
  //  configurePWM_Environment();
  pinMode(PWM_PIN, OUTPUT);
  TCCR0B = TCCR0B & B11111000 | B00000011;    // set timer 0 divisor to    64 for PWM frequency of   976.56 Hz (The DEFAULT) pin5, pin6
  Serial.println("C");
}

void loop() {
  Serial.println("D");
  VL53L0X_RangingMeasurementData_t measure;
  Keypad klawiatura = getKeypad();
  unsigned long aktualnyCzas;
  char dane = 'x';
  char klawisz;
  int dystans = -1;

  while (true) {
    Serial.println("E");
    aktualnyCzas = millis();
    klawisz = klawiatura.getKey();
    Serial.println("F");
    if (klawisz && klawisz != dane) {
      dane = klawisz;
    }
    Serial.println("G");

    lox.rangingTest(&measure, true); // pass in 'true' to get debug data printout!
    Serial.println("H");

    if (measure.RangeStatus != 4) {  // phase failures have incorrect data
      Serial.println("I");

      Serial.print("Distance (mm): ");
      Serial.println(measure.RangeMilliMeter);
    } else {
      Serial.println(" out of range ");
    }
    Serial.println("J");

    ustawPWM(keyToPWM(dane));
    Serial.println("K");

    Serial.println(dystans);
    delay(1000);
    Serial.println("L");

  }
}

 

Edytowano przez seba1412
umieszczenie kodu w polu do tego przeznaczonym
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Fragment kodu który ustawia PIN PWM znajduje się pomiędzy dwiema linijkami kodu:

Serial.println("B");  a  Serial.println("C");.

Zakomentowana funkcja zawiera w sobie 2 linie kodu ktore są widoczne pod nią, dlatego narazie jest niepotrzebna. Gdy zakomentuje linie: pinMode(PWM_PIN, OUTPUT); czujnik odleglosci zaczyna dzialac ale ja potrzebuje pwm na pinie 5 poniewaz dostarcza mi czestotliwosc jakiej potrzebuje.

Link do komentarza
Share on other sites

Ta metoda nie ma wplywu na działanie, zakomentowałem ją a i tak czujnik nie zadzialal poprawnie. Caly problem dzieje się wtedy gdy uzywam polecenia pinMode(PWM_PIN, OUTPUT);

Po jego uzyciu nie dostaje danych z czujnika. Czy ten pin moze jakos wplywac na polaczenie z czujnikiem?

 

Link do komentarza
Share on other sites

Hmm, jak wrócę z pracy do domu postaram się usunąć ustawianie rejstrów(ustawiana jest i tak domyślna wartosć). Może to coś pomoże, jeśli nadal będę miał problemy to się odezwę 😉

Link do komentarza
Share on other sites

Mam pytanie... ponieważ domyślam się, że docelowo chcesz osiągnąć zależność częstotliwości na pinie 5 od odległości - dlaczego nie użyjesz po prostu tone()? Bawienie się timerem 0 to proszenie się o kłopoty.

 

Link do komentarza
Share on other sites

Dziś rano poprawiłem połączenie z portu pwm, koncepcja zgodnie z którą zostało wykonane była już nieaktualna więc mozna powiedzieć że samo połączenie również. Teraz silnik podłączony jest poprawnie i czujnik również działa poprawnie przy włączonym pwm'ie 🙂

Dzięki za pomoc!

Dnia 28.08.2018 o 10:50, ethanak napisał:

Mam pytanie... ponieważ domyślam się, że docelowo chcesz osiągnąć zależność częstotliwości na pinie 5 od odległości - dlaczego nie użyjesz po prostu tone()? Bawienie się timerem 0 to proszenie się o kłopoty.

 

Zgadza się, mam w planach zaimplementować regulator PI do sterowania silnikiem gdzie wysokość obiektu jest mierzona  przez czujnik.

A co robi  funkcja tone()? Poprzez bawienie się timerem0 rozumiesz ustawianie rejestrów które wykonuje w kodzie, tak?

Częstotliwość sygnału PWM musi u mnie być stała, zmieniam obroty silnika poprzez zmianę wypełnienia, czyli dość standardowo. Czy za pomocą tone() mogę zmieniać wypełnienie? Bo z tego co zdążyłem poczytać na pewno można częstotliwość. 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.