|
| 1 | +#include <Arduino.h> // Подключает основные функции и типы данных Arduino. |
| 2 | +#include <SPI.h> // Подключает аппаратный интерфейс SPI выводов D11, D12 и D13. |
| 3 | +#include <RadioLib.h> // Подключает библиотеку управления радиомодулем CC1101. |
| 4 | + |
| 5 | +/* |
| 6 | + * ЦУП Альтаир — спутниковый скетч, шаг 01. |
| 7 | + * |
| 8 | + * Назначение: |
| 9 | + * - передавать одну заранее заданную строку телеметрии; |
| 10 | + * - повторять передачу один раз в секунду; |
| 11 | + * - не включать приёмник и не обрабатывать команды ЦУПа. |
| 12 | + * |
| 13 | + * Порядок полей: |
| 14 | + * ID,PACKET,UPTIME,PANEL_POWER,VOLT,MCU_TEMP,MODE,CHECKSUM |
| 15 | + * |
| 16 | + * Все значения статичны. Номер пакета, время работы и температура |
| 17 | + * не изменяются — в эфир всегда передаётся одна и та же строка. |
| 18 | + * |
| 19 | + * Подключение CC1101 к классическому Arduino Nano: |
| 20 | + * CSN -> D10 |
| 21 | + * MOSI -> D11 |
| 22 | + * MISO -> D12 |
| 23 | + * SCK -> D13 |
| 24 | + * GDO0 -> D2 |
| 25 | + * GDO2 -> D3 |
| 26 | + * VCC -> 3,3 В |
| 27 | + * GND -> GND |
| 28 | + * |
| 29 | + * ВАЖНО: |
| 30 | + * - питать CC1101 напряжением 5 В нельзя; |
| 31 | + * - линии SCK, MOSI и CSN следует подключать через преобразователь |
| 32 | + * логических уровней 5 В -> 3,3 В. |
| 33 | + */ |
| 34 | + |
| 35 | +#define CC_CS 10 // Задаёт вывод D10 для линии выбора микросхемы CSN. |
| 36 | +#define CC_GDO0 2 // Задаёт вывод D2 для сигнальной линии GDO0. |
| 37 | +#define CC_GDO2 3 // Задаёт вывод D3 для сигнальной линии GDO2. |
| 38 | + |
| 39 | +static const char TELEMETRY_PACKET[] = "02,00001,00015,1.00,4.20,31.6,1,07"; // Хранит неизменяемый пакет телеметрии. |
| 40 | +static const unsigned long TRANSMISSION_PERIOD_MS = 1000UL; // Задаёт период передачи, равный одной секунде. |
| 41 | + |
| 42 | +CC1101 radio = new Module(CC_CS, CC_GDO0, RADIOLIB_NC, CC_GDO2); // Создаёт объект радиомодуля с указанными выводами. |
| 43 | + |
| 44 | +void setup() { // Выполняется один раз после включения Arduino Nano. |
| 45 | + Serial.begin(115200); // Открывает диагностический последовательный порт. |
| 46 | + delay(500); // Ожидает стабилизации питания Arduino Nano и CC1101. |
| 47 | + |
| 48 | + int state = radio.begin(435.000, 4.8, 5.0, 203.0, 5, 16); // Настраивает частоту, скорость, девиацию, полосу, мощность и преамбулу. |
| 49 | + if (state == RADIOLIB_ERR_NONE) state = radio.setOOK(false); // Выбирает частотную манипуляцию 2-FSK. |
| 50 | + if (state == RADIOLIB_ERR_NONE) state = radio.setDataShaping(RADIOLIB_SHAPING_NONE); // Отключает дополнительное сглаживание. |
| 51 | + if (state == RADIOLIB_ERR_NONE) state = radio.setEncoding(RADIOLIB_ENCODING_NRZ); // Выбирает кодирование NRZ. |
| 52 | + if (state == RADIOLIB_ERR_NONE) state = radio.setSyncWord(0x12, 0xAD, 0, false); // Устанавливает слово синхронизации 0x12AD. |
| 53 | + if (state == RADIOLIB_ERR_NONE) state = radio.variablePacketLengthMode(RADIOLIB_CC1101_MAX_PACKET_LENGTH); // Включает переменную длину пакета. |
| 54 | + if (state == RADIOLIB_ERR_NONE) state = radio.setCrcFiltering(true); // Включает аппаратный CRC радиопакета CC1101. |
| 55 | + |
| 56 | + if (state != RADIOLIB_ERR_NONE) { // Проверяет результат полной настройки радиомодуля. |
| 57 | + Serial.print(F("Ошибка инициализации CC1101, код ")); // Выводит пояснение ошибки. |
| 58 | + Serial.println(state); // Выводит числовой код ошибки RadioLib. |
| 59 | + while (true) delay(1000); // Останавливает скетч до перезапуска питания. |
| 60 | + } |
| 61 | + |
| 62 | + Serial.println(F("Шаг 01: статичный передатчик готов")); // Сообщает об успешном запуске. |
| 63 | + Serial.print(F("Постоянный пакет: ")); // Выводит подпись диагностической строки. |
| 64 | + Serial.println(TELEMETRY_PACKET); // Показывает пакет, который будет передаваться. |
| 65 | +} |
| 66 | + |
| 67 | +void loop() { // Бесконечно повторяет передачу одного пакета. |
| 68 | + const int state = radio.transmit(TELEMETRY_PACKET); // Передаёт неизменяемую строку через CC1101. |
| 69 | + radio.standby(); // Возвращает CC1101 в режим ожидания без включения приёмника. |
| 70 | + |
| 71 | + if (state == RADIOLIB_ERR_NONE) { // Проверяет, завершилась ли передача без ошибки. |
| 72 | + Serial.print(F("Передано: ")); // Выводит подпись перед отправленной строкой. |
| 73 | + Serial.println(TELEMETRY_PACKET); // Повторяет в мониторе порта переданный пакет. |
| 74 | + } else { // Выполняется при ошибке передачи. |
| 75 | + Serial.print(F("Ошибка передачи CC1101, код ")); // Выводит диагностическое сообщение. |
| 76 | + Serial.println(state); // Выводит код ошибки RadioLib. |
| 77 | + } |
| 78 | + |
| 79 | + delay(TRANSMISSION_PERIOD_MS); // Ожидает одну секунду перед следующей передачей. |
| 80 | +} |
0 commit comments