Joonejälgimise robot

Autor: Raivo Sell

Käesolev õpiobjekt tutvustab joonejälgimise robotit, mida saab ehitada Robootika Kodulabori baasil.

Joonejälgija robot on tüüpiline robootika rakendus õpilastele, kes soovivad rakendada oma oskusi integreeritud süsteemi loomiseks. Joonejälgimise roboti ehitamiseks on vaja liikuvat alusplatvormi, jooneandurite komplekti ja mikrokontrollersüsteemi, milleks antud juhul on Robootika Kodulabor.

ESF

Õpiobjekti nimi: Joonejälgimise robot

Õpiväljundid:

Pärast mooduli läbimist õpilane:

  • Kirjeldab joonejälgimise roboti komponente
  • Kirjeldab joonejälgimise roboti alamsüsteeme
  • Koostab joonejälgimise roboti lihtsa juhtprogrammi
  • Ühendab vajalikud Robootika Kodulabori moodulid õigesti

Kasutusjuhend:

  • Teoreetilise taustamaterjaliga tutvumine
  • Graafilise materjaliga tutvumine
  • Enesekontrolli küsimustele vastamine

Õpetatav osa: Lugeda teoreetilist ülevaadet enne riistvara reaalset ühendamist ja pingestamist. Vaadata juhendeid korrektse riistvara käsitlemise tagamiseks. Õpitu kinnistamiseks tuleb praktilised näited reaalselt läbi teha.

Seoste loomine: Läbi õppejuhendite ja sõnalise selgituse järgimise.

Kinnistav osa: Iseseisev praktika reaalse riistvarakomplekti baasil.

TEOREETILINE OSA

Järgnev näide põhineb lihtsal platvormil MRB ja Robootika Kodulabori moodulitel.

 

Vajalikud komponendid:

  • Robootika Kodulabori baaskomplekt

  • Mootorite ja Andurite moodul või Kombomoodul

  • Robotplatvorm MRB

  • Robotplatvormi vaheplaat

  • Joonejälgimise andurikomplekt QTR-8A

  • Andurite kaablid

  • Y-kaabel Kodulabori toite jaoks

  • 6 x AA patareipesa

  • 4 x M3 Kodulabori kinnituspolte

  • 4 distantspuksi

Jooneandur

Joone tuvastamiseks kasutatakse andurit, millel on ühes korpuses infrapuna ehk IR LED ja infrapuna valgust läbilaskva filtriga fototransistor. Anduri tööpõhimõte seisneb IR valguse peegeldumises fototransistori valgelt ja selle neeldumises mustalt pinnalt. Antud projektis kasutame infrapuna andurkomplekti QTR-8A, millel on kokku 8 joonejälgimise andurit. Andurikomplektilt on võimalik mehaaniliselt eraldada 7. ja 8. andur nii, et tekib kaks toimivat andurplaati - üks kahe anduriga ja teine kuue anduriga. Antud näites kasutamegi kuue anduriga andurikomplekti. Andurplaadi toitepinge on 5 V ja optimaaalne töö kõrgus 3 mm. Anduri väljundpinge suureneb, mida suurem on IR valguse neelduvus. Seda pinget mõõdetakse kontrolleri analoog-digitaal muunduriga. Eraldada lõiketangide abil joonejälgimise andur komplektilt 2 viimast ehk 7 ja 8 andurid mööda punktiirjoont.

Jooda piikriba anduri külge.

Valmista kaablid, mis ühendaksid andurit ja Kodulabori moodulit.

Valmista CNC pingi abil robotplatvormile sobiv vaheplaat.

Muuda roboti põhja anduri ava selliselt nagu näidatud joonisel.

Koostamine

Kinnita robotplatvormi komplektis olevate lühemate kruvidega mootorid põhja külge, nii et mootorite toitejuhtmed jääksid üles.

Kinnita andur M2 poltide ja mutritega nii, et anduripaat jääks roboti põhja alla, vajadusel kasutada seibe. Soovitatav on kasutades isoleerteipi või selle puudumisel paberit isolatsioonikihina trükkplaadi ja roboti kere vahel, et vältida juhuslikke lühiseid ning anduriplaadi vigastamist.

Kinnita valged puksid robotiplatvormis olevate pikemate poltidega.

Vaheplaadi ja roboti platvormi vahele mahub kergelt surudes 2×3 AA akupakk.

Ühenda juhtmed.

Combo plaadi ühendused Anduri ühendused Kaabel

Oled edukalt lõpetanud roboti koostamise.


Joonejälgija üks võimalikest tarkvaralistest lahendustest on andurplaadil olevate andurite parema ja vasaku poole võrdlemine ning selle järgi otsustada roboti käitumine.

Robot peab keerama sinnapoole, mille anduri poole väärtus on suurem. Kui anduri pooled on võrdsed siis robot sõidab otse. Juhul, kui kumbki andur ei näe joont, peab jätma meelde, millise anduriga nähti  joont enne selle kaotamist (andur 1 või 6).

NÄITEKOOD


#define F_CPU 14745600
 
#define PAREM_MT	0
#define VASAK_MT	1
 
#include <homelab/pin.h>
#include <homelab/delay.h>
#include <homelab/module/lcd_gfx.h>
#include <homelab/module/motors.h>
#include <homelab/adc.h>
 
#include <stdio.h>
#include <avr/io.h>
 
pin led_red    = PIN(C, 5);
pin led_yellow = PIN(C, 4);
pin led_green  = PIN(C, 3);
 
static inline void Init();
 
int main(void)
{
    	uint16_t line = 0;		//Joone asukoha muutuja
	uint16_t threshold = 500;	//Väärtus, mille järgi otsustatakse, kas on joon
	char text[100];
	const uint8_t speed = 100;	//Maksimaalne sõidukiirus
	Init();
 
	while(1)
    {
		// Kirjutab ekraanile teksti ning ADC väärtused
        	lcd_gfx_clear ();
		sprintf(text, "line: %d",line);
		lcd_gfx_write_string (text);
		lcd_gfx_goto_char_xy (0,1);
		sprintf(text, "ADC0: %d",adc_get_value (0));
		lcd_gfx_write_string (text);
		lcd_gfx_goto_char_xy (0,2);
		sprintf(text, "ADC1: %d",adc_get_value (1));
		lcd_gfx_write_string (text);
		lcd_gfx_goto_char_xy (0,3);
		sprintf(text, "ADC2: %d",adc_get_value (2));
		lcd_gfx_write_string (text);
		lcd_gfx_goto_char_xy (0,4);
		sprintf(text, "ADC3: %d",adc_get_value (3));
		lcd_gfx_write_string (text);
 
		// Loe jooneandureid
		for(uint8_t sensor = 0; sensor < 4;sensor++)
		{
			if(adc_get_value(sensor) > threshold)
				bit_set(line,sensor);
			else
				bit_clear(line,sensor);
		}
 
		// Kas joon on all?
		if(line)
		{
			pin_set (led_green);
			pin_set (led_red);
			pin_set (led_yellow);
			//Joon on keskmiste andurite all
			if(bit_is_set(line,1) && bit_is_set(line,2))
			{
				dcmotor_drive_pwm(PAREM_MT, 1,speed);
				dcmotor_drive_pwm(VASAK_MT,-1,speed);
				pin_clear(led_yellow);
			}
			//Joon on paremate andurite all
			else if (bit_is_set(line,2) || bit_is_set(line,3))
			{
				dcmotor_drive_pwm(PAREM_MT,-1,speed);
				dcmotor_drive_pwm(VASAK_MT,-1,speed);
				pin_clear(led_red);
			}
			//Joon on vasakute andurite all
			else if (bit_is_set(line,0) || bit_is_set(line,1))
			{
				dcmotor_drive_pwm(PAREM_MT, 1,speed);
				dcmotor_drive_pwm(VASAK_MT, 1,speed);
				pin_clear(led_green);
			}
		}
    }
}
 
static inline void Init()
{
	// Seab LEDid töökorda
	pin_setup_output(led_red);
	pin_setup_output(led_yellow);
	pin_setup_output(led_green);
 
	// Lülitab LEDid välja
	pin_set(led_green);
	pin_set(led_yellow);
	pin_set(led_red);
 
	// Seab nupud töökorda
	pin_setup_input_with_pullup(S1);
	pin_setup_input_with_pullup(S2);
	pin_setup_input_with_pullup(S3);
 
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
	lcd_gfx_init ();
 
	//Mootori seadistamine
	dcmotor_drive_pwm_init(0, TIMER2_NO_PRESCALE);
	dcmotor_drive_pwm_init(1, TIMER2_NO_PRESCALE);
 
}

 

ENESEKONTROLL

Vastates alljärgnevatele küsimustele, saad proovida oma teadmisi antud teema kohta

Mitut jooneandurit kasutab joonejälgija robot antud õpiobjektis?
Vali õige vastus

ühte
kuute
kaheksat
mitte ühtegi

Milline on sobiv mõõtekõrgus jooneandurile QTR-8A?
Vali õiged vastused

3 mm
3 cm
30 cm

Milliseid mooduleid kasutab antud õpiobjektis joonejälgija robot?
Vali õiged vastused

Infrapunaanduri komplekti
Alusplatvormi
Radari moodulit (ultraheliandur paigladatud servo mootori õlale)
Lidarit
Manipulaatorit

Kas koodis sisalduvad LCD-le kirjutamise ja LED indikaatorite funktsioonid on olulised roboti joonejälgimise seisukohalt?
Vali õige vastus

Jah
Ei

Milliseid funktsioonid juhivad roboti mootoreid?
Vali õiged vastused

dcmotor_drive_pwm
pin_clear
lcd_gfx_clear
adc_get_value 

LISAMATERJAL

  1. Robootika Kodulabor - Alalisvoolu mootor

Teoreetilise osa algtekstide autor: Raivo Sell ja Rain Ellermaa