Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия | |||
|
10i_2025_algo [2025/10/07 14:21] super_admin [РОБОТ МФТИ] |
10i_2025_algo [2025/10/07 14:22] (текущий) super_admin [РОБОТ МФТИ] |
||
|---|---|---|---|
| Строка 489: | Строка 489: | ||
| <code> | <code> | ||
| - | #include <IRremote.h> // подключаем библиотеку для работы с ИК-приёмником | ||
| - | |||
| - | |||
| - | const byte IR_RECEIVE_PIN = 8; // указываем пин, к которому подключен ИК-приёмник | ||
| - | |||
| - | #include <Servo.h> // подключаем библиотеку для работы с сервоприводом | ||
| - | Servo myservo7; // создать объект myservo | ||
| - | Servo myservo12; // создать объект myservo | ||
| - | |||
| const int LM_s1 = 10; // левый мотор вход 1 | const int LM_s1 = 10; // левый мотор вход 1 | ||
| Строка 503: | Строка 494: | ||
| const int RM_s1 = 5; // правый мотор вход 1 | const int RM_s1 = 5; // правый мотор вход 1 | ||
| const int RM_s2 = 6; // правый мотор вход 2 | const int RM_s2 = 6; // правый мотор вход 2 | ||
| + | |||
| + | int led_pin = 13; | ||
| + | // Укажем пины для подключения УЗ датчика | ||
| + | int trigPin = 12; | ||
| + | int echoPin = 11; | ||
| + | int s_for_obj = 0; | ||
| + | // текущее состояние системы | ||
| + | int state = 0; // начальное состояние | ||
| void setup(){ | void setup(){ | ||
| Serial.begin(9600); | Serial.begin(9600); | ||
| - | IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); | ||
| //правый | //правый | ||
| pinMode(RM_s1, OUTPUT); | pinMode(RM_s1, OUTPUT); | ||
| pinMode(RM_s2, OUTPUT); | pinMode(RM_s2, OUTPUT); | ||
| - | //левый | + | //левый |
| pinMode(LM_s1, OUTPUT); | pinMode(LM_s1, OUTPUT); | ||
| pinMode(LM_s2, OUTPUT); | pinMode(LM_s2, OUTPUT); | ||
| + | // УЗ | ||
| + | pinMode(trigPin, OUTPUT); | ||
| + | pinMode(echoPin, INPUT); | ||
| + | // светодиод | ||
| + | pinMode(led_pin, OUTPUT); | ||
| + | |||
| + | |||
| + | |||
| - | myservo12.attach(12); //указать пин, к которому подключен сервпривод | ||
| - | myservo7.attach(7); //указать пин, к которому подключен сервпривод | ||
| } | } | ||
| - | void loop() { | ||
| - | if (IrReceiver.decode()) { | ||
| - | Serial.println(IrReceiver.decodedIRData.decodedRawData); // выводим код нажатой кнопки в десятичном формате | ||
| - | switch (IrReceiver.decodedIRData.decodedRawData) { | + | int dist() // функция для вычисления расстояния |
| - | case 785449215: // Код кнопки "вперед" | + | { |
| - | //Serial.println("up"); | + | int t,s; // локальные переменные время, расстояние |
| - | moveForward(); | + | // установить высокий уровень на пине Trig |
| - | break; | + | digitalWrite(trigPin, 1); |
| - | case 768737535: // Код кнопки "назад" | + | // подождать 10 мс |
| - | moveBackward(); | + | delay(10/16); |
| - | break; | + | digitalWrite(trigPin, 0); |
| - | case 752025855: // Код кнопки "влево" | + | // узнаем время |
| - | turnLeft(); | + | t = pulseIn(echoPin, 1); |
| - | break; | + | // вычисляем расстояние |
| - | case 735314175: // Код кнопки "вправо" | + | s = t * 0.034/2; |
| - | turnRight(); | + | return (s); |
| - | break; | + | } |
| - | case 1387069695: // Код кнопки "остановка" (обычно это код повторного нажатия) | + | |
| - | stopMotors(); | + | |
| - | break; | + | |
| - | case 1437204735: // Код кнопки "A" | + | |
| - | check_servo(); | + | |
| - | break; | + | |
| - | default: | + | |
| - | stopMotors(); | + | |
| - | break; | + | |
| - | } | + | |
| - | IrReceiver.resume(); // готовимся к следующему сигналу | + | |
| + | |||
| + | void loop() { | ||
| + | s_for_obj = dist(); | ||
| + | //Serial.println(s_for_obj );// вывод измеренного расстояния в окно сообщений | ||
| + | //delay(20/16); | ||
| + | Serial.println(state); | ||
| + | switch (state) { | ||
| + | case 0: // начальное состояние: вперёд до первого препятствия | ||
| + | case 2: // после первого поворота: вперёд до второго препятствия | ||
| + | if (s_for_obj == 0 || s_for_obj > 50){ | ||
| + | moveForward(); | ||
| + | } else { | ||
| + | stopMotors(); | ||
| + | state ++; | ||
| } | } | ||
| + | break; | ||
| + | |||
| + | case 1: // перед первым препятствием: левый поворот | ||
| + | case 3: // перед вторым препятствием: левый поворот | ||
| + | turnLeft(); | ||
| + | delay(2970/16); | ||
| + | state ++; | ||
| + | stopMotors(); | ||
| + | break; | ||
| + | |||
| + | case 4: // после второго поворота: прямолинейный путь до остановки | ||
| + | moveForward(); | ||
| + | delay(8000/16); // время прямолинейного движения до остановки | ||
| + | state ++; | ||
| + | stopMotors(); | ||
| + | break; | ||
| + | |||
| + | case 5: // после остановки на площадке: включить светодиод на 4 секунды | ||
| + | // ... | ||
| + | break; | ||
| + | default: | ||
| + | stopMotors(); | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | |||
| } | } | ||
| void moveForward() { | void moveForward() { | ||
| - | Serial.println("up"); | + | //Serial.println("up"); |
| digitalWrite(LM_s1, 1); | digitalWrite(LM_s1, 1); | ||
| digitalWrite(LM_s2, 0); | digitalWrite(LM_s2, 0); | ||
| digitalWrite(RM_s1, 1); | digitalWrite(RM_s1, 1); | ||
| digitalWrite(RM_s2, 0); | digitalWrite(RM_s2, 0); | ||
| - | delay(60); | + | delay(20); |
| } | } | ||
| void moveBackward() { | void moveBackward() { | ||
| - | Serial.println("down"); | + | //Serial.println("down"); |
| digitalWrite(LM_s1, 0); | digitalWrite(LM_s1, 0); | ||
| Строка 569: | Строка 600: | ||
| digitalWrite(RM_s1, 0); | digitalWrite(RM_s1, 0); | ||
| digitalWrite(RM_s2, 1); | digitalWrite(RM_s2, 1); | ||
| - | delay(60); | + | delay(20); |
| } | } | ||
| Строка 577: | Строка 608: | ||
| digitalWrite(RM_s1, HIGH); | digitalWrite(RM_s1, HIGH); | ||
| digitalWrite(RM_s2, LOW); | digitalWrite(RM_s2, LOW); | ||
| - | delay(60); | + | delay(20); |
| } | } | ||
| Строка 585: | Строка 616: | ||
| digitalWrite(RM_s1, LOW); | digitalWrite(RM_s1, LOW); | ||
| digitalWrite(RM_s2, HIGH); | digitalWrite(RM_s2, HIGH); | ||
| - | delay(60); | + | delay(20); |
| } | } | ||
| Строка 593: | Строка 624: | ||
| digitalWrite(RM_s1, LOW); | digitalWrite(RM_s1, LOW); | ||
| digitalWrite(RM_s2, LOW); | digitalWrite(RM_s2, LOW); | ||
| - | delay(60); | + | //delay(20); |
| - | } | + | |
| - | + | ||
| - | // ********************************** | + | |
| - | + | ||
| - | void check_servo() { | + | |
| - | + | ||
| - | myservo12.write(45); | + | |
| - | Serial.println("check_servo12"); | + | |
| - | delay(2000/16); | + | |
| - | myservo7.write(45); | + | |
| - | Serial.println("check_servo7"); | + | |
| - | delay(2000/16); | + | |
| - | + | ||
| } | } | ||