Skocz do zawartości

Pierwszy robot mobilny - światłolub


Usohaki

Pomocna odpowiedź

Cześć,

tym razem chciałbym się z Wami podzielić moim pierwszym jeżdżącym robotem - światłolubem. Wybrałem ten typ robota ze względu na jego prostą konstrukcję i łatwy w napisaniu program do sterowania.

Do stworzenia podwozia postanowiłem wykorzystać płytę HDF. Jest ona lekka ale wystarczająco sztywna żeby utrzymać robota i co ważne łatwo dostępna i tania.  Konstrukcja pod względem mechanicznym jest dosyć duża i niezgrabna, jednak było to zaplanowane. Na dosyć sporym kawałku HDFu zmieściłem 2 koszyki na baterie, jeden na 6 baterii AA, drugi na 2, dzięki czemu mam do dyspozycji 9 i 12V, Arduino Uno oraz płytkę stykową - dzięki takiemu rozwiązaniu mogę w łatwy sposób przerobić robota na innego. 

IMG_20190124_231835.thumb.jpg.7d0f8106a53aaed364e94da7e91948d0.jpgIMG_20190124_233837.thumb.jpg.c1a87aa90a5629a619a4533840cac642.jpg

Koszyki na baterie przykleiłem do podwozia za pomocą kleju na ciepło, żeby nie mogły się one przemieszczać, Arduino przykręciłem za pomocą 4 długich śrub w taki sposób, że nie przylega ono do powierzchni płyty (jest to spowodowane sposobem montażu tylnego koła) a płytkę stykową przykleiłem na taśmie dwustronnej, która zabezpiecza jej spód.

Silniki przymocowałem w taki sposób, jaki został przedstawiony w kursie budowy robotów. Do styków przylutowałem przewody, które następnie wyprowadziłem przez wcześniej nawiercone otwory. Tylne koło (obrotowe) zamocowałem za pomocą 4 śrub, niestety dysponowałem tylko jednym rodzajem więc mocno wystają one ponad powierzchnię podwozia.

IMG_20190124_234041.thumb.jpg.410d9843e0313c01073cdffc0a0a974e.jpg

Kolejnym krokiem było stworzenie elektroniki, która będzie odpowiedzialna za ruch robota i znajdywanie najmocniejszego źródła światła.

Do sterowania silnikami wykorzystałem sterownik silników L293D, który podłączyłem tak jak zostało to przedstawione w kursie programowania Arduino. W podwoziu zrobiłem 3 nacięcia (2 z przodu i 1 z tyłu, żeby robot mógł także cofać) do których włożyłem, a następnie zalałem klejem na ciepło fotorezystory 20-30k, które następnie podłączyłem do płytki stykowej i stworzyłem dzielnik z rezystorami 4k7 na których za pomocą pinów analogowych Arduino mierzony jest spadek napięcia. Dzielnik zasiliłem z wyjścia 5V Arduino.

IMG_20190126_202957.thumb.jpg.7a0f6ecef07134fb1ba8c6de927270b8.jpgIMG_20190126_203103.thumb.jpg.36e06cff87770b1333e02409c00319cc.jpg

Na koniec zostało napisanie programu, który będzie wszystko koordynował. Było to najbardziej pracochłonne zajęcie i wymagało zdecydowanie najwięcej czasu. Program nie jest szczególnie skomplikowany, jednak żeby robot jeździł tak jak trzeba musiałem określić np. wartości różnicy między napięciami na fotorezystorach, żeby nie skręcał on w przypadku, gdy jeden z czujników jest minimalnie mocniej oświetlony. 

#define L_MOTOR_F 4             //definiowanie pinów
#define L_MOTOR_B 5
#define L_MOTOR_PWM 6
#define R_MOTOR_F 2
#define R_MOTOR_B 7
#define R_MOTOR_PWM 3
#define L_O A4
#define R_O A5
#define B_O A3

#define ROZNICA_MIN -200          //okreslenie maksymalnej i minimalnej roznicy miedzy odczytanymi wartosciami napiecia
#define ROZNICA_MAX 200
#define ROZNICA_PROG_G 10         //okreslenie roznicy, ktora nie bedzie powodowala skretu
#define ROZNICA_PROG_D 10

void setup() {
  pinMode(L_MOTOR_F, OUTPUT);     //deklaracja pinow na wyjscia
  pinMode(L_MOTOR_B, OUTPUT);
  pinMode(R_MOTOR_F, OUTPUT);
  pinMode(R_MOTOR_B, OUTPUT);
  pinMode(L_MOTOR_PWM, OUTPUT);
  pinMode(R_MOTOR_PWM, OUTPUT);
}

void loop() {
int lewy=analogRead(L_O);       //odczyt wartosci napiec z fotorezystorow
int prawy=analogRead(R_O);
int tyl=analogRead(B_O);
int roznica=lewy-prawy;         //obliczenie roznicy miedzy wartosciami przednich fotorezystorow
int srednia=(lewy+prawy)/2;     //obliczenie sredniej wartosci spadkow napiec na przednich fotorezystorach

if (roznica < ROZNICA_MIN) 
  roznica = ROZNICA_MIN;                                            //ograniczenie roznicy
else if (roznica > ROZNICA_MAX) 
  roznica = ROZNICA_MAX;
else if (roznica<=ROZNICA_PROG_G && roznica>=ROZNICA_PROG_D)        //jezeli roznica jest mniejsza od progu, jedzie prosto
  roznica=0;

if(srednia>tyl){                                                              //jezeli natezenie swiatla z przodu jest wieksze niz z tylu - jazda do przodu
  int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -40, 40);
  L_MOTOR(60-zmianaPredkosci);
  R_MOTOR(60+zmianaPredkosci);
}
else{                                                                         //w przeciwnym wypadku jazda w tyl
  L_MOTOR(-60);
  R_MOTOR(-60);
  }
}

void L_MOTOR(int V){                                //funkcja sterujaca predkoscia lewego silnika
  if(V>0){
    V=map(V,0,100,0,255);
    digitalWrite(L_MOTOR_F,HIGH);
    digitalWrite(L_MOTOR_B,LOW);
    analogWrite(L_MOTOR_PWM,V);
  }
  else{
    V=abs(V);
    V=map(V,0,100,0,255);
    digitalWrite(L_MOTOR_B,HIGH);
    digitalWrite(L_MOTOR_F,LOW);
    analogWrite(L_MOTOR_PWM,V);
  }
}

void R_MOTOR(int V){                            //funkcja sterujaca predkoscia prawego silnika
  if(V>0){
    V=map(V,0,100,0,255);
    digitalWrite(R_MOTOR_F,HIGH);
    digitalWrite(R_MOTOR_B,LOW);
    analogWrite(R_MOTOR_PWM,V);
  }
  else{
    V=abs(V);
    V=map(V,0,100,0,255);
    digitalWrite(R_MOTOR_B,HIGH);
    digitalWrite(R_MOTOR_F,LOW);
    analogWrite(R_MOTOR_PWM,V);
  }
}

void STOP(){                                  //zatrzymanie silnikow
  analogWrite(R_MOTOR_PWM,0);
  analogWrite(L_MOTOR_PWM,0);
}

W ten sposób robot został ukończony.

Projekt ten bez wątpienia dużo mnie nauczył. Może nie ze strony elektroniki, ale na pewno ze strony programowania. I co najważniejsze miałem dużo zabawy tworząc go 🙂

Pozdrawiam
~Usohaki

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

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

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.