TurBan Napisano Luty 4, 2019 Udostępnij Napisano Luty 4, 2019 (edytowany) Witam Otóż rzecz polega na tym, że (prawdopodobnie) w programie odbiornika, w void loop, mam błędnie sformułowane instrukcje do komendy stopp. Problem jaki mam, to gdy pchnę joystick np. do przodu to gdy go puszczę, żeby powrócił do pozycji zero, to silniki kręcą się dalej w tym kierunku , którym był ostatnio wysyłany sygnał, tylko, że wolniej (tak jakby Arduino nie wiedziało co ma zrobić dla pozycji zerowej joysticka).Problem na pewno leży w programie, bo w ramach testu ustawiłem w "void forward" wszystkie silniki na LOW i kiedy pchnąłem joystick do przodu to koła się zatrzymały. Może to chodzi o to, że w kodzie nadajnika nie ma val pod stop stworzonego? Ps. Jazda w przód, tył lewo, prawo działa bez zarzutu, tylko zatrzymanie kół nie działa. Nadajnik #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int potpin_1 = A0; // VRy z modułu joysticka int val_1; int potpin_2 = A1; // VRx z modułu joysticka int val_2; void setup(void){ radio.begin(); radio.openWritingPipe(pipe); } void loop() { //przypisanie wysyłanej informacji odpowiednim wychyleniom potencjometrów val_1 = analogRead(potpin_1); val_1 = map(val_1, 0, 1023, 71, 170); msg[0] = val_1; radio.write(msg, 1); val_2 = analogRead(potpin_2); val_2 = map(val_2, 0, 1023, 1, 70); msg[0] = val_2; radio.write(msg, 1); } Odbiornik #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int data; int pos; int sspeed; // prędkość const int ena = 5; // PWM pin do zmiany prędkości //silnik-lewy tył const int in1t = 4; const int in2t = 2; //silnik-prawy tył const int in12t = 8; const int in22t = 7; void setup() { pinMode(ena, OUTPUT); pinMode(in1t, OUTPUT); pinMode(in2t, OUTPUT); pinMode(in12t, OUTPUT); pinMode(in22t, OUTPUT); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop() //przypisanie odbieranym sygnałom odpowiednich czynności { if (radio.available())radio.read(msg, 1); if (msg[0] >0 && msg[0] <30){data = msg[0]; sspeed = map(data, 0, 30, 255, 50); right(sspeed);} if (msg[0] >40 && msg[0] <70){data = msg[0]; sspeed = map(data, 700, 40, 255, 50); left(sspeed);} if (msg[0] >70 && msg[0] <115){data = msg[0]; sspeed = map(data, 71, 115, 255, 50); backward(sspeed);} if (msg[0] >125 && msg[0] <170){data = msg[0]; sspeed = map(data, 170, 124, 255, 50); forward(sspeed);} if ((msg[0] >=115 && msg[0] <=125)&&(msg[0] >=30 && msg[0] <=40)){data = msg[0]; stopp(); } } void stopp() { analogWrite(ena, 0); digitalWrite(in1t, LOW); digitalWrite(in2t, LOW); digitalWrite(in12t, LOW); digitalWrite(in22t, LOW); } void forward(int sspeed) //jazda w przód { digitalWrite(in1t, HIGH); digitalWrite(in12t, HIGH); digitalWrite(in2t, LOW); digitalWrite(in22t, LOW); analogWrite(ena, sspeed); } void backward(int sspeed) //jazda w tył { digitalWrite(in1t, LOW); digitalWrite(in12t, LOW); digitalWrite(in2t, HIGH); digitalWrite(in22t, HIGH); analogWrite(ena, sspeed); } void left(int sspeed) // prawe silniki do przodu, a lewe do tyłu { digitalWrite(in1t, LOW); digitalWrite(in12t, HIGH); digitalWrite(in2t, HIGH); digitalWrite(in22t, LOW); analogWrite(ena, sspeed); } void right(int sspeed) // lewe silniki do przodu, a prawe do tyłu { digitalWrite(in1t, HIGH); digitalWrite(in12t, LOW); digitalWrite(in2t, LOW); digitalWrite(in22t, HIGH); analogWrite(ena, sspeed); } Z góry dzięki 😄 Edytowano Luty 4, 2019 przez TurBan Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 5, 2019 Udostępnij Luty 5, 2019 @TurBan, nie będę ukrywał - dość ciężko przeanalizować Twój program. Warto popracować nad formatowanie, ale coś tam chyba z niego zrozumiałem. Jeśli dobrze widzę, to w pozycji neutralnej joysticka wysyłasz na zmianę sygnały ~50 dla osi X i ~35 dla osi Y. Zgadza się? Ten warunek jest raczej zły: if ((msg[0] >=115 && msg[0] <=125)&&(msg[0] >=30 && msg[0] <=40)){data = msg[0]; stopp(); } Po pierwsze, sformatujmy go jakoś sensownie: if ((msg[0] >= 115 && msg[0] <= 125) && (msg[0] >= 30 && msg[0] <= 40)) { data = msg[0]; stopp(); } I teraz powiedz mi jak jakaś liczba może mieścić się w zakresie od 115 do 125 oraz jednocześnie w zakresie od 30 do 40? Nie pomyliłeś się w tym warunku, nie miało tu być przypadkiem LUB zamiast I? 1 Cytuj Link do komentarza Share on other sites More sharing options...
TurBan Luty 5, 2019 Autor tematu Udostępnij Luty 5, 2019 Treker dzięki wielkie !!! Wystarczyło tylko wstawić || zamiast && i tygodniowy problem rozwiązany !!! 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!