Skip to content

Commit 1e1f4de

Browse files
committed
firmware: add satellite step 01 static telemetry
1 parent ef5b3fc commit 1e1f4de

6 files changed

Lines changed: 124 additions & 10 deletions

File tree

.github/workflows/altair-v5-ui-check.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ jobs:
105105
test -f firmware/ground_station/arduino_nano/Altair_Ground_Arduino_Nano/Altair_Ground_Arduino_Nano.ino
106106
test -f firmware/satellite/stm32/Altair_Satellite_STM32/Altair_Satellite_STM32.ino
107107
test -f firmware/satellite/arduino_nano/Altair_Satellite_Arduino_Nano/Altair_Satellite_Arduino_Nano.ino
108+
step_01='firmware/satellite/01_static_telemetry_tx/Altair_Satellite_01_Static_Telemetry_TX/Altair_Satellite_01_Static_Telemetry_TX.ino'
109+
grep -Fq 'static const char TELEMETRY_PACKET[] = "02,00001,00015,1.00,4.20,31.6,1,07";' "$step_01"
110+
grep -Fq 'radio.transmit(TELEMETRY_PACKET)' "$step_01"
111+
if grep -Eq 'startReceive|radio\.receive|radio\.readData' "$step_01"; then
112+
echo 'Step 01 must remain transmit-only'
113+
exit 1
114+
fi
108115
static_nano='firmware/satellite/arduino_nano_static_tx/Altair_Satellite_Arduino_Nano_Static_TX/Altair_Satellite_Arduino_Nano_Static_TX.ino'
109116
grep -Fq '1.00,4.20,' "$static_nano"
110117
grep -Fq 'readMcuTemperatureC()' "$static_nano"

.github/workflows/firmware-build.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,13 @@ jobs:
3636
- name: Спутник — STM32 Blue Pill
3737
id: satellite-stm32
3838
project: firmware/satellite/stm32
39+
- name: Спутник — шаг 01, неизменяемый пакет Arduino Nano
40+
id: satellite-step-01-static
41+
project: firmware/satellite/01_static_telemetry_tx
3942
- name: Спутник — Arduino Nano
4043
id: satellite-nano
4144
project: firmware/satellite/arduino_nano
42-
- name: Спутник — Arduino Nano, статичный передатчик
45+
- name: Спутник — Arduino Nano, статичный передатчик с температурой
4346
id: satellite-nano-static-tx
4447
project: firmware/satellite/arduino_nano_static_tx
4548

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424

2525
### 2. Спутник
2626

27-
- [Скетч спутника IntroSat для STM32F103C8T6 / Blue Pill](firmware/satellite/stm32/Altair_Satellite_STM32/Altair_Satellite_STM32.ino)
28-
- [Скетч спутника для Arduino Nano](firmware/satellite/arduino_nano/Altair_Satellite_Arduino_Nano/Altair_Satellite_Arduino_Nano.ino)
29-
- [Простой статичный передатчик для Arduino Nano](firmware/satellite/arduino_nano_static_tx/Altair_Satellite_Arduino_Nano_Static_TX/Altair_Satellite_Arduino_Nano_Static_TX.ino)
27+
- **[Шаг 01 — передатчик неизменяемого пакета для Arduino Nano](firmware/satellite/01_static_telemetry_tx/Altair_Satellite_01_Static_Telemetry_TX/Altair_Satellite_01_Static_Telemetry_TX.ino)**
28+
- [Передатчик для Arduino Nano с измерением температуры кристалла](firmware/satellite/arduino_nano_static_tx/Altair_Satellite_Arduino_Nano_Static_TX/Altair_Satellite_Arduino_Nano_Static_TX.ino)
29+
- [Двусторонний скетч спутника для Arduino Nano](firmware/satellite/arduino_nano/Altair_Satellite_Arduino_Nano/Altair_Satellite_Arduino_Nano.ino)
30+
- [Двусторонний скетч спутника IntroSat для STM32F103C8T6 / Blue Pill](firmware/satellite/stm32/Altair_Satellite_STM32/Altair_Satellite_STM32.ino)
3031

3132
## Как выглядит система
3233

firmware/README.md

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,29 @@
1616

1717
Частоту, мощность TX и полосу приёмника ЦУПа можно изменять из панели команд. Команда `$CMD,RADIO,RESET` возвращает исходные значения `435.000 МГц`, `5 дБм` и `203 кГц`. Настройки хранятся до перезапуска ESP32; после включения питания используется исходный профиль.
1818

19-
## Спутник
19+
## Спутник: скетчи по возрастанию сложности
20+
21+
### Шаг 01 — неизменяемый пакет
22+
23+
| Плата | Скетч |
24+
|---|---|
25+
| Arduino Nano, только передатчик | [`Altair_Satellite_01_Static_Telemetry_TX.ino`](satellite/01_static_telemetry_tx/Altair_Satellite_01_Static_Telemetry_TX/Altair_Satellite_01_Static_Telemetry_TX.ino) |
26+
27+
Первый скетч не включает приёмник и не обрабатывает команды. В программе одной строкой задан пакет `02,00001,00015,1.00,4.20,31.6,1,07`. Номер пакета, время работы, температура и остальные поля не изменяются. Одна и та же строка передаётся сразу после запуска и затем раз в секунду.
28+
29+
Следующие учебные варианты будут добавляться как шаги 02, 03 и далее без изменения этого исходного примера.
30+
31+
### Другие существующие бортовые скетчи
2032

2133
| Плата | Скетч |
2234
|---|---|
23-
| STM32F103C8T6 / Blue Pill / IntroSat | [`Altair_Satellite_STM32.ino`](satellite/stm32/Altair_Satellite_STM32/Altair_Satellite_STM32.ino) |
24-
| Arduino Nano | [`Altair_Satellite_Arduino_Nano.ino`](satellite/arduino_nano/Altair_Satellite_Arduino_Nano/Altair_Satellite_Arduino_Nano.ino) |
25-
| Arduino Nano, только передатчик | [`Altair_Satellite_Arduino_Nano_Static_TX.ino`](satellite/arduino_nano_static_tx/Altair_Satellite_Arduino_Nano_Static_TX/Altair_Satellite_Arduino_Nano_Static_TX.ino) |
35+
| Arduino Nano, передатчик с измерением температуры | [`Altair_Satellite_Arduino_Nano_Static_TX.ino`](satellite/arduino_nano_static_tx/Altair_Satellite_Arduino_Nano_Static_TX/Altair_Satellite_Arduino_Nano_Static_TX.ino) |
36+
| Arduino Nano, двусторонняя связь | [`Altair_Satellite_Arduino_Nano.ino`](satellite/arduino_nano/Altair_Satellite_Arduino_Nano/Altair_Satellite_Arduino_Nano.ino) |
37+
| STM32F103C8T6 / Blue Pill / IntroSat, двусторонняя связь | [`Altair_Satellite_STM32.ino`](satellite/stm32/Altair_Satellite_STM32/Altair_Satellite_STM32.ino) |
2638

27-
Бортовые скетчи передают телеметрию, принимают адресованные команды и поддерживают `PING`, `INFO`, `TM_START`, `TM_STOP`, `TM_PERIOD` и `USER`.
39+
Двусторонние скетчи передают телеметрию, принимают адресованные команды и поддерживают `PING`, `INFO`, `TM_START`, `TM_STOP`, `TM_PERIOD` и `USER`.
2840

29-
Упрощённый вариант `Static_TX` не включает приёмник и обработку команд. Поля ID, номер пакета, uptime, мощность панелей `1.00 Вт`, напряжение аккумулятора `4.20 В` и режим заданы заранее. Поле `MCU_TEMP` измеряется внутренним температурным каналом ATmega328P, располагается сразу после напряжения аккумулятора и передаётся раз в секунду. XOR-контрольная сумма пересчитывается автоматически для каждого значения температуры.
41+
Вариант `Altair_Satellite_Arduino_Nano_Static_TX.ino` не включает приёмник, но измеряет температуру внутренним каналом ATmega328P и пересчитывает XOR-контрольную сумму для каждого пакета.
3042

3143
## Общий радиопрофиль
3244

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[platformio]
2+
default_envs = nanoatmega328
3+
src_dir = Altair_Satellite_01_Static_Telemetry_TX
4+
5+
[env:nanoatmega328]
6+
platform = atmelavr
7+
board = nanoatmega328
8+
framework = arduino
9+
monitor_speed = 115200
10+
lib_deps =
11+
jgromes/RadioLib@7.7.1

0 commit comments

Comments
 (0)