Skocz do zawartości

Arduino sterowanie za pomocą sygnału PWM innym urządzeniem


Rak_Rakoski

Pomocna odpowiedź

Witam serdecznie forumowiczów, tak jak w temacie chcę sterować kontrolerem lotu nazą-m v2, włącznikiem led'ów i przełącznikiem sygnałów z kamer fpv za pomocą Arduino nano  z powodu braku kanałów w aparaturze rc. Problem polega na tym, że Arduino normalnie steruje nazą ale z włącznikiem led'ów i przełącznikiem fpv już sobie nie radzi. Urządzenia podłączone do pinów PWM.

Skrypt:

int kat = 0;
int potencjometr = 0;
int przelacznikLED = 0;
int przelacznik0 = 0;
int przelacznikL = 0;

int Przelacznik1 = 0;
int Przelacznik2 = 0;
int Przelacznik3 = 0;

int swiatla = 0;
int gimbal = 0;
int trybLotu = 0;

void setup() 
{ 
// Wejścia z odbiornika
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
  
// Wyjścia PWM
  pinMode(3, OUTPUT); // LED
  pinMode(5, OUTPUT); //PRZEŁACZNIK KAMER
  pinMode(6, OUTPUT); //--------- nie przypisane
  pinMode(9, OUTPUT); // GIMBAL
  pinMode(10, OUTPUT); // TRYB LOTU
  pinMode(11, OUTPUT); //------------- nie przypisane
  Serial.begin(9600);

}

void loop() 
{
  potencjometr = pulseIn(A1, HIGH);
  przelacznikLED = pulseIn(A0, HIGH);
  przelacznik0 = pulseIn(A0, HIGH);
  przelacznikL = pulseIn(A0, HIGH);
  Przelacznik1 = pulseIn(A0, HIGH);
  Przelacznik2 = pulseIn(A0, HIGH);
  Przelacznik3 = pulseIn(A0, HIGH);
  
  Serial.println(potencjometr);
  Serial.println(przelacznikLED);
 
// Sterowanie LED 
  if (potencjometr >= 980 && potencjometr <= 1180)
  {
    if (przelacznikLED >= 1170 && przelacznikLED <= 1380)
    {
      Serial.println("Światła off");
      swiatla = 1;
      analogWrite(3, 0);
    }
    else if (przelacznikLED >= 1470 && przelacznikLED <= 1830)
    {
      Serial.println("Światła on");
      swiatla = 2;
      analogWrite(3, 127);
    }
    else if (przelacznikLED >= 1830)
    {
      Serial.println("Światła mrugajace");
      swiatla = 3;
      analogWrite(3, 255);
    }
  }
  // Sterowanie gimbalem
  else if (potencjometr >= 1190 && potencjometr <= 1370)
  {
     if (przelacznik0 >= 1170 && przelacznik0 <= 1380)
    {
      Serial.println("Gimbal w górę");
      gimbal = 1;
    }
    if (przelacznik0 >= 1480 && przelacznik0 <= 1830)
    {
      Serial.println("Gimbal stop");
      gimbal = 2;
    }
    if (przelacznik0 >= 1840)
    {
      Serial.println("Gimbal w dół");
      gimbal = 3;
    }
  }
 // Sterowanie trybem lotu
  else if (potencjometr >= 1390 && potencjometr <= 1570)
  {
    if (przelacznikL >= 1170 && przelacznikL <= 1380)
    {
     Serial.println("Tryb lotu 1");
     trybLotu = 1;
     analogWrite(10, 150);
    }
    if (przelacznikL >= 1480 && przelacznikL <= 1830)
    {
      Serial.println("Tryb lotu 2");
      trybLotu = 2;
       analogWrite(10, 127);
    }
    if (przelacznikL >= 1840)
    {
      Serial.println("Tryb lotu 3");
      trybLotu = 3;
      analogWrite(10, 255);
    }
  }
  
 //------------------------------------------------------------------------------
 // Przełącznik kamer
  if (potencjometr >= 1590 && potencjometr <= 1770)
  {
    if (Przelacznik1 >= 1165 && Przelacznik1 <= 1380) // przód
    {
      analogWrite(5, 0);
      Serial.println("kamera 1");
    }
    else if (Przelacznik1 >= 1470 && Przelacznik1 <= 1830) // tył
    {
      analogWrite(5, 127);
      Serial.println("kamera 2");
    }
    else if (Przelacznik1 >= 1820) // film
    {
      analogWrite(5, 255);
      Serial.println("kamera 3");
    }
  }
 /* // NIEPRZYPISANY   dwie pozycje dla dodatkowych funckji
  else if (potencjometr >= 1790 && potencjometr <= 1960)
  {
     if (przelacznik2 >= 1180 && przelacznik2 <= 1380)
    {
     
    }
    if (przelacznik2 >= 1480 && przelacznik2 <= 1830)
    {
      
    }
    if (przelacznik2 >= 1840)
    {
      
    }
  }
 // NIEPRZYPISANY
  else if (potencjometr >= 1980 && potencjometr <= 1990)
  {
    if (przelacznik3 >= 1180 && przelacznik3 <= 1380)
    {
     
    }
    if (przelacznik3 >= 1480 && przelacznik3 <= 1830)
    {
      
    }
    if (przelacznik3 >= 1840)
    {
      
    }
  }
  */
 //------------------------------------------------------------------------------
 Serial.print("swiatła");
 Serial.println(swiatla);
 Serial.print("gimbal");
 Serial.println(gimbal);
 Serial.print("tryb lotu"); // Komunikaty pomocnicze
 Serial.println(trybLotu);
 Serial.println(" ");
 Serial.println(" ");
 Serial.println(" ");
 
// Funkcja sterująca wychyleniem gimbala
 if (gimbal == 1)
 {
  kat--;
  if (kat < 0)
  {
    kat = 0;
  }
  analogWrite(9, kat);
 }
 if (gimbal == 2)
 {
  analogWrite(9, kat);
 }
 if (gimbal == 3)
 {
  kat++;
  if (kat > 255)
  {
    kat = 255;
  }
  analogWrite(9, kat);
 }

 /*wartosci podziału potencjometru
 
 990
1190
1390
1590
1790
1990
 */
}

Linki do podzespołów:

https://www.drony.net/kontroler-lotu-naza-m-v2-z-gps-combo-dji.html

https://abc-rc.pl/product-pol-9850-Modul-3-kanalowego-przelacznika-wideo-5-8GHz-dla-kamer-video-FPV.html

https://abc-rc.pl/product-pol-8925-Sterownik-LED-Wylacznik-elektroniczny-2x-2A-2-4S-sterownik-PWM.html

P.S. podejrzewam inne częstotliwości sygnału PWM.

Link do komentarza
Share on other sites

Przede wszystkim musisz zrozumieć, nie wszystko PWM co się świeci. A dokładniej: pomyśl jak przesyałana jest informacja, w czym jest ukryta lub jak zakodowana. W modelarstwie przyjęło sie stosować standard znany jeszcze z czasów aparatur analogowych, czyli sygnał serwa: impulsy 1..1.5ms co 20ms. To jest w pewnym sensie PWM, ale informacja jest tu zawarta w bezwzględnej długości impulsu a nie w wypełnieniu sygnału. Wysyłając coś za pomocą analogWrite() generujesz sygnał  w którym informacja jest zakodowana w wypełnieniu - to się filtruje i wychodzi jakaś wartość średnia, która jest (analogowym) sygnałem pożądanym. Nic natomiast nie wiesz i nie masz tu wpływu na konkretną dłogość impulsów i dlatego nic Ci nie działa. Układziki dla modelarzy musisz sterować poprzez bibliotekę sevo. Dopiero tam masz generowane impulsy, które są zrozumiałe dla takich rzeczy jak ESC, wyłącznik elektroniczny czy ten przełącznik video. Cała elektronika pokładowa posługuje się sygnałami kompatybilnymi z serwomechanizmami. Wywal te analogWrite'y i zastąp je ustawieniami serw. Wtedy wysyłając zero masz impuls najktórszy (jakby drążek gazu do siebie), wysyłając 90 masz połowe zakresu (drążek gazu na środku) a wartość 180 to impuls najdłuższy - kanał gazu na maxa. Sprawdź jakich poziomów potrzebuje np. wyłącznik by działać i to mu wysłaj. Nie zawsze musisz miotać się między 0 a 180, choć jest to przyjęty standard w elementach dwustanowych. Aparatura w której przyporządkowałeś kanał do przełącznika dwupozycyjnego także wysyła min-max, agdy podłączyłeś przełącznik 3-stanowy (np. do klap) zwykle wysyła min-połowę-max. A teraz Ty musisz udawać takie kanały aparatury: musisz produkować takie impulsy jak standardowy nadajnik a więc wyłącznie za pomocą biblioteki servo.

https://www.arduino.cc/en/reference/servo

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

(edytowany)

Dobry pomysł z wykorzystaniem biblioteki servo.h. Wszystko działa jak należy. Faktycznie nie znałem różnic między pwm'mami, jestem początkujący w Arduino i swoją wiedzę opieram na kursie Forbot, a tam nie było informacji na ten temat w necie też nic nie znalazłem. Czy są może jeszcze jakieś kruczki dla odczytu pwm z odbiornika rc? Moje odczyty są akceptowalne chociaż nie stabilne w pewnych zakresach.  Dzięki za pomoc.

Edytowano przez Rak_Rakoski
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.