Operácie

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

Z SensorWiki

(Analýza a opis riešenia)
 
(10 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 15: Riadok 15:
  
 
=== 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.]]
 
[[Súbor:hcsr40obr.png|300px|thumb|center|HC-SR40 utrazvukový senzor.]]
  
Riadok 43: 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
  
int main(void)
+
#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()  
 
{
 
{
   unsigned int measuredValue;
+
   Serial.begin(9600);
  
   while (1)
+
   LeftServo.attach(SERVO_PIN_LEFT);
   {
+
   RightServo.attach(SERVO_PIN_RIGHT);
    /*  relax  */ 
+
 
   }
+
  pinMode(2, OUTPUT);
 +
  pinMode(9, OUTPUT);
 +
   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.