Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
10i_2025_algo [2025/02/06 16:28] super_admin [Подключение кнопки с учетом борьбы с дребезгом кнопок] |
10i_2025_algo [2025/03/14 16:16] (текущий) super_admin [Четвёртый этап] |
||
---|---|---|---|
Строка 51: | Строка 51: | ||
===== Третий этап ===== | ===== Третий этап ===== | ||
- | * [[https://uchebnik.mos.ru/material/3697?menuReferrer=catalogue]] - **Виртуальная лаборатория: "Технология. Моделирование роботов**" | + | * [[https://uchebnik.mos.ru/material/3697]] - **Виртуальная лаборатория: "Технология. Моделирование роботов**" |
* [[https://disk.yandex.ru/d/xbNtfVR2eoPMgg]] - ссылка на учебные материалы (задание, критерии оценки, презентация, демонстрация возможного результата) | * [[https://disk.yandex.ru/d/xbNtfVR2eoPMgg]] - ссылка на учебные материалы (задание, критерии оценки, презентация, демонстрация возможного результата) | ||
- | * https://uchebnik.mos.ru/material/x581130?sharing_key=25ee8317-0888-402f-bde4-e2305745b89c Робот с манипулятором и ИК датчиком (ссылка закодирована). | + | * [[https://uchebnik.mos.ru/material/603925?sharing_key=725feac9-6787-4e7f-bd00-0cdfaa781676]] Пример работы УЗ датчика v1 |
+ | * https://uchebnik.mos.ru/material/512435?sharing_key=36ece898-ef99-40a8-b9ac-98973d7cd87e Робот с гусеницами. | ||
+ | * https://uchebnik.mos.ru/material/603948?sharing_key=29f7b5b6-cca7-4fa5-8184-f551aa76c9d1 v2 Робот с гусеницами и УЗ | ||
+ | ===== Четвёртый этап ===== | ||
+ | * [[https://disk.yandex.ru/d/uEbF0xSYLLpxSQ]] материалы, задание | ||
+ | * https://school.mos.ru/vrlabs/electrodynamics/app?link=9frFsPHb5f8ag3Cdk0f5 - вирт. лаб. Эл. дин. | ||
+ | * https://skysmart.ru/articles/physics/parallelnoe-i-posledovatelnoe-soedinenie расчёт сопротивлений | ||
+ | * https://forms.yandex.ru/cloud/67d428835056906066cbd6f4/ - форма для отчёта о проделанной работе. | ||
==== Вспомогательные ресурсы: ==== | ==== Вспомогательные ресурсы: ==== | ||
* [[https://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0 | Основные законы электричества]] | * [[https://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0 | Основные законы электричества]] | ||
Строка 279: | Строка 286: | ||
- https://www.codingame.com/clashofcode/clash/389081723b18d5e80676437434bb8c5da3fc51f | - https://www.codingame.com/clashofcode/clash/389081723b18d5e80676437434bb8c5da3fc51f | ||
+ | - https://uchebnik.mos.ru/material/607641?sharing_key=0f8055c9-7135-4651-b22f-6c68bf58df64 !!! | ||
+ | |||
+ | <code c++> | ||
+ | |||
+ | const int LM_s1 = 10; // левый мотор вход 1 | ||
+ | const int LM_s2 = 9; // левый мотор вход 2 | ||
+ | const int RM_s1 = 5; // правый мотор вход 1 | ||
+ | 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(){ | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | //правый | ||
+ | pinMode(RM_s1, OUTPUT); | ||
+ | pinMode(RM_s2, OUTPUT); | ||
+ | //левый | ||
+ | pinMode(LM_s1, OUTPUT); | ||
+ | pinMode(LM_s2, OUTPUT); | ||
+ | // УЗ | ||
+ | pinMode(trigPin, OUTPUT); | ||
+ | pinMode(echoPin, INPUT); | ||
+ | // светодиод | ||
+ | pinMode(led_pin, OUTPUT); | ||
+ | } | ||
+ | |||
+ | |||
+ | int dist() // функция для вычисления расстояния | ||
+ | { | ||
+ | int t,s; // локальные переменные время, расстояние | ||
+ | // установить высокий уровень на пине Trig | ||
+ | digitalWrite(trigPin, 1); | ||
+ | // подождать 10 мс | ||
+ | delay(10/16); | ||
+ | digitalWrite(trigPin, 0); | ||
+ | // узнаем время | ||
+ | t = pulseIn(echoPin, 1); | ||
+ | // вычисляем расстояние | ||
+ | s = t * 0.034/2; | ||
+ | return (s); | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | 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 > 68){ | ||
+ | moveForward(); | ||
+ | } else { | ||
+ | stopMotors(); | ||
+ | state ++; | ||
+ | } | ||
+ | break; | ||
+ | |||
+ | case 1: // перед первым препятствием: левый поворот | ||
+ | case 3: // перед вторым препятствием: левый поворот | ||
+ | turnLeft(); | ||
+ | delay(2970/16); | ||
+ | state ++; | ||
+ | stopMotors(); | ||
+ | break; | ||
+ | |||
+ | case 4: // после второго поворота: прямолинейный путь до остановки | ||
+ | moveForward(); | ||
+ | delay(23000/16); // время прямолинейного движения до остановки | ||
+ | state ++; | ||
+ | stopMotors(); | ||
+ | break; | ||
+ | |||
+ | case 5: // после остановки на площадке: включить светодиод на 4 секунды | ||
+ | digitalWrite(led_pin, 1); | ||
+ | delay(4000/16); | ||
+ | digitalWrite(led_pin, 0); | ||
+ | state ++; | ||
+ | break; | ||
+ | case 6: // | ||
+ | stopMotors(); | ||
+ | break; | ||
+ | default: | ||
+ | stopMotors(); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void moveForward() { | ||
+ | //Serial.println("up"); | ||
+ | digitalWrite(LM_s1, 1); | ||
+ | digitalWrite(LM_s2, 0); | ||
+ | digitalWrite(RM_s1, 1); | ||
+ | digitalWrite(RM_s2, 0); | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | void moveBackward() { | ||
+ | //Serial.println("down"); | ||
+ | |||
+ | digitalWrite(LM_s1, 0); | ||
+ | digitalWrite(LM_s2, 1); | ||
+ | digitalWrite(RM_s1, 0); | ||
+ | digitalWrite(RM_s2, 1); | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | void turnLeft() { | ||
+ | digitalWrite(LM_s1, LOW); | ||
+ | digitalWrite(LM_s2, HIGH); | ||
+ | digitalWrite(RM_s1, HIGH); | ||
+ | digitalWrite(RM_s2, LOW); | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | void turnRight() { | ||
+ | digitalWrite(LM_s1, HIGH); | ||
+ | digitalWrite(LM_s2, LOW); | ||
+ | digitalWrite(RM_s1, LOW); | ||
+ | digitalWrite(RM_s2, HIGH); | ||
+ | delay(20); | ||
+ | } | ||
+ | |||
+ | void stopMotors() { | ||
+ | digitalWrite(LM_s1, LOW); | ||
+ | digitalWrite(LM_s2, LOW); | ||
+ | digitalWrite(RM_s1, LOW); | ||
+ | digitalWrite(RM_s2, LOW); | ||
+ | //delay(20); | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ====== РОБОТ МФТИ ====== | ||
+ | |||
+ | [[http://judge.mipt.ru/mipt_cs_on_python3/labs/lab2.html]] РОБОТ | ||
+ | * {{ :robot-tasks-master_.zip |}} - Архив с файлами робота (модификация: в файле pyrob/api.py добавлен, приведенный ниже код, упрощающий написание команд (инструкций) управления роботом) | ||
+ | |||
+ | <code python> | ||
+ | ml = move_left #Пройти n клеток влево (по умолчанию n = 1) | ||
+ | mr = move_right #Пройти n клеток вправо (по умолчанию n = 1) | ||
+ | mu = move_up #Пройти n клеток вверх (по умолчанию n = 1) | ||
+ | md = move_down #Пройти n клеток вниз (по умолчанию n = 1) | ||
+ | wu = wall_is_above #если сверху стена, возвращает True, иначе — False | ||
+ | wd = wall_is_beneath #если снизу стена, возвращает True, иначе — False | ||
+ | wl = wall_is_on_the_left #если слева стена, возвращает True, иначе — False | ||
+ | wr = wall_is_on_the_right #если справа стена, возвращает True, иначе — False | ||
+ | fill = fill_cell #Закрасить текущую клетку | ||
+ | #cell_is_filled #Возвращает True, если текущая клетка закрашена | ||
+ | #mov #Поместить значение v в регистр r | ||
+ | |||
+ | </code> | ||
+ | |||
+ | **Пример решения первой задачи** | ||
+ | |||
+ | {{:2023-10-15_22_50_21-window.png?nolink|}} | ||
+ | |||
+ | <code python> | ||
+ | #!/usr/bin/python3 | ||
+ | |||
+ | from pyrob.api import * | ||
+ | |||
+ | |||
+ | @task | ||
+ | def task_1_1(): | ||
+ | #pass | ||
+ | mr(2) # Пройти 2 клетки вправо или: move_right(2) | ||
+ | md(1) # Пройти 1 клетку вниз или: move_down(2) | ||
+ | |||
+ | |||
+ | if __name__ == '__main__': | ||
+ | run_tasks() | ||
+ | </code> | ||
+ | |||
+ |