This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:projects:tudengid11:tuletorjuja [2011/04/08 16:56] – ester | et:projects:tudengid11:tuletorjuja [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Tuletõrjuja ====== | ||
| + | ===== Meeskond ===== | ||
| + | * Illo Jõe | ||
| + | * Ly Orgo | ||
| + | * Ester Uibopuu | ||
| + | * Mikk Luige | ||
| + | |||
| + | ===== Nädalaaruanded ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Lähteülesanne ==== | ||
| + | |||
| + | Robot, mis peab leidma üles teeküünla ning selle kustutama. Oluline on disain. | ||
| + | |||
| + | ===== Nõuded ja piirangud ===== | ||
| + | |||
| + | * Maksimaalsed gabariidid on 20x20x20 cm. | ||
| + | * Peab olema koostatud valdavalt Kodulabori komponentidest | ||
| + | * Disain | ||
| + | |||
| + | ===== Ideelahendused ===== | ||
| + | |||
| + | Analüüsisime erinevaid kustutusmeetodeid. Valiku tegemisel lähtusime eelkõige idee atraktiivsusest ning seejärel realiseerimise võimalustest. | ||
| + | |||
| + | |||
| + | ^ Kustutusviis | ||
| + | | || | | ||
| + | ^ Propeller | ||
| + | ^ ::: | Töökindlus | ||
| + | ^ ::: | Kustutuse kaugus | ||
| + | ^ ::: | Kompaktsus | ||
| + | ^ ::: | Hea disainida | ||
| + | | | ||
| + | ^ Veekahur | ||
| + | ^ ::: | ||
| + | | | ||
| + | ^ Summutamine tekiga | ||
| + | ^ ::: | ||
| + | ^ ::: | ||
| + | ^ ::: | ||
| + | | | ||
| + | ^ Aerosool veega |Huvitav | ||
| + | ^ ::: | ||
| + | | | ||
| + | ^ Õhukahur | ||
| + | ^ ::: |Vähe realiseeritud | ||
| + | ^ ::: | |Konstruktisooni keerulisus | | ||
| + | |||
| + | ===== Valitud lahendus - Õhukahur ===== | ||
| + | |||
| + | Toimus hääletamine ning otsustasime õhukahuri kasuks. Kõige olulisem oli meie jaoks lahenduse huvitavus ning erakordsus. Meetodid, mis said rohkem plusse, on ka rohkem kasutust leidnud või on liiga komplitseeritud tööpõhimõttega ning kohmakad. | ||
| + | Õhukahur on üsna kompaktne, töökindel, | ||
| + | Peale esimese prototüübi postiivse tulemusega katsetamist, | ||
| + | |||
| + | Esimene õhukahuri prototüüp | ||
| + | {{ : | ||
| + | |||
| + | Cadi mudel: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== Komponentide tabel ===== | ||
| + | |||
| + | ^ Komponent | ||
| + | | Alalisvoolumootor |L149 21:1 6V (52 RPM) | 2 ratta käitamiseks | ||
| + | | Alalisvoolumootor |L149 21:1 6V (25 RPM) | kahuri laadimissüsteem | ||
| + | | Servomootor | ||
| + | | Fotodiood | ||
| + | | Ultraheliandur | ||
| + | | Ball caster | ||
| + | | Pleksiklaas | ||
| + | | Alumiiniumleht | ||
| + | | Vinkelprofiiliga alumiinium latt | paksus 3mm | konstruktsioon | ||
| + | | Kummist tihend | ||
| + | | Patareihoidik | ||
| + | | Akud |AA 1.2V NiMH | vooluallikas | ||
| + | | Kontollerplaat | ||
| + | | Mootori kontrollerplaat | | | 1 | 15 | 15 | | ||
| + | | Korpus | ||
| + | ^ | ||
| + | Lisanduvad veel kruvide, seibide jms hind. | ||
| + | |||
| + | Töötunde: 600, töötunni hind: 5 EUR, kokku: 3000 EUR | ||
| + | |||
| + | ===== Mehaanika ===== | ||
| + | |||
| + | === Õhukahur === | ||
| + | |||
| + | Õhukahuri käppmehhanism, | ||
| + | |||
| + | Õhukahur on šablooni järgi plastikust välja lõigatud. Et kahurit oleks servapidi | ||
| + | |||
| + | Õhulaine tekitamiseks on vajalik membraan, mis ei laseks läbi liigselt õhku ning suurus oleks valitud nii, et selle liikuvus võimaldaks efektiivset käigupikkust. Antud lahenduses on membraan kinnitatud õmblusega õhukahuri ühele servale. Teiselt kahuri servalt tulevad mitmed kummipaelad membraani keskele kokku. | ||
| + | |||
| + | Membraani keskpunktis on kokku ühendatud kummid, membraan ning tross. Kummid ning tross on membraani suhtes eripooltel. Trossi teise otsa on kinnitatud kuul, mille haarab ning vabastab plastikust käpp, mida omakorda käitab alalisvoolumootor. | ||
| + | |||
| + | Membraaniks kasutasime kumeeritud impregneerriiet, | ||
| + | |||
| + | {{ youtube> | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | |||
| + | |||
| + | Külgvaade | ||
| + | {{ : | ||
| + | |||
| + | |||
| + | Lähivaade | ||
| + | {{ : | ||
| + | |||
| + | |||
| + | Pealtvaade seletustega | ||
| + | {{ : | ||
| + | |||
| + | === Raam === | ||
| + | |||
| + | Raami disainis kasutasime alumiiniumit ning hulgaliselt painutatud detaile, mis tegi roboti ehitamise keerulisemaks ja aeganõudvamaks. Mõnes kohas sai 90⁰ painutused asendatud vinkliga, kuna painutatud koht jäi liiga nõrgaks, mistõttu tekkisid painutustes praod. | ||
| + | |||
| + | Konstruktsioon | ||
| + | {{ et: | ||
| + | |||
| + | Konstruktsioon käpaga | ||
| + | {{ et: | ||
| + | |||
| + | Konstruktisioon käppmehhanismi ja mõningase elektroonikaga | ||
| + | {{ : | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Elektroonika ===== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== **Juhtimine** ===== | ||
| + | |||
| + | Roboti juhtimine toimub 5 anduri abil: 4 on fotodioodid leegi leidmiseks ning 1 on ultraheli kaugusmõõdik. | ||
| + | |||
| + | Toimub fotodioodide näitude võrdlemine ning vastavalt sellele roboti positsioneerimine. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Kood: | ||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | //Ultraheli anduri viikude defineerimine. | ||
| + | pin pin_echo = PIN(E, 0); | ||
| + | pin pin_trigger | ||
| + | pin pin_ground = PIN(E, 2); | ||
| + | pin pin_live | ||
| + | |||
| + | |||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | |||
| + | // | ||
| + | char text[16]; | ||
| + | int sensor0, | ||
| + | hw_delay_ms(100); | ||
| + | dcmotor_init(0); | ||
| + | dcmotor_init(1); | ||
| + | dcmotor_init(2); | ||
| + | servomotor_init(0); | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | | ||
| + | //Ultraheli anduri viikude seadistus. | ||
| + | pin_setup_output(pin_ground); | ||
| + | pin_setup_output(pin_live); | ||
| + | pin_clear(pin_ground); | ||
| + | pin_set(pin_live); | ||
| + | |||
| + | scan(); | ||
| + | |||
| + | while(1) | ||
| + | { | ||
| + | | ||
| + | detect(); | ||
| + | | ||
| + | |||
| + | for (a = 0; a < 500; a++) | ||
| + | { | ||
| + | //Infrapuna anduritelt näitude sisse lugemine. | ||
| + | sensor0 = adc_get_average_value(0, | ||
| + | sensor1 = adc_get_average_value(1, | ||
| + | sensor2 = adc_get_average_value(2, | ||
| + | sensor3 = adc_get_average_value(3, | ||
| + | | ||
| + | //See koodijupp võrdleb kahelt keskmiselt infrapuna andurilt saadud väärtuste summat algselt seadistatud väärtusega " | ||
| + | //Kui küünal on leitud jääb robot seisma ja üritab küünalt kolm korda kustutada. | ||
| + | //Kui küünalt ei ole leitud arvestab robot kõigi nelja infrapuna anduri väärtuse järgi suuna kuhu poole sõita. | ||
| + | if (sensor1+sensor2> | ||
| + | { | ||
| + | drive(0,0); | ||
| + | hw_delay_ms(2000); | ||
| + | for (i = 0; i < 3; i++) | ||
| + | { | ||
| + | dcmotor_drive(2, | ||
| + | hw_delay_ms(1000); | ||
| + | dcmotor_drive(2, | ||
| + | hw_delay_ms(2000); | ||
| + | } | ||
| + | drive(-10, | ||
| + | hw_delay_ms(1000); | ||
| + | scan(); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | max(15*(sensor2+sensor3)/ | ||
| + | |||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | //See funktsioon tagab efektiivsema keeramise. Main funktsioonis tuletatud sõidu suunale ja kahele mootori kiirusele lisatakse antud funktsiooniga järsema nurgaga keeramise puhul vastava külje mootori tagurpidi liikuma panemine. Samuti optimiseeritakse roboti kiirus, et vähemalt üks mootor töötaks otsides alati maksimum kiirusel. | ||
| + | int max( int speed0, int speed1) | ||
| + | { | ||
| + | char text[16]; | ||
| + | if (speed0< | ||
| + | { | ||
| + | speed0=speed0*10/ | ||
| + | speed1=10; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | speed1=speed1*10/ | ||
| + | speed0=10; | ||
| + | } | ||
| + | |||
| + | if (speed0< | ||
| + | { | ||
| + | speed0= speed0 -5; | ||
| + | } | ||
| + | if (speed1< | ||
| + | { | ||
| + | speed1= speed1-5; | ||
| + | } | ||
| + | |||
| + | drive(speed0, | ||
| + | //} | ||
| + | return 0; | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | //Antud funktsiooniga tekitatakse tarkvaraline vaste PWM-le. Selle funktsiooniga pannakse sõitmiseks vajalikud mootorid tööle kiirusega 0 kuni 10. Kiirus võib ka olla negatiivne. | ||
| + | void drive(int speed0,int speed1) | ||
| + | { | ||
| + | |||
| + | if (speed0 >10) speed0=10; | ||
| + | if (speed1 >10) speed1=10; | ||
| + | if (speed0 <-10) speed0=-10; | ||
| + | if (speed1 <-10) speed1=-10; | ||
| + | |||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | | ||
| + | if (abs(speed0)< | ||
| + | { | ||
| + | hw_delay_ms(abs(10-abs(speed1))); | ||
| + | if (speed1!=0) | ||
| + | dcmotor_drive(1, | ||
| + | hw_delay_ms(abs(speed1)-abs(speed0)); | ||
| + | if (speed0!=0) | ||
| + | dcmotor_drive(0, | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | hw_delay_ms(abs(10-abs(speed0))); | ||
| + | if (speed0!=0) | ||
| + | dcmotor_drive(0, | ||
| + | hw_delay_ms(abs(speed0)-abs(speed1)); | ||
| + | if (speed1!=0) | ||
| + | dcmotor_drive(1, | ||
| + | } | ||
| + | |||
| + | |||
| + | return ; | ||
| + | } | ||
| + | |||
| + | |||
| + | //See funktsioon kontrollib ultraheli anduriga ega roboti ees ei ole takistust. Takistuse esinemisel robot tagurdab ja seejärel pöörab. | ||
| + | void detect() | ||
| + | { | ||
| + | unsigned short distance; | ||
| + | drive(0,0); | ||
| + | distance = ultrasonic_measure(pin_trigger, | ||
| + | if (distance< | ||
| + | { | ||
| + | drive(-10, | ||
| + | hw_delay_ms(1000); | ||
| + | drive(-5, | ||
| + | hw_delay_ms(450); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | //Scan funktsioon vaatab ringi ja otsib kõige suurema infrapuna väärtusega suunda kuhupoole sõita. | ||
| + | void scan() | ||
| + | { | ||
| + | int i= 0, | ||
| + | for( i=0; i<=300; i++) | ||
| + | { | ||
| + | drive(0,0); | ||
| + | sensor0 = adc_get_average_value(0, | ||
| + | sensor1 = adc_get_average_value(1, | ||
| + | sensor2 = adc_get_average_value(2, | ||
| + | sensor3 = adc_get_average_value(3, | ||
| + | drive(-5, | ||
| + | hw_delay_ms(10); | ||
| + | if (sensor0+sensor1+sensor2+sensor3> | ||
| + | { | ||
| + | max=sensor0+sensor1+sensor2+sensor3; | ||
| + | m=i; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | for( i=300; i>=m; i--) | ||
| + | { | ||
| + | drive(5, | ||
| + | hw_delay_ms(10); | ||
| + | drive(0,0); | ||
| + | |||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Valmisroboti pildid ja videod ===== | ||
| + | |||
| + | {{ youtube> | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | {{ youtube> | ||
| + | |||
| + | |||
| + | ===== Mida võiks teha teisiti ===== | ||
| + | |||
| + | Solidworksis robotit kujundades ei teinud me 3D mudelit 100% valimis, ei projekteerinud lõplikult vinnastusmehhanismi, | ||