Operácie

Autíčko na diaľkové ovládanie: Rozdiel medzi revíziami

Z SensorWiki

(Algoritmus a program)
(Odstránený obsah stránky)
 
(5 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>
 
#include <Servo.h>
 
 
#define IR_PIN_0 4 // S0 - uplne na pravo (pin D4)
 
#define IR_PIN_1 5 // S1 (pin D5)
 
#define IR_PIN_2 6 // S2 (pin D6)
 
#define IR_PIN_3 7 // S3 (pin D7)
 
#define IR_PIN_4 8 // S4 (pin D8)
 
#define IR_PIN_5 11 // S5 (pin D11)
 
#define IR_PIN_6 12 // S6 (pin D12)
 
#define IR_PIN_7 13 // S7 (pin D13)
 
 
Servo LeftServo;
 
#define SERVO_PIN_LEFT 9 // lave servo pripojene na pin D9
 
 
Servo RightServo;
 
#define SERVO_PIN_RIGHT 10 // prave servo pripojene na pin D10
 
 
#define TRIGGER_PIN 2 // (pin D2)
 
#define ECHO_PIN 3  // (pin D3)
 
 
#define FAST 110
 
#define SLOW 80
 
 
#define OBSTACLE_DISTANCE_THRESHOLD 3 // vzdialenost prekazky od robota pri ktorej sa jej zacne vyhybat
 
 
void setup()
 
{
 
  Serial.begin(9600);
 
 
  LeftServo.attach(SERVO_PIN_LEFT);
 
  RightServo.attach(SERVO_PIN_RIGHT);
 
 
  pinMode(2, OUTPUT);
 
  pinMode(3, OUTPUT);
 
  pinMode(9, OUTPUT);
 
  pinMode(10, OUTPUT);
 
 
  pinMode(4, INPUT);
 
  pinMode(5, INPUT);
 
  pinMode(6, INPUT);
 
  pinMode(7, INPUT);
 
  pinMode(8, INPUT);
 
  pinMode(11, INPUT);
 
  pinMode(12, INPUT);
 
  pinMode(13, INPUT);
 
 
 
  // 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();
 
}
 
 
void loop()
 
{
 
  Serial.print("S: ");
 
  Serial.print(digitalRead(IR_PIN_0));
 
  Serial.print(digitalRead(IR_PIN_1));
 
  Serial.print(digitalRead(IR_PIN_2));
 
  Serial.print(digitalRead(IR_PIN_3));
 
  Serial.print(digitalRead(IR_PIN_4));
 
  Serial.print(digitalRead(IR_PIN_5));
 
  Serial.print(digitalRead(IR_PIN_6));
 
  Serial.println(digitalRead(IR_PIN_7));
 
  delay(1);
 
 
  // pohyb
 
    if(digitalRead(IR_PIN_3) == 1 || digitalRead(IR_PIN_4) == 1)
 
    {
 
      // dopredu
 
      LeftServo.write(90-SLOW);
 
      RightServo.write(90+SLOW);
 
    }
 
    else if(digitalRead(IR_PIN_5) == 1 || digitalRead(IR_PIN_6) == 1)
 
    {
 
      // dolava
 
      LeftServo.write(90-SLOW);
 
      RightServo.write(90-SLOW);
 
    }
 
    else if(digitalRead(IR_PIN_1) == 1 || digitalRead(IR_PIN_2) == 1)
 
    {
 
      // do prava
 
      LeftServo.write(90+SLOW);
 
      RightServo.write(90+SLOW);
 
    }
 
    else if(digitalRead(IR_PIN_0) == 1)
 
    {
 
      // ostro do prava
 
      LeftServo.write(90+FAST);
 
      RightServo.write(90+FAST);
 
    }
 
    else if(digitalRead(IR_PIN_7) == 1)
 
    {
 
      // ostro dolava
 
      LeftServo.write(90-FAST);
 
      RightServo.write(90-FAST);
 
    }
 
    else
 
    {
 
      // stop
 
      LeftServo.write(90);
 
      RightServo.write(90);
 
    }
 
 
 
  delay(5);
 
  }
 
 
 
// Funkcia na kontrolu prekazok pomocou HC-SR04
 
bool check_obstacle()
 
{
 
  // Generate trigger pulse for HC-SR04
 
  PORTD |= (1 << TRIGGER_PIN);
 
  _delay_us(5);
 
  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 ===
 
 
 
[[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]]
 

Aktuálna revízia z 07:36, 1. júl 2024