|
|
(7 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) |
Riadok 1: |
Riadok 1: |
| Záverečný projekt predmetu MIPS / LS2024 - '''Andrea Kuňáková'''
| |
|
| |
|
|
| |
| == Zadanie ==
| |
|
| |
| Mojou úlohou bolo zapojiť, naprogramovať a overiť funkčnosť path following robota ktorý sa vie vyhýbať prekážkam. Na tento projekt som použila dosku Acrob, 6 infračervených TCRT5000 diód, ultrazvukový senzor HC-SR04 a dve Paralax Continuous Rotation servá.
| |
|
| |
| [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
| |
|
| |
| === TCRT5000 ===
| |
|
| |
| TCRT5000 sú reflektívne senzory, na doske je napájkovaná vysielacia a prijímacia dióda, ktorá je potiahnutá špeciálnym filmom blokujúcim viditeľné žiarenie. Modul je možné použiť pri detekcií prekážok alebo robotoch sledujúcich čiernu čiaru.
| |
|
| |
| [[Obrázok:tcrt5000obr.jpg|300px|thumb|center|IR Senzor TCRT5000.]]
| |
|
| |
| === HC-SR04 ===
| |
| Ultrazvukový senzor na meranie vzdialenosti.
| |
| ==== Špecifikácie: ====
| |
| Operačné napätie 3.8 – 5.5 V,
| |
| spotreba 8 mA,
| |
| frekvencia ultrazvuku 40 kHz,
| |
| maximálna vzdialenosť 300 cm,
| |
| minimálna vzdialenosť 1 cm,
| |
| presnosťou na 0.3 cm,
| |
| trigger puls 10 mikrosekúnd,
| |
| úhol detekcie 15°.
| |
| [[Súbor:hcsr40obr.png|300px|thumb|center|HC-SR40 utrazvukový senzor.]]
| |
|
| |
| === Paralax Continuous Rotation Servo ===
| |
| Parallax Continuous Rotation Servo je populárny komponent v robotike vďaka svojej schopnosti rotovať o 360 stupňov, čo umožňuje jeho použitie na pohyb robotov. Tento servo motor sa vyznačuje jednoduchosťou ovládania, keďže smer a rýchlosť rotácie je možné riadiť pomocou PWM signálu. Serva tohto typu sú ideálne pre projekty ako mobilné roboty, kde je potrebná nepretržitá rotácia kolies. Poskytuje dostatočný krútiaci moment pre malé a stredne veľké roboty, čím zaručuje spoľahlivý a efektívny výkon. Jeho napájacie napätie je 4,8 až 6 V a poskytuje maximálny krútiaci moment 38 oz-in (2,7 kg-cm) pri 6 V. Rýchlosť otáčania je približne 60 otáčok za minútu (RPM) pri plnom napájaní, čo umožňuje spoľahlivé a plynulé ovládanie v rôznych robotických aplikáciách.
| |
| [[Súbor:parcontrot.jpg|300px|thumb|center|Paralax Continuous Rotation Servo.]]
| |
|
| |
| '''Literatúra:'''
| |
| * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
| |
| * [https://www.vishay.com/docs/83760/tcrt5000.pdf TCRT5000 Datasheet]
| |
| * [https://pdf1.alldatasheet.com/datasheet-pdf/view/1132204/ETC2/HCSR04.html HC-SR04 Datasheet]
| |
| * [https://docs.rs-online.com/870b/0900766b8123f8a1.pdf Paralax Continuous Rotation Servo datasheet]
| |
| * [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Datasheet ATmega328p]
| |
|
| |
|
| |
| __TOC__
| |
|
| |
| == Analýza a opis riešenia ==
| |
|
| |
| Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
| |
|
| |
| [[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
| |
|
| |
| Nezabudnite doplniť schému zapojenia!
| |
|
| |
| [[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
| |
|
| |
|
| |
| === Algoritmus a program ===
| |
|
| |
| <tabs>
| |
| <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
| |
| #include <avr/io.h>
| |
| #include <util/delay.h>
| |
| #include <avr/interrupt.h>
| |
|
| |
| #define IR_PIN_1 PB0 // S1 - uplne na pravo (pin D8)
| |
| #define IR_PIN_2 PD4 // S2 (pin D4)
| |
| #define IR_PIN_3 PD5 // S3 (pin D5)
| |
| #define IR_PIN_4 PD6 // S4 (pin D6)
| |
| #define IR_PIN_5 PD7 // S5 (pin D7)
| |
| #define IR_PIN_6 PB3 // S6 (pin D11)
| |
|
| |
| #define SERVO_PIN_1 PB1 // lave servo pripojene na pin D9
| |
| #define SERVO_PIN_2 PB2 // prave servo pripojene na pin D10
| |
|
| |
| #define TRIGGER_PIN PD2 // (pin D2)
| |
| #define ECHO_PIN PD3 // (pin D3)
| |
|
| |
| #define OBSTACLE_DISTANCE_THRESHOLD 3 // vzdialenost prekazky od robota pri ktorej sa jej zacne vyhybat
| |
|
| |
| volatile uint16_t sensorValues[6];
| |
|
| |
| void servo_init()
| |
| {
| |
| // Konfiguracia Timer1 pre Fast PWM mode, 8-bit
| |
| TCCR1A |= (1 << WGM10) | (1 << WGM11) | (1 << COM1A1);
| |
| TCCR1A |= (1 << WGM20) | (1 << WGM21) | (1 << COM1B1);
| |
| TCCR1B |= (1 << CS11); // Prescaler of 8
| |
|
| |
| // Nastavenie OC1A/PB1 a OC1B/PB2 na output
| |
| DDRB |= (1 << SERVO_PIN_1) | (1 << SERVO_PIN_2);
| |
| }
| |
|
| |
| void servo_rotate(uint8_t servo, uint8_t angle)
| |
| {
| |
| // Mapovanie uhla (od 0 do 180 stupnov) na PWM hodnotu (od 0 do 255)
| |
| uint8_t pwm_value = (angle * 255) / 360;
| |
| // Nastavenie PWM hodnoty na specificke servo
| |
| if (servo == 1)
| |
| {
| |
| OCR1A = -pwm_value; // Servo 1
| |
| }
| |
| else if (servo == 2)
| |
| {
| |
| OCR1B = pwm_value; // Servo 2
| |
| }
| |
| }
| |
|
| |
| void setup()
| |
| {
| |
| servo_init();
| |
|
| |
| // Nastavenie IR pins na inputs
| |
| DDRD &= ~((1 << IR_PIN_2) | (1 << IR_PIN_3) | (1 << IR_PIN_4) | (1 << IR_PIN_5) | (1 << ECHO_PIN));
| |
| DDRB &= ~((1 << IR_PIN_1) | (1 << IR_PIN_6));
| |
| DDRD |= (1 << TRIGGER_PIN);
| |
| // Povolenie prerusenia pre IR piny
| |
| PCICR |= (1 << PCIE2) | (1 << PCIE0); // Povolenie PCIE2 pre piny od PCINT16 do PCINT23 a PCIE0 pre piny od PCINT0 do PCINT7
| |
| PCMSK2 |= (1 << PCINT20) | (1 << PCINT21) | (1 << PCINT22) | (1 << PCINT23); // Povolenie preruseni pre PD4 az PD7
| |
| PCMSK0 |= (1 << PCINT0) | (1 << PCINT3); // Povolenie preruseni pre PB0 a PB3
| |
| sei();
| |
| }
| |
|
| |
| ISR(PCINT2_vect)
| |
| {
| |
| // ISR pre PCINT2 (IR piny od 1 po 6)
| |
| sensorValues[0] = digitalRead(IR_PIN_1);
| |
| sensorValues[1] = digitalRead(IR_PIN_2);
| |
| sensorValues[2] = digitalRead(IR_PIN_3);
| |
| sensorValues[3] = digitalRead(IR_PIN_4);
| |
| sensorValues[4] = digitalRead(IR_PIN_5);
| |
| sensorValues[5] = digitalRead(IR_PIN_6);
| |
| }
| |
|
| |
| void loop()
| |
| {
| |
| // pohyb
| |
| if (sensorValues[2] == LOW && sensorValues[3] == LOW)
| |
| {
| |
| // dopredu
| |
| servo_rotate(1, 90);
| |
| servo_rotate(2, 90);
| |
|
| |
| }
| |
| if(sensorValues[4] == LOW || sensorValues[3] == LOW)
| |
| {
| |
| // do lava
| |
| servo_rotate(1, 10);
| |
| servo_rotate(2, 0);
| |
| }
| |
| if(sensorValues[2] == LOW || sensorValues[1] == LOW)
| |
| {
| |
| // do prava
| |
| servo_rotate(1, 0);
| |
| servo_rotate(2, 10);
| |
| }
| |
| if(sensorValues[4] == LOW || sensorValues[5] == LOW)
| |
| {
| |
| // do prava
| |
| servo_rotate(1, 10);
| |
| servo_rotate(2, 0);
| |
| }
| |
| if(sensorValues[0] == LOW || sensorValues[1] == LOW)
| |
| {
| |
| // do prava
| |
| servo_rotate(1, 0);
| |
| servo_rotate(2, 10);
| |
| }
| |
|
| |
| while (check_obstacle() == HIGH)
| |
| {
| |
| servo_rotate(2, 179);
| |
| servo_rotate(1,179);
| |
| }
| |
|
| |
| delay(10);
| |
| }
| |
|
| |
|
| |
| // Funkcia na kontrolu prekazok pomocou HC-SR04
| |
| bool check_obstacle()
| |
| {
| |
| // Generate trigger pulse for HC-SR04
| |
| PORTD |= (1 << TRIGGER_PIN);
| |
| _delay_us(10);
| |
| PORTD &= ~(1 << TRIGGER_PIN);
| |
|
| |
| // Zmeranie sirky ozveny z echo pinu
| |
| uint32_t pulse_width = 0;
| |
| while (!(PIND & (1 << ECHO_PIN))); // Cakanie na nabeznu hranu
| |
| TCNT1 = 0; // Resetovanie casovaca
| |
| while (PIND & (1 << ECHO_PIN))
| |
| { // Cakanie na dobeznu hranu
| |
| if (TCNT1 > 23200) // Maximalna povolena sirka impulzu (400cm)
| |
| return false; // Ziadna prekazka nebola zaznamenana
| |
| }
| |
| pulse_width = TCNT1; // Ziskaj sirku impulzu
| |
|
| |
| // Premena sirky impulzu na vzdialenost v cm
| |
| uint16_t distance = pulse_width / 58;
| |
|
| |
| // Kontrola ci prekazka je aspom 3cm od robota
| |
| if (distance >= OBSTACLE_DISTANCE_THRESHOLD)
| |
| return false; // V prahovej vzdialenosti nebola zistena ziadna prekazka
| |
|
| |
| return true; // Zistena prekazka
| |
| }
| |
|
| |
|
| |
| </source></tab>
| |
| </tabs>
| |
| Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
| |
|
| |
| === Overenie ===
| |
|
| |
|
| |
| [[Súbor:robobr1.jpg|300px|thumb|center|Robot na čiare I.]]
| |
| [[Súbor:robobr2.jpg|300px|thumb|center|Robot na čiare II.]]
| |
|
| |
| '''Video:'''
| |
| <center><youtube></youtube></center>
| |
|
| |
| Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
| |
|
| |
| [[Category:AVR]] [[Category:MIPS]]
| |