Использование нейро-сетей в качестве обучающих пособий для создания мини-проектов на АRDUINO UNO R3 на примере проекта «Кликер»

XXVII Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Использование нейро-сетей в качестве обучающих пособий для создания мини-проектов на АRDUINO UNO R3 на примере проекта «Кликер»

Домышев Д.Н. 1Александров А.А. 1Александров Е.А. 1Хайдаршин (Воронин) А.Ж. 1
1Школа интеллектуального развития "Мистер Брейни"
Будрёнкина Анастасия Владимировна 1
1Школа интеллектуального развития "Мистер Брейни"
Автор работы награжден дипломом победителя II степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

В современном мире стремительно растёт интерес к программированию, микроэлектронике и робототехнике, особенно в образовательной среде. Как обучающиеся школы интеллектуального развития мы постоянно совершенствуем свои навыки в программировании и робототехники и на данный момент изучаем новую для себя среду - 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 на примере проекта «Кликер»

    1. Создание мини-проекта «Кликер» на базе А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, который реализует простой счетчик нажатий на кнопку. Используй:

  1. Кнопку, подключенную к цифровому пину 2 (с подтягивающим резистором).

  2. Один общий катодный семисегментный индикатор, подключенный к пинам 3-9 (от segment A до G). Логика: при каждом нажатии кнопки счетчик увеличивается от 0 до 9, а затем сбрасывается обратно до 0. Значение должно отображаться на индикаторе.

// Определяем пины для семисегментного индикатора (общий катод)

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.

Список литературы

Интернет источники:

  1. https://pr-cy.ru/ ;

  2. https://kontur.ru;

  3. https://habr.com/ru;

  4. https://robstore.ru;

  5. https://supereyes.ru.

Приложение

   

Рисунок 1

Рисунок 2

   

Рисунок 3

Рисунок 4

 

Рисунок 5

Просмотров работы: 2