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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.