From 909686681243935a04c76ea004d874ddbaaf7312 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 29 May 2026 11:49:55 +0300 Subject: [PATCH] documentation --- F3:F303/MLX90640-allsky/Readme.md | 429 ++++++++++++++++-- F3:F303/MLX90640-allsky/allsky.bin | Bin 41028 -> 24800 bytes F3:F303/MLX90640-allsky/heater.c | 2 +- .../MLX90640-allsky/ir-allsky.creator.user | 28 +- F3:F303/MLX90640-allsky/ir-allsky.files | 1 + F3:F303/MLX90640-allsky/version.inc | 4 +- 6 files changed, 413 insertions(+), 51 deletions(-) diff --git a/F3:F303/MLX90640-allsky/Readme.md b/F3:F303/MLX90640-allsky/Readme.md index 3cb7d9f..f0567ac 100644 --- a/F3:F303/MLX90640-allsky/Readme.md +++ b/F3:F303/MLX90640-allsky/Readme.md @@ -1,49 +1,277 @@ -IR allsky-camera project using 5 sensors MLX90640 -================================================= +# IR All-Sky Camera Documentation -When attached, udev will create symlink /dev/ir-allsky0. This is the udev rule: +## Project Overview -``` +This firmware implements an **infrared all-sky camera system** based on up to five **MLX90640** +thermal imaging sensors (32×24 pixels each), designed for **cloud monitoring** at the Special +Astrophysical Observatory of the Russian Academy of Sciences. The system automates sky quality +assessment for 0.5-meter telescopes of the "Astro-M" complex. -ACTION=="add", ENV{USB_IDS}=="0483:5740", ATTRS{interface}=="?*", PROGRAM="/bin/bash -c \"ls /dev | grep $attr{interface} | wc -l \"", SYMLINK+="$attr{interface}%c", MODE="0666", GROUP="tty" +The device continuously captures thermal images from multiple sensors (Zenith, East, South, West, North), processes environmental data from a **BMP280** pressure/humidity/temperature sensor, and controls **PWM heaters** to prevent dew formation on optics. -``` +**Repository:** [https://github.com/eddyem/stm32samples/tree/master/F3%3AF303/MLX90640-allsky](https://github.com/eddyem/stm32samples/tree/master/F3%3AF303/MLX90640-allsky) -Protocol: +--- -``` - -dn - draw nth image in ASCII -gn - get nth image 'as is' - float array of 768x4 bytes -l - list active sensors IDs -mn - show temperature map of nth image -tn - show nth image aquisition time -B - reinit BME280 -E - get environment parameters (temperature etc) -G - get MLX state -R - reset device -T - print current Tms - Debugging options: -aa - change I2C address to a (a should be non-shifted value!!!) -c - continue MLX -i0..4 - setup I2C with speed 10k, 100k, 400k, 1M or 2M (experimental!) -p - pause MLX -s - stop MLX (and start from zero @ 'c') -C - "cartoon" mode on/off (show each new image) - USB only!!! -Dn - dump MLX parameters for sensor number n -Ia addr [n] - set device address for interactive work or (with n) change address of n'th sensor -Ir reg n - read n words from 16-bit register -Iw words - send words (hex/dec/oct/bin) to I2C -Is - scan I2C bus -Us - send string 's' to other interface - - -``` - -To call this help just print '?', 'h' or 'H' in terminal. +## Hardware Requirements +### Microcontroller +- **STM32F303** series (tested on F303) +- 72 MHz system clock (HSE) or 48 MHz (HSI) ### Sensors +| Sensor | Interface | Purpose | +|--------|-----------|---------| +| MLX90640 (up to 5) | I²C (400 kHz) | Thermal imaging (32×24 pixels, -40..+300°C) | +| BMP280 / BME280 | SPI | Ambient temperature, pressure, humidity | +| NTC thermistors (4) | ADC (12-bit) | Heater feedback / backup temperature | + +### Outputs +- **DAC output** (PA5) – Onboard heater control (0–3.3V) +- **PWM channels** (TIM3) – External heaters (PA6, PA7, PB0, PB1) +- **UART1** – Main debug/auxiliary interface +- **USB** (CDC class) – Secondary interface + + +### Pin Assignment (STM32F303) + +| Pin | Function | Notes | +|-----|----------|-------| +| PA0–PA3 | NTC1–NTC4 | ADC inputs | +| PA4 | DAC_OUT1 | Onboard heater | +| PA5 | ADC_IN2 | DAC feedback | +| PA6, PA7 | PWM CH1, CH2 | TIM3_CH1, TIM3_CH2 (external heaters) | +| PA9, PA10 | UART1 TX/RX | Controlling interface | +| PA11, PA12 | USB DP/DM | CDC virtual COM | +| PA13, PA14 | SWD | Programming/debug | +| PA15 | USB DP pullup | USB pullup management for development board | +| PB0, PB1 | PWM CH3, CH4 | TIM3_CH3, CH4 (sky-quality + T-proportional) | +| PB3, PB4, PB5 | SPI SCK, MISO, MOSI | BMP280 interface | +| PB6, PB7 | I²C1 SCL/SDA | MLX90640 bus | +| PB9 | SPI CS | BMP280 chip select | + +--- + +## Firmware Architecture + +The firmware is **event-driven** with a **state machine** for MLX90640 data acquisition and a +**command parser** for bidirectional communication over USB and UART. + +### Core Modules + +| File | Responsibility | +|------|----------------| +| `main.c` | Main loop, SysTick, initialization, state machine orchestration | +| `adc.c/h` | ADC setup (DMA, median filtering), NTC reading, Vdd measurement | +| `i2c.c/h` | I²C low-level + DMA, multi-word transfers, bus scanning | +| `mlxproc.c/h` | MLX90640 state machine (5 sensors), parameter caching, image processing | +| `mlx90640.c/h` | MLX90640 calibration math (from Melexis datasheet) | +| `BMP280.c/h` | SPI-based BMP280/BME280 driver | +| `heater.c/h` | PWM heater control, dew-point avoidance logic | +| `commproto.cpp/h` | Command parser (USB/UART), ASCII maps, binary image export | +| `usb_dev.c/h` | USB CDC stack (bulk endpoints, ring buffers) | +| `usart.c/h` | UART driver with DMA and ring buffers | +| `spi.c/h` | SPI driver for BMP280 | +| `ringbuffer.c/h` | Circular buffers | +| `strfunc.c/h` | Number/string conversions, hexdumps | + +### Data Flow + +``` +MLX90640 sensors (I²C DMA) + ↓ +mlxproc.c (state machine, 5× parameter loading) + ↓ +mlx90640.c (pixel-by-pixel temperature calculation) + ↓ +user requests via USB/UART (ASCII map, binary, temperature map) + +BMP280 (SPI) + ↓ +Temperature, Pressure, Humidity, Dew point + ↓ +Heater logic (auto or setpoint) → PWM outputs + +ADC (DMA + median filter) + ↓ +NTC temperatures, MCU temperature, Vdd +``` + +--- + +## MLX90640 Processing + +### State Machine (`mlxproc.c`) + +The firmware manages up to **5 sensors** (addresses 0x10..0x14 left-shifted for I²C). The state +machine cycles through: + +1. **NOTINIT** – Read calibration parameters (832 words) from each sensor over I²C DMA. +2. **WAITPARAMS** – Wait for DMA completion, calculate parameters via `get_parameters()`. +3. **WAITSUBPAGE** – Poll `REG_STATUS` for `NEWDATA` flag, skip subpage 0. +4. **READSUBPAGE** – Read image data (832 words) via DMA, process with `process_image()`. + +**Key features:** +- Automatic sensor exclusion after `MLX_MAX_ERRORS` (default 11) consecutive errors. +- `Tlastimage[]` timestamps for each sensor (used by "cartoon mode" and timeout recovery). +- Supports changing sensor I²C addresses at runtime (`mlx_sethwaddr()`). + +### Temperature Calculation (`mlx90640.c`) + +Implementation follows **Melexis MLX90640 Datasheet (Section 11)**: +- Supply voltage compensation (`kVdd`, `vdd25`) +- Ambient temperature (`KvPTAT`, `KtPTAT`, `vPTAT25`) +- Gain normalization +- Offset correction (per-pixel `offset[]`, `kta[]`, `kv[]`) +- TGC (temperature gradient compensation) +- Pixel sensitivity (`alpha[]`) + KsTa, KsTo, range detection (CT3, CT4) +- **Extended temperature range** (up to 400°C) via `alphacorr[]` + +Output: **float array of 768 temperatures** (°C) per sensor. + +--- + +## Environmental & Heater Control + +### BMP280/BME280 Readings +- **Temperature** (°C) +- **Pressure** (Pa, also converted to hPa and mmHg) +- **Humidity** (%) +- **Dew point** (°C) – calculated via Magnus formula. + +Measurements are triggered every `ENV_MEAS_PERIOD` (10 seconds) in forced mode. + +### Heater Modes + +| Mode | Activation | Behavior | +|------|------------|----------| +| **Auto** (`autoheater=1`) | Humidity > 90% | Sets holding temperature = ambient + dew_over_delta (7°C) + 0.5°C (min 5°C) | +| **Hold** (`setheater N`) | Manual command | Maintains N°C ±5°C hysteresis using PWM | +| **Off** | Default | All heaters disabled | + +**PWM channels:** +- `ch0`, `ch1` – External heaters (controlled identically for symmetry) +- `ch2` – Proportional to ambient temperature: `(T_ambient + 20) × 2` %, clamped 0–100 +- `ch3` – Proportional to `(35°C – T_ambient + T_sky) × 2.5` %, clamped 0–100 + +**Anti-overheating:** If any NTC exceeds setpoint by >5°C, PWM is reduced to `PWM_HOLD_VAL` (10%). + +--- + +## Command Protocol + +The device presents a **virtual COM port** (CDC) over USB and a second UART interface. Both share the same command set. + +### Command Syntax +``` + [parameter] [= value] +``` +- Commands are **case-sensitive** (lowercase). +- Parameters are **decimal** (or hex with `0x`, binary with `b`). +- Use `help` for full list. +- Lines end with `\n` (newline). + +### Core Commands + +#### MLX90640 Image Commands + +| Command | Description | Example | +|---------|-------------|---------| +| `ascii n` | Draw ASCII-art thermal map (16 grayscale levels) | `ascii 0` | +| `tempmap n` | Print numeric temperature grid (°C) | `tempmap 1` | +| `binary n` | Dump raw float array (768×4 bytes) | `binary 2` | +| `acqtime n` | Show last image acquisition timestamp (ms) | `acqtime 3` | +| `cartoon` | Toggle live ASCII animation over USB | `cartoon` | + +#### Sensor Management + +| Command | Description | Example | +|---------|-------------|---------| +| `listids` | List active I²C addresses of all sensors | `listids` | +| `mlxaddr n [= addr]` | Get/set I²C address for sensor n (0–4) | `mlxaddr 2 = 0x15` | +| `mlxdump n` | Dump all calibration parameters for sensor n | `mlxdump 0` | +| `state` | Show MLX90640 state machine status | `state` | +| `mlxpause` / `mlxcont` / `mlxstop` | Control acquisition | – | + +#### Environment + +| Command | Description | Example | +|---------|-------------|---------| +| `environ` | Print T, P, H, dew point, Tsky | `environ` | +| `bmereinit` | Reinitialize BMP280 | – | +| `ntc [n]` | Get NTC temperature (°C) for channel n (0–3) | `ntc 1` | + +#### Heater Control + +| Command | Description | Example | +|---------|-------------|---------| +| `autoheater [= 0/1]` | Enable/disable automatic dew avoidance | `autoheater = 1` | +| `setheater [= N]` | Set holding temperature (°C) | `setheater = 25` | +| `clearheater` | Disable holding, turn off heaters | – | +| `pwm [n] [= val]` | Get/set PWM duty cycle (0–100%) for channel n | `pwm 0 = 50` | + +#### System & Debug + +| Command | Description | Example | +|---------|-------------|---------| +| `adc [n]` | Get raw ADC value (0–4095) for channel n | `adc 4` | +| `dac [= val]` | Get/set DAC output (0–4095) | `dac = 2048` | +| `mcutemp` | Show MCU internal temperature (°C) | – | +| `mcuvdd` | Show Vdd (V) | – | +| `time` | Show SysTick counter (ms) | – | +| `reset` | Software reset | – | +| `sendstr = text` | Forward string to other interface | `sendstr = "hello"` | + +#### Raw I²C (for debugging) + +| Command | Description | Example | +|---------|-------------|---------| +| `iicscan` | Scan I²C bus, report found addresses | – | +| `iicaddr [= addr]` | Get/set current I²C target address (non-shifted) | `iicaddr = 0x33` | +| `iicspeed [= n]` | Set I²C speed: 0=10k,1=100k,2=400k,3=1M,4=2M | – | +| `readreg reg [= n]` | Read n 16-bit registers | `readreg 0x8000` | +| `writedata = v1 v2 ...` | Write 16-bit values | `writedata = 0x1234 0x5678` | +| `hwaddr addr` | Change hardware I²C address of MLX90640 (non-shifted) | `hwaddr 0x15` | + +### Output Formats + +#### ASCII Thermal Map (`ascii`) +``` +RANGE=12.345 +MIN=-5.67 +MAX=6.78 + .':;+*oxX#&%B$@ + .':;+*oxX#&%B$@ + ... +``` +Uses 16‑character grayscale ramp: space (coldest) → `@` (hottest). + +#### Numeric Map (`tempmap`) +``` +-2.3 1.2 3.4 ... + 5.6 7.8 9.0 ... +... +``` + +#### Binary Image (`binary n`) +``` +BINARY0=<768×4 bytes raw float array>ENDIMAGE\n +``` +Little-endian IEEE 754 `float` values. Exact size: 3072 bytes per image. + +#### Environment Output +``` +TEMPERATURE=22.34 +SKYTEMPERATURE=-15.67 +PRESSURE_HPA=1013.25 +PRESSURE_MM=759.98 +HUMIDITY=65.20 +TEMP_DEW=15.60 +T_MEASUREMENT=12345678 +``` + + +### Sensors location | N | ID | Cardinal direction | |---|------|--------------------| @@ -53,3 +281,130 @@ To call this help just print '?', 'h' or 'H' in terminal. | 3 | 0x13 | West | | 4 | 0x14 | North | --------------------------------- + + +--- + +## Building & Flashing + +### Prerequisites +- ARM GCC toolchain (`arm-none-eabi-gcc`) +- Make +- [st-flash](https://github.com/texane/stlink), [stm32flash](https://sourceforge.net/projects/stm32flash/) or [OpenOCD](https://openocd.sourceforge.io) (for flashing MCU) + +### Build +```bash +git clone --depth=1 https://github.com/eddyem/stm32samples.git +cd stm32samples/F3:F303/MLX90640-allsky +make +``` + +### Configuration +- `EBUG` flag in Makefile enables debug output (slower, but verbose). +- `NOCAN` – define if CAN peripheral not used (increases USB buffer). +- `BUILD_NUMBER` and `BUILD_DATE` in `version.inc` are auto-generated. + +### Flashing +```bash +make flash # for flashing over st-link +# make boot - for flashing over USART1 bootloader +# make dfuboot - for flashing over USB-DFU +``` +or manually (over st-link): +```bash +openocd -f interface/stlink.cfg -f target/stm32f3x.cfg -c "program build/firmware.elf verify reset exit" +``` + +### udev Rule (Linux) +Create `/etc/udev/rules.d/99-USBiinterface.rules`: +``` +ACTION=="add", ENV{USB_IDS}=="0483:5740", ATTRS{interface}=="?*", PROGRAM="/bin/bash -c \"ls /dev | grep $attr{interface} | wc -l \"", SYMLINK+="$attr{interface}%c", MODE="0666", GROUP="tty" +``` +After replug, device appears as `/dev/ir-allsky0`. + +--- + +## Calibration & Tuning + +### NTC Thermistors +The firmware includes a **lookup table (LUT)** for NTC with B=3950, R25=1000Ω, covering -10..+59°C. +If a sensor reads `<5 ADC` → short circuit; `>4090 ADC` → open circuit. + +To calibrate your NTCs, modify `Rlut[]` in `adc.c`. + +### MLX90640 +Calibration data is **per-sensor** and stored in EEPROM. The firmware reads it automatically on +startup. +No user calibration is required – the factory data is used. + +### Vdd Measurement +Internal Vrefint (1.2V typical) and factory calibration value `*VREFINT_CAL_ADDR` are used: +``` +Vdd = (VREFINT_CAL * 3.3) / ADC_VREF +``` + +### MCU Temperature +Internal sensor (ADC1_IN16) uses factory calibration `TEMP30_CAL_ADDR` and `TEMP110_CAL_ADDR`. + +--- + +## Troubleshooting + +### No USB device detected +- Check `USBPU_ON()` in `main.c` – some boards need pull-up control, others constant. +- Verify PA11/PA12 are configured as AF14. +- Try different USB cable / port. + +### I²C communication errors +- Reduce speed: `iicspeed = 1` (100 kHz). +- Check pull-up resistors (2.2k–10kΩ on SCL/SDA). +- Use `iicscan` to verify sensor addresses. + +### BMP280 not responding +- Check SPI wiring (PB3–PB5, PB9 CS). +- Try software reset: `bmereinit`. +- Verify chip ID: should be 0x58 (BMP280) or 0x60 (BME280). + +### Heater not working +- Check `autoheater` status: `autoheater`. +- Verify NTC readings: `ntc`. +- For manual mode: `setheater = 25`, observe `pwm`. + +### Cartoon mode stops updating +- Cartoon mode works **only over USB**, not UART. +- If no new images, check `state` – may be paused or in error. + +### Watchdog resets +- IWDG period is 2 seconds. Long operations (e.g., full calibration dump) may trigger reset. +- Disable in debug builds (remove `IWDG_REFRESH` calls or undefine `EBUG`). + +--- + +## Performance & Limitations + +| Parameter | Value | +|-----------|-------| +| Image update rate (5 sensors) | ~1–2 Hz (depends on I²C speed) | +| RAM usage | ~39 kB (image buffers + parameters) | +| Flash usage | ~26 kB | +| Maximum sensors | 5 (limited by I²C address space 0x10–0x14) | +| Temperature range | -40..+300°C (MLX90640) | +| Accuracy | ±1°C (typical after calibration) | + +--- + +## License + +All source files are licensed under **GNU General Public License v3.0** unless stated otherwise. +The BMP280 driver includes MIT-licensed code from sheinz (2016). + +--- + +## Credits & References + +- **Author:** Edward V. Emelianov +- **MLX90640 Datasheet:** Melexis (Document REV 10) +- **BMP280 Datasheet:** Bosch Sensortec +- **STM32F303 Reference Manual:** STMicroelectronics (RM0316) + +For questions, bug reports, or contributions, please use the GitHub issue tracker. diff --git a/F3:F303/MLX90640-allsky/allsky.bin b/F3:F303/MLX90640-allsky/allsky.bin index 880dd8674d23a28a34732f79a9e0b3dc94c65c9f..202c9a819db1a4163dbd67b1577b1348c170ba9f 100755 GIT binary patch literal 24800 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�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 literal 41028 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%0AKdc}xdZ*zi4* zJp{98)-ACPpMuRclqC>_v`Je$*KO@uk*=k0ZA;i^r-Kc-o;w=U?2S-a!-8zv{8wM( z@Wxw*rwtup5`zOjLIid=oOHkIQM_e(Ln&zNz_wYeCTbgr_8E>H9O`rgW(E{=@Sj3X zS20C=G%Z|&9xM15{pqNyBXldT1v6nv?AJlFFo`suGGc6O4DA*QeKZ4GDIzo?T{Ox% zy=vfxO|O*~N|)zz_z6$MZlhEwFY7GLEHAAx?I21bDoqQ-Jy$Wk7KV*rDw(X>VXe77 zh9ycW%i2{=G6`T?NU|S1Rd9zN$%H8lSo}o*GYL5znV4CsL!bUJo{RVe0G6 zs#tH@Sj|)Kr?Z(-_AY#2)?qsw)z6`4AO)QO< zTVRJNF#kj=P2<;1G62uBv@lJZa8Mo>oHlb7nZnj$#lXM{VU+5kt|5~3MomU!eeIKj zY8LGs>}KA^2D|n_9MQTgtcAJ>7YbW^g^K;Rv7mWb<_IWeqYz3IkZv(8teTvlY|KNN z&KH7;&KN8ooy}IpHGQ@+(XRKnjTUBlKJKy8+M4vM!So>02O)pi-E_Tex4k!vh|u2^ zgS?+{Eo@KF4REvIO#=#-ze=la`7zXR?AkANq@ zOW+kCzM`HX;36;wTn8-R4saKE0Q>+v1^xh@0WSf3pT8&ZHJ;Z6P68|^i?jmV06quq z0QZ20z+>PkfP1JtxVPAYXAFA!fhzz$@6+w~klq2l1ReknfhWMPz+b>~fWE - + EnvironmentId - {7bd84e39-ca37-46d3-be9d-99ebea85bc0d} + {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} ProjectExplorer.Project.ActiveTarget @@ -32,7 +32,7 @@ KOI8-R false 4 - false + true 0 80 true @@ -40,9 +40,9 @@ 1 0 false - true + false false - 0 + 1 true true 0 @@ -51,10 +51,10 @@ false 1 true - false + true true *.md, *.MD, Makefile - false + true true true @@ -79,8 +79,8 @@ true true Builtin.DefaultTidyAndClazy - 2 - false + 4 + true @@ -96,12 +96,12 @@ true Desktop Desktop - {65a14f9e-e008-4c1b-89df-4eaa4774b6e3} + {91347f2c-5221-46a7-80b1-0a054ca02f79} 0 0 0 - /Big/Data/00__Electronics/STM32/F303-nolib/blink + /home/eddy/Yandex.Disk/Projects/stm32samples/F3:F303/MLX90640-allsky @@ -153,8 +153,10 @@ true true + 0 true + 2 @@ -167,6 +169,7 @@ true true + %{RunConfig:Executable:Path} 1 @@ -187,8 +190,10 @@ true true + 0 true + 2 @@ -201,6 +206,7 @@ true true + %{RunConfig:Executable:Path} 1 diff --git a/F3:F303/MLX90640-allsky/ir-allsky.files b/F3:F303/MLX90640-allsky/ir-allsky.files index 04d62be..db02648 100644 --- a/F3:F303/MLX90640-allsky/ir-allsky.files +++ b/F3:F303/MLX90640-allsky/ir-allsky.files @@ -1,5 +1,6 @@ BMP280.c BMP280.h +Readme.md adc.c adc.h commproto.cpp diff --git a/F3:F303/MLX90640-allsky/version.inc b/F3:F303/MLX90640-allsky/version.inc index f7c8d90..80b70ea 100644 --- a/F3:F303/MLX90640-allsky/version.inc +++ b/F3:F303/MLX90640-allsky/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "65" -#define BUILD_DATE "2026-05-06" +#define BUILD_NUMBER "67" +#define BUILD_DATE "2026-05-29"