#include #include #include #include #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 }