Compare commits

...

3 Commits

Author SHA1 Message Date
LittleSam129
49c7009ca5 Lab042: drop the regulatory framing, keep the technical reasons
The project owner holds the permits for over-the-air work, so legality is
not a constraint this document should be reasoning about.

- retitle the section from "safety requirements" to what it actually
  covers: circuit integrity and not destroying the hardware
- rewrite the antenna rule on its real technical ground. An antenna opens
  a radiating path in parallel with the cable, so the level at the
  receiver stops matching the budget and reflections appear; the value of
  a cable loopback is that everything in it is known
- reframe "no over-the-air" as a scope boundary against Lab044 rather
  than a prohibition
- note in the roadmap that Lab044 is purely a technical choice of band,
  power and antenna

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 13:34:07 +03:00
LittleSam129
9f7387ec2c Lab042: attenuator on hand, relax the gain restriction
The bench has an AT30S: 30 dB, SMA, rated to 200 W. That removes the last
hardware blocker and changes the safety analysis.

With 30 dB in line, TX at full 0 dB gain lands at about -23 dBm on the
receiver, some 25 dB below the +2.5 dBm damage threshold. The whole
tx_hardwaregain range is therefore safe, so the staged -60 dB start and
the -30 dB ceiling are no longer needed.

- record the attenuator in the inventory and note that its 200 W rating is
  irrelevant here, attenuation does not depend on level
- replace the interim procedure with a level budget table and a starting
  point of -30 dB, giving about -53 dBm at the receiver
- require a visual check that the attenuator is actually in the path
  before the first transmit
- keep the ban on running without it: it guards against operator error,
  not against the calculated level

Only the environment blocker is left: pyadi-iio and libiio are missing
from the interpreter on PATH.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 13:33:24 +03:00
LittleSam129
923e6bec78 Lab042: adapt spec to the actual hardware and environment
Hardware confirmed from a photo of the bench: the device is a Pluto+
(2RX/2TX, Gigabit Ethernet), not the stock ADALM-PLUTO, plus an RTL-SDR
dongle and several antennas. No attenuator on hand.

- record the actual inventory and the Pluto+ differences that matter:
  Ethernet transport, two channels, adi.Pluto first with adi.ad9361 as
  the only permitted fallback
- replace "use an attenuator" with numbers: TX puts out about +7 dBm at
  0 dB, the RX damage threshold is about +2.5 dBm, so give a staged gain
  procedure starting at -60 dB and capped at -30 dB until an attenuator
  arrives
- require the antennas to be physically removed from the bench rather
  than merely left unplugged
- add the environment blocker found on inspection: the interpreter on
  PATH is a standalone Python 3.13.1 without pyadi-iio, libiio or scipy,
  while Lab024a clearly ran somewhere else; identifying and recording
  that environment is now the first task
- renumber sections and align the TX gain figure with the safety section

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 13:03:17 +03:00

View File

@@ -47,20 +47,80 @@
--- ---
## 4. Требования безопасности ## 4. Наличное оборудование
Обязательны к исполнению. Это правило 8 проекта, оно не формальное. Подтверждено по состоянию на 10 августа 2026 года.
1. Выход передатчика соединяется с входом приёмника **только кабелем через аттенюатор**. Рекомендуемое ослабление 30 дБ. | Позиция | Состояние |
2. **Антенну на передатчик не подключать.** Выход в эфир в этой лабораторной не выполняется ни при каких условиях. |---|---|
3. Передатчик не включать при отключённом кабеле: выход без нагрузки вреден для оконечного каскада. | **Pluto+** — SDR, 2 приёмника и 2 передатчика, гигабитный Ethernet | есть |
4. Усиление передатчика начинать с минимального и поднимать только при необходимости. | RTL-SDR — приёмный донгл | есть, понадобится в Lab043 |
| Кабели SMA | будут найдены |
| Антенны: штыревые на магнитном основании, короткая штыревая | есть, **в Lab042 не используются** |
| Рамочная антенна Donut AM (0,52 МГц) | к проекту отношения не имеет |
| **Аттенюатор AT30S**, 30 дБ, до 200 Вт, разъёмы SMA | есть |
Аппаратных препятствий к началу работы нет. Запас по мощности у аттенюатора избыточен на много порядков — рассчитан на передатчики в сотни ватт, а у нас доли милливатта, — но это никак не мешает: ослабление от уровня сигнала не зависит.
Важно: устройство — **Pluto+**, а не оригинальный ADALM-PLUTO. Отличия, которые имеют значение:
- связь по Ethernet, а не по USB; адрес `ip:192.168.2.1` уже подтверждён работой Lab024a;
- два приёмных и два передающих канала; в Lab042 используется только первый канал каждого;
- класс `adi.Pluto` в Lab024a отработал на приёме. Начинать с него. Если передача на этом классе не пойдёт из-за двухканальности, перейти на `adi.ad9361` с тем же адресом. Это единственное разрешённое отступление от задания, и о нём нужно сообщить.
## 5. Требования к схеме и сохранности оборудования
Разрешения на работу в эфире у владельца проекта есть, вопрос законности здесь не рассматривается. Перечисленное ниже защищает оборудование и чистоту опыта.
1. **Антенны убрать со стола до начала работы.** Причина техническая: антенна на передатчике или приёмнике создаёт паразитный путь распространения параллельно кабельному. Уровень на входе приёмника перестаёт соответствовать расчёту, появляется переотражённый сигнал, и при отказе будет невозможно понять, что именно не сработало. Кабельная петля ценна тем, что в ней известно всё; антенна это свойство разрушает.
2. Передатчик не включать при отключённом кабеле: выход без нагрузки вреден для оконечного каскада.
3. Аттенюатор AT30S включается **в разрыв** между выходом передатчика и входом приёмника. Не параллельно, не на свободный порт — именно последовательно в тракт.
4. Перед первым включением передатчика убедиться глазами, что аттенюатор действительно в цепи. Это единственное, что стоит между опечаткой в настройке усиления и сгоревшим приёмником.
### Расчёт уровней
| Величина | Значение |
|---|---|
| Выход передатчика Pluto+ при усилении 0 дБ | около **+7 дБм** |
| Предельно допустимый уровень на входе приёмника | около **+2,5 дБм** |
| Ослабление аттенюатора | 30 дБ |
| Уровень на входе приёмника при усилении 0 дБ | около **23 дБм** |
Вывод: **с аттенюатором в разрыве весь диапазон `tx_hardwaregain_chan0` от 89 до 0 дБ безопасен для приёмника.** Запас до порога повреждения составляет более 25 дБ даже в самом худшем случае.
**Порядок подбора усиления:**
1. Начать с `tx_hardwaregain_chan0 = -30`. Это даёт около 53 дБм на входе приёмника — заведомо чистый и заведомо безопасный уровень.
2. Если сигнал слишком слаб, поднимать шагами по 10 дБ.
3. Если созвездие разваливается при сильном сигнале — это насыщение приёмника, лечится **уменьшением** усиления, а не увеличением.
Без аттенюатора работать запрещено даже при малом усилении: защита нужна не от расчётного уровня, а от ошибки оператора.
--- ---
## 5. Параметры тракта ## 6. Программное окружение: препятствие, которое надо снять первым
Все значения взяты из Lab018 и менять их в этой лабораторной **запрещено**. Причина: переход на железо сам по себе вносит достаточно неизвестных. Менять одновременно и параметры сигнала — значит потерять возможность понять причину отказа. Проверка окружения 10 августа 2026 года показала следующее.
Интерпретатор, доступный в командной строке — `C:\Users\user\AppData\Local\Programs\Python\Python313\python.exe`, версия 3.13.1. В нём **отсутствуют `pyadi-iio` и `libiio`**, то есть работать с Pluto+ из него невозможно. Также отсутствует `scipy`, который нужен лабораторным Lab020Lab022, Lab024b и Lab025.
При этом Lab024a когда-то отработала с настоящим устройством. Значит, существует второе окружение — по всей видимости, среда Anaconda, — где всё установлено, и запуск шёл оттуда.
**Первое действие исполнителя: определить, в каком окружении запускаются лабораторные, и зафиксировать это.** Пока это не сделано, невозможно ни повторить Lab024a, ни начать Lab042.
Требуется:
1. Найти окружение, где установлены `pyadi-iio` и `libiio`, и проверить связь с устройством.
2. Записать в отчёт: путь к интерпретатору, версию Python, версии `pyadi-iio` и `libiio`.
3. Если такого окружения нет — установить `pyadi-iio` и `libiio`, зафиксировав версии.
Расчётные лабораторные, включая Lab041, в окружении без `pyadi-iio` запускаются нормально — им нужны только `numpy`, `matplotlib` и `opencv`. Разделение аппаратных и расчётных зависимостей относится к этапу стабилизации и в Lab042 не решается, но результат проверки надо записать: он понадобится при составлении описания окружения.
---
## 7. Параметры тракта
Значения тракта взяты из Lab018 и менять их в этой лабораторной **запрещено**. Причина: переход на железо сам по себе вносит достаточно неизвестных. Менять одновременно и параметры сигнала — значит потерять возможность понять причину отказа.
| Параметр | Значение | Источник | | Параметр | Значение | Источник |
|---|---|---| |---|---|---|
@@ -84,7 +144,7 @@
| Несущая передачи и приёма | 435 МГц | обе одинаковые | | Несущая передачи и приёма | 435 МГц | обе одинаковые |
| Частота дискретизации | 640 000 | совпадает с трактом | | Частота дискретизации | 640 000 | совпадает с трактом |
| Полоса радиочастотного тракта | 200 000 Гц | минимум Pluto, сигнал занимает около 27 кГц | | Полоса радиочастотного тракта | 200 000 Гц | минимум Pluto, сигнал занимает около 27 кГц |
| Усиление передатчика | начать с 40 дБ | допустимый диапазон от 89 до 0 | | Усиление передатчика | начать с 30 дБ | с аттенюатором безопасен весь диапазон, см. раздел 5 |
| Режим усиления приёмника | `manual` | автоматика мешает измерениям | | Режим усиления приёмника | `manual` | автоматика мешает измерениям |
| Усиление приёмника | начать с 20 дБ | подобрать по амплитуде | | Усиление приёмника | начать с 20 дБ | подобрать по амплитуде |
| Циклический буфер передачи | **выключен** | см. раздел 7 | | Циклический буфер передачи | **выключен** | см. раздел 7 |
@@ -93,7 +153,7 @@
--- ---
## 6. Порядок работы ## 8. Порядок работы
**Передающая сторона** **Передающая сторона**
@@ -116,7 +176,7 @@
--- ---
## 7. Ловушки, на которых спотыкаются в первый раз ## 9. Ловушки, на которых спотыкаются в первый раз
Перечислено то, что почти наверняка будет сделано неправильно без предупреждения. Перечислено то, что почти наверняка будет сделано неправильно без предупреждения.
@@ -136,7 +196,7 @@
--- ---
## 8. Что считается выполненной работой ## 10. Что считается выполненной работой
Лабораторная принимается, если выполнено всё перечисленное. Лабораторная принимается, если выполнено всё перечисленное.
@@ -158,7 +218,7 @@
| Полное время передачи, секунды | измерение | | Полное время передачи, секунды | измерение |
| Фактическая полезная скорость, кбит/с | расчёт из двух предыдущих | | Фактическая полезная скорость, кбит/с | расчёт из двух предыдущих |
| Усиление передатчика и приёмника | из настроек устройства | | Усиление передатчика и приёмника | из настроек устройства |
| Ослабление аттенюатора, дБ | из состава схемы | | Ослабление аттенюатора, дБ | 30, AT30S |
**Обязательные файлы в `data/processed/lab042`** **Обязательные файлы в `data/processed/lab042`**
@@ -178,14 +238,14 @@
--- ---
## 9. Что в этой лабораторной делать не надо ## 11. Что в этой лабораторной делать не надо
Перечислено, чтобы не расширять объём. Перечислено, чтобы не расширять объём.
- Не реализовывать повторную передачу потерянных фрагментов. Потери фиксируются, но не восстанавливаются. - Не реализовывать повторную передачу потерянных фрагментов. Потери фиксируются, но не восстанавливаются.
- Не подключать исправление стираний из `protocol/packet_erasure_fec.py`. - Не подключать исправление стираний из `protocol/packet_erasure_fec.py`.
- Не поднимать скорость и не менять модуляцию. - Не поднимать скорость и не менять модуляцию.
- Не выходить в эфир и не подключать антенну. - Не выходить в эфир и не подключать антенну. Это вопрос не разрешений, а объёма: эфирная передача — предмет Lab044, и смешивать её с первым включением передатчика нельзя.
- Не работать с двумя устройствами. - Не работать с двумя устройствами.
- Не трогать логику сеансов, аварийной остановки и приоритетов — она к передаче картинки отношения не имеет. - Не трогать логику сеансов, аварийной остановки и приоритетов — она к передаче картинки отношения не имеет.
@@ -193,18 +253,18 @@
--- ---
## 10. Порядок приёмки ## 12. Порядок приёмки
1. Исполнитель выполняет работу и сообщает о готовности. 1. Исполнитель выполняет работу и сообщает о готовности.
2. Проверяется `python tools/quick_gate.py` — должен проходить. 2. Проверяется `python tools/quick_gate.py` — должен проходить.
3. Проводится аудит: соответствие разделу 8, отсутствие вписанных результатов, происхождение каждого числа в отчёте. 3. Проводится аудит: соответствие разделу 10, отсутствие вписанных результатов, происхождение каждого числа в отчёте.
4. При наличии замечаний они оформляются списком с указанием файла и строки. 4. При наличии замечаний они оформляются списком с указанием файла и строки.
5. После приёмки в `PROJECT_LOG.md` добавляется новая запись по принятому в проекте образцу. 5. После приёмки в `PROJECT_LOG.md` добавляется новая запись по принятому в проекте образцу.
--- ---
## 11. Что дальше ## 13. Что дальше
- **Lab043** — разведение на два устройства: передаёт PlutoSDR, принимает RTL-SDR. Появляется настоящий уход несущей частоты и расхождение часов. Здесь понадобятся Lab021Lab023. - **Lab043** — разведение на два устройства: передаёт PlutoSDR, принимает RTL-SDR. Появляется настоящий уход несущей частоты и расхождение часов. Здесь понадобятся Lab021Lab023.
- **Lab044** — выбор рабочего диапазона и первый выход в эфир на малой мощности. - **Lab044** — выбор рабочего диапазона и первый выход в эфир на малой мощности. Разрешения имеются, поэтому вопрос сводится к техническому выбору диапазона, мощности и антенны.
- Повышение скорости, исправление стираний и передача последовательности кадров — после того, как картинка устойчиво проходит. - Повышение скорости, исправление стираний и передача последовательности кадров — после того, как картинка устойчиво проходит.