Код (C++): int speed = 255; int trigPin = 4; int echoPin = 2; int motAF = 5; int motBF = 6; int motAB = 9; int motBB = 10; int analogPin = 1; long distance; long randNumber; void setup() { pinMode(motAF, OUTPUT); pinMode(motBF, OUTPUT); pinMode(motAB, OUTPUT); pinMode(motBB, OUTPUT); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); randomSeed(analogRead(0)); } void loop() { speed = analogRead(analogPin) / 4; distance = getDistance(); if (distance > 80) { analogWrite(motAF, speed); analogWrite(motBF, speed); } else { analogWrite(motAF, 0); analogWrite(motBF, 0); delay(500); randNumber = random(-120,120); analogWrite(motAB, speed/2+randNumber); analogWrite(motBB, speed/2-randNumber); delay(1000); analogWrite(motAB, 0); analogWrite(motBB, 0); delay(500); } delay(100); } long getEchoTiming() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin,HIGH); return duration; } long getDistance() { long distacne_cm = getEchoTiming()/29/2; return distacne_cm; } Код (C++): int speed = 255; int trigPin = 4; int echoPin = 2; int motAF = 5; int motBF = 6; int motAB = 9; int motBB = 10; int analogPin = 1; int linePin = 3; long distance; long randNumber; int line1; void setup() { pinMode(motAF, OUTPUT); pinMode(motBF, OUTPUT); pinMode(motAB, OUTPUT); pinMode(motBB, OUTPUT); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); pinMode(linePin,INPUT); randomSeed(analogRead(0)); } void loop() { speed = analogRead(analogPin) / 4; line1 = digitalRead(linePin); if (line1 > 0) { analogWrite(motBF, speed); analogWrite(motAF, 0); } else { analogWrite(motAF, speed); analogWrite(motBF, 0); } delay(100); }
Код (C++): int speed = 255; // скорость робота int trigPin = 4; // передатчик датчика расстояния int echoPin = 2; // приемник датчика расстояния int motAF = 5; // мотор А вперел int motBF = 6; // мотор В вперел int motAB = 9; // мотор А назад int motBB = 10; // мотор В назад int analogPin = 1; // потенциометр int linePin1 = 3; // датчик линии спереди слева int linePin2 = 8; // датчик линии спереди справа int linePin3 = 11; // датчик линии сзади слева int linePin4 = 12; // датчик линии сзади справа int buttonPin = 7; // кнопка int buzzerPin = 13; int ring = 75; long distance; long randNumber; long enemy = 0; boolean line1; boolean line2; boolean line3; boolean line4; boolean mybutton = false; boolean buttonpress = false; boolean newstate; // mystate = 0 - ожидание нажатия кнопки // mystate = 1 - поиск соперника // mystate = 2 - выталкиваем контролируя линию и наличие соперника // mystate = 3 - отъезжаем назад если обнаружена линия спереди слева // mystate = 4 - отъезжаем назад если обнаружена линия спереди справа // mystate = 5 - увиливаем вбок если обнаружена линия сзади слева // mystate = 6 - увиливаем вбок если обнаружена линия сзади справа int mystate = 0; void setup() { pinMode(motAF, OUTPUT); pinMode(motBF, OUTPUT); pinMode(motAB, OUTPUT); pinMode(motBB, OUTPUT); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); pinMode(linePin1,INPUT); pinMode(linePin2,INPUT); pinMode(linePin3,INPUT); pinMode(linePin4,INPUT); pinMode(buttonPin,INPUT_PULLUP); randomSeed(analogRead(0)); Serial.begin(9600); Serial.println("SUMO BOT start"); } void loop() { speed = analogRead(analogPin) / 4; line1 = digitalRead(linePin1); line2 = digitalRead(linePin2); line3 = !(digitalRead(linePin3)); line4 = !(digitalRead(linePin4)); delay (2); if (line1 && digitalRead(linePin1)) line1 = true; else line1 = false; if (line2 && digitalRead(linePin2)) line2 = true; else line2 = false; if (line3 && !(digitalRead(linePin3))) line3 = true; else line3 = false; if (line4 && !(digitalRead(linePin4))) line4 = true; else line4 = false; delay (2); if (line3 && !(digitalRead(linePin3))) line3 = true; else line3 = false; if (line4 && !(digitalRead(linePin4))) line4 = true; else line4 = false; // line1 = false; // line2 = false; line3 = false; line4 = false; buttonpress = digitalRead(buttonPin); //line3 = !line3; //line4 = !line4; distance = getDistance(); Serial.print("line: "); Serial.print(line1); Serial.print(line2); Serial.print(line3); Serial.print(line4); Serial.print(" distance: "); Serial.println(distance); Serial.print(" button: "); Serial.print(mybutton); Serial.println(buttonpress); newstate = false; if (!buttonpress) { buzzer(); delay(1000); if (mystate != 0) newstate = true; mystate = 0; mybutton = !mybutton; } if (distance <= ring && enemy == 0) enemy++; if (enemy > 0) enemy++; if (enemy > 8) enemy = 0; if (distance > ring && !line1 && !line2 && !line3 && !line4 && !newstate && mybutton && enemy == 0) { if (mystate != 1) newstate = true; mystate = 1; enemy = 0; } if (!line1 && !line2 && !line3 && !line4 && !newstate && mybutton && enemy > 0) { if (mystate != 2) newstate = true; mystate = 2; } if (line1 && !newstate && mybutton) { if (mystate != 3) newstate = true; mystate = 3; enemy = 0; } if (line2 && !newstate && mybutton) { if (mystate != 4) newstate = true; mystate = 4; enemy = 0; } if (line3 && !newstate && mybutton) { if (mystate != 5) newstate = true; mystate = 5; enemy = 0; } if (line4 && !newstate && mybutton) { if (mystate != 6) newstate = true; mystate = 6; enemy = 0; } if (newstate) { Serial.print("new state: "); Serial.println(mystate); analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); buzzer (); if (distance > ring / 2) buzzer (); if (distance > ring) buzzer (); if (distance > ring * 2) buzzer (); //delay (1000); } Serial.print("current state: "); Serial.println(mystate); switch (mystate) { case 0: analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); break; case 1: analogWrite(motAB, speed / 3); analogWrite(motBF, speed / 3); delay(10); break; case 2: analogWrite(motAF, speed); analogWrite(motBF, speed); delay(40); break; case 3: analogWrite(motAB, speed); analogWrite(motBB, speed / 1.4); buzzer(); delay(1000); analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); break; case 4: analogWrite(motAB, speed / 1.4); analogWrite(motBB, speed); buzzer(); delay(1000); analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); break; case 5: analogWrite(motAF, speed); analogWrite(motBF, speed / 1.4); buzzer(); buzzer(); delay(1000); analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); break; case 6: analogWrite(motAF, speed); analogWrite(motBF, speed / 1.4); buzzer(); buzzer(); delay(1000); analogWrite(motAF, 0); analogWrite(motBF, 0); analogWrite(motAB, 0); analogWrite(motBB, 0); break; } delay(10); } long getEchoTiming() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin,HIGH); return duration; } long getDistance() { long distacne_cm = getEchoTiming()/29/2; //distacne_cm = (distacne_cm + getEchoTiming()/29/2) / 2; //if (distacne_cm > 700) distacne_cm = 700; return distacne_cm; } void buzzer() { digitalWrite(buzzerPin, HIGH); delay(25); digitalWrite(buzzerPin, LOW); delay(25); }