Arduino Polska Forum

Pełna wersja: Sterowanie servo + DC bluetooth
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam

Jestem początkujący w temacie arduino.

Chciałbym sterować serwomechanizmem oraz silnikiem poprzez aplikacje bluetooth na androida typu Arduino Bluetooth Joystisk. Wiadomo o  co chodzi - samochód. Problem ma z przypisaniem osi x do sterowania serwem oraz osi y do sterowania silnikiem. Chodzi mi o płynną regulacje skrętu oraz prędkości. Chcę użyć do tego Arduino Nano.

Proszę o pomoc w temacie lub skierowanie do jakiegoś źródła na ten temat.
W kursie znajdziesz opis obsługi silników i serw: https://forbot.pl/blog/kursy , program może działać sensownie dopiero co najmniej po poznaniu millis(), ale nie zaczynaj od końca kursu bo nic nie zrozumiesz. Do komunikacji z BT przyda się jeszcze poznanie parsowania zmiennych i przykład z event dla UART (jest wbudowany w Arduino IDE), przykłady użycia znajdziesz też na tym forum.
Do komunikacji bluetooth używam modułu hc-05, komunikacja działa. Jak pisałem mam problem z przypisaniem wartości sygnału na konkretną oś. Kursy na tym forum przeglądam a bieżąco.
No to super, pokaż kod, opisz z czym masz w nim problem, jak się zachowuje samochód vs czego oczekujesz.
Więc musisz po prostu przypisać wartość sygnału na konkretną os, i tyle Smile
Mam nadzieję że zalapiesz sarkazm Wink
Sarkazm załapny Smile

Poniżej kod
Kod:
   #define enA 9
   #define in1 4
   #define in2 5
   #define enB 10
   #define in3 6
   #define in4 7
   int xAxis, yAxis;
   unsigned int  X = 0;
   unsigned int  Y = 0;
   int motorSpeedA = 0;
   int motorSpeedB = 0;
   void setup() {
     pinMode(enA, OUTPUT);
     pinMode(enB, OUTPUT);
     pinMode(in1, OUTPUT);
     pinMode(in2, OUTPUT);
     pinMode(in3, OUTPUT);
     pinMode(in4, OUTPUT);
     Serial.begin(38400); // komunikacja
   }
   void loop() {
     // stop
     X = 512; // 4;
     Y = 512; // 4;
     //
     while (Serial.available() >= 2) {
       X = Serial.read();
       delay(10);
       Y = Serial.read();
     }
     delay(10);
 
     yAxis = Y;//*4;
     // y tyl
     if (yAxis < 470) {
     
       // motor B tyl
       digitalWrite(in3, HIGH);
       digitalWrite(in4, LOW);
       // y map tyl
       motorSpeedA = map(yAxis, 470, 0, 0, 255);
       
     }
     else if (yAxis > 550) {

       // potor B przod
       digitalWrite(in3, LOW);
       digitalWrite(in4, HIGH);
       // y map przod
       motorSpeedB = map(yAxis, 550, 1023, 0, 255);
     }
     // stop
     else  {

       motorSpeedB = 0;
     }
   
 
     analogWrite(enA, motorSpeedA); // PWM serwo A
     analogWrite(enB, motorSpeedB); // PWM motor B
   }
Narazie nic się nie dzieje. Problem w tym że nie wiem jak przypisać wartości suwaka x do serwa (jeszcze nie ma w kodzie) i y do silnika. Aplikacja jak w załączniku.

[attachment=760]
Przekieruj całą komunikację z BT na serial monitor Arduino, dowiedz się co jest wysyłane  z joystika, jak często. Potem obmyśl jak obrobić te dane i przypisać je do zmiennych. Przykład jest m.in. tu: https://forum.arduinopolska.pl/watek-ser...nie-danych #2.
Więc zrobiłem tak jak poniżej:

[attachment=761]

Z tego co wychodzi to że nie zależnie którą oś przesunę to wyrzuca D jako ruch i S jako stop. Czyli wychodzi na to że aplikacja nie rozróżnia osi. Dla trzech przycisków jest ok bo kolejno B, B2, B3.
Wystarczyło przeczytać opis aplikacji, jest link do przykładowego szkicu na github. D to direction, a S to speed i to raczej chodzi o Twoje XY link. Niezależnie co robisz aplikacja wysyła w ustawionym interwale dane, tak by program w Arduino wiedział, że joy jest w zasięgu, inaczej zatrzymuje pojazd.
Witam

Trochę to zajęło ale temat zakończony powodzeniem. Dziękuje za pomoc.