Kooder Robootika Kodulaboris

Autor: Raivo Sell

Käesolev õpiobjekt tutvustab koodrite kasutamist Robootika Kodulaboris.

Koodrite abil saab mõõta mootorite pöörlemist, millest omakorda saab arvutada läbitud teepikkuse või kiiruse. Koodrid on tihti integreeritud alalisvoolumootoritege, kuna nende mootorite puhul on tagasiside eriti oluline. Üldlevinud koodrid koosnevad üldjuhul kooderkettast ja optopaarist. Robootika Kodulaboris on kasutusel koodriga integreeritud reduktormootorid. Nimetatud mootor on näha pildil mootori tagaosas mustas korpuses.

ESF

Õpiobjekti nimi: Kooder Robootika Kodulaboris

Õpiväljundid:

Pärast mooduli läbimist õpilane:

  • Kirjeldab koodri tööprintsiipi
  • Kirjeldab suhtelist ja absoluutkoodrit
  • Kirjeldab optopaari tööprintsiipi
  • Ühendab integreeritud koodriga reduktormootori mikrokontrolleriga õigesti
  • Ü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

Kooder on elektro-mehaaniline seade, mis konverteerib pöördenurga või võlli nurkkiiruse analoogsignaaliks või digitaalkoodiks. Olemas on veel lineaarkoodrid, mis erinevad pöördliikumisele mõeldud koodritest selle poolest, et koodri liikumine toimub mööda sirget. Tööpõhimõte muus osas on sarnane.

Olemas on kahte tüüpi koodreid: absoluutsed ja suhtelised (loendavad). Absoluutse koodri väljund näitab jooksvat võlli asendit. Toite katkemise korral on asend peale toite sisselülitamist tuvastatav. Näitena on toodud lihtsa absoluutse koodri ketas, mida loetakse kolme anduri abil. Moodustuv binaarkood võimaldab ketta asendit mõõta 45 kraadiste sammude täpsusega.

Suhtelise koodri väljund annab informatsiooni võlli liikumise kohta, mida saab edasi töödelda. Tüüpiliselt arvutatakse liikumise kiirus, suund ja vajadusel ka asukoht. Suhteline kooder ei võimalda peale toite kadumist võlli konkreetset asendit kindlaks teha. See annab tsüklilist väljundsignaali ainult siis, kui võll pöörleb.

Suhteline optiline kooder koosneb avade või lõhedega kettast ja optopaarist. Optopaar on IR-valgusdioodist ja fototransistorist koosnev süsteem, mille vahele on asetatud piludega kooderketas nii, et ketta pöörlemisel avad perioodiliselt katkestavad valguse ning seetõttu vastavalt lülitavad fototransistorit sisse ja välja. Selle tulemusena tekib fototransistori väljundis ristküliksignaal, mida saab kasutada võlli nurkkiiruse leidmiseks. Ühe optopaariga koodrid võimaldavad mõõta ainult pöörlemiskiirust pulsside sageduse järgi. Suuna kohta informatsioon puudub.

Võlli pöörlemissuuna kindlakstegemiseks lisatakse ka teine optopaar, mille väljundeid võib tähistada A ja B. Tegemist on kvadratuur väljunditega, kuna optopaarid on asetatud nii, et tekiks 90 kraadine faasinihe nende signaalides. Optopaaride signaalide olekudiagramm on toodud alloleval pildil:

Koodri tööpõhimõte

A ja B väljundeid loetakse tarkvaraliselt, tavaliselt katkestuste vahendusel, mis genereeritakse kas iga või mõne signaali frondi korral. Pöörlemise suund määratakse vastavalt toodud tabeli järgi. Näiteks kui viimane väärtus on 00 ja uus väärtus 01, siis võll on pöördunud ühe poolsammu võrra kellaosuti liikumise suunas.

Optopaar

Kui kooder pöörleb liiga kiiresti, siis võivad sisse tulla vead. Näiteks lugemi 00 → 11 korral ei ole võimalik kindlaks teha, kummas suunas kooder pöörleb. Õiged lugemid saavad olla kas 00 → 01 → 11 või 00 → 10 → 11. Veel kiirema pöörlemise korral võib toimuda ka tagurpidi loendamine.

Koodreid kasutatakse robootikas ja tööstuses rataste ja ajamite kiiruse määramiseks ja liigendite asendi kindlaks tegemiseks.

Kodulabori teek on mõeldud kuni kahe suhteliselt sarnase koodri kasutamiseks kiiruste mõõtmiseks ja pöörete arvu loendamiseks. Näiteks võib koodreid kasutada kaherattalise roboti mõlema ratta kiiruse jälgimiseks. Kodulabori komplektis on reduktormootor, mis on integreeritud koodriga. Koodri anduriks on Halli andur. Anduri ühendusskeem on näha alloleval joonisel.

Kooder annab väljundisse 3 impulssi mootori pöörde kohta. Reduktormootori väljundvõlli impulsside arvu saab, kui korrutada mootori võlli impulsside arv läbi reduktori ülekande suhtega. Näiteks mootori LE149.6.10 reduktori ülekandesuhe on 1:10, seega impulsside arv arvestatuna reduktori võllist on 30 impulssi ühe väljundvõlli pöörde kohta.

Koodri kasutamiseks on Kodulabori teegis olemas funktsioon encoder_init, mis seadistab koodri viigud sisendiks ja seab töökorda katkestuse. Funktsioon encoder_get_pulses tagastab koodri pulsside arvu ja funktsioon encoder_reset_pulses nullib valitud koodri pulsside arvu. Koodri pulsside loendamine toimub viigu väheneva frondi korral genereeritava katkestuse kaudu. Katkestuse toimumise korral suurendatakse vastava koodri muutujat ühe võrra.

NÄITEKOOD

Järgnev kood on koodri teegi realisatsioon ja demonstreerib funktsiooni katkestusepõhist ülesehitust.

//
// Koodrite arv
//
#define NUM_ENCODERS 2
 
//
// Koodri pulsside arvu määramine sekundis.
//
#define ENCODER_TICKS (F_CPU / 8 / 256)
 
//
// Viikude määramine
//
static pin encoder_pins[NUM_ENCODERS] =
{
	PIN(E, 6),
	PIN(E, 7)
};
 
typedef struct
{	
unsigned short num_pulses; } encoder_data;   static encoder_data encoder[NUM_ENCODERS];   // // Katkestuste töötleja // void encoder_pulse(unsigned char index) { encoder[index].num_pulses++; }   // // Katkestused // ISR(INT6_vect) { encoder_pulse(0); }     ISR(INT7_vect) { encoder_pulse(1); }   // // Enkoodrite seadistamine // void encoder_init(unsigned char index) { // Sea viigud sisendiks pin_setup_input_with_pullup(encoder_pins[index]);   // Võimalda väline katkestus, mis genereeritakse väheneva frondi tekkides switch (index) { case 0: bit_set(EICRB, ISC61); bit_clear(EICRB, ISC60); bit_set(EIMSK, INT6); break;   case 1: bit_set(EICRB, ISC71); bit_clear(EICRB, ISC70); bit_set(EIMSK, INT7); break; }   // Algseadista encoder[index].num_pulses = 0; }   // // Nulli valitud kooder // void encoder_reset_pulses(unsigned char index) {
cli(); encoder[index].num_pulses = 0; sei(); }   // // Loe valitud koodri pulsside arv // unsigned short encoder_get_pulses(unsigned char index) {
return encoder[index].num_pulses;
}

Funktsioonide kasutamist demonstreerib näiteprogramm, mis kuvab koodri pulsside arvu ekraanile. Nupp S2 nullib koodri ja alustab uuesti loendamist.

//
// Kodulabori koodri kasutamise näide.
// LCD-le kuvatakse koodri klikkide arv.
//
#include <stdio.h>
#include <homelab/module/lcd_gfx.h>
#include <homelab/delay.h>
#include <homelab/module/encoders.h>
#include <homelab/module/buzzer.h>
#include <homelab/pin.h>
 
// Nupu viik
pin button2 = PIN(C, 1);
 
//
// Põhiprogramm
//
int main(void)
{
	unsigned short pulses = 0;
	char text[16];
 
	// Seab nupu töökorda
	pin_setup_input_with_pullup(button2);
 
	// Seadista kooder
	encoder_init(0);
 
	// Nulli ja käivita loendamine.
	encoder_reset_pulses(0);
 
	// LCD ekraani algseadistamine
	lcd_gfx_init();
 
	// Ekraani puhastamine
	lcd_gfx_clear();
 
	// Taustavalgustuse tööle lüitamine
	lcd_gfx_backlight(true);	
 
// Programmi nime kuvamine lcd_gfx_goto_char_xy(3, 1); lcd_gfx_write_string("Kooder");     // Lõputu tsükkel while (true) { pulses = encoder_get_pulses(0);     // Stringi moodustamine. sprintf(text, "Pulsse: %d",pulses);     lcd_gfx_goto_char_xy(0, 3); lcd_gfx_write_string(text);     // Nupp S2 alla vajutatud if(!pin_get_debounced_value(button2)) { // Nulli ja käivita loendamine. encoder_reset_pulses(0);   // Tee piiksatus buzzer_sound (60, 100);   // Kustuta eelmine number lcd_gfx_write_string(" "); }
 
// Tarkvaraline paus 10 millisekundit sw_delay_ms(10); } }

 

ENESEKONTROLL

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

Mida mõõdetakse koodriga?
Vali õige vastus

Koode
Kaugust
Pöörlemiskiirust
Valgustugevust

Milliseid kooderkettaid on kasutusel?
Vali õiged vastused

absoluutkettad
suhtelised kettad
Einsteini kettad

Mitme anduriga (optopaariga) saab tuvastada pöörlemissuunda?
Vali õiged vastused

ühe
kahe
kolme
mitte ühegi
pöörlemissuunda ei saa tuvastada

Mis tüüpi andur on Robootika Kodulabori integreeritud kooder-reduktormootoris?
Vali õige vastus

Optopaar
Halli andur

Milleks sobib koodreid kasutada Robootika Kodulaboris?
Vali õiged vastused

Mootori pöörlemiskiiruse mõõtmiseks
Võlli täpse asendi tuvastamiseks
Mootori pöörete loendamiseks
Impulsside genereerimiseks

LISAMATERJAL

  1. Robootika Kodulabor - Kooder
  2. Koodri andmeleht

Teoreetilise osa algtekstide autor: Raivo Sell ja Heiko Pikner