/ntoj-space-discord-bot

Бот для Discord для управления космическим кораблём на НТО Junior 2021.

Primary LanguageC#MIT LicenseMIT

Бот для Discord для управления космическим кораблём на НТО Junior 2021.

Весь код обильно покрыт комментариями, чтобы легче было в нём разобраться. Программа бота компилировалась в Microsoft Visual Studio Community 2019. Версия 16.10.3. Код для Arduino компилировался и прошивался в Arduino IDE 1.8.16.

Структура папок

  • ArduinoIRController - папка с кодом для платы Arduino, подключенной по USB к компьютеру, на котором запущена программа бота. По последовательному порту данная плата Arduino принимает команды от программы бота, расшифровывает их и управляет подключенным к её пинам инфракрасным светодиодом, размещённым сверху над столом. Через инфракрасный светодиод пересылаются сигналы на корабли на столе. Используемые библиотеки:
  • NTOJSpaceDiscordBot - папка с кодом проекта консольной программы бота на .net core 3.1, которая запускается на компьютере, принимает команды от бота и передаёт команды на плату Arduino по последовательному порту через USB-кабель. Используемые библиотеки:

Настройка бота

Токен бота берётся из переменной среды NTOJSpaceBotToken, такую переменную среды надо создать и задать ей токен, без кавычек и т.п.

image

Остальные настройки берутся из конфигурационного JSON-файла, который лежит рядом с исполняемым файлом (config.json). В нём прописаны следующие настройки:

  • "PortName": "COM3" - К какому порту подключена плата Arduino.
  • "BaudRate": 9600 - Скорость передачи порта.
  • "ReadTimeout": 1000 - Время ожидания чтения с порта.
  • "WriteTimeout": 1000 - Время ожидания записи в порт.
  • "RequiredChannelId": 913720736546451476 - ID канала, из которого только и будет считывать команды бот (канал "cosmobot").

Общение с ботом

Когда игрок пишет команду в заданный канал ("cosmobot"), бот отвечает, например, написали боту команду "2":

Player — Сегодня, в 14:34
2
RemoteDriveBot БОТ — Сегодня, в 14:34
Player#1111 нажал 2, принято: True

Это означает, что бот принял команду и передал её Arduino. Фраза "принято: True" означает, что плата Arduino передала команду на корабль и ответила. Если произошла какая-то ошибка при передаче команды на Arduino, будет написано False.

Настройка программы на Arduino

Программа принимает символ от консольной программы бота и посылает сигнал нажатия соответствующей кнопки ИК-пульта кораблю (имитируем нажатия на кнопки пульта). Коды сигналов пульта были предоставлены организаторами. Если всё прошло хорошо, программа возвращает консольной программе бота констунту OK_STR, чтобы та понимала, что команда успешно дошла до Arduino и передана кораблю.

  • #define IR_SEND_PIN 13 - для подключения задали такой пин, чтобы удобнее было присоединить кабель.
  • #define ADDRESS 0x0102 - такой адрес был в примере к библиотеке, вроде, можно заменить на 0х0 и всё равно будет работать. У нас работало так, поэтому ничего не меняли. Документация к данной библиотеке этото вопрос покрывает слабо или мы не нашли.
  • // Символьные константы, ожидаемые от программы - сейчас не используются, вначале хотели задать конкретный набор команд, но потом переделали на просто пересылку всего, что приходит от консольной программы бота.

Сопротивление резистора: <TODO: найти, посмотреть и написать>

image