Autíčko na diaľkové ovládanie: Rozdiel medzi revíziami
Z SensorWiki
(→Algoritmus a program) |
|||
(8 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 4: | Riadok 4: | ||
== Zadanie == | == 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 | + | 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.]] | [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | ||
Riadok 12: | Riadok 12: | ||
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. | 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| | + | [[Obrázok:tcrt5000obr.jpg|300px|thumb|center|IR Senzor TCRT5000.]] |
=== HC-SR04 === | === HC-SR04 === | ||
− | Ultrazvukový senzor na meranie vzdialenosti | + | Ultrazvukový senzor na meranie vzdialenosti. |
==== Špecifikácie: ==== | ==== Špecifikácie: ==== | ||
Operačné napätie 3.8 – 5.5 V, | 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:''' | '''Literatúra:''' | ||
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] | * [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://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] | ||
Riadok 44: | Riadok 53: | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
− | |||
− | |||
− | |||
<tabs> | <tabs> | ||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | ||
#include <avr/io.h> | #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á:semestralnyProjektKunakova.txt|semestralnyProjektKunakova.txt]] | ||
=== Overenie === | === Overenie === | ||
− | |||
− | |||
− | [[Súbor: | + | [[Súbor:robobr1.jpg|300px|thumb|center|Robot na čiare I.]] |
+ | [[Súbor:robobr2.jpg|300px|thumb|center|Robot na čiare II.]] | ||
'''Video:''' | '''Video:''' | ||
− | <center><youtube> | + | <center><youtube></youtube></center> |
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte. | Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte. | ||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Aktuálna revízia z 19:49, 10. jún 2024
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á.
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.
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°.
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.
Literatúra:
- Dokumentácia k doske Acrob
- TCRT5000 Datasheet
- HC-SR04 Datasheet
- Paralax Continuous Rotation Servo datasheet
- Datasheet ATmega328p
Obsah
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Nezabudnite doplniť schému zapojenia!
Algoritmus a program
#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
}
Zdrojový kód: semestralnyProjektKunakova.txt
Overenie
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.