Skocz do zawartości
kilerus

Układ radiowego sterowania silnikiem przez Arduino

Pomocna odpowiedź

Cześć,

To mój pierwszy post. Zrobiłem sobie nadajnik radiowy z fotorezystorem i odbiornik z mostkiem h  i dwoma silnikami. Wszystko działało. Jeszcze podłaczyłem przetwornicę, ale to później rozmontowałem i jak dostałem joystick to postanowiłem złożyć ponownie.

Efekt jest taki, że wszystko działa na diodach jak należy, a jak podłaczę silnik, to zawiesza się. Skręcam joystick diody świecą a silnik kreci się w nieskonczoność, na Monitorze portu szeregowego przestają wyskakiwać wiadomości i wystarczy, ze odłączę silnik i program leci dalej.

Czym to może być spowodowane?

2a3153a3162b9fae.jpg

#include <VirtualWire.h>

#define receive_pin 11
unsigned long czas;
String stringHash = "99999999";

void setup()
{
  Serial.begin(9600);
  Serial.println("setup");
  // przygotowujemy potrzebne informacje dla biblioteki
  pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(8, OUTPUT);
  pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1
  pinMode(5, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 2
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT); //Sygnał PWM silnika nr 2
  czas = millis();
  vw_set_rx_pin(receive_pin);
  vw_setup(2000);
  vw_rx_start(); // startujemy odbieranie danych (uruchamiamy)
}

void loop()
{
  // częśc wymagana do poprawnego działania biblioteki
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // jeśli odbierzemy dane
  {
    czas = millis();
    int i, last;
    String wiadomosc, liczbaX, liczbaY;
    // w pętli zczytujemy dane z odbiornika
    int lastfirst=0;
    for (i = 0; i < 8; i++)
    {
      wiadomosc += char(buf[i]); // wiadomość
      last = i;
    }
    if (wiadomosc == stringHash)
    {
      String tt="";
      for(i=last+1;i<buflen;i++)
      {
        tt="";
        tt+=char(buf[i]);
        if(tt=="_")
        {
          lastfirst=i-1;
          break;
        }
      }
      for (i = last+1; i < lastfirst+1; i++)
      {
        liczbaX += char(buf[i]); // liczba
      }
      for (i = lastfirst+2; i < buflen; i++)
      {
        liczbaY += char(buf[i]); // liczba
      }
      //Serial.println (liczbaY);
      int x = atoi(liczbaX.c_str())-100; //w prawo w lewo
      int y = atoi(liczbaY.c_str())-100; //do przodu do tyłu

      int x1=1* abs(x);
      int y1=1* abs(y);
      
       if(x<0)
        MakeWalk(8, 7); 
      else
        MakeWalk(7, 8); 

      if(y<0)
        MakeWalk(5, 4); 
      else
        MakeWalk(4, 5);

      analogWrite(6, x1);
      analogWrite(3, y1); 
        
      Serial.print ("------   ");
      Serial.print (x1);
      Serial.print (";");
      Serial.println (y1);
    }

  }
}
void MakeWalk(int pin1, int pin2)
{
  digitalWrite(pin1, HIGH);
  digitalWrite(pin2, LOW);
}

Udostępnij ten post


Link to post
Share on other sites

@kilerus, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

24 minuty temu, kilerus napisał:

fekt jest taki, że wszystko działa na diodach jak należy, a jak podłaczę silnik, to zawiesza się. Skręcam joystick diody świecą a silnik kreci się w nieskonczoność, na Monitorze portu szeregowego przestają wyskakiwać wiadomości i wystarczy, ze odłączę silnik i program leci dalej.

Jeśli program działa poprawnie, a problemy pojawiają się tylko, gdy podłączysz silnik to na 99% problem leży w zasilaniu. Jak dokładnie zasilacz mostek i silniki? Pobierasz napięcie prosto z baterii czy ze stabilizatora w Arduino? Pytam dla pewności, bo na zdjęciu nie widać zbyt wiele.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć,

 

To jest ten mniejszy czerwony kabelek z Vin do drugiej linii płytki a za kondensatorami transportuje to zworka szara do ostatniej nóżki mostka od lewej. Po prawej stronie mostka dochodzi zasilanie z dłuższego 5V kabelka.

 

EDIT:

Wcześniej zrobiłem coś takiego jeszcze i też działo bez zarzutu:

 

acab540e5981f831.jpg

 

Co ciekawe. Tutaj mam zasilanie podłączone odwrotnie, czyli chyba źle, a wszystko działało.

Edytowano przez kilerus

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jeszcze raz wszystko podłączyłem i działają same silniki:

 

void setup() { 
  pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(6, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  
  pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(8, OUTPUT);

    digitalWrite(7, LOW);
  digitalWrite(8, HIGH);


    pinMode(3, OUTPUT); 
  digitalWrite(3, HIGH); 
  
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);

    digitalWrite(5, LOW); 
  digitalWrite(4, HIGH);
} 
 
void loop()  {   


  for (int i = 0; i <= 100; i++) {
      analogWrite(6, i); //Spokojne rozpędzanie silnika
      analogWrite(3, 100-i); 
      delay(25);
  }
    for (int i = 99; i >0; i--) {
      analogWrite(6, i); 
      analogWrite(3, 100-i); 
      delay(25);
  }
}

 

 

Natomiast jak zacznę zczytywać dane z odbiornika radiowego i włączę silnik to się wiesza. Co z tym zrobić?

Napięcie na wyjściu do silników mam 6,8V więc teraz jest dobrze. To muszę mieć jakieś zakłócenia przez te silniki. A ile taki mostek pobiera pradu?

 

Edytowano przez kilerus

Udostępnij ten post


Link to post
Share on other sites

Rozdziel zasilanie silnika i logiki. Do Arduino normalnie zasilacz, z Arduino zasil tylko L293D (czy jaki tam masz) od strony logiki - kabelki 5V, GND, IN1 i IN2. Z akumulatorków/baterii zasil wejście zasilania silnika na L293D (druga strona scalaka). Przy tym modelu RF może być nawet konieczne całkowite rozdzielenie sygnałów, bo Arduino może wszystkie zakłócenia od silnika odbierać jako sygnał.

Udostępnij ten post


Link to post
Share on other sites

Tak zrobiłem. Zamiast zasilania zewnętrznego dla Arduino, podłaczyłem zasilacz do dolnej listwy +/-. Dokładnie taki sam efekt. Dalej silnik blokuje program. Co ciekawe, małe wartości do poziomu 9 przy analogWrite dla silnika są ok. Wieksze blokują wykonanie programu.

Zrobiłem takie doświadczenie. Po instrukcji warunkowej odbierającej informację dodałem:

      if(millis()-czas>1000)
      {
        analogWrite(6, 0);
        analogWrite(3, 0);
        Serial.println(millis()-czas);
      }

I wtedy otrzymuje informacje z odbiornika radiowego, ale silniki oczywiście mają napęd nieakceptowalny. Te silniki jak pracują to blokują odbiór sygnału RC. Nie mam pojęcia jak z tym sobie poradzić.

Myślalem, ze zrobienie zdalnie sterowanego pojazdu będzie proste, a tutaj takie problemy.

Czy jak podepnę zamiast odniornika RC jakieś czujniki to te silniki dalej będą mi to wszystko zakłócać? Czy jak zamienię ten mostek H na jakiś bardziej zaawansowany sterownik silników to czy jest szansa, ze te zakłócenia się ode mnie odtentegują?

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, kilerus napisał:

Czy jak podepnę zamiast odniornika RC jakieś czujniki to te silniki dalej będą mi to wszystko zakłócać? Czy jak zamienię ten mostek H na jakiś bardziej zaawansowany sterownik silników to czy jest szansa, ze te zakłócenia się ode mnie odtentegują?

Zmiana peryferiów oraz sterownika silników nie wpłynie znacząco na obniżenie zakłóceń. Musisz zadbać o odpowiednio wydajne zasilania i kondensatory filtrujące. Nie ma drogi, która pozwoliłaby to obejść.

Udostępnij ten post


Link to post
Share on other sites

Zobacz co się będzie działa gdy zamienisz PWM (analogWrite) na zwykły włącz/wyłącz, można też zmienić częstotliwość PWM. Mam takie same RF (i ewentualnie kilka innych typów)  i jakiś silniczek z zabawki, także podłącze to w tym tygodniu i podzielę się swoimi obserwacjami.  Driver masz L293D? Co do zasady takie układy działają, przecież jest mnóstwo zabawek  z RF, niestety akurat te radia to prawie że antena podłączona do pinu Arduino. Możesz wrzucić kod nadajnika i odbiornika do testów. 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Posprawdzam wieczorem. Dzięki Wam za pomoc.

 

Mostek jest taki jak pisałeś L293D. Nawet go zmieniłem, bo myślałem, że mi się zepsuł. Wszystko jednak działa dokładnie tak samo.

Z tego co czytałem to zakłócenia mogą się brać z tego, ze silnik wiruje i z tego, że mają wspólne masy (odbiornik i silniki). Ja się na tym nie znam. Tak piszę co tam mi się rzuciło. 

Kod odbiornika jest w pierwszym poście.

 

Wiem, ze niewiele widać ale nadajnik jest taki:

 

666dac3ba5a1f3f3.jpg

 

Kod nadajnika jest taki:

#include <VirtualWire.h>
// definiujemy piny

#define transmit_pin 10
String stringHash = "9999999";
int value = 0;
int sensorX = A0; // VRx do A0 na Arduino
int sensorY = A1; // VRy do A1 na Arduino
int przycisk = 7;    // SW do pinu 7 na Arduino

int srodekX = 497;
int srodekY = 503;

int maxValue = 1023;

void setup()
{
  pinMode(przycisk, INPUT);
  digitalWrite(przycisk, HIGH) ;
  Serial.begin(9600);
  // przygotowujemy potrzebne informacje dla biblioteki
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);

}

void loop()
{
  value = analogRead(sensorX);

  float procentX;
  if (value < srodekX)
    procentX = -(float)(srodekX - value) / (float)srodekX;
  else
    procentX = (float)(value - srodekX) / (float)(maxValue - srodekX);

  int pX = 100 * procentX + 100;

  value = analogRead(sensorY);



  float procentY;
  if (value < srodekY)
    procentY = -(float)(srodekY - value) / (float)srodekY;
  else
    procentY = (float)(value - srodekY) / (float)(maxValue - srodekY);

  int pY = 100 * procentY + 100  ;

  String toSend = (stringHash + String(pX, DEC) + "_" + String(pY, DEC)); // tekst wiadomości
  char msg[23]; // tworzymy tablicę typu char
  toSend.toCharArray(msg, toSend.length() + 1); // konwertujemy nasz tekst do tablicy char'ów

  vw_send((uint8_t *)msg, strlen(msg));// wysyłamy
  Serial.println(toSend);


  vw_wait_tx();
  delay(100); 
}

 

Oczywiście wartości wyjściowe PVM (tak by jechał do przodu i skręcał) dla silników miały być jeszcze przeskalowane inaczej, ale nie było sensu tego robić póki to w ogóle nie chce wystartować.

Cały układ jest zasilany z 6 akumulatorków AA.

4-x-akumulatorki-varta-ready2use-r6-aa-n

 

Mój powerbank ma 5V 1A, ale musiałbym go podpiąć do listwy.

Edytowano przez kilerus

Udostępnij ten post


Link to post
Share on other sites

A zaglądałeś do tego wątku ? U ciebie pin 10 czyli SS jest w kodzie odbiornika ale też możliwe że powoduje to niezgodności z biblioteką VirtualWire tylko pamiętaj jeśli zechcesz spróbować przemienić przewód z piniu 10 na 6 tak jak opisał to autor w w/w wątku to dla bezpieczeństwa zmień pin A0 na A2 ponieważ generowanie sygnału PWM na pinie 6 i jednoczesny odczyt/pomiar na pinie A0 może doprowadzić do uszkodzenia Arduino Uno.

Udostępnij ten post


Link to post
Share on other sites

Dzięki,

 

Przejrzę ten link. 

 

Tylko tak na szybko. Ja używam pinu 10 w nadajniku, a w odbiorniku pinu 11.

 

Nie wiedziałem, ze są jakieś zależności między pinami, że mogę je jakoś uszkodzić.

Udostępnij ten post


Link to post
Share on other sites

Zależności oczywiście , że są zwłaszcza jeśli używasz różnych modeli arduino u ciebie będzie to arduino leonardo oraz Uno popatrz na opis wyprowadzeń

arduino-uno-pin.thumb.jpg.9b9c21d770619c591fadd83e4918b507.jpg

Arduino-Leonardo-Pinout.thumb.png.6929dd7b16c27c23c39c92ce29314adb.png

Taki najprostszy przykład jaki przychodzi mi do głowy: załóżmy , że masz do arduino Uno podpięty wyświetlacz na magistrali I2C na pinach A4 , A5 i wszystko wyświetla się poprawnie. Następnie chcesz ten projekt przenieść na arduino Leonardo wpinając wyświetlacz w te same piny czyli A4, A5 efekt będzie taki , że wyświetlacz nic nie pokarze. Powód bardzo prosty wystarczy spojrzeć na rozkład pinów w arduino Leonardo i widać , że na pinach A4 i A5 niema magistrali I2C (jest na pinach Cyfrowych 2 oraz 3).  Zwróć uwagę na to , że arduino leonardo posiada 12 pinów analogowy z czego A0-A5 w tej samej konfiguracji co w uno a pozostałe (A6-A11 na pinach cyfrowych 4, 6, 8, 9, 10, 12). Więcej nie będę się rozpisywał bo nie jest to bezpośrednia wskazówka dla twojego problemu ale może kiedyś Ci się przyda.

Udostępnij ten post


Link to post
Share on other sites

Faktycznie muszę to przejrzeć.

Zamieniłem analogWrite na DigitalWrite i dalej jest źle.

Teraz ładuję akumulatorki bo najwyraźniej są już mocno rozładowane. 

Tylko, że podłączyłem pod Arduino zasilacz 9V 2A i dalej jest lipa. Zauważyłem jednak, ze odbiornik dużo częściej wychwytywał wiadomości.

Udostępnij ten post


Link to post
Share on other sites

Całkowicie tych samych warunków nie odtworzę, ale jak to mówią informatycy: "u mnie działa".  Miałem te moduły na wirzchu bo testowałem zasięg i z antenkami własnej roboty wynosił ponad 200m w terenie otwartym i w domu przez 3 ściany >10m też nie było problemu. Po dodaniu silnika na PWM pinu 6 działa w domu tak samo, na zewnątrz nie testowałem. Jedyne co to mój silniczek startuje od PWM>100 i zatrzymuje się przy 80, poniżej tylko piszczy. Osobne zasilania z baterii aku i przetwornicy 5V dla silniczka i osobno z power banku dla NANO, a nadajnik podpięty do USB komputera. Kod użyłem jednak swój, bo nie chciało mi się kombinować z LCD, po prostu LED szybko miga 3x gdy otrzyma zgodny komunikat "Wiadomosc". Zwiększyłem wiadomość do 20 znaków i dalej jest OK, piny RX/TX do RF mam te same i tak samo 2000baud.

Oczywiście nie wszystkie komunikaty dochodzą, mam je ustawione co 1s i widać, że pojedyncze czasami nie dolatują.

Udostępnij ten post


Link to post
Share on other sites

A ja zmieniłem miejscami kontrolery i dalej to samo. Może te silniki są jakies takie...

Poza tym zauważyłem, ze często te wiadomości nie dochodzą, więc średnio się to nada do sterowania pojazdem.

Na razie pobawię sę czym innym i później może do tego wrócę.

Dzięki.

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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