Статус: В разработке
Студенты СибГУТИ, работающие над созданием робота для битвы роботов.
~ 22.06.26
Когда отклоняется джойстик, на его контактах изменяется напряжение (от 0 до 5 Вольт).
- Команда
analogRead(pinY)превращает это напряжение в цифровое число от 0 до 1023. - Микроконтроллер Arduino с помощью конструкции
if-elseмгновенно переводит это число в понятный код команды (например, если наклон вперед, тоcommand = 1).
Строка radio.write(&command, sizeof(command)) запускает аппаратную отправку.
- Сборка пакета: Чип NRF24L01 берет наше число
command(в памяти оно занимает 2 байта) и «упаковывает» его в радиопакет. К числу автоматически добавляется преамбула (чтобы приемник настроился на волну), адрес трубы ("00001") и CRC-код (контрольная сумма для проверки на ошибки). - Модуляция: Передатчик +PA+LNA превращает эти цифровые нули и единицы в высокочастотный радиосигнал (2.4 ГГц) и через усилитель мощности (PA) выбрасывает его в эфир через антенну.
В этот момент приемник находится в режиме постоянного «прослушивания» эфира благодаря функции radio.startListening().
- Захват сигнала: Внешняя антенна приемника улавливает радиоволну, а встроенный усилитель (LNA) вытягивает даже слабый сигнал из шума.
- Проверка адреса: Чип приемника считывает адрес из пакета. Если адрес совпадает с его собственным (
"00001"), он забирает пакет. Если адрес чужой — модуль мгновенно его игнорирует, даже не отвлекая процессор Arduino. - Проверка целостности: Приемник пересчитывает контрольную сумму (CRC). Если пакет исказился из-за помех от мотора L298N, он просто удаляется. Если всё отлично, пакет сохраняется в буфер, и функция
radio.available()возвращает значениеtrue.
Так как мы включили функцию radio.setAutoAck(true);, NRF24L01 работает по принципу обратной связи:
- Как только приемник успешно принял чистый пакет, он автоматически на долю миллисекунды переключается в режим передатчика и посылает обратно короткий сигнал: «Пакет №... получен, всё супер!».
- Если передатчик пульта получает этот сигнал, функция
radio.write()возвращаетtrue(успех). Если сигнал подтверждения не дошел (например, машинка уехала слишком далеко), передатчик автоматически повторит попытку отправки до 15 раз. Если все попытки провалились,radio.write()вернетfalse(ошибка).
Внутри бесконечного цикла void loop() команда считывается: radio.read(&command, sizeof(command)).
Конструкция switch(command) проверяет, какое именно число прилетело. Если это 1, Arduino мгновенно подает напряжение на пины драйвера L298N, силовые транзисторы внутри драйвера открываются, и аккумуляторы начинают вращать моторы вперед.
В строке RF24 radio(7, 8); мы вручную назначаем управляющие пины CE и CSN.
- CE (Chip Enable): Пин 7. Он управляет режимом работы радиочипа. Переводит его из режима ожидания в режим передачи или прослушивания эфира.
- CSN (Chip Select Not): Пин 8. Этот контакт «будит» радиомодуль, когда Arduino хочет передать ему настройки или забрать из него принятые данные.
- Аппаратные пины SPI (11, 12, 13): Они не прописываются в коде, но подключение к ним строго обязательно (MOSI → 11, MISO → 12, SCK → 13). На платах Arduino Uno/Nano эти контакты жестко привязаны к встроенному аппаратному контроллеру SPI для обеспечения максимальной скорости обмена данными.
- Пины драйвера L298N(5, 6, 9, 10): поддерживают аппаратный ШИМ (PWM). Это сделано специально «на вырост»: если в будущем понадобится плавно регулировать скорость робота, не придется переделывать схему — достаточно будет заменить команду digitalWrite() на analogWrite().
- SPI (Serial Peripheral Interface) — это очень быстрый и простой протокол связи, который используется для обмена данными между микроконтроллерами (например, Arduino) и различными электронными компонентами.
Строка const byte address = "00001"; задает уникальный идентификатор канала связи.
Зачем он нужен: Радиоэфир на частоте 2.4 ГГц сильно зашумлен (Wi-Fi, Bluetooth, радионяни). Адрес трубы работает как уникальное имя или номер телефона. Приемник, настроенный на этот же адрес, программно игнорирует весь чужой радиомусор и считывает только те пакеты, адрес которых совпадает с его собственным.