Operácie

Automatické autíčko: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
 
(36 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 15: Riadok 15:
L298N je vysokovýkonný modul ovládača motora na pohon jednosmerných a krokových motorov. Tento modul sa skladá z IC ovládača motora L298 a regulátora 78M05 5V a môže ovládať až 4 jednosmerné motory. Modul L298N sa nachádza v strede na spodnej akrylovej časti autíčka a je spojený so všetkými štyrmi motormi.
L298N je vysokovýkonný modul ovládača motora na pohon jednosmerných a krokových motorov. Tento modul sa skladá z IC ovládača motora L298 a regulátora 78M05 5V a môže ovládať až 4 jednosmerné motory. Modul L298N sa nachádza v strede na spodnej akrylovej časti autíčka a je spojený so všetkými štyrmi motormi.
[[Súbor:L298N_bridge.jpg|600px|thumb|center|L298N.]]
[[Súbor:L298N_bridge.jpg|600px|thumb|center|L298N.]]
[[Súbor:IO_expansion_bridge.jpg|600px|thumb|center|rozširovacia doska.]]
[[Súbor:IO_expansion_bridge.jpg|600px|thumb|center|Rozširovacia doska.]]
Modul sledovania čiary je umiestnený na prvej akrylovej časti autíčka a upevnený skrutkami. Napája sa rovno do rozširovacej dosky, ktorá je umiestnená úplne hore na autíčku.
Sledovací modul čiary je umiestnený na prednej časti autíčka zo spodnej časti akrylu a je upevnený pomocou skrutiek.
[[Súbor:IR_senzor_Mici.jpg|600px|thumb|center|IR senzor.]]
[[Súbor:IR_senzor_Mici.jpg|600px|thumb|center|IR senzor.]]
Spôsob napájania autíčka sme si zvolili cez spôsob power banky. Má na seba vybudované on/off tlačidlo a nabíja sa cez Micro USB. Tým pádom sme ušetrili na nabíjačke pre batérie.  
Spôsob napájania autíčka sme si zvolili cez spôsob power banky. Má v sebe vybudovaný on/off switch a jeho spôsob nabíjania je realizovaný pomocov Micro USB portu.  
[[Súbor:Powerbanka_mici.jpg|600px|thumb|center|Powerbanka.]]
[[Súbor:Powerbanka_mici.jpg|600px|thumb|center|Powerbanka.]]
[[Súbor:Arduino_uno_neko.jpg|600px|thumb|center|Arduino_uno.]]
[[Súbor:Arduino_uno_neko.jpg|600px|thumb|center|Arduino_uno.]]
== Zoznam komponentov ==
; Link na kit:
Aktualizovaná verzia nášho kitu, ktorý už nie je k dispozícii na trhu.Kit navyše obsahuje ESP32 CAM.
: [https://www.aliexpress.com/item/1005006408825056.html?spm=a2g0o.productlist.main.5.1befdRYVdRYVAy&algo_pvid=9e9cae5e-c46c-4f3b-a857-604eed13ac0b&algo_exp_id=9e9cae5e-c46c-4f3b-a857-604eed13ac0b-2&pdp_npi=4%40dis!EUR!61.10!61.10!!!468.58!468.58!%402101e83717158757873058666e05a1!12000037059695318!sea!SK!750056935!&curPageLogUid=9sccnYXZklvX&utparam-url=scene%3Asearch%7Cquery_from%3A Smart Robot Car Kit V4.0.]
; Kit obsahuje:
Prikladám aj odkaz na niektoré súčiastky, ktoré možno zakúpiť samostatne, čo môže viesť k úspore peňazí. Treba mať na pamäti, že nie všetky súčiastky z odkazu sa zhodujú so súčiastkami v balíčku. Celková suma pri nákupe jednotlivých súčiastok je 35 €.                                                                                 
: 1x Arduino uno [https://www.aliexpress.com/item/1005006088733150.html?spm=a2g0o.productlist.main.23.4f9b6d9bSCKJKb&algo_pvid=7b458261-43de-482e-92e4-67c9e315f067&aem_p4p_detail=202405161240006948786311012880001270596&algo_exp_id=7b458261-43de-482e-92e4-67c9e315f067-11&pdp_npi=4%40dis%21EUR%213.73%213.73%21%21%2128.63%2128.63%21%40210308a717158884003111391ef908%21-1%21sea%21SK%21750056935%21&curPageLogUid=RQl4ZvJfFqEw&utparam-url=scene%3Asearch%7Cquery_from%3A&search_p4p_id=202405161240006948786311012880001270596_3 ELEGOO UNO R3 Board]
: 1x L298N motor bridge [https://www.aliexpress.com/item/1005006165630613.html?spm=a2g0o.productlist.main.1.71b3O9yDO9yD48&algo_pvid=9757d78b-66ef-40d1-ae4a-1c45004614b2&algo_exp_id=9757d78b-66ef-40d1-ae4a-1c45004614b2-0&pdp_npi=4%40dis%21EUR%212.39%212.39%21%21%2118.31%2118.31%21%402103246417158837124111258eae59%2112000036068746111%21sea%21SK%21750056935%21&curPageLogUid=Qk6PhChc2kfV&utparam-url=scene%3Asearch%7Cquery_from%3A L298N Motor Driver Board Module]
: 4x DC motorček + kolesá [https://www.aliexpress.com/item/1005004359279407.html?spm=a2g0o.productlist.main.13.d0674a6b6inJNo&algo_pvid=e4de6820-4b9b-4c32-93d0-a10dde8f412c&algo_exp_id=e4de6820-4b9b-4c32-93d0-a10dde8f412c-6&pdp_npi=4%40dis%21EUR%215.92%215.92%21%21%216.30%216.30%21%402101e7a317158838961686634e016e%2112000028896223172%21sea%21SK%21750056935%21&curPageLogUid=uEpYMc8yxJyC&utparam-url=scene%3Asearch%7Cquery_from%3A Gear Motor Wheel Kit]
: 2x Konštrukcia robota [https://www.aliexpress.com/item/1005006341655402.html?spm=a2g0o.productlist.main.21.60572b40RUUbPE&algo_pvid=34d54825-3caf-478d-a2b7-6ee9d28cdab9&algo_exp_id=34d54825-3caf-478d-a2b7-6ee9d28cdab9-10&pdp_npi=4%40dis%21EUR%214.94%214.94%21%21%2137.86%2137.86%21%40210324bf17158846402731612eb8ae%2112000036823084794%21sea%21SK%21750056935%21&curPageLogUid=MppwaCreKNh6&utparam-url=scene%3Asearch%7Cquery_from%3A Smart Robot Chassis ]  (Motorčeky z linku '''Smart Robot Chassis''' neodporúčam používať!!! Neboli dostatočne namazané a zasekávali sa.)
: 1x Rozširovacia doska (Nie je potrebná)
: 1x Ultrazvukový senzor (Nie je potrebný)
: 1x Servo (Nie je potrebné)
: 1x Bluetooth modul (Nie je potrebný)
: 1x IR ovladač (Nie je potrebný)
: 1x Senzor čiernej čiary [https://www.aliexpress.com/item/1005005539331415.html?spm=a2g0o.productlist.main.25.7cec239czvChJV&algo_pvid=aae46307-0c96-4e37-ae9a-6d8b6666935d&algo_exp_id=aae46307-0c96-4e37-ae9a-6d8b6666935d-12&pdp_npi=4%40dis%21EUR%211.45%211.45%21%21%2111.10%2111.10%21%402101c5b117158860025253118ecfe7%2112000033462202533%21sea%21SK%21750056935%21&curPageLogUid=ALL0D7DFerf2&utparam-url=scene%3Asearch%7Cquery_from%3A line tracing module 5]
: 1x Powerbanka (Optional)


== Zadanie úlohy ==
== Zadanie úlohy ==
Riadok 27: Riadok 44:


'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k autíčku]
* [https://fastshare.live/29004584/elegoo-smart-robot-car-kit-v3.0-plus-.zip datasheet + manuál k autíčku]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
 
'''Popis autíčka'''
'''Popis autíčka'''


Riadok 79: Riadok 96:
#include <util/delay.h>
#include <util/delay.h>


// Line Tracking IO define
// Definícia vstupov pre sledovanie čiary
#define LT_R !(PIND & (1 << PD2))
#define LT_R !(PIND & (1 << PD2))
#define LT_M !(PIND & (1 << PD4))
#define LT_M !(PIND & (1 << PD4))
Riadok 91: Riadok 108:
#define IN4 PB3
#define IN4 PB3


#define CAR_SPEED 80
#define CAR_SPEED 100
#define ROTATION_SPEED 180
#define ROTATION_SPEED 180
#define STOP_DURATION 1000
#define STOP_DURATION 1000
Riadok 97: Riadok 114:


volatile unsigned long millis_count = 0;
volatile unsigned long millis_count = 0;
volatile unsigned long lastLineTime = 0; // Deklarácia premennej lastLineTime
volatile unsigned long lastLineTime = 0; // Čas posledného zistenia čiary
 


// Function prototypes
void forward();
void forward();
void Mleft();
void Mleft();
Riadok 114: Riadok 131:
     OCR0A = CAR_SPEED;
     OCR0A = CAR_SPEED;
     OCR0B = CAR_SPEED;
     OCR0B = CAR_SPEED;
     PORTD |= (1 << IN1);  // Left wheels forward
     PORTD |= (1 << IN1);   
     PORTB |= (1 << IN4); // Right wheels forward
     PORTB |= (1 << IN4);
     PORTB &= ~(1 << IN2);
     PORTB &= ~(1 << IN2);
     PORTB &= ~(1 << IN3);
     PORTB &= ~(1 << IN3);
Riadok 123: Riadok 140:
     OCR0A = ROTATION_SPEED;
     OCR0A = ROTATION_SPEED;
     OCR0B = ROTATION_SPEED;
     OCR0B = ROTATION_SPEED;
     PORTB |= (1 << IN2);  // Left wheels backward
     PORTB |= (1 << IN2);   
     PORTB |= (1 << IN4); // Right wheels forward
     PORTB |= (1 << IN4);
     PORTD &= ~(1 << IN1);
     PORTD &= ~(1 << IN1);
     PORTB &= ~(1 << IN3);
     PORTB &= ~(1 << IN3);
Riadok 132: Riadok 149:
     OCR0A = ROTATION_SPEED;
     OCR0A = ROTATION_SPEED;
     OCR0B = ROTATION_SPEED;
     OCR0B = ROTATION_SPEED;
     PORTD |= (1 << IN1);  // Left wheels forward
     PORTD |= (1 << IN1);   
     PORTB |= (1 << IN3);  // Right wheels backward
     PORTB |= (1 << IN3);   
     PORTB &= ~(1 << IN2);
     PORTB &= ~(1 << IN2);
     PORTB &= ~(1 << IN4);
     PORTB &= ~(1 << IN4);
Riadok 144: Riadok 161:


void setup() {
void setup() {
     // Set input/output pins direction
     // Nastavenie smeru vstupov/výstupov
     DDRD &= ~((1 << PD2) | (1 << PD4)); // Set PD2, PD4 as inputs
     DDRD &= ~((1 << PD2) | (1 << PD4)); // PD2, PD4 sú vstupy
     DDRB &= ~(1 << PB2); // Set PB2 as input
     DDRB &= ~(1 << PB2); // PB2 je vstup
     DDRD |= ((1 << ENA) | (1 << ENB) | (1 << IN1)); // Set PD5-PD7 as outputs
     DDRD |= ((1 << ENA) | (1 << ENB) | (1 << IN1)); // PD5-PD7 sú výstupy
     DDRB |= ((1 << IN2) | (1 << IN3) | (1 << IN4)); // Set PB0-PB1 as outputs
     DDRB |= ((1 << IN2) | (1 << IN3) | (1 << IN4)); // PB0-PB1 sú výstupy


     // Initialize timer for millis()
     // Inicializácia časovača pre millis()
     TCCR0A |= (1 << WGM01);    // CTC mode
     TCCR0A |= (1 << WGM01);    // Režim CTC
     OCR0A = 249;                // 1ms at 16MHz
     OCR0A = 249;                // 1 ms pri 16 MHz
     TIMSK0 |= (1 << OCIE0A);    // Enable compare match interrupt
     TIMSK0 |= (1 << OCIE0A);    // Povolenie prerušenia pri porovnávaní
     sei();                      // Enable global interrupts
     sei();                      // Povolenie globálnych prerušení
     TCCR0B |= (1 << CS01) | (1 << CS00); // Start Timer0 with prescaler 64
     TCCR0B |= (1 << CS01) | (1 << CS00); // Spustenie časovača s predděličkou 64


     // PWM setup for ENA and ENB pins (OC0A and OC0B)
     // Nastavenie PWM pre piny ENA a ENB (OC0A a OC0B)
     TCCR0A |= (1 << COM0A1) | (1 << COM0B1); // Non-inverting mode for OC0A and OC0B
     TCCR0A |= (1 << COM0A1) | (1 << COM0B1); // Nehlukový režim pre OC0A a OC0B
     TCCR0A |= (1 << WGM00) | (1 << WGM01);  // Fast PWM mode
     TCCR0A |= (1 << WGM00) | (1 << WGM01);  // Režim rýchleho PWM
     TCCR0B |= (1 << CS01);                  // Set prescaler to 8 for PWM frequency around 7.8 kHz
     TCCR0B |= (1 << CS01);                  // Nastavenie predděličky na 8 pre PWM frekvenciu približne 7,8 kHz
}
}


Riadok 173: Riadok 190:
         Mright();
         Mright();
         while (LT_L);
         while (LT_L);
     } else if(!LT_L && !LT_M && !LT_R) {  
     } else if (!LT_L && !LT_M && !LT_R) {  
         // Ak stav "bez čiary" trvá viac ako 700ms
         // Ak nedetekuje čiaru viac ako 700 ms
         if(millis_count - lastLineTime > 700) { // Opravené: millis() -> millis_count
         if (millis_count - lastLineTime > 700) {
             stop(); // Zmena smeru na left
             stop(); // Zastaviť a otáčať doľava
             _delay_ms(1000); // Čakanie na zmenu smeru
             _delay_ms(1000); // Čakanie na otáčanie
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mleft(); // Ak nie, pokračuj s manévrom Mleft
             Mleft(); // Pokračovať s otáčaním doľava
             _delay_ms(120); // Čakanie na dokončenie manévru Mleft
             _delay_ms(120); // Čakanie na dokončenie otáčania
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mleft(); // Ak nie, pokračuj s manévrom Mleft
             Mleft(); // Pokračovať s otáčaním doľava
             _delay_ms(100); // Čakanie na dokončenie manévru Mleft
             _delay_ms(100); // Čakanie na dokončenie otáčania
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mleft(); // Ak nie, pokračuj s manévrom Mleft
             Mleft(); // Pokračovať s otáčaním doľava
             _delay_ms(100);// Čakanie na dokončenie manévru Mleft
             _delay_ms(100); // Čakanie na dokončenie otáčania
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mright(); // Ak nie, pokračuj s manévrom Mright
             Mright(); // Pokračovať s otáčaním doprava
             _delay_ms(400);
             _delay_ms(400);
             stop();
             stop();
             _delay_ms(1000); // Čakanie na dokončenie manévru Mright
             _delay_ms(1000); // Čakanie na dokončenie otáčania
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mright(); // Ak nie, pokračuj s manévrom Mright
             Mright(); // Pokračovať s otáčaním doprava
             _delay_ms(100); // Čakanie na dokončenie manévru Mright
             _delay_ms(100); // Čakanie na dokončenie otáčania
             if(LT_L || LT_M || LT_R) return; // Ak je zaznamenaná čiara, ukonči tento manéver
             if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
             Mright(); // Ak nie, pokračuj s manévrom Mright
             Mright(); // Pokračovať s otáčaním doprava
             _delay_ms(100); // Čakanie na dokončenie manévru Mright
             _delay_ms(100); // Čakanie na dokončenie otáčania
         }
         }
     } else {
     } else {

Aktuálna revízia z 17:16, 17. máj 2024

Záverečný projekt predmetu MIPS / LS2024 - Daniel Diossy a Peter Brosz


Automatické autíčko sledujúce čiernu čiaru

Sledovanie čiary je základnou technikou používanou v rôznych odvetviach robotiky, vrátane priemyselných robotov, autonómnych vozidiel, ale aj v domácich aplikáciách, ako sú napríklad čistiace roboty. Táto technika umožňuje vozidlám efektívne navigovať v prostredí, kde sú k dispozícii jednoduché vizuálne orientačné body, ako je napríklad čiara na zemi.

V tejto práci sa zameriame na implementáciu sledovania čiary v prostredí AVR, pričom sa budeme venovať nielen samotnému algoritmu sledovania čiary, ale aj analýze vplyvu rôznych parametrov a technických obmedzení na výkon a spoľahlivosť systému. Na základe tejto analýzy budeme schopní navrhnúť a implementovať optimalizovaný algoritmus sledovania čiary, ktorý bude schopný účinne navigovať v rôznych prostrediach a podmienkach.


Použité komponenty.

Podvozok autíčka je z akrylu. Na upevnenie DC motorov sme použili pre každý motor 2 x M3 skrutky s vnútorným šesťhranovým závitom

DC motor.

L298N je vysokovýkonný modul ovládača motora na pohon jednosmerných a krokových motorov. Tento modul sa skladá z IC ovládača motora L298 a regulátora 78M05 5V a môže ovládať až 4 jednosmerné motory. Modul L298N sa nachádza v strede na spodnej akrylovej časti autíčka a je spojený so všetkými štyrmi motormi.

L298N.
Rozširovacia doska.

Sledovací modul čiary je umiestnený na prednej časti autíčka zo spodnej časti akrylu a je upevnený pomocou skrutiek.

IR senzor.

Spôsob napájania autíčka sme si zvolili cez spôsob power banky. Má v sebe vybudovaný on/off switch a jeho spôsob nabíjania je realizovaný pomocov Micro USB portu.

Powerbanka.
Arduino_uno.

Zoznam komponentov

Link na kit

Aktualizovaná verzia nášho kitu, ktorý už nie je k dispozícii na trhu.Kit navyše obsahuje ESP32 CAM.

Smart Robot Car Kit V4.0.
Kit obsahuje

Prikladám aj odkaz na niektoré súčiastky, ktoré možno zakúpiť samostatne, čo môže viesť k úspore peňazí. Treba mať na pamäti, že nie všetky súčiastky z odkazu sa zhodujú so súčiastkami v balíčku. Celková suma pri nákupe jednotlivých súčiastok je 35 €.

1x Arduino uno ELEGOO UNO R3 Board
1x L298N motor bridge L298N Motor Driver Board Module
4x DC motorček + kolesá Gear Motor Wheel Kit
2x Konštrukcia robota Smart Robot Chassis (Motorčeky z linku Smart Robot Chassis neodporúčam používať!!! Neboli dostatočne namazané a zasekávali sa.)
1x Rozširovacia doska (Nie je potrebná)
1x Ultrazvukový senzor (Nie je potrebný)
1x Servo (Nie je potrebné)
1x Bluetooth modul (Nie je potrebný)
1x IR ovladač (Nie je potrebný)
1x Senzor čiernej čiary line tracing module 5
1x Powerbanka (Optional)

Zadanie úlohy

Rozhodli sme sa vytvoriť autíčko, ktoré bude schopné sledovať čiernu čiaru na zemi. Toto autíčko musí úspešne absolvovať celú dráhu, ktorá je zložená z rôznych zatáčok a prerušení čiary. Autíčko musí byť schopné ísť rovno, otočiť doľava, otočiť doprava a zastaviť sa podľa toho, ako číta čiaru a interpretuje ju pomocou IR senzorov.


Literatúra:

Popis autíčka

Analýza a opis riešenia

Autíčko je vybavené tromi infračervenými senzormi, ktoré sú umiestnené pod vozidlom a slúžia na sledovanie čiernej čiary na podložke. Tieto senzory fungujú na princípe odrazenia infračerveného signálu z IR LED diódy do fotodiódy. Keď je podklad pod autíčkom čierny, infračervený signál sa neodráža a fotodióda ho nezachytí, čo indikuje, že autíčko je na čiare. V prípade, že autíčko opustí svoju stanovenú dráhu (opustí čiernu čiaru), je programované tak, aby najprv zastavilo sekundu, aby sa uistilo o zmene dráhy. Po opustení čiernej čiary autíčko pokračuje rovno. Avšak ak sa autíčko nachádza mimo čiary viac ako 700 ms, začne vykonávať manéver na návrat na čiaru. Automaticky začne vykonávať jeden zo stanovených manévrov, ktoré ho navedú naspäť na sledovanú trasu. Tento algoritmus umožňuje autíčku efektívne sledovať čiaru a navigovať po stanovenej dráhe.





Prinip fungovania IR senzoru.

Postup ako sa robot vracia späť na dráhu je jednoduchý. V našom funguje aj tak že vedia obe ľavé kolesa sa otáčať jedným smerom a kolesa vpravo do protismeru takže je veľmi efektívny pri otáčaní a zatáčaní.

Prinip fungovania sledovania čiary.

Zapojenie je nasledovné:

Pin ENA (používaný na riadenie rýchlosti motorov) je pripojený k pinu 5 (PD5). Pin ENB (taktiež používaný na riadenie rýchlosti motorov) je pripojený k pinu 6 (PD6). Vstupné signály pre smer otáčania motorov IN1, IN2, IN3 a IN4 sú pripojené na nasledujúce piny: IN1 je pripojený k pinu 7 (PD7). IN2 je pripojený k pinu 8 (PB0). IN3 je pripojený k pinu 9 (PB1). IN4 je pripojený k pinu 11 (PB3). Senzor pre sledovanie čiary na strednej pozícii (LT_M) je pripojený k pinu 4 (PD4). Senzor pre sledovanie čiary na pravej pozícii (LT_R) je pripojený k pinu 2 (PD2). Senzor pre sledovanie čiary na ľavej pozícii (LT_L) je pripojený k pinu 10 (PB2).


Schéma zapojenia autíčka sledujúceho čiernu čiaru.


Algoritmus a program

Zdrojový kód do autíčka v prostredí AVR


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// Definícia vstupov pre sledovanie čiary
#define LT_R !(PIND & (1 << PD2))
#define LT_M !(PIND & (1 << PD4))
#define LT_L !(PINB & (1 << PB2))

#define ENA PD5
#define ENB PD6
#define IN1 PD7
#define IN2 PB0
#define IN3 PB1
#define IN4 PB3

#define CAR_SPEED 100
#define ROTATION_SPEED 180
#define STOP_DURATION 1000
#define LINE_DETECTED_THRESHOLD 700

volatile unsigned long millis_count = 0;
volatile unsigned long lastLineTime = 0; // Čas posledného zistenia čiary


void forward();
void Mleft();
void Mright();
void stop();
void setup();
void checkLineTracking();

ISR(TIMER0_COMPA_vect) {
    millis_count++;
}

void forward() {
    OCR0A = CAR_SPEED;
    OCR0B = CAR_SPEED;
    PORTD |= (1 << IN1);  
    PORTB |= (1 << IN4);
    PORTB &= ~(1 << IN2);
    PORTB &= ~(1 << IN3);
}

void Mleft() {
    OCR0A = ROTATION_SPEED;
    OCR0B = ROTATION_SPEED;
    PORTB |= (1 << IN2);  
    PORTB |= (1 << IN4);
    PORTD &= ~(1 << IN1);
    PORTB &= ~(1 << IN3);
}

void Mright() {
    OCR0A = ROTATION_SPEED;
    OCR0B = ROTATION_SPEED;
    PORTD |= (1 << IN1);  
    PORTB |= (1 << IN3);  
    PORTB &= ~(1 << IN2);
    PORTB &= ~(1 << IN4);
}

void stop() {
    OCR0A = 0;
    OCR0B = 0;
}

void setup() {
    // Nastavenie smeru vstupov/výstupov
    DDRD &= ~((1 << PD2) | (1 << PD4)); // PD2, PD4 sú vstupy
    DDRB &= ~(1 << PB2); // PB2 je vstup
    DDRD |= ((1 << ENA) | (1 << ENB) | (1 << IN1)); // PD5-PD7 sú výstupy
    DDRB |= ((1 << IN2) | (1 << IN3) | (1 << IN4)); // PB0-PB1 sú výstupy

    // Inicializácia časovača pre millis()
    TCCR0A |= (1 << WGM01);    // Režim CTC
    OCR0A = 249;                // 1 ms pri 16 MHz
    TIMSK0 |= (1 << OCIE0A);    // Povolenie prerušenia pri porovnávaní
    sei();                      // Povolenie globálnych prerušení
    TCCR0B |= (1 << CS01) | (1 << CS00); // Spustenie časovača s predděličkou 64

    // Nastavenie PWM pre piny ENA a ENB (OC0A a OC0B)
    TCCR0A |= (1 << COM0A1) | (1 << COM0B1); // Nehlukový režim pre OC0A a OC0B
    TCCR0A |= (1 << WGM00) | (1 << WGM01);   // Režim rýchleho PWM
    TCCR0B |= (1 << CS01);                   // Nastavenie predděličky na 8 pre PWM frekvenciu približne 7,8 kHz
}

void checkLineTracking() {
    if (LT_M) {
        forward();
        millis_count = 0;
    } else if (LT_R) {
        Mleft();
        while (LT_R);
    } else if (LT_L) {
        Mright();
        while (LT_L);
    } else if (!LT_L && !LT_M && !LT_R) { 
        // Ak nedetekuje čiaru viac ako 700 ms
        if (millis_count - lastLineTime > 700) {
            stop(); // Zastaviť a otáčať doľava
            _delay_ms(1000); // Čakanie na otáčanie
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mleft(); // Pokračovať s otáčaním doľava
            _delay_ms(120); // Čakanie na dokončenie otáčania
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mleft(); // Pokračovať s otáčaním doľava
            _delay_ms(100); // Čakanie na dokončenie otáčania
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mleft(); // Pokračovať s otáčaním doľava
            _delay_ms(100); // Čakanie na dokončenie otáčania
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mright(); // Pokračovať s otáčaním doprava
            _delay_ms(400);
            stop();
            _delay_ms(1000); // Čakanie na dokončenie otáčania
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mright(); // Pokračovať s otáčaním doprava
            _delay_ms(100); // Čakanie na dokončenie otáčania
            if (LT_L || LT_M || LT_R) return; // Ak sa zistí čiara, ukončiť manéver
            Mright(); // Pokračovať s otáčaním doprava
            _delay_ms(100); // Čakanie na dokončenie otáčania
        }
    } else {
        forward();
        millis_count = 0;
    }
}

int main() {
    setup();

    for (;;) {
        checkLineTracking();
    }

    return 0;
}


Zdrojový kód: Autonomne_auticko.zip

Overenie

Autonómne riadené autíčko vyžaduje iba manuálnu aktiváciu napájania, pričom všetky ďalšie operácie sa vykonávajú automatizovane. Ovládanie auta nevyžaduje žiadne interakcie s užívateľom, keďže jeho činnosť je plne automatizovaná. Po aktivácii napájania autíčko automaticky spúšťa sledovanie a reakciu na čiernu čiaru na podložke podľa integrovaného algoritmu riadenia. Priemerný čas prejdenia trasy autíčka je 45 sekúnd.

Autíčko.
Autíčko
Autíčko

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.