Operácie

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

Z SensorWiki

(Analýza a opis riešenia)
 
(13 medziľahlých úprav od jedného ďalšieho 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 dva servomotory.
+
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|200px|thumb|center|IR Senzor TCRT5000.]]
+
[[Obrázok:tcrt5000obr.jpg|300px|thumb|center|IR Senzor TCRT5000.]]
  
 
=== HC-SR04 ===
 
=== HC-SR04 ===
Ultrazvukový senzor na meranie vzdialenosti. Detekčná vzdialenosť od 1 cm do 3 m s presnosťou na 0.3 cm. Pozorovací uhol do 15°.
+
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,  
+
spotreba 8 mA,  
Frekvencia ultrazvuku 40 kHz,  
+
frekvencia ultrazvuku 40 kHz,  
Maximálna vzdialenosť 300 cm,  
+
maximálna vzdialenosť 300 cm,  
Minimálna vzdialenosť 1 cm,  
+
minimálna vzdialenosť 1 cm,  
Trigger puls 10 mikrosekúnd,  
+
presnosťou na 0.3 cm,
Uhol detekcie 15°.
+
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]
 
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Datasheet ATmega328p]
  
Riadok 37: Riadok 44:
  
 
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
 
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!
 
Nezabudnite doplniť schému zapojenia!
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
 
  
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
 
Algoritmus programu je....
 
 
  
 
<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>
 +
#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 PING_PIN 3
 +
long duration, distance;
 +
 +
#define FAST 110
 +
#define SLOW 80
 +
 +
#define OBSTACLE_DISTANCE_THRESHOLD 8 // vzdialenost prekazky od robota v cm pri ktorej sa jej zacne vyhybat
  
int main(void)
+
void setup()  
 
{
 
{
   unsigned int measuredValue;
+
   Serial.begin(9600);
 +
 
 +
  LeftServo.attach(SERVO_PIN_LEFT);
 +
  RightServo.attach(SERVO_PIN_RIGHT);
  
   while (1)
+
   pinMode(2, OUTPUT);
   {
+
   pinMode(9, OUTPUT);
    /*  relax  */ 
+
   pinMode(10, OUTPUT);
   }
 
  
   return(0);
+
   pinMode(3, INPUT);
 +
  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();
 
}
 
}
  
</source></tab>
+
void loop()
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
{
#include <avr/io.h>
+
  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));
  
void adc_init(void);                                   // A/D converter initialization
+
  // pinMode(PING_PIN, OUTPUT);
 +
  digitalWrite(TRIGGER_PIN, LOW);
 +
  delayMicroseconds(2);
 +
  digitalWrite(TRIGGER_PIN, HIGH);
 +
  delayMicroseconds(5);
 +
  digitalWrite(TRIGGER_PIN, LOW);
  
unsigned int adc_read(char a_pin);
+
  // pinMode(PING_PIN, INPUT);
</source></tab>
+
  duration = pulseIn(ECHO_PIN, HIGH);
</tabs>
+
  distance = (duration*.0343)/2;
 +
  Serial.print("Distance: ");
 +
  Serial.println(distance);
 +
  // distance = microsecondsToCentimeters(duration);
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
  // 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 if(distance <= OBSTACLE_DISTANCE_THRESHOLD)
 +
    {
 +
      LeftServo.write(90+FAST);
 +
      RightServo.write(90+FAST);
 +
      delay(10);
 +
      LeftServo.write(90-FAST);
 +
      RightServo.write(90-FAST);
 +
    }
 +
 
 +
  delay(5);
 +
  }
 +
 
 +
  // long microsecondsToCentimeters(long microseconds)
 +
  // {
 +
  // return microseconds / 29 / 2;
 +
  // }
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
 +
</source></tab>
 +
</tabs>
 +
Zdrojový kód: [[Médiá:ProjektMIPS_Kunakova.txt|ProjektMIPS_Kunakova.txt]]
  
 
=== Overenie ===
 
=== Overenie ===
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
 
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
 
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
[[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>_l02MBu41n0</youtube></center>
+
<center><youtube>https://youtu.be/5oAotqgNLbw</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 06:16, 14. 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á.

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.

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°.

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​.

Paralax Continuous Rotation Servo.

Literatúra:


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>
#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 PING_PIN 3
long duration, distance;

#define FAST 110
#define SLOW 80

#define OBSTACLE_DISTANCE_THRESHOLD 8 // vzdialenost prekazky od robota v cm 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(9, OUTPUT);
  pinMode(10, OUTPUT);

  pinMode(3, INPUT);
  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));

  // pinMode(PING_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(5);
  digitalWrite(TRIGGER_PIN, LOW);

  // pinMode(PING_PIN, INPUT);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = (duration*.0343)/2;
  Serial.print("Distance: ");
  Serial.println(distance);
  // distance = microsecondsToCentimeters(duration);

  // 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 if(distance <= OBSTACLE_DISTANCE_THRESHOLD)
    {
      LeftServo.write(90+FAST);
      RightServo.write(90+FAST);
      delay(10);
      LeftServo.write(90-FAST);
      RightServo.write(90-FAST);
    }
  
  delay(5);
  }
  
  // long microsecondsToCentimeters(long microseconds) 
  // {
  // return microseconds / 29 / 2;
  // }

Zdrojový kód: ProjektMIPS_Kunakova.txt

Overenie

Robot na čiare I.
Robot na čiare II.

Video:

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