Весь код обильно покрыт комментариями, чтобы легче было в нём разобраться. Программа бота компилировалась в Microsoft Visual Studio Community 2019. Версия 16.10.3. Код для Arduino компилировался и прошивался в Arduino IDE 1.8.16.
- ArduinoIRController - папка с кодом для платы Arduino, подключенной по USB к компьютеру, на котором запущена программа бота. По последовательному порту данная плата Arduino принимает команды от программы бота, расшифровывает их и управляет подключенным к её пинам инфракрасным светодиодом, размещённым сверху над столом. Через инфракрасный светодиод пересылаются сигналы на корабли на столе. Используемые библиотеки:
- IRremote v. 3.5.0 (последней версии) для передачи команд через инфракрасный светодиод (https://github.com/Arduino-IRremote/Arduino-IRremote)
- NTOJSpaceDiscordBot - папка с кодом проекта консольной программы бота на .net core 3.1, которая запускается на компьютере, принимает команды от бота и передаёт команды на плату Arduino по последовательному порту через USB-кабель. Используемые библиотеки:
- Discord.Net v. 2.4.0 для подключения к боту в Discord, получения и обработки команд от него (https://github.com/discord-net/Discord.Net)
- System.IO.Ports v. 6.0.0 для взаимодействия с платой Arduino по последовательному порту через USB-кабель (https://docs.microsoft.com/ru-ru/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-6.0)
- Microsoft.Extensions.DependencyInjection v. 6.0.0 чтобы современно, чистый код, всё такое (https://docs.microsoft.com/ru-ru/dotnet/core/extensions/dependency-injection)
- CsvHelper v. 27.2.1 не используется. Было желание протоколировать все действия с ботом в CSV, чтобы потом в случае чего видеть историю, кто какие команды посылал и не было вопросов, что кто-то кому-то помешал и т.п., но времени на это не осталось. Сейчас весь лог выводится в консоль, этого было достаточно (https://joshclose.github.io/CsvHelper/)
Токен бота берётся из переменной среды NTOJSpaceBotToken
, такую переменную среды надо создать и задать ей токен, без кавычек и т.п.
Остальные настройки берутся из конфигурационного 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.
Программа принимает символ от консольной программы бота и посылает сигнал нажатия соответствующей кнопки ИК-пульта кораблю (имитируем нажатия на кнопки пульта). Коды сигналов пульта были предоставлены организаторами. Если всё прошло хорошо, программа возвращает консольной программе бота констунту OK_STR, чтобы та понимала, что команда успешно дошла до Arduino и передана кораблю.
#define IR_SEND_PIN 13
- для подключения задали такой пин, чтобы удобнее было присоединить кабель.#define ADDRESS 0x0102
- такой адрес был в примере к библиотеке, вроде, можно заменить на 0х0 и всё равно будет работать. У нас работало так, поэтому ничего не меняли. Документация к данной библиотеке этото вопрос покрывает слабо или мы не нашли.// Символьные константы, ожидаемые от программы
- сейчас не используются, вначале хотели задать конкретный набор команд, но потом переделали на просто пересылку всего, что приходит от консольной программы бота.
Сопротивление резистора: <TODO: найти, посмотреть и написать>