Введение
В современном мире стремительно растёт интерес к программированию, микроэлектронике и робототехнике, особенно в образовательной среде. Как обучающиеся школы интеллектуального развития мы постоянно совершенствуем свои навыки в программировании и робототехники и на данный момент изучаем новую для себя среду - Arduino UNO R3, которая является одной из наиболее популярных платформ для начинающих благодаря своей простоте, доступности и широким возможностям. Однако мы столкнулись с проблемой сопровождающей процесс освоения программирования и создания проектов на Arduino –это недостаток опыта и сложность поиска информации. В связи с этим мы решили, что нейросети, обладающие способностью анализировать большие объёмы данных, генерировать код и адаптироваться к запросам пользователя, могут стать эффективным инструментом для преодоления этих трудностей. Их использование в образовательных целях позволяет автоматизировать процесс создания проектов.
В связи с этим мы поставили перед собой цель- апробировать методику использования нейросетей в качестве обучающего пособия для создания мини-проектов на Arduino UNO R3 на примере проекта «Кликер». Для достижения цели мы поставили перед собой ряд задач:
-Изучить возможности применения нейросетей в образовательных целях;
-Проанализировать возможности платформы Arduino UNO R3 для создания мини-проектов при помощи использования нейросетей;
-Разработать проект «Кликер» с использованием нейросети в качестве консультанта;
-Провести апробацию методики и оценить её эффективность.
В рамках работы ы опирались на следующие источники:
Статьи об использовании и применении ИИ в образовании из интернет-источников https://kontur.ru, https://habr.com/ru, а так же методические пособия по работе с ARDUINO https://robstore.ru, https://supereyes.ru.
Глава 1. Теоретическое обоснование использования нейро-сетей в качестве обучающих пособий для создания мини-проектов на АRDUINO UNO R3
1.1 Возможности применения нейросетей в образовательных целях
Языковые модели нейросетей способны генерировать тексты, коды, решения задач на основе заданных ей данных. В образовании они могут быть использованы для создания инструкций, генерации кодов, ответов на вопросы учеников и коррекции выполненных детьми заданий.. Возможности нейросетей в образовании можно структурировать по нескольким ключевым направлениям, каждое из которых вносит вклад в создание более эффективной обучающей среды.
В первую очередь это персонализация обучения.[1]
Основываясь на диалоге нейросеть определяет текущий уровень понимания учеником, выявляет пробелы и устойчивые заблуждения, которые требуют коррекции, так же при помощи нейросети можно переформулировать объяснение сложных тем, адаптируя их под возраст ученика.
Вторая немаловажная возможность это генерация образовательного контента-создание учебных планов, лекций, конспектов, так же разработка практических заданий и задач для учеников. [2]
Одной из наиболее удачных возможностей нейросетей мы считаем возможность перевода текста на множество языков, что позволяет расширить возможности использования ИИ в классах с билингвами, иммигрантами, а так же делиться своими разработками с детьми из других стран, что дает возможность глобально делиться своими проектами. [4]
Как юных инженеров нас интересует больше всего возможность генерации и объяснения принципа работы кодов при помощи нейросетей. Нейросеть объясняет созданный код, дает возможности экспериментов, показывает несколько решений одной и той же задачи и позволяет сконцентрироваться на тестировании робота, отладке его работы и совершенствованию . Так же при использовании нейросети для разработки кода развиваются навыки логического мышления, в связи с тем, что для получения хорошего кода и адекватно работающей программы необходимо структурированно и подробно написать промт.[3]
Однако, несмотря на огромный потенциал использования нейросетей обращение к ним должно быть взвешенным и ответственным. В первую очередь необходимо проверять достоверность полученной информации, оценить ее применимость к своему запросу, а так же не поддаваться соблазну делегировать всю работу искусственному интеллекту не полагаясь на свой собственный.
Глава 2. . Использование нейро-сетей в качестве обучающих пособий для создания мини-проектов на АRDUINO UNO R3 на примере проекта «Кликер»
Создание мини-проекта «Кликер» на базе АRDUINO UNO R3
«Кликер» это мини-проект представляющий собой устройство, подсчитывающее количество нажатий на кнопку и выводящее результат на дисплей. Он включает:
-кнопку для ввода;(Приложение, Рисунок 1)
-семисегментный индикатор;(Приложение, Рисунок 2)
-микроконтроллер Arduino UNO R3 для обработки данных. (Приложение, Рисунок 3) [4]
Для создания мини-проекта мы использовались схемой, найденной в методических пособиях.[3](Приложение, Рисунок 4) Основываясь на предложенную схему мы создали свой мини-проект, проверили подключение к микроконтроллеру и работоспособность всех сегментов индикатора для исключения ошибок при проведении эксперимента с нейросетью. (Приложение, Рисунок 5). [5]
2.2 Процесс создания кода для мини-проекта «Кликер» при помощи нейросетей
Изучив возможности различных сетей мы решили воспользоваться DEEPSEEK чатом располаженным по адресу https://pr-cy.ru/. Для успешности эксперимента мы решили остановиться на 5 промтах-запросах, результат проверки которых расположили в таблице ниже.
В таблице мы указали: промт, вид кода, успешность его использования.
Таблица 1.
|
Промт |
Код и его описание |
Успешность использования в мини-проекте |
|
«Напиши код для Arduino UNO, который реализует простой счетчик нажатий на кнопку. Используй:
|
// Определяем пины для семисегментного индикатора (общий катод) const int segmentA = 3; const int segmentB = 4; const int segmentC = 5; const int segmentD = 6; const int segmentE = 7; const int segmentF = 8; const int segmentG = 9; // Пиндлякнопки const int buttonPin = 2; // Переменные для обработки кнопки int buttonState = 0; int lastButtonState = 0; int counter = 0; // Массив для отображения цифр на семисегментном индикаторе // Каждый элемент массива соответствует сегментам A-G (0-6) // 1 означает, что сегмент включен, 0 - выключен byte digitPatterns[10][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1} // 9 }; void setup() { // Настраиваем пины сегментов как выходы pinMode(segmentA, OUTPUT); pinMode(segmentB, OUTPUT); pinMode(segmentC, OUTPUT); pinMode(segmentD, OUTPUT); pinMode(segmentE, OUTPUT); pinMode(segmentF, OUTPUT); pinMode(segmentG, OUTPUT); // Настраиваем пин кнопки как вход с подтягивающим резистором pinMode(buttonPin, INPUT_PULLUP); // Выводим начальное значение (0) displayDigit(counter); } void loop() { // Считываем состояние кнопки buttonState = digitalRead(buttonPin); // Проверяем изменение состояния кнопки (нажатие) if (buttonState != lastButtonState) { if (buttonState == LOW) { // Кнопканажата (таккакиспользуется INPUT_PULLUP) counter++; if (counter > 9) { counter = 0; } displayDigit(counter); } // Задержка для устранения дребезга контактов delay(50); } // Сохраняем текущее состояние кнопки lastButtonState = buttonState; } // Функция для отображения цифры на семисегментном индикаторе void displayDigit(int digit) { // Проверяем, что цифра в допустимом диапазоне if (digit >= 0 && digit <= 9) { // Устанавливаем состояние каждого сегмента digitalWrite(segmentA, digitPatterns[digit][0]); digitalWrite(segmentB, digitPatterns[digit][1]); digitalWrite(segmentC, digitPatterns[digit][2]); digitalWrite(segmentD, digitPatterns[digit][3]); digitalWrite(segmentE, digitPatterns[digit][4]); digitalWrite(segmentF, digitPatterns[digit][5]); digitalWrite(segmentG, digitPatterns[digit][6]); } } |
Данная программа не дала положительного результата, семисегментный индикатор не реагировал на нажатия кнопки. |
|
«Усовершенствуй предыдущий код. Сделай так, чтобы короткое нажатие кнопки (менее 0.5 секунды) увеличивало счетчик на 1. |
// Определяем пины для семисегментного индикатора (общий катод) const int segmentA = 3; const int segmentB = 4; const int segmentC = 5; const int segmentD = 6; const int segmentE = 7; const int segmentF = 8; const int segmentG = 9; // Пиндлякнопки const int buttonPin = 2; // Переменные для обработки кнопки int buttonState = 0; int lastButtonState = 0; unsigned long pressStartTime = 0; // Времяначаланажатия const unsigned long shortPressDuration = 500; // Длительностькороткогонажатия (0.5 секунды) int counter = 0; // Массив для отображения цифр на семисегментном индикаторе // Каждый элемент массива соответствует сегментам A-G (0-6) // 1 означает, что сегмент включен, 0 - выключен byte digitPatterns[10][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1} // 9 }; void setup() { // Настраиваем пины сегментов как выходы pinMode(segmentA, OUTPUT); pinMode(segmentB, OUTPUT); pinMode(segmentC, OUTPUT); pinMode(segmentD, OUTPUT); pinMode(segmentE, OUTPUT); pinMode(segmentF, OUTPUT); pinMode(segmentG, OUTPUT); // Настраиваем пин кнопки как вход с подтягивающим резистором pinMode(buttonPin, INPUT_PULLUP); // Выводим начальное значение (0) displayDigit(counter); } void loop() { // Считываем состояние кнопки buttonState = digitalRead(buttonPin); // Если кнопка нажата (состояние LOW) if (buttonState == LOW) { // Запоминаем время начала нажатия if (lastButtonState == HIGH) { pressStartTime = millis(); } } // Если кнопка отпущена (состояние HIGH) if (buttonState == HIGH && lastButtonState == LOW) { // Вычисляемдлительностьнажатия unsigned long pressDuration = millis() - pressStartTime; // Если это короткое нажатие (менее 0.5 секунды) if (pressDuration < shortPressDuration) { counter++; if (counter > 9) { counter = 0; } displayDigit(counter); } } // Сохраняемтекущеесостояниекнопки lastButtonState = buttonState; } // Функция для отображения цифры на семисегментном индикаторе void displayDigit(int digit) { // Проверяем, что цифра в допустимом диапазоне if (digit >= 0 && digit <= 9) { // Устанавливаем состояние каждого сегмента digitalWrite(segmentA, digitPatterns[digit][0]); digitalWrite(segmentB, digitPatterns[digit][1]); digitalWrite(segmentC, digitPatterns[digit][2]); digitalWrite(segmentD, digitPatterns[digit][3]); digitalWrite(segmentE, digitPatterns[digit][4]); digitalWrite(segmentF, digitPatterns[digit][5]); digitalWrite(segmentG, digitPatterns[digit][6]); } } |
Данная программа так же не показала положительного результата. |
|
Код выдает большое число ошибок, измени код таким образом, что бы параметры описанные в предыдущих запросах сохранились, но все спорные моменты были исключены |
// Определение пинов для семисегментного индикатора (общий катод) #define SEG_A 3 #define SEG_B 4 #define SEG_C 5 #define SEG_D 6 #define SEG_E 7 #define SEG_F 8 #define SEG_G 9 // Пиндлякнопки #define BUTTON_PIN 2 // Время короткого нажатия (в миллисекундах) #define SHORT_PRESS 500 // Состояниякнопки #define BTN_RELEASED HIGH #define BTN_PRESSED LOW // Структура для хранения данных о кнопке struct { uint8_t currentState; uint8_t lastState; unsigned long pressTime; } button; // Счетчик uint8_t counter = 0; // Паттерны для отображения цифр (0-9) на семисегментном индикаторе const uint8_t digitPatterns[10][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1} // 9 }; void setup() { // Настройка пинов сегментов как выходы for (uint8_t pin = SEG_A; pin <= SEG_G; pin++) { pinMode(pin, OUTPUT); } // Настройка пина кнопки с подтягивающим резистором pinMode(BUTTON_PIN, INPUT_PULLUP); // Инициализациясостояниякнопки button.lastState = digitalRead(BUTTON_PIN); // Отображение начального значения displayDigit(counter); } void loop() { // Чтение текущего состояния кнопки button.currentState = digitalRead(BUTTON_PIN); // Обработканажатиякнопки if (button.currentState == BTN_PRESSED && button.lastState == BTN_RELEASED) { // Фиксация времени начала нажатия button.pressTime = millis(); } // Обработкаотпусканиякнопки if (button.currentState == BTN_RELEASED && button.lastState == BTN_PRESSED) { // Проверка длительности нажатия if (millis() - button.pressTime < SHORT_PRESS) { // Увеличение счетчика при коротком нажатии counter = (counter + 1) % 10; displayDigit(counter); } } // Обновление предыдущего состояния кнопки button.lastState = button.currentState; // Небольшая задержка для стабильности delay(10); } // Функция отображения цифры на семисегментном индикаторе void displayDigit(uint8_t digit) { // Проверка допустимого диапазона if (digit > 9) return; // Управлениесегментами digitalWrite(SEG_A, digitPatterns[digit][0]); digitalWrite(SEG_B, digitPatterns[digit][1]); digitalWrite(SEG_C, digitPatterns[digit][2]); digitalWrite(SEG_D, digitPatterns[digit][3]); digitalWrite(SEG_E, digitPatterns[digit][4]); digitalWrite(SEG_F, digitPatterns[digit][5]); digitalWrite(SEG_G, digitPatterns[digit][6]); } |
Данная программа дала положительный результат, код подошел для работы с семисегментным индикатором, каждое нажатие на кнопку меняло число на дисплее. |
|
Опиши принцип написания кода и подробно распиши каждую команду кода |
этот код для Arduino Uno R3 — это как цифровой часовой с термометром. Его главная задача — постоянно считывать температуру и показывать её на экране, но при этом всегда быть начеку и реагировать на нажатие аварийной кнопки, как самая важная команда. Давай разберем его логику по шагам, как он работает в реальной жизни: 1. Подготовка и настройка (в `setup()`) * Микроконтроллер просыпается и знакомится со всеми устройствами: «Ты, дисплей, будь готов показывать цифры. А ты, кнопка, на пине 2, стой и жди сигнала. Датчик температуры, начинай измерения». Настраивается кнопка: ей говорят, что при нажатии она должна послать особый сигнал — прерывание. Это как если бы у часового был прямой, приоритетный звонок, который он обязан принять мгновенно*, даже если он в этот момент что-то делает. 2. Основной цикл работы (в `loop()`) Это рутина часового: * Спросить температуру: Он идет к датчику, считывает показания. * Показать на экране: Идет к дисплею и выводит полученное значение. * Сделать паузу: Ждет ровно 1 секунду (1000 миллисекунд), чтобы информация не мелькала слишком быстро. * Повторить: И снова по кругу — спросить, показать, подождать. Это происходит бесконечно. 3. Система аварийного реагирования (функция `buttonPressed()`) А вот это — самое важное. Это не часть основного цикла. Это отдельная, приоритетная программа. * Прямая связь: Когда кнопка нажата, она посылает сигнал прерывания. Основной цикл (всё, что делалось в `loop()`) мгновенно приостанавливается. Микроконтроллер бросает все дела. * Выполнение команды: Запускается функция `buttonPressed()`. Она делает одно действие: включает встроенный светодиод (обычно на 13 пине) и оставляет его включенным. * Важный момент: После этого функция завершается, но основной цикл не возвращается к прежней работе. Он навсегда останавливается на паузе (`delay(1000)`). Светодиод будет гореть, а показания температуры больше не обновляются. Это и есть состояние «тревоги», которое сбрасывается только перезагрузкой платы. Ключевая идея кода: Он демонстрирует приоритет асинхронных событий. Фоновый мониторинг температуры (главный цикл) важен, но реакция на критическое событие (нажатие кнопки через прерывание) — абсолютный приоритет. После такого события обычная работа прекращается, что имитирует переход системы в аварийный режим. |
Данное описание не соответствует созданной нами программы что говорит о том, что написание проста (запроса) для нейросети играет ключевое значение. |
Мы провели эксперимент в котором создали 4 запроса с целью запуска кликера при помощи нейросетей и из 4 удачным был лишь один. Мы сделали вывод, что написание запроса для нейросети имеет ключевое значение, возможности исправления неудачного запроса возможны и в целом приводят к положительному результату. Так же в процессе аппробации этой идеи мы увидели, что описание кода достаточно подробно и позволяет понять логику написания кодов, которые позволяют в пеерспктиве создавать собственные, что делает использование нейросети в качестве методичсекого материала для создания мини-проектов вполне рациональным.
Заключение
Проведённое исследование подтвердило высокую эффективность использования нейросетей в качестве интерактивного обучающего пособия для освоения платформы Arduino UNO R3 на примере создания мини-проекта «Кликер». В ходе работы мы изучили теоретические основы применения нейросетей в образовании, что позволило выделить их ключевые преимущества: способность генерировать персонализированный код, давать развёрнутые пояснения и адаптироваться к уровню пользователя.
Мы в ходе эксперимента смогли реализовать проект «Кликер» с непосредственным участием нейросети. Нейросеть выступила в роли интеллектуального ассистента, сгенерировав рабочий код, схему подключения и подробные комментарии, что значительно ускорило процесс разработки. В рамках аппробации методикимы проанализировали практическое применение нейросетей, с помощью которой удалось создать работающее устройство. Это снизило порог вхождения, минимизировало типичные ошибки на этапе написания кода и повысило мотивацию к дальнейшему изучению темы. Таким образом мы убедились , что нейросети могут стать мощным инструментом для преодоления начальных трудностей в программировании Arduino.Однако,нейросеть не заменяет глубокого понимания принципов электроники и кодинга, но выступает как «умный наставник», который демонстрирует готовые решения, комментирует каждый шаг, решаает конкретные проблемы пользователя.
Данное исследование может быть применено на урокахробототехники информатики микроэлектроники а так же использоваться в качестве основы ля самоизучения возможностей нейросети для обучения работе с ARDUINO.
Список литературы
Интернет источники:
https://pr-cy.ru/ ;
https://kontur.ru;
https://habr.com/ru;
https://robstore.ru;
https://supereyes.ru.
Приложение
|
Рисунок 1 |
Рисунок 2 |
|
Рисунок 3 |
Рисунок 4 |
|
Рисунок 5 |
|