Autíčko na diaľkové ovládanie
Zo stránky SensorWiki
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
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: kodSemestralnyProjektKunakova.txt
Overenie
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.