michcioh Napisano Listopad 30, 2019 Udostępnij Napisano Listopad 30, 2019 Cześć, tworzę od dłuższego czasu model samochodu zdalnie sterowanego. Niestety napotkałem na ścianę, której nie umiem rozbroić 🙂 mówiąc krótko: Arduino UNO (wersja "nieoryginalna") wiesza mi się co poznaje po wypisaniu niepełnej linijki instrukcji Serial.print oraz braku migania diody RX. Dodatkowo silniczki, które powinny reagować na zmiany wartości nie robią tego, nie reagują zgodnie z tym jak powinny być sterowane kodem - ewidentna zwiecha. Aby uwidocznić problem starałem się go uzyskać przy minimalnej ilości informacji potrzebnych do przekazania tutaj, eliminując kolejne rzeczy niemające wpływu na występowanie tego problemu z projektu. Zmieniałem też płytkę Arduino przy pełnym projekcie, by wykluczyć wadę tejże. Zachowywała się identycznie. I tak scenariusz uzyskuję gdy: arduino nie jest podłączone do żadnego kabla poza kablem USB do laptopa. Żaden z pinów nie ma przypiętego kabelka. Program wklejam poniżej: #include <VirtualWire.h> #define M_1A 9 #define M_1B 10 #define M_2A 5 #define M_2B 6 #define ANTENA 11 int speed = 0; void setup() { Serial.begin(9600); pinMode(M_1A, OUTPUT); pinMode(M_1B, OUTPUT); pinMode(M_2A, OUTPUT); pinMode(M_2B, OUTPUT); pinMode(ANTENA, INPUT); vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(100); // Bits per sec, default 2000 vw_set_rx_pin(ANTENA); vw_rx_start(); // LINIJKA X } void loop() { int del = 500; Serial.println("forward"); //recive(); speed = speed + 30 > 255 ? 255 : speed + 30; // increase speed by 30. Serial.print("Speed = "); // LINIJKA A1 Serial.println(speed); // LINIJKA A2 analogWrite(M_1A, speed); // LINIJKA B1 //digitalWrite(M_1A, HIGH); // LINIJKA B2 digitalWrite(M_1B, LOW); analogWrite(M_2A, speed); // LINIJKA C1 //digitalWrite(M_2A, HIGH); // LINIJKA C2 digitalWrite(M_2B, LOW); delay(del); } Przy takim kodzie, program pokazuje na konsoli COM5 napis "forwa" i następuje zwiecha. To się nie dzieje w alternatywnych sytuacjach gdy: 1) linijka X jest wygaszona (czyli nie uruchamiam modułu radiowego), ale komunikacja radiowa jest kluczowa w moim projekcie, 2) linijka X nie jest wygaszona, za to używam digitalWrite (linijka B2 i C2) zamiast analogWrite (linijki B1 i C1), ale chcę docelowo tymi pinami sterować prędkością silniczków (przez sterownik) 3) kod jest taki jak przeklejony wyżej, ale... zaraz przed ustawieniem wartości analogWrite NIE jest wypisywany tekst na Serialu: linijki A1 i A2 są wygaszone. Wtedy ma lekką przywiechę na początku z napisem "forwa" (sekunda?), a następnie dokańcza linijkę i dalej idzie gładko. Oczywiście mógłbym zrezygnować z używania Serial i liczyć, że wszystko będzie działać. Tylko dla mnie to cenne źródło informacji, nie mówiąc o tym, że kompletnie nie rozumiem co tu się dzieje. Proszę o pomoc w zrozumieniu, co tu się dzieje, dlaczego Arduino zachowuje się tak dla przypadków jak wyżej? Co mogę zmienić, by projekt działał bez problemu? Wszelkie propozycje lub pytania mile widziane: tak jak napisałem stoję z projektem, na którym bardzo mi zależy 🙂 Pozdrawiam serdecznie, Michał Link do komentarza Share on other sites More sharing options...
Gość Grudzień 1, 2019 Udostępnij Grudzień 1, 2019 Prawdopodobne powody: * nie przeczytałeś instrukcji obsługi od: arduino sprzęt/soft i.. spartoliłeś. używanych bibliotek i.. spartoliłeś. * brakuje konfiguracji w pliku VirtualWire_Config_h lub jest nieprawidłowa * lub/i masz konflikt inicjalizacji sprzętu -> zapewne chodzi o przypisanie timera. * zainstaluj bibliotekę radiohead bo virtualwire jest przestarzała. Jest jeszcze jedna możliwość: Nie chciało Ci się poszukać/poczytać i zamiast tego liczyłeś na takiego jelenia jak ja i.. znalazłeś ;D Gratuluje serdecznie, ja Link do komentarza Share on other sites More sharing options...
RFM Grudzień 1, 2019 Udostępnij Grudzień 1, 2019 7 godzin temu, michcioh napisał: 3) kod jest taki jak przeklejony wyżej, ale... zaraz przed ustawieniem wartości analogWrite NIE jest wypisywany tekst na Serialu: linijki A1 i A2 są wygaszone. Wtedy ma lekką przywiechę na początku z napisem "forwa" (sekunda?), a następnie dokańcza linijkę i dalej idzie gładko. Takie zachowanie oznacza, że zawieszane są przerwania albo w przerwaniu są długo wykonujące się funkcje. Bez debugera możesz długo szukać co konkretnie wywołuje problem z przerwaniami. Link do komentarza Share on other sites More sharing options...
michcioh Grudzień 1, 2019 Autor tematu Udostępnij Grudzień 1, 2019 Cześć ponownie, Rzeczywiście używałem starej, niewspieranej biblioteki. Zmieniłem ją na RadioHead, efekt niestety jest identyczny. Ponieważ Radiohead dla standardowej konfiguracji używa także pinu 10, zmieniłem używany przeze mnie uprzednio pin 10 na 3. Nie pomogło (poniżej kod). Zastosowałem funkcję millis zamiast delay - czy o to Ci chodziło @atMegaTona pisząc o przypisanie timera? To też nie pomogło. Efekt jest identyczny jak w pierwszym kodzie, który tu przeklejałem. Nie szukam jeleni. Szukam pomocy, jeśli czegoś konkretnego nie doczytałem - napisz czego, doczytam, ale mam wrażenie, że założyłeś, że nic nie czytałem 🙂 A to prawdą nie jest. Więc jeśli coś spartoliłem, to co? Pozdrawiam serdecznie z prośbą o dalszą, niezbędną mi, merytoryczną pomoc 😉 #include <RH_ASK.h> #ifdef RH_HAVE_HARDWARE_SPI #include <SPI.h> // Not actually used but needed to compile #endif #define M_1A 9 #define M_1B 3 #define M_2A 5 #define M_2B 6 int speed = 0; int vDelay = 500; unsigned long vTime = 0; RH_ASK driver; void setup() { Serial.begin(9600); // Debugging only if (!driver.init()) Serial.println("init failed"); else Serial.println("init OK"); pinMode(M_1A, OUTPUT); pinMode(M_1B, OUTPUT); pinMode(M_2A, OUTPUT); pinMode(M_2B, OUTPUT); } void loop() { if (millis() - vTime >= vDelay) { Serial.println("forward"); speed = speed + 30 > 255 ? 255 : speed + 30; // increase speed by 30. //Serial.print("Speed = "); // LINIJKA A1 //Serial.println(speed); // LINIJKA A2 analogWrite(M_1A, speed); // LINIJKA B1 //digitalWrite(M_1A, HIGH); // LINIJKA B2 digitalWrite(M_1B, LOW); analogWrite(M_2A, speed); // LINIJKA C1 //digitalWrite(M_2A, HIGH); // LINIJKA C2 digitalWrite(M_2B, LOW); vTime = millis(); } } 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
Gość Grudzień 1, 2019 Udostępnij Grudzień 1, 2019 (edytowany) Nie znam arduino na pamięć i nie pamiętam jak to jest rozwiązane a gmerać w nim mi się nie chce. Tu masz link https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ Możesz spróbować zmienić rozdzielczość jak nie da rady to szukaj dalej, w instrukcjach znajdziesz. Tak czy inaczej masz jeszcze timer2 8bit do VW wystarczy. Możesz też nie używać analogWrite tylko ściągnij sobie jakąś zewnętrzną bibliotekę z gita do PWM. Ten plik konfiguracyjny masz w folderze z biblioteką, zmień przypisanie. Edytowano Grudzień 1, 2019 przez Gość Link do komentarza Share on other sites More sharing options...
michcioh Grudzień 1, 2019 Autor tematu Udostępnij Grudzień 1, 2019 Pół dnia spędzone na znalezieniu rozwiązania. A rozwiązaniem są rzeczywiście... timery. Trzeba było ustawić #define RH_ASK_ARDUINO_USE_TIMER2 w pliku RH_ASK.cpp. 2 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »