• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zawieszanie się Arduino UNO
#1
Cześć,

tworzę od dłuższego czasu model samochodu zdalnie sterowanego. Niestety napotkałem na ścianę, której nie umiem rozbroić [Obrazek: 1f642.png] 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.

W ten sposób scenariusz problemu 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:

Kod:
#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

int vSpeed = 0;
int vDelay = 500;
unsigned long vTime = 0;
RH_ASK driver;

void setup() {
  Serial.begin(9600);

  bool initOk = false;
  initOk = driver.init(); // LINE X
 
  if (!initOk) {
    Serial.println("init failed");
  }
 
  pinMode(M_1A, OUTPUT);
  pinMode(M_1B, OUTPUT);
}

void loop() {
  if (millis() - vTime >= vDelay) {
    Serial.println("forward");
    vSpeed = vSpeed + 30 > 255 ? 255 : vSpeed + 30; // increase speed by 30.
   
    analogWrite(M_1A, vSpeed); // LINE A1
    //digitalWrite(M_1A, HIGH); // LINE A2
    digitalWrite(M_1B, LOW);
    vTime = millis();
  }
}


Przy takim kodzie, program pokazuje na konsoli COM5 napis "forwa" i następuje zwiecha. To się nie dzieje w dwóch alternatywnych sytuacjach:

1) gdy używam digitalWrite (linijka A2) zamiast analogWrite (linijki A1); chcę docelowo tymi pinami sterować prędkością silniczków (przez sterownik), więc to nie jest żadne rozwiązanie,
2) linia X inicjalizująca drivera jest wygaszona.

Jak dla mnie to jest tu jakiś konflikt jeśli chodzi o piny. Tylko obiekt RH_ASK nie korzysta z tego co wiem z pinów 9 i 3! Jeśli zamienię piny PWM 9 i 3 na 6 i 5 jest identycznie.

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 [Obrazek: 1f642.png]

Pozdrawiam serdecznie,
Michał
 
Odpowiedź
#2
(01-12-2019, 18:48)michcioh napisał(a): Jak dla mnie to jest tu jakiś konflikt jeśli chodzi o piny.
A jak dla mnie to z przerwaniami.
 
Odpowiedź
#3
(01-12-2019, 19:23)semi napisał(a):
(01-12-2019, 18:48)michcioh napisał(a): Jak dla mnie to jest tu jakiś konflikt jeśli chodzi o piny.
A jak dla mnie to z przerwaniami.

Naprowadź mnie proszę Smile siedzę i czytam co mogę... w jakim sensie z przerwaniami? Znam tylko przerwania, które można obsługiwać na impulsie portów 2,3, ale rozumiem, że chodzi o jakieś wewnętrzne przerwania? Jeśli za dużo tłumaczenia, możesz mi podesłać linka do jakiegoś artykułu, który otworzy mi oczy w czym może leżeć problem w moim przypadku?

Z góry dzięki Smile
 
Odpowiedź
#4
Już nie trzeba. Timery. Trzeba było ustawić #define RH_ASK_ARDUINO_USE_TIMER2 w pliku RH_ASK.cpp.

Pozdrawiam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości