Skocz do zawartości

Zawieszanie się Arduino UNO


michcioh

Pomocna odpowiedź

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

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

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

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

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

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 przez Anonim
Link do komentarza
Share on other sites

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.

  • Lubię! 2
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.