seba1412 Napisano Sierpień 27, 2018 Udostępnij Napisano Sierpień 27, 2018 (edytowany) 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 Sierpień 27, 2018 przez seba1412 umieszczenie kodu w polu do tego przeznaczonym Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 A czy piny SDA i SCL to nie są przypadkiem piny 4 i 5? Cytuj Link do komentarza Share on other sites More sharing options...
seba1412 Sierpień 28, 2018 Autor tematu Udostępnij Sierpień 28, 2018 Pin SCL - PC5, SDA - PC4, ja natomiast do generowania PWM uzywam pinu 5 ktory jest podpisany jako PD5. Tak mi się wydaje, że to różne piny. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 A możesz pokazać cały kod swojego programu? W szczególności tę funkcję, która właśnie ma ustawiać pin? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
seba1412 Sierpień 28, 2018 Autor tematu Udostępnij Sierpień 28, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 A co robi ustawPWM(keyToPWM(dane));? Cytuj Link do komentarza Share on other sites More sharing options...
seba1412 Sierpień 28, 2018 Autor tematu Udostępnij Sierpień 28, 2018 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? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 Bardziej podejrzanie mi wygląda bawienie się rejestrami timera, ale nie mam akurat pod ręką noty katalogowej, żeby to sprawdzić. A co jest podłączone do tego pinu i jak zasilasz to Arduino? Cytuj Link do komentarza Share on other sites More sharing options...
seba1412 Sierpień 28, 2018 Autor tematu Udostępnij Sierpień 28, 2018 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ę 😉 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Sierpień 28, 2018 Udostępnij Sierpień 28, 2018 Sprawdź też czy ten sam efekt występuje gdy odłączysz to, co masz na tym pinie podpięte. To może być problem z siadającym zasilaniem lub zakłóceniami. Cytuj Link do komentarza Share on other sites More sharing options...
seba1412 Sierpień 28, 2018 Autor tematu Udostępnij Sierpień 28, 2018 Dzięki za wskazówki, wszystko możliwe Cytuj Link do komentarza Share on other sites More sharing options...
seba1412 Sierpień 29, 2018 Autor tematu Udostępnij Sierpień 29, 2018 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ść. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!