Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
et:projects:explorer [2011/12/01 09:18] – eemaldatud raivo.sellet:projects:explorer [2020/07/20 09:00] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== Orienteeruja ======
  
 +Lihtne labürindis orienteeruja, mis baseerub Robootika Kodulaboril ja RP05 lintidega robotplatvormil.
 +
 +{{:projects:rp05:rp05_maze.jpg|}}
 +
 +===== Versioon 1 - Lihtne lahendus =====
 +
 +{{:projects:rp05:robot_v1.hex|Kompileeritud HEX}}
 +
 +{{:et:projects:saaremaa.jpg?500|}}
 +
 +<code c>
 +//
 +// Roboti näidisprogramm v1.
 +//
 +
 +#include <stdio.h>
 +#include <homelab/pin.h>
 +#include <util/delay.h>
 +#include <homelab/module/sensors.h>
 +#include <homelab/module/lcd_gfx.h>
 +#include <homelab/module/motors.h>
 + 
 +//
 +// Ultraheli anduri ja multiplekseri viigud
 +//
 +pin multiplekser = PIN(G,0);
 +pin pin_trigger = PIN(F, 2);
 +
 +// Nuppude viigud
 +pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) };
 +
 +//
 +// Põhiprogramm
 +//
 +int main(void)
 +{  
 + unsigned short distance;
 + char text[16];
 + bool lipp = 0;
 + // Multiplekseri seadistamine
 + pin_setup_output(multiplekser);
 + pin_set(multiplekser);
 + // Nuppude seadistamine sisendiks
 + for (int i = 0; i < 3; i++) pin_setup_input(buttons[i]);
 + // Mootorite seadistamine
 + dcmotor_init(0);
 + dcmotor_init(1);
 + // LCD ekraani algseadistamine
 + lcd_gfx_init();
 + // Ekraani puhastamine
 + lcd_gfx_clear();
 + // Taustavalgustuse tööle lülitamine
 + lcd_gfx_backlight(true);
 + // Programmi nime kuvamine
 + lcd_gfx_goto_char_xy(1, 1);
 + lcd_gfx_write_string("Robot_v1");
 + // Väike paus
 + _delay_ms(100);
 +  // Lõputu tsükkel
 + while (true)
 + {
 + // Mõõtmine
 + distance = ultrasonic_measure_srf05(pin_trigger);
 + // Kontrollime nuppu ja salvestame nupuvajutuse
 + if(!pin_get_value(buttons[0])) lipp = 0; // Vajutades 0 nuppu läheb lipp madalaks
 + if(!pin_get_value(buttons[1])) lipp = 1; // Vajutades 1 nuppu läheb lipp kõrgeks
 + // Mõõtmine õnnestus ?
 + if (distance > 0)
 + {
 + // Kauguse tekstiks teisendamine
 + sprintf(text, "%d cm   ", distance);
 + }
 + // Mõõtmisel tekkis viga ?
 + else
 + {
 + // Vea tekst
 + sprintf(text, "Viga    ");
 + }
 + // Teksti kuvamine LCD teise rea alguses
 + lcd_gfx_goto_char_xy(2, 2);
 + lcd_gfx_write_string(text);
 +
 + // Kauguse kontorllimine
 + // Kui nuppu on vajutatud ja distants on alla teatud väärtuse siis keerame paremale
 + if (lipp&&(distance<25))
 + {
 + dcmotor_drive(0, 1);       // 0 mootor edasi
 + dcmotor_drive(1,-1);       // 1 mootor tagasi
 + sprintf(text,"paremale "); // kirjutame kontrolliks text massiivi paremale
 + _delay_ms(300);            // ootame keeramist, ooteaja pikkus valitakse katseliselt
 + distance = ultrasonic_measure_srf05(pin_trigger); // Kordame mõõtmist
 + // Kui distants oli endiselt alla teatud väärtuse keerame otsa ringi, ehk algsest asendist vasakule
 + if ( distance<25)
 + {
 + dcmotor_drive(0,-1);       // 0 mootor tagasi
 + dcmotor_drive(1, 1);       // 1 mootor edasi
 + sprintf(text,"vasakulse"); // kirjutame text massiivi vasakule
 + _delay_ms(600);    // ootame keeramist, ooteaja pikkus valitakse katseliselt
 + distance = ultrasonic_measure_srf05(pin_trigger); // Kordame mõõtmist
 + // Kui distants on endiselt alla teatud väärtuse jääme seisma
 + if(distance<25)
 + {
 + dcmotor_drive(0, 0);
 + dcmotor_drive(1, 0);
 + sprintf(text,"sein");
 + }
 + }
 + }
 + // Kui takistust pole sõidame otse edasi
 + else if(lipp)
 + {
 + dcmotor_drive(0,1);
 + dcmotor_drive(1,1);
 + sprintf(text, "otse");
 + }
 + // Kui nupp 0 on alla vajutatud jääme seisma
 + else
 + {
 + sprintf(text,"seisab");
 + dcmotor_drive(0,0);
 + dcmotor_drive(1,0);
 + }
 + // Teksti kuvamine LCD teise rea alguses
 + lcd_gfx_goto_char_xy(3, 3);
 + lcd_gfx_write_string(text);
 +
 + sprintf(text, "lipp %d", lipp);
 + lcd_gfx_goto_char_xy(2, 4);
 + lcd_gfx_write_string(text);
 +
 + // Väike paus
 + _delay_ms(50);
 + }
 +}
 +</code>
 +
 +===== Versioon 2 - Targem lahendus =====
 +
 +{{:projects:rp05:robot_v3.hex|Kompileeritud HEX}}
 +
 +
 +<code c>
 +//
 +// Roboti näidisprogramm v3.
 +//
 +#include <stdio.h>
 +#include <homelab/pin.h>
 +#include <util/delay.h>
 +#include <homelab/module/sensors.h>
 +#include <homelab/module/lcd_gfx.h>
 +#include <homelab/module/motors.h>
 + 
 +//
 +// Ultraheli anduri ja multiplekseri viigud
 +//
 +pin multiplekser = PIN(G,0);
 +pin pin_trigger = PIN(F, 0);
 +// Nuppude viigud
 +pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) };
 +//
 +// Põhiprogramm
 +//
 +int main(void)
 +{  
 + unsigned short distance;
 + char text[16];
 + bool lipp = 0;
 + // Loome servo positsioonide massiivi, kus on eelnevalt kindlaks tehtud ääred ja keskasend
 + // { parem äär, keskasend, vasak äär, keskasend}
 + // NB! asendieid võivad olla nihkes, ning vastavalt servo paigaldusele valesti.
 + int positsioon[4] = {-178,-40,110,-40 };
 + // Loome suundade mälumassiivi kuhu hiljem hakkame tõeväärtusi kirjutama
 + // 0 - sel suunal on takistus , 1 - takistus puudub
 + int suund[4] = { 0, 0, 0, 0};
 + // Multiplekseri seadistamine
 + pin_setup_output(multiplekser);
 + pin_set(multiplekser);
 + // Nuppude seadistamine sisendiks
 + for (int i = 0; i < 3; i++) pin_setup_input(buttons[i]);
 + // Mootorite seadistamine
 + dcmotor_init(0);
 + dcmotor_init(1);
 + // Servo seadistamine
 + servomotor_init(0);
 + // LCD ekraani algseadistamine
 + lcd_gfx_init();
 + // Ekraani puhastamine
 + lcd_gfx_clear();
 + // Taustavalgustuse tööle lülitamine
 + lcd_gfx_backlight(true);
 + // Programmi nime kuvamine
 + lcd_gfx_goto_char_xy(1, 1);
 + lcd_gfx_write_string("Robot_v3");
 + // Väike paus
 + _delay_ms(100);
 +  // Lõputu tsükkel
 + while (true)
 + {
 + // Mõõtmine
 + distance = ultrasonic_measure_srf05(pin_trigger);
 + // Kontrollime nuppu ja salvestame nupuvajutuse
 + if(!pin_get_value(buttons[0])) lipp = 0; // Vajutades 0 nuppu läheb lipp madalaks
 + if(!pin_get_value(buttons[1])) lipp = 1; // Vajutades 1 nuppu läheb lipp kõrgeks
 + // Mõõtmine õnnestus ?
 + if (distance > 0)
 + {
 + // Kauguse tekstiks teisendamine
 + sprintf(text, "%d cm   ", distance);
 + }
 + // Mõõtmisel tekkis viga ?
 + else
 + {
 + // Vea tekst
 + sprintf(text, "Viga    ");
 + }
 + // Teksti kuvamine LCD teise rea alguses
 + lcd_gfx_goto_char_xy(2, 2);
 + lcd_gfx_write_string(text);
 + // Kontrollime kas sisselülitamise nuppu on vajutatud
 + if(lipp)
 + {
 + // Kordustsüklis hakkame positsiooni ja suuna massiive kontrollima
 + for(int i = 0; i<4;i++)
 + {
 + // Liigutame servomootorit positsiooni massiivist võetud väärtuse võrra
 + servomotor_position(0, positsioon[i]);
 + // Ootame servo liikumist
 + _delay_ms(250);
 + // Salvestame ultraheli kauguse näidu
 + distance = ultrasonic_measure_srf05(pin_trigger);
 + // Tingimusel et antud suund oli vaba kirjutame suuna massiivile vastavasse lahtrisse 1.
 + // Distantsi kaugus määrata katseliselt.
 + if(distance>25) suund[i] = 1;
 + // Kui sel suunal oli takistus kirjutame sinna 0
 + else suund[i] = 0;
 + // Kontrollime mälust, kas otse olevad suunad on vabad
 + if (suund[1] | suund[3])
 + {
 + dcmotor_drive(0, 1);  // 0 mootor otse
 + dcmotor_drive(1, 1);  // 1 mootor otse
 +   // Eelnev sõltub sellest kuidas mootorid on ühendatud
 + sprintf(text,"otse"); // Kirjutame text massiivi 'otse' hilisemaks kontrolliks.
 + }
 + // Kontrollime mälust, kas parem suund on takistuseta
 + else if(suund[0])
 + {
 + dcmotor_drive(0,-1);   // 0 mootor tagasi
 + dcmotor_drive(1, 1);   // 1 mootor edasi
 + sprintf(text,"parem"); // Kirjutame text massiivi parem
 + _delay_ms(300);        // Ootame keeramist, pausi pikkus määrata katseliselt
 + }
 + // Kontrollime mälust, kas vasak suund on takistuseta
 + else if(suund[2])
 + {
 + dcmotor_drive(0, 1);   // 0 mootor edasi
 + dcmotor_drive(1,-1);   // 1 mootor tagasi
 + sprintf(text,"vasak"); // Kirjutame text massiivi vasak
 + _delay_ms(300);        // Ootame keeramist
 + }
 + // Kui ükski suund pole vaba jäävad mootorid seisma
 + else
 + {
 + dcmotor_drive(0, 0);
 + dcmotor_drive(1, 0);
 + sprintf(text,"sein");
 + }
 + }
 + }
 + // Kui 0 nupp on vajutatud siis jätab mootorid seisma
 + else
 + {
 + sprintf(text,"seisab");
 + dcmotor_drive(0,0);
 + dcmotor_drive(1,0);
 + }
 + // Teksti kuvamine LCD-le
 + lcd_gfx_goto_char_xy(2, 3);
 + lcd_gfx_write_string(text);
 + sprintf(text, "suund %d,%d,%d,%d", suund[0],suund[1],suund[2],suund[3]);
 + lcd_gfx_goto_char_xy(2, 4);
 + lcd_gfx_write_string(text);
 + // Väike paus
 + _delay_ms(50);
 + }
 +}
 +</code>
et/projects/explorer.1322731111.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0