Operácie

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 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]
  
  
Riadok 44: Riadok 53:
  
 
=== 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>
 +
 +
#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)
  
int main(void)
+
#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()  
 
{
 
{
   unsigned int measuredValue;
+
   // 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
  
   while (1)
+
   // 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)  
 
   {
 
   {
     /*  relax  */
+
     OCR1B = pwm_value; // Servo 2
 
   }
 
   }
 +
}
 +
 +
void setup()
 +
{
 +
  servo_init();
  
   return(0);
+
   // 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();
 
}
 
}
  
</source></tab>
+
ISR(PCINT2_vect)
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
{
#include <avr/io.h>
+
  // 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
  
void adc_init(void);                                  // A/D converter initialization
+
  // Premena sirky impulzu na vzdialenost v cm
 +
  uint16_t distance = pulse_width / 58;
  
unsigned int adc_read(char a_pin);
+
  // Kontrola ci prekazka je aspom 3cm od robota
</source></tab>
+
  if (distance >= OBSTACLE_DISTANCE_THRESHOLD)
</tabs>
+
    return false; // V prahovej vzdialenosti nebola zistena ziadna prekazka
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
  return true; // Zistena prekazka
 +
}
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
 +
</source></tab>
 +
</tabs>
 +
Zdrojový kód: [[Médiá:semestralnyProjektKunakova.txt|semestralnyProjektKunakova.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></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á.

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

RGB LED.

Nezabudnite doplniť schému zapojenia!

Schéma zapojenia LCD displeja.


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

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

Video:

'"`UNIQ--youtube-00000004-QINU`"'

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