RCK Ruđera Boškovića - mobilna / uslužna robotika

Vježbe - Ravno naprijed

Zadatak

Koristeći robota za labirint, krećite se točno ravno naprijed.

Priprema

Za vježbu je potrebno:

Izbor robota za labirint

Uzmite robota za labirint. Radit ćemo program za njega.

Otvorite stranicu "MRMS.ino", u Arduino IDE.

Ako ju ne vidite, ili proširite ekran, tako da svi tabovi postanu vidljivi, ili kliknite na 3 točke.

Nakon toga kliknite na "MRMS.ino", kako biste datoteku otvorili u editoru.
void setup() {
	...
	robot = new RobotMaze((char*)"Two"); // RobotLine, RobotMaze, RobotMin, RobotSoccer, or Your custom robot. "My robot" is Bluetooth name.
	robot->print("Start.\n\r");
	...
}
Nađite ovaj dio koda.

Nakon riječi "new" mora biti "RobotMaze". Program koji se sprema u robota se sastoji od programa za razne robote. Na ovaj način se bira program baš za ovu vrstu robota.

"Two" je proizvoljno (ali ne predugo) ime robota. Ime se pojavljuje prilikom Bluetooth uparivanja robota s mobitelom pa je nužno da svaki robot ima drugačije ime.

Umjesto "Two", slobodno upišite "Marko", "Ivica" ili nešto drugo.

Pozicija programa

Otvorite datoteku "mrm-robot-maze.cpp" u Arduino IDE.

Ako ju ne vidite, ili proširite ekran, tako da svi tabovi postanu vidljivi, ili kliknite na 3 točke.

Nakon toga kliknite na "mrm-robot-maze.cpp", kako biste datoteku otvorili u editoru.
void RobotMaze::loop() {
	...
}
Nađite dio koda s lijeve strane. Umjesto "..." je možda upisan neki kod.

"..." je mjesto gdje ćemo uvijek upisivati kod u ovim vježbama.

Zašto pišemo program baš ovako? Piše ovdje.

Enkoderi

Napravit ćemo program koji održava pravocrtno gibanje.

Održavanje možemo ostvariti povratnom spregom baziranom na enkoderima lijevog i desnog pogonskog motora.

Svaki motor u sebi sadrži enkoder, koji daje određeni broj digitalnih impulsa za svaki okret motora. Brojeći impulse možemo ustanoviti prijeđeni put. Dijeleći put s proteklim vremenom, dobivamo brzinu kotača. Cilj je da su brzine lijevih i desnih kotača iste.

Spajanje enkodera

...
	pinMode(16, INPUT);
	attachInterrupt(16, encoder1Increase, RISING);
	pinMode(17, INPUT);
	attachInterrupt(17, encoder2Increase, RISING);
...
Mikrokontrolerska pločica ima niz digitalnih ulaza, na koje možemo spojiti uređaje koji daju digitalne pulseve, koje onda možemo očitavati u softveru.

Spojimo digitalni izlaz lijevog enkodera na pin broj 16 ESP32 pločice.

Spojimo digitalni izlaz desnog enkodera na pin broj 17 ESP32 pločice.

Podesimo softversko čitanje pulseva na pinovima:
  • pinMode() naredba će postaviti pin kao ulazni, znači čitat će signal. Prvi argument je broj pina, drugi je tip signala, za nas ulazni, znači "INPUT".
  • attachInterrupt() će čitati interrupte svaki put kad se promijeni stanje na pinu s niskog napona na viši. Prvi argument je broj pina, drugi je funkcija koja će biti pozvana. 3. je tip interrupta, u našem slučaju "RISING" - brojimo samo kad se ulaz promijeni iz logičkog 0 u 1.

ISR

void encoder1Increase(){
	encoder1Count++;
}
ISR, Interrupt Service Routine, je funkcija koja će biti pozvana za svako podizanje ulaznog napona, u našem slučaju "encoder1Increase()".

Ona je vrlo jednostavna i samo će povećati globalnu varijablu "encoder1Count" za 1.

Analogno će "encoder2Increase()" povećati "encoder2Count".

Početne postavke programa

Napišite program koji inicijalizira enkodere: okači ih na pinove 16 i 17 pa ih resetira, sve to u 1. prolazu kroz glavnu petlju.

Inicijaliziramo enkodere kao što je opisano gore.

Za postavljanje prvog enkodera na nulu koristimo funkciju:
void encoder1Reset()
Analogno encoder2Reset().

Za izvršavanje incijalizacije samo u prvom prolazu kroz petlju, koristite ugrađenu funkciju:

Cijeli program

Čitajmo konstantno vrijednosti varijabli koje rastu, vezano za enkodere.

Na temelju tih vrijednosti korigirajte brzine lijevih i desnih motora.

Za pokretanje motora, koristite ugrađenu funkciju:

Zadatak: enkoderi za danu brzinu

Jedan okretaj enkodera generira 3 impulsa.

Prijenos motora je 1:100 (100 okreta enkodera je 1 okretaj motora).

Promjer kotača je 68 mm.

Izračunajte broj impulsa enkodera u sekundi, ako želimo održavati brzinu od 0.3 m/s.

Nije postrebno pisati program, nego samo napravite računicu.

Zadatak: robot danom brzinom

Sad napravimo program koji će pogoniti robota brzinom od 0.3 m/s.

Primjedbe