xSTEM Scope — осциллограф из датчика НАУРА
«Датчик напряжения осциллографический» НАУРА — двухканальный цифровой осциллограф до 100 кГц с пределами от ±2 до ±90 В. Без родной программы он лежал без дела. xSTEM Scope возвращает его в работу на Linux:
- Открыть xSTEM Scope в Chromium или Firefox: подключите датчик к USB, нажмите «Подключить датчик» — и на экране осциллограмма, ничего не устанавливая;
- или программа
xstem-scope.pyна компьютере — для работы без интернета и в любом браузере.
Здесь же генератор эталонных сигналов на ESP32 для проверки датчика, рассказ о том, как был разгадан протокол, установка на весь класс по SSH, опыты для уроков труда (батарейка под нагрузкой, мотор-генератор, дребезг кнопки, ШИМ, заряд конденсатора, трансформатор и выпрямитель, UART и I2C, «Прибор врёт» — звуковая карта ноутбука как генератор) и для уроков физики (индукция, маятник, камертон). Медленные процессы видно вживую в режиме самописца.
Датчики робота — дальномер, энкодер, сервопривод, датчик линии, ИК-пульт и другие — на экране осциллографа: Что говорит датчик.
xSTEM Scope — осциллограф из школьного датчика НАУРА
«Датчик напряжения осциллографический» фирмы НАУРА (на этикетке логотип НаР)
поставлялся в школы с программой для Windows. На компьютерах под Linux он
лежит без дела: родная программа запускается только через Wine, а драйвер FTDI
под Wine не работает. На самом деле Linux видит датчик сразу, без драйверов,
как /dev/ttyUSB0.
xSTEM Scope — страница-осциллограф, которая работает с этим датчиком напрямую.
Два способа запуска
| С сайта | Программа на компьютере | |
|---|---|---|
| Как открыть | edu.xstem.ru/scope | ярлык «xSTEM Scope» или python3 xstem-scope.py |
| Браузер | Chromium, Chrome, Edge, Firefox (проверен 158) | любой |
| Интернет | нужен, чтобы открыть страницу | не нужен |
| Установка | не нужна* | не нужна*, на весь класс — по SSH, GUIDE.md |
| Обновление | само, вместе с сайтом | git pull и повторная раздача |
* Один раз нужен доступ к порту датчика для обычного пользователя — правило udev
из deploy/install.sh или группа dialout
(WIRING.md).
С сайта
- Подключите датчик к USB.
- Откройте в Chromium https://edu.xstem.ru/scope/.
- Нажмите «Подключить датчик» и выберите в окне браузера FT232R USB UART. В следующий раз страница подключится сама.
Браузер получает доступ только к тому устройству, которое выбрал человек, и только для этого сайта. Отозвать доступ — значок слева от адреса → «Сбросить разрешения».
Программа на компьютере
Нужен только Python 3 — он есть на любом школьном Linux.
- Скачайте в одну папку пять файлов:
xstem-scope.py,index.html,xstem-scope.js,b202.json,experiments.json. - Подключите датчик к USB и выполните в этой папке:
python3 xstem-scope.py - Браузер откроет
http://localhost:8765сам. Остановить программу —Ctrl+C.
Если датчик не находится, программа скажет почему. Частые случаи разобраны в WIRING.md.
Что умеет
| Каналы | 2, каждый со своим пределом: ±2 В, ±5 В, ±25 В, ±90 В |
| Оцифровка | от 200 Гц до 100 кГц (точка через 5 мс … 10 мкс) |
| Кадр | 3072 точки на канал: от 31 мс до 15 с записи |
| Самописец | лента 10, 30 или 60 с вживую, при точке через 0,5 мс и реже; разрывы 2–19 % времени |
| Синхронизация | по К1 или К2, по фронту или спаду, уровень в вольтах |
| Вход | постоянный (=) или переменный (~) ток |
| Замеры | максимум, минимум, размах, среднее, действующее, частота, период; если частота найдена, среднее и действующее — по целому числу периодов |
| Растяжка | ×1…×20; «Сдвиг окна» под графиком ведёт растянутое окно по всему кадру |
| Курсоры | два курсора: время, напряжения, Δt и 1/Δt; держатся за время сигнала, а не за место на экране |
| Экспорт | CSV для LibreOffice Calc / Excel |
| Опыты | готовые настройки для труда и физики, см. Lesson.md; новый опыт — строка в experiments.json |
| Датчик выдернули | измерение останавливается; вставьте датчик и нажмите «Пуск» — программу перезапускать не нужно |
| ESP32 | с прошивкой генератора из src/ — синусоида, треугольник, пила, ШИМ со страницы; со скетчем урока 9 — поле «Слово по UART»: ученик вписывает слово и читает его с провода. Что прошито, страница узнаёт сама |
Файлы
| Файл | Что это |
|---|---|
app/index.html | экран осциллографа: он же страница на сайте |
app/xstem-scope.js | протокол датчика; связь через Web Serial или через программу |
app/xstem-scope.py | программа: открывает порт и отдаёт страницу, только стандартная библиотека Python |
app/b202.json | всё, что известно о датчике: скорости, периоды, пределы и калибровка каждого экземпляра по серийному номеру; читают и страница, и программа |
app/experiments.json | опыты в списке «Опыт»: настройки и подсказка, по группам «Труд», «Физика», «Прибор» |
tests/ | проверка протокола без железа: одни и те же примеры через JS и Python, запускается в CI |
deploy/ | установка на один ПК и на весь класс по SSH, см. GUIDE.md |
src/main.cpp | прошивка ESP32: генератор эталонных сигналов для проверки и калибровки |
examples/lesson9/ | скетч урока «UART и I2C»: UART и медленный I2C в одной программе; команды char, text, baud, addr — в мониторе порта или со страницы; pio run -e lesson9 -t upload |
| THEORY.md | как устроен датчик и как мы разгадали его протокол |
| WIRING.md | подключение, безопасность, калибровка |
| Lesson.md | опыты для уроков труда и физики |
| GUIDE.md | развёртывание в классе и памятка группе |
| ROADMAP.md | осциллограф в программе 5–9 классов и в проектах; датчик НАУРА и Rigol |
Ограничения
- Датчик отдаёт кадр целиком, только когда запишет все 3072 точки. На медленной развёртке (кадр 3–15 с) график появляется с задержкой, пока идёт запись, внизу экрана бежит полоска. Чтобы видеть вживую — режим «Самописец»: датчику ставится короткий кадр (0,5 с), страница склеивает их в ленту. Пока датчик передаёт кусок, он не пишет: около 0,12 мс на каждую точку куска, то есть 2 % времени при точке через 5 мс и 19 % при 0,5 мс. Эти места на графике — разрывы, в CSV — пустые ячейки.
- Общая калибровка снята с одного экземпляра датчика по питанию ESP32 3,3 В, точность около 3 %. Датчику можно записать свою калибровку по серийному номеру (WIRING.md); в заголовке страницы видно, какая сейчас действует.
- Проверено на модели B202 с прошивкой 3.02 (2011 год). Модель и прошивку страница пишет в заголовке.
Что датчик успевает увидеть
Самая частая точка — через 10 мкс (100 кГц). Правило: на самую короткую деталь сигнала нужно хотя бы 5 точек, иначе фронты превращаются в «пилу», а частые импульсы — в сплошную стену со стробоскопическими узорами. Всё, что быстрее, — для Rigol.
| Сигнал | Самая короткая деталь | Точек при 10 мкс | Видно? |
|---|---|---|---|
| UART 9600 | бит 104 мкс | 10 | да, байт читается (проверено) |
| UART 19200 | бит 52 мкс | 5 | на пределе: биты различимы, фронты грубые (расчёт) |
| UART 38400 | бит 26 мкс | 2–3 | соседние биты сливаются (расчёт) |
| UART 115200 | бит 8,7 мкс | меньше 1 | нет |
| I2C 100 кГц | такт 10 мкс | 1 | нет — поэтому в уроке шина замедлена до 1 кГц |
| ШИМ 1 кГц, 25 % | импульс 250 мкс | 25 (при 20 мкс — 12) | да (проверено); при точке 100 мкс — «стена» и 26,5 % вместо 25 % |
| WS2812, SPI, фронты логики | десятки–сотни нс | — | нет, только Rigol |
Ещё три особенности, найденные на железе:
- Кадр с синхронизацией начинается примерно через 15 мкс после фронта: первый импульс на экране короче настоящего. Длительность меряйте между фронтами внутри сигнала.
- В кадре 3072 точки: при 10 мкс это 30,7 мс — примерно 28 байт UART 9600 подряд, если их слать без пауз.
- Первые 3–4 с после подключения к USB датчик мерит со своими настройками; программа эти секунды выжидает сама (THEORY.md).
Как устроен датчик и как мы разгадали его протокол
Мультиметр и осциллограф
Мультиметр показывает одно число: напряжение «сейчас», усреднённое за доли секунды. Если напряжение меняется быстрее, чем обновляется экран, мультиметр покажет что-то среднее, и вы не узнаете, что было на самом деле.
Осциллограф показывает график: по горизонтали время, по вертикали напряжение. На нём видно, как батарейка проседает в момент включения мотора, как кнопка «дребезжит» при нажатии и почему ШИМ-светодиод только кажется горящим вполсилы.
Шаг 1. Напряжение → число: АЦП
Внутри датчика стоит АЦП, аналого-цифровой преобразователь. Он меряет напряжение и выдаёт целое число от 0 до 4095. Это 12 бит: 2¹² = 4096 ступенек.
Датчик меряет и плюс, и минус, поэтому ноль вольт находится посередине шкалы, около кода 2048. Всё, что выше, — плюс, что ниже — минус:
код 4095 ─── +предел
код 2048 ─── 0 В
код 0 ─── −пределПеревод кода в вольты — одна строка в app/index.html:271:
(code - zero) * mv_per_code / 1000Проверим на числах. Предел ±5 В, на один код приходится 2,48 мВ. Пришёл код 3370, ноль у этого канала — 2040: (3370 − 2040) · 2,48 мВ = 3298 мВ ≈ 3,3 В. Это верхний уровень меандра ESP32.
Шаг 2. Предел: чем меньше, тем точнее
Ступенек всегда 4096, а предел можно выбрать. Значит, меняется цена одной ступеньки:
| Предел | Одна ступенька | Батарейку 1,5 В видно как… |
|---|---|---|
| ±90 В | 44 мВ | 34 ступеньки: просадку в 20 мВ не заметить |
| ±5 В | 2,5 мВ | 600 ступенек |
| ±2 В | 1 мВ | 1500 ступенек: видна просадка в пару милливольт |
Правило такое же, как с мультиметром: самый маленький предел, при котором
нет зашкала. Числа взяты из калибровки (WIRING.md) и
записаны в app/b202.json, раздел calibration.
Шаг 3. Как часто мерить: частота оцифровки
АЦП меряет не непрерывно, а через равные промежутки времени. Например, «точка через 100 мкс» — это 10 000 замеров в секунду (10 кГц).
Если мерить слишком редко, сигнал потеряется. Меандр 100 Гц при оцифровке 200 Гц даст две точки на период: не поймёшь, меандр это, синусоида или пила. Для хорошей картинки нужно хотя бы 10–20 точек на период.
Если точек меньше двух на период, прибор не просто теряет сигнал, а показывает другой. Проверено со звуковой картой: при точке через 100 мкс тон 9900 Гц на экране — ровная волна 98 Гц, тон 6000 Гц — 4 кГц. Урок об этом — «Прибор врёт».
Датчик записывает кадр из 3072 точек и только потом передаёт его целиком. Поэтому частота оцифровки определяет и длину кадра:
| Точка через | Частота | Длина кадра | Для чего |
|---|---|---|---|
| 10 мкс | 100 кГц | 31 мс | дребезг кнопки, ШИМ |
| 100 мкс | 10 кГц | 0,3 с | 50 Гц от трансформатора |
| 1 мс | 1 кГц | 3 с | батарейка, конденсатор |
| 5 мс | 200 Гц | 15 с | медленные процессы |
Шаг 4. Синхронизация: почему картинка стоит на месте
Каждый кадр начинается в случайный момент. У повторяющегося сигнала картинка от кадра к кадру сдвигается и «бежит».
Синхронизация (на настоящих осциллографах — «запуск», trigger) велит датчику ждать, пока сигнал выбранного канала пересечёт заданный уровень в нужную сторону, и только тогда начинать кадр. Каждый кадр начинается в одной и той же фазе сигнала, и картинка стоит.
Уровень датчику передаётся кодом АЦП, а не вольтами. Пересчёт вольт в код —
обратная формула из шага 1, она в app/index.html:272.
Для одиночных событий (нажатие кнопки, заряд конденсатора) есть режим «Один кадр»: датчик ждёт события, записывает кадр и останавливается.
Как мы разгадали протокол
Программа производителя не рассказывает, как говорит с датчиком. Разгадывали по шагам, и каждый шаг можно повторить на уроке информатики.
1. Что видит Linux. Команда lsusb показала устройство
0403:6001 FTDI FT232R. Это стандартный мост USB ↔ UART (последовательный
порт). Драйвер для него встроен в Linux, и датчик появился как /dev/ttyUSB0.
2. Датчик молчит. Сам по себе он ничего не передаёт: ждёт команды. Перебирать команды наугад бесполезно.
3. Подсказка из Android. У производителя есть приложение для Android, написанное на Kotlin. Такие программы можно разобрать обратно в почти читаемый код (декомпилировать). В нём нашлись текстовые команды:
| Команда | Что делает |
|---|---|
I | «кто ты?» → B202,3.02,1.12.2011,2,…,921600 |
C 6 FREQ=? | спросить параметр; число 6 — длина FREQ=? |
C 8 FREQ=100 | установить параметр |
S / T | начать / остановить измерение |
Команды идут на скорости 38400 бод, данные — на 921600
(app/b202.json, baud).
4. Данные полубайтами. Каждый байт данных делится на две половинки по 4 бита, и каждая означает символ:
| Полубайт | Значение |
|---|---|
0–9 | цифра кода АЦП |
C | конец числа |
D + номер | начало кадра канала |
F | заполнитель |
Байты 20 60 CC читаются как «2060, конец». Разбор потока — класс
класс FrameParser в app/xstem-scope.js; тот же разбор на Python —
FrameParser в app/xstem-scope.py. Что оба разбирают поток одинаково,
проверяют тесты в tests/.
5. Ловушки, на которые мы наступили.
- «T» надо слать на скорости данных. Посланная на 38400 команда «стоп»
до датчика не доходила, и он продолжал присылать кадры, не слушая
новых команд (
_stop()вapp/xstem-scope.js). FREQ— не частота, а период в микросекундах. НаFREQ=10000мы ждали 10 кГц, а датчик честно записывал 30 секунд с частотой 100 Гц. Разгадали по меандру ESP32: 100 Гц приFREQ=1000дали ровно 10 точек на период.- Недопустимые значения датчик молча заменяет своими. Подходят только
10, 20, 50, 100, 200, 500… (
app/b202.json,periods_us). - Первые секунды после включения датчик мерит по-своему. Команды он
подтверждает, и прочитанные обратно настройки — наши, но «Пуск» в первые
3–4 секунды идёт с его собственными: точка через 10 мкс и синхронизация по
К1. На пустом входе кадров тогда нет вовсе, а с шумом они сыплются втрое чаще
положенного. Записали, выдёргивая датчик посреди опыта: «Пуск» через 1,5–2,5 с —
его настройки, через 4,3 и 13 с — наши. Поэтому программа, найдя вставленный
датчик, ждёт 4 секунды (
app/b202.json,boot_s). - Датчик копит кадр целиком. Проверили по времени прихода байтов: на
кадре 6 с первые данные приходят через 6,3 с, и весь кадр — за 0,3 с. Зато
PACKET_SIZEможно не только спросить, но и задать: при 250 точках кадры идут каждые 0,53 с. На этом построен самописец. Параметр датчик помнит, пока включён, поэтому программа каждый раз ставит его явно, а при подключении возвращает 3072.
6. Калибровка по известному сигналу. Пока на входе ничего нет, код
ничего не говорит о вольтах. Нужен сигнал, который мы знаем заранее: меандр
0/3,3 В от ESP32 (src/main.cpp). Размах в кодах на каждом
пределе дал «милливольты на код».
Общий принцип: неизвестный прибор изучают известным сигналом. Так же проверяют и настоящие осциллографы: у них на передней панели есть вывод «калибратор» с меандром 1 кГц.
Подключение, безопасность, калибровка
Щупы
У датчика два кабеля, на каждом по паре штекеров-«бананов»:
- красный — измерительный вход («+»);
- синий — общий провод канала («−»).
Какой кабель программа называет К1, а какой К2, проще всего проверить так: запустите опыт «Проверка с ESP32» и подайте сигнал на один кабель. Подпишите кабели маркером или кусочком изоленты, чтобы на уроке не путаться.
Если штекер ни во что не втыкается, наденьте на него «крокодил» или зажмите в гнезде штекера зачищенный провод.
Безопасность
Сеть 220 В к датчику не подключать — ни напрямую, ни «через что-нибудь».
По паспорту датчик выдерживает ±100 В, но между входами и корпусом USB-разъёма всего 0,53 МОм. Корпус USB соединён с ноутбуком, а через блок питания ноутбука и с сетевой землёй. Датчик не развязан с компьютером.
Разрешено подключать:
- батарейки и аккумуляторы;
- лабораторные блоки питания и адаптеры с низким напряжением на выходе;
- платы Arduino / ESP32 и собранные на уроке схемы с их питанием;
- вторичную обмотку понижающего трансформатора (6–12 В), когда сам трансформатор в корпусе и его сетевая часть закрыта.
Выбирайте предел с запасом: сначала ±25 В, потом уменьшайте. Если в таблице замеров написано «Зашкал: да», напряжение вышло за предел.
Если не работает
| Что пишет программа | Что делать |
|---|---|
Датчик не найден | Проверьте, что после подключения появился /dev/ttyUSB0: ls /dev/ttyUSB*. Другой разъём USB, другой кабель. |
Нет доступа к /dev/ttyUSB0 | Нужен администратор, один раз: sudo sh deploy/install.sh (правило udev для всех, кто сидит за компьютером) или sudo usermod -aG dialout $USER и перезайти в систему. |
датчик не ответил на запрос «I» | Отключите и снова подключите датчик. На этом порту может быть другое устройство: тогда укажите порт явно, например python3 xstem-scope.py --port /dev/ttyUSB1. |
| Страница пишет «нет связи с программой» | Программа в терминале закрыта или упала — запустите снова и обновите страницу. |
| «датчик отключён — вставьте его и нажмите «Пуск»» | USB выдернули. Вставьте обратно, через 5 секунд статус сменится на «остановлен» — нажмите «Пуск». Программу перезапускать не нужно. |
| Датчик только что вставили, «Пуск» — и кадров нет или они идут слишком часто | Первые секунды после включения датчик мерит со своими настройками. Нажмите «Стоп» и снова «Пуск». Программа сама ждёт эти секунды; на сайте выберите датчик в окне не сразу, а через 5 секунд после подключения. |
| Статус «ждём синхронизацию» | Сигнал не пересекает уровень синхронизации: проверьте уровень, канал и фронт или выберите «нет (свободно)». |
| Порт 8765 занят | python3 xstem-scope.py --http 8766 и адрес http://localhost:8766. |
| Сайт в Chromium: датчика нет в окне выбора или «Не удалось подключиться» | Нет доступа к порту — то же правило udev, что и выше. В Ubuntu с Chromium из snap: sudo snap connect chromium:raw-usb. |
| Сайт: «Этот браузер не умеет работать с USB» | Браузер без Web Serial (например, старый Firefox): обновите его, откройте страницу в Chromium или запустите программу. |
Две копии программы одновременно с одним датчиком работать не могут.
Генератор сигналов на ESP32
Чтобы проверить датчик, нужен сигнал, который заранее известен. Его даёт
ESP32 DevKit v1 с прошивкой src/main.cpp. Она же —
генератор для показа на уроке: синусоида, треугольник, пила, ШИМ.
| Вывод ESP32 | Сигнал |
|---|---|
| GPIO25 | выход генератора; после включения — меандр 100 Гц, 0 / 3,3 В |
| GPIO27 | всегда меандр 1 кГц, 0 / 3,3 В |
| GND | общий |
Прошить: в каталоге этого компонента выполнить pio run -t upload. Нужен
pio из pioarduino — проверено с pioarduino Core 6.2.0, поставленным через uv:
uv tool install https://github.com/pioarduino/platformio-core/archive/refs/tags/v6.2.0.zip.
Выпуск 6.2.0.post1 платформа отвергает: он называет себя 6.2.0-post.1, а это
по правилам версий «меньше 6.2.0». Если программа xSTEM Scope в это время
запущена, после прошивки перезапустите её: esptool оставляет порт платы на
460800 бод, и панель ESP32 на странице замолкает. Подключение: красный штекер — GPIO25, синий — GND.
Опыт «Проверка с ESP32» в программе настроен под это подключение.
Форму проще всего менять прямо на странице xSTEM Scope: панель «Генератор
ESP32» в правой колонке — форма, частота, размах или заполнение. Программа
xstem-scope.py находит плату сама (мосты CP2102 и CH340), а на сайте в
браузере нажмите «Подключить генератор» и выберите плату в окне браузера.
Те же команды можно вводить в мониторе порта (pio device monitor, 115200):
| Команда | Сигнал на GPIO25 | Что показать |
|---|---|---|
sin 100 | синусоида 100 Гц | амплитуда и действующее значение: отношение ≈1,41 |
tri 100 | треугольник | линейное нарастание и спад |
saw 100 | пила | так устроена развёртка в старых осциллографах и телевизорах |
sq 100 | меандр через ЦАП | сравнить с цифровым: фронты те же, размах меньше |
damp 200 | затухающие колебания 200 Гц пачками | колебательный контур, удар по камертону |
amp 1.0 | размах форм выше, В (0,1…2,9) | пределы ±2 и ±5 В, «Зашкал» |
pwm 1000 25 | ШИМ 1 кГц, заполнение 25 % | «Среднее» в таблице = 25 % от 3,3 В |
78 (1…255) | меандр 100 Гц 0 / (число / 255 · 3,3 В) | калибровка предела ±2 В |
0 | цифровой меандр 100 Гц 0 / 3,3 В | исходный режим |
? | что сейчас на выходе |
Формы со встроенного ЦАП идут вокруг 1,65 В (от 0,3 до 3 В). Чтобы сигнал встал по центру экрана, включите у канала вход «~». ЦАП 8-битный: на пределе ±2 В видны ступеньки — это тоже повод поговорить об оцифровке.
Размах форм через ЦАП меньше заданного. Прошивка считает, что код ЦАП 255 — это 3,3 В, но встроенный ЦАП ESP32 до питания не дотягивает. Проверено 2026-11-04 на ESP32 DevKit v1: синусоида 100 Гц с «Размах 2,6 В» дала 2,41 В (на 7 % меньше), то есть полная шкала ЦАП около 3,07 В; частота и форма точные (100,03 Гц, отклонение от синусоиды не больше 38 мВ). Цифровой меандр с GPIO25 тем же датчиком — 3,27 В, так что ошибается ЦАП, а не датчик. Прошивку под одну плату не подстраиваем: «осциллограф поймал генератор на неточности» — готовый сюжет для урока. Для калибровки датчика берите цифровой меандр, а не ЦАП.
Звуковая карта как генератор
В комплекте НАУРА есть жёлтая плата со значком «~»: аудиоштекер на три контакта, две латунные клеммы, резистор 20 Ом. Штекер — в разъём наушников ноутбука или телефона, зажимы любого канала датчика — на клеммы. Генератором становится любой сайт «генератор тона»: синусоида от 20 Гц до 20 кГц, частоту крутит сам ученик.
Плата меряет разность левого и правого канала. Проверено 2026-11-07: тон 1000 Гц только в левом канале — 0,16 В, только в правом — 0,16 В, в противофазе — 0,31 В, одинаково в оба — почти ноль. Сайты-генераторы играют одинаково в оба канала, поэтому перед опытом баланс выхода «Наушники» — до упора в одну сторону (Параметры → Звук). Иначе на экране ровная линия, и кажется, что сломан датчик.
Размах — около 0,2 В при громкости 34 % и 0,8 В при 70–80 %, предел ±2 В. Звуковой выход пропускает только переменное: постоянного напряжения и частот ниже ~20 Гц с него не получить.
Без браузера тон даёт speaker-test -t sine -f 1000 -c 2: он играет каналы по
очереди, поэтому работает и без баланса, но выше 8000 Гц не идёт (просили
9000 — получили 8000).
Опыт с этой платой — урок «Прибор врёт».
Калибровка
Датчик передаёт не вольты, а код АЦП от 0 до 4095 (подробно в THEORY.md). Чтобы перевести код в вольты, нужно знать, сколько милливольт приходится на один код на каждом пределе. Мы измерили это на меандре 3,3 В от ESP32:
| Предел | GAIN | мВ на код | Чем измерено |
|---|---|---|---|
| ±90 В | 0 | 44,1 | меандр 3,3 В = 75 кодов |
| ±25 В | 1 | 12,03 | меандр 3,3 В = 274 кода |
| ±5 В | 2 | 2,48 | меандр 3,3 В = 1330 кодов |
| ±2 В | 3 | 0,99 | один и тот же сигнал ЦАП на ±5 В и на ±2 В: отношение 2,50 |
Это общая калибровка: она записана в app/b202.json,
раздел calibration.default, и действует для любого датчика, у которого нет
своей.
Своя калибровка датчика
Датчики из одной коробки отличаются на несколько процентов. Чтобы каждый показывал точно, его калибровку записывают по серийному номеру. Номер страница пишет в заголовке после «№», рядом — какая калибровка действует: «своя» или «общая».
Замерьте мультиметром напряжение на выводе 3V3 у ESP32. Оно может быть, например, 3,28 В, а не ровно 3,3. Лучше — подать один и тот же сигнал на датчик и на Rigol.
Подайте меандр с GPIO25 и посмотрите «Размах» в таблице замеров на каждом пределе.
Новое значение = общее × (мультиметр / размах).
Замкните красный и синий штекеры каналов, получите кадр и запишите среднее: это код нуля. Он у каждого канала на каждом пределе свой, 2037–2045 вместо идеальных 2048.
Добавьте датчик в
calibration.sensorsвb202.json:"sensors": { "00417": { "mv_per_code": [44.3, 12.1, 2.47, 0.99], "zero_code": [[2041, 2040, 2043, 2044], [2038, 2039, 2040, 2042]], "date": "2026-11", "by": "Rigol DHO804, меандр 1 кГц" } }В
mv_per_codeиzero_codeчисла идут по GAIN 0, 1, 2, 3 — то есть ±90, ±25, ±5, ±2 В; вzero_codeпервая строка — К1, вторая — К2. Можно записать только часть: чего нет, возьмётся из общей.dateобязательна — по ней видно, когда пора перепроверять.
После отправки в репозиторий проверка CI убедится, что файл не сломан, и
калибровка появится на сайте. Компьютерам с программой — раздать заново
(sh deploy.sh hosts.txt, GUIDE.md).
Ноль на месте. Кнопка «Обнулить» на странице делает шаг 4 сама и
запоминает ноль в этом браузере для этого датчика и предела. Ноль, сохранённый
в браузере, важнее записанного в b202.json. Ноль, сохранённый до появления
серийных номеров, больше не используется: нажмите «Обнулить» ещё раз.
Осциллографы на весь класс
Каждый компьютер работает со своим датчиком сам по себе: сервер и интернет не нужны. Экраны групп учитель смотрит в Veyon, как и на любом другом уроке.
ПК группы 1 ── USB ── датчик ярлык «xSTEM Scope» → браузер
ПК группы 2 ── USB ── датчик ярлык «xSTEM Scope» → браузер
ПК учителя ── проектор Veyon — экраны группЕсть и второй путь — страница на сайте https://edu.xstem.ru/scope/ в Chromium или Firefox (проверен 158): программа на компьютере не нужна, браузер работает с датчиком сам, но нужен интернет. Установка по SSH нужна в обоих случаях: она даёт ученикам доступ к порту датчика.
Установка по SSH (один раз)
На компьютере учителя, в каталоге deploy/ этого компонента:
- Список компьютеров — по образцу
hosts.example.txt:cp hosts.example.txt hosts.txt nano hosts.txt # student@pc-01, student@pc-02 … - Установить на все:На каждом ПК sudo может спросить пароль. В конце скрипт напишет, где получилось, а где нет.
sh deploy.sh hosts.txt - Подключить датчики и проверить:На каждом ПК должно быть
sh deploy.sh hosts.txt --check/dev/ttyUSB0и «xSTEM Scope установлен».
Обновить программу — git pull и снова sh deploy.sh hosts.txt. Удалить —
sh deploy.sh hosts.txt --remove.
Что делает установщик на каждом ПК (deploy/install.sh):
- кладёт программу в
/opt/xstem-scope; - добавляет правило udev: датчик доступен тому, кто сидит за этим
компьютером (
uaccess), без группыdialoutи без перезахода; - в Ubuntu с Chromium из snap разрешает ему доступ к USB;
- в Ubuntu отключает службу
brltty: она забирает себе адаптеры FTDI, и датчик пропадает через секунду после подключения; - создаёт ярлык «xSTEM Scope» в меню и на рабочих столах, включая будущих пользователей.
Установить на один ПК без SSH: скопировать каталоги app/ и deploy/ и
выполнить sudo sh deploy/install.sh.
Безопасность компьютеров
- Доступ к порту. Правило udev касается только адаптеров FTDI FT232R
(
0403:6001) и выдаёт доступ пользователю, который сейчас вошёл в систему за этим компьютером. Пользователи, зашедшие по SSH, и службы доступа не получают — для них по-прежнему нужна группаdialout. - Страница на сайте (Web Serial). Браузер сам не открывает никаких портов: человек нажимает «Подключить датчик» и выбирает устройство в окне браузера. Разрешение выдаётся одному сайту на одно устройство и снимается в настройках сайта. Драйверы не ставятся, к файлам доступа нет.
- Программа. Слушает порт 8765 только для этого же компьютера: из сети к ней не подключиться. Команды принимает только от своей страницы — другой сайт, открытый в том же браузере, управлять датчиком не может.
- brltty отключается только там, где он установлен (Ubuntu). Он нужен лишь для брайлевских дисплеев; если такой дисплей в классе есть, не ставьте установщик на этот компьютер.
Перед первым уроком
- Прошить ESP32 генератором (WIRING.md).
- Пройти с ним по всем ПК: опыт «Проверка с ESP32», размах ≈3,3 В, частота 100 Гц. Заодно подписать кабели датчиков К1/К2.
- Распечатать памятку ниже — по одной на группу.
Памятка группе
Запуск
- Подключите датчик к USB.
- Дважды щёлкните ярлык «xSTEM Scope» на рабочем столе. Откроется браузер.
- В списке «Опыт» выберите свой опыт и прочитайте подсказку под ним.
- Нажмите ▶ Пуск.
Правила
- Сеть 220 В — никогда. Только батарейки, блоки питания, платы и то, что выдал учитель.
- Не знаете напряжение — начните с предела ±25 В и уменьшайте.
- «Зашкал: да» в таблице — предел мал, возьмите больше.
Если что-то не так
| Что видно | Что сделать |
|---|---|
| Окно «Датчик не найден» | Переподключите USB, снова щёлкните ярлык |
| «датчик отключён» | Вставьте USB обратно и нажмите ▶ Пуск. Ярлык щёлкать заново не нужно |
| Картинка «бежит» | Синхронизация: выберите канал с сигналом и уровень внутри сигнала |
| «ждём синхронизацию» | Уровень выше или ниже сигнала — поменяйте уровень или выберите «нет» |
| Медленный опыт, графика нет | Кадр пишется 3–15 с: смотрите на полоску внизу и ждите. Или включите «Самописец» — график побежит сразу |
| На ленте самописца разрывы | Так и должно быть: пока датчик передаёт кусок, он не пишет |
Сохранить результат
- Сохранить CSV — таблица чисел, открывается в LibreOffice Calc.
- Скриншот экрана — клавиша PrtSc.
- Подпишите файл: фамилии, опыт, дата.
Опыты с осциллографом на уроках труда и физики
Цикл из трёх занятий по 2 урока, отдельные уроки «Мотор-генератор», «UART и I2C» и «Прибор врёт» и опыты для уроков физики. Цель — не «пройти тему по физике», а научиться видеть то, что происходит в схеме, которую ученик сам собрал. К теме «Электрический ток» в 8 классе, к индукции в 9 и к конденсатору в 10–11 классе ребята придут, уже увидев эти явления своими глазами.
Все опыты, кроме урока «Прибор врёт», есть на странице программы в списке «Опыт»: выбор опыта сам выставляет развёртку, пределы и синхронизацию и показывает подсказку. В «Прибор врёт» точку оцифровки ученики ставят сами — в этом смысл урока.
Оборудование на группу из 2–3 человек
- ноутбук с Linux, датчик НАУРА, xSTEM Scope (README.md): ярлык на рабочем столе или https://edu.xstem.ru/scope/ в Chromium или Firefox;
- батарейки АА (новая и подсевшая), лампочка 2,5 В или моторчик 3 В, кнопка;
- макетная плата, провода, резисторы 10 кОм, конденсаторы 100 и 1000 мкФ;
- ESP32 или Arduino; на занятие 3 — понижающий трансформатор 6–12 В в корпусе и диодный мост.
Перед первым занятием учителю: прошить ESP32 генератором (WIRING.md), проверить каждый датчик опытом «Проверка с ESP32», подписать кабели К1/К2.
Занятие 1. Что видит осциллограф, чего не видит мультиметр
Инструктаж (5 мин). Что можно и что нельзя подключать (WIRING.md). Сеть 220 В — никогда.
1. Знакомство (15 мин). Опыт «Проверка с ESP32». Ученики находят на экране:
- сколько вольт в одной клетке по вертикали и сколько миллисекунд по горизонтали;
- размах и частоту — по сетке, затем по курсорам, затем по таблице замеров. Совпадает?
Вопрос: таблица показывает «Среднее» 1,65 В. Что показал бы мультиметр на этом выводе и почему?
2. Батарейка под нагрузкой (25 мин). Опыт «Батарейка под нагрузкой» (самописец, лента 30 с): «Один кадр», через 5 с подключить лампочку или моторчик на 5–10 с и отключить — на одной ленте «до», «под нагрузкой» и «после».
| Новая батарейка | Подсевшая | |
|---|---|---|
| Без нагрузки, В | ||
| С лампочкой, В | ||
| Просадка, мВ |
Вопрос: почему у подсевшей батарейки просадка больше, если «без нагрузки» обе показывают почти одинаково? (Подводим к внутреннему сопротивлению, без формулы.)
Проверено 2026-11-04 на свежей АА с моторчиком вместо лампочки: без нагрузки 1,53–1,55 В, под мотором в среднем на 70 мВ ниже, с провалами до 120 мВ (1,41 В) — щётки и неровная нагрузка; за 20 с под мотором напряжение сползает с 1,51 до 1,46 В. После отключения батарейка подтягивается не сразу: 1,519 → 1,527 В за 15 с и до исходного не возвращается. Мультиметр этого не покажет — второй вопрос группе: «почему не сразу?». Отдельный кадр 3 с не успевал за опытом, а следующий затирал интересный — поэтому опыт идёт самописцем; на ленте просадка видна ступенькой около 0,1 В. Чтобы посчитать внутреннее сопротивление числом (10–11 класс), нагрузка нужна известная — резистор 10–22 Ом вместо мотора: r = R · (E − U) / U.
3. Мотор-генератор (20 мин). Части 1, 2 и 4 урока «Мотор-генератор»: прогноз, знак и величина, нагрузка. Целиком урок занимает 45 минут.
Итог занятия: скриншот или CSV одного опыта в тетрадь, подпись осей с единицами.
Занятие 2. Кнопка и ШИМ: что видит микроконтроллер
1. Дребезг кнопки (30 мин). Собрать кнопку с подтягивающим резистором 10 кОм к 3,3 В. Опыт «Дребезг кнопки» → «Один кадр» → нажать кнопку.
Ученики считают по графику:
- сколько раз контакт разомкнулся и снова замкнулся;
- сколько миллисекунд длился дребезг (курсоры A и B).
Повторить 5 раз, записать худший случай. Вопрос: программа проверяет кнопку каждую 1 мс. Сколько «нажатий» она насчитает? Какую задержку поставить, чтобы считать правильно?
Продолжение: нажимать и смотреть, пока дребезг не исчезнет. Какая подходит задержка? Затем проверить её в своей программе со счётчиком нажатий.
2. ШИМ на светодиоде (30 мин). Светодиод с резистором на вывод ESP32,
программа меняет analogWrite от 0 до 255 с шагом 32.
| analogWrite | Ширина импульса | Период | Среднее (таблица) | Яркость на глаз |
|---|---|---|---|---|
| 32 | ||||
| 128 | ||||
| 224 |
Вопросы: меняется ли период? Почему светодиод не мигает, хотя на графике он то включён, то выключен? Сравните «Среднее» с мультиметром.
Занятие 3. Конденсатор и блок питания
1. Заряд конденсатора (35 мин). Собрать цепь из подсказки опыта «Заряд конденсатора (RC)»: 10 кОм и 100 мкФ. К1 — на конденсатор, К2 — после кнопки. «Один кадр» → нажать кнопку.
- Найти курсорами время, за которое напряжение дошло до 63 % от максимума.
- Посчитать R·C (10 000 Ом · 0,0001 Ф). Совпало?
- Заменить конденсатор на 1000 мкФ (опыт тот же, развёртку — 5 мс на точку). Во сколько раз дольше?
После опыта разрядить конденсатор через резистор, а не замыканием пинцетом.
2. Трансформатор и выпрямитель (35 мин). Только готовый трансформатор в корпусе; ученики работают с выводами вторичной обмотки. Опыт «Трансформатор и выпрямитель».
По шагам, каждый раз сохраняя CSV:
- К1 — обмотка: синусоида. Период по курсорам: 20 мс? Амплитуда и «Действующее» — во сколько раз отличаются? (≈1,41)
- К2 — после диодного моста: «горбы» одного знака. Какой у них период?
- Конденсатор 1000 мкФ после моста: горбы сглаживаются. Подключить нагрузку — резистор 100 Ом: появляются «пульсации». Как их уменьшить?
Шаг 1 проверен 2026-11-04 на школьном блоке ~6 В: частота 50 Гц, период 19,99 мс, «Действующее» 6,14 В, размах 17,3 В — отношение амплитуды к действующему 1,413. До «Обнулить» максимум и минимум разошлись на 0,6 В (+8,94 / −8,37 В): ноль этого датчика на пределе ±25 В — 2060, а не 2040. После «Обнулить» с замкнутыми щупами — +8,72 / −8,58 В. «Среднее» при этом 0,2 В, а не ноль: в кадре 15,36 периода, неполный период его сдвигает. Шаги 2 и 3 (мост, конденсатор) ещё не проверены.
Итог цикла. Каждая группа собирает страницу-отчёт: три лучших графика с подписанными осями и по одному предложению вывода к каждому. Графики строятся из CSV в LibreOffice Calc.
Урок «Мотор-генератор» (5–7 класс, 45 мин)
Вопрос урока. Как фонарик-«жужалка» светит без батарейки? Почему электромобиль подзаряжается, когда тормозит? Ответ ученики находят сами: мотор и генератор — одно и то же устройство.
На группу:
- моторчик 3 В (жёлтый или серебристый, тип 130);
- мотор-редуктор с колесом от платформы, на колесе метка маркером;
- второй моторчик 3 В, светодиод, резисторы 10 и 100 Ом, провода с крокодилами.
Перед уроком учителю. Мотор-редукторы отключить от драйвера: вращаемый мотор сам становится источником и подаёт напряжение назад, на драйвер и ESP32. Каждому ученику — лист группы.
1. Прогноз (5 мин). Ученики ещё не подключали мотор. Каждый рисует в листе, какой график ожидает, если крутить вал: сначала медленно, потом быстро, потом в обратную сторону. Рисунки не обсуждаем — вернёмся к ним в конце.
2. Знак и величина (10 мин). Опыт «Мотор-генератор» (самописец, лента 10 с, ±5 В): график бежит, пока крутят вал. Щупы К1 — на выводы моторчика. Один крутит, второй жмёт «Один кадр» — записать ленту 10 с и остановиться, третий записывает максимум и минимум из таблицы замеров:
| Как крутим | Максимум, В | Минимум, В |
|---|---|---|
| медленно, по часовой | ||
| быстро, по часовой | ||
| быстро, против часовой | ||
| рывками туда-сюда |
Вопросы: от чего зависит величина напряжения? Что значит минус? Что будет, если поменять щупы местами, а крутить как раньше?
Медленно пальцами вал крутится рывками: палец толкает, вал проскакивает и чуть откатывается — на графике короткие «зубы» обратного знака. Быстро — это щелчок по валу: напряжение сразу большое и плавно спадает, пока вал сам замедляется. Оба наблюдения — повод спросить «что на самом деле делал вал?».
3. Сколько вольт на оборот (15 мин). Пальцами мотор не раскрутить равномерно, а колесо мотор-редуктора — можно, и обороты колеса легко считать. Опыт «Мотор-редуктор: вольты на оборот» начинает с предела ±25 В: сколько даст редуктор, заранее неизвестно. Если график еле виден, нужен предел ±5 В.
«Один кадр» — и крутить колесо ровно, считая обороты вслух. Три ленты по 10 с: оборот за 2 секунды, оборот в секунду, два оборота в секунду. На каждой ленте:
- курсоры A и B — на начало и конец «полки», Δt из окна курсоров;
- напряжение — курсором в середине полки;
- обороты в секунду = число оборотов / Δt.
| Темп | Оборотов | Δt, с | Оборотов в секунду | U, В | U / (обороты в секунду) |
|---|---|---|---|---|---|
| медленно | |||||
| средне | |||||
| быстро |
В последнем столбце должно выйти почти одно и то же число. Это постоянная мотора: сколько вольт он даёт на каждый оборот в секунду. График U от оборотов в секунду — прямая через ноль. Вопрос: как сделать из мотора спидометр для ровера, если известен диаметр колеса?
4. Нагрузка (10 мин). Снова моторчик и опыт «Мотор-генератор». Подключить к выводам мотора нагрузку (щупы остаются на выводах). Крутить в одном темпе:
| Нагрузка | Максимум, В | Крутить тяжело? (1 — легко, 3 — тяжело) |
|---|---|---|
| ничего | ||
| 100 Ом | ||
| 10 Ом | ||
| выводы замкнуты проводом | — |
Щелчок по валу без нагрузки и с 10 Ом: с нагрузкой напряжение спадает круче — вал тормозится быстрее, и торможение видно на графике, а не только пальцами.
Затем светодиод: в одну сторону он вспыхивает, в другую — нет. На графике напряжение в ту сторону, где светодиод горит, упирается в «потолок» около 2 В.
Вопросы: почему с 10 Ом крутить тяжелее? (Ток, который забрала нагрузка, мотор «отнимает» у руки: энергия не появляется из ничего.) Где тормозят мотором? (Электромобиль, трамвай, электричка, лифт.) Сравните с батарейкой из занятия 1: генератор под нагрузкой тоже проседает.
5. Если осталось время: электрическая передача. Соединить проводами два моторчика, щупы К1 — на них. Крутить вал первого: второй вращается сам. Придержать второй пальцем — первый крутить тяжелее, напряжение падает. Так устроен тепловоз: дизель вращает генератор, генератор питает моторы колёс.
6. Повышенный уровень: щётки. Опыт «Мотор-генератор: щётки» (кадр 1,5 с, точка через 0,5 мс, предел ±5 В, синхронизация по К1 от 1 В, начало растянуто ×5). Нажать «Один кадр» и сильно щёлкнуть по валу: кадр начнётся с щелчка и остановится сам. Если кадра нет, щёлкнуть сильнее или в другую сторону: синхронизация ловит только подъём напряжения выше 1 В. При 0,3 В кадр запускался от касания пальцем ещё до щелчка, и выбег уезжал за растянутое начало. С уровнем 1 В и пределом ±5 В (проверено 2026-11-04): кадр начинается со щелчка, пик 3,5 В через 23 мс, выбег до нуля за 0,3 с, промежуток между зубцами растёт с 2,5–3 мс до 9,5–11 мс. На выбеге видно, что линия не гладкая, а с зубцами. Курсорами измерить промежуток между соседними зубцами в начале выбега и в конце. Внутри мотора несколько катушек, и щётки по очереди переключают их, поэтому напряжение не меняет знак. Каждый зубец — одно переключение: чем быстрее вал, тем зубцы чаще.
На моторчике 130 при щелчке зубцы шли примерно через 8–12 мс, высотой 0,05–0,1 В. На другом моторчике (2026-11-04) выбег от пика до нуля длился 0,1–0,15 с, зубцы шли через 3,5–4 мс в начале и через 8–10 мс в конце, высотой 0,3–0,5 В, а сильный щелчок упирался в предел ±2 В. Поэтому считать зубцы «на 0,1 с» нельзя, а промежуток между зубцами — можно. При медленном повороте пальцами они тонут в рывках, поэтому «поверните на один оборот и посчитайте» не работает. Сколько зубцов приходится на один оборот, честно измеряется только при известных оборотах: это опыт для стенда «мотор крутит мотор».
Итог (5 мин). Вернуться к прогнозу из части 1: что совпало, что нет и почему. Ответить на вопрос урока одним-двумя предложениями. В тетрадь — график из части 3 с подписанными осями.
На что обратить внимание. Строку «Частота» в таблице замеров для мотора не смотрим: в ней нет смысла, пока вал крутят неравномерно. «Среднее» тоже обманывает: в него входят паузы, когда колесо стояло. Поэтому в части 3 напряжение берётся курсором. Разрывы на ленте самописца — не поломка: пока датчик передаёт кусок, он не пишет (около 6 % времени).
Что уже проверено на моторчике типа 130: вращение пальцами даёт 0,1–0,5 В медленно и до 2 В быстро; шум в покое ±10 мВ; выбег после щелчка — около 0,5 с, зубцы щёток на спаде видны. Торможение с 10 Ом, светодиод и мотор-редуктор — проверить в школе.
Лист группы «Мотор-генератор»
Фамилии: ____________________________________
1. Прогноз. Нарисуйте, какой график покажет осциллограф, если крутить вал: медленно → быстро → в обратную сторону.
U ↑
|
0 +--------------------------------→ время
|2. Таблица «Знак и величина» (см. выше). Что значит минус на графике?
3. Таблица «Сколько вольт на оборот». Постоянная нашего мотора: ______ В на один оборот в секунду. Нарисуйте график U от оборотов в секунду.
4. Таблица «Нагрузка». Почему с маленьким сопротивлением крутить тяжелее?
5. Вывод. Как фонарик-«жужалка» светит без батарейки?
6. Сравните с прогнозом. Что совпало? Что нет и почему?
Урок «UART и I2C» (7 класс, 45 мин)
Один урок, а не пара: ученики видят биты на проводе. Подробная технологическая карта — урок 9 модуля «Робототехника» на сайте.
Программа одна на весь урок: examples/lesson9.
Платы прошивают один раз до урока (pio run -e lesson9 -t upload): плата
одновременно шлёт символ по UART на GPIO17 и опрашивает датчик AHT20 по
медленному I2C на GPIO21/22. Всё остальное меняется командами в мониторе порта
(pio device monitor): char B, text opus, baud 19200, addr 39, ?.
1. UART (10 мин). Опыт «UART 9600: один байт» сам ставит точку через
10 мкс и «Растянуть начало» ×20. Ученики подписывают 10 бит (старт, 8 бит от
младшего к старшему, стоп) и меряют бит курсорами: 1/9600 ≈ 104 мкс — около
10 точек на бит. Мерить между фронтами внутри посылки, не по старт-биту:
кадр начинается примерно через 15 мкс после его спада, и старт-бит на экране
около 90 мкс. Проверено 2026-11-04 на ESP32 DevKit v1: «A» = 0x41, биты
1 0 0 0 0 0 1 0 младшим вперёд, промежутки между фронтами 100–110 мкс. На втором символе (char B) пара меняется ролями.
Повышенный уровень: text opus в мониторе порта или своё имя в поле на панели «Плата урока 9: UART» страницы (до 24 символов латиницей) — плата шлёт слово байтами подряд, на ×1
видна вся посылка, а на ×5 «Сдвиг окна» под графиком ведёт по ней байт за байтом — группа читает слово по стартовым битам (проверено
2026-11-04: «claude one love» — 15 байт через 1040 мкс, расшифровано из одного
кадра целиком). Ещё: baud 19200 (52 мкс, 5 точек) и вопрос, почему 115200 бод
датчик уже не покажет (бит 8,7 мкс короче шага оцифровки).
2. Медленный I2C (11 мин). Настоящая шина 100 кГц датчику не по силам:
такт 10 мкс — одна точка. Программа сама ведёт SDA и SCL на 1 кГц. Опыт
«Медленный I2C: адрес датчика» (К1 — SDA, К2 — SCL) ставит растяжку ×2: на
экране СТАРТ и первые 9 тактов. Ученики читают SDA на высоком SCL: 0111000 =
0x38, бит чтения 1, на 9-м такте ACK = 0. Затем вводят addr 39 — ответа нет,
9-й бит остаётся 1. Байт состояния (повышенный уровень) виден целиком на ×1.
Проверено 2026-11-04 без модуля AHT20: START у левого края (по нему
синхронизация), 0111000 = 0x38, бит чтения 1, 9-й бит 1 — NACK, затем STOP.
Так и выглядит «датчика нет»; с модулем на 9-м такте будет 0. Ученикам
напомнить: в I2C адрес идёт старшим битом вперёд, а в UART — младшим.
Настоящую скорость учитель показывает на Rigol с декодером I2C: те же 0x38 и второй датчик 0x77 на тех же проводах.
Сверка с логическим анализатором: группа сначала читает слово и адрес по битам на датчике, потом включает декодеры UART и I2C в PulseView. Там же ловушка с порядком бит: «MGPU» с msb-first читается как B2 E2 0A AA.
Урок «Прибор врёт» (8 класс, 45 мин)
Вопрос урока. Можно ли верить экрану? Ухо слышит высокий писк, а прибор спокойно показывает 100 Гц. Кто прав и почему?
На группу: ноутбук с датчиком и плата «~» из комплекта НАУРА (аудиоштекер и две клеммы, WIRING.md). Генератор — любой сайт «генератор тона» в соседней вкладке браузера. Пока штекер в разъёме, динамики ноутбука молчат: чтобы тон было слышно, нужен разветвитель 3,5 мм (плата и наушники или колонка) или тот же тон на телефоне рядом.
Перед уроком учителю. На каждом ноутбуке баланс выхода «Наушники» до упора влево (Параметры → Звук), громкость 70–80 %. Без этого сайт-генератор на плате ничего не покажет. После урока баланс вернуть.
1. Подключение и первый звук (10 мин). Штекер платы — в разъём наушников, зажимы одного канала — на клеммы. «Свободный режим», предел ±2 В, точка 10 мкс. Тон 440 Гц (нота ля): синусоида, в таблице замеров около 440 Гц и период 2,27 мс. Проверить период курсорами по 10 волнам.
2. Прогноз (5 мин). Точку переставить на 100 мкс — датчик смотрит на сигнал 10 000 раз в секунду. Каждый в листе пишет, что покажет строка «Частота» на тонах 1000, 4000, 6000 и 9900 Гц. Не обсуждаем.
3. Измерение (10 мин). Тоны по очереди, каждый раз записать «Частоту» из таблицы и как выглядит график.
| Тон, Гц | Ожидали | На экране, Гц | Как выглядит график |
|---|---|---|---|
| 1000 | |||
| 4000 | |||
| 6000 | |||
| 9900 | |||
| 10 000 |
4. Объяснение (15 мин). До 5000 Гц прибор прав, выше — показывает 10 000 минус тон. На 9900 Гц волна успевает почти целиком качнуться между двумя взглядами датчика, и каждый взгляд ловит её чуть раньше, чем прошлый. Из точек складывается медленная волна, которой в проводе нет.
Пример из жизни: фотографировать секундную стрелку раз в 59 секунд — на снимках она медленно ползёт назад. Так же в кино «крутятся назад» колёса. Правило из THEORY.md: на одну волну нужно хотя бы 5–10 точек, иначе прибор показывает результат измерения, а не сигнал.
Вопросы: при какой точке оцифровки 9900 Гц покажется правильно? (10 мкс — проверить.) Почему на 6000 Гц график — сплошная полоса, а таблица уверенно пишет 4 кГц? Чему верить: графику, таблице или уху?
Повышенный уровень: два кварца. На 10 000 Гц ждали прямую линию, а на экране медленная волна около 2 Гц. Генератор считает время по кварцу звуковой карты, датчик — по своему, и они идут не точно вместе. По тону 9900 Гц посчитать, сколько точек в секунду датчик делает на самом деле (тон + частота на экране), предсказать, что будет на 9990 Гц, — и проверить.
Итог (5 мин). Вернуться к прогнозу: где ошиблись и почему. Одно предложение: когда экрану нельзя верить.
Проверено 2026-11-07 на датчике LzFS60rP, плата на К2, тон из браузера: 440 Гц → 441 Гц; на точке 100 мкс 6000 Гц → 4 кГц (на графике полоса), 9900 Гц → 97,8 Гц (30 ровных волн), 9990 Гц → 7,78 Гц, 10 000 Гц → около 2 Гц. По 9900 Гц датчик делает 9997,8 точки в «секунду звуковой карты»: расчёт для 9990 Гц — 7,8 Гц, совпало. Размах на 6000–9990 Гц тот же, что на низких тонах: фильтра перед АЦП у датчика нет, он просто берёт точки. Чей кварц уходит — датчика или звуковой карты — пока не проверено, как и 9900 Гц на точке 10 мкс.
Лист группы «Прибор врёт»
Фамилии: ____________________________________
1. Прогноз. Точка через 100 мкс. Что покажет «Частота»?
1000 Гц → _____ 4000 Гц → _____ 6000 Гц → _____ 9900 Гц → _____
2. Таблица измерений (см. выше).
3. С какого тона прибор начал ошибаться? _____ Гц. Почему именно с него?
4. Какую точку оцифровки поставить, чтобы увидеть 9900 Гц правильно? _____ Проверили? Да / нет
5. Вывод. Когда экрану нельзя верить?
Опыты для уроков физики
Датчики пришли из кабинета физики, и там они нужнее всего. Три опыта ниже идут с оборудованием кабинета: катушка-моток, полосовой магнит, камертон. Как они ложатся на темы по классам — ROADMAP.md.
Электромагнитная индукция (9 класс). Опыт «Индукция: магнит и катушка» (самописец, лента 10 с, ±2 В). Щупы К1 — на выводы катушки, гальванометр не нужен. Вдвигать магнит северным полюсом, выдвигать, затем южным, затем быстрее и медленнее; держать магнит неподвижно внутри катушки.
| Что делаем | Знак импульса | Высота, В | Длительность, мс |
|---|---|---|---|
| N вдвигаем медленно | |||
| N вдвигаем быстро | |||
| N выдвигаем | |||
| S вдвигаем | |||
| магнит неподвижен |
Вопросы: от чего зависит знак? Почему от быстрого движения импульс выше, но короче? Площадь импульса (высота × длительность) у быстрого и медленного движения — примерно одинакова: почему? (Подводим к тому, что ЭДС — скорость изменения магнитного потока, а сам поток меняется одинаково.) Если импульс меньше 50 мВ — катушка с большим числом витков или предел ±2 В уже на пределе возможностей; тогда магнит сильнее.
Маятник над катушкой (9 класс, колебания). Опыт «Маятник над катушкой» (лента 30 с). Магнит на нитке качается над торцом катушки, щупы — на катушку. Каждый проход магнита — импульс. Период маятника — время между каждым вторым импульсом (туда и обратно); по курсорам на 10 периодах точнее. Сравнить с T = 2π√(l/g) для своей длины нити, затем укоротить нить в 4 раза: период должен уменьшиться вдвое. Заодно видно затухание: импульсы со временем ниже, потому что размах и скорость падают.
Камертон (9 класс, звук). Опыт «Камертон». Пьезодиск (пассивная пищалка без генератора) прижать к резонаторному ящику камертона, щупы — на выводы диска. Ударить молоточком: кадр 61 мс запишется сам, когда сигнал перейдёт уровень синхронизации. Частоту дают таблица замеров и курсоры (10 периодов) — сравнить с надписью на камертоне. Два камертона разной частоты: у какого период короче? Повышенный уровень — «Один кадр» сразу после удара и через 5 с: как убывает размах.
Биения и созвучия (9 класс, звук). Плата «~» и две вкладки генератора тона в браузере (WIRING.md), «Свободный режим», предел ±2 В.
- 440 и 445 Гц, точка 100 мкс: размах «дышит» 5 раз в секунду — разность частот. 440 и 450 — 10 раз.
- 440 и 880 (октава), точка 10 мкс: рисунок сложный, но стоит на месте.
- 440 и 660 (квинта): рисунок повторяется через 4,5 мс, то есть 220 раз в секунду, — такой ноты нет ни в одной вкладке. Курсоры — на две самые высокие вершины подряд.
Вопрос: почему одни пары звучат вместе приятно, а другие «плывут»? Строка «Частота» на этих сигналах ошибается (на биениях 400–411 Гц вместо 445, на квинте прыгает между кадрами) — она считает переходы через ноль, а не повтор рисунка; период искать глазами и курсорами.
Проверено 2026-11-07: биения 0,2 и 0,1 с; квинта — в кадре 440,7 и 661,3 Гц, повтор рисунка 4,54 мс. Не проверено на слух: с платой в разъёме динамики ноутбука молчат, нужен разветвитель.
Медленные процессы (10–11 класс). Опыт «Самописец 60 с»: например, заряд конденсатора 1000 мкФ через 10 кОм (τ = 10 с) виден вживую, без ожидания кадра. Найти курсорами τ (63 %) и сравнить с R·C.
На что обратить внимание учителю
- Медленный кадр (3–15 с) появляется только в конце записи. Ученики жмут «Пуск» ещё раз и сбивают запись — сразу покажите полоску внизу экрана.
- Если картинка «бежит» — синхронизация выключена или уровень выше сигнала. Это хороший момент, чтобы объяснить синхронизацию (THEORY.md).
- «Зашкал: да» в таблице — значит, предел мал. Начинать всегда с большого.
Осциллограф в программе и проектах
Три занятия из Lesson.md — знакомство с прибором. Инженерное мышление появляется не от них, а когда осциллограф постоянно лежит на столе и к нему тянутся сами, чтобы ответить на вопрос или найти причину поломки. Здесь — как встроить его в программу «Труда» 5–9 классов и в проекты сайта.
Два правила
1. Прибор — не тема, а инструмент. Его достают, когда без него не ответить на вопрос. По главному правилу программы (Труд (технология)) вопрос должен быть интересен взрослому: «какую батарейку покупать», а не «посмотрите на синусоиду».
2. Предскажи → измерь → объясни расхождение. Перед каждым замером ученик пишет в тетради, что ожидает увидеть, и только потом смотрит. Ценность — в третьем шаге: «ожидал 1,5 В, увидел 1,1 В, потому что…». Ошибка в прогнозе — не минус, а повод разобраться. Проверять стоит именно качество объяснений:
| Уровень | Как звучит объяснение |
|---|---|
| 1 | «Так получилось» / «прибор врёт» |
| 2 | Называет причину: «батарейка подсела» |
| 3 | Причина + проверка: «если дело во внутреннем сопротивлении, с лампой помощнее просадка вырастет — проверил, выросла» |
Два прибора — разные задачи
| Датчик НАУРА (xSTEM Scope) | Rigol DHO804 | |
|---|---|---|
| Где | у каждой группы | у учителя, на проектах |
| Видит | до ~10 кГц: питание, батареи, ШИМ, сеть 50 Гц, звук, пульты | до 70 МГц: шины I2C/SPI/UART, WS2812, фронты логики, импульсные БП |
| Для чего | массовые замеры на уроке | трудные баги, наносекунды, декодирование шин, эталон для калибровки датчиков |
Если задача упирается в скорость (в таблице ниже — «Rigol»), это хороший момент показать, почему датчик не справляется: частота оцифровки против частоты сигнала (THEORY.md).
По годам программы
| Класс | Тема года | Вопрос | Что меряем |
|---|---|---|---|
| 5 | Мир измерим | Дорогая батарейка правда лучше дешёвой? | Просадку под одной и той же нагрузкой; кто дольше держит 1,2 В |
| 5 | Мир измерим | Дорогой USB-кабель правда заряжает быстрее? | Напряжение на телефонном конце кабеля во время зарядки: сколько теряется в проводе |
| 6 | Мир считаем | Мерцают ли лампы в нашем классе? | Фотодиод с резистором: пульсации света 100 Гц у разных ламп. Нормы для учебных помещений ограничивают пульсацию — найти в СанПиН и сравнить |
| 6 | Мир считаем | Дешёвая зарядка хуже фирменной? | Пульсации и помехи на выходе, просадка под нагрузкой (вход «~», предел ±2 В) |
| 7 | Мир записываем | Сколько на самом деле проживёт батарейка в датчике? | Ток через шунт 1 Ом: короткие всплески работы и длинный сон; средний ток → срок службы. Доказать графиком, а не паспортом |
| 8 | Машина делает за меня | Сколько времени занимает моя программа? | Приём профилирования: вывод HIGH в начале участка кода, LOW в конце — на экране длительность в микросекундах |
| 8 | Машина делает за меня | Что передаёт пульт от телевизора? | Выход ИК-приёмника (TSOP): пачки импульсов, расшифровка нулей и единиц по длительности |
| 9 | Система держит сама | Почему регулятор «раскачивается»? | Сигнал датчика и ШИМ исполнителя на двух каналах: запаздывание, перерегулирование, колебания |
Инструмент в проектах
| Проект | Вопрос | Что меряем | Чем |
|---|---|---|---|
| ERLS Rover | Что на самом деле отдают датчики ровера? | Дальномер, энкодеры, датчик линии на проводе против числа в программе — «Что говорит датчик» | НАУРА |
| ERLS Rover, БПЛА | Как ручка пульта превращается в движение? | Импульсы на сервопривод: 50 Гц, ширина 1–2 мс в зависимости от положения ручки | НАУРА |
| BeaconRadio, Power Sentry, WarWalk | Сколько проработает маячок от батареи? | Ток передачи через шунт 1 Ом: длительность пакета при SF7 и SF12 сравнить с расчётом времени в эфире | НАУРА |
| FoxHunter, Радиозанавес | Что в пакете? | Обмен с радиомодулем по SPI/UART | Rigol (декодер шин) |
| CelloPickUP | Где звук начинает искажаться? | Сигнал пьезодатчика до и после предусилителя: усиление, ограничение на громких нотах, шум | НАУРА |
| «Ядро-74» | Почему процессор пропускает такты? | Дребезг кнопки ручного тактирования, генератор на 555 | НАУРА |
| «Ядро-74» | Насколько быстрым может быть наш компьютер? | Задержка вентиля 74HC00 — наносекунды | Rigol |
| MeetingRoom, AM312 | Сколько держится сигнал «есть человек»? | Длительность и перезапуск импульса датчика движения против паспорта | НАУРА |
| Пассивный зуммер | Почему один зуммер играет мелодию, а другой только пищит? | Сигнал на зуммере: меандр нужной частоты против постоянного напряжения | НАУРА |
| Ambilight, адресные светодиоды | Почему лента мигает не тем цветом? | Сигнал данных WS2812, 800 кГц | Rigol |
Правило для проектов: если работа «не заработала», первый вопрос учителя — «а что показывает осциллограф?», а не «покажи код».
Физика
Датчики НАУРА пришли из кабинета физики, и вернуть их туда стоит рабочими. Связка с трудом такая: на труде ученик сам собирает схему и видит явление, на физике узнаёт закон, который за ним стоит. К уроку индукции в 9 классе у группы уже есть свои графики с мотора.
Темы привязаны к классам по общей структуре курса — порядок и номера параграфов сверить с учебником школы. Опыты с пометкой «есть» — в списке «Опыт» на странице и в Lesson.md.
| Класс | Тема физики | Опыт | |
|---|---|---|---|
| 7 | Скорость, равномерное движение | Два «световых барьера» (светодиод + фототранзистор) на К1 и К2, шарик в жёлобе: скорость по Δt между импульсами на разных участках | нужен |
| 8 | Электрический ток, источники тока | Батарейка под нагрузкой: просадка | есть |
| 8 | Работа и мощность тока | Ток через шунт 1 Ом: потребление в работе и во сне | нужен |
| 8 | Электродвигатель | Мотор как генератор: знак и величина | есть |
| 9 | Электромагнитная индукция, правило Ленца | Магнит и катушка из кабинета; мотор тормозит под нагрузкой | есть |
| 9 | Генератор переменного тока, трансформатор | Трансформатор: 50 Гц, амплитуда и действующее значение | есть |
| 9 | Колебания | Маятник с магнитом над катушкой: период против T = 2π√(l/g) | есть |
| 9 | Звук | Камертон и пьезодиск: частота против надписи | есть |
| 9 | Звук | Биения и созвучия: две вкладки генератора тона через плату «~» | есть |
| 10–11 | ЭДС и внутреннее сопротивление | Батарейка и генератор под нагрузкой, уже с числами: r = (E − U) / I | дополнить |
| 10–11 | Конденсатор, RC | Заряд конденсатора: τ = RC; τ = 10 с вживую в самописце | есть |
| 10–11 | Самоиндукция | Выброс напряжения при размыкании цепи с катушкой. Предел ±90 В, опыт ставит только учитель | нужен |
| 10–11 | Колебательный контур | Затухающие колебания LC в единицы кГц | нужен |
Сильнее всего связка в 9 классе: индукция, колебания и звук идут с оборудованием кабинета физики, а прибор у каждой группы. Правило «предскажи → измерь → объясни» работает так же, как на труде, а CSV каждого опыта обрабатывается в LibreOffice Calc — это лабораторная работа с настоящими данными.
Следующий шаг: стенд «мотор крутит мотор»
Пальцами вал равномерно не раскрутить. Стенд: ведущий мотор от ESP32 через TB6612 (ШИМ около 20 кГц, скорость — потенциометром), обороты — на экране ST7735; второй мотор — генератор, его напряжение показывает датчик. Генератор электрически отдельно от ESP32 и драйвера.
Что он даёт урокам: вольты на оборот без ручного вращения; передаточное число, проверенное напряжением; КПД пары «мотор — генератор» под нагрузкой (8 класс); зубцы щёток против оборотов; регулятор, который держит напряжение генератора (9 класс).
Решено: жёлтые моторы TT без редуктора (внутри мотор 130), валы — отрезком силиконовой трубки 1:1, шестерни из разобранного редуктора — на опыт с передачей. Открыто: какой датчик оборотов (щелевой оптодатчик с флажком на трубке или TCRT5000 с меткой) и есть ли моторы LEGO со встроенным энкодером.
Итоговая задача: «чёрный ящик»
Для сильных 9 классов и проектников. Дать устройство без документации и одну задачу: заставить его работать с нашим компьютером. Это ровно то, что мы проделали с датчиком НАУРА (THEORY.md):
- Что это за устройство с точки зрения компьютера? (
lsusb,dmesg) - Слушать, передаёт ли оно что-нибудь само.
- Найти подсказку: программу производителя, приложение, сайт.
- Гипотеза о протоколе → проверка известным сигналом (генератор ESP32).
- Записать находки так, чтобы другой мог повторить.
Подойдут: пульты (ИК и 433 МГц через модуль приёмника), старые датчики из шкафов, весы и термометры с USB, игрушки с Bluetooth. Ответа учитель заранее может и не знать — так даже честнее.
Порядок внедрения
- Этот год: три занятия из Lesson.md в 7–8 классах; все датчики проверены и подписаны; генератор ESP32 у учителя.
- Со следующей четверти: вопросы из таблицы «По годам» — по одному на класс, в рамках текущего устройства года.
- Проекты: осциллограф в списке оборудования каждого проекта; в защите проекта — хотя бы один график «предсказал — измерил — объяснил».
- Калибровка по Rigol: раз в год прогнать все датчики через один и тот же сигнал и записать поправки (WIRING.md → «Калибровка»).