From 4b103d37aadc39a1720f65280eef5abaf6985ad7 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 May 2026 19:36:18 +0530 Subject: [PATCH 1/3] [Swaraj ]Add AEAT-8800-Q24 magnetic encoder firmware and documentation - Introduced new firmware for the AEAT-8800-Q24 16-bit absolute magnetic rotary encoder, supporting both SSI and SPI protocols. - Added detailed pin mapping, SSI read sequence, and SPI protocol specifications in the code comments. - Included a comprehensive data sheet for the AEAT-8800-Q24 in PDF format, outlining key features, specifications, and applications. --- Documents/AEAT_8800_Q24.pdf | Bin 0 -> 1600728 bytes firmware/16_bit_encoder/16_bit_encoder.ino | 445 ++++++++++++++++ firmware/16_bit_encoder/test.h | 584 +++++++++++++++++++++ 3 files changed, 1029 insertions(+) create mode 100644 Documents/AEAT_8800_Q24.pdf create mode 100644 firmware/16_bit_encoder/16_bit_encoder.ino create mode 100644 firmware/16_bit_encoder/test.h diff --git a/Documents/AEAT_8800_Q24.pdf b/Documents/AEAT_8800_Q24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f227bce6726b5ffbba452a28a5dff544f9a4512d GIT binary patch literal 1600728 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%0DX{fvn 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 z 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

~&qrlE<}V34J;&?>l^ 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

LS9kV5xAf37*~ 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

|?*#xU=|+_6Kn3 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 +g;s?_WcsR?Qe#4k*ttTT4zN^ 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𝔭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 z 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%0AIKEFCCd}8m3Cpy0!g{TqxI-%^?$_|7<61uH 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ðqAkdTD&nD1Lg^($|k^oXq0t4Tj#loB{4R$}- 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 IDbrE^KVAD-8vp e.g. "r 07" + * w / W — Write register: w e.g. "w 10 AB" + * u / U — Unlock config registers (write 0xAB → REG_LOCK) + * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow regs) + * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! + * h / H — Print this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +#include + +// ─── Pin Definitions ────────────────────────────────────────────────────────── +// GPIO numbers match the user's pin table exactly. +#define PIN_SEL D2 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI +#define PIN_SEL1 D8 +#define PIN_CLK D1 // SCL / CLK : shared clock +#define PIN_NSL D10 // NSL / DIN : SSI enable / SPI MOSI +#define PIN_DO D0 // DO / DOUT : data from encoder / SPI MISO + +// ─── SSI Settings ───────────────────────────────────────────────────────────── +// Bit-banged; half-period determines SSI clock speed. +// 5 µs half-period → ~100 kHz SSI clock (datasheet max ~1 MHz) +#define SSI_HALF_PERIOD_US 5 +#define SSI_TOTAL_BITS 18 // 16 position + MHi + MLo + +// ─── SPI Settings ───────────────────────────────────────────────────────────── +// SPI_MODE3: CPOL=1 (idle high), CPHA=1 (sample on 2nd / rising edge) +SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); + +// ─── Register Addresses ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Command / Key Bytes ────────────────────────────────────────────────────── +#define CMD_READ 0x80 // 0b10xxxxxx +#define CMD_WRITE 0x40 // 0b01xxxxxx +#define UNLOCK_KEY 0xAB // Unlock config writes +#define PROG_KEY 0xA1 // Burn OTP + +// Resolution field (REG_RESOLUTION bits[1:0]) +#define RES_10BIT 0x00 +#define RES_12BIT 0x01 +#define RES_14BIT 0x02 +#define RES_16BIT 0x03 + +// ─── SSI Frame ─────────────────────────────────────────────────────────────── +// Declared here (global scope) so Arduino's auto-prototype generator +// can see the type before it emits prototypes for ssiReadPosition() etc. +struct SSIFrame { + uint16_t position; // absolute angle, 0–65535 (16-bit) + bool mhi; // magnet too close + bool mlo; // magnet too far +}; + +// ─── State ──────────────────────────────────────────────────────────────────── +static bool g_streaming = false; // continuous SSI stream active +static uint32_t g_lastStream = 0; // millis of last stream per print + +// ─── Mode Switching ─────────────────────────────────────────────────────────── + +/** Enter SSI mode: SEL HIGH, let CLK and NSL settle HIGH. */ +static void enterSSI() { + SPI.endTransaction(); // release hardware SPI bus + // Re-assert GPIO control of the shared pins + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); +} + +/** Enter SPI mode: SEL LOW, hardware SPI takes over CLK and MOSI. */ +static void enterSPI() { + digitalWrite(PIN_SEL, LOW); + delayMicroseconds(2); + SPI.beginTransaction(spiCfg); +} + +static void exitSPI() { + SPI.endTransaction(); + digitalWrite(PIN_SEL, HIGH); // back to SSI idle + delayMicroseconds(2); +} + +// ─── SSI Read ───────────────────────────────────────────────────────────────── + +/** Read 18 bits via bit-banged SSI (16-bit position + MHi + MLo). */ + +SSIFrame ssiReadPosition() { + enterSSI(); + + uint32_t raw = 0; + + // Pull NSL LOW → encoder latches position into shift register + digitalWrite(PIN_NSL, LOW); + delayMicroseconds(SSI_HALF_PERIOD_US); + + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + // Falling edge — encoder shifts next bit onto DO + digitalWrite(PIN_CLK, LOW); + delayMicroseconds(SSI_HALF_PERIOD_US); + + // Rising edge — read the bit + digitalWrite(PIN_CLK, HIGH); + raw = (raw << 1) | (digitalRead(PIN_DO) ? 1u : 0u); + delayMicroseconds(SSI_HALF_PERIOD_US); + } + + // End of frame: NSL HIGH + digitalWrite(PIN_NSL, HIGH); + delayMicroseconds(20); // monoflop recovery time + + SSIFrame f; + f.mlo = (raw >> 0) & 0x01; + f.mhi = (raw >> 1) & 0x01; + f.position = (uint16_t)((raw >> 2) & 0xFFFF); + return f; +} + +// ─── SPI Register Helpers ───────────────────────────────────────────────────── + +uint8_t spiReadReg(uint8_t addr) { + enterSPI(); + SPI.transfer(CMD_READ | (addr & 0x3F)); + uint8_t val = SPI.transfer(0xFF); + exitSPI(); + delayMicroseconds(5); + return val; +} + +void spiWriteReg(uint8_t addr, uint8_t data) { + enterSPI(); + SPI.transfer(CMD_WRITE | (addr & 0x3F)); + SPI.transfer(data); + exitSPI(); + delayMicroseconds(5); +} + +void unlockRegisters() { + spiWriteReg(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); +} + +uint16_t readHardwareZero() { + uint8_t lo = spiReadReg(REG_ZERO_POS_L); + uint8_t hi = spiReadReg(REG_ZERO_POS_H); + return ((uint16_t)hi << 8) | lo; +} + +void writeHardwareZero(uint16_t zp) { + unlockRegisters(); + spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); + spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +const char* resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case RES_10BIT: return "10-bit (1024 cpr)"; + case RES_12BIT: return "12-bit (4096 cpr)"; + case RES_14BIT: return "14-bit (16384 cpr)"; + case RES_16BIT: return "16-bit (65536 cpr)"; + default: return "unknown"; + } +} + +const char* magnetStatus(bool mhi, bool mlo) { + if (mhi) return "TOO CLOSE"; + if (mlo) return "TOO FAR"; + return "OK"; +} + +// ─── Serial Output Helpers ──────────────────────────────────────────────────── + +void printPosition(const SSIFrame& f) { + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%s%s%s\n", + f.position, deg, + magnetStatus(f.mhi, f.mlo), + f.mhi ? " (MHi)" : "", + f.mlo ? " (MLo)" : ""); +} + +void printAllRegisters() { + Serial.println(F("\n╔══════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_RESOLUTION, "Resolution (0x07)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + for (auto& r : regs) { + uint8_t val = spiReadReg(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); + } + + uint16_t zp = readHardwareZero(); + uint8_t resReg = spiReadReg(REG_RESOLUTION); + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, (zp / 65536.0) * 360.0); + Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read position once (SSI) ║")); + Serial.println(F("║ c — Toggle continuous position stream ║")); + Serial.println(F("║ s — Dump all SPI config registers ║")); + Serial.println(F("║ r — Read register at hex addr (e.g. r 07) ║")); + Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); + Serial.println(F("║ u — Unlock config registers (0xAB→Lock) ║")); + Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); + Serial.println(F("║ b — Burn shadow regs to OTP ⚠ IRREVERSIBLE ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Command Parser ─────────────────────────────────────────────────────────── + +void handleSerial() { + if (!Serial.available()) return; + + // Read full line + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Position read (SSI) ──────────────────────────────────────────────── + case 'p': { + SSIFrame f = ssiReadPosition(); + printPosition(f); + break; + } + + // ── Continuous stream toggle ─────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Register dump (SPI) ─────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ────────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = spiReadReg(addr); + Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); + break; + } + + // ── Write single register "w " ────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + spiWriteReg(addr, val); + uint8_t rb = spiReadReg(addr); + Serial.printf("[SPI-WR] Reg 0x%02X ← 0x%02X | Readback: 0x%02X %s\n", + addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + unlockRegisters(); + Serial.println(F("[SPI] Config registers unlocked (0xAB written to Lock reg)")); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); + writeHardwareZero(0x0000); + uint16_t rb = readHardwareZero(); + Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, + rb == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn OTP ⚠ IRREVERSIBLE ───────────────────────────────────────── + case 'b': { + // Require explicit confirmation by sending "burn" as the line + if (!line.equalsIgnoreCase("burn")) { + Serial.println(F("[WARN] ⚠ OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + } + Serial.println(F("[OTP] Unlocking and burning shadow regs to OTP...")); + unlockRegisters(); + spiWriteReg(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + break; + } + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // GPIO init — SSI pins, all idle HIGH + pinMode(PIN_SEL, OUTPUT); + // pinMode(PIN_SEL1, OUTPUT); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_SEL, HIGH); // SSI mode at boot + // digitalWrite(PIN_SEL1, LOW); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + + // Hardware SPI init (pins will be re-claimed by SPI.beginTransaction when needed) + SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); // SCK, MISO, MOSI, no CS + + delay(50); // t_POR encoder stabilisation + + // ── Boot banner ────────────────────────────────────────────────────────── + Serial.println(F("\n╔════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ SSI_SPI_SEL=21 CLK=19 NSL/DIN=18 DO=20 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // Quick SSI position read + SSIFrame f = ssiReadPosition(); + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", f.position, deg); + Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); + + // Quick SPI config read + uint8_t resReg = spiReadReg(REG_RESOLUTION); + uint16_t zp = readHardwareZero(); + Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); + Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", + zp, (zp / 65536.0) * 360.0); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ Type 'h' for command help ║")); + Serial.println(F("╚════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop ──────────────────────────────────────────────────────────────── + +void loop() { + // Handle serial commands (full-line parser) + handleSerial(); + + // Continuous SSI position stream (100 ms interval) + if (g_streaming && (millis() - g_lastStream >= 100)) { + g_lastStream = millis(); + SSIFrame f = ssiReadPosition(); + printPosition(f); + } +} diff --git a/firmware/16_bit_encoder/test.h b/firmware/16_bit_encoder/test.h new file mode 100644 index 0000000..052e7b7 --- /dev/null +++ b/firmware/16_bit_encoder/test.h @@ -0,0 +1,584 @@ +/** + * ============================================================ + * AEAT-8800-Q24 — 16-bit Absolute Magnetic Rotary Encoder + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── DUAL PROTOCOL ──────────────────────────────────────────── + * • SSI (SSI_SPI_SEL = HIGH) — reads real-time absolute position + * • SPI (SSI_SPI_SEL = LOW) — reads / writes configuration registers + * NOTE: Position data is ONLY available via SSI. The SPI interface + * is exclusively for OTP / configuration registers (no angle register). + * + * ── PIN MAPPING ────────────────────────────────────────────── + * Encoder Pin │ Pin Name │ GPIO │ Role + * ────────────┼───────────────┼───────┼────────────────────────────────── + * Pin 21 │ SSI_SPI_SEL │ GPIO21│ HIGH = SSI mode / LOW = SPI mode + * Pin 10 │ SCL / CLK │ GPIO19│ Shared clock (SCK) + * Pin 11 │ NSL / DIN │ GPIO18│ SSI enable (NSL) / SPI data-in (MOSI) + * Pin 12 │ DO / DOUT │ GPIO20│ Data output from encoder (MISO) + * ──────────────────────────────────────────────────────────── + * + * ── SSI READ SEQUENCE (16-bit mode — 20 clocks total) ──────── + * CLK idles HIGH, NSL idles HIGH, SSI_SPI_SEL HIGH. + * 1. Pull NSL LOW → encoder latches current angle into shift-reg + * 2. Wait ≥ 300 ns (tREQ) + * 3. Toggle CLK (HIGH→LOW→HIGH) × 20 — read DO on falling edge: + * Bits [19:4] = 16-bit absolute position D[15]..D[0] (MSB first) + * Bit [3] = Ready (1 = encoder output valid) + * Bit [2] = MHi (magnet too close) + * Bit [1] = MLo (magnet too far) + * Bit [0] = Parity (even parity over all 20 bits) + * 4. Pull NSL HIGH → end of frame + * 5. Wait ≥ 200 ns (tNSLH) before next read + * + * ── SPI PROTOCOL ───────────────────────────────────────────── + * SPI_MODE3 (CPOL=1, CPHA=1), ≤ 1 MHz + * Read cmd : 0b10_AAAAAA (8-bit) → dummy byte → 8-bit reply + * Write cmd : 0b01_AAAAAA (8-bit) → data byte + * + * ── REGISTER MAP (corrected from datasheet) ────────────────── + * Addr Register Notes + * 0x00 CustReserve0 User programmable + * 0x01 CustReserve1 User programmable + * 0x02 ZeroPos_L Zero Reset Position [7:0] + * 0x03 ZeroPos_H Zero Reset Position [15:8] + * 0x04 CustConfig0 UVW/PWM/I-width/UVW-pole config + * 0x05 CPR_Set1 CPR setting [7:4] / Hysteresis [3:0] + * 0x06 CPR_Set2 bit[7]=Dir, bit[6]=ZeroLatency, + * bits[5:4]=AbsResolution (00=16-bit, DEFAULT), + * bits[3:0]=CPR_Set2 + * 0x10 Lock Write 0xAB to unlock shadow regs + * 0x11 ProgCustRsv Write 0xA1 → OTP regs 0x00-0x01 + * 0x12 ProgZero Write 0xA2 → OTP regs 0x02-0x03 + * 0x13 ProgConfig Write 0xA3 → OTP regs 0x04-0x06 + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p / P — Read position once (single fast SSI read) + * m / M — Precision measurement (4096 SSI samples, filtered) + * c / C — Toggle continuous precision stream (~3-4 readings/sec) + * s / S — Dump all SPI config registers + * r / R — Read register: r e.g. "r 06" + * w / W — Write register: w e.g. "w 10 AB" + * u / U — Unlock config registers (write 0xAB → Lock reg) + * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow) + * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! + * h / H — Print this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + + #include + #include + #include "soc/gpio_reg.h" // GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG, GPIO_IN_REG + + // ─── Pin Definitions ────────────────────────────────────────────────────────── + #define PIN_SEL D7 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI (GPIO21) + #define PIN_CLK D10 // SCL / CLK : shared clock (GPIO19) + #define PIN_NSL D8 // NSL / DIN : SSI enable / SPI MOSI (GPIO18) + #define PIN_DO D9 // DO / DOUT : data from encoder (GPIO20) + + // ─── Fast GPIO Bit Masks ────────────────────────────────────────────────────── + // These GPIO numbers must match the GPIO column in the pin table above. + // Using direct register writes avoids digitalWrite() function call overhead + // in the inner SSI bit-bang loop. + #define GPIO_CLK_BIT (1UL << 19) // D10 = GPIO19 + #define GPIO_NSL_BIT (1UL << 18) // D8 = GPIO18 + #define GPIO_DO_BIT (1UL << 20) // D9 = GPIO20 + + #define FAST_CLK_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_CLK_BIT) + #define FAST_CLK_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_CLK_BIT) + #define FAST_NSL_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_NSL_BIT) + #define FAST_NSL_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_NSL_BIT) + #define FAST_READ_DO() ((REG_READ(GPIO_IN_REG) >> 20) & 1u) + + // ─── SSI Settings ───────────────────────────────────────────────────────────── + // Half-period of 1 us → ~500 kHz SSI clock. Datasheet max is 10 MHz. + // 20 bits for 16-bit mode: 16 position + Ready + MHi + MLo + Parity. + #define SSI_HALF_PERIOD_US 5 + #define SSI_TOTAL_BITS 20 + + // ─── SPI Settings ───────────────────────────────────────────────────────────── + // SPI_MODE3: CPOL=1 (idle HIGH), CPHA=1 (sample on rising edge) + SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); + + // ─── Register Addresses ─────────────────────────────────────────────────────── + #define REG_CUST_RESERVE_0 0x00 + #define REG_CUST_RESERVE_1 0x01 + #define REG_ZERO_POS_L 0x02 + #define REG_ZERO_POS_H 0x03 + #define REG_CUST_CONFIG_0 0x04 + #define REG_CPR_SET1 0x05 + #define REG_CPR_SET2 0x06 // bits[5:4] = absolute resolution + #define REG_LOCK 0x10 + #define REG_PROG_CUST_RSV 0x11 + #define REG_PROG_ZERO 0x12 + #define REG_PROG_CONFIG 0x13 + + // ─── Command / Key Bytes ────────────────────────────────────────────────────── + #define CMD_READ 0x80 // 0b10xxxxxx + #define CMD_WRITE 0x40 // 0b01xxxxxx + #define UNLOCK_KEY 0xAB + + // ─── Absolute Resolution (REG_CPR_SET2 bits [5:4]) ─────────────────────────── + // 00 = 16-bit (65536 cpr) — factory default; what we want + // 01 = 14-bit (16384 cpr) + // 10 = 12-bit (4096 cpr) + // 11 = 10-bit (1024 cpr) + #define RES_SHIFT 4 + #define RES_MASK 0x03 + + // ─── Filtering Constants ────────────────────────────────────────────────────── + #define NUM_BLOCKS 16 + #define SAMPLES_PER_BLOCK 256 + // TOTAL_SAMPLES = 4096 + + // ─── SSI Frame ─────────────────────────────────────────────────────────────── + struct SSIFrame { + uint16_t position; // absolute angle 0–65535 (16-bit) + bool ready; // 1 = encoder output is valid + bool mhi; // magnet too close + bool mlo; // magnet too far + bool parityOk; // even parity check passed + }; + + // ─── State ──────────────────────────────────────────────────────────────────── + static bool g_streaming = false; + + // ─── Mode Switching ─────────────────────────────────────────────────────────── + + static void enterSSI() { + SPI.endTransaction(); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); + } + + static void enterSPI() { + digitalWrite(PIN_SEL, LOW); + delayMicroseconds(2); + SPI.beginTransaction(spiCfg); + } + + static void exitSPI() { + SPI.endTransaction(); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); + } + + // ─── SSI Raw Read ───────────────────────────────────────────────────────────── + // Reads 20 bits via fast bit-banged SSI using direct GPIO register access. + // Assumes SSI mode is already active (enterSSI() called before this). + // Data is read on the falling edge of CLK per datasheet recommendation. + // Returns raw 20-bit frame: + // bits [19:4] = position D[15:0] + // bit [3] = Ready + // bit [2] = MHi + // bit [1] = MLo + // bit [0] = Parity + + static uint32_t ssiReadRaw() { + uint32_t raw = 0; + + FAST_NSL_LOW(); + delayMicroseconds(SSI_HALF_PERIOD_US); // tREQ >= 300 ns + + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + FAST_CLK_LOW(); + delayMicroseconds(SSI_HALF_PERIOD_US); // data valid on falling edge + raw = (raw << 1) | FAST_READ_DO(); + FAST_CLK_HIGH(); + delayMicroseconds(SSI_HALF_PERIOD_US); + } + + FAST_NSL_HIGH(); + delayMicroseconds(SSI_HALF_PERIOD_US); // tNSLH >= 200 ns + return raw; + } + + // ─── Parity & Frame Parsing ─────────────────────────────────────────────────── + + // Even parity: XOR of all 20 bits must be 0. + static inline bool checkParity20(uint32_t raw) { + return __builtin_parity(raw & 0xFFFFF) == 0; + } + + static SSIFrame parseSSIFrame(uint32_t raw) { + SSIFrame f; + f.position = (uint16_t)((raw >> 4) & 0xFFFF); + f.ready = (raw >> 3) & 1u; + f.mhi = (raw >> 2) & 1u; + f.mlo = (raw >> 1) & 1u; + f.parityOk = checkParity20(raw); + return f; + } + + // ─── Single-Shot SSI Read ───────────────────────────────────────────────────── + + SSIFrame ssiReadPosition() { + enterSSI(); + return parseSSIFrame(ssiReadRaw()); + } + + // ─── Filtering ──────────────────────────────────────────────────────────────── + + // Robust mean: average of samples within 1.5 LSB of the initial mean. + // Outliers (noise spikes > 1.5 counts away) are discarded before re-averaging. + static double getRobustMean(const uint16_t* samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) sum += samples[i]; + double initMean = sum / size; + + double rSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + if (abs((double)samples[i] - initMean) < 1.5) { + rSum += samples[i]; + count++; + } + } + return (count > 0) ? rSum / count : initMean; + } + + static double getMedian(double* values, int size) { + std::sort(values, values + size); + return values[size / 2]; + } + + // 4096-sample precision read: + // 16 blocks x 256 samples -> robust mean per block -> median of block means. + // Any sample that fails parity or has Ready=0 is silently discarded and + // retried so every block always accumulates exactly 256 valid counts. + // Returns angle in degrees (0.0 to 360.0). + double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + enterSSI(); + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; ) { + uint32_t raw = ssiReadRaw(); + if (!checkParity20(raw) || !((raw >> 3) & 1u)) { + continue; // bad sample — retry this slot + } + blockSamples[s] = (uint16_t)((raw >> 4) & 0xFFFF); + s++; + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + } + + return (getMedian(blockMeans, NUM_BLOCKS) * 360.0) / 65536.0; + } + + // ─── SPI Register Helpers ───────────────────────────────────────────────────── + + uint8_t spiReadReg(uint8_t addr) { + enterSPI(); + SPI.transfer(CMD_READ | (addr & 0x3F)); + uint8_t val = SPI.transfer(0xFF); + exitSPI(); + delayMicroseconds(5); + return val; + } + + void spiWriteReg(uint8_t addr, uint8_t data) { + enterSPI(); + SPI.transfer(CMD_WRITE | (addr & 0x3F)); + SPI.transfer(data); + exitSPI(); + delayMicroseconds(5); + } + + void unlockRegisters() { + spiWriteReg(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + } + + uint16_t readHardwareZero() { + uint8_t lo = spiReadReg(REG_ZERO_POS_L); + uint8_t hi = spiReadReg(REG_ZERO_POS_H); + return ((uint16_t)hi << 8) | lo; + } + + void writeHardwareZero(uint16_t zp) { + unlockRegisters(); + spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); + spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); + } + + // ─── Resolution Helpers (REG_CPR_SET2 0x06 bits [5:4]) ─────────────────────── + + static uint8_t getResolutionField() { + return (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; + } + + static const char* resolutionStr(uint8_t field) { + switch (field & RES_MASK) { + case 0x00: return "16-bit (65536 cpr)"; + case 0x01: return "14-bit (16384 cpr)"; + case 0x02: return "12-bit (4096 cpr)"; + case 0x03: return "10-bit (1024 cpr)"; + default: return "unknown"; + } + } + + // ─── Helpers ────────────────────────────────────────────────────────────────── + + static const char* magnetStatus(bool mhi, bool mlo) { + if (mhi) return "TOO CLOSE"; + if (mlo) return "TOO FAR"; + return "OK"; + } + + // ─── Serial Output Helpers ──────────────────────────────────────────────────── + + void printPosition(const SSIFrame& f) { + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%-9s Ready=%u Parity=%s\n", + f.position, deg, + magnetStatus(f.mhi, f.mlo), + (uint8_t)f.ready, + f.parityOk ? "OK" : "FAIL"); + } + + void printAllRegisters() { + Serial.println(F("\n╔══════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + for (auto& r : regs) { + uint8_t val = spiReadReg(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); + } + + uint16_t zp = readHardwareZero(); + uint8_t res = getResolutionField(); + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, (zp / 65536.0) * 360.0); + Serial.printf("║ Resolution : %s\n", resolutionStr(res)); + Serial.printf("║ [0x06][5:4] : 0b%u%u (raw field)\n", + (res >> 1) & 1u, res & 1u); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); + } + + void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read position once (single SSI read) ║")); + Serial.println(F("║ m — Precision reading (4096 SSI samples) ║")); + Serial.println(F("║ c — Toggle continuous precision stream ║")); + Serial.println(F("║ s — Dump all SPI config registers ║")); + Serial.println(F("║ r — Read register at hex addr (e.g. r 06) ║")); + Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); + Serial.println(F("║ u — Unlock config registers (0xAB -> Lock) ║")); + Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); + Serial.println(F("║ burn — Burn shadow regs to OTP WARNING: ║")); + Serial.println(F("║ Type exactly 'burn' + Enter ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); + } + + // ─── Command Parser ─────────────────────────────────────────────────────────── + + void handleSerial() { + if (!Serial.available()) return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Single fast SSI read ─────────────────────────────────────────────── + case 'p': { + SSIFrame f = ssiReadPosition(); + printPosition(f); + break; + } + + // ── Precision measurement (4096 SSI samples, filtered) ──────────────── + case 'm': { + Serial.println(F("[PREC] Measuring (4096 SSI samples)...")); + uint32_t t0 = millis(); + double deg = getUltraPrecisionReading(); + Serial.printf("[PREC] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); + break; + } + + // ── Continuous precision stream toggle ──────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous precision stream %s\n", + g_streaming ? "ON (each sample = 4096 reads)" : "OFF"); + break; + + // ── Register dump ───────────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read register "r " ────────────────────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 06'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = spiReadReg(addr); + Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); + break; + } + + // ── Write register "w " ─────────────────────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + spiWriteReg(addr, val); + uint8_t rb = spiReadReg(addr); + Serial.printf("[SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + unlockRegisters(); + Serial.println(F("[SPI] Registers unlocked (0xAB written to Lock reg 0x10)")); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); + writeHardwareZero(0x0000); + uint16_t rb = readHardwareZero(); + Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, + rb == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── OTP burn — requires typing "burn" in full ───────────────────────── + case 'b': { + if (!line.equalsIgnoreCase("burn")) { + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' + Enter to confirm.")); + break; + } + Serial.println(F("[OTP] Unlocking registers...")); + unlockRegisters(); + Serial.println(F("[OTP] Burning Customer Config OTP (regs 0x04-0x06)...")); + spiWriteReg(REG_PROG_CONFIG, 0xA3); + delayMicroseconds(200); + Serial.println(F("[OTP] Burning Zero Position OTP (regs 0x02-0x03)...")); + spiWriteReg(REG_PROG_ZERO, 0xA2); + delayMicroseconds(200); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + break; + } + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } + } + + // ─── Setup ──────────────────────────────────────────────────────────────────── + + void setup() { + Serial.begin(115200); + delay(300); + + // GPIO init — idle state: CLK HIGH, NSL HIGH, SEL HIGH (SSI mode) + pinMode(PIN_SEL, OUTPUT); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_SEL, HIGH); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + + // Hardware SPI init (SCK=PIN_CLK, MISO=PIN_DO, MOSI=PIN_NSL, no CS) + SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); + + delay(50); // t_POR encoder power-on stabilisation + + // ── Boot banner ────────────────────────────────────────────────────────── + Serial.println(F("\n╔════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ SEL=GPIO21 CLK=GPIO19 NSL=GPIO18 DO=GPIO20 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // Boot SSI read — single fast sample for startup status + SSIFrame f = ssiReadPosition(); + double bootDeg = (f.position / 65536.0) * 360.0; + Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", + f.position, bootDeg); + Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); + Serial.printf("║ Encoder Ready : %s\n", f.ready ? "YES" : "NO"); + Serial.printf("║ Frame Parity : %s\n", f.parityOk ? "OK" : "FAIL"); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // ── Auto-verify 16-bit resolution (REG_CPR_SET2 bits [5:4]) ───────────── + uint8_t reg06 = spiReadReg(REG_CPR_SET2); + uint8_t resField = (reg06 >> RES_SHIFT) & RES_MASK; + Serial.printf("║ Resolution : %s\n", resolutionStr(resField)); + + if (resField != 0x00) { + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ [WARN] Not 16-bit! Correcting shadow register... ║")); + unlockRegisters(); + spiWriteReg(REG_CPR_SET2, reg06 & (uint8_t)~(RES_MASK << RES_SHIFT)); + uint8_t verify = (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; + Serial.printf("║ Resolution now: %s\n", resolutionStr(verify)); + Serial.println(F("║ Shadow updated. Type 'burn' to make permanent. ║")); + } else { + Serial.println(F("║ 16-bit confirmed (factory default). ║")); + } + + uint16_t zp = readHardwareZero(); + Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", + zp, (zp / 65536.0) * 360.0); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ Type 'h' for command help ║")); + Serial.println(F("╚════════════════════════════════════════════════════╝\n")); + } + + // ─── Main Loop ──────────────────────────────────────────────────────────────── + + void loop() { + handleSerial(); + + // Precision stream: the ~250 ms measurement time is the natural rate limiter. + if (g_streaming) { + uint32_t t0 = millis(); + double deg = getUltraPrecisionReading(); + Serial.printf("[STREAM] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); + } + } + \ No newline at end of file From f49e2af6cda0a80fc464b9f359022bbd79775874 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 9 Jun 2026 12:47:02 +0530 Subject: [PATCH 2/3] [Swaraj] Refactor encoder pin definitions and add dual encoder firmware --- Angle_4_click | 1 + firmware/16_bit_encoder/16_bit_encoder.ino | 8 +- .../dual_aeat8800_independent.ino | 793 ++++++++++++++++++ .../dual_aeat8800_star/dual_aeat8800_star.ino | 694 +++++++++++++++ 4 files changed, 1492 insertions(+), 4 deletions(-) create mode 160000 Angle_4_click create mode 100644 firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino create mode 100644 firmware/dual_aeat8800_star/dual_aeat8800_star.ino diff --git a/Angle_4_click b/Angle_4_click new file mode 160000 index 0000000..35ecd67 --- /dev/null +++ b/Angle_4_click @@ -0,0 +1 @@ +Subproject commit 35ecd6735a8d3cf0b0fc1bc5544a8d693c773657 diff --git a/firmware/16_bit_encoder/16_bit_encoder.ino b/firmware/16_bit_encoder/16_bit_encoder.ino index 1d99861..a57f75f 100644 --- a/firmware/16_bit_encoder/16_bit_encoder.ino +++ b/firmware/16_bit_encoder/16_bit_encoder.ino @@ -58,11 +58,11 @@ // ─── Pin Definitions ────────────────────────────────────────────────────────── // GPIO numbers match the user's pin table exactly. -#define PIN_SEL D2 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI -#define PIN_SEL1 D8 -#define PIN_CLK D1 // SCL / CLK : shared clock +#define PIN_SEL D4 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI +#define PIN_SEL1 D3 +#define PIN_CLK D5 // SCL / CLK : shared clock #define PIN_NSL D10 // NSL / DIN : SSI enable / SPI MOSI -#define PIN_DO D0 // DO / DOUT : data from encoder / SPI MISO +#define PIN_DO D9 // DO / DOUT : data from encoder / SPI MISO // ─── SSI Settings ───────────────────────────────────────────────────────────── // Bit-banged; half-period determines SSI clock speed. diff --git a/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino b/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino new file mode 100644 index 0000000..70ae247 --- /dev/null +++ b/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino @@ -0,0 +1,793 @@ +/** + * ============================================================ + * AEAT-8800-Q24 — Fully Independent Dual Encoder + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── FULLY INDEPENDENT WIRING ───────────────────────────────── + * Every encoder has its own dedicated CLK, DIN/NSL, DO, and SEL. + * No pins are shared between encoders — eliminates all bus + * conflicts and DOUT tri-state contention. + * + * ── DEFAULT PIN ASSIGNMENT ─────────────────────────────────── + * Signal │ Encoder 1 │ Encoder 2 + * ────────────┼─────────────────┼───────────────── + * CLK │ D8 / GPIO19 │ D5 / GPIO23 + * DIN / NSL │ D10 / GPIO18 │ D2 / GPIO2 + * DO / DOUT │ D9 / GPIO20 │ D1 / GPIO1 + * SEL │ D3 / GPIO21 │ D4 / GPIO22 + * + * ── ANTENNA PINS ───────────────────────────────────────────── + * WIFI_ENABLE GPIO3 — LOW = activate RF switch control + * WIFI_ANT_CONFIG GPIO14 — HIGH = select external antenna + * + * ── KEY TIMING (datasheet Fig. 8 & timing table) ───────────── + * Symbol │ Min │ Unit │ Datasheet description + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time + * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and + * │ │ │ first SCL falling edge + * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock + * │ │ │ period for an SSI read + * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * Notes (datasheet p.15): + * • CLK = 1 when inactive; DIN = 1 when inactive. + * • CLK must be HIGH when switching between SSI and SPI modes. + * • NSL must be held HIGH for at least 3 ms after power-up before + * the first SSI read. + * • The user is advised to read from the SSI falling edge. + * • 16-bit resolution → 20 total bits (16 pos + Ready + MHi + MLo + Parity) + * All margins use SSI_HALF_US = 5 µs (>> all minimum requirements). + * + * ── BOOT WIZARD ────────────────────────────────────────────── + * On every boot the firmware prompts over Serial (115200 baud): + * 1. How many encoders are connected [1/2] + * 2. Which slot (only if 1 encoder) + * 3. Use default pins, or enter custom GPIO numbers + * Only the configured encoders are initialised. + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p — Read position (SSI, one-shot, enabled encoders) + * c — Toggle continuous stream (both enabled, 100 ms) + * 1 / 2 — Select active encoder for SPI commands + * s — Dump SPI config registers (active encoder) + * r — Read register at hex address e.g. "r 07" + * w — Write register e.g. "w 10 AB" + * u — Unlock config registers + * z — Set zero position = 0x0000 (shadow only) + * burn — Burn OTP ⚠ IRREVERSIBLE (type "burn" exactly) + * h — Show this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +// ─── Antenna Pins ───────────────────────────────────────────────────────────── +#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) +#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) + +// ─── Default Encoder Pins ───────────────────────────────────────────────────── +#define DEFAULT_ENC1_CLK D8 // GPIO19 +#define DEFAULT_ENC1_DIN D10 // GPIO18 +#define DEFAULT_ENC1_DOUT D9 // GPIO20 +#define DEFAULT_ENC1_SEL D3 // GPIO21 + +#define DEFAULT_ENC2_CLK D5 // GPIO23 +#define DEFAULT_ENC2_DIN D2 // GPIO2 +#define DEFAULT_ENC2_DOUT D1 // GPIO1 +#define DEFAULT_ENC2_SEL D4 // GPIO22 + +// ─── Register Addresses ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_VCC 0x0A +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Register Values ────────────────────────────────────────────────────────── +#define UNLOCK_KEY 0xAB +#define PROG_KEY 0xA1 +#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V +#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair +#define VAL_CPR1 0x40 // 0x05 CPR1=0b0100, no hysteresis +#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF + +// ─── SSI Timing ─────────────────────────────────────────────────────────────── +// Timing constants from AEAT-8800-Q24 datasheet timing table (Fig. 8): +// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL falling edge +// tREQ2 >= 200 ns NSL low time after rising edge of last clock period for an SSI read +// tNSLH >= 200 ns NSL high time between 2 successive SSI reads +// tsw(SEL) >= 1 µs SSI_SPI_SEL switch time +// SSI_HALF_US = 5 µs gives 7–25× margin over minimums. +// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. +#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity +#define SSI_HALF_US 5 // 5 µs half-period → ~100 kHz SSI clock +#define SSI_MONOFLOP_US 20 // monoflop recovery after NSL HIGH + +// ─── Encoder Config ─────────────────────────────────────────────────────────── + +struct EncoderConfig { + uint8_t pinCLK; + uint8_t pinDIN; + uint8_t pinDOUT; + uint8_t pinSEL; +}; + +// ─── AEAT8800 Class ─────────────────────────────────────────────────────────── +// Each instance is completely self-contained: CLK, DIN, DOUT, and SEL are +// all per-instance. No pins are shared with any other instance. + +class AEAT8800 { +public: + AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) + : _clk(clk), _din(din), _dout(dout), _sel(sel) {} + + /** Assert SEL HIGH → SSI mode. */ + void select(); + + /** Assert SEL LOW → SPI/idle mode. */ + void deselect(); + + /** Bit-bang one SPI register read using this encoder's CLK and DIN. */ + uint8_t spiRead(uint8_t addr); + + /** Bit-bang one SPI register write using this encoder's CLK and DIN. */ + void spiWrite(uint8_t addr, uint8_t data); + + /** Unlock and write all required OTP shadow registers with readback verify. + * Returns true on success. Failure is non-fatal; SSI reads still work. */ + bool configure(); + + /** Perform one 20-bit SSI read. Stores position in pos (0–65535). + * Precondition: select() must have been called. + * Returns false if Ready=0 or parity fails. */ + bool readAngleRaw(uint16_t &pos); + + /** Read angle in degrees [0, 360). Returns -1.0f on error. */ + float readAngleDegrees(); + +private: + uint8_t _clk, _din, _dout, _sel; +}; + +// ─── select / deselect ──────────────────────────────────────────────────────── + +void AEAT8800::select() { + // CLK must be HIGH before SEL transition (datasheet p.15, p.21) + digitalWrite(_clk, HIGH); + digitalWrite(_sel, HIGH); + delayMicroseconds(1); // tsw(SEL) >= 1 µs +} + +void AEAT8800::deselect() { + digitalWrite(_sel, LOW); + delayMicroseconds(1); +} + +// ─── SPI Write ──────────────────────────────────────────────────────────────── + +void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first + uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); + for (int i = 15; i >= 0; i--) { + digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK fall + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_din, HIGH); // DIN back to idle HIGH + digitalWrite(_clk, HIGH); // CLK must be HIGH before SEL change + digitalWrite(_sel, prevSel); +} + +// ─── SPI Read ───────────────────────────────────────────────────────────────── + +uint8_t AEAT8800::spiRead(uint8_t addr) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 8-bit command: opcode 0b10 (2b) + addr (6b) + uint8_t cmd = (0b10u << 6) | (addr & 0x3F); + for (int i = 7; i >= 0; i--) { + digitalWrite(_din, (cmd >> i) & 1u); + digitalWrite(_clk, LOW); + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + digitalWrite(_din, HIGH); // release DIN; encoder drives DOUT for reply + + uint8_t result = 0; + for (int i = 0; i < 8; i++) { + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall + digitalWrite(_clk, HIGH); // rising edge — master captures DOUT + result = (result << 1) | (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + digitalWrite(_sel, prevSel); + return result; +} + +// ─── Configure ──────────────────────────────────────────────────────────────── + +bool AEAT8800::configure() { + // Unlock must be the very first SPI write (datasheet p.10 note 3) + spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + + struct RegTarget { uint8_t addr, val; const char* name; }; + static const RegTarget targets[] = { + { REG_VCC, VAL_VCC, "0x0A (VCC)" }, + { REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)" }, + { REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)" }, + { REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)" }, + }; + + for (const auto& r : targets) { + spiWrite(r.addr, r.val); + delayMicroseconds(5); + uint8_t rb = spiRead(r.addr); + if (rb != r.val) { + Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", + r.name, r.val, rb); + return false; + } + } + + deselect(); + return true; +} + +// ─── SSI Read ───────────────────────────────────────────────────────────────── + +bool AEAT8800::readAngleRaw(uint16_t &pos) { + // Precondition: select() already called — SEL is HIGH, encoder in SSI mode + + // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 successive SSI reads + + // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) + digitalWrite(_din, LOW); + delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL falling edge and first SCL falling edge + + uint32_t raw = 0; + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + digitalWrite(_clk, LOW); // SCL falling edge — encoder shifts next bit onto DO + delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet (data stable after CLK fall) + raw = (raw << 1) | (uint32_t)digitalRead(_dout); // sample DO after falling edge (datasheet Fig. 8, p.15) + digitalWrite(_clk, HIGH); // SCL rising edge + delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) + } + + delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising edge of last clock period for an SSI read + + // End of frame: NSL HIGH → load mode (encoder resumes tracking position) + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes internal load cycle + + // Unpack 20-bit frame (datasheet Fig. 8–9) + uint8_t parity = (raw >> 0) & 0x1u; + uint8_t mlo = (raw >> 1) & 0x1u; + uint8_t mhi = (raw >> 2) & 0x1u; + uint8_t ready = (raw >> 3) & 0x1u; + uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); + + (void)parity; // checked implicitly via __builtin_popcount below + + if (!ready) { + Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", (unsigned)raw); + return false; + } + if (mhi) Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); + if (mlo) Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); + + // Even parity: total 1-bit count across all 20 raw bits must be even + if (__builtin_popcount((unsigned)raw) % 2 != 0) { + Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); + return false; + } + + pos = position; + return true; +} + +float AEAT8800::readAngleDegrees() { + uint16_t raw = 0; + if (!readAngleRaw(raw)) return -1.0f; + return (raw / 65536.0f) * 360.0f; +} + +// ─── Global State ───────────────────────────────────────────────────────────── + +static AEAT8800* g_enc1 = nullptr; +static AEAT8800* g_enc2 = nullptr; +static bool g_enc1Enabled = false; +static bool g_enc2Enabled = false; +static bool g_streaming = false; +static uint32_t g_lastStream = 0; +static uint8_t g_activeEnc = 1; // target encoder for SPI serial commands + +// ─── Setup Wizard Helpers ───────────────────────────────────────────────────── + +/** Block until a complete line is received on Serial. Returns trimmed string. */ +static String readLine() { + while (!Serial.available()) { /* busy-wait */ } + String s = Serial.readStringUntil('\n'); + s.trim(); + return s; +} + +/** Print a pin prompt, read a GPIO integer. Returns the chosen GPIO number. */ +static uint8_t promptPin(const char* label, uint8_t def) { + Serial.printf(" %-8s (default GPIO%-2u): ", label, def); + String s = readLine(); + if (s.length() == 0) { + Serial.printf("GPIO%u (default)\n", def); + return def; + } + uint8_t v = (uint8_t)s.toInt(); + Serial.printf("GPIO%u\n", v); + return v; +} + +/** Prompt for custom pin override for one encoder. Modifies cfg in-place. */ +static void promptCustomPins(const char* label, EncoderConfig &cfg, + const EncoderConfig &def) { + Serial.printf("\n Encoder %s — defaults:" + " CLK=GPIO%u DIN=GPIO%u DO=GPIO%u SEL=GPIO%u\n", + label, def.pinCLK, def.pinDIN, def.pinDOUT, def.pinSEL); + Serial.print(F(" Use default pins? [Y/n]: ")); + String ans = readLine(); + ans.toLowerCase(); + + if (ans == "n") { + cfg.pinCLK = promptPin("CLK", def.pinCLK); + cfg.pinDIN = promptPin("DIN", def.pinDIN); + cfg.pinDOUT = promptPin("DO", def.pinDOUT); + cfg.pinSEL = promptPin("SEL", def.pinSEL); + } else { + cfg = def; + Serial.println(F(" Using defaults.")); + } +} + +// ─── Setup Wizard ───────────────────────────────────────────────────────────── + +static void runSetupWizard(EncoderConfig &cfg1, EncoderConfig &cfg2) { + const EncoderConfig def1 = { DEFAULT_ENC1_CLK, DEFAULT_ENC1_DIN, + DEFAULT_ENC1_DOUT, DEFAULT_ENC1_SEL }; + const EncoderConfig def2 = { DEFAULT_ENC2_CLK, DEFAULT_ENC2_DIN, + DEFAULT_ENC2_DOUT, DEFAULT_ENC2_SEL }; + cfg1 = def1; + cfg2 = def2; + + Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 — Encoder Setup Wizard ║")); + Serial.println(F("╠══════════════════════════════════════════════════════════╣")); + Serial.println(F("║ GPIO reference: ║")); + Serial.println(F("║ D0=0 D1=1 D2=2 D3=21 D4=22 D5=23 ║")); + Serial.println(F("║ D6=16 D7=17 D8=19 D9=20 D10=18 ║")); + Serial.println(F("╠══════════════════════════════════════════════════════════╣")); + Serial.println(F("║ Default pin layout (fully independent, no sharing): ║")); + Serial.println(F("║ ENC1: CLK=19(D8) DIN=18(D10) DO=20(D9) SEL=21(D3) ║")); + Serial.println(F("║ ENC2: CLK=23(D5) DIN=2(D2) DO=1(D1) SEL=22(D4) ║")); + Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); + + // ── Step 1: number of encoders ──────────────────────────────────────────────── + uint8_t numEnc = 0; + while (numEnc != 1 && numEnc != 2) { + Serial.print(F("How many encoders are connected? [1/2]: ")); + String s = readLine(); + numEnc = (uint8_t)s.toInt(); + if (numEnc != 1 && numEnc != 2) + Serial.println(F(" Please enter 1 or 2.")); + } + + if (numEnc == 1) { + // ── Step 2 (single encoder): which slot ──────────────────────────────────── + uint8_t slot = 0; + while (slot != 1 && slot != 2) { + Serial.print(F("Which encoder slot is connected? [1/2]: ")); + String s = readLine(); + slot = (uint8_t)s.toInt(); + if (slot != 1 && slot != 2) + Serial.println(F(" Please enter 1 or 2.")); + } + g_enc1Enabled = (slot == 1); + g_enc2Enabled = (slot == 2); + g_activeEnc = slot; + } else { + g_enc1Enabled = true; + g_enc2Enabled = true; + g_activeEnc = 1; + } + + // ── Step 3: optional custom pins per enabled encoder ────────────────────────── + if (g_enc1Enabled) promptCustomPins("1", cfg1, def1); + if (g_enc2Enabled) promptCustomPins("2", cfg2, def2); + + // ── Configuration summary ───────────────────────────────────────────────────── + Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println(F("║ Configuration confirmed: ║")); + if (g_enc1Enabled) + Serial.printf( "║ ENC1 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", + cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); + else + Serial.println(F("║ ENC1 disabled ║")); + if (g_enc2Enabled) + Serial.printf( "║ ENC2 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", + cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); + else + Serial.println(F("║ ENC2 disabled ║")); + Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); +} + +// ─── Pin Init ───────────────────────────────────────────────────────────────── + +static void initEncoderPins(const EncoderConfig &cfg) { + pinMode(cfg.pinCLK, OUTPUT); digitalWrite(cfg.pinCLK, HIGH); // CLK idles HIGH + pinMode(cfg.pinDIN, OUTPUT); digitalWrite(cfg.pinDIN, HIGH); // DIN/NSL idles HIGH + pinMode(cfg.pinDOUT, INPUT); + pinMode(cfg.pinSEL, OUTPUT); digitalWrite(cfg.pinSEL, LOW); // SPI/idle mode +} + +// ─── Runtime Helpers ───────────────────────────────────────────────────────── + +/** Return the active encoder pointer, or nullptr if that encoder is disabled. */ +static AEAT8800* activeEncoder() { + if (g_activeEnc == 1 && g_enc1Enabled) return g_enc1; + if (g_activeEnc == 2 && g_enc2Enabled) return g_enc2; + return nullptr; +} + +static const char* resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case 0x00: return "10-bit (1024 cpr)"; + case 0x01: return "12-bit (4096 cpr)"; + case 0x02: return "14-bit (16384 cpr)"; + case 0x03: return "16-bit (65536 cpr)"; + default: return "unknown"; + } +} + +static void printSinglePosition(uint8_t id, uint16_t pos, bool ok) { + if (ok) { + double deg = (pos / 65536.0) * 360.0; + Serial.printf("[ENC%u] Pos=%5u Angle=%8.4f deg\n", id, pos, deg); + } else { + Serial.printf("[ENC%u] READ ERROR\n", id); + } +} + +// ─── Read Both Enabled Encoders ─────────────────────────────────────────────── + +static void readBothEnabled(uint16_t &pos1, uint16_t &pos2, + bool &ok1, bool &ok2) { + pos1 = 0; pos2 = 0; ok1 = false; ok2 = false; + + if (g_enc1Enabled) { + g_enc1->select(); + ok1 = g_enc1->readAngleRaw(pos1); + g_enc1->deselect(); + if (g_enc2Enabled) delay(1); // brief gap before reading enc2 + } + if (g_enc2Enabled) { + g_enc2->select(); + ok2 = g_enc2->readAngleRaw(pos2); + g_enc2->deselect(); + } +} + +// ─── Register Dump ──────────────────────────────────────────────────────────── + +static void printAllRegisters() { + AEAT8800* enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + return; + } + + Serial.printf("\n╔══════════════════════════════════════════════╗\n"); + Serial.printf( "║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", g_activeEnc); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_RESOLUTION, "Resolution (0x07)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + for (auto& r : regs) { + uint8_t val = enc->spiRead(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); + } + + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + uint8_t resReg = enc->spiRead(REG_RESOLUTION); + + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf( "║ HW Zero Pos : %5u (%.4f deg) ║\n", + zp, (zp / 65536.0) * 360.0); + Serial.printf( "║ Resolution : %-30s ║\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +// ─── Help ───────────────────────────────────────────────────────────────────── + +static void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Independent Dual — Commands ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read enabled encoders (SSI, one-shot) ║")); + Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); + Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); + Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); + Serial.println(F("║ r — Read register e.g. 'r 07' ║")); + Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); + Serial.println(F("║ u — Unlock config registers ║")); + Serial.println(F("║ z — Set zero position = 0x0000 ║")); + Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Serial Command Parser ──────────────────────────────────────────────────── + +static void handleSerial() { + if (!Serial.available()) return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + // OTP burn — requires the exact string "burn" to prevent accidents + if (line.equalsIgnoreCase("burn")) { + AEAT8800* enc = activeEncoder(); + if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); return; } + Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + return; + } + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Read both enabled encoders (SSI) ───────────────────────────────────── + case 'p': { + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEnabled(pos1, pos2, ok1, ok2); + if (g_enc1Enabled) printSinglePosition(1, pos1, ok1); + if (g_enc2Enabled) printSinglePosition(2, pos2, ok2); + break; + } + + // ── Continuous stream toggle ────────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Select active encoder for SPI commands ──────────────────────────────── + case '1': + if (!g_enc1Enabled) { Serial.println(F("[ERR] ENC1 is not enabled.")); break; } + g_activeEnc = 1; + Serial.println(F("[INFO] Active encoder: ENC1")); + break; + case '2': + if (!g_enc2Enabled) { Serial.println(F("[ERR] ENC2 is not enabled.")); break; } + g_activeEnc = 2; + Serial.println(F("[INFO] Active encoder: ENC2")); + break; + + // ── Register dump ───────────────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ───────────────────────────────── + case 'r': { + if (line.length() < 3) { Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); break; } + AEAT8800* enc = activeEncoder(); + if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = enc->spiRead(addr); + Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", + g_activeEnc, addr, val, val); + break; + } + + // ── Write single register "w " ────────────────────── + case 'w': { + if (line.length() < 5) { Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); break; } + AEAT8800* enc = activeEncoder(); + if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + enc->spiWrite(addr, val); + uint8_t rb = enc->spiRead(addr); + Serial.printf("[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────────── + case 'u': { + AEAT8800* enc = activeEncoder(); + if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + Serial.printf("[ENC%u SPI] Registers unlocked (0xAB → Lock reg)\n", g_activeEnc); + break; + } + + // ── Set zero position ───────────────────────────────────────────────────── + case 'z': { + AEAT8800* enc = activeEncoder(); + if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } + Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow regs...\n", g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_ZERO_POS_L, 0x00); + enc->spiWrite(REG_ZERO_POS_H, 0x00); + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, + zp == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn guard (must type "burn" exactly) ───────────────────────────────── + case 'b': + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + + // ── Help ────────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // ── External antenna ───────────────────────────────────────────────────────── + // GPIO3 LOW activates the RF switch; GPIO14 HIGH selects the external antenna. + pinMode(WIFI_ENABLE, OUTPUT); + digitalWrite(WIFI_ENABLE, LOW); + delay(100); + pinMode(WIFI_ANT_CONFIG, OUTPUT); + digitalWrite(WIFI_ANT_CONFIG, HIGH); + + // ── Boot setup wizard (blocks until user completes configuration) ───────────── + EncoderConfig cfg1, cfg2; + runSetupWizard(cfg1, cfg2); + + // ── GPIO init for enabled encoders ─────────────────────────────────────────── + if (g_enc1Enabled) initEncoderPins(cfg1); + if (g_enc2Enabled) initEncoderPins(cfg2); + + // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI read + delay(5); + + // ── Instantiate encoder objects ─────────────────────────────────────────────── + if (g_enc1Enabled) + g_enc1 = new AEAT8800(cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); + if (g_enc2Enabled) + g_enc2 = new AEAT8800(cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); + + // ── SPI configuration ──────────────────────────────────────────────────────── + Serial.println(F("╔══════════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Independent | XIAO ESP32-C6 ║")); + Serial.println(F("╠══════════════════════════════════════════════════════════╣")); + + if (g_enc1Enabled) { + Serial.print(F( "║ Configuring ENC1 ... ")); + bool ok = g_enc1->configure(); + Serial.println(ok ? F("OK ║") + : F("FAILED — SSI reads will still be tried ║")); + } + if (g_enc2Enabled) { + Serial.print(F( "║ Configuring ENC2 ... ")); + bool ok = g_enc2->configure(); + Serial.println(ok ? F("OK ║") + : F("FAILED — SSI reads will still be tried ║")); + } + + Serial.println(F("╠══════════════════════════════════════════════════════════╣")); + + // ── Initial SSI position read ───────────────────────────────────────────────── + uint16_t pos1 = 0, pos2 = 0; + bool r1 = false, r2 = false; + readBothEnabled(pos1, pos2, r1, r2); + + if (g_enc1Enabled) { + if (r1) + Serial.printf("║ ENC1 Position : %5u counts (%.4f deg) ║\n", + pos1, (pos1 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC1 Position : READ ERROR ║")); + } + if (g_enc2Enabled) { + if (r2) + Serial.printf("║ ENC2 Position : %5u counts (%.4f deg) ║\n", + pos2, (pos2 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC2 Position : READ ERROR ║")); + } + + Serial.println(F("╠══════════════════════════════════════════════════════════╣")); + Serial.println(F("║ Type 'h' for command help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop ──────────────────────────────────────────────────────────────── + +void loop() { + handleSerial(); + + if (g_streaming && (millis() - g_lastStream >= 100)) { + g_lastStream = millis(); + + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEnabled(pos1, pos2, ok1, ok2); + + if (g_enc1Enabled && g_enc2Enabled) { + float d1 = ok1 ? (pos1 / 65536.0f) * 360.0f : -1.0f; + float d2 = ok2 ? (pos2 / 65536.0f) * 360.0f : -1.0f; + if (ok1 && ok2) Serial.printf("ENC1: %.4f deg | ENC2: %.4f deg\n", d1, d2); + else if (!ok1 && !ok2) Serial.println(F("ENC1: ERR | ENC2: ERR")); + else if (!ok1) Serial.printf("ENC1: ERR | ENC2: %.4f deg\n", d2); + else Serial.printf("ENC1: %.4f deg | ENC2: ERR\n", d1); + } else if (g_enc1Enabled) { + if (ok1) Serial.printf("ENC1: %.4f deg\n", (pos1 / 65536.0f) * 360.0f); + else Serial.println(F("ENC1: ERR")); + } else if (g_enc2Enabled) { + if (ok2) Serial.printf("ENC2: %.4f deg\n", (pos2 / 65536.0f) * 360.0f); + else Serial.println(F("ENC2: ERR")); + } + } +} diff --git a/firmware/dual_aeat8800_star/dual_aeat8800_star.ino b/firmware/dual_aeat8800_star/dual_aeat8800_star.ino new file mode 100644 index 0000000..c0fb79d --- /dev/null +++ b/firmware/dual_aeat8800_star/dual_aeat8800_star.ino @@ -0,0 +1,694 @@ +/** + * ============================================================ + * AEAT-8800-Q24 — Dual 16-bit Absolute Magnetic Encoder + * Star-Topology Clock Wiring (each encoder has dedicated CLK) + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── WHY STAR TOPOLOGY ──────────────────────────────────────── + * SSI protocol does not support multiple slaves on one shared + * clock line. An unclocked slave holds DOUT in high-impedance + * only when its own CLK is idle. Giving each encoder a dedicated + * CLK line means the inactive slave is never clocked, so its + * DOUT stays tri-state and bus contention is eliminated. + * + * ── PIN MAPPING ────────────────────────────────────────────── + * Signal │ Arduino │ GPIO │ Notes + * ────────────────┼─────────┼───────┼──────────────────────── + * CLK1 │ D8 │ 19 │ Encoder 1 dedicated clock + * CLK2 │ D5 │ 23 │ Encoder 2 dedicated clock + * DIN / NSL │ D10 │ 18 │ Shared: SSI enable / SPI MOSI + * DOUT │ D9 │ 20 │ Shared: data from encoders + * SEL1 │ D3 │ 21 │ Encoder 1 SSI_SPI_SEL + * SEL2 │ D4 │ 22 │ Encoder 2 SSI_SPI_SEL + * WIFI_ENABLE │ — │ 3 │ RF switch control (active LOW) + * WIFI_ANT_CONFIG │ — │ 14 │ Antenna select (HIGH = external) + * + * ── DUAL-ENCODER BUS ARBITRATION ───────────────────────────── + * SSI read ENC1 : SEL1=HIGH, SEL2=LOW, clock CLK1 × 20 bits. + * → ENC2 unclocked + SPI/idle → DOUT high-impedance. + * SSI read ENC2 : SEL2=HIGH, SEL1=LOW, clock CLK2 × 20 bits. + * → ENC1 unclocked + SPI/idle → DOUT high-impedance. + * SPI access ENC1: SEL1=LOW (SPI mode), SEL2=HIGH (SSI idle), + * bit-bang on CLK1. CLK2 stays idle — ENC2 DOUT stays quiet. + * SPI access ENC2: SEL2=LOW (SPI mode), SEL1=HIGH (SSI idle), + * bit-bang on CLK2. CLK1 stays idle — ENC1 DOUT stays quiet. + * + * ── SSI FRAME (20 bits, 16-bit resolution) ─────────────────── + * Bits [19:4] = 16-bit absolute position, MSB first + * Bit [3] = Ready (must be 1; retry if 0) + * Bit [2] = MHi (magnet too strong / too close) + * Bit [1] = MLo (magnet too weak / too far) + * Bit [0] = Even parity over all 20 bits + * Data sampled on the FALLING edge of CLK (datasheet p.15). + * + * ── SPI PROTOCOL ───────────────────────────────────────────── + * Write : 0b01_aaaaaa_dddddddd (16 bits, MSB first) + * Read : 0b10_aaaaaa (8-bit cmd) then 8-bit reply + * CLK idles HIGH (CPOL=1); encoder captures DIN on rising CLK (CPHA=1). + * + * ── KEY TIMING (datasheet Fig. 8 & timing table) ──────────────── + * Symbol │ Min │ Unit │ Datasheet description + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time + * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and + * │ │ │ first SCL falling edge + * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock + * │ │ │ period for an SSI read + * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * Notes (datasheet p.15): + * • CLK = 1 when inactive; DIN = 1 when inactive. + * • CLK must be HIGH when switching between SSI and SPI modes. + * • NSL must be held HIGH for at least 3 ms after power-up before + * the first SSI read. + * • The user is advised to read from the SSI falling edge. + * • SSI data length depends on resolution setting: + * 16-bit → 20 total bits (16 pos + Ready + MHi + MLo + Parity) + * All timing margins use SSI_HALF_US = 5 µs (>> all minimum requirements). + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p — Read position from both encoders (SSI, one-shot) + * c — Toggle continuous stream (both encoders, 100 ms) + * 1 / 2 — Select active encoder for SPI commands + * s — Dump all SPI config registers (active encoder) + * r — Read register at hex address e.g. "r 07" + * w — Write register e.g. "w 10 AB" + * u — Unlock config registers (0xAB → Lock reg) + * z — Set zero position = 0x0000 (shadow only) + * burn — Burn shadow regs to OTP ⚠ IRREVERSIBLE + * h — Show this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +// ─── Pin Definitions ────────────────────────────────────────────────────────── +#define PIN_CLK1 D8 // GPIO19 — Encoder 1 dedicated clock +#define PIN_CLK2 D8 // GPIO23 — Encoder 2 dedicated clock +#define PIN_DIN D10 // GPIO18 — Shared DIN / NSL (SSI enable / SPI MOSI) +#define PIN_DOUT D9 // GPIO20 — Shared DOUT (data output from encoders) +#define PIN_SEL1 D3 // GPIO21 — Encoder 1 SSI_SPI_SEL +#define PIN_SEL2 D4 // GPIO22 — Encoder 2 SSI_SPI_SEL +#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) +#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) + +// ─── Register Addresses ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_VCC 0x0A +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Register Values ────────────────────────────────────────────────────────── +#define UNLOCK_KEY 0xAB +#define PROG_KEY 0xA1 +#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V +#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair +#define VAL_CPR1 0x40 // 0x05 CPR1=0b0100, no hysteresis +#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF + +// ─── SSI Timing ─────────────────────────────────────────────────────────────── +// Timing constants derived from AEAT-8800-Q24 datasheet timing table (Fig. 8): +// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL falling edge +// tREQ2 >= 200 ns NSL low time after rising edge of last clock period for an SSI read +// tNSLH >= 200 ns NSL high time between 2 successive SSI reads +// tsw(SEL) >= 1 µs SSI_SPI_SEL switch time +// SSI_HALF_US = 5 µs is used for every CLK half-period and for all +// tREQ / tREQ2 / tNSLH margins, giving 7–25× margin over the minimums +// and matching the clock rate of the proven single-encoder firmware. +// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. +#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity +#define SSI_HALF_US 5 // 5 µs half-period → ~100 kHz SSI clock +#define SSI_MONOFLOP_US 20 // 20 µs monoflop recovery after NSL HIGH + +// ─── AEAT8800 Class ─────────────────────────────────────────────────────────── +// Each instance owns its CLK pin so SSI and SPI operations on enc1 and enc2 +// use completely independent clock lines — no shared-bus arbitration needed. + +class AEAT8800 { +public: + AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) + : _clk(clk), _din(din), _dout(dout), _sel(sel) {} + + /** Assert SEL HIGH → SSI mode. Call only after peer is deselected. */ + void select(); + + /** Assert SEL LOW → SPI/idle mode. Safe to call at any time. */ + void deselect(); + + /** Bit-bang one SPI register read using this encoder's CLK. */ + uint8_t spiRead(uint8_t addr); + + /** Bit-bang one SPI register write using this encoder's CLK. */ + void spiWrite(uint8_t addr, uint8_t data); + + /** Unlock and write all required OTP shadow registers with readback verify. + * Precondition: peer encoder's SEL must be HIGH (SSI idle) before calling + * so its DOUT does not contend the shared bus during SPI readback phases. + * Returns true on success, false if any register readback mismatches. */ + bool configure(); + + /** Perform one 20-bit SSI read. Stores position in `pos` (0–65535). + * Precondition: select() must already have been called. + * Returns false and prints the reason if Ready=0 or parity fails. */ + bool readAngleRaw(uint16_t &pos); + + /** Read angle in degrees [0.0, 360.0). Returns -1.0f on read error. */ + float readAngleDegrees(); + +private: + uint8_t _clk, _din, _dout, _sel; +}; + +// ─── select / deselect ──────────────────────────────────────────────────────── + +void AEAT8800::select() { + // CLK must be HIGH before the SEL transition (datasheet p.15 and p.21: + // "Make sure CLK is high when switching between SSI and SPI modes.") + digitalWrite(_clk, HIGH); + digitalWrite(_sel, HIGH); + delayMicroseconds(1); // tsw(SEL) >= 1 µs +} + +void AEAT8800::deselect() { + digitalWrite(_sel, LOW); + delayMicroseconds(1); // brief settle before next bus activity +} + +// ─── SPI Write ──────────────────────────────────────────────────────────────── + +void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { + int prevSel = digitalRead(_sel); + + // CLK HIGH before SEL edge; drive SEL LOW for SPI mode + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first + uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); + + for (int i = 15; i >= 0; i--) { + digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK falling edge + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns + } + + digitalWrite(_din, HIGH); // release DIN to idle HIGH + digitalWrite(_clk, HIGH); // ensure CLK HIGH before SEL change + digitalWrite(_sel, prevSel); // restore caller's SEL state +} + +// ─── SPI Read ───────────────────────────────────────────────────────────────── + +uint8_t AEAT8800::spiRead(uint8_t addr) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 8-bit command: opcode 0b10 (2b) + addr (6b) + uint8_t cmd = (0b10u << 6) | (addr & 0x3F); + + for (int i = 7; i >= 0; i--) { + digitalWrite(_din, (cmd >> i) & 1u); + digitalWrite(_clk, LOW); + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_din, HIGH); // release DIN; encoder now drives DOUT for reply + + uint8_t result = 0; + for (int i = 0; i < 8; i++) { + digitalWrite(_clk, LOW); // falling edge — encoder shifts DOUT + delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall + digitalWrite(_clk, HIGH); // rising edge — master captures DOUT + result = (result << 1) | (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) + delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns + } + + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + digitalWrite(_sel, prevSel); + return result; +} + +// ─── Configure ──────────────────────────────────────────────────────────────── + +bool AEAT8800::configure() { + // Unlock must be the very first SPI write (datasheet p.10 note 3) + spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); // allow lock state to propagate internally + + struct RegTarget { uint8_t addr, val; const char* name; }; + static const RegTarget targets[] = { + { REG_VCC, VAL_VCC, "0x0A (VCC)" }, + { REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)" }, + { REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)" }, + { REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)" }, + }; + + for (const auto& r : targets) { + spiWrite(r.addr, r.val); + delayMicroseconds(5); // propagation margin before readback + uint8_t rb = spiRead(r.addr); + if (rb != r.val) { + Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", + r.name, r.val, rb); + return false; + } + } + + deselect(); // explicit deselect on exit + return true; +} + +// ─── SSI Read ───────────────────────────────────────────────────────────────── + +bool AEAT8800::readAngleRaw(uint16_t &pos) { + // Precondition: select() already called — SEL is HIGH, encoder in SSI mode + + // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 successive SSI reads + + // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) + digitalWrite(_din, LOW); + delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL falling edge and first SCL falling edge + + uint32_t raw = 0; + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + digitalWrite(_clk, LOW); // SCL falling edge — encoder shifts next bit onto DO + delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet (data stable after CLK fall) + raw = (raw << 1) | (uint32_t)digitalRead(_dout); // sample DO after falling edge (datasheet Fig. 8, p.15) + digitalWrite(_clk, HIGH); // SCL rising edge + delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) + } + + delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising edge of last clock period for an SSI read + + // End of frame: NSL HIGH → load mode (encoder resumes tracking position) + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes internal load cycle + + // Unpack 20-bit frame (datasheet Fig. 8–9) + uint8_t parity = (raw >> 0) & 0x1u; + uint8_t mlo = (raw >> 1) & 0x1u; + uint8_t mhi = (raw >> 2) & 0x1u; + uint8_t ready = (raw >> 3) & 0x1u; + uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); + + (void)parity; // value is implicitly checked via __builtin_popcount below + + if (!ready) { + Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", (unsigned)raw); + return false; + } + + if (mhi) Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); + if (mlo) Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); + + // Even parity: total 1-bit count across all 20 raw bits must be even + if (__builtin_popcount((unsigned)raw) % 2 != 0) { + Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); + return false; + } + + pos = position; + return true; +} + +float AEAT8800::readAngleDegrees() { + uint16_t raw = 0; + if (!readAngleRaw(raw)) return -1.0f; + return (raw / 65536.0f) * 360.0f; +} + +// ─── Global Encoder Instances ───────────────────────────────────────────────── +AEAT8800 enc1(PIN_CLK1, PIN_DIN, PIN_DOUT, PIN_SEL1); +AEAT8800 enc2(PIN_CLK2, PIN_DIN, PIN_DOUT, PIN_SEL2); + +// ─── Global State ───────────────────────────────────────────────────────────── +static bool g_streaming = false; +static uint32_t g_lastStream = 0; +static uint8_t g_activeEnc = 1; // 1 or 2 — target for SPI serial commands + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +/** Return a pointer to the currently selected encoder. */ +static inline AEAT8800* activeEncoder() { + return (g_activeEnc == 1) ? &enc1 : &enc2; +} + +/** Raise the peer's SEL to SSI/idle, isolating its DOUT from the bus. */ +static inline void isolatePeer() { + if (g_activeEnc == 1) { enc2.select(); } else { enc1.select(); } +} + +/** Lower the peer's SEL back to SPI/idle after the transaction. */ +static inline void releasePeer() { + if (g_activeEnc == 1) { enc2.deselect(); } else { enc1.deselect(); } +} + +const char* resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case 0x00: return "10-bit (1024 cpr)"; + case 0x01: return "12-bit (4096 cpr)"; + case 0x02: return "14-bit (16384 cpr)"; + case 0x03: return "16-bit (65536 cpr)"; + default: return "unknown"; + } +} + +// ─── Serial Output Helpers ──────────────────────────────────────────────────── + +void printSinglePosition(uint8_t id, uint16_t pos, bool ok) { + if (ok) { + double deg = (pos / 65536.0) * 360.0; + Serial.printf("[ENC%u] Pos=%5u Angle=%8.4f deg\n", id, pos, deg); + } else { + Serial.printf("[ENC%u] READ ERROR\n", id); + } +} + +void printAllRegisters() { + AEAT8800* enc = activeEncoder(); + + Serial.printf("\n╔══════════════════════════════════════════════╗\n"); + Serial.printf( "║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", g_activeEnc); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_RESOLUTION, "Resolution (0x07)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + isolatePeer(); // peer SEL HIGH → its DOUT tri-state during SPI reads + + for (auto& r : regs) { + uint8_t val = enc->spiRead(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); + } + + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + uint8_t resReg = enc->spiRead(REG_RESOLUTION); + + releasePeer(); + + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf( "║ HW Zero Pos : %5u (%.4f deg) ║\n", + zp, (zp / 65536.0) * 360.0); + Serial.printf( "║ Resolution : %-30s ║\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 DUAL Star-Topology Command Menu ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read both encoders (SSI, one-shot) ║")); + Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); + Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); + Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); + Serial.println(F("║ r — Read register e.g. 'r 07' ║")); + Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); + Serial.println(F("║ u — Unlock config registers ║")); + Serial.println(F("║ z — Set zero position = 0x0000 ║")); + Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Dual SSI Read (used by 'p' command and continuous stream) ──────────────── + +static void readBothEncoders(uint16_t &pos1, uint16_t &pos2, + bool &ok1, bool &ok2) { + // Read ENC1: SEL2 LOW (already), raise SEL1, clock CLK1 + enc2.deselect(); + enc1.select(); + ok1 = enc1.readAngleRaw(pos1); + enc1.deselect(); + + delay(1); // inter-encoder gap; NSL HIGH > tNSLH before next read + + // Read ENC2: SEL1 LOW (already), raise SEL2, clock CLK2 + enc1.deselect(); + enc2.select(); + ok2 = enc2.readAngleRaw(pos2); + enc2.deselect(); +} + +// ─── Serial Command Parser ──────────────────────────────────────────────────── + +void handleSerial() { + if (!Serial.available()) return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + // OTP burn requires the exact string "burn" to prevent accidental triggers + if (line.equalsIgnoreCase("burn")) { + AEAT8800* enc = activeEncoder(); + Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + return; + } + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Read both positions (SSI) ───────────────────────────────────────── + case 'p': { + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEncoders(pos1, pos2, ok1, ok2); + printSinglePosition(1, pos1, ok1); + printSinglePosition(2, pos2, ok2); + break; + } + + // ── Continuous stream toggle ────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Select active encoder for SPI operations ────────────────────────── + case '1': + g_activeEnc = 1; + Serial.println(F("[INFO] Active encoder: ENC1")); + break; + case '2': + g_activeEnc = 2; + Serial.println(F("[INFO] Active encoder: ENC2")); + break; + + // ── Register dump (SPI) ─────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ───────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + isolatePeer(); + uint8_t val = activeEncoder()->spiRead(addr); + releasePeer(); + Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", + g_activeEnc, addr, val, val); + break; + } + + // ── Write single register "w " ────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + activeEncoder()->spiWrite(addr, val); + isolatePeer(); + uint8_t rb = activeEncoder()->spiRead(addr); + releasePeer(); + Serial.printf("[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + activeEncoder()->spiWrite(REG_LOCK, UNLOCK_KEY); + Serial.printf("[ENC%u SPI] Registers unlocked (0xAB written to Lock reg)\n", + g_activeEnc); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + AEAT8800* enc = activeEncoder(); + Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow registers...\n", + g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_ZERO_POS_L, 0x00); + enc->spiWrite(REG_ZERO_POS_H, 0x00); + isolatePeer(); + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + releasePeer(); + uint16_t zp = ((uint16_t)hi << 8) | lo; + Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, + zp == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn guard (user must type "burn" exactly) ──────────────────────── + case 'b': + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // ── External antenna ───────────────────────────────────────────────────── + // GPIO3 LOW activates the RF switch control circuit; GPIO14 HIGH selects + // the external antenna over the built-in ceramic one. + pinMode(WIFI_ENABLE, OUTPUT); + digitalWrite(WIFI_ENABLE, LOW); // activate RF switch control + delay(100); + pinMode(WIFI_ANT_CONFIG, OUTPUT); + digitalWrite(WIFI_ANT_CONFIG, HIGH); // select external antenna + + // ── GPIO init — all bus pins to safe idle states ────────────────────────── + pinMode(PIN_CLK1, OUTPUT); digitalWrite(PIN_CLK1, HIGH); // CLK1 idles HIGH + pinMode(PIN_CLK2, OUTPUT); digitalWrite(PIN_CLK2, HIGH); // CLK2 idles HIGH + pinMode(PIN_DIN, OUTPUT); digitalWrite(PIN_DIN, HIGH); // NSL/DIN idles HIGH + pinMode(PIN_DOUT, INPUT); + pinMode(PIN_SEL1, OUTPUT); digitalWrite(PIN_SEL1, LOW); // SPI/idle mode + pinMode(PIN_SEL2, OUTPUT); digitalWrite(PIN_SEL2, LOW); // SPI/idle mode + + // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI read + delay(5); + + // ── Boot banner ─────────────────────────────────────────────────────────── + Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println(F( "║ AEAT-8800-Q24 DUAL | Star-CLK | XIAO ESP32-C6 ║")); + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + Serial.println(F( "║ CLK1=GPIO19(D8) CLK2=GPIO23(D5) DIN=GPIO18(D10) ║")); + Serial.println(F( "║ DOUT=GPIO20(D9) SEL1=GPIO21(D3) SEL2=GPIO22(D4) ║")); + Serial.println(F( "║ Antenna : External [GPIO3=LOW, GPIO14=HIGH] ║")); + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + + // ── Configure ENC1 ──────────────────────────────────────────────────────── + // Raise SEL2 (ENC2 → SSI/idle) so ENC2's DOUT does not contend the shared + // bus during ENC1's SPI readback transactions. + Serial.print(F( "║ Configuring ENC1 ... ")); + enc2.select(); + delayMicroseconds(1); + bool ok1 = enc1.configure(); // leaves ENC1 SEL LOW on exit + enc2.deselect(); + Serial.println(ok1 ? F("OK ║") + : F("FAILED ║")); + + // ── Configure ENC2 ──────────────────────────────────────────────────────── + Serial.print(F( "║ Configuring ENC2 ... ")); + enc1.select(); + delayMicroseconds(1); + bool ok2 = enc2.configure(); // leaves ENC2 SEL LOW on exit + enc1.deselect(); + Serial.println(ok2 ? F("OK ║") + : F("FAILED ║")); + + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + + // ── Initial position read ───────────────────────────────────────────────── + uint16_t pos1 = 0, pos2 = 0; + bool r1 = false, r2 = false; + readBothEncoders(pos1, pos2, r1, r2); + + if (r1) + Serial.printf( "║ ENC1 Position : %5u counts (%.4f deg) ║\n", + pos1, (pos1 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC1 Position : READ ERROR ║")); + + if (r2) + Serial.printf( "║ ENC2 Position : %5u counts (%.4f deg) ║\n", + pos2, (pos2 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC2 Position : READ ERROR ║")); + + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + Serial.println(F( "║ Type 'h' for command help ║")); + Serial.println(F( "╚══════════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop ──────────────────────────────────────────────────────────────── + +void loop() { + handleSerial(); + + if (g_streaming && (millis() - g_lastStream >= 100)) { + g_lastStream = millis(); + + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEncoders(pos1, pos2, ok1, ok2); + + float deg1 = ok1 ? (pos1 / 65536.0f) * 360.0f : -1.0f; + float deg2 = ok2 ? (pos2 / 65536.0f) * 360.0f : -1.0f; + + if (ok1 && ok2) { + Serial.printf("ENC1: %.4f deg | ENC2: %.4f deg\n", deg1, deg2); + } else if (!ok1 && !ok2) { + Serial.println(F("ENC1: ERR | ENC2: ERR")); + } else if (!ok1) { + Serial.printf("ENC1: ERR | ENC2: %.4f deg\n", deg2); + } else { + Serial.printf("ENC1: %.4f deg | ENC2: ERR\n", deg1); + } + } +} From eb582692a84ccb222c9c9a3134a44c0b83ff13b6 Mon Sep 17 00:00:00 2001 From: Swaraj Date: Mon, 13 Jul 2026 21:42:02 +0530 Subject: [PATCH 3/3] Update .gitignore, README.md, and setup.sh for project enhancements - Removed specific logs directory from .gitignore. - Updated README.md to improve clarity and structure, including detailed project descriptions and usage instructions. - Modified setup.sh to ensure a smoother environment setup process. --- .gitignore | 2 +- Oliver/master/master.ino | 936 ++++---- Oliver/oliver.py | 1118 +++++----- Oliver/oliver_raw.py | 620 +++--- Oliver/slave/slave.ino | 412 ++-- README.md | 274 +-- firmware/16_bit_encoder/16_bit_encoder.ino | 921 ++++---- firmware/16_bit_encoder/test.h | 1166 +++++----- .../dual_aeat8800_independent.ino | 1977 ++++++++++------- .../dual_aeat8800_star/dual_aeat8800_star.ino | 1388 ++++++------ firmware/dual_encoder/dual_encoder.ino | 540 ++--- firmware/master/master.ino | 936 ++++---- firmware/single_encoder/single_encoder.ino | 498 ++--- firmware/slave/slave.ino | 412 ++-- projects/block_height/BLADE_OFFSET_PROBE.py | 652 +++--- projects/block_height/README.md | 368 +-- projects/block_height/README_polynomial.md | 268 +-- .../block_height/block_height_receiver.py | 712 +++--- .../block_height_receiver_polynomial.py | 708 +++--- projects/block_height/calibrate_offline.py | 138 +- setup.sh | 86 +- 21 files changed, 7277 insertions(+), 6855 deletions(-) diff --git a/.gitignore b/.gitignore index ad75bf1..bb117f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -Oliver/logs/ +Oliver/logs/ .venv/ \ No newline at end of file diff --git a/Oliver/master/master.ino b/Oliver/master/master.ino index a792f3b..d0a56af 100644 --- a/Oliver/master/master.ino +++ b/Oliver/master/master.ino @@ -1,469 +1,469 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Oliver Master Gateway - Robust Discovery Edition - * Hardware: XIAO ESP32C6 - * Features: - * - 30s blocking discovery for all 5 slaves - * - Continuous re-discovery for missing slaves - * - BLE command interface for manual re-discovery - * - Detailed status reporting - * Author: Swaraj Dangare - */ - -#define NUM_SLAVES 1 // FIXED: Was 4, now 5 -#define WIFI_CHANNEL 11 // ESP-NOW channel (use 1, 6, or 11 to isolate from other Oliver sets) -#define SERVICE_UUID "6ab88bb9-cf50-4564-b1c4-f53be2abc53f" -#define CHARACTERISTIC_UUID "1d4cd358-172d-4c33-b0b2-ddce9a071aab" -#define COMMAND_UUID "308a0c43-80f0-4b01-81e5-bb2798eb92f9" - -typedef struct __attribute__((packed)) { - uint8_t id; - int value; // Angle * 10000 - uint32_t packetIdx; - uint8_t agc; // AS5047D AGC value (0-255) - uint16_t mag; // AS5047D CORDIC magnitude (14-bit) - uint8_t magl; // Magnetic field too low (0 or 1) - uint8_t magh; // Magnetic field too high (0 or 1) - uint8_t cof; // CORDIC overflow (0 or 1) -} Payload; - -uint8_t slaveMACs[NUM_SLAVES][6]; -bool slaveFound[NUM_SLAVES] = {false}; -Payload slaves[NUM_SLAVES]; -uint32_t gatewayPacketIdx = 0; -uint32_t lastSeenTime[NUM_SLAVES] = {0}; // Track last response time - -BLECharacteristic *pChar; -BLECharacteristic *pCommandChar; -bool pcConnected = false; -bool rediscoverRequested = false; -bool readRequested = false; -bool slaveResponded[NUM_SLAVES] = {false}; - -// ---------------- MASTER ENCODER SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC_REG 0x3FFC -#define MAG_REG 0x3FFD -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 - -const int PIN_CS = D7; -const int PIN_SCK = D1; -const int PIN_MISO = D0; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// Master encoder data -Payload masterData = {255, 0, 0, 0, 0, 0, 0, 0}; // id=255 for master - -// ESP-NOW Receive Callback -void onEspNowRecv(const esp_now_recv_info_t *info, const uint8_t *data, - int len) { - if (len == 1) { // Discovery Response - uint8_t id = data[0]; - if (id < NUM_SLAVES) { - if (!slaveFound[id]) { - memcpy(slaveMACs[id], info->src_addr, 6); - slaveFound[id] = true; - esp_now_peer_info_t peer{}; - memcpy(peer.peer_addr, info->src_addr, 6); - peer.channel = WIFI_CHANNEL; - peer.encrypt = false; - esp_now_add_peer(&peer); - // Safe to print here - quick message - Serial.printf( - "[DISCOVERY] Found Slave %d: %02X:%02X:%02X:%02X:%02X:%02X\n", id, - info->src_addr[0], info->src_addr[1], info->src_addr[2], - info->src_addr[3], info->src_addr[4], info->src_addr[5]); - } - lastSeenTime[id] = millis(); - } - } else if (len == sizeof(Payload)) { // Data Response - Payload p; - memcpy(&p, data, sizeof(p)); - if (p.id < NUM_SLAVES) { - slaves[p.id] = p; - lastSeenTime[p.id] = millis(); - slaveResponded[p.id] = true; - } - } -} - -// ---------------- MASTER ENCODER FUNCTIONS ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read() { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t readRegister(uint16_t addr) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(addr)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result & 0x3FFF; -} - -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -double getUltraPrecisionReading() { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); - } - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - return (finalCounts * 360.0) / 16384.0; -} - -// BLE Callbacks -class ServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer *) { - pcConnected = true; - Serial.println("[BLE] Client Connected"); - } - void onDisconnect(BLEServer *) { - pcConnected = false; - Serial.println("[BLE] Client Disconnected"); - BLEDevice::startAdvertising(); - } -}; - -// Command Handler -class CommandCallbacks : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic *pChar) { - String value = - pChar->getValue().c_str(); // Convert std::string to Arduino String - if (value == "READ") { - readRequested = true; - for (int i = 0; i < NUM_SLAVES; i++) - slaveResponded[i] = false; - } else if (value == "REDISCOVER") { - rediscoverRequested = true; - Serial.println("[CMD] Re-discovery requested from PC"); - } - } -}; - -// Discovery Function -void discoverSlaves(uint32_t timeoutMs) { - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - uint32_t startTime = millis(); - - Serial.printf( - "[DISCOVERY] Starting discovery for %d slaves (timeout: %dms)...\n", - NUM_SLAVES, timeoutMs); - - while (millis() - startTime < timeoutMs) { - // Count found slaves - int foundCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) - foundCount++; - } - - // Exit early if all found - if (foundCount == NUM_SLAVES) { - Serial.println("[DISCOVERY] All slaves found!"); - break; - } - - // Send broadcast - uint8_t ping = 0xFF; - esp_now_send(broadcastAddr, &ping, 1); - - // Print status every 2 seconds - static uint32_t lastPrint = 0; - if (millis() - lastPrint > 2000) { - lastPrint = millis(); - Serial.printf("[DISCOVERY] Progress: %d/%d slaves found | Missing: ", - foundCount, NUM_SLAVES); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - Serial.printf("S%d ", i); - } - Serial.println(); - } - - delay(200); // Broadcast every 200ms (was 500ms) - } - - // Final report - int finalCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) - finalCount++; - } - - Serial.println("\n" + String('=', 50)); - Serial.printf("[DISCOVERY] Complete: %d/%d slaves discovered\n", finalCount, - NUM_SLAVES); - if (finalCount < NUM_SLAVES) { - Serial.print("[WARNING] Missing slaves: "); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - Serial.printf("S%d ", i); - } - Serial.println("\n[INFO] Will retry in background..."); - } - Serial.println(String('=', 50) + "\n"); -} - -void setup() { - Serial.begin(115200); - delay(1000); // Give serial time to initialize - - Serial.println("\n\n=== OLIVER MASTER GATEWAY ==="); - Serial.println("Hardware: XIAO ESP32C6"); - Serial.printf("Firmware: Robust Discovery v2.0\n\n"); - - // WiFi Init - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - Serial.printf("[WIFI] MAC Address: %s\n", WiFi.macAddress().c_str()); - - // Master Encoder SPI Init - pinMode(PIN_CS, OUTPUT); - digitalWrite(PIN_CS, HIGH); - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); - Serial.println("[SPI] Master encoder initialized"); - - // Force WiFi channel - esp_wifi_set_promiscuous(true); - esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); - esp_wifi_set_promiscuous(false); - Serial.printf("[WIFI] Channel %d locked\n", WIFI_CHANNEL); - - // ESP-NOW Init - if (esp_now_init() != ESP_OK) { - Serial.println("[ERROR] ESP-NOW Init Failed!"); - return; - } - esp_now_register_recv_cb(onEspNowRecv); - Serial.println("[ESP-NOW] Initialized"); - - // Add Broadcast Peer - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - esp_now_peer_info_t bcast{}; - memcpy(bcast.peer_addr, broadcastAddr, 6); - bcast.channel = WIFI_CHANNEL; - bcast.encrypt = false; - esp_now_add_peer(&bcast); - Serial.println("[ESP-NOW] Broadcast peer added\n"); - - // Initial Discovery (30 seconds, blocking) - discoverSlaves(30000); - - // BLE Init - Serial.println("[BLE] Initializing..."); - BLEDevice::init("Oliver_3"); - BLEServer *pServer = BLEDevice::createServer(); - pServer->setCallbacks(new ServerCallbacks()); - - BLEService *pService = pServer->createService(SERVICE_UUID); - - // Data characteristic (notify) - pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, - BLECharacteristic::PROPERTY_NOTIFY); - pChar->addDescriptor(new BLE2902()); - - // Command characteristic (write) - pCommandChar = pService->createCharacteristic( - COMMAND_UUID, BLECharacteristic::PROPERTY_WRITE); - pCommandChar->setCallbacks(new CommandCallbacks()); - - pService->start(); - - BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); - pAdvertising->addServiceUUID(SERVICE_UUID); - pAdvertising->setScanResponse(true); - BLEDevice::startAdvertising(); - - Serial.println("[BLE] Advertising as 'Oliver_3'"); - Serial.println("\n=== GATEWAY READY ===\n"); -} - -void loop() { - static uint32_t lastRediscover = 0; - - // Handle manual re-discovery request - if (rediscoverRequested) { - rediscoverRequested = false; - Serial.println("\n[CMD] Manual re-discovery triggered!"); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) { - Serial.printf("[REDISCOVER] Will search for S%d\n", i); - } - } - discoverSlaves(15000); - } - - // Automatic re-discovery every 10 seconds for missing slaves - if (millis() - lastRediscover > 10000) { - lastRediscover = millis(); - int missingCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - missingCount++; - } - - if (missingCount > 0) { - Serial.printf("[AUTO-REDISCOVER] Searching for %d missing slaves...\n", - missingCount); - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - for (int attempt = 0; attempt < 5; attempt++) { - uint8_t ping = 0xFF; - esp_now_send(broadcastAddr, &ping, 1); - delay(200); - } - } - } - - // ── On-demand read: triggered by BLE "READ" command from PC ── - if (readRequested) { - readRequested = false; - gatewayPacketIdx++; - - // 1. Read master's own encoder + diagnostics - double masterAngle = getUltraPrecisionReading(); - masterData.value = (int)(masterAngle * 10000.0); - masterData.packetIdx = gatewayPacketIdx; - - uint16_t diaagc = readRegister(DIAAGC_REG); - uint16_t mag = readRegister(MAG_REG); - masterData.agc = diaagc & 0xFF; - masterData.mag = mag & 0x3FFF; - masterData.magl = (diaagc >> 8) & 0x01; - masterData.magh = (diaagc >> 10) & 0x01; - masterData.cof = (diaagc >> 9) & 0x01; - - // 2. Request data from all discovered slaves - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) { - uint8_t req = i; - esp_now_send(slaveMACs[i], &req, 1); - } - } - - // 3. Wait for slave responses (up to 200ms timeout) - uint32_t waitStart = millis(); - while (millis() - waitStart < 200) { - bool allResponded = true; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && !slaveResponded[i]) { - allResponded = false; - break; - } - } - if (allResponded) - break; - delay(1); - } - - // 4. Build BLE message (same 7-field format) - String bleMsg = String(gatewayPacketIdx); - - bleMsg += "|M0:" + String(masterData.value) + "," + - String(masterData.packetIdx) + "," + - String(masterData.agc) + "," + String(masterData.mag) + "," + - String(masterData.magl) + "," + String(masterData.magh) + "," + - String(masterData.cof); - - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && slaveResponded[i]) { - bleMsg += "|S" + String(i) + ":" + String(slaves[i].value) + "," + - String(slaves[i].packetIdx) + "," + - String(slaves[i].agc) + "," + String(slaves[i].mag) + "," + - String(slaves[i].magl) + "," + String(slaves[i].magh) + "," + - String(slaves[i].cof); - } else { - bleMsg += "|S" + String(i) + ":OFFLINE,0"; - } - } - - // 5. Send BLE notification - if (pcConnected && pChar) { - pChar->setValue(bleMsg.c_str()); - pChar->notify(); - } - - // 6. Serial log - Serial.printf("[READ #%u] M0=%d", gatewayPacketIdx, masterData.value); - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && slaveResponded[i]) - Serial.printf(" | S%d=%d", i, slaves[i].value); - else - Serial.printf(" | S%d=OFFLINE", i); - } - Serial.println(); - } - - delay(1); +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Oliver Master Gateway - Robust Discovery Edition + * Hardware: XIAO ESP32C6 + * Features: + * - 30s blocking discovery for all 5 slaves + * - Continuous re-discovery for missing slaves + * - BLE command interface for manual re-discovery + * - Detailed status reporting + * Author: Swaraj Dangare + */ + +#define NUM_SLAVES 1 // FIXED: Was 4, now 5 +#define WIFI_CHANNEL 11 // ESP-NOW channel (use 1, 6, or 11 to isolate from other Oliver sets) +#define SERVICE_UUID "6ab88bb9-cf50-4564-b1c4-f53be2abc53f" +#define CHARACTERISTIC_UUID "1d4cd358-172d-4c33-b0b2-ddce9a071aab" +#define COMMAND_UUID "308a0c43-80f0-4b01-81e5-bb2798eb92f9" + +typedef struct __attribute__((packed)) { + uint8_t id; + int value; // Angle * 10000 + uint32_t packetIdx; + uint8_t agc; // AS5047D AGC value (0-255) + uint16_t mag; // AS5047D CORDIC magnitude (14-bit) + uint8_t magl; // Magnetic field too low (0 or 1) + uint8_t magh; // Magnetic field too high (0 or 1) + uint8_t cof; // CORDIC overflow (0 or 1) +} Payload; + +uint8_t slaveMACs[NUM_SLAVES][6]; +bool slaveFound[NUM_SLAVES] = {false}; +Payload slaves[NUM_SLAVES]; +uint32_t gatewayPacketIdx = 0; +uint32_t lastSeenTime[NUM_SLAVES] = {0}; // Track last response time + +BLECharacteristic *pChar; +BLECharacteristic *pCommandChar; +bool pcConnected = false; +bool rediscoverRequested = false; +bool readRequested = false; +bool slaveResponded[NUM_SLAVES] = {false}; + +// ---------------- MASTER ENCODER SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC_REG 0x3FFC +#define MAG_REG 0x3FFD +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 + +const int PIN_CS = D7; +const int PIN_SCK = D1; +const int PIN_MISO = D0; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// Master encoder data +Payload masterData = {255, 0, 0, 0, 0, 0, 0, 0}; // id=255 for master + +// ESP-NOW Receive Callback +void onEspNowRecv(const esp_now_recv_info_t *info, const uint8_t *data, + int len) { + if (len == 1) { // Discovery Response + uint8_t id = data[0]; + if (id < NUM_SLAVES) { + if (!slaveFound[id]) { + memcpy(slaveMACs[id], info->src_addr, 6); + slaveFound[id] = true; + esp_now_peer_info_t peer{}; + memcpy(peer.peer_addr, info->src_addr, 6); + peer.channel = WIFI_CHANNEL; + peer.encrypt = false; + esp_now_add_peer(&peer); + // Safe to print here - quick message + Serial.printf( + "[DISCOVERY] Found Slave %d: %02X:%02X:%02X:%02X:%02X:%02X\n", id, + info->src_addr[0], info->src_addr[1], info->src_addr[2], + info->src_addr[3], info->src_addr[4], info->src_addr[5]); + } + lastSeenTime[id] = millis(); + } + } else if (len == sizeof(Payload)) { // Data Response + Payload p; + memcpy(&p, data, sizeof(p)); + if (p.id < NUM_SLAVES) { + slaves[p.id] = p; + lastSeenTime[p.id] = millis(); + slaveResponded[p.id] = true; + } + } +} + +// ---------------- MASTER ENCODER FUNCTIONS ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read() { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t readRegister(uint16_t addr) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(addr)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result & 0x3FFF; +} + +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); + } + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + return (finalCounts * 360.0) / 16384.0; +} + +// BLE Callbacks +class ServerCallbacks : public BLEServerCallbacks { + void onConnect(BLEServer *) { + pcConnected = true; + Serial.println("[BLE] Client Connected"); + } + void onDisconnect(BLEServer *) { + pcConnected = false; + Serial.println("[BLE] Client Disconnected"); + BLEDevice::startAdvertising(); + } +}; + +// Command Handler +class CommandCallbacks : public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pChar) { + String value = + pChar->getValue().c_str(); // Convert std::string to Arduino String + if (value == "READ") { + readRequested = true; + for (int i = 0; i < NUM_SLAVES; i++) + slaveResponded[i] = false; + } else if (value == "REDISCOVER") { + rediscoverRequested = true; + Serial.println("[CMD] Re-discovery requested from PC"); + } + } +}; + +// Discovery Function +void discoverSlaves(uint32_t timeoutMs) { + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + uint32_t startTime = millis(); + + Serial.printf( + "[DISCOVERY] Starting discovery for %d slaves (timeout: %dms)...\n", + NUM_SLAVES, timeoutMs); + + while (millis() - startTime < timeoutMs) { + // Count found slaves + int foundCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) + foundCount++; + } + + // Exit early if all found + if (foundCount == NUM_SLAVES) { + Serial.println("[DISCOVERY] All slaves found!"); + break; + } + + // Send broadcast + uint8_t ping = 0xFF; + esp_now_send(broadcastAddr, &ping, 1); + + // Print status every 2 seconds + static uint32_t lastPrint = 0; + if (millis() - lastPrint > 2000) { + lastPrint = millis(); + Serial.printf("[DISCOVERY] Progress: %d/%d slaves found | Missing: ", + foundCount, NUM_SLAVES); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + Serial.printf("S%d ", i); + } + Serial.println(); + } + + delay(200); // Broadcast every 200ms (was 500ms) + } + + // Final report + int finalCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) + finalCount++; + } + + Serial.println("\n" + String('=', 50)); + Serial.printf("[DISCOVERY] Complete: %d/%d slaves discovered\n", finalCount, + NUM_SLAVES); + if (finalCount < NUM_SLAVES) { + Serial.print("[WARNING] Missing slaves: "); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + Serial.printf("S%d ", i); + } + Serial.println("\n[INFO] Will retry in background..."); + } + Serial.println(String('=', 50) + "\n"); +} + +void setup() { + Serial.begin(115200); + delay(1000); // Give serial time to initialize + + Serial.println("\n\n=== OLIVER MASTER GATEWAY ==="); + Serial.println("Hardware: XIAO ESP32C6"); + Serial.printf("Firmware: Robust Discovery v2.0\n\n"); + + // WiFi Init + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + Serial.printf("[WIFI] MAC Address: %s\n", WiFi.macAddress().c_str()); + + // Master Encoder SPI Init + pinMode(PIN_CS, OUTPUT); + digitalWrite(PIN_CS, HIGH); + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + Serial.println("[SPI] Master encoder initialized"); + + // Force WiFi channel + esp_wifi_set_promiscuous(true); + esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); + esp_wifi_set_promiscuous(false); + Serial.printf("[WIFI] Channel %d locked\n", WIFI_CHANNEL); + + // ESP-NOW Init + if (esp_now_init() != ESP_OK) { + Serial.println("[ERROR] ESP-NOW Init Failed!"); + return; + } + esp_now_register_recv_cb(onEspNowRecv); + Serial.println("[ESP-NOW] Initialized"); + + // Add Broadcast Peer + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_peer_info_t bcast{}; + memcpy(bcast.peer_addr, broadcastAddr, 6); + bcast.channel = WIFI_CHANNEL; + bcast.encrypt = false; + esp_now_add_peer(&bcast); + Serial.println("[ESP-NOW] Broadcast peer added\n"); + + // Initial Discovery (30 seconds, blocking) + discoverSlaves(30000); + + // BLE Init + Serial.println("[BLE] Initializing..."); + BLEDevice::init("Oliver_3"); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new ServerCallbacks()); + + BLEService *pService = pServer->createService(SERVICE_UUID); + + // Data characteristic (notify) + pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_NOTIFY); + pChar->addDescriptor(new BLE2902()); + + // Command characteristic (write) + pCommandChar = pService->createCharacteristic( + COMMAND_UUID, BLECharacteristic::PROPERTY_WRITE); + pCommandChar->setCallbacks(new CommandCallbacks()); + + pService->start(); + + BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(SERVICE_UUID); + pAdvertising->setScanResponse(true); + BLEDevice::startAdvertising(); + + Serial.println("[BLE] Advertising as 'Oliver_3'"); + Serial.println("\n=== GATEWAY READY ===\n"); +} + +void loop() { + static uint32_t lastRediscover = 0; + + // Handle manual re-discovery request + if (rediscoverRequested) { + rediscoverRequested = false; + Serial.println("\n[CMD] Manual re-discovery triggered!"); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) { + Serial.printf("[REDISCOVER] Will search for S%d\n", i); + } + } + discoverSlaves(15000); + } + + // Automatic re-discovery every 10 seconds for missing slaves + if (millis() - lastRediscover > 10000) { + lastRediscover = millis(); + int missingCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + missingCount++; + } + + if (missingCount > 0) { + Serial.printf("[AUTO-REDISCOVER] Searching for %d missing slaves...\n", + missingCount); + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + for (int attempt = 0; attempt < 5; attempt++) { + uint8_t ping = 0xFF; + esp_now_send(broadcastAddr, &ping, 1); + delay(200); + } + } + } + + // ── On-demand read: triggered by BLE "READ" command from PC ── + if (readRequested) { + readRequested = false; + gatewayPacketIdx++; + + // 1. Read master's own encoder + diagnostics + double masterAngle = getUltraPrecisionReading(); + masterData.value = (int)(masterAngle * 10000.0); + masterData.packetIdx = gatewayPacketIdx; + + uint16_t diaagc = readRegister(DIAAGC_REG); + uint16_t mag = readRegister(MAG_REG); + masterData.agc = diaagc & 0xFF; + masterData.mag = mag & 0x3FFF; + masterData.magl = (diaagc >> 8) & 0x01; + masterData.magh = (diaagc >> 10) & 0x01; + masterData.cof = (diaagc >> 9) & 0x01; + + // 2. Request data from all discovered slaves + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) { + uint8_t req = i; + esp_now_send(slaveMACs[i], &req, 1); + } + } + + // 3. Wait for slave responses (up to 200ms timeout) + uint32_t waitStart = millis(); + while (millis() - waitStart < 200) { + bool allResponded = true; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && !slaveResponded[i]) { + allResponded = false; + break; + } + } + if (allResponded) + break; + delay(1); + } + + // 4. Build BLE message (same 7-field format) + String bleMsg = String(gatewayPacketIdx); + + bleMsg += "|M0:" + String(masterData.value) + "," + + String(masterData.packetIdx) + "," + + String(masterData.agc) + "," + String(masterData.mag) + "," + + String(masterData.magl) + "," + String(masterData.magh) + "," + + String(masterData.cof); + + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && slaveResponded[i]) { + bleMsg += "|S" + String(i) + ":" + String(slaves[i].value) + "," + + String(slaves[i].packetIdx) + "," + + String(slaves[i].agc) + "," + String(slaves[i].mag) + "," + + String(slaves[i].magl) + "," + String(slaves[i].magh) + "," + + String(slaves[i].cof); + } else { + bleMsg += "|S" + String(i) + ":OFFLINE,0"; + } + } + + // 5. Send BLE notification + if (pcConnected && pChar) { + pChar->setValue(bleMsg.c_str()); + pChar->notify(); + } + + // 6. Serial log + Serial.printf("[READ #%u] M0=%d", gatewayPacketIdx, masterData.value); + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && slaveResponded[i]) + Serial.printf(" | S%d=%d", i, slaves[i].value); + else + Serial.printf(" | S%d=OFFLINE", i); + } + Serial.println(); + } + + delay(1); } \ No newline at end of file diff --git a/Oliver/oliver.py b/Oliver/oliver.py index 0259659..c311d1a 100644 --- a/Oliver/oliver.py +++ b/Oliver/oliver.py @@ -1,559 +1,559 @@ -""" -Oliver Encoder API -================== -Clean async API for reading encoder values from the Oliver BLE gateway. - -Usage: - import asyncio - from blade_offset_probe import OliverAPI - - async def main(): - probe = OliverAPI() - await probe.connect() - - # Request a fresh encoder reading on-demand; (M0_deg, S0_deg) - m0, s0 = await probe.get_instantaneous_encoder_values() - - # Take a precision measurement (collects 5 samples); returns (M0_median, S0_median) - m0_med, s0_med = await probe.get_encoder_values() - - # Set current position as zero reference - probe.set_zero() - - # Take another measurement (now relative to zero) - result = await probe.measure() - - # Disconnect cleanly - await probe.disconnect() - - asyncio.run(main()) - -Author: Swaraj Dangare -""" - -import asyncio -import time -import logging -import numpy as np -from dataclasses import dataclass, field -from typing import Optional -from bleak import BleakClient, BleakScanner - -# Set False to disable all prints and debug/info logging for the entire file. -VERBOSE = True - -# ── Logging ────────────────────────────────────────────────────────────────── -logger = logging.getLogger("oliver") -logger.setLevel(logging.DEBUG if VERBOSE else logging.WARNING) - -# ── BLE identifiers ───────────────────────────────────────────────────────── -DEVICE_NAME = "Oliver_3" -CHARACTERISTIC_UUID = "1d4cd358-172d-4c33-b0b2-ddce9a071aab" -COMMAND_UUID = "308a0c43-80f0-4b01-81e5-bb2798eb92f9" - -ENCODERS = ("M0", "S0") -SCAN_TIMEOUT_S = 15.0 -MEASURE_TIMEOUT_S = 30.0 -SAMPLES_PER_MEASUREMENT = 5 -REACH_MM = 183.0 # lever arm for µm precision calc - - -# ── Data classes ───────────────────────────────────────────────────────────── -@dataclass -class EncoderReading: - """Single encoder snapshot.""" - name: str - angle_deg: float - raw_angle_deg: float - pkt: int = 0 - agc: int = 0 - mag: int = 0 - status: str = "OK" - - -@dataclass -class MeasurementResult: - """Result of a multi-sample precision measurement.""" - measurement_id: int - encoders: dict = field(default_factory=dict) - timestamp: float = 0.0 - - # Per-encoder nested data - # encoders = { - # "M0": {"samples": [...], "median": float, "jitter": float, "precision_um": float, "status": str}, - # "S0": { ... }, - # } - - -# ── Packet parser ──────────────────────────────────────────────────────────── -def _parse_encoder_field(part: str, gateway_idx: int) -> tuple[str, Optional[tuple[float, dict]]]: - """ - Parse a single encoder field from the BLE payload. - Format: 'XX:angle,pkt[,agc,mag,magl,magh,cof]' - Returns (name, None) for OFFLINE encoders. - Returns (name, (angle_deg, metadata_dict)) on success. - """ - name_str, data = part.split(":") - fields = data.split(",") - - if fields[0] == "OFFLINE": - return name_str, None - - angle = float(fields[0]) / 10000.0 - pkt = int(fields[1]) if len(fields) > 1 else 0 - - if len(fields) >= 7: - agc, mag = int(fields[2]), int(fields[3]) - magl, magh, cof = fields[4], fields[5], fields[6] - else: - agc, mag, magl, magh, cof = 0, 0, "0", "0", "0" - - status = "OK" - if cof == "1": - status = "CORDIC_ERR" - elif magl == "1": - status = "FIELD_LOW" - elif magh == "1": - status = "FIELD_HIGH" - - meta = { - "g_idx": gateway_idx, "pkt": pkt, "agc": agc, "mag": mag, - "magl": magl, "magh": magh, "cof": cof, "status": status, - } - return name_str, (angle, meta) - - -# ── Main API class ─────────────────────────────────────────────────────────── -class OliverAPI: - """ - Async API for the Oliver BLE encoder gateway. - - All public methods are safe to call from any async context. - The object manages its own BLE connection lifecycle. - """ - - def __init__(self): - # Connection state - self._client: Optional[BleakClient] = None - self._device = None - self._connected = False - - # Live encoder data (updated on every BLE notification) - self._latest_raw: dict[str, Optional[float]] = {e: None for e in ENCODERS} - self._latest_meta: dict[str, dict] = {e: {} for e in ENCODERS} - self._last_gateway_idx = -1 - self._missed_packets = 0 - self._last_notify_time: float = 0.0 - - # Notification event (set on every _on_notify, used for on-demand reads) - self._notify_received: asyncio.Event = asyncio.Event() - - # Zero offsets - self._zero_offsets: dict[str, float] = {e: 0.0 for e in ENCODERS} - - # Measurement collection state - self._measurement_id = 0 - self._collecting = False - self._collect_samples: dict[str, list[float]] = {e: [] for e in ENCODERS} - self._collect_meta: dict[str, list[dict]] = {e: [] for e in ENCODERS} - self._collect_done: Optional[asyncio.Event] = None - - # Timing (seconds) of last connect and last get_encoder_values / get_instantaneous call - self._last_connect_time_s: float = 0.0 - self._last_get_encoder_values_time_s: float = 0.0 - self._last_get_instantaneous_encoder_values_time_s: float = 0.0 - - # ── Properties ─────────────────────────────────────────────────────── - - @property - def is_connected(self) -> bool: - """True when BLE link is active.""" - return self._connected and self._client is not None and self._client.is_connected - - @property - def missed_packets(self) -> int: - return self._missed_packets - - @property - def last_gateway_idx(self) -> int: - return self._last_gateway_idx - - @property - def last_connect_time_s(self) -> float: - """Time in seconds taken by the last connect() (or reconnect()) that did a full connect.""" - return self._last_connect_time_s - - @property - def last_get_encoder_values_time_s(self) -> float: - """Time in seconds taken by the last get_encoder_values() call from start to return.""" - return self._last_get_encoder_values_time_s - - @property - def last_get_instantaneous_encoder_values_time_s(self) -> float: - """Time in seconds taken by the last get_instantaneous_encoder_values() call from start to return.""" - return self._last_get_instantaneous_encoder_values_time_s - - # ── Connect / Disconnect / Reconnect ───────────────────────────────── - - async def connect(self, timeout: float = SCAN_TIMEOUT_S) -> bool: - """ - Scan for the gateway and connect. - Returns True on success, False if the device was not found. - """ - if self.is_connected: - logger.info("Already connected.") - return True - - t0 = time.perf_counter() - logger.info("Scanning for %s …", DEVICE_NAME) - self._device = await BleakScanner.find_device_by_filter( - lambda d, _ad: d.name == DEVICE_NAME, timeout=timeout, - ) - if self._device is None: - logger.error("Gateway not found (scanned for %.0fs).", timeout) - return False - - logger.info("Found %s (%s). Connecting …", DEVICE_NAME, self._device.address) - self._client = BleakClient(self._device, disconnected_callback=self._on_disconnect) - await self._client.connect() - await self._client.start_notify(CHARACTERISTIC_UUID, self._on_notify) - self._connected = True - self._last_connect_time_s = time.perf_counter() - t0 - logger.info("Connected to %s (%.2f s).", DEVICE_NAME, self._last_connect_time_s) - return True - - async def disconnect(self): - """Cleanly close the BLE connection.""" - if self._client is not None: - try: - await self._client.disconnect() - except Exception: - pass - self._connected = False - logger.info("Disconnected.") - - async def reconnect(self, timeout: float = SCAN_TIMEOUT_S) -> bool: - """ - Drop existing connection (if any) and reconnect from scratch. - Returns True on success. - """ - logger.info("Reconnecting …") - await self.disconnect() - await asyncio.sleep(1.0) # give BLE stack time to clean up - return await self.connect(timeout=timeout) - - def _on_disconnect(self, _client): - self._connected = False - logger.warning("BLE disconnected unexpectedly.") - - # ── Live encoder values ────────────────────────────────────────────── - - async def get_instantaneous_encoder_values(self) -> tuple[Optional[float], Optional[float]]: - """ - Request a fresh encoder reading from the gateway and return - (M0, S0) angles in degrees (zero-adjusted). - - Sends a "READ" command and waits for the notification response. - If not connected to BLE, reconnects first. Returns (None, None) if reconnect fails. - """ - t0 = time.perf_counter() - if not self.is_connected: - ok = await self.reconnect() - if not ok: - self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 - return (None, None) - - self._notify_received.clear() - await self.send_command("READ") - try: - await asyncio.wait_for(self._notify_received.wait(), timeout=5.0) - except asyncio.TimeoutError: - logger.warning("READ response timed out.") - self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 - return (None, None) - - m0_raw = self._latest_raw["M0"] - s0_raw = self._latest_raw["S0"] - m0 = (m0_raw - self._zero_offsets["M0"]) if m0_raw is not None else None - s0 = (s0_raw - self._zero_offsets["S0"]) if s0_raw is not None else None - self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 - return (m0, s0) - - # ── Precision measurement ──────────────────────────────────────────── - - async def get_encoder_values( - self, - num_samples: int = SAMPLES_PER_MEASUREMENT, - timeout: float = MEASURE_TIMEOUT_S, - ) -> tuple[Optional[float], Optional[float]]: - """ - Collect *num_samples* on-demand readings from every encoder, - compute medians, and return (M0_median_deg, S0_median_deg). - - Sends a "READ" command for each sample and waits for the response. - If not connected to BLE, reconnects first. Returns (None, None) if reconnect fails. - Raises TimeoutError if samples are not received in time. - """ - t0 = time.perf_counter() - if not self.is_connected: - ok = await self.reconnect() - if not ok: - self._last_get_encoder_values_time_s = time.perf_counter() - t0 - return (None, None) - - self._measurement_id += 1 - mid = self._measurement_id - - # Prepare collection buffers - self._collect_samples = {e: [] for e in ENCODERS} - self._collect_meta = {e: [] for e in ENCODERS} - self._collecting = True - per_sample_timeout = timeout / num_samples - - logger.info("Measurement #%d: collecting %d samples …", mid, num_samples) - - try: - for i in range(num_samples): - self._notify_received.clear() - await self.send_command("READ") - try: - await asyncio.wait_for(self._notify_received.wait(), timeout=per_sample_timeout) - except asyncio.TimeoutError: - self._collecting = False - self._last_get_encoder_values_time_s = time.perf_counter() - t0 - raise TimeoutError( - f"Measurement #{mid} timed out at sample {i+1}/{num_samples} " - f"after {time.perf_counter() - t0:.1f}s." - ) - finally: - self._collecting = False - - # Build result - result = MeasurementResult(measurement_id=mid, timestamp=time.time()) - for enc in ENCODERS: - samples = self._collect_samples[enc] - enc_data: dict = {"samples": samples, "count": len(samples)} - - if len(samples) >= 1: - median = float(np.median(samples)) - jitter = (max(samples) - min(samples)) if len(samples) >= 2 else 0.0 - precision_um = REACH_MM * (jitter * np.pi / 180.0) * 1000.0 - enc_data.update(median=median, jitter=jitter, precision_um=precision_um) - else: - enc_data.update(median=None, jitter=None, precision_um=None) - - # Attach last known status - metas = self._collect_meta[enc] - enc_data["status"] = metas[-1].get("status", "OK") if metas else "NO_DATA" - result.encoders[enc] = enc_data - - self._last_get_encoder_values_time_s = time.perf_counter() - t0 - logger.info("Measurement #%d complete (%.2f s).", mid, self._last_get_encoder_values_time_s) - m0_median = result.encoders["M0"].get("median") - s0_median = result.encoders["S0"].get("median") - return (m0_median, s0_median) - - # ── Zero reference ─────────────────────────────────────────────────── - - def set_zero(self) -> dict[str, float]: - """ - Capture the current raw angles as the zero reference. - All subsequent get_encoder_values() and measure() calls will be - relative to this position. - - Returns a dict of the offsets that were applied, e.g.: - {"M0": 166.990, "S0": 125.395} - - Raises RuntimeError if no data has been received yet. - """ - applied: dict[str, float] = {} - for enc in ENCODERS: - raw = self._latest_raw[enc] - if raw is not None: - self._zero_offsets[enc] = raw - applied[enc] = raw - - if not applied: - raise RuntimeError("No encoder data received yet — cannot set zero.") - - logger.info("Zero set: %s", {k: f"{v:.5f}°" for k, v in applied.items()}) - return applied - - def clear_zero(self): - """Remove any zero offset (revert to absolute angles).""" - self._zero_offsets = {e: 0.0 for e in ENCODERS} - logger.info("Zero offsets cleared.") - - # ── Send BLE command to gateway ────────────────────────────────────── - - async def send_command(self, cmd: str) -> bool: - """ - Send an arbitrary string command to the gateway's command characteristic. - Returns True on success. - """ - if not self.is_connected: - raise RuntimeError("Not connected.") - try: - await self._client.write_gatt_char(COMMAND_UUID, cmd.encode()) - logger.info("Sent command: %s", cmd) - return True - except Exception as exc: - logger.error("Command failed: %s", exc) - return False - - # ── Internal BLE notification handler ──────────────────────────────── - - def _on_notify(self, _sender, data: bytearray): - """Called by bleak on every BLE notification.""" - try: - payload = data.decode() - parts = payload.split("|") - g_idx = int(parts[0]) - - # Track missed packets - if self._last_gateway_idx != -1 and g_idx - self._last_gateway_idx > 1: - self._missed_packets += g_idx - self._last_gateway_idx - 1 - self._last_gateway_idx = g_idx - self._last_notify_time = time.time() - - # ── Parse Master (M0) ── - _, m_result = _parse_encoder_field(parts[1], g_idx) - if m_result is not None: - raw_ang, meta = m_result - self._latest_raw["M0"] = raw_ang - self._latest_meta["M0"] = meta - - # ── Parse Slave (S0) ── - s_result = None - if len(parts) > 2: - _, s_result = _parse_encoder_field(parts[2], g_idx) - if s_result is not None: - raw_ang, meta = s_result - self._latest_raw["S0"] = raw_ang - self._latest_meta["S0"] = meta - - # ── Collecting samples for a measurement? ── - if self._collecting: - for enc, result in [("M0", m_result), ("S0", s_result)]: - if result is None: - continue - raw_ang, meta = result - adj = raw_ang - self._zero_offsets[enc] - if enc == "M0" and meta["status"] == "OK": - meta["status"] = "MASTER" - self._collect_samples[enc].append(adj) - self._collect_meta[enc].append(meta) - - # Signal that a notification was received - self._notify_received.set() - - except Exception as exc: - logger.debug("Parse error: %s | payload=%s", exc, data) - - -# ── Convenience: run interactively if executed directly ────────────────────── -async def _interactive_demo(): - """Quick interactive session for testing.""" - logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(name)s] %(message)s") - - probe = OliverAPI() - ok = await probe.connect() - if not ok: - if VERBOSE: - print("✗ Could not find gateway.") - return - - if VERBOSE: - print("\n" + "=" * 70) - print(" Oliver API — Interactive Demo") - print(" Commands: Enter = measure | z = set zero | v = instantaneous") - print(" c = connect | d = disconnect | r = reconnect | q = quit") - print("=" * 70 + "\n") - - import sys, select - - try: - if sys.platform != "win32": - import tty, termios - old_settings = termios.tcgetattr(sys.stdin) - tty.setcbreak(sys.stdin.fileno()) - else: - old_settings = None - - while True: - # Non-blocking key check - if sys.platform != "win32" and select.select([sys.stdin], [], [], 0)[0]: - key = sys.stdin.read(1) - else: - key = None - - if key: - if key.lower() == "q": - break - - elif key.lower() == "z": - try: - offsets = probe.set_zero() - if VERBOSE: - print(f"✓ Zero set: {offsets}") - except RuntimeError as e: - if VERBOSE: - print(f"✗ {e}") - - elif key.lower() == "c": - ok = await probe.connect() - if VERBOSE: - print("✓ Connected." if ok else "✗ Connect failed.") - - elif key.lower() == "d": - await probe.disconnect() - if VERBOSE: - print("✓ Disconnected.") - - elif key.lower() == "r": - ok = await probe.reconnect() - if VERBOSE: - print("✓ Reconnected." if ok else "✗ Reconnect failed.") - - elif key == "\n": - try: - m0_med, s0_med = await probe.get_encoder_values() - if VERBOSE: - print(f"\n{'=' * 80}") - print(" Measurement (M0_median, S0_median)") - print(f"{'=' * 80}") - if m0_med is not None: - print(f" M0 {m0_med:12.5f}°") - else: - print(" M0 no data") - if s0_med is not None: - print(f" S0 {s0_med:12.5f}°") - else: - print(" S0 no data") - print(f"{'=' * 80}\n") - except TimeoutError as e: - if VERBOSE: - print(f"✗ {e}") - - elif key == "v": - m0, s0 = await probe.get_instantaneous_encoder_values() - if VERBOSE: - print(f" M0: {m0:.5f}°" if m0 is not None else " M0: no data") - print(f" S0: {s0:.5f}°" if s0 is not None else " S0: no data") - print(f" (%.3f s)" % probe.last_get_instantaneous_encoder_values_time_s) - - await asyncio.sleep(0.1) - - except KeyboardInterrupt: - pass - finally: - if sys.platform != "win32" and old_settings: - import termios - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings) - await probe.disconnect() - if VERBOSE: - print("\nDone.") - - -if __name__ == "__main__": - asyncio.run(_interactive_demo()) +""" +Oliver Encoder API +================== +Clean async API for reading encoder values from the Oliver BLE gateway. + +Usage: + import asyncio + from blade_offset_probe import OliverAPI + + async def main(): + probe = OliverAPI() + await probe.connect() + + # Request a fresh encoder reading on-demand; (M0_deg, S0_deg) + m0, s0 = await probe.get_instantaneous_encoder_values() + + # Take a precision measurement (collects 5 samples); returns (M0_median, S0_median) + m0_med, s0_med = await probe.get_encoder_values() + + # Set current position as zero reference + probe.set_zero() + + # Take another measurement (now relative to zero) + result = await probe.measure() + + # Disconnect cleanly + await probe.disconnect() + + asyncio.run(main()) + +Author: Swaraj Dangare +""" + +import asyncio +import time +import logging +import numpy as np +from dataclasses import dataclass, field +from typing import Optional +from bleak import BleakClient, BleakScanner + +# Set False to disable all prints and debug/info logging for the entire file. +VERBOSE = True + +# ── Logging ────────────────────────────────────────────────────────────────── +logger = logging.getLogger("oliver") +logger.setLevel(logging.DEBUG if VERBOSE else logging.WARNING) + +# ── BLE identifiers ───────────────────────────────────────────────────────── +DEVICE_NAME = "Oliver_3" +CHARACTERISTIC_UUID = "1d4cd358-172d-4c33-b0b2-ddce9a071aab" +COMMAND_UUID = "308a0c43-80f0-4b01-81e5-bb2798eb92f9" + +ENCODERS = ("M0", "S0") +SCAN_TIMEOUT_S = 15.0 +MEASURE_TIMEOUT_S = 30.0 +SAMPLES_PER_MEASUREMENT = 5 +REACH_MM = 183.0 # lever arm for µm precision calc + + +# ── Data classes ───────────────────────────────────────────────────────────── +@dataclass +class EncoderReading: + """Single encoder snapshot.""" + name: str + angle_deg: float + raw_angle_deg: float + pkt: int = 0 + agc: int = 0 + mag: int = 0 + status: str = "OK" + + +@dataclass +class MeasurementResult: + """Result of a multi-sample precision measurement.""" + measurement_id: int + encoders: dict = field(default_factory=dict) + timestamp: float = 0.0 + + # Per-encoder nested data + # encoders = { + # "M0": {"samples": [...], "median": float, "jitter": float, "precision_um": float, "status": str}, + # "S0": { ... }, + # } + + +# ── Packet parser ──────────────────────────────────────────────────────────── +def _parse_encoder_field(part: str, gateway_idx: int) -> tuple[str, Optional[tuple[float, dict]]]: + """ + Parse a single encoder field from the BLE payload. + Format: 'XX:angle,pkt[,agc,mag,magl,magh,cof]' + Returns (name, None) for OFFLINE encoders. + Returns (name, (angle_deg, metadata_dict)) on success. + """ + name_str, data = part.split(":") + fields = data.split(",") + + if fields[0] == "OFFLINE": + return name_str, None + + angle = float(fields[0]) / 10000.0 + pkt = int(fields[1]) if len(fields) > 1 else 0 + + if len(fields) >= 7: + agc, mag = int(fields[2]), int(fields[3]) + magl, magh, cof = fields[4], fields[5], fields[6] + else: + agc, mag, magl, magh, cof = 0, 0, "0", "0", "0" + + status = "OK" + if cof == "1": + status = "CORDIC_ERR" + elif magl == "1": + status = "FIELD_LOW" + elif magh == "1": + status = "FIELD_HIGH" + + meta = { + "g_idx": gateway_idx, "pkt": pkt, "agc": agc, "mag": mag, + "magl": magl, "magh": magh, "cof": cof, "status": status, + } + return name_str, (angle, meta) + + +# ── Main API class ─────────────────────────────────────────────────────────── +class OliverAPI: + """ + Async API for the Oliver BLE encoder gateway. + + All public methods are safe to call from any async context. + The object manages its own BLE connection lifecycle. + """ + + def __init__(self): + # Connection state + self._client: Optional[BleakClient] = None + self._device = None + self._connected = False + + # Live encoder data (updated on every BLE notification) + self._latest_raw: dict[str, Optional[float]] = {e: None for e in ENCODERS} + self._latest_meta: dict[str, dict] = {e: {} for e in ENCODERS} + self._last_gateway_idx = -1 + self._missed_packets = 0 + self._last_notify_time: float = 0.0 + + # Notification event (set on every _on_notify, used for on-demand reads) + self._notify_received: asyncio.Event = asyncio.Event() + + # Zero offsets + self._zero_offsets: dict[str, float] = {e: 0.0 for e in ENCODERS} + + # Measurement collection state + self._measurement_id = 0 + self._collecting = False + self._collect_samples: dict[str, list[float]] = {e: [] for e in ENCODERS} + self._collect_meta: dict[str, list[dict]] = {e: [] for e in ENCODERS} + self._collect_done: Optional[asyncio.Event] = None + + # Timing (seconds) of last connect and last get_encoder_values / get_instantaneous call + self._last_connect_time_s: float = 0.0 + self._last_get_encoder_values_time_s: float = 0.0 + self._last_get_instantaneous_encoder_values_time_s: float = 0.0 + + # ── Properties ─────────────────────────────────────────────────────── + + @property + def is_connected(self) -> bool: + """True when BLE link is active.""" + return self._connected and self._client is not None and self._client.is_connected + + @property + def missed_packets(self) -> int: + return self._missed_packets + + @property + def last_gateway_idx(self) -> int: + return self._last_gateway_idx + + @property + def last_connect_time_s(self) -> float: + """Time in seconds taken by the last connect() (or reconnect()) that did a full connect.""" + return self._last_connect_time_s + + @property + def last_get_encoder_values_time_s(self) -> float: + """Time in seconds taken by the last get_encoder_values() call from start to return.""" + return self._last_get_encoder_values_time_s + + @property + def last_get_instantaneous_encoder_values_time_s(self) -> float: + """Time in seconds taken by the last get_instantaneous_encoder_values() call from start to return.""" + return self._last_get_instantaneous_encoder_values_time_s + + # ── Connect / Disconnect / Reconnect ───────────────────────────────── + + async def connect(self, timeout: float = SCAN_TIMEOUT_S) -> bool: + """ + Scan for the gateway and connect. + Returns True on success, False if the device was not found. + """ + if self.is_connected: + logger.info("Already connected.") + return True + + t0 = time.perf_counter() + logger.info("Scanning for %s …", DEVICE_NAME) + self._device = await BleakScanner.find_device_by_filter( + lambda d, _ad: d.name == DEVICE_NAME, timeout=timeout, + ) + if self._device is None: + logger.error("Gateway not found (scanned for %.0fs).", timeout) + return False + + logger.info("Found %s (%s). Connecting …", DEVICE_NAME, self._device.address) + self._client = BleakClient(self._device, disconnected_callback=self._on_disconnect) + await self._client.connect() + await self._client.start_notify(CHARACTERISTIC_UUID, self._on_notify) + self._connected = True + self._last_connect_time_s = time.perf_counter() - t0 + logger.info("Connected to %s (%.2f s).", DEVICE_NAME, self._last_connect_time_s) + return True + + async def disconnect(self): + """Cleanly close the BLE connection.""" + if self._client is not None: + try: + await self._client.disconnect() + except Exception: + pass + self._connected = False + logger.info("Disconnected.") + + async def reconnect(self, timeout: float = SCAN_TIMEOUT_S) -> bool: + """ + Drop existing connection (if any) and reconnect from scratch. + Returns True on success. + """ + logger.info("Reconnecting …") + await self.disconnect() + await asyncio.sleep(1.0) # give BLE stack time to clean up + return await self.connect(timeout=timeout) + + def _on_disconnect(self, _client): + self._connected = False + logger.warning("BLE disconnected unexpectedly.") + + # ── Live encoder values ────────────────────────────────────────────── + + async def get_instantaneous_encoder_values(self) -> tuple[Optional[float], Optional[float]]: + """ + Request a fresh encoder reading from the gateway and return + (M0, S0) angles in degrees (zero-adjusted). + + Sends a "READ" command and waits for the notification response. + If not connected to BLE, reconnects first. Returns (None, None) if reconnect fails. + """ + t0 = time.perf_counter() + if not self.is_connected: + ok = await self.reconnect() + if not ok: + self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 + return (None, None) + + self._notify_received.clear() + await self.send_command("READ") + try: + await asyncio.wait_for(self._notify_received.wait(), timeout=5.0) + except asyncio.TimeoutError: + logger.warning("READ response timed out.") + self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 + return (None, None) + + m0_raw = self._latest_raw["M0"] + s0_raw = self._latest_raw["S0"] + m0 = (m0_raw - self._zero_offsets["M0"]) if m0_raw is not None else None + s0 = (s0_raw - self._zero_offsets["S0"]) if s0_raw is not None else None + self._last_get_instantaneous_encoder_values_time_s = time.perf_counter() - t0 + return (m0, s0) + + # ── Precision measurement ──────────────────────────────────────────── + + async def get_encoder_values( + self, + num_samples: int = SAMPLES_PER_MEASUREMENT, + timeout: float = MEASURE_TIMEOUT_S, + ) -> tuple[Optional[float], Optional[float]]: + """ + Collect *num_samples* on-demand readings from every encoder, + compute medians, and return (M0_median_deg, S0_median_deg). + + Sends a "READ" command for each sample and waits for the response. + If not connected to BLE, reconnects first. Returns (None, None) if reconnect fails. + Raises TimeoutError if samples are not received in time. + """ + t0 = time.perf_counter() + if not self.is_connected: + ok = await self.reconnect() + if not ok: + self._last_get_encoder_values_time_s = time.perf_counter() - t0 + return (None, None) + + self._measurement_id += 1 + mid = self._measurement_id + + # Prepare collection buffers + self._collect_samples = {e: [] for e in ENCODERS} + self._collect_meta = {e: [] for e in ENCODERS} + self._collecting = True + per_sample_timeout = timeout / num_samples + + logger.info("Measurement #%d: collecting %d samples …", mid, num_samples) + + try: + for i in range(num_samples): + self._notify_received.clear() + await self.send_command("READ") + try: + await asyncio.wait_for(self._notify_received.wait(), timeout=per_sample_timeout) + except asyncio.TimeoutError: + self._collecting = False + self._last_get_encoder_values_time_s = time.perf_counter() - t0 + raise TimeoutError( + f"Measurement #{mid} timed out at sample {i+1}/{num_samples} " + f"after {time.perf_counter() - t0:.1f}s." + ) + finally: + self._collecting = False + + # Build result + result = MeasurementResult(measurement_id=mid, timestamp=time.time()) + for enc in ENCODERS: + samples = self._collect_samples[enc] + enc_data: dict = {"samples": samples, "count": len(samples)} + + if len(samples) >= 1: + median = float(np.median(samples)) + jitter = (max(samples) - min(samples)) if len(samples) >= 2 else 0.0 + precision_um = REACH_MM * (jitter * np.pi / 180.0) * 1000.0 + enc_data.update(median=median, jitter=jitter, precision_um=precision_um) + else: + enc_data.update(median=None, jitter=None, precision_um=None) + + # Attach last known status + metas = self._collect_meta[enc] + enc_data["status"] = metas[-1].get("status", "OK") if metas else "NO_DATA" + result.encoders[enc] = enc_data + + self._last_get_encoder_values_time_s = time.perf_counter() - t0 + logger.info("Measurement #%d complete (%.2f s).", mid, self._last_get_encoder_values_time_s) + m0_median = result.encoders["M0"].get("median") + s0_median = result.encoders["S0"].get("median") + return (m0_median, s0_median) + + # ── Zero reference ─────────────────────────────────────────────────── + + def set_zero(self) -> dict[str, float]: + """ + Capture the current raw angles as the zero reference. + All subsequent get_encoder_values() and measure() calls will be + relative to this position. + + Returns a dict of the offsets that were applied, e.g.: + {"M0": 166.990, "S0": 125.395} + + Raises RuntimeError if no data has been received yet. + """ + applied: dict[str, float] = {} + for enc in ENCODERS: + raw = self._latest_raw[enc] + if raw is not None: + self._zero_offsets[enc] = raw + applied[enc] = raw + + if not applied: + raise RuntimeError("No encoder data received yet — cannot set zero.") + + logger.info("Zero set: %s", {k: f"{v:.5f}°" for k, v in applied.items()}) + return applied + + def clear_zero(self): + """Remove any zero offset (revert to absolute angles).""" + self._zero_offsets = {e: 0.0 for e in ENCODERS} + logger.info("Zero offsets cleared.") + + # ── Send BLE command to gateway ────────────────────────────────────── + + async def send_command(self, cmd: str) -> bool: + """ + Send an arbitrary string command to the gateway's command characteristic. + Returns True on success. + """ + if not self.is_connected: + raise RuntimeError("Not connected.") + try: + await self._client.write_gatt_char(COMMAND_UUID, cmd.encode()) + logger.info("Sent command: %s", cmd) + return True + except Exception as exc: + logger.error("Command failed: %s", exc) + return False + + # ── Internal BLE notification handler ──────────────────────────────── + + def _on_notify(self, _sender, data: bytearray): + """Called by bleak on every BLE notification.""" + try: + payload = data.decode() + parts = payload.split("|") + g_idx = int(parts[0]) + + # Track missed packets + if self._last_gateway_idx != -1 and g_idx - self._last_gateway_idx > 1: + self._missed_packets += g_idx - self._last_gateway_idx - 1 + self._last_gateway_idx = g_idx + self._last_notify_time = time.time() + + # ── Parse Master (M0) ── + _, m_result = _parse_encoder_field(parts[1], g_idx) + if m_result is not None: + raw_ang, meta = m_result + self._latest_raw["M0"] = raw_ang + self._latest_meta["M0"] = meta + + # ── Parse Slave (S0) ── + s_result = None + if len(parts) > 2: + _, s_result = _parse_encoder_field(parts[2], g_idx) + if s_result is not None: + raw_ang, meta = s_result + self._latest_raw["S0"] = raw_ang + self._latest_meta["S0"] = meta + + # ── Collecting samples for a measurement? ── + if self._collecting: + for enc, result in [("M0", m_result), ("S0", s_result)]: + if result is None: + continue + raw_ang, meta = result + adj = raw_ang - self._zero_offsets[enc] + if enc == "M0" and meta["status"] == "OK": + meta["status"] = "MASTER" + self._collect_samples[enc].append(adj) + self._collect_meta[enc].append(meta) + + # Signal that a notification was received + self._notify_received.set() + + except Exception as exc: + logger.debug("Parse error: %s | payload=%s", exc, data) + + +# ── Convenience: run interactively if executed directly ────────────────────── +async def _interactive_demo(): + """Quick interactive session for testing.""" + logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(name)s] %(message)s") + + probe = OliverAPI() + ok = await probe.connect() + if not ok: + if VERBOSE: + print("✗ Could not find gateway.") + return + + if VERBOSE: + print("\n" + "=" * 70) + print(" Oliver API — Interactive Demo") + print(" Commands: Enter = measure | z = set zero | v = instantaneous") + print(" c = connect | d = disconnect | r = reconnect | q = quit") + print("=" * 70 + "\n") + + import sys, select + + try: + if sys.platform != "win32": + import tty, termios + old_settings = termios.tcgetattr(sys.stdin) + tty.setcbreak(sys.stdin.fileno()) + else: + old_settings = None + + while True: + # Non-blocking key check + if sys.platform != "win32" and select.select([sys.stdin], [], [], 0)[0]: + key = sys.stdin.read(1) + else: + key = None + + if key: + if key.lower() == "q": + break + + elif key.lower() == "z": + try: + offsets = probe.set_zero() + if VERBOSE: + print(f"✓ Zero set: {offsets}") + except RuntimeError as e: + if VERBOSE: + print(f"✗ {e}") + + elif key.lower() == "c": + ok = await probe.connect() + if VERBOSE: + print("✓ Connected." if ok else "✗ Connect failed.") + + elif key.lower() == "d": + await probe.disconnect() + if VERBOSE: + print("✓ Disconnected.") + + elif key.lower() == "r": + ok = await probe.reconnect() + if VERBOSE: + print("✓ Reconnected." if ok else "✗ Reconnect failed.") + + elif key == "\n": + try: + m0_med, s0_med = await probe.get_encoder_values() + if VERBOSE: + print(f"\n{'=' * 80}") + print(" Measurement (M0_median, S0_median)") + print(f"{'=' * 80}") + if m0_med is not None: + print(f" M0 {m0_med:12.5f}°") + else: + print(" M0 no data") + if s0_med is not None: + print(f" S0 {s0_med:12.5f}°") + else: + print(" S0 no data") + print(f"{'=' * 80}\n") + except TimeoutError as e: + if VERBOSE: + print(f"✗ {e}") + + elif key == "v": + m0, s0 = await probe.get_instantaneous_encoder_values() + if VERBOSE: + print(f" M0: {m0:.5f}°" if m0 is not None else " M0: no data") + print(f" S0: {s0:.5f}°" if s0 is not None else " S0: no data") + print(f" (%.3f s)" % probe.last_get_instantaneous_encoder_values_time_s) + + await asyncio.sleep(0.1) + + except KeyboardInterrupt: + pass + finally: + if sys.platform != "win32" and old_settings: + import termios + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings) + await probe.disconnect() + if VERBOSE: + print("\nDone.") + + +if __name__ == "__main__": + asyncio.run(_interactive_demo()) diff --git a/Oliver/oliver_raw.py b/Oliver/oliver_raw.py index 574b574..aeeaa5e 100644 --- a/Oliver/oliver_raw.py +++ b/Oliver/oliver_raw.py @@ -1,310 +1,310 @@ -""" -Author: Swaraj Dangare -""" -import asyncio -import time -import sys -import select -import numpy as np -from collections import deque -from bleak import BleakClient, BleakScanner - -# BLE configuration -DEVICE_NAME = "Oliver_3" -CHARACTERISTIC_UUID = "1d4cd358-172d-4c33-b0b2-ddce9a071aab" -COMMAND_UUID = "308a0c43-80f0-4b01-81e5-bb2798eb92f9" - - -class GatewayInterface: - def __init__(self): - self.start_time = time.time() - self.last_g_idx = -1 - self.missed_packets = 0 - self.client = None - - # Manual sampling mode - self.manual_mode = True - self.samples_per_measurement = 5 - self.current_samples = { - 'M0': [], 'S0': [] - } - self.sample_metadata = { - 'M0': [], 'S0': [] - } - self.collecting = False - self.measurement_id = 0 - - # Zero offset: subtract this from raw angles to get relative values - self.zero_offsets = {'M0': 0.0, 'S0': 0.0} - # Track the latest raw angle from each encoder (updated every packet) - self.latest_raw = {'M0': None, 'S0': None} - - # Legacy variance tracking (kept for reference) - self.sample_size = 100 - self.encoder_samples = { - 'M0': deque(maxlen=self.sample_size), - 'S0': deque(maxlen=self.sample_size), - } - - def set_zero(self): - """Set current encoder positions as the zero reference""" - zeroed = [] - for enc in ['M0', 'S0']: - if self.latest_raw[enc] is not None: - self.zero_offsets[enc] = self.latest_raw[enc] - zeroed.append(f"{enc}={self.latest_raw[enc]:.5f}°") - if zeroed: - print(f"\n✓ ZERO set: {', '.join(zeroed)}") - print(" All future measurements will be relative to this position.") - else: - print("\n✗ No encoder data received yet — cannot set zero.") - print() - - def variance(self, key): - vals = list(self.encoder_samples[key]) - return np.var(vals) if len(vals) > 1 else 0.0 - - def start_measurement(self): - """Initialize a new measurement session""" - self.measurement_id += 1 - self.collecting = True - self.samples_collected = False - for key in self.current_samples: - self.current_samples[key] = [] - self.sample_metadata[key] = [] - print("\nCollecting 5 samples", end="", flush=True) - - def calculate_precision_metrics(self, samples): - """Calculate median, jitter, and precision from samples""" - if len(samples) < 3: - return None, None, None - - median_angle = np.median(samples) - jitter = max(samples) - min(samples) - # Assuming 183mm reach (from reference script) - precision_um = 183 * (jitter * np.pi / 180.0) * 1000 - return median_angle, jitter, precision_um - - def display_results(self): - """Display measurement results with precision metrics""" - print("\n\n" + "="*130) - print(f"=== OLIVER PRECISION MEASUREMENT #{self.measurement_id} | Uptime {int(time.time() - self.start_time)}s ===") - print("="*130) - print( - f"{'ENC':<4} | {'MEDIAN (deg)':>12} | {'JITTER (deg)':>13} | {'PRECISION (μm)':>15} | " - f"{'AGC':<4} | {'MAG':<5} | {'STATUS':<12}" - ) - print("-" * 130) - - for enc_name in ['M0', 'S0']: - samples = self.current_samples[enc_name] - - if len(samples) == 0: - print(f"{enc_name:<4} | {'---':>12} | {'---':>13} | {'---':>15} | {'---':<4} | {'---':<5} | OFFLINE") - continue - - median, jitter, precision = self.calculate_precision_metrics(samples) - - if median is None: - print(f"{enc_name:<4} | {'INSUFFICIENT':>12} | {'DATA':>13} | {'---':>15} | {'---':<4} | {'---':<5} | ERROR") - continue - - # Get metadata from last sample - meta = self.sample_metadata[enc_name][-1] if self.sample_metadata[enc_name] else {} - agc = meta.get('agc', '---') - mag = meta.get('mag', '---') - status = meta.get('status', 'OK') - - print( - f"{enc_name:<4} | {median:12.5f} | {jitter:13.5f} | {precision:15.1f} | " - f"{agc:<4} | {mag:<5} | {status:<12}" - ) - - print("="*130) - print("\nPress Enter to measure again (Z to set zero, Q to quit)") - - def handle_data(self, payload): - # Handle incoming BLE data - collect samples in manual mode - parts = payload.split('|') - try: - g_idx = int(parts[0]) - - if self.last_g_idx != -1 and g_idx - self.last_g_idx > 1: - self.missed_packets += g_idx - self.last_g_idx - 1 - self.last_g_idx = g_idx - - # -------- helper to parse an encoder field -------- - def parse_encoder(part): - """Parse 'XX:angle,pkt[,agc,mag,magl,magh,cof]' -> (name, dict) - Supports both full 7-field and short 2-field formats.""" - name_str, d = part.split(":") - fields = d.split(",") - - if fields[0] == "OFFLINE": - return name_str, None - - ang = float(fields[0]) / 10000.0 - pkt = int(fields[1]) if len(fields) > 1 else 0 - - # Full format has 7 fields; short format has 2 - if len(fields) >= 7: - agc = int(fields[2]) - mag = int(fields[3]) - magl = fields[4] - magh = fields[5] - cof = fields[6] - else: - agc = 0 - mag = 0 - magl = "0" - magh = "0" - cof = "0" - - status = "OK" - if cof == "1": - status = "CORDIC_ERR" - elif magl == "1": - status = "FIELD_LOW" - elif magh == "1": - status = "FIELD_HIGH" - - meta = { - 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, - 'magl': magl, 'magh': magh, 'cof': cof, 'status': status - } - return name_str, (ang, meta) - - # -------- MASTER -------- - m_result = None - name_str, result = parse_encoder(parts[1]) - if result is not None: - raw_ang, meta = result - self.latest_raw['M0'] = raw_ang - m_result = (raw_ang, meta) - - # -------- SLAVE (S0 only) -------- - s_result = None - idx = 2 # S0 is at index 2 in the parts array - if idx < len(parts): - name_str, result = parse_encoder(parts[idx]) - if result is not None: - raw_ang, meta = result - self.latest_raw['S0'] = raw_ang - s_result = (raw_ang, meta) - - if not self.collecting: - return # Ignore data when not actively collecting - - # Progress indicator - print(".", end="", flush=True) - - # Store zero-adjusted samples for MASTER - if m_result is not None: - raw_ang, meta = m_result - adj_ang = raw_ang - self.zero_offsets['M0'] - meta['status'] = "MASTER" if meta['status'] == "OK" else meta['status'] - self.current_samples['M0'].append(adj_ang) - self.sample_metadata['M0'].append(meta) - - # Store zero-adjusted samples for SLAVE - if s_result is not None: - raw_ang, meta = s_result - adj_ang = raw_ang - self.zero_offsets['S0'] - self.current_samples['S0'].append(adj_ang) - self.sample_metadata['S0'].append(meta) - - # Check if we've collected enough samples - # Use M0 as reference (master is always present) - if len(self.current_samples['M0']) >= self.samples_per_measurement: - self.collecting = False - self.samples_collected = True - self.display_results() - - except Exception as e: - print(f"\nParse error: {e}") - print(payload) - - async def send_read(self): - """Send a READ command to trigger one on-demand reading.""" - if self.client and self.client.is_connected: - try: - await self.client.write_gatt_char(COMMAND_UUID, b"READ") - except Exception: - pass - - async def send_cmd(self, cmd): - if self.client and self.client.is_connected: - try: - await self.client.write_gatt_char(COMMAND_UUID, cmd.encode()) - print(f"\n✓ Sent command: {cmd}\n") - except Exception: - print("\n✗ Command characteristic not available on gateway\n") - - -iface = GatewayInterface() - - -def notify(_, data): - iface.handle_data(data.decode()) - - -async def get_key(): - if sys.platform == "win32": - return None - if select.select([sys.stdin], [], [], 0)[0]: - return sys.stdin.read(1) - return None - - -async def main(): - print("Scanning for gateway...") - dev = await BleakScanner.find_device_by_filter(lambda d, a: d.name == DEVICE_NAME) - if not dev: - print("✗ Gateway not found") - return - - async with BleakClient(dev) as c: - iface.client = c - await c.start_notify(CHARACTERISTIC_UUID, notify) - print("✓ Connected to Oliver_3\n") - - print("=" * 80) - print(" OLIVER PRECISION MEASUREMENT SYSTEM") - print(" Mode: On-demand sampling (5 samples per encoder)") - print(" Encoders: M0 (Master) + S0 (Slave)") - print("=" * 80) - print("\nPress Enter to start a measurement (Z to set zero, Q to quit)\n") - - try: - while c.is_connected: - k = await get_key() - if k: - if k.lower() == 'q': - print("\nDisconnecting...") - break - elif k.lower() == 'z': - await iface.send_read() - await asyncio.sleep(0.3) - iface.set_zero() - elif k == '\n': - iface.start_measurement() - while iface.collecting: - await iface.send_read() - await asyncio.sleep(0.15) - await asyncio.sleep(0.05) - except KeyboardInterrupt: - print("\n\nDisconnecting...") - - -if __name__ == "__main__": - if sys.platform != "win32": - import tty, termios - old = termios.tcgetattr(sys.stdin) - try: - tty.setcbreak(sys.stdin.fileno()) - asyncio.run(main()) - finally: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old) - else: - asyncio.run(main()) - +""" +Author: Swaraj Dangare +""" +import asyncio +import time +import sys +import select +import numpy as np +from collections import deque +from bleak import BleakClient, BleakScanner + +# BLE configuration +DEVICE_NAME = "Oliver_3" +CHARACTERISTIC_UUID = "1d4cd358-172d-4c33-b0b2-ddce9a071aab" +COMMAND_UUID = "308a0c43-80f0-4b01-81e5-bb2798eb92f9" + + +class GatewayInterface: + def __init__(self): + self.start_time = time.time() + self.last_g_idx = -1 + self.missed_packets = 0 + self.client = None + + # Manual sampling mode + self.manual_mode = True + self.samples_per_measurement = 5 + self.current_samples = { + 'M0': [], 'S0': [] + } + self.sample_metadata = { + 'M0': [], 'S0': [] + } + self.collecting = False + self.measurement_id = 0 + + # Zero offset: subtract this from raw angles to get relative values + self.zero_offsets = {'M0': 0.0, 'S0': 0.0} + # Track the latest raw angle from each encoder (updated every packet) + self.latest_raw = {'M0': None, 'S0': None} + + # Legacy variance tracking (kept for reference) + self.sample_size = 100 + self.encoder_samples = { + 'M0': deque(maxlen=self.sample_size), + 'S0': deque(maxlen=self.sample_size), + } + + def set_zero(self): + """Set current encoder positions as the zero reference""" + zeroed = [] + for enc in ['M0', 'S0']: + if self.latest_raw[enc] is not None: + self.zero_offsets[enc] = self.latest_raw[enc] + zeroed.append(f"{enc}={self.latest_raw[enc]:.5f}°") + if zeroed: + print(f"\n✓ ZERO set: {', '.join(zeroed)}") + print(" All future measurements will be relative to this position.") + else: + print("\n✗ No encoder data received yet — cannot set zero.") + print() + + def variance(self, key): + vals = list(self.encoder_samples[key]) + return np.var(vals) if len(vals) > 1 else 0.0 + + def start_measurement(self): + """Initialize a new measurement session""" + self.measurement_id += 1 + self.collecting = True + self.samples_collected = False + for key in self.current_samples: + self.current_samples[key] = [] + self.sample_metadata[key] = [] + print("\nCollecting 5 samples", end="", flush=True) + + def calculate_precision_metrics(self, samples): + """Calculate median, jitter, and precision from samples""" + if len(samples) < 3: + return None, None, None + + median_angle = np.median(samples) + jitter = max(samples) - min(samples) + # Assuming 183mm reach (from reference script) + precision_um = 183 * (jitter * np.pi / 180.0) * 1000 + return median_angle, jitter, precision_um + + def display_results(self): + """Display measurement results with precision metrics""" + print("\n\n" + "="*130) + print(f"=== OLIVER PRECISION MEASUREMENT #{self.measurement_id} | Uptime {int(time.time() - self.start_time)}s ===") + print("="*130) + print( + f"{'ENC':<4} | {'MEDIAN (deg)':>12} | {'JITTER (deg)':>13} | {'PRECISION (μm)':>15} | " + f"{'AGC':<4} | {'MAG':<5} | {'STATUS':<12}" + ) + print("-" * 130) + + for enc_name in ['M0', 'S0']: + samples = self.current_samples[enc_name] + + if len(samples) == 0: + print(f"{enc_name:<4} | {'---':>12} | {'---':>13} | {'---':>15} | {'---':<4} | {'---':<5} | OFFLINE") + continue + + median, jitter, precision = self.calculate_precision_metrics(samples) + + if median is None: + print(f"{enc_name:<4} | {'INSUFFICIENT':>12} | {'DATA':>13} | {'---':>15} | {'---':<4} | {'---':<5} | ERROR") + continue + + # Get metadata from last sample + meta = self.sample_metadata[enc_name][-1] if self.sample_metadata[enc_name] else {} + agc = meta.get('agc', '---') + mag = meta.get('mag', '---') + status = meta.get('status', 'OK') + + print( + f"{enc_name:<4} | {median:12.5f} | {jitter:13.5f} | {precision:15.1f} | " + f"{agc:<4} | {mag:<5} | {status:<12}" + ) + + print("="*130) + print("\nPress Enter to measure again (Z to set zero, Q to quit)") + + def handle_data(self, payload): + # Handle incoming BLE data - collect samples in manual mode + parts = payload.split('|') + try: + g_idx = int(parts[0]) + + if self.last_g_idx != -1 and g_idx - self.last_g_idx > 1: + self.missed_packets += g_idx - self.last_g_idx - 1 + self.last_g_idx = g_idx + + # -------- helper to parse an encoder field -------- + def parse_encoder(part): + """Parse 'XX:angle,pkt[,agc,mag,magl,magh,cof]' -> (name, dict) + Supports both full 7-field and short 2-field formats.""" + name_str, d = part.split(":") + fields = d.split(",") + + if fields[0] == "OFFLINE": + return name_str, None + + ang = float(fields[0]) / 10000.0 + pkt = int(fields[1]) if len(fields) > 1 else 0 + + # Full format has 7 fields; short format has 2 + if len(fields) >= 7: + agc = int(fields[2]) + mag = int(fields[3]) + magl = fields[4] + magh = fields[5] + cof = fields[6] + else: + agc = 0 + mag = 0 + magl = "0" + magh = "0" + cof = "0" + + status = "OK" + if cof == "1": + status = "CORDIC_ERR" + elif magl == "1": + status = "FIELD_LOW" + elif magh == "1": + status = "FIELD_HIGH" + + meta = { + 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, + 'magl': magl, 'magh': magh, 'cof': cof, 'status': status + } + return name_str, (ang, meta) + + # -------- MASTER -------- + m_result = None + name_str, result = parse_encoder(parts[1]) + if result is not None: + raw_ang, meta = result + self.latest_raw['M0'] = raw_ang + m_result = (raw_ang, meta) + + # -------- SLAVE (S0 only) -------- + s_result = None + idx = 2 # S0 is at index 2 in the parts array + if idx < len(parts): + name_str, result = parse_encoder(parts[idx]) + if result is not None: + raw_ang, meta = result + self.latest_raw['S0'] = raw_ang + s_result = (raw_ang, meta) + + if not self.collecting: + return # Ignore data when not actively collecting + + # Progress indicator + print(".", end="", flush=True) + + # Store zero-adjusted samples for MASTER + if m_result is not None: + raw_ang, meta = m_result + adj_ang = raw_ang - self.zero_offsets['M0'] + meta['status'] = "MASTER" if meta['status'] == "OK" else meta['status'] + self.current_samples['M0'].append(adj_ang) + self.sample_metadata['M0'].append(meta) + + # Store zero-adjusted samples for SLAVE + if s_result is not None: + raw_ang, meta = s_result + adj_ang = raw_ang - self.zero_offsets['S0'] + self.current_samples['S0'].append(adj_ang) + self.sample_metadata['S0'].append(meta) + + # Check if we've collected enough samples + # Use M0 as reference (master is always present) + if len(self.current_samples['M0']) >= self.samples_per_measurement: + self.collecting = False + self.samples_collected = True + self.display_results() + + except Exception as e: + print(f"\nParse error: {e}") + print(payload) + + async def send_read(self): + """Send a READ command to trigger one on-demand reading.""" + if self.client and self.client.is_connected: + try: + await self.client.write_gatt_char(COMMAND_UUID, b"READ") + except Exception: + pass + + async def send_cmd(self, cmd): + if self.client and self.client.is_connected: + try: + await self.client.write_gatt_char(COMMAND_UUID, cmd.encode()) + print(f"\n✓ Sent command: {cmd}\n") + except Exception: + print("\n✗ Command characteristic not available on gateway\n") + + +iface = GatewayInterface() + + +def notify(_, data): + iface.handle_data(data.decode()) + + +async def get_key(): + if sys.platform == "win32": + return None + if select.select([sys.stdin], [], [], 0)[0]: + return sys.stdin.read(1) + return None + + +async def main(): + print("Scanning for gateway...") + dev = await BleakScanner.find_device_by_filter(lambda d, a: d.name == DEVICE_NAME) + if not dev: + print("✗ Gateway not found") + return + + async with BleakClient(dev) as c: + iface.client = c + await c.start_notify(CHARACTERISTIC_UUID, notify) + print("✓ Connected to Oliver_3\n") + + print("=" * 80) + print(" OLIVER PRECISION MEASUREMENT SYSTEM") + print(" Mode: On-demand sampling (5 samples per encoder)") + print(" Encoders: M0 (Master) + S0 (Slave)") + print("=" * 80) + print("\nPress Enter to start a measurement (Z to set zero, Q to quit)\n") + + try: + while c.is_connected: + k = await get_key() + if k: + if k.lower() == 'q': + print("\nDisconnecting...") + break + elif k.lower() == 'z': + await iface.send_read() + await asyncio.sleep(0.3) + iface.set_zero() + elif k == '\n': + iface.start_measurement() + while iface.collecting: + await iface.send_read() + await asyncio.sleep(0.15) + await asyncio.sleep(0.05) + except KeyboardInterrupt: + print("\n\nDisconnecting...") + + +if __name__ == "__main__": + if sys.platform != "win32": + import tty, termios + old = termios.tcgetattr(sys.stdin) + try: + tty.setcbreak(sys.stdin.fileno()) + asyncio.run(main()) + finally: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old) + else: + asyncio.run(main()) + diff --git a/Oliver/slave/slave.ino b/Oliver/slave/slave.ino index ca5f5c0..894f8ea 100644 --- a/Oliver/slave/slave.ino +++ b/Oliver/slave/slave.ino @@ -1,207 +1,207 @@ -#include -#include -#include -#include -#include - -/** - * Project: Wireless Ultra-Precision Slave (On-Demand) - * Protocol: ESP-NOW (Request -> Response) - * Sensor: AS5047D (SPI) - * Logic: Wait for Request -> Measure (~15ms) -> Reply - * Author: Swaraj Dangare - */ - -#define SLAVE_ID 0 //<--- CHANGE THIS FOR EACH BOARD: 0, 1, 2, 3, 4 -#define WIFI_CHANNEL 11 // Must match master's WIFI_CHANNEL (use 1, 6, or 11) - -// ---------------- COMMUNICATION ---------------- -typedef struct __attribute__((packed)) { - uint8_t id; - int value; // Angle * 10000 - uint32_t packetIdx; - uint8_t agc; // AS5047D AGC value (0-255) - uint16_t mag; // AS5047D CORDIC magnitude (14-bit) - uint8_t magl; // Magnetic field too low (0 or 1) - uint8_t magh; // Magnetic field too high (0 or 1) - uint8_t cof; // CORDIC overflow (0 or 1) -} Payload; - -Payload pkt; -uint32_t packet_counter = 0; - -// ---------------- AS5047D SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC_REG 0x3FFC -#define MAG_REG 0x3FFD -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 -#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 - -// XIAO ESP32C3 SPI Pins (Standard) -const int PIN_CS = D7; -const int PIN_SCK = D1; -const int PIN_MISO = D0; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// ---------------- UTILS & ENCODER ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read() { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t readRegister(uint16_t addr) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(addr)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result & 0x3FFF; -} - -// Robust Mean: Calculate mean of samples within 1.5 LSB distance from initial -// median -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -double getUltraPrecisionReading() { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); // Small yield - } - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - return (finalCounts * 360.0) / 16384.0; -} - -// ---------------- ESP-NOW CALLBACK ---------------- -void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int len) { - // 1. Discovery Response (Master sends 0xFF) - if (len == 1 && data[0] == 0xFF) { - // Add small random delay to prevent collision when multiple slaves respond - // This staggers responses across 10-30ms window - delayMicroseconds(random(10000, 30000)); // 10-30ms - - uint8_t reply = SLAVE_ID; - // Add master as peer dynamically so we can reply - if (!esp_now_is_peer_exist(info->src_addr)) { - esp_now_peer_info_t peer{}; - memcpy(peer.peer_addr, info->src_addr, 6); - peer.channel = WIFI_CHANNEL; - peer.encrypt = false; - esp_now_add_peer(&peer); - } - esp_now_send(info->src_addr, &reply, 1); - } - - // 2. Data Request (Master sends Slave ID) - if (len == 1 && data[0] == SLAVE_ID) { - // Perform Measurement (Block-Blocking but fast enough ~15-20ms) - double angle = getUltraPrecisionReading(); - - // Read diagnostic registers - uint16_t diaagc = readRegister(DIAAGC_REG); - uint16_t mag = readRegister(MAG_REG); - - pkt.id = SLAVE_ID; - pkt.value = (int)(angle * 10000.0); - pkt.packetIdx = packet_counter++; - pkt.agc = diaagc & 0xFF; - pkt.mag = mag & 0x3FFF; - pkt.magl = (diaagc >> 8) & 0x01; - pkt.magh = (diaagc >> 10) & 0x01; - pkt.cof = (diaagc >> 9) & 0x01; - - esp_now_send(info->src_addr, (uint8_t *)&pkt, sizeof(pkt)); - } -} - -void setup() { - Serial.begin(115200); - Serial.println("init"); - // SPI Setup - pinMode(PIN_CS, OUTPUT); - digitalWrite(PIN_CS, HIGH); - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); - - // WiFi / ESP-NOW Setup - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - - // Force WiFi channel (must match master) - esp_wifi_set_promiscuous(true); - esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); - esp_wifi_set_promiscuous(false); - - if (esp_now_init() != ESP_OK) { - Serial.println("ESP-NOW Init Failed"); - return; - } - esp_now_register_recv_cb(onDataRecv); - - Serial.printf("Slave %d Ready | Channel %d | MAC: %s\n", SLAVE_ID, - WIFI_CHANNEL, WiFi.macAddress().c_str()); -} - -void loop() { - // Nothing here - totally interrupt driven - delay(100); +#include +#include +#include +#include +#include + +/** + * Project: Wireless Ultra-Precision Slave (On-Demand) + * Protocol: ESP-NOW (Request -> Response) + * Sensor: AS5047D (SPI) + * Logic: Wait for Request -> Measure (~15ms) -> Reply + * Author: Swaraj Dangare + */ + +#define SLAVE_ID 0 //<--- CHANGE THIS FOR EACH BOARD: 0, 1, 2, 3, 4 +#define WIFI_CHANNEL 11 // Must match master's WIFI_CHANNEL (use 1, 6, or 11) + +// ---------------- COMMUNICATION ---------------- +typedef struct __attribute__((packed)) { + uint8_t id; + int value; // Angle * 10000 + uint32_t packetIdx; + uint8_t agc; // AS5047D AGC value (0-255) + uint16_t mag; // AS5047D CORDIC magnitude (14-bit) + uint8_t magl; // Magnetic field too low (0 or 1) + uint8_t magh; // Magnetic field too high (0 or 1) + uint8_t cof; // CORDIC overflow (0 or 1) +} Payload; + +Payload pkt; +uint32_t packet_counter = 0; + +// ---------------- AS5047D SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC_REG 0x3FFC +#define MAG_REG 0x3FFD +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 +#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 + +// XIAO ESP32C3 SPI Pins (Standard) +const int PIN_CS = D7; +const int PIN_SCK = D1; +const int PIN_MISO = D0; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// ---------------- UTILS & ENCODER ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read() { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t readRegister(uint16_t addr) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(addr)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result & 0x3FFF; +} + +// Robust Mean: Calculate mean of samples within 1.5 LSB distance from initial +// median +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); // Small yield + } + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + return (finalCounts * 360.0) / 16384.0; +} + +// ---------------- ESP-NOW CALLBACK ---------------- +void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int len) { + // 1. Discovery Response (Master sends 0xFF) + if (len == 1 && data[0] == 0xFF) { + // Add small random delay to prevent collision when multiple slaves respond + // This staggers responses across 10-30ms window + delayMicroseconds(random(10000, 30000)); // 10-30ms + + uint8_t reply = SLAVE_ID; + // Add master as peer dynamically so we can reply + if (!esp_now_is_peer_exist(info->src_addr)) { + esp_now_peer_info_t peer{}; + memcpy(peer.peer_addr, info->src_addr, 6); + peer.channel = WIFI_CHANNEL; + peer.encrypt = false; + esp_now_add_peer(&peer); + } + esp_now_send(info->src_addr, &reply, 1); + } + + // 2. Data Request (Master sends Slave ID) + if (len == 1 && data[0] == SLAVE_ID) { + // Perform Measurement (Block-Blocking but fast enough ~15-20ms) + double angle = getUltraPrecisionReading(); + + // Read diagnostic registers + uint16_t diaagc = readRegister(DIAAGC_REG); + uint16_t mag = readRegister(MAG_REG); + + pkt.id = SLAVE_ID; + pkt.value = (int)(angle * 10000.0); + pkt.packetIdx = packet_counter++; + pkt.agc = diaagc & 0xFF; + pkt.mag = mag & 0x3FFF; + pkt.magl = (diaagc >> 8) & 0x01; + pkt.magh = (diaagc >> 10) & 0x01; + pkt.cof = (diaagc >> 9) & 0x01; + + esp_now_send(info->src_addr, (uint8_t *)&pkt, sizeof(pkt)); + } +} + +void setup() { + Serial.begin(115200); + Serial.println("init"); + // SPI Setup + pinMode(PIN_CS, OUTPUT); + digitalWrite(PIN_CS, HIGH); + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + + // WiFi / ESP-NOW Setup + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + + // Force WiFi channel (must match master) + esp_wifi_set_promiscuous(true); + esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); + esp_wifi_set_promiscuous(false); + + if (esp_now_init() != ESP_OK) { + Serial.println("ESP-NOW Init Failed"); + return; + } + esp_now_register_recv_cb(onDataRecv); + + Serial.printf("Slave %d Ready | Channel %d | MAC: %s\n", SLAVE_ID, + WIFI_CHANNEL, WiFi.macAddress().c_str()); +} + +void loop() { + // Nothing here - totally interrupt driven + delay(100); } \ No newline at end of file diff --git a/README.md b/README.md index ab87c5c..b0377e6 100644 --- a/README.md +++ b/README.md @@ -1,137 +1,137 @@ -# ESP Encoder - -A collection of ESP32-based encoder measurement projects using the AS5047D 14-bit magnetic rotary encoder. - -Each project lives in `projects/` with its own Python scripts. All projects share firmware templates from `firmware/`. - ---- - -## Firmware Templates - -| Template | Location | Use When | -|---|---|---| -| **Single Encoder** | [`firmware/single_encoder/`](firmware/single_encoder/) | One ESP reads one encoder, sends directly to PC via BLE | -| **Dual Encoder** | [`firmware/dual_encoder/`](firmware/dual_encoder/) | One ESP reads two encoders on same SPI bus, sends to PC via BLE | -| **Master** | [`firmware/master/`](firmware/master/) | ESP32C6 — aggregates encoder data from slaves, sends to PC via BLE | -| **Slave** | [`firmware/slave/`](firmware/slave/) | ESP32C3 — reads one encoder, responds to master over ESP-NOW | - -### Flashing a Single-Encoder Project - -1. Open `firmware/single_encoder/single_encoder.ino` in Arduino IDE -2. Edit the config block at the top: - ```cpp - #define ESP_NAME "YOUR_DEVICE_NAME" - #define SERVICE_UUID "4fafc201-..." - #define CHARACTERISTIC_UUID "beb5483e-..." - ``` -3. Select board (XIAO ESP32C3 or ESP32C6) and upload - -### Flashing a Multi-Encoder Project (Master + Slave) - -See [`Oliver/README.md`](Oliver/README.md) for full setup instructions. - ---- - -## Projects - -| Project | Firmware | Description | -|---|---|---| -| [block_height](projects/block_height/) | Single Encoder | Block height from encoder rotation via trigonometry or polynomial fit | -| [Oliver](Oliver/) | Master + Slave | Wireless multi-encoder system (ESP32C6 master + ESP32C3 slaves) | - ---- - -## Repository Structure - -``` -Esp_Encoder/ -├── firmware/ -│ ├── single_encoder/ -│ │ └── single_encoder.ino # Single ESP → BLE to PC -│ ├── dual_encoder/ -│ │ └── dual_encoder.ino # Single ESP reading 2 Encoders → BLE to PC -│ ├── master/ -│ │ └── master.ino # ESP32C6 master — aggregates slaves, sends BLE -│ └── slave/ -│ └── slave.ino # ESP32C3 slave — reads encoder, replies via ESP-NOW -│ -├── projects/ -│ └── block_height/ # Block height measurement Python scripts -│ -├── Oliver/ # Multi-encoder project (firmware + Python) -│ ├── master/master.ino # (copy of firmware/master) -│ ├── slave/slave.ino # (copy of firmware/slave) -│ ├── oliver.py # Python API for BLE communication -│ ├── oliver_raw.py # Raw BLE data script -│ └── README.md -│ -├── Datasheets/ -│ └── AS5047D.pdf -├── requirements.txt -├── setup.sh -└── README.md -``` - ---- - -## How It Works - -### Ultra-Precision Sampling Algorithm - -All projects use the same AS5047D reading algorithm: - -1. **4,096 raw SPI reads**, split into 16 blocks of 256 samples -2. **Robust mean per block** — discard samples > 1.5 LSB from mean, re-average the rest -3. **Median of 16 block means** — rejects any block corrupted by radio bursts -4. **Convert to degrees**: `angle = (counts × 360) / 16384` - -### Single-Encoder BLE Data Format - -The single encoder uses the **same 7-field format as Oliver master** for protocol compatibility: - -``` -|M0:,,,,,, -``` - -Example: `5|M0:1669900,5,38,1823,0,0,0` - -| Field | Description | -|---|---| -| `packetIdx` | Global packet counter (increments per READ) | -| `angle` | Encoder angle × 10000 as integer (e.g. `1669900` = 166.9900°) | -| `pkt` | Same as packetIdx (per-encoder index) | -| `agc` | Automatic gain control (0–255) | -| `mag` | CORDIC magnitude (field strength) | -| `magl / magh / cof` | Diagnostic flags (0 or 1) | - -**BLE Commands:** - -| Command | Description | -|---|---| -| `READ` | Request one on-demand encoder reading | -| `ZERO` | Set current position as zero reference | - -### Multi-Encoder (Oliver) BLE Data Format - -``` -|M0:,,,,,,|S0:...|S1:... -``` - -See [`Oliver/README.md`](Oliver/README.md) for full protocol details. - ---- - -## Getting Started - -```bash -./setup.sh -source .venv/bin/activate -``` - -## License - -MIT - ---- - -**Author:** Swaraj Dangare +# ESP Encoder + +A collection of ESP32-based encoder measurement projects using the AS5047D 14-bit magnetic rotary encoder. + +Each project lives in `projects/` with its own Python scripts. All projects share firmware templates from `firmware/`. + +--- + +## Firmware Templates + +| Template | Location | Use When | +|---|---|---| +| **Single Encoder** | [`firmware/single_encoder/`](firmware/single_encoder/) | One ESP reads one encoder, sends directly to PC via BLE | +| **Dual Encoder** | [`firmware/dual_encoder/`](firmware/dual_encoder/) | One ESP reads two encoders on same SPI bus, sends to PC via BLE | +| **Master** | [`firmware/master/`](firmware/master/) | ESP32C6 — aggregates encoder data from slaves, sends to PC via BLE | +| **Slave** | [`firmware/slave/`](firmware/slave/) | ESP32C3 — reads one encoder, responds to master over ESP-NOW | + +### Flashing a Single-Encoder Project + +1. Open `firmware/single_encoder/single_encoder.ino` in Arduino IDE +2. Edit the config block at the top: + ```cpp + #define ESP_NAME "YOUR_DEVICE_NAME" + #define SERVICE_UUID "4fafc201-..." + #define CHARACTERISTIC_UUID "beb5483e-..." + ``` +3. Select board (XIAO ESP32C3 or ESP32C6) and upload + +### Flashing a Multi-Encoder Project (Master + Slave) + +See [`Oliver/README.md`](Oliver/README.md) for full setup instructions. + +--- + +## Projects + +| Project | Firmware | Description | +|---|---|---| +| [block_height](projects/block_height/) | Single Encoder | Block height from encoder rotation via trigonometry or polynomial fit | +| [Oliver](Oliver/) | Master + Slave | Wireless multi-encoder system (ESP32C6 master + ESP32C3 slaves) | + +--- + +## Repository Structure + +``` +Esp_Encoder/ +├── firmware/ +│ ├── single_encoder/ +│ │ └── single_encoder.ino # Single ESP → BLE to PC +│ ├── dual_encoder/ +│ │ └── dual_encoder.ino # Single ESP reading 2 Encoders → BLE to PC +│ ├── master/ +│ │ └── master.ino # ESP32C6 master — aggregates slaves, sends BLE +│ └── slave/ +│ └── slave.ino # ESP32C3 slave — reads encoder, replies via ESP-NOW +│ +├── projects/ +│ └── block_height/ # Block height measurement Python scripts +│ +├── Oliver/ # Multi-encoder project (firmware + Python) +│ ├── master/master.ino # (copy of firmware/master) +│ ├── slave/slave.ino # (copy of firmware/slave) +│ ├── oliver.py # Python API for BLE communication +│ ├── oliver_raw.py # Raw BLE data script +│ └── README.md +│ +├── Datasheets/ +│ └── AS5047D.pdf +├── requirements.txt +├── setup.sh +└── README.md +``` + +--- + +## How It Works + +### Ultra-Precision Sampling Algorithm + +All projects use the same AS5047D reading algorithm: + +1. **4,096 raw SPI reads**, split into 16 blocks of 256 samples +2. **Robust mean per block** — discard samples > 1.5 LSB from mean, re-average the rest +3. **Median of 16 block means** — rejects any block corrupted by radio bursts +4. **Convert to degrees**: `angle = (counts × 360) / 16384` + +### Single-Encoder BLE Data Format + +The single encoder uses the **same 7-field format as Oliver master** for protocol compatibility: + +``` +|M0:,,,,,, +``` + +Example: `5|M0:1669900,5,38,1823,0,0,0` + +| Field | Description | +|---|---| +| `packetIdx` | Global packet counter (increments per READ) | +| `angle` | Encoder angle × 10000 as integer (e.g. `1669900` = 166.9900°) | +| `pkt` | Same as packetIdx (per-encoder index) | +| `agc` | Automatic gain control (0–255) | +| `mag` | CORDIC magnitude (field strength) | +| `magl / magh / cof` | Diagnostic flags (0 or 1) | + +**BLE Commands:** + +| Command | Description | +|---|---| +| `READ` | Request one on-demand encoder reading | +| `ZERO` | Set current position as zero reference | + +### Multi-Encoder (Oliver) BLE Data Format + +``` +|M0:,,,,,,|S0:...|S1:... +``` + +See [`Oliver/README.md`](Oliver/README.md) for full protocol details. + +--- + +## Getting Started + +```bash +./setup.sh +source .venv/bin/activate +``` + +## License + +MIT + +--- + +**Author:** Swaraj Dangare diff --git a/firmware/16_bit_encoder/16_bit_encoder.ino b/firmware/16_bit_encoder/16_bit_encoder.ino index a57f75f..af613ec 100644 --- a/firmware/16_bit_encoder/16_bit_encoder.ino +++ b/firmware/16_bit_encoder/16_bit_encoder.ino @@ -1,445 +1,476 @@ -/** - * ============================================================ - * AEAT-8800-Q24 — 16-bit Absolute Magnetic Rotary Encoder - * Board : Seeed Studio XIAO ESP32-C6 hi - * - * ── DUAL PROTOCOL ──────────────────────────────────────────── - * • SSI (SSI_SPI_SEL = HIGH) — reads real-time absolute position - * • SPI (SSI_SPI_SEL = LOW) — reads / writes configuration registers - * - * ── PIN MAPPING ────────────────────────────────────────────── - * Encoder Pin │ Pin Name │ GPIO │ Role - * ────────────┼───────────────┼───────┼────────────────────────────────── - * Pin 21 │ SSI_SPI_SEL │ GPIO21│ HIGH = SSI mode / LOW = SPI mode - * Pin 10 │ SCL / CLK │ GPIO19│ Shared clock (SCK) - * Pin 11 │ NSL / DIN │ GPIO18│ SSI enable (NSL) / SPI data-in (MOSI) - * Pin 12 │ DO / DOUT │ GPIO20│ Data output from encoder (MISO) - * ──────────────────────────────────────────────────────────── - * - * ── SSI READ SEQUENCE ──────────────────────────────────────── - * CLK idles HIGH, NSL idles HIGH. - * 1. Pull NSL LOW → encoder latches current angle into shift-reg - * 2. Toggle CLK (HIGH→LOW→HIGH) × 18: - * Bits [17:2] = 16-bit absolute position (MSB first) - * Bit [1] = MHi (magnet too close) - * Bit [0] = MLo (magnet too far) - * Data is valid on the rising edge of each CLK cycle. - * 3. Pull NSL HIGH → end of frame - * 4. Wait ≥ monoflop time before next read (~20 µs typical) - * - * ── SPI PROTOCOL ───────────────────────────────────────────── - * SPI_MODE3 (CPOL=1, CPHA=1), ≤ 1 MHz - * Read cmd : 0b10_AAAAAA (8-bit) → dummy byte → 8-bit reply - * Write cmd : 0b01_AAAAAA (8-bit) → data byte - * - * ── REGISTER MAP ───────────────────────────────────────────── - * 0x00 CustReserve0 0x04 CustConfig0 - * 0x01 CustReserve1 0x05 CPR_Set1 - * 0x02 ZeroPos_L 0x06 CPR_Set2 - * 0x03 ZeroPos_H 0x07 Resolution (bits[1:0]: 00=10b…11=16b) - * 0x10 Lock 0x11 ProgCust - * - * ── SERIAL COMMANDS ────────────────────────────────────────── - * p / P — Print current absolute position (SSI, one-shot) - * c / C — Continuous SSI position stream (toggle on/off) - * s / S — Dump all SPI config registers - * r / R — Read single register: r e.g. "r 07" - * w / W — Write register: w e.g. "w 10 AB" - * u / U — Unlock config registers (write 0xAB → REG_LOCK) - * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow regs) - * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! - * h / H — Print this help - * - * Author : Swaraj Dangare - * ============================================================ - */ - -#include - -// ─── Pin Definitions ────────────────────────────────────────────────────────── -// GPIO numbers match the user's pin table exactly. -#define PIN_SEL D4 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI -#define PIN_SEL1 D3 -#define PIN_CLK D5 // SCL / CLK : shared clock -#define PIN_NSL D10 // NSL / DIN : SSI enable / SPI MOSI -#define PIN_DO D9 // DO / DOUT : data from encoder / SPI MISO - -// ─── SSI Settings ───────────────────────────────────────────────────────────── -// Bit-banged; half-period determines SSI clock speed. -// 5 µs half-period → ~100 kHz SSI clock (datasheet max ~1 MHz) -#define SSI_HALF_PERIOD_US 5 -#define SSI_TOTAL_BITS 18 // 16 position + MHi + MLo - -// ─── SPI Settings ───────────────────────────────────────────────────────────── -// SPI_MODE3: CPOL=1 (idle high), CPHA=1 (sample on 2nd / rising edge) -SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); - -// ─── Register Addresses ─────────────────────────────────────────────────────── -#define REG_CUST_RESERVE_0 0x00 -#define REG_CUST_RESERVE_1 0x01 -#define REG_ZERO_POS_L 0x02 -#define REG_ZERO_POS_H 0x03 -#define REG_CUST_CONFIG_0 0x04 -#define REG_CPR_SET1 0x05 -#define REG_CPR_SET2 0x06 -#define REG_RESOLUTION 0x07 -#define REG_LOCK 0x10 -#define REG_PROG_CUST 0x11 - -// ─── Command / Key Bytes ────────────────────────────────────────────────────── -#define CMD_READ 0x80 // 0b10xxxxxx -#define CMD_WRITE 0x40 // 0b01xxxxxx -#define UNLOCK_KEY 0xAB // Unlock config writes -#define PROG_KEY 0xA1 // Burn OTP - -// Resolution field (REG_RESOLUTION bits[1:0]) -#define RES_10BIT 0x00 -#define RES_12BIT 0x01 -#define RES_14BIT 0x02 -#define RES_16BIT 0x03 - -// ─── SSI Frame ─────────────────────────────────────────────────────────────── -// Declared here (global scope) so Arduino's auto-prototype generator -// can see the type before it emits prototypes for ssiReadPosition() etc. -struct SSIFrame { - uint16_t position; // absolute angle, 0–65535 (16-bit) - bool mhi; // magnet too close - bool mlo; // magnet too far -}; - -// ─── State ──────────────────────────────────────────────────────────────────── -static bool g_streaming = false; // continuous SSI stream active -static uint32_t g_lastStream = 0; // millis of last stream per print - -// ─── Mode Switching ─────────────────────────────────────────────────────────── - -/** Enter SSI mode: SEL HIGH, let CLK and NSL settle HIGH. */ -static void enterSSI() { - SPI.endTransaction(); // release hardware SPI bus - // Re-assert GPIO control of the shared pins - pinMode(PIN_CLK, OUTPUT); - pinMode(PIN_NSL, OUTPUT); - pinMode(PIN_DO, INPUT); - digitalWrite(PIN_CLK, HIGH); - digitalWrite(PIN_NSL, HIGH); - digitalWrite(PIN_SEL, HIGH); - delayMicroseconds(2); -} - -/** Enter SPI mode: SEL LOW, hardware SPI takes over CLK and MOSI. */ -static void enterSPI() { - digitalWrite(PIN_SEL, LOW); - delayMicroseconds(2); - SPI.beginTransaction(spiCfg); -} - -static void exitSPI() { - SPI.endTransaction(); - digitalWrite(PIN_SEL, HIGH); // back to SSI idle - delayMicroseconds(2); -} - -// ─── SSI Read ───────────────────────────────────────────────────────────────── - -/** Read 18 bits via bit-banged SSI (16-bit position + MHi + MLo). */ - -SSIFrame ssiReadPosition() { - enterSSI(); - - uint32_t raw = 0; - - // Pull NSL LOW → encoder latches position into shift register - digitalWrite(PIN_NSL, LOW); - delayMicroseconds(SSI_HALF_PERIOD_US); - - for (int i = 0; i < SSI_TOTAL_BITS; i++) { - // Falling edge — encoder shifts next bit onto DO - digitalWrite(PIN_CLK, LOW); - delayMicroseconds(SSI_HALF_PERIOD_US); - - // Rising edge — read the bit - digitalWrite(PIN_CLK, HIGH); - raw = (raw << 1) | (digitalRead(PIN_DO) ? 1u : 0u); - delayMicroseconds(SSI_HALF_PERIOD_US); - } - - // End of frame: NSL HIGH - digitalWrite(PIN_NSL, HIGH); - delayMicroseconds(20); // monoflop recovery time - - SSIFrame f; - f.mlo = (raw >> 0) & 0x01; - f.mhi = (raw >> 1) & 0x01; - f.position = (uint16_t)((raw >> 2) & 0xFFFF); - return f; -} - -// ─── SPI Register Helpers ───────────────────────────────────────────────────── - -uint8_t spiReadReg(uint8_t addr) { - enterSPI(); - SPI.transfer(CMD_READ | (addr & 0x3F)); - uint8_t val = SPI.transfer(0xFF); - exitSPI(); - delayMicroseconds(5); - return val; -} - -void spiWriteReg(uint8_t addr, uint8_t data) { - enterSPI(); - SPI.transfer(CMD_WRITE | (addr & 0x3F)); - SPI.transfer(data); - exitSPI(); - delayMicroseconds(5); -} - -void unlockRegisters() { - spiWriteReg(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); -} - -uint16_t readHardwareZero() { - uint8_t lo = spiReadReg(REG_ZERO_POS_L); - uint8_t hi = spiReadReg(REG_ZERO_POS_H); - return ((uint16_t)hi << 8) | lo; -} - -void writeHardwareZero(uint16_t zp) { - unlockRegisters(); - spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); - spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); -} - -// ─── Helpers ───────────────────────────────────────────────────────────────── - -const char* resolutionStr(uint8_t regVal) { - switch (regVal & 0x03) { - case RES_10BIT: return "10-bit (1024 cpr)"; - case RES_12BIT: return "12-bit (4096 cpr)"; - case RES_14BIT: return "14-bit (16384 cpr)"; - case RES_16BIT: return "16-bit (65536 cpr)"; - default: return "unknown"; - } -} - -const char* magnetStatus(bool mhi, bool mlo) { - if (mhi) return "TOO CLOSE"; - if (mlo) return "TOO FAR"; - return "OK"; -} - -// ─── Serial Output Helpers ──────────────────────────────────────────────────── - -void printPosition(const SSIFrame& f) { - double deg = (f.position / 65536.0) * 360.0; - Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%s%s%s\n", - f.position, deg, - magnetStatus(f.mhi, f.mlo), - f.mhi ? " (MHi)" : "", - f.mlo ? " (MLo)" : ""); -} - -void printAllRegisters() { - Serial.println(F("\n╔══════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); - Serial.println(F("╠══════════════════════════════════════════════╣")); - - struct { uint8_t addr; const char* name; } regs[] = { - { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, - { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, - { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, - { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, - { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, - { REG_CPR_SET1, "CPR_Set1 (0x05)" }, - { REG_CPR_SET2, "CPR_Set2 (0x06)" }, - { REG_RESOLUTION, "Resolution (0x07)" }, - { REG_LOCK, "Lock (0x10)" }, - }; - - for (auto& r : regs) { - uint8_t val = spiReadReg(r.addr); - Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); - } - - uint16_t zp = readHardwareZero(); - uint8_t resReg = spiReadReg(REG_RESOLUTION); - Serial.println(F("╠══════════════════════════════════════════════╣")); - Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, (zp / 65536.0) * 360.0); - Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); - Serial.println(F("╚══════════════════════════════════════════════╝\n")); -} - -void printHelp() { - Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); - Serial.println(F("╠══════════════════════════════════════════════════════╣")); - Serial.println(F("║ p — Read position once (SSI) ║")); - Serial.println(F("║ c — Toggle continuous position stream ║")); - Serial.println(F("║ s — Dump all SPI config registers ║")); - Serial.println(F("║ r — Read register at hex addr (e.g. r 07) ║")); - Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); - Serial.println(F("║ u — Unlock config registers (0xAB→Lock) ║")); - Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); - Serial.println(F("║ b — Burn shadow regs to OTP ⚠ IRREVERSIBLE ║")); - Serial.println(F("║ h — Show this help ║")); - Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); -} - -// ─── Command Parser ─────────────────────────────────────────────────────────── - -void handleSerial() { - if (!Serial.available()) return; - - // Read full line - String line = Serial.readStringUntil('\n'); - line.trim(); - if (line.length() == 0) return; - - char cmd = (char)tolower((unsigned char)line[0]); - - switch (cmd) { - - // ── Position read (SSI) ──────────────────────────────────────────────── - case 'p': { - SSIFrame f = ssiReadPosition(); - printPosition(f); - break; - } - - // ── Continuous stream toggle ─────────────────────────────────────────── - case 'c': - g_streaming = !g_streaming; - Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); - break; - - // ── Register dump (SPI) ─────────────────────────────────────────────── - case 's': - printAllRegisters(); - break; - - // ── Read single register "r " ────────────────────────────── - case 'r': { - if (line.length() < 3) { - Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); - break; - } - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); - uint8_t val = spiReadReg(addr); - Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); - break; - } - - // ── Write single register "w " ────────────────── - case 'w': { - if (line.length() < 5) { - Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); - break; - } - char* ptr = nullptr; - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); - uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); - spiWriteReg(addr, val); - uint8_t rb = spiReadReg(addr); - Serial.printf("[SPI-WR] Reg 0x%02X ← 0x%02X | Readback: 0x%02X %s\n", - addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); - break; - } - - // ── Unlock registers ────────────────────────────────────────────────── - case 'u': - unlockRegisters(); - Serial.println(F("[SPI] Config registers unlocked (0xAB written to Lock reg)")); - break; - - // ── Set zero position ───────────────────────────────────────────────── - case 'z': { - Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); - writeHardwareZero(0x0000); - uint16_t rb = readHardwareZero(); - Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, - rb == 0x0000 ? "OK" : "MISMATCH!"); - break; - } - - // ── Burn OTP ⚠ IRREVERSIBLE ───────────────────────────────────────── - case 'b': { - // Require explicit confirmation by sending "burn" as the line - if (!line.equalsIgnoreCase("burn")) { - Serial.println(F("[WARN] ⚠ OTP BURN is IRREVERSIBLE!")); - Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); - break; - } - Serial.println(F("[OTP] Unlocking and burning shadow regs to OTP...")); - unlockRegisters(); - spiWriteReg(REG_PROG_CUST, PROG_KEY); - Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); - break; - } - - // ── Help ────────────────────────────────────────────────────────────── - case 'h': - default: - printHelp(); - break; - } -} - -// ─── Setup ──────────────────────────────────────────────────────────────────── - -void setup() { - Serial.begin(115200); - delay(300); - - // GPIO init — SSI pins, all idle HIGH - pinMode(PIN_SEL, OUTPUT); - // pinMode(PIN_SEL1, OUTPUT); - pinMode(PIN_CLK, OUTPUT); - pinMode(PIN_NSL, OUTPUT); - pinMode(PIN_DO, INPUT); - digitalWrite(PIN_SEL, HIGH); // SSI mode at boot - // digitalWrite(PIN_SEL1, LOW); - digitalWrite(PIN_CLK, HIGH); - digitalWrite(PIN_NSL, HIGH); - - // Hardware SPI init (pins will be re-claimed by SPI.beginTransaction when needed) - SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); // SCK, MISO, MOSI, no CS - - delay(50); // t_POR encoder stabilisation - - // ── Boot banner ────────────────────────────────────────────────────────── - Serial.println(F("\n╔════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - Serial.println(F("║ SSI_SPI_SEL=21 CLK=19 NSL/DIN=18 DO=20 ║")); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - - // Quick SSI position read - SSIFrame f = ssiReadPosition(); - double deg = (f.position / 65536.0) * 360.0; - Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", f.position, deg); - Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); - - // Quick SPI config read - uint8_t resReg = spiReadReg(REG_RESOLUTION); - uint16_t zp = readHardwareZero(); - Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); - Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", - zp, (zp / 65536.0) * 360.0); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - Serial.println(F("║ Type 'h' for command help ║")); - Serial.println(F("╚════════════════════════════════════════════════════╝\n")); -} - -// ─── Main Loop ──────────────────────────────────────────────────────────────── - -void loop() { - // Handle serial commands (full-line parser) - handleSerial(); - - // Continuous SSI position stream (100 ms interval) - if (g_streaming && (millis() - g_lastStream >= 100)) { - g_lastStream = millis(); - SSIFrame f = ssiReadPosition(); - printPosition(f); - } -} +/** + * ============================================================ + * AEAT-8800-Q24 — 16-bit Absolute Magnetic Rotary Encoder + * Board : Seeed Studio XIAO ESP32-C6 hi + * + * ── DUAL PROTOCOL ──────────────────────────────────────────── + * • SSI (SSI_SPI_SEL = HIGH) — reads real-time absolute position + * • SPI (SSI_SPI_SEL = LOW) — reads / writes configuration registers + * + * ── PIN MAPPING ────────────────────────────────────────────── + * Encoder Pin │ Pin Name │ GPIO │ Role + * ────────────┼───────────────┼───────┼────────────────────────────────── + * Pin 21 │ SSI_SPI_SEL │ GPIO21│ HIGH = SSI mode / LOW = SPI mode + * Pin 10 │ SCL / CLK │ GPIO19│ Shared clock (SCK) + * Pin 11 │ NSL / DIN │ GPIO18│ SSI enable (NSL) / SPI data-in (MOSI) + * Pin 12 │ DO / DOUT │ GPIO20│ Data output from encoder (MISO) + * ──────────────────────────────────────────────────────────── + * + * ── SSI READ SEQUENCE ──────────────────────────────────────── + * CLK idles HIGH, NSL idles HIGH. + * 1. Pull NSL LOW → encoder latches current angle into shift-reg + * 2. Toggle CLK (HIGH→LOW→HIGH) × 18: + * Bits [17:2] = 16-bit absolute position (MSB first) + * Bit [1] = MHi (magnet too close) + * Bit [0] = MLo (magnet too far) + * Data is valid on the rising edge of each CLK cycle. + * 3. Pull NSL HIGH → end of frame + * 4. Wait ≥ monoflop time before next read (~20 µs typical) + * + * ── SPI PROTOCOL ───────────────────────────────────────────── + * SPI_MODE3 (CPOL=1, CPHA=1), ≤ 1 MHz + * Read cmd : 0b10_AAAAAA (8-bit) → dummy byte → 8-bit reply + * Write cmd : 0b01_AAAAAA (8-bit) → data byte + * + * ── REGISTER MAP ───────────────────────────────────────────── + * 0x00 CustReserve0 0x04 CustConfig0 + * 0x01 CustReserve1 0x05 CPR_Set1 + * 0x02 ZeroPos_L 0x06 CPR_Set2 + * 0x03 ZeroPos_H 0x07 Resolution (bits[1:0]: 00=10b…11=16b) + * 0x10 Lock 0x11 ProgCust + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p / P — Print current absolute position (SSI, one-shot) + * c / C — Continuous SSI position stream (toggle on/off) + * s / S — Dump all SPI config registers + * r / R — Read single register: r e.g. "r 07" + * w / W — Write register: w e.g. "w 10 AB" + * u / U — Unlock config registers (write 0xAB → REG_LOCK) + * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow regs) + * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! + * h / H — Print this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +#include + +// ─── Pin Definitions +// ────────────────────────────────────────────────────────── GPIO numbers match +// the user's pin table exactly. +#define PIN_SEL D7 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI +#define PIN_CLK D8 // SCL / CLK : shared clock +#define PIN_NSL D10 // NSL / DIN : SSI enable / SPI MOSI +#define PIN_DO D9 // DO / DOUT : data from encoder / SPI MISO + +// ─── SSI Settings +// ───────────────────────────────────────────────────────────── Bit-banged; +// half-period determines SSI clock speed. 5 µs half-period → ~100 kHz SSI clock +// (datasheet max ~1 MHz) +#define SSI_HALF_PERIOD_US 5 +#define SSI_TOTAL_BITS 18 // 16 position + MHi + MLo + +// ─── SPI Settings +// ───────────────────────────────────────────────────────────── SPI_MODE3: +// CPOL=1 (idle high), CPHA=1 (sample on 2nd / rising edge) +SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); + +// ─── Register Addresses +// ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Command / Key Bytes +// ────────────────────────────────────────────────────── +#define CMD_READ 0x80 // 0b10xxxxxx +#define CMD_WRITE 0x40 // 0b01xxxxxx +#define UNLOCK_KEY 0xAB // Unlock config writes +#define PROG_KEY 0xA1 // Burn OTP + +// Resolution field (REG_RESOLUTION bits[1:0]) +#define RES_10BIT 0x00 +#define RES_12BIT 0x01 +#define RES_14BIT 0x02 +#define RES_16BIT 0x03 + +// ─── SSI Frame ─────────────────────────────────────────────────────────────── +// Declared here (global scope) so Arduino's auto-prototype generator +// can see the type before it emits prototypes for ssiReadPosition() etc. +struct SSIFrame { + uint16_t position; // absolute angle, 0–65535 (16-bit) + bool mhi; // magnet too close + bool mlo; // magnet too far +}; + +// ─── State +// ──────────────────────────────────────────────────────────────────── +static bool g_streaming = false; // continuous SSI stream active +static uint32_t g_lastStream = 0; // millis of last stream per print + +// ─── Mode Switching +// ─────────────────────────────────────────────────────────── + +/** Enter SSI mode: SEL HIGH, let CLK and NSL settle HIGH. */ +static void enterSSI() { + SPI.endTransaction(); // release hardware SPI bus + // Re-assert GPIO control of the shared pins + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); +} + +/** Enter SPI mode: SEL LOW, hardware SPI takes over CLK and MOSI. */ +static void enterSPI() { + digitalWrite(PIN_SEL, LOW); + delayMicroseconds(2); + SPI.beginTransaction(spiCfg); +} + +static void exitSPI() { + SPI.endTransaction(); + digitalWrite(PIN_SEL, HIGH); // back to SSI idle + delayMicroseconds(2); +} + +// ─── SSI Read +// ───────────────────────────────────────────────────────────────── + +/** Read 18 bits via bit-banged SSI (16-bit position + MHi + MLo). */ + +SSIFrame ssiReadPosition() { + enterSSI(); + + uint32_t raw = 0; + + // Pull NSL LOW → encoder latches position into shift register + digitalWrite(PIN_NSL, LOW); + delayMicroseconds(SSI_HALF_PERIOD_US); + + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + // Falling edge — encoder shifts next bit onto DO + digitalWrite(PIN_CLK, LOW); + delayMicroseconds(SSI_HALF_PERIOD_US); + + // Rising edge — read the bit + digitalWrite(PIN_CLK, HIGH); + raw = (raw << 1) | (digitalRead(PIN_DO) ? 1u : 0u); + delayMicroseconds(SSI_HALF_PERIOD_US); + } + + // End of frame: NSL HIGH + digitalWrite(PIN_NSL, HIGH); + delayMicroseconds(20); // monoflop recovery time + + SSIFrame f; + f.mlo = (raw >> 0) & 0x01; + f.mhi = (raw >> 1) & 0x01; + f.position = (uint16_t)((raw >> 2) & 0xFFFF); + return f; +} + +// ─── SPI Register Helpers +// ───────────────────────────────────────────────────── + +uint8_t spiReadReg(uint8_t addr) { + enterSPI(); + SPI.transfer(CMD_READ | (addr & 0x3F)); + uint8_t val = SPI.transfer(0xFF); + exitSPI(); + delayMicroseconds(5); + return val; +} + +void spiWriteReg(uint8_t addr, uint8_t data) { + enterSPI(); + SPI.transfer(CMD_WRITE | (addr & 0x3F)); + SPI.transfer(data); + exitSPI(); + delayMicroseconds(5); +} + +void unlockRegisters() { + spiWriteReg(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); +} + +uint16_t readHardwareZero() { + uint8_t lo = spiReadReg(REG_ZERO_POS_L); + uint8_t hi = spiReadReg(REG_ZERO_POS_H); + return ((uint16_t)hi << 8) | lo; +} + +void writeHardwareZero(uint16_t zp) { + unlockRegisters(); + spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); + spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +const char *resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case RES_10BIT: + return "10-bit (1024 cpr)"; + case RES_12BIT: + return "12-bit (4096 cpr)"; + case RES_14BIT: + return "14-bit (16384 cpr)"; + case RES_16BIT: + return "16-bit (65536 cpr)"; + default: + return "unknown"; + } +} + +const char *magnetStatus(bool mhi, bool mlo) { + if (mhi) + return "TOO CLOSE"; + if (mlo) + return "TOO FAR"; + return "OK"; +} + +// ─── Serial Output Helpers +// ──────────────────────────────────────────────────── + +void printPosition(const SSIFrame &f) { + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%s%s%s\n", f.position, + deg, magnetStatus(f.mhi, f.mlo), f.mhi ? " (MHi)" : "", + f.mlo ? " (MLo)" : ""); +} + +void printAllRegisters() { + Serial.println(F("\n╔══════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { + uint8_t addr; + const char *name; + } regs[] = { + {REG_CUST_RESERVE_0, "CustReserve0 (0x00)"}, + {REG_CUST_RESERVE_1, "CustReserve1 (0x01)"}, + {REG_ZERO_POS_L, "ZeroPos_L (0x02)"}, + {REG_ZERO_POS_H, "ZeroPos_H (0x03)"}, + {REG_CUST_CONFIG_0, "CustConfig0 (0x04)"}, + {REG_CPR_SET1, "CPR_Set1 (0x05)"}, + {REG_CPR_SET2, "CPR_Set2 (0x06)"}, + {REG_RESOLUTION, "Resolution (0x07)"}, + {REG_LOCK, "Lock (0x10)"}, + }; + + for (auto &r : regs) { + uint8_t val = spiReadReg(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); + } + + uint16_t zp = readHardwareZero(); + uint8_t resReg = spiReadReg(REG_RESOLUTION); + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, + (zp / 65536.0) * 360.0); + Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +void printHelp() { + Serial.println( + F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read position once (SSI) ║")); + Serial.println( + F("║ c — Toggle continuous position stream ║")); + Serial.println( + F("║ s — Dump all SPI config registers ║")); + Serial.println(F("║ r — Read register at hex addr (e.g. r 07) ║")); + Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); + Serial.println(F("║ u — Unlock config registers (0xAB→Lock) ║")); + Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); + Serial.println(F("║ b — Burn shadow regs to OTP ⚠ IRREVERSIBLE ║")); + Serial.println( + F("║ h — Show this help ║")); + Serial.println( + F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Command Parser +// ─────────────────────────────────────────────────────────── + +void handleSerial() { + if (!Serial.available()) + return; + + // Read full line + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) + return; + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Position read (SSI) ──────────────────────────────────────────────── + case 'p': { + SSIFrame f = ssiReadPosition(); + printPosition(f); + break; + } + + // ── Continuous stream toggle ─────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Register dump (SPI) ─────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ────────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = spiReadReg(addr); + Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); + break; + } + + // ── Write single register "w " ────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char *ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + spiWriteReg(addr, val); + uint8_t rb = spiReadReg(addr); + Serial.printf("[SPI-WR] Reg 0x%02X ← 0x%02X | Readback: 0x%02X %s\n", + addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + unlockRegisters(); + Serial.println( + F("[SPI] Config registers unlocked (0xAB written to Lock reg)")); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); + writeHardwareZero(0x0000); + uint16_t rb = readHardwareZero(); + Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, + rb == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn OTP ⚠ IRREVERSIBLE ───────────────────────────────────────── + case 'b': { + // Require explicit confirmation by sending "burn" as the line + if (!line.equalsIgnoreCase("burn")) { + Serial.println(F("[WARN] ⚠ OTP BURN is IRREVERSIBLE!")); + Serial.println( + F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + } + Serial.println(F("[OTP] Unlocking and burning shadow regs to OTP...")); + unlockRegisters(); + spiWriteReg(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + break; + } + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup +// ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // GPIO init — SSI pins, all idle HIGH + pinMode(PIN_SEL, OUTPUT); + // pinMode(PIN_SEL1, OUTPUT); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_SEL, HIGH); // SSI mode at boot + // digitalWrite(PIN_SEL1, LOW); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + + // Hardware SPI init (pins will be re-claimed by SPI.beginTransaction when + // needed) + SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); // SCK, MISO, MOSI, no CS + + delay(50); // t_POR encoder stabilisation + + // ── Boot banner ────────────────────────────────────────────────────────── + Serial.println(F("\n╔════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ SSI_SPI_SEL=21 CLK=19 NSL/DIN=18 DO=20 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // Quick SSI position read + SSIFrame f = ssiReadPosition(); + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", f.position, deg); + Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); + + // Quick SPI config read + uint8_t resReg = spiReadReg(REG_RESOLUTION); + uint16_t zp = readHardwareZero(); + Serial.printf("║ Resolution : %s\n", resolutionStr(resReg)); + Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", zp, + (zp / 65536.0) * 360.0); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ Type 'h' for command help ║")); + Serial.println(F("╚════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop +// ──────────────────────────────────────────────────────────────── + +void loop() { + // Handle serial commands (full-line parser) + handleSerial(); + + // Continuous SSI position stream (100 ms interval) + if (g_streaming && (millis() - g_lastStream >= 100)) { + g_lastStream = millis(); + SSIFrame f = ssiReadPosition(); + printPosition(f); + } +} diff --git a/firmware/16_bit_encoder/test.h b/firmware/16_bit_encoder/test.h index 052e7b7..1bc1f3f 100644 --- a/firmware/16_bit_encoder/test.h +++ b/firmware/16_bit_encoder/test.h @@ -1,584 +1,584 @@ -/** - * ============================================================ - * AEAT-8800-Q24 — 16-bit Absolute Magnetic Rotary Encoder - * Board : Seeed Studio XIAO ESP32-C6 - * - * ── DUAL PROTOCOL ──────────────────────────────────────────── - * • SSI (SSI_SPI_SEL = HIGH) — reads real-time absolute position - * • SPI (SSI_SPI_SEL = LOW) — reads / writes configuration registers - * NOTE: Position data is ONLY available via SSI. The SPI interface - * is exclusively for OTP / configuration registers (no angle register). - * - * ── PIN MAPPING ────────────────────────────────────────────── - * Encoder Pin │ Pin Name │ GPIO │ Role - * ────────────┼───────────────┼───────┼────────────────────────────────── - * Pin 21 │ SSI_SPI_SEL │ GPIO21│ HIGH = SSI mode / LOW = SPI mode - * Pin 10 │ SCL / CLK │ GPIO19│ Shared clock (SCK) - * Pin 11 │ NSL / DIN │ GPIO18│ SSI enable (NSL) / SPI data-in (MOSI) - * Pin 12 │ DO / DOUT │ GPIO20│ Data output from encoder (MISO) - * ──────────────────────────────────────────────────────────── - * - * ── SSI READ SEQUENCE (16-bit mode — 20 clocks total) ──────── - * CLK idles HIGH, NSL idles HIGH, SSI_SPI_SEL HIGH. - * 1. Pull NSL LOW → encoder latches current angle into shift-reg - * 2. Wait ≥ 300 ns (tREQ) - * 3. Toggle CLK (HIGH→LOW→HIGH) × 20 — read DO on falling edge: - * Bits [19:4] = 16-bit absolute position D[15]..D[0] (MSB first) - * Bit [3] = Ready (1 = encoder output valid) - * Bit [2] = MHi (magnet too close) - * Bit [1] = MLo (magnet too far) - * Bit [0] = Parity (even parity over all 20 bits) - * 4. Pull NSL HIGH → end of frame - * 5. Wait ≥ 200 ns (tNSLH) before next read - * - * ── SPI PROTOCOL ───────────────────────────────────────────── - * SPI_MODE3 (CPOL=1, CPHA=1), ≤ 1 MHz - * Read cmd : 0b10_AAAAAA (8-bit) → dummy byte → 8-bit reply - * Write cmd : 0b01_AAAAAA (8-bit) → data byte - * - * ── REGISTER MAP (corrected from datasheet) ────────────────── - * Addr Register Notes - * 0x00 CustReserve0 User programmable - * 0x01 CustReserve1 User programmable - * 0x02 ZeroPos_L Zero Reset Position [7:0] - * 0x03 ZeroPos_H Zero Reset Position [15:8] - * 0x04 CustConfig0 UVW/PWM/I-width/UVW-pole config - * 0x05 CPR_Set1 CPR setting [7:4] / Hysteresis [3:0] - * 0x06 CPR_Set2 bit[7]=Dir, bit[6]=ZeroLatency, - * bits[5:4]=AbsResolution (00=16-bit, DEFAULT), - * bits[3:0]=CPR_Set2 - * 0x10 Lock Write 0xAB to unlock shadow regs - * 0x11 ProgCustRsv Write 0xA1 → OTP regs 0x00-0x01 - * 0x12 ProgZero Write 0xA2 → OTP regs 0x02-0x03 - * 0x13 ProgConfig Write 0xA3 → OTP regs 0x04-0x06 - * - * ── SERIAL COMMANDS ────────────────────────────────────────── - * p / P — Read position once (single fast SSI read) - * m / M — Precision measurement (4096 SSI samples, filtered) - * c / C — Toggle continuous precision stream (~3-4 readings/sec) - * s / S — Dump all SPI config registers - * r / R — Read register: r e.g. "r 06" - * w / W — Write register: w e.g. "w 10 AB" - * u / U — Unlock config registers (write 0xAB → Lock reg) - * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow) - * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! - * h / H — Print this help - * - * Author : Swaraj Dangare - * ============================================================ - */ - - #include - #include - #include "soc/gpio_reg.h" // GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG, GPIO_IN_REG - - // ─── Pin Definitions ────────────────────────────────────────────────────────── - #define PIN_SEL D7 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI (GPIO21) - #define PIN_CLK D10 // SCL / CLK : shared clock (GPIO19) - #define PIN_NSL D8 // NSL / DIN : SSI enable / SPI MOSI (GPIO18) - #define PIN_DO D9 // DO / DOUT : data from encoder (GPIO20) - - // ─── Fast GPIO Bit Masks ────────────────────────────────────────────────────── - // These GPIO numbers must match the GPIO column in the pin table above. - // Using direct register writes avoids digitalWrite() function call overhead - // in the inner SSI bit-bang loop. - #define GPIO_CLK_BIT (1UL << 19) // D10 = GPIO19 - #define GPIO_NSL_BIT (1UL << 18) // D8 = GPIO18 - #define GPIO_DO_BIT (1UL << 20) // D9 = GPIO20 - - #define FAST_CLK_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_CLK_BIT) - #define FAST_CLK_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_CLK_BIT) - #define FAST_NSL_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_NSL_BIT) - #define FAST_NSL_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_NSL_BIT) - #define FAST_READ_DO() ((REG_READ(GPIO_IN_REG) >> 20) & 1u) - - // ─── SSI Settings ───────────────────────────────────────────────────────────── - // Half-period of 1 us → ~500 kHz SSI clock. Datasheet max is 10 MHz. - // 20 bits for 16-bit mode: 16 position + Ready + MHi + MLo + Parity. - #define SSI_HALF_PERIOD_US 5 - #define SSI_TOTAL_BITS 20 - - // ─── SPI Settings ───────────────────────────────────────────────────────────── - // SPI_MODE3: CPOL=1 (idle HIGH), CPHA=1 (sample on rising edge) - SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); - - // ─── Register Addresses ─────────────────────────────────────────────────────── - #define REG_CUST_RESERVE_0 0x00 - #define REG_CUST_RESERVE_1 0x01 - #define REG_ZERO_POS_L 0x02 - #define REG_ZERO_POS_H 0x03 - #define REG_CUST_CONFIG_0 0x04 - #define REG_CPR_SET1 0x05 - #define REG_CPR_SET2 0x06 // bits[5:4] = absolute resolution - #define REG_LOCK 0x10 - #define REG_PROG_CUST_RSV 0x11 - #define REG_PROG_ZERO 0x12 - #define REG_PROG_CONFIG 0x13 - - // ─── Command / Key Bytes ────────────────────────────────────────────────────── - #define CMD_READ 0x80 // 0b10xxxxxx - #define CMD_WRITE 0x40 // 0b01xxxxxx - #define UNLOCK_KEY 0xAB - - // ─── Absolute Resolution (REG_CPR_SET2 bits [5:4]) ─────────────────────────── - // 00 = 16-bit (65536 cpr) — factory default; what we want - // 01 = 14-bit (16384 cpr) - // 10 = 12-bit (4096 cpr) - // 11 = 10-bit (1024 cpr) - #define RES_SHIFT 4 - #define RES_MASK 0x03 - - // ─── Filtering Constants ────────────────────────────────────────────────────── - #define NUM_BLOCKS 16 - #define SAMPLES_PER_BLOCK 256 - // TOTAL_SAMPLES = 4096 - - // ─── SSI Frame ─────────────────────────────────────────────────────────────── - struct SSIFrame { - uint16_t position; // absolute angle 0–65535 (16-bit) - bool ready; // 1 = encoder output is valid - bool mhi; // magnet too close - bool mlo; // magnet too far - bool parityOk; // even parity check passed - }; - - // ─── State ──────────────────────────────────────────────────────────────────── - static bool g_streaming = false; - - // ─── Mode Switching ─────────────────────────────────────────────────────────── - - static void enterSSI() { - SPI.endTransaction(); - pinMode(PIN_CLK, OUTPUT); - pinMode(PIN_NSL, OUTPUT); - pinMode(PIN_DO, INPUT); - digitalWrite(PIN_CLK, HIGH); - digitalWrite(PIN_NSL, HIGH); - digitalWrite(PIN_SEL, HIGH); - delayMicroseconds(2); - } - - static void enterSPI() { - digitalWrite(PIN_SEL, LOW); - delayMicroseconds(2); - SPI.beginTransaction(spiCfg); - } - - static void exitSPI() { - SPI.endTransaction(); - digitalWrite(PIN_SEL, HIGH); - delayMicroseconds(2); - } - - // ─── SSI Raw Read ───────────────────────────────────────────────────────────── - // Reads 20 bits via fast bit-banged SSI using direct GPIO register access. - // Assumes SSI mode is already active (enterSSI() called before this). - // Data is read on the falling edge of CLK per datasheet recommendation. - // Returns raw 20-bit frame: - // bits [19:4] = position D[15:0] - // bit [3] = Ready - // bit [2] = MHi - // bit [1] = MLo - // bit [0] = Parity - - static uint32_t ssiReadRaw() { - uint32_t raw = 0; - - FAST_NSL_LOW(); - delayMicroseconds(SSI_HALF_PERIOD_US); // tREQ >= 300 ns - - for (int i = 0; i < SSI_TOTAL_BITS; i++) { - FAST_CLK_LOW(); - delayMicroseconds(SSI_HALF_PERIOD_US); // data valid on falling edge - raw = (raw << 1) | FAST_READ_DO(); - FAST_CLK_HIGH(); - delayMicroseconds(SSI_HALF_PERIOD_US); - } - - FAST_NSL_HIGH(); - delayMicroseconds(SSI_HALF_PERIOD_US); // tNSLH >= 200 ns - return raw; - } - - // ─── Parity & Frame Parsing ─────────────────────────────────────────────────── - - // Even parity: XOR of all 20 bits must be 0. - static inline bool checkParity20(uint32_t raw) { - return __builtin_parity(raw & 0xFFFFF) == 0; - } - - static SSIFrame parseSSIFrame(uint32_t raw) { - SSIFrame f; - f.position = (uint16_t)((raw >> 4) & 0xFFFF); - f.ready = (raw >> 3) & 1u; - f.mhi = (raw >> 2) & 1u; - f.mlo = (raw >> 1) & 1u; - f.parityOk = checkParity20(raw); - return f; - } - - // ─── Single-Shot SSI Read ───────────────────────────────────────────────────── - - SSIFrame ssiReadPosition() { - enterSSI(); - return parseSSIFrame(ssiReadRaw()); - } - - // ─── Filtering ──────────────────────────────────────────────────────────────── - - // Robust mean: average of samples within 1.5 LSB of the initial mean. - // Outliers (noise spikes > 1.5 counts away) are discarded before re-averaging. - static double getRobustMean(const uint16_t* samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) sum += samples[i]; - double initMean = sum / size; - - double rSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - if (abs((double)samples[i] - initMean) < 1.5) { - rSum += samples[i]; - count++; - } - } - return (count > 0) ? rSum / count : initMean; - } - - static double getMedian(double* values, int size) { - std::sort(values, values + size); - return values[size / 2]; - } - - // 4096-sample precision read: - // 16 blocks x 256 samples -> robust mean per block -> median of block means. - // Any sample that fails parity or has Ready=0 is silently discarded and - // retried so every block always accumulates exactly 256 valid counts. - // Returns angle in degrees (0.0 to 360.0). - double getUltraPrecisionReading() { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - enterSSI(); - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; ) { - uint32_t raw = ssiReadRaw(); - if (!checkParity20(raw) || !((raw >> 3) & 1u)) { - continue; // bad sample — retry this slot - } - blockSamples[s] = (uint16_t)((raw >> 4) & 0xFFFF); - s++; - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - } - - return (getMedian(blockMeans, NUM_BLOCKS) * 360.0) / 65536.0; - } - - // ─── SPI Register Helpers ───────────────────────────────────────────────────── - - uint8_t spiReadReg(uint8_t addr) { - enterSPI(); - SPI.transfer(CMD_READ | (addr & 0x3F)); - uint8_t val = SPI.transfer(0xFF); - exitSPI(); - delayMicroseconds(5); - return val; - } - - void spiWriteReg(uint8_t addr, uint8_t data) { - enterSPI(); - SPI.transfer(CMD_WRITE | (addr & 0x3F)); - SPI.transfer(data); - exitSPI(); - delayMicroseconds(5); - } - - void unlockRegisters() { - spiWriteReg(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - } - - uint16_t readHardwareZero() { - uint8_t lo = spiReadReg(REG_ZERO_POS_L); - uint8_t hi = spiReadReg(REG_ZERO_POS_H); - return ((uint16_t)hi << 8) | lo; - } - - void writeHardwareZero(uint16_t zp) { - unlockRegisters(); - spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); - spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); - } - - // ─── Resolution Helpers (REG_CPR_SET2 0x06 bits [5:4]) ─────────────────────── - - static uint8_t getResolutionField() { - return (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; - } - - static const char* resolutionStr(uint8_t field) { - switch (field & RES_MASK) { - case 0x00: return "16-bit (65536 cpr)"; - case 0x01: return "14-bit (16384 cpr)"; - case 0x02: return "12-bit (4096 cpr)"; - case 0x03: return "10-bit (1024 cpr)"; - default: return "unknown"; - } - } - - // ─── Helpers ────────────────────────────────────────────────────────────────── - - static const char* magnetStatus(bool mhi, bool mlo) { - if (mhi) return "TOO CLOSE"; - if (mlo) return "TOO FAR"; - return "OK"; - } - - // ─── Serial Output Helpers ──────────────────────────────────────────────────── - - void printPosition(const SSIFrame& f) { - double deg = (f.position / 65536.0) * 360.0; - Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%-9s Ready=%u Parity=%s\n", - f.position, deg, - magnetStatus(f.mhi, f.mlo), - (uint8_t)f.ready, - f.parityOk ? "OK" : "FAIL"); - } - - void printAllRegisters() { - Serial.println(F("\n╔══════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); - Serial.println(F("╠══════════════════════════════════════════════╣")); - - struct { uint8_t addr; const char* name; } regs[] = { - { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, - { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, - { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, - { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, - { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, - { REG_CPR_SET1, "CPR_Set1 (0x05)" }, - { REG_CPR_SET2, "CPR_Set2 (0x06)" }, - { REG_LOCK, "Lock (0x10)" }, - }; - - for (auto& r : regs) { - uint8_t val = spiReadReg(r.addr); - Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); - } - - uint16_t zp = readHardwareZero(); - uint8_t res = getResolutionField(); - Serial.println(F("╠══════════════════════════════════════════════╣")); - Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, (zp / 65536.0) * 360.0); - Serial.printf("║ Resolution : %s\n", resolutionStr(res)); - Serial.printf("║ [0x06][5:4] : 0b%u%u (raw field)\n", - (res >> 1) & 1u, res & 1u); - Serial.println(F("╚══════════════════════════════════════════════╝\n")); - } - - void printHelp() { - Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); - Serial.println(F("╠══════════════════════════════════════════════════════╣")); - Serial.println(F("║ p — Read position once (single SSI read) ║")); - Serial.println(F("║ m — Precision reading (4096 SSI samples) ║")); - Serial.println(F("║ c — Toggle continuous precision stream ║")); - Serial.println(F("║ s — Dump all SPI config registers ║")); - Serial.println(F("║ r — Read register at hex addr (e.g. r 06) ║")); - Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); - Serial.println(F("║ u — Unlock config registers (0xAB -> Lock) ║")); - Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); - Serial.println(F("║ burn — Burn shadow regs to OTP WARNING: ║")); - Serial.println(F("║ Type exactly 'burn' + Enter ║")); - Serial.println(F("║ h — Show this help ║")); - Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); - } - - // ─── Command Parser ─────────────────────────────────────────────────────────── - - void handleSerial() { - if (!Serial.available()) return; - - String line = Serial.readStringUntil('\n'); - line.trim(); - if (line.length() == 0) return; - - char cmd = (char)tolower((unsigned char)line[0]); - - switch (cmd) { - - // ── Single fast SSI read ─────────────────────────────────────────────── - case 'p': { - SSIFrame f = ssiReadPosition(); - printPosition(f); - break; - } - - // ── Precision measurement (4096 SSI samples, filtered) ──────────────── - case 'm': { - Serial.println(F("[PREC] Measuring (4096 SSI samples)...")); - uint32_t t0 = millis(); - double deg = getUltraPrecisionReading(); - Serial.printf("[PREC] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); - break; - } - - // ── Continuous precision stream toggle ──────────────────────────────── - case 'c': - g_streaming = !g_streaming; - Serial.printf("[INFO] Continuous precision stream %s\n", - g_streaming ? "ON (each sample = 4096 reads)" : "OFF"); - break; - - // ── Register dump ───────────────────────────────────────────────────── - case 's': - printAllRegisters(); - break; - - // ── Read register "r " ────────────────────────────────────────── - case 'r': { - if (line.length() < 3) { - Serial.println(F("[ERR] Usage: r e.g. 'r 06'")); - break; - } - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); - uint8_t val = spiReadReg(addr); - Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); - break; - } - - // ── Write register "w " ─────────────────────────────────── - case 'w': { - if (line.length() < 5) { - Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); - break; - } - char* ptr = nullptr; - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); - uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); - spiWriteReg(addr, val); - uint8_t rb = spiReadReg(addr); - Serial.printf("[SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", - addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); - break; - } - - // ── Unlock registers ────────────────────────────────────────────────── - case 'u': - unlockRegisters(); - Serial.println(F("[SPI] Registers unlocked (0xAB written to Lock reg 0x10)")); - break; - - // ── Set zero position ───────────────────────────────────────────────── - case 'z': { - Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); - writeHardwareZero(0x0000); - uint16_t rb = readHardwareZero(); - Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, - rb == 0x0000 ? "OK" : "MISMATCH!"); - break; - } - - // ── OTP burn — requires typing "burn" in full ───────────────────────── - case 'b': { - if (!line.equalsIgnoreCase("burn")) { - Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); - Serial.println(F("[WARN] Type exactly 'burn' + Enter to confirm.")); - break; - } - Serial.println(F("[OTP] Unlocking registers...")); - unlockRegisters(); - Serial.println(F("[OTP] Burning Customer Config OTP (regs 0x04-0x06)...")); - spiWriteReg(REG_PROG_CONFIG, 0xA3); - delayMicroseconds(200); - Serial.println(F("[OTP] Burning Zero Position OTP (regs 0x02-0x03)...")); - spiWriteReg(REG_PROG_ZERO, 0xA2); - delayMicroseconds(200); - Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); - break; - } - - // ── Help ────────────────────────────────────────────────────────────── - case 'h': - default: - printHelp(); - break; - } - } - - // ─── Setup ──────────────────────────────────────────────────────────────────── - - void setup() { - Serial.begin(115200); - delay(300); - - // GPIO init — idle state: CLK HIGH, NSL HIGH, SEL HIGH (SSI mode) - pinMode(PIN_SEL, OUTPUT); - pinMode(PIN_CLK, OUTPUT); - pinMode(PIN_NSL, OUTPUT); - pinMode(PIN_DO, INPUT); - digitalWrite(PIN_SEL, HIGH); - digitalWrite(PIN_CLK, HIGH); - digitalWrite(PIN_NSL, HIGH); - - // Hardware SPI init (SCK=PIN_CLK, MISO=PIN_DO, MOSI=PIN_NSL, no CS) - SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); - - delay(50); // t_POR encoder power-on stabilisation - - // ── Boot banner ────────────────────────────────────────────────────────── - Serial.println(F("\n╔════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - Serial.println(F("║ SEL=GPIO21 CLK=GPIO19 NSL=GPIO18 DO=GPIO20 ║")); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - - // Boot SSI read — single fast sample for startup status - SSIFrame f = ssiReadPosition(); - double bootDeg = (f.position / 65536.0) * 360.0; - Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", - f.position, bootDeg); - Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); - Serial.printf("║ Encoder Ready : %s\n", f.ready ? "YES" : "NO"); - Serial.printf("║ Frame Parity : %s\n", f.parityOk ? "OK" : "FAIL"); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - - // ── Auto-verify 16-bit resolution (REG_CPR_SET2 bits [5:4]) ───────────── - uint8_t reg06 = spiReadReg(REG_CPR_SET2); - uint8_t resField = (reg06 >> RES_SHIFT) & RES_MASK; - Serial.printf("║ Resolution : %s\n", resolutionStr(resField)); - - if (resField != 0x00) { - Serial.println(F("╠════════════════════════════════════════════════════╣")); - Serial.println(F("║ [WARN] Not 16-bit! Correcting shadow register... ║")); - unlockRegisters(); - spiWriteReg(REG_CPR_SET2, reg06 & (uint8_t)~(RES_MASK << RES_SHIFT)); - uint8_t verify = (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; - Serial.printf("║ Resolution now: %s\n", resolutionStr(verify)); - Serial.println(F("║ Shadow updated. Type 'burn' to make permanent. ║")); - } else { - Serial.println(F("║ 16-bit confirmed (factory default). ║")); - } - - uint16_t zp = readHardwareZero(); - Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", - zp, (zp / 65536.0) * 360.0); - Serial.println(F("╠════════════════════════════════════════════════════╣")); - Serial.println(F("║ Type 'h' for command help ║")); - Serial.println(F("╚════════════════════════════════════════════════════╝\n")); - } - - // ─── Main Loop ──────────────────────────────────────────────────────────────── - - void loop() { - handleSerial(); - - // Precision stream: the ~250 ms measurement time is the natural rate limiter. - if (g_streaming) { - uint32_t t0 = millis(); - double deg = getUltraPrecisionReading(); - Serial.printf("[STREAM] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); - } - } +/** + * ============================================================ + * AEAT-8800-Q24 — 16-bit Absolute Magnetic Rotary Encoder + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── DUAL PROTOCOL ──────────────────────────────────────────── + * • SSI (SSI_SPI_SEL = HIGH) — reads real-time absolute position + * • SPI (SSI_SPI_SEL = LOW) — reads / writes configuration registers + * NOTE: Position data is ONLY available via SSI. The SPI interface + * is exclusively for OTP / configuration registers (no angle register). + * + * ── PIN MAPPING ────────────────────────────────────────────── + * Encoder Pin │ Pin Name │ GPIO │ Role + * ────────────┼───────────────┼───────┼────────────────────────────────── + * Pin 21 │ SSI_SPI_SEL │ GPIO21│ HIGH = SSI mode / LOW = SPI mode + * Pin 10 │ SCL / CLK │ GPIO19│ Shared clock (SCK) + * Pin 11 │ NSL / DIN │ GPIO18│ SSI enable (NSL) / SPI data-in (MOSI) + * Pin 12 │ DO / DOUT │ GPIO20│ Data output from encoder (MISO) + * ──────────────────────────────────────────────────────────── + * + * ── SSI READ SEQUENCE (16-bit mode — 20 clocks total) ──────── + * CLK idles HIGH, NSL idles HIGH, SSI_SPI_SEL HIGH. + * 1. Pull NSL LOW → encoder latches current angle into shift-reg + * 2. Wait ≥ 300 ns (tREQ) + * 3. Toggle CLK (HIGH→LOW→HIGH) × 20 — read DO on falling edge: + * Bits [19:4] = 16-bit absolute position D[15]..D[0] (MSB first) + * Bit [3] = Ready (1 = encoder output valid) + * Bit [2] = MHi (magnet too close) + * Bit [1] = MLo (magnet too far) + * Bit [0] = Parity (even parity over all 20 bits) + * 4. Pull NSL HIGH → end of frame + * 5. Wait ≥ 200 ns (tNSLH) before next read + * + * ── SPI PROTOCOL ───────────────────────────────────────────── + * SPI_MODE3 (CPOL=1, CPHA=1), ≤ 1 MHz + * Read cmd : 0b10_AAAAAA (8-bit) → dummy byte → 8-bit reply + * Write cmd : 0b01_AAAAAA (8-bit) → data byte + * + * ── REGISTER MAP (corrected from datasheet) ────────────────── + * Addr Register Notes + * 0x00 CustReserve0 User programmable + * 0x01 CustReserve1 User programmable + * 0x02 ZeroPos_L Zero Reset Position [7:0] + * 0x03 ZeroPos_H Zero Reset Position [15:8] + * 0x04 CustConfig0 UVW/PWM/I-width/UVW-pole config + * 0x05 CPR_Set1 CPR setting [7:4] / Hysteresis [3:0] + * 0x06 CPR_Set2 bit[7]=Dir, bit[6]=ZeroLatency, + * bits[5:4]=AbsResolution (00=16-bit, DEFAULT), + * bits[3:0]=CPR_Set2 + * 0x10 Lock Write 0xAB to unlock shadow regs + * 0x11 ProgCustRsv Write 0xA1 → OTP regs 0x00-0x01 + * 0x12 ProgZero Write 0xA2 → OTP regs 0x02-0x03 + * 0x13 ProgConfig Write 0xA3 → OTP regs 0x04-0x06 + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p / P — Read position once (single fast SSI read) + * m / M — Precision measurement (4096 SSI samples, filtered) + * c / C — Toggle continuous precision stream (~3-4 readings/sec) + * s / S — Dump all SPI config registers + * r / R — Read register: r e.g. "r 06" + * w / W — Write register: w e.g. "w 10 AB" + * u / U — Unlock config registers (write 0xAB → Lock reg) + * z / Z — Set hardware zero (writes 0x0000 → ZeroPos shadow) + * b / B — Burn shadow regs to OTP ⚠ ONE-TIME, IRREVERSIBLE! + * h / H — Print this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + + #include + #include + #include "soc/gpio_reg.h" // GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG, GPIO_IN_REG + + // ─── Pin Definitions ────────────────────────────────────────────────────────── + #define PIN_SEL D7 // SSI_SPI_SEL : HIGH = SSI, LOW = SPI (GPIO21) + #define PIN_CLK D10 // SCL / CLK : shared clock (GPIO19) + #define PIN_NSL D8 // NSL / DIN : SSI enable / SPI MOSI (GPIO18) + #define PIN_DO D9 // DO / DOUT : data from encoder (GPIO20) + + // ─── Fast GPIO Bit Masks ────────────────────────────────────────────────────── + // These GPIO numbers must match the GPIO column in the pin table above. + // Using direct register writes avoids digitalWrite() function call overhead + // in the inner SSI bit-bang loop. + #define GPIO_CLK_BIT (1UL << 19) // D10 = GPIO19 + #define GPIO_NSL_BIT (1UL << 18) // D8 = GPIO18 + #define GPIO_DO_BIT (1UL << 20) // D9 = GPIO20 + + #define FAST_CLK_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_CLK_BIT) + #define FAST_CLK_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_CLK_BIT) + #define FAST_NSL_HIGH() REG_WRITE(GPIO_OUT_W1TS_REG, GPIO_NSL_BIT) + #define FAST_NSL_LOW() REG_WRITE(GPIO_OUT_W1TC_REG, GPIO_NSL_BIT) + #define FAST_READ_DO() ((REG_READ(GPIO_IN_REG) >> 20) & 1u) + + // ─── SSI Settings ───────────────────────────────────────────────────────────── + // Half-period of 1 us → ~500 kHz SSI clock. Datasheet max is 10 MHz. + // 20 bits for 16-bit mode: 16 position + Ready + MHi + MLo + Parity. + #define SSI_HALF_PERIOD_US 5 + #define SSI_TOTAL_BITS 20 + + // ─── SPI Settings ───────────────────────────────────────────────────────────── + // SPI_MODE3: CPOL=1 (idle HIGH), CPHA=1 (sample on rising edge) + SPISettings spiCfg(500000UL, MSBFIRST, SPI_MODE3); + + // ─── Register Addresses ─────────────────────────────────────────────────────── + #define REG_CUST_RESERVE_0 0x00 + #define REG_CUST_RESERVE_1 0x01 + #define REG_ZERO_POS_L 0x02 + #define REG_ZERO_POS_H 0x03 + #define REG_CUST_CONFIG_0 0x04 + #define REG_CPR_SET1 0x05 + #define REG_CPR_SET2 0x06 // bits[5:4] = absolute resolution + #define REG_LOCK 0x10 + #define REG_PROG_CUST_RSV 0x11 + #define REG_PROG_ZERO 0x12 + #define REG_PROG_CONFIG 0x13 + + // ─── Command / Key Bytes ────────────────────────────────────────────────────── + #define CMD_READ 0x80 // 0b10xxxxxx + #define CMD_WRITE 0x40 // 0b01xxxxxx + #define UNLOCK_KEY 0xAB + + // ─── Absolute Resolution (REG_CPR_SET2 bits [5:4]) ─────────────────────────── + // 00 = 16-bit (65536 cpr) — factory default; what we want + // 01 = 14-bit (16384 cpr) + // 10 = 12-bit (4096 cpr) + // 11 = 10-bit (1024 cpr) + #define RES_SHIFT 4 + #define RES_MASK 0x03 + + // ─── Filtering Constants ────────────────────────────────────────────────────── + #define NUM_BLOCKS 16 + #define SAMPLES_PER_BLOCK 256 + // TOTAL_SAMPLES = 4096 + + // ─── SSI Frame ─────────────────────────────────────────────────────────────── + struct SSIFrame { + uint16_t position; // absolute angle 0–65535 (16-bit) + bool ready; // 1 = encoder output is valid + bool mhi; // magnet too close + bool mlo; // magnet too far + bool parityOk; // even parity check passed + }; + + // ─── State ──────────────────────────────────────────────────────────────────── + static bool g_streaming = false; + + // ─── Mode Switching ─────────────────────────────────────────────────────────── + + static void enterSSI() { + SPI.endTransaction(); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); + } + + static void enterSPI() { + digitalWrite(PIN_SEL, LOW); + delayMicroseconds(2); + SPI.beginTransaction(spiCfg); + } + + static void exitSPI() { + SPI.endTransaction(); + digitalWrite(PIN_SEL, HIGH); + delayMicroseconds(2); + } + + // ─── SSI Raw Read ───────────────────────────────────────────────────────────── + // Reads 20 bits via fast bit-banged SSI using direct GPIO register access. + // Assumes SSI mode is already active (enterSSI() called before this). + // Data is read on the falling edge of CLK per datasheet recommendation. + // Returns raw 20-bit frame: + // bits [19:4] = position D[15:0] + // bit [3] = Ready + // bit [2] = MHi + // bit [1] = MLo + // bit [0] = Parity + + static uint32_t ssiReadRaw() { + uint32_t raw = 0; + + FAST_NSL_LOW(); + delayMicroseconds(SSI_HALF_PERIOD_US); // tREQ >= 300 ns + + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + FAST_CLK_LOW(); + delayMicroseconds(SSI_HALF_PERIOD_US); // data valid on falling edge + raw = (raw << 1) | FAST_READ_DO(); + FAST_CLK_HIGH(); + delayMicroseconds(SSI_HALF_PERIOD_US); + } + + FAST_NSL_HIGH(); + delayMicroseconds(SSI_HALF_PERIOD_US); // tNSLH >= 200 ns + return raw; + } + + // ─── Parity & Frame Parsing ─────────────────────────────────────────────────── + + // Even parity: XOR of all 20 bits must be 0. + static inline bool checkParity20(uint32_t raw) { + return __builtin_parity(raw & 0xFFFFF) == 0; + } + + static SSIFrame parseSSIFrame(uint32_t raw) { + SSIFrame f; + f.position = (uint16_t)((raw >> 4) & 0xFFFF); + f.ready = (raw >> 3) & 1u; + f.mhi = (raw >> 2) & 1u; + f.mlo = (raw >> 1) & 1u; + f.parityOk = checkParity20(raw); + return f; + } + + // ─── Single-Shot SSI Read ───────────────────────────────────────────────────── + + SSIFrame ssiReadPosition() { + enterSSI(); + return parseSSIFrame(ssiReadRaw()); + } + + // ─── Filtering ──────────────────────────────────────────────────────────────── + + // Robust mean: average of samples within 1.5 LSB of the initial mean. + // Outliers (noise spikes > 1.5 counts away) are discarded before re-averaging. + static double getRobustMean(const uint16_t* samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) sum += samples[i]; + double initMean = sum / size; + + double rSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + if (abs((double)samples[i] - initMean) < 1.5) { + rSum += samples[i]; + count++; + } + } + return (count > 0) ? rSum / count : initMean; + } + + static double getMedian(double* values, int size) { + std::sort(values, values + size); + return values[size / 2]; + } + + // 4096-sample precision read: + // 16 blocks x 256 samples -> robust mean per block -> median of block means. + // Any sample that fails parity or has Ready=0 is silently discarded and + // retried so every block always accumulates exactly 256 valid counts. + // Returns angle in degrees (0.0 to 360.0). + double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + enterSSI(); + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; ) { + uint32_t raw = ssiReadRaw(); + if (!checkParity20(raw) || !((raw >> 3) & 1u)) { + continue; // bad sample — retry this slot + } + blockSamples[s] = (uint16_t)((raw >> 4) & 0xFFFF); + s++; + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + } + + return (getMedian(blockMeans, NUM_BLOCKS) * 360.0) / 65536.0; + } + + // ─── SPI Register Helpers ───────────────────────────────────────────────────── + + uint8_t spiReadReg(uint8_t addr) { + enterSPI(); + SPI.transfer(CMD_READ | (addr & 0x3F)); + uint8_t val = SPI.transfer(0xFF); + exitSPI(); + delayMicroseconds(5); + return val; + } + + void spiWriteReg(uint8_t addr, uint8_t data) { + enterSPI(); + SPI.transfer(CMD_WRITE | (addr & 0x3F)); + SPI.transfer(data); + exitSPI(); + delayMicroseconds(5); + } + + void unlockRegisters() { + spiWriteReg(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + } + + uint16_t readHardwareZero() { + uint8_t lo = spiReadReg(REG_ZERO_POS_L); + uint8_t hi = spiReadReg(REG_ZERO_POS_H); + return ((uint16_t)hi << 8) | lo; + } + + void writeHardwareZero(uint16_t zp) { + unlockRegisters(); + spiWriteReg(REG_ZERO_POS_L, zp & 0xFF); + spiWriteReg(REG_ZERO_POS_H, (zp >> 8) & 0xFF); + } + + // ─── Resolution Helpers (REG_CPR_SET2 0x06 bits [5:4]) ─────────────────────── + + static uint8_t getResolutionField() { + return (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; + } + + static const char* resolutionStr(uint8_t field) { + switch (field & RES_MASK) { + case 0x00: return "16-bit (65536 cpr)"; + case 0x01: return "14-bit (16384 cpr)"; + case 0x02: return "12-bit (4096 cpr)"; + case 0x03: return "10-bit (1024 cpr)"; + default: return "unknown"; + } + } + + // ─── Helpers ────────────────────────────────────────────────────────────────── + + static const char* magnetStatus(bool mhi, bool mlo) { + if (mhi) return "TOO CLOSE"; + if (mlo) return "TOO FAR"; + return "OK"; + } + + // ─── Serial Output Helpers ──────────────────────────────────────────────────── + + void printPosition(const SSIFrame& f) { + double deg = (f.position / 65536.0) * 360.0; + Serial.printf("[SSI] Pos=%5u Angle=%8.4f deg Magnet=%-9s Ready=%u Parity=%s\n", + f.position, deg, + magnetStatus(f.mhi, f.mlo), + (uint8_t)f.ready, + f.parityOk ? "OK" : "FAIL"); + } + + void printAllRegisters() { + Serial.println(F("\n╔══════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 — SPI Register Dump ║")); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + for (auto& r : regs) { + uint8_t val = spiReadReg(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u)\n", r.name, val, val); + } + + uint16_t zp = readHardwareZero(); + uint8_t res = getResolutionField(); + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf("║ HW Zero Pos : %5u (%.4f deg)\n", zp, (zp / 65536.0) * 360.0); + Serial.printf("║ Resolution : %s\n", resolutionStr(res)); + Serial.printf("║ [0x06][5:4] : 0b%u%u (raw field)\n", + (res >> 1) & 1u, res & 1u); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); + } + + void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Serial Command Reference ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read position once (single SSI read) ║")); + Serial.println(F("║ m — Precision reading (4096 SSI samples) ║")); + Serial.println(F("║ c — Toggle continuous precision stream ║")); + Serial.println(F("║ s — Dump all SPI config registers ║")); + Serial.println(F("║ r — Read register at hex addr (e.g. r 06) ║")); + Serial.println(F("║ w — Write val to reg (e.g. w 10 AB) ║")); + Serial.println(F("║ u — Unlock config registers (0xAB -> Lock) ║")); + Serial.println(F("║ z — Set zero position = 0x0000 (shadow only) ║")); + Serial.println(F("║ burn — Burn shadow regs to OTP WARNING: ║")); + Serial.println(F("║ Type exactly 'burn' + Enter ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); + } + + // ─── Command Parser ─────────────────────────────────────────────────────────── + + void handleSerial() { + if (!Serial.available()) return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Single fast SSI read ─────────────────────────────────────────────── + case 'p': { + SSIFrame f = ssiReadPosition(); + printPosition(f); + break; + } + + // ── Precision measurement (4096 SSI samples, filtered) ──────────────── + case 'm': { + Serial.println(F("[PREC] Measuring (4096 SSI samples)...")); + uint32_t t0 = millis(); + double deg = getUltraPrecisionReading(); + Serial.printf("[PREC] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); + break; + } + + // ── Continuous precision stream toggle ──────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous precision stream %s\n", + g_streaming ? "ON (each sample = 4096 reads)" : "OFF"); + break; + + // ── Register dump ───────────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read register "r " ────────────────────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 06'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = spiReadReg(addr); + Serial.printf("[SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", addr, val, val); + break; + } + + // ── Write register "w " ─────────────────────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + spiWriteReg(addr, val); + uint8_t rb = spiReadReg(addr); + Serial.printf("[SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + unlockRegisters(); + Serial.println(F("[SPI] Registers unlocked (0xAB written to Lock reg 0x10)")); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + Serial.println(F("[ZERO] Writing 0x0000 to ZeroPos shadow registers...")); + writeHardwareZero(0x0000); + uint16_t rb = readHardwareZero(); + Serial.printf("[ZERO] Readback: 0x%04X — %s\n", rb, + rb == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── OTP burn — requires typing "burn" in full ───────────────────────── + case 'b': { + if (!line.equalsIgnoreCase("burn")) { + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' + Enter to confirm.")); + break; + } + Serial.println(F("[OTP] Unlocking registers...")); + unlockRegisters(); + Serial.println(F("[OTP] Burning Customer Config OTP (regs 0x04-0x06)...")); + spiWriteReg(REG_PROG_CONFIG, 0xA3); + delayMicroseconds(200); + Serial.println(F("[OTP] Burning Zero Position OTP (regs 0x02-0x03)...")); + spiWriteReg(REG_PROG_ZERO, 0xA2); + delayMicroseconds(200); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + break; + } + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } + } + + // ─── Setup ──────────────────────────────────────────────────────────────────── + + void setup() { + Serial.begin(115200); + delay(300); + + // GPIO init — idle state: CLK HIGH, NSL HIGH, SEL HIGH (SSI mode) + pinMode(PIN_SEL, OUTPUT); + pinMode(PIN_CLK, OUTPUT); + pinMode(PIN_NSL, OUTPUT); + pinMode(PIN_DO, INPUT); + digitalWrite(PIN_SEL, HIGH); + digitalWrite(PIN_CLK, HIGH); + digitalWrite(PIN_NSL, HIGH); + + // Hardware SPI init (SCK=PIN_CLK, MISO=PIN_DO, MOSI=PIN_NSL, no CS) + SPI.begin(PIN_CLK, PIN_DO, PIN_NSL, -1); + + delay(50); // t_POR encoder power-on stabilisation + + // ── Boot banner ────────────────────────────────────────────────────────── + Serial.println(F("\n╔════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 | SSI + SPI | XIAO ESP32-C6 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ SEL=GPIO21 CLK=GPIO19 NSL=GPIO18 DO=GPIO20 ║")); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // Boot SSI read — single fast sample for startup status + SSIFrame f = ssiReadPosition(); + double bootDeg = (f.position / 65536.0) * 360.0; + Serial.printf("║ SSI Position : %5u counts (%.4f deg)\n", + f.position, bootDeg); + Serial.printf("║ Magnet Status : %s\n", magnetStatus(f.mhi, f.mlo)); + Serial.printf("║ Encoder Ready : %s\n", f.ready ? "YES" : "NO"); + Serial.printf("║ Frame Parity : %s\n", f.parityOk ? "OK" : "FAIL"); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + + // ── Auto-verify 16-bit resolution (REG_CPR_SET2 bits [5:4]) ───────────── + uint8_t reg06 = spiReadReg(REG_CPR_SET2); + uint8_t resField = (reg06 >> RES_SHIFT) & RES_MASK; + Serial.printf("║ Resolution : %s\n", resolutionStr(resField)); + + if (resField != 0x00) { + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ [WARN] Not 16-bit! Correcting shadow register... ║")); + unlockRegisters(); + spiWriteReg(REG_CPR_SET2, reg06 & (uint8_t)~(RES_MASK << RES_SHIFT)); + uint8_t verify = (spiReadReg(REG_CPR_SET2) >> RES_SHIFT) & RES_MASK; + Serial.printf("║ Resolution now: %s\n", resolutionStr(verify)); + Serial.println(F("║ Shadow updated. Type 'burn' to make permanent. ║")); + } else { + Serial.println(F("║ 16-bit confirmed (factory default). ║")); + } + + uint16_t zp = readHardwareZero(); + Serial.printf("║ HW Zero Pos : %u counts (%.4f deg)\n", + zp, (zp / 65536.0) * 360.0); + Serial.println(F("╠════════════════════════════════════════════════════╣")); + Serial.println(F("║ Type 'h' for command help ║")); + Serial.println(F("╚════════════════════════════════════════════════════╝\n")); + } + + // ─── Main Loop ──────────────────────────────────────────────────────────────── + + void loop() { + handleSerial(); + + // Precision stream: the ~250 ms measurement time is the natural rate limiter. + if (g_streaming) { + uint32_t t0 = millis(); + double deg = getUltraPrecisionReading(); + Serial.printf("[STREAM] Angle=%10.5f deg (%u ms)\n", deg, millis() - t0); + } + } \ No newline at end of file diff --git a/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino b/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino index 70ae247..e6a7a06 100644 --- a/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino +++ b/firmware/dual_aeat8800_independent/dual_aeat8800_independent.ino @@ -1,793 +1,1184 @@ -/** - * ============================================================ - * AEAT-8800-Q24 — Fully Independent Dual Encoder - * Board : Seeed Studio XIAO ESP32-C6 - * - * ── FULLY INDEPENDENT WIRING ───────────────────────────────── - * Every encoder has its own dedicated CLK, DIN/NSL, DO, and SEL. - * No pins are shared between encoders — eliminates all bus - * conflicts and DOUT tri-state contention. - * - * ── DEFAULT PIN ASSIGNMENT ─────────────────────────────────── - * Signal │ Encoder 1 │ Encoder 2 - * ────────────┼─────────────────┼───────────────── - * CLK │ D8 / GPIO19 │ D5 / GPIO23 - * DIN / NSL │ D10 / GPIO18 │ D2 / GPIO2 - * DO / DOUT │ D9 / GPIO20 │ D1 / GPIO1 - * SEL │ D3 / GPIO21 │ D4 / GPIO22 - * - * ── ANTENNA PINS ───────────────────────────────────────────── - * WIFI_ENABLE GPIO3 — LOW = activate RF switch control - * WIFI_ANT_CONFIG GPIO14 — HIGH = select external antenna - * - * ── KEY TIMING (datasheet Fig. 8 & timing table) ───────────── - * Symbol │ Min │ Unit │ Datasheet description - * ──────────┼──────┼──────┼────────────────────────────────────────────── - * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time - * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and - * │ │ │ first SCL falling edge - * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock - * │ │ │ period for an SSI read - * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads - * ──────────┼──────┼──────┼────────────────────────────────────────────── - * Notes (datasheet p.15): - * • CLK = 1 when inactive; DIN = 1 when inactive. - * • CLK must be HIGH when switching between SSI and SPI modes. - * • NSL must be held HIGH for at least 3 ms after power-up before - * the first SSI read. - * • The user is advised to read from the SSI falling edge. - * • 16-bit resolution → 20 total bits (16 pos + Ready + MHi + MLo + Parity) - * All margins use SSI_HALF_US = 5 µs (>> all minimum requirements). - * - * ── BOOT WIZARD ────────────────────────────────────────────── - * On every boot the firmware prompts over Serial (115200 baud): - * 1. How many encoders are connected [1/2] - * 2. Which slot (only if 1 encoder) - * 3. Use default pins, or enter custom GPIO numbers - * Only the configured encoders are initialised. - * - * ── SERIAL COMMANDS ────────────────────────────────────────── - * p — Read position (SSI, one-shot, enabled encoders) - * c — Toggle continuous stream (both enabled, 100 ms) - * 1 / 2 — Select active encoder for SPI commands - * s — Dump SPI config registers (active encoder) - * r — Read register at hex address e.g. "r 07" - * w — Write register e.g. "w 10 AB" - * u — Unlock config registers - * z — Set zero position = 0x0000 (shadow only) - * burn — Burn OTP ⚠ IRREVERSIBLE (type "burn" exactly) - * h — Show this help - * - * Author : Swaraj Dangare - * ============================================================ - */ - -// ─── Antenna Pins ───────────────────────────────────────────────────────────── -#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) -#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) - -// ─── Default Encoder Pins ───────────────────────────────────────────────────── -#define DEFAULT_ENC1_CLK D8 // GPIO19 -#define DEFAULT_ENC1_DIN D10 // GPIO18 -#define DEFAULT_ENC1_DOUT D9 // GPIO20 -#define DEFAULT_ENC1_SEL D3 // GPIO21 - -#define DEFAULT_ENC2_CLK D5 // GPIO23 -#define DEFAULT_ENC2_DIN D2 // GPIO2 -#define DEFAULT_ENC2_DOUT D1 // GPIO1 -#define DEFAULT_ENC2_SEL D4 // GPIO22 - -// ─── Register Addresses ─────────────────────────────────────────────────────── -#define REG_CUST_RESERVE_0 0x00 -#define REG_CUST_RESERVE_1 0x01 -#define REG_ZERO_POS_L 0x02 -#define REG_ZERO_POS_H 0x03 -#define REG_CUST_CONFIG_0 0x04 -#define REG_CPR_SET1 0x05 -#define REG_CPR_SET2 0x06 -#define REG_RESOLUTION 0x07 -#define REG_VCC 0x0A -#define REG_LOCK 0x10 -#define REG_PROG_CUST 0x11 - -// ─── Register Values ────────────────────────────────────────────────────────── -#define UNLOCK_KEY 0xAB -#define PROG_KEY 0xA1 -#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V -#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair -#define VAL_CPR1 0x40 // 0x05 CPR1=0b0100, no hysteresis -#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF - -// ─── SSI Timing ─────────────────────────────────────────────────────────────── -// Timing constants from AEAT-8800-Q24 datasheet timing table (Fig. 8): -// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL falling edge -// tREQ2 >= 200 ns NSL low time after rising edge of last clock period for an SSI read -// tNSLH >= 200 ns NSL high time between 2 successive SSI reads -// tsw(SEL) >= 1 µs SSI_SPI_SEL switch time -// SSI_HALF_US = 5 µs gives 7–25× margin over minimums. -// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. -#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity -#define SSI_HALF_US 5 // 5 µs half-period → ~100 kHz SSI clock -#define SSI_MONOFLOP_US 20 // monoflop recovery after NSL HIGH - -// ─── Encoder Config ─────────────────────────────────────────────────────────── - -struct EncoderConfig { - uint8_t pinCLK; - uint8_t pinDIN; - uint8_t pinDOUT; - uint8_t pinSEL; -}; - -// ─── AEAT8800 Class ─────────────────────────────────────────────────────────── -// Each instance is completely self-contained: CLK, DIN, DOUT, and SEL are -// all per-instance. No pins are shared with any other instance. - -class AEAT8800 { -public: - AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) - : _clk(clk), _din(din), _dout(dout), _sel(sel) {} - - /** Assert SEL HIGH → SSI mode. */ - void select(); - - /** Assert SEL LOW → SPI/idle mode. */ - void deselect(); - - /** Bit-bang one SPI register read using this encoder's CLK and DIN. */ - uint8_t spiRead(uint8_t addr); - - /** Bit-bang one SPI register write using this encoder's CLK and DIN. */ - void spiWrite(uint8_t addr, uint8_t data); - - /** Unlock and write all required OTP shadow registers with readback verify. - * Returns true on success. Failure is non-fatal; SSI reads still work. */ - bool configure(); - - /** Perform one 20-bit SSI read. Stores position in pos (0–65535). - * Precondition: select() must have been called. - * Returns false if Ready=0 or parity fails. */ - bool readAngleRaw(uint16_t &pos); - - /** Read angle in degrees [0, 360). Returns -1.0f on error. */ - float readAngleDegrees(); - -private: - uint8_t _clk, _din, _dout, _sel; -}; - -// ─── select / deselect ──────────────────────────────────────────────────────── - -void AEAT8800::select() { - // CLK must be HIGH before SEL transition (datasheet p.15, p.21) - digitalWrite(_clk, HIGH); - digitalWrite(_sel, HIGH); - delayMicroseconds(1); // tsw(SEL) >= 1 µs -} - -void AEAT8800::deselect() { - digitalWrite(_sel, LOW); - delayMicroseconds(1); -} - -// ─── SPI Write ──────────────────────────────────────────────────────────────── - -void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { - int prevSel = digitalRead(_sel); - - digitalWrite(_clk, HIGH); - digitalWrite(_sel, LOW); - delayMicroseconds(1); // tsw(SEL) >= 1 µs - - // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first - uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); - for (int i = 15; i >= 0; i--) { - digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK fall - digitalWrite(_clk, LOW); // falling edge - delayMicroseconds(SSI_HALF_US); - digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN - delayMicroseconds(SSI_HALF_US); - } - - digitalWrite(_din, HIGH); // DIN back to idle HIGH - digitalWrite(_clk, HIGH); // CLK must be HIGH before SEL change - digitalWrite(_sel, prevSel); -} - -// ─── SPI Read ───────────────────────────────────────────────────────────────── - -uint8_t AEAT8800::spiRead(uint8_t addr) { - int prevSel = digitalRead(_sel); - - digitalWrite(_clk, HIGH); - digitalWrite(_sel, LOW); - delayMicroseconds(1); // tsw(SEL) >= 1 µs - - // 8-bit command: opcode 0b10 (2b) + addr (6b) - uint8_t cmd = (0b10u << 6) | (addr & 0x3F); - for (int i = 7; i >= 0; i--) { - digitalWrite(_din, (cmd >> i) & 1u); - digitalWrite(_clk, LOW); - delayMicroseconds(SSI_HALF_US); - digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN - delayMicroseconds(SSI_HALF_US); - } - digitalWrite(_din, HIGH); // release DIN; encoder drives DOUT for reply - - uint8_t result = 0; - for (int i = 0; i < 8; i++) { - digitalWrite(_clk, LOW); // falling edge - delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall - digitalWrite(_clk, HIGH); // rising edge — master captures DOUT - result = (result << 1) | (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) - delayMicroseconds(SSI_HALF_US); - } - - digitalWrite(_clk, HIGH); - digitalWrite(_din, HIGH); - digitalWrite(_sel, prevSel); - return result; -} - -// ─── Configure ──────────────────────────────────────────────────────────────── - -bool AEAT8800::configure() { - // Unlock must be the very first SPI write (datasheet p.10 note 3) - spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - - struct RegTarget { uint8_t addr, val; const char* name; }; - static const RegTarget targets[] = { - { REG_VCC, VAL_VCC, "0x0A (VCC)" }, - { REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)" }, - { REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)" }, - { REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)" }, - }; - - for (const auto& r : targets) { - spiWrite(r.addr, r.val); - delayMicroseconds(5); - uint8_t rb = spiRead(r.addr); - if (rb != r.val) { - Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", - r.name, r.val, rb); - return false; - } - } - - deselect(); - return true; -} - -// ─── SSI Read ───────────────────────────────────────────────────────────────── - -bool AEAT8800::readAngleRaw(uint16_t &pos) { - // Precondition: select() already called — SEL is HIGH, encoder in SSI mode - - // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) - digitalWrite(_clk, HIGH); - digitalWrite(_din, HIGH); - delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 successive SSI reads - - // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) - digitalWrite(_din, LOW); - delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL falling edge and first SCL falling edge - - uint32_t raw = 0; - for (int i = 0; i < SSI_TOTAL_BITS; i++) { - digitalWrite(_clk, LOW); // SCL falling edge — encoder shifts next bit onto DO - delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet (data stable after CLK fall) - raw = (raw << 1) | (uint32_t)digitalRead(_dout); // sample DO after falling edge (datasheet Fig. 8, p.15) - digitalWrite(_clk, HIGH); // SCL rising edge - delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) - } - - delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising edge of last clock period for an SSI read - - // End of frame: NSL HIGH → load mode (encoder resumes tracking position) - digitalWrite(_din, HIGH); - delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes internal load cycle - - // Unpack 20-bit frame (datasheet Fig. 8–9) - uint8_t parity = (raw >> 0) & 0x1u; - uint8_t mlo = (raw >> 1) & 0x1u; - uint8_t mhi = (raw >> 2) & 0x1u; - uint8_t ready = (raw >> 3) & 0x1u; - uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); - - (void)parity; // checked implicitly via __builtin_popcount below - - if (!ready) { - Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", (unsigned)raw); - return false; - } - if (mhi) Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); - if (mlo) Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); - - // Even parity: total 1-bit count across all 20 raw bits must be even - if (__builtin_popcount((unsigned)raw) % 2 != 0) { - Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); - return false; - } - - pos = position; - return true; -} - -float AEAT8800::readAngleDegrees() { - uint16_t raw = 0; - if (!readAngleRaw(raw)) return -1.0f; - return (raw / 65536.0f) * 360.0f; -} - -// ─── Global State ───────────────────────────────────────────────────────────── - -static AEAT8800* g_enc1 = nullptr; -static AEAT8800* g_enc2 = nullptr; -static bool g_enc1Enabled = false; -static bool g_enc2Enabled = false; -static bool g_streaming = false; -static uint32_t g_lastStream = 0; -static uint8_t g_activeEnc = 1; // target encoder for SPI serial commands - -// ─── Setup Wizard Helpers ───────────────────────────────────────────────────── - -/** Block until a complete line is received on Serial. Returns trimmed string. */ -static String readLine() { - while (!Serial.available()) { /* busy-wait */ } - String s = Serial.readStringUntil('\n'); - s.trim(); - return s; -} - -/** Print a pin prompt, read a GPIO integer. Returns the chosen GPIO number. */ -static uint8_t promptPin(const char* label, uint8_t def) { - Serial.printf(" %-8s (default GPIO%-2u): ", label, def); - String s = readLine(); - if (s.length() == 0) { - Serial.printf("GPIO%u (default)\n", def); - return def; - } - uint8_t v = (uint8_t)s.toInt(); - Serial.printf("GPIO%u\n", v); - return v; -} - -/** Prompt for custom pin override for one encoder. Modifies cfg in-place. */ -static void promptCustomPins(const char* label, EncoderConfig &cfg, - const EncoderConfig &def) { - Serial.printf("\n Encoder %s — defaults:" - " CLK=GPIO%u DIN=GPIO%u DO=GPIO%u SEL=GPIO%u\n", - label, def.pinCLK, def.pinDIN, def.pinDOUT, def.pinSEL); - Serial.print(F(" Use default pins? [Y/n]: ")); - String ans = readLine(); - ans.toLowerCase(); - - if (ans == "n") { - cfg.pinCLK = promptPin("CLK", def.pinCLK); - cfg.pinDIN = promptPin("DIN", def.pinDIN); - cfg.pinDOUT = promptPin("DO", def.pinDOUT); - cfg.pinSEL = promptPin("SEL", def.pinSEL); - } else { - cfg = def; - Serial.println(F(" Using defaults.")); - } -} - -// ─── Setup Wizard ───────────────────────────────────────────────────────────── - -static void runSetupWizard(EncoderConfig &cfg1, EncoderConfig &cfg2) { - const EncoderConfig def1 = { DEFAULT_ENC1_CLK, DEFAULT_ENC1_DIN, - DEFAULT_ENC1_DOUT, DEFAULT_ENC1_SEL }; - const EncoderConfig def2 = { DEFAULT_ENC2_CLK, DEFAULT_ENC2_DIN, - DEFAULT_ENC2_DOUT, DEFAULT_ENC2_SEL }; - cfg1 = def1; - cfg2 = def2; - - Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 — Encoder Setup Wizard ║")); - Serial.println(F("╠══════════════════════════════════════════════════════════╣")); - Serial.println(F("║ GPIO reference: ║")); - Serial.println(F("║ D0=0 D1=1 D2=2 D3=21 D4=22 D5=23 ║")); - Serial.println(F("║ D6=16 D7=17 D8=19 D9=20 D10=18 ║")); - Serial.println(F("╠══════════════════════════════════════════════════════════╣")); - Serial.println(F("║ Default pin layout (fully independent, no sharing): ║")); - Serial.println(F("║ ENC1: CLK=19(D8) DIN=18(D10) DO=20(D9) SEL=21(D3) ║")); - Serial.println(F("║ ENC2: CLK=23(D5) DIN=2(D2) DO=1(D1) SEL=22(D4) ║")); - Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); - - // ── Step 1: number of encoders ──────────────────────────────────────────────── - uint8_t numEnc = 0; - while (numEnc != 1 && numEnc != 2) { - Serial.print(F("How many encoders are connected? [1/2]: ")); - String s = readLine(); - numEnc = (uint8_t)s.toInt(); - if (numEnc != 1 && numEnc != 2) - Serial.println(F(" Please enter 1 or 2.")); - } - - if (numEnc == 1) { - // ── Step 2 (single encoder): which slot ──────────────────────────────────── - uint8_t slot = 0; - while (slot != 1 && slot != 2) { - Serial.print(F("Which encoder slot is connected? [1/2]: ")); - String s = readLine(); - slot = (uint8_t)s.toInt(); - if (slot != 1 && slot != 2) - Serial.println(F(" Please enter 1 or 2.")); - } - g_enc1Enabled = (slot == 1); - g_enc2Enabled = (slot == 2); - g_activeEnc = slot; - } else { - g_enc1Enabled = true; - g_enc2Enabled = true; - g_activeEnc = 1; - } - - // ── Step 3: optional custom pins per enabled encoder ────────────────────────── - if (g_enc1Enabled) promptCustomPins("1", cfg1, def1); - if (g_enc2Enabled) promptCustomPins("2", cfg2, def2); - - // ── Configuration summary ───────────────────────────────────────────────────── - Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); - Serial.println(F("║ Configuration confirmed: ║")); - if (g_enc1Enabled) - Serial.printf( "║ ENC1 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", - cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); - else - Serial.println(F("║ ENC1 disabled ║")); - if (g_enc2Enabled) - Serial.printf( "║ ENC2 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", - cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); - else - Serial.println(F("║ ENC2 disabled ║")); - Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); -} - -// ─── Pin Init ───────────────────────────────────────────────────────────────── - -static void initEncoderPins(const EncoderConfig &cfg) { - pinMode(cfg.pinCLK, OUTPUT); digitalWrite(cfg.pinCLK, HIGH); // CLK idles HIGH - pinMode(cfg.pinDIN, OUTPUT); digitalWrite(cfg.pinDIN, HIGH); // DIN/NSL idles HIGH - pinMode(cfg.pinDOUT, INPUT); - pinMode(cfg.pinSEL, OUTPUT); digitalWrite(cfg.pinSEL, LOW); // SPI/idle mode -} - -// ─── Runtime Helpers ───────────────────────────────────────────────────────── - -/** Return the active encoder pointer, or nullptr if that encoder is disabled. */ -static AEAT8800* activeEncoder() { - if (g_activeEnc == 1 && g_enc1Enabled) return g_enc1; - if (g_activeEnc == 2 && g_enc2Enabled) return g_enc2; - return nullptr; -} - -static const char* resolutionStr(uint8_t regVal) { - switch (regVal & 0x03) { - case 0x00: return "10-bit (1024 cpr)"; - case 0x01: return "12-bit (4096 cpr)"; - case 0x02: return "14-bit (16384 cpr)"; - case 0x03: return "16-bit (65536 cpr)"; - default: return "unknown"; - } -} - -static void printSinglePosition(uint8_t id, uint16_t pos, bool ok) { - if (ok) { - double deg = (pos / 65536.0) * 360.0; - Serial.printf("[ENC%u] Pos=%5u Angle=%8.4f deg\n", id, pos, deg); - } else { - Serial.printf("[ENC%u] READ ERROR\n", id); - } -} - -// ─── Read Both Enabled Encoders ─────────────────────────────────────────────── - -static void readBothEnabled(uint16_t &pos1, uint16_t &pos2, - bool &ok1, bool &ok2) { - pos1 = 0; pos2 = 0; ok1 = false; ok2 = false; - - if (g_enc1Enabled) { - g_enc1->select(); - ok1 = g_enc1->readAngleRaw(pos1); - g_enc1->deselect(); - if (g_enc2Enabled) delay(1); // brief gap before reading enc2 - } - if (g_enc2Enabled) { - g_enc2->select(); - ok2 = g_enc2->readAngleRaw(pos2); - g_enc2->deselect(); - } -} - -// ─── Register Dump ──────────────────────────────────────────────────────────── - -static void printAllRegisters() { - AEAT8800* enc = activeEncoder(); - if (!enc) { - Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); - return; - } - - Serial.printf("\n╔══════════════════════════════════════════════╗\n"); - Serial.printf( "║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", g_activeEnc); - Serial.println(F("╠══════════════════════════════════════════════╣")); - - struct { uint8_t addr; const char* name; } regs[] = { - { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, - { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, - { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, - { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, - { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, - { REG_CPR_SET1, "CPR_Set1 (0x05)" }, - { REG_CPR_SET2, "CPR_Set2 (0x06)" }, - { REG_RESOLUTION, "Resolution (0x07)" }, - { REG_LOCK, "Lock (0x10)" }, - }; - - for (auto& r : regs) { - uint8_t val = enc->spiRead(r.addr); - Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); - } - - uint8_t lo = enc->spiRead(REG_ZERO_POS_L); - uint8_t hi = enc->spiRead(REG_ZERO_POS_H); - uint16_t zp = ((uint16_t)hi << 8) | lo; - uint8_t resReg = enc->spiRead(REG_RESOLUTION); - - Serial.println(F("╠══════════════════════════════════════════════╣")); - Serial.printf( "║ HW Zero Pos : %5u (%.4f deg) ║\n", - zp, (zp / 65536.0) * 360.0); - Serial.printf( "║ Resolution : %-30s ║\n", resolutionStr(resReg)); - Serial.println(F("╚══════════════════════════════════════════════╝\n")); -} - -// ─── Help ───────────────────────────────────────────────────────────────────── - -static void printHelp() { - Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 Independent Dual — Commands ║")); - Serial.println(F("╠══════════════════════════════════════════════════════╣")); - Serial.println(F("║ p — Read enabled encoders (SSI, one-shot) ║")); - Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); - Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); - Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); - Serial.println(F("║ r — Read register e.g. 'r 07' ║")); - Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); - Serial.println(F("║ u — Unlock config registers ║")); - Serial.println(F("║ z — Set zero position = 0x0000 ║")); - Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); - Serial.println(F("║ h — Show this help ║")); - Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); -} - -// ─── Serial Command Parser ──────────────────────────────────────────────────── - -static void handleSerial() { - if (!Serial.available()) return; - - String line = Serial.readStringUntil('\n'); - line.trim(); - if (line.length() == 0) return; - - // OTP burn — requires the exact string "burn" to prevent accidents - if (line.equalsIgnoreCase("burn")) { - AEAT8800* enc = activeEncoder(); - if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); return; } - Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", g_activeEnc); - enc->spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - enc->spiWrite(REG_PROG_CUST, PROG_KEY); - Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); - return; - } - - char cmd = (char)tolower((unsigned char)line[0]); - - switch (cmd) { - - // ── Read both enabled encoders (SSI) ───────────────────────────────────── - case 'p': { - uint16_t pos1 = 0, pos2 = 0; - bool ok1 = false, ok2 = false; - readBothEnabled(pos1, pos2, ok1, ok2); - if (g_enc1Enabled) printSinglePosition(1, pos1, ok1); - if (g_enc2Enabled) printSinglePosition(2, pos2, ok2); - break; - } - - // ── Continuous stream toggle ────────────────────────────────────────────── - case 'c': - g_streaming = !g_streaming; - Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); - break; - - // ── Select active encoder for SPI commands ──────────────────────────────── - case '1': - if (!g_enc1Enabled) { Serial.println(F("[ERR] ENC1 is not enabled.")); break; } - g_activeEnc = 1; - Serial.println(F("[INFO] Active encoder: ENC1")); - break; - case '2': - if (!g_enc2Enabled) { Serial.println(F("[ERR] ENC2 is not enabled.")); break; } - g_activeEnc = 2; - Serial.println(F("[INFO] Active encoder: ENC2")); - break; - - // ── Register dump ───────────────────────────────────────────────────────── - case 's': - printAllRegisters(); - break; - - // ── Read single register "r " ───────────────────────────────── - case 'r': { - if (line.length() < 3) { Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); break; } - AEAT8800* enc = activeEncoder(); - if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); - uint8_t val = enc->spiRead(addr); - Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", - g_activeEnc, addr, val, val); - break; - } - - // ── Write single register "w " ────────────────────── - case 'w': { - if (line.length() < 5) { Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); break; } - AEAT8800* enc = activeEncoder(); - if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } - char* ptr = nullptr; - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); - uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); - enc->spiWrite(addr, val); - uint8_t rb = enc->spiRead(addr); - Serial.printf("[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", - g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); - break; - } - - // ── Unlock registers ────────────────────────────────────────────────────── - case 'u': { - AEAT8800* enc = activeEncoder(); - if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } - enc->spiWrite(REG_LOCK, UNLOCK_KEY); - Serial.printf("[ENC%u SPI] Registers unlocked (0xAB → Lock reg)\n", g_activeEnc); - break; - } - - // ── Set zero position ───────────────────────────────────────────────────── - case 'z': { - AEAT8800* enc = activeEncoder(); - if (!enc) { Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); break; } - Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow regs...\n", g_activeEnc); - enc->spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - enc->spiWrite(REG_ZERO_POS_L, 0x00); - enc->spiWrite(REG_ZERO_POS_H, 0x00); - uint8_t lo = enc->spiRead(REG_ZERO_POS_L); - uint8_t hi = enc->spiRead(REG_ZERO_POS_H); - uint16_t zp = ((uint16_t)hi << 8) | lo; - Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, - zp == 0x0000 ? "OK" : "MISMATCH!"); - break; - } - - // ── Burn guard (must type "burn" exactly) ───────────────────────────────── - case 'b': - Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); - Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); - break; - - // ── Help ────────────────────────────────────────────────────────────────── - case 'h': - default: - printHelp(); - break; - } -} - -// ─── Setup ──────────────────────────────────────────────────────────────────── - -void setup() { - Serial.begin(115200); - delay(300); - - // ── External antenna ───────────────────────────────────────────────────────── - // GPIO3 LOW activates the RF switch; GPIO14 HIGH selects the external antenna. - pinMode(WIFI_ENABLE, OUTPUT); - digitalWrite(WIFI_ENABLE, LOW); - delay(100); - pinMode(WIFI_ANT_CONFIG, OUTPUT); - digitalWrite(WIFI_ANT_CONFIG, HIGH); - - // ── Boot setup wizard (blocks until user completes configuration) ───────────── - EncoderConfig cfg1, cfg2; - runSetupWizard(cfg1, cfg2); - - // ── GPIO init for enabled encoders ─────────────────────────────────────────── - if (g_enc1Enabled) initEncoderPins(cfg1); - if (g_enc2Enabled) initEncoderPins(cfg2); - - // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI read - delay(5); - - // ── Instantiate encoder objects ─────────────────────────────────────────────── - if (g_enc1Enabled) - g_enc1 = new AEAT8800(cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); - if (g_enc2Enabled) - g_enc2 = new AEAT8800(cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); - - // ── SPI configuration ──────────────────────────────────────────────────────── - Serial.println(F("╔══════════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 Independent | XIAO ESP32-C6 ║")); - Serial.println(F("╠══════════════════════════════════════════════════════════╣")); - - if (g_enc1Enabled) { - Serial.print(F( "║ Configuring ENC1 ... ")); - bool ok = g_enc1->configure(); - Serial.println(ok ? F("OK ║") - : F("FAILED — SSI reads will still be tried ║")); - } - if (g_enc2Enabled) { - Serial.print(F( "║ Configuring ENC2 ... ")); - bool ok = g_enc2->configure(); - Serial.println(ok ? F("OK ║") - : F("FAILED — SSI reads will still be tried ║")); - } - - Serial.println(F("╠══════════════════════════════════════════════════════════╣")); - - // ── Initial SSI position read ───────────────────────────────────────────────── - uint16_t pos1 = 0, pos2 = 0; - bool r1 = false, r2 = false; - readBothEnabled(pos1, pos2, r1, r2); - - if (g_enc1Enabled) { - if (r1) - Serial.printf("║ ENC1 Position : %5u counts (%.4f deg) ║\n", - pos1, (pos1 / 65536.0) * 360.0); - else - Serial.println(F("║ ENC1 Position : READ ERROR ║")); - } - if (g_enc2Enabled) { - if (r2) - Serial.printf("║ ENC2 Position : %5u counts (%.4f deg) ║\n", - pos2, (pos2 / 65536.0) * 360.0); - else - Serial.println(F("║ ENC2 Position : READ ERROR ║")); - } - - Serial.println(F("╠══════════════════════════════════════════════════════════╣")); - Serial.println(F("║ Type 'h' for command help ║")); - Serial.println(F("╚══════════════════════════════════════════════════════════╝\n")); -} - -// ─── Main Loop ──────────────────────────────────────────────────────────────── - -void loop() { - handleSerial(); - - if (g_streaming && (millis() - g_lastStream >= 100)) { - g_lastStream = millis(); - - uint16_t pos1 = 0, pos2 = 0; - bool ok1 = false, ok2 = false; - readBothEnabled(pos1, pos2, ok1, ok2); - - if (g_enc1Enabled && g_enc2Enabled) { - float d1 = ok1 ? (pos1 / 65536.0f) * 360.0f : -1.0f; - float d2 = ok2 ? (pos2 / 65536.0f) * 360.0f : -1.0f; - if (ok1 && ok2) Serial.printf("ENC1: %.4f deg | ENC2: %.4f deg\n", d1, d2); - else if (!ok1 && !ok2) Serial.println(F("ENC1: ERR | ENC2: ERR")); - else if (!ok1) Serial.printf("ENC1: ERR | ENC2: %.4f deg\n", d2); - else Serial.printf("ENC1: %.4f deg | ENC2: ERR\n", d1); - } else if (g_enc1Enabled) { - if (ok1) Serial.printf("ENC1: %.4f deg\n", (pos1 / 65536.0f) * 360.0f); - else Serial.println(F("ENC1: ERR")); - } else if (g_enc2Enabled) { - if (ok2) Serial.printf("ENC2: %.4f deg\n", (pos2 / 65536.0f) * 360.0f); - else Serial.println(F("ENC2: ERR")); - } - } -} +/** jgkrsjgklrslgrs + * ============================================================ + * AEAT-8800-Q24 — Fully Independent Dual Encoder + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── FULLY INDEPENDENT WIRING ───────────────────────────────── + * Every encoder has its own dedicated CLK, DIN/NSL, DO, and SEL. + * No pins are shared between encoders — eliminates all bus + * conflicts and DOUT tri-state contention. + * + * ── DEFAULT PIN ASSIGNMENT ─────────────────────────────────── + * Signal │ Encoder 1 │ Encoder 2 + * ────────────┼─────────────────┼───────────────── + * CLK │ D8 / GPIO19 │ D5 / GPIO23 + * DIN / NSL │ D10 / GPIO18 │ D2 / GPIO2 + * DO / DOUT │ D9 / GPIO20 │ D1 / GPIO1 + * SEL │ D3 / GPIO21 │ D4 / GPIO22 + * + * ── ANTENNA PINS ───────────────────────────────────────────── + * WIFI_ENABLE GPIO3 — LOW = activate RF switch control + * WIFI_ANT_CONFIG GPIO14 — HIGH = select external antenna + * + * ── KEY TIMING (datasheet Fig. 8 & timing table) ───────────── + * Symbol │ Min │ Unit │ Datasheet description + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time + * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and + * │ │ │ first SCL falling edge + * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock + * │ │ │ period for an SSI read + * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * Notes (datasheet p.15): + * • CLK = 1 when inactive; DIN = 1 when inactive. + * • CLK must be HIGH when switching between SSI and SPI modes. + * • NSL must be held HIGH for at least 3 ms after power-up before + * the first SSI read. + * • The user is advised to read from the SSI falling edge. + * • 16-bit resolution → 20 total bits (16 pos + Ready + MHi + MLo + Parity) + * All margins use SSI_HALF_US = 5 µs (>> all minimum requirements). + * + * ── BOOT WIZARD ────────────────────────────────────────────── + * Set RUN_SETUP_WIZARD = true to prompt over Serial (115200 baud): + * 1. How many encoders are connected [1/2] + * 2. Which slot (only if 1 encoder) + * 3. Use default pins, or enter custom GPIO numbers + * Set RUN_SETUP_WIZARD = false to skip the wizard: both encoders on + * default pins, continuous stream (c) starts automatically. + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p — Read position (SSI, one-shot, enabled encoders) + * c — Toggle continuous stream (both enabled, 100 ms) + * o — Software offset: current pos reports as (both encoders) + * o clear — Remove software offset (revert to raw hardware angles) + * 1 / 2 — Select active encoder for SPI commands + * s — Dump SPI config registers (active encoder) + * r — Read register at hex address e.g. "r 07" + * w — Write register e.g. "w 10 AB" + * u — Unlock config registers + * z — HW zero position = 0x0000 (SPI shadow only) + * burn — Burn OTP ⚠ IRREVERSIBLE (type "burn" exactly) + * h — Show this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +#include // For std::sort +#include // For sin, cos, atan2, PI + +// ─── Hybrid Robust Filtering Settings ──────────────────────────────────────── +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 16 +#define OUTLIER_THRESHOLD \ + 20.0 // Allow some natural jitter, reject massive spikes + +// true = interactive boot wizard (encoder count, slot, custom pins) +// false = skip wizard; both encoders on default pins; start stream (c) immediately +static constexpr bool RUN_SETUP_WIZARD = false; + +// 16-bit encoder: 65536 counts/rev → ~0.0055° per count +#define ENCODER_CPR 65536 +static constexpr double ENCODER_CPR_D = 65536.0; +static constexpr double DEG_PER_COUNT = 360.0 / ENCODER_CPR_D; + +static uint16_t snapToCounts(double counts); +static double countsToDeg(uint16_t counts); + +// ─── Antenna Pins +// ───────────────────────────────────────────────────────────── +#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) +#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) + +// ─── Default Encoder Pins +// ───────────────────────────────────────────────────── +#define DEFAULT_ENC1_CLK D8 // GPIO19 +#define DEFAULT_ENC1_DIN D10 // GPIO18 +#define DEFAULT_ENC1_DOUT D9 // GPIO20 +#define DEFAULT_ENC1_SEL D7 // GPIO21 + +#define DEFAULT_ENC2_CLK D5 // GPIO23 +#define DEFAULT_ENC2_DIN D3 // GPIO2 +#define DEFAULT_ENC2_DOUT D4 // GPIO1 +#define DEFAULT_ENC2_SEL D6 // GPIO22 + +// ─── Register Addresses +// ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_VCC 0x0A +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Register Values +// ────────────────────────────────────────────────────────── +#define UNLOCK_KEY 0xAB +#define PROG_KEY 0xA1 +#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V +#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair +// 0x05 [7:4]=CPR1, [3:0]=Hysteresis (datasheet Table 3) +// CPR1 0b0100 → 512 CPR (ABI; absolute-only uses CPR_Set2 in 0x06) +// Hyst 0b0010 → 0.01 mechanical degree (mdeg) +#define VAL_CPR1 0x42 +#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF + +// ─── SSI Timing +// ─────────────────────────────────────────────────────────────── Timing +// constants from AEAT-8800-Q24 datasheet timing table (Fig. 8): +// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL +// falling edge tREQ2 >= 200 ns NSL low time after rising edge of last +// clock period for an SSI read tNSLH >= 200 ns NSL high time between 2 +// successive SSI reads tsw(SEL) >= 1 µs SSI_SPI_SEL switch time +// SSI_HALF_US = 5 µs gives 7–25× margin over minimums. +// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. +#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity +#define SSI_HALF_US 1 // 1 us half-period -> ~500 kHz SSI clock (Fast for 30Hz) +#define SSI_MONOFLOP_US 20 // monoflop recovery after NSL HIGH + +// ─── Encoder Config +// ─────────────────────────────────────────────────────────── + +struct EncoderConfig { + uint8_t pinCLK; + uint8_t pinDIN; + uint8_t pinDOUT; + uint8_t pinSEL; +}; + +// ─── AEAT8800 Class +// ─────────────────────────────────────────────────────────── Each instance is +// completely self-contained: CLK, DIN, DOUT, and SEL are all per-instance. No +// pins are shared with any other instance. + +class AEAT8800 { +public: + AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) + : _clk(clk), _din(din), _dout(dout), _sel(sel) {} + + /** Assert SEL HIGH → SSI mode. */ + void select(); + + /** Assert SEL LOW → SPI/idle mode. */ + void deselect(); + + /** Bit-bang one SPI register read using this encoder's CLK and DIN. */ + uint8_t spiRead(uint8_t addr); + + /** Bit-bang one SPI register write using this encoder's CLK and DIN. */ + void spiWrite(uint8_t addr, uint8_t data); + + /** Unlock and write all required OTP shadow registers with readback verify. + * Returns true on success. Failure is non-fatal; SSI reads still work. */ + bool configure(); + + /** Perform one 20-bit SSI read. Stores position in pos (0–65535). + * Precondition: select() must have been called. + * Returns false if Ready=0 or parity fails. */ + bool readAngleRaw(uint16_t &pos, bool silent = false); + + /** Read angle in degrees [0, 360). Returns -1.0f on error. */ + float readAngleDegrees(); + +private: + uint8_t _clk, _din, _dout, _sel; +}; + +// ─── select / deselect +// ──────────────────────────────────────────────────────── + +void AEAT8800::select() { + // CLK must be HIGH before SEL transition (datasheet p.15, p.21) + digitalWrite(_clk, HIGH); + digitalWrite(_sel, HIGH); + delayMicroseconds(1); // tsw(SEL) >= 1 µs +} + +void AEAT8800::deselect() { + digitalWrite(_sel, LOW); + delayMicroseconds(1); +} + +// ─── SPI Write +// ──────────────────────────────────────────────────────────────── + +void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first + uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); + for (int i = 15; i >= 0; i--) { + digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK fall + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_din, HIGH); // DIN back to idle HIGH + digitalWrite(_clk, HIGH); // CLK must be HIGH before SEL change + digitalWrite(_sel, prevSel); +} + +// ─── SPI Read +// ───────────────────────────────────────────────────────────────── + +uint8_t AEAT8800::spiRead(uint8_t addr) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 8-bit command: opcode 0b10 (2b) + addr (6b) + uint8_t cmd = (0b10u << 6) | (addr & 0x3F); + for (int i = 7; i >= 0; i--) { + digitalWrite(_din, (cmd >> i) & 1u); + digitalWrite(_clk, LOW); + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + digitalWrite(_din, HIGH); // release DIN; encoder drives DOUT for reply + + uint8_t result = 0; + for (int i = 0; i < 8; i++) { + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall + digitalWrite(_clk, HIGH); // rising edge — master captures DOUT + result = + (result << 1) | + (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + digitalWrite(_sel, prevSel); + return result; +} + +// ─── Configure +// ──────────────────────────────────────────────────────────────── + +bool AEAT8800::configure() { + // Unlock must be the very first SPI write (datasheet p.10 note 3) + spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + + struct RegTarget { + uint8_t addr, val; + const char *name; + }; + static const RegTarget targets[] = { + {REG_VCC, VAL_VCC, "0x0A (VCC)"}, + {REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)"}, + {REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)"}, + {REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)"}, + }; + + for (const auto &r : targets) { + spiWrite(r.addr, r.val); + delayMicroseconds(5); + uint8_t rb = spiRead(r.addr); + if (rb != r.val) { + Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", + r.name, r.val, rb); + return false; + } + } + + deselect(); + return true; +} + +// ─── SSI Read +// ───────────────────────────────────────────────────────────────── + +bool AEAT8800::readAngleRaw(uint16_t &pos, bool silent) { + // Precondition: select() already called — SEL is HIGH, encoder in SSI mode + + // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 + // successive SSI reads + + // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) + digitalWrite(_din, LOW); + delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL + // falling edge and first SCL falling edge + + uint32_t raw = 0; + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + digitalWrite(_clk, + LOW); // SCL falling edge — encoder shifts next bit onto DO + delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet + // (data stable after CLK fall) + raw = (raw << 1) | + (uint32_t)digitalRead( + _dout); // sample DO after falling edge (datasheet Fig. 8, p.15) + digitalWrite(_clk, HIGH); // SCL rising edge + delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) + } + + delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising + // edge of last clock period for an SSI read + + // End of frame: NSL HIGH → load mode (encoder resumes tracking position) + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes + // internal load cycle + + // Unpack 20-bit frame (datasheet Fig. 8–9) + uint8_t parity = (raw >> 0) & 0x1u; + uint8_t mlo = (raw >> 1) & 0x1u; + uint8_t mhi = (raw >> 2) & 0x1u; + uint8_t ready = (raw >> 3) & 0x1u; + uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); + + (void)parity; // checked implicitly via __builtin_popcount below + + if (!ready) { + if (!silent) + Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", + (unsigned)raw); + return false; + } + if (!silent) { + if (mhi) + Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); + if (mlo) + Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); + } + + // Even parity: total 1-bit count across all 20 raw bits must be even + if (__builtin_popcount((unsigned)raw) % 2 != 0) { + if (!silent) + Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); + return false; + } + + pos = position; + return true; +} + +float AEAT8800::readAngleDegrees() { + uint16_t raw = 0; + if (!readAngleRaw(raw)) + return -1.0f; + return (float)countsToDeg(raw); +} + +// ─── Global State +// ───────────────────────────────────────────────────────────── + +static AEAT8800 *g_enc1 = nullptr; +static AEAT8800 *g_enc2 = nullptr; +static bool g_enc1Enabled = false; +static bool g_enc2Enabled = false; +static bool g_streaming = false; +static uint32_t g_lastStream = 0; +static uint8_t g_activeEnc = 1; // target encoder for SPI serial commands + +// Software angle offsets (degrees). Applied at display time only. +// Offset = rawDeg - targetDeg at the moment `o ` is sent. +static double g_offsetDeg1 = 0.0; +static double g_offsetDeg2 = 0.0; + +// ─── Setup Wizard Helpers +// ───────────────────────────────────────────────────── + +/** Block until a complete line is received on Serial. Returns trimmed string. + */ +static String readLine() { + while (!Serial.available()) { /* busy-wait */ + } + String s = Serial.readStringUntil('\n'); + s.trim(); + return s; +} + +/** Print a pin prompt, read a GPIO integer. Returns the chosen GPIO number. */ +static uint8_t promptPin(const char *label, uint8_t def) { + Serial.printf(" %-8s (default GPIO%-2u): ", label, def); + String s = readLine(); + if (s.length() == 0) { + Serial.printf("GPIO%u (default)\n", def); + return def; + } + uint8_t v = (uint8_t)s.toInt(); + Serial.printf("GPIO%u\n", v); + return v; +} + +/** Prompt for custom pin override for one encoder. Modifies cfg in-place. */ +static void promptCustomPins(const char *label, EncoderConfig &cfg, + const EncoderConfig &def) { + Serial.printf("\n Encoder %s — defaults:" + " CLK=GPIO%u DIN=GPIO%u DO=GPIO%u SEL=GPIO%u\n", + label, def.pinCLK, def.pinDIN, def.pinDOUT, def.pinSEL); + Serial.print(F(" Use default pins? [Y/n]: ")); + String ans = readLine(); + ans.toLowerCase(); + + if (ans == "n") { + cfg.pinCLK = promptPin("CLK", def.pinCLK); + cfg.pinDIN = promptPin("DIN", def.pinDIN); + cfg.pinDOUT = promptPin("DO", def.pinDOUT); + cfg.pinSEL = promptPin("SEL", def.pinSEL); + } else { + cfg = def; + Serial.println(F(" Using defaults.")); + } +} + +// ─── Setup Wizard +// ───────────────────────────────────────────────────────────── + +static void runSetupWizard(EncoderConfig &cfg1, EncoderConfig &cfg2) { + const EncoderConfig def1 = {DEFAULT_ENC1_CLK, DEFAULT_ENC1_DIN, + DEFAULT_ENC1_DOUT, DEFAULT_ENC1_SEL}; + const EncoderConfig def2 = {DEFAULT_ENC2_CLK, DEFAULT_ENC2_DIN, + DEFAULT_ENC2_DOUT, DEFAULT_ENC2_SEL}; + cfg1 = def1; + cfg2 = def2; + + Serial.println( + F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println( + F("║ AEAT-8800-Q24 — Encoder Setup Wizard ║")); + Serial.println( + F("╠══════════════════════════════════════════════════════════╣")); + Serial.println( + F("║ GPIO reference: ║")); + Serial.println( + F("║ D0=0 D1=1 D2=2 D3=21 D4=22 D5=23 ║")); + Serial.println( + F("║ D6=16 D7=17 D8=19 D9=20 D10=18 ║")); + Serial.println( + F("╠══════════════════════════════════════════════════════════╣")); + Serial.println( + F("║ Default pin layout (fully independent, no sharing): ║")); + Serial.println( + F("║ ENC1: CLK=19(D8) DIN=18(D10) DO=20(D9) SEL=21(D3) ║")); + Serial.println( + F("║ ENC2: CLK=23(D5) DIN=2(D2) DO=1(D1) SEL=22(D4) ║")); + Serial.println( + F("╚══════════════════════════════════════════════════════════╝\n")); + + // ── Step 1: number of encoders + // ──────────────────────────────────────────────── + uint8_t numEnc = 0; + while (numEnc != 1 && numEnc != 2) { + Serial.print(F("How many encoders are connected? [1/2]: ")); + String s = readLine(); + numEnc = (uint8_t)s.toInt(); + if (numEnc != 1 && numEnc != 2) + Serial.println(F(" Please enter 1 or 2.")); + } + + if (numEnc == 1) { + // ── Step 2 (single encoder): which slot + // ──────────────────────────────────── + uint8_t slot = 0; + while (slot != 1 && slot != 2) { + Serial.print(F("Which encoder slot is connected? [1/2]: ")); + String s = readLine(); + slot = (uint8_t)s.toInt(); + if (slot != 1 && slot != 2) + Serial.println(F(" Please enter 1 or 2.")); + } + g_enc1Enabled = (slot == 1); + g_enc2Enabled = (slot == 2); + g_activeEnc = slot; + } else { + g_enc1Enabled = true; + g_enc2Enabled = true; + g_activeEnc = 1; + } + + // ── Step 3: optional custom pins per enabled encoder + // ────────────────────────── + if (g_enc1Enabled) + promptCustomPins("1", cfg1, def1); + if (g_enc2Enabled) + promptCustomPins("2", cfg2, def2); + + // ── Configuration summary + // ───────────────────────────────────────────────────── + Serial.println( + F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println( + F("║ Configuration confirmed: ║")); + if (g_enc1Enabled) + Serial.printf( + "║ ENC1 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", + cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); + else + Serial.println( + F("║ ENC1 disabled ║")); + if (g_enc2Enabled) + Serial.printf( + "║ ENC2 CLK=GPIO%-2u DIN=GPIO%-2u DO=GPIO%-2u SEL=GPIO%-2u ║\n", + cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); + else + Serial.println( + F("║ ENC2 disabled ║")); + Serial.println( + F("╚══════════════════════════════════════════════════════════╝\n")); +} + +/** Apply built-in dual-encoder pin config and enable continuous stream. */ +static void applyDefaultDualConfig(EncoderConfig &cfg1, EncoderConfig &cfg2) { + cfg1 = {DEFAULT_ENC1_CLK, DEFAULT_ENC1_DIN, DEFAULT_ENC1_DOUT, + DEFAULT_ENC1_SEL}; + cfg2 = {DEFAULT_ENC2_CLK, DEFAULT_ENC2_DIN, DEFAULT_ENC2_DOUT, + DEFAULT_ENC2_SEL}; + g_enc1Enabled = true; + g_enc2Enabled = true; + g_activeEnc = 1; + g_streaming = true; +} + +// ─── Pin Init +// ───────────────────────────────────────────────────────────────── + +static void initEncoderPins(const EncoderConfig &cfg) { + pinMode(cfg.pinCLK, OUTPUT); + digitalWrite(cfg.pinCLK, HIGH); // CLK idles HIGH + pinMode(cfg.pinDIN, OUTPUT); + digitalWrite(cfg.pinDIN, HIGH); // DIN/NSL idles HIGH + pinMode(cfg.pinDOUT, INPUT); + pinMode(cfg.pinSEL, OUTPUT); + digitalWrite(cfg.pinSEL, LOW); // SPI/idle mode +} + +// ─── Runtime Helpers ───────────────────────────────────────────────────────── + +/** Snap a fractional count to the nearest integer encoder step [0, CPR). */ +static uint16_t snapToCounts(double counts) { + long c = (long)(counts + 0.5); + c %= ENCODER_CPR; + if (c < 0) + c += ENCODER_CPR; + return (uint16_t)c; +} + +/** Convert encoder counts to degrees, quantized to 3 decimal places. */ +static double countsToDeg(uint16_t counts) { + return round(counts * DEG_PER_COUNT * 1000.0) / 1000.0; +} + +/** Wrap deg into [0, 360) and round to 3 decimal places. */ +static double normalizeDeg3(double deg) { + deg = fmod(deg, 360.0); + if (deg < 0.0) + deg += 360.0; + return round(deg * 1000.0) / 1000.0; +} + +/** Snap filtered counts → integer counts → degrees (no offset). */ +static double rawDisplayDeg(double filteredCounts) { + return countsToDeg(snapToCounts(filteredCounts)); +} + +/** Return the active encoder pointer, or nullptr if that encoder is disabled. + */ +static AEAT8800 *activeEncoder() { + if (g_activeEnc == 1 && g_enc1Enabled) + return g_enc1; + if (g_activeEnc == 2 && g_enc2Enabled) + return g_enc2; + return nullptr; +} + +static const char *resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case 0x00: + return "10-bit (1024 cpr)"; + case 0x01: + return "12-bit (4096 cpr)"; + case 0x02: + return "14-bit (16384 cpr)"; + case 0x03: + return "16-bit (65536 cpr)"; + default: + return "unknown"; + } +} + +static void printSinglePosition(uint8_t id, double pos, bool ok) { + if (ok) { + uint16_t snapped = snapToCounts(pos); + double deg = displayDeg(id, pos); + Serial.printf("[ENC%u] Pos=%5u Angle=%8.3f deg\n", id, snapped, deg); + } else { + Serial.printf("[ENC%u] READ ERROR\n", id); + } +} + +// ─── Hybrid Circular Filtering Algorithms ─────────────────────────────────── + +static double getCircularRobustMean(uint16_t *samples, int size) { + if (size == 0) + return 0; + + double sum_x = 0; + double sum_y = 0; + for (int i = 0; i < size; i++) { + double theta = (samples[i] / ENCODER_CPR_D) * 2.0 * PI; + sum_x += cos(theta); + sum_y += sin(theta); + } + double initialMeanTheta = atan2(sum_y, sum_x); + if (initialMeanTheta < 0) + initialMeanTheta += 2.0 * PI; + uint16_t initialMeanCnt = + (uint16_t)((initialMeanTheta / (2.0 * PI)) * ENCODER_CPR_D); + + double robustSum_x = 0; + double robustSum_y = 0; + int count = 0; + for (int i = 0; i < size; i++) { + // Calculate circular distance + uint16_t diff = samples[i] - initialMeanCnt; + uint16_t dist = (diff > 32768) ? (ENCODER_CPR - diff) : diff; + + if (dist < OUTLIER_THRESHOLD) { + double theta = (samples[i] / ENCODER_CPR_D) * 2.0 * PI; + robustSum_x += cos(theta); + robustSum_y += sin(theta); + count++; + } + } + + // If everything was an outlier (e.g. extremely noisy), fallback to standard + // circular mean + if (count == 0) { + return (double)initialMeanCnt; + } + + double robustMeanTheta = atan2(robustSum_y, robustSum_x); + if (robustMeanTheta < 0) + robustMeanTheta += 2.0 * PI; + return (robustMeanTheta / (2.0 * PI)) * ENCODER_CPR_D; +} + +static double getCircularMedian(double *values, int size) { + if (size == 0) + return 0; + + // Unwrap all block means relative to the first block mean to handle + // wrap-around + double unwrapped[NUM_BLOCKS]; + unwrapped[0] = values[0]; + + for (int i = 1; i < size; i++) { + double diff = values[i] - values[0]; + if (diff > 32768.0) + diff -= ENCODER_CPR_D; + else if (diff < -32768.0) + diff += ENCODER_CPR_D; + unwrapped[i] = values[0] + diff; + } + + std::sort(unwrapped, unwrapped + size); + double med = unwrapped[size / 2]; + + // Wrap back to [0, CPR) + if (med < 0) + med += ENCODER_CPR_D; + else if (med >= ENCODER_CPR_D) + med -= ENCODER_CPR_D; + + return med; +} + +static bool readAngleFiltered(AEAT8800 *enc, double &finalPos) { + if (!enc) + return false; + + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + enc->select(); + int validBlocks = 0; + + for (int b = 0; b < NUM_BLOCKS; b++) { + int validSamples = 0; + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw; + if (enc->readAngleRaw(raw, true)) { // silent = true + blockSamples[validSamples++] = raw; + } + } + if (validSamples > 0) { + blockMeans[validBlocks++] = + getCircularRobustMean(blockSamples, validSamples); + } + } + enc->deselect(); + + if (validBlocks == 0) + return false; + + finalPos = getCircularMedian(blockMeans, validBlocks); + return true; +} + +// ─── Read Both Enabled Encoders +// ─────────────────────────────────────────────── + +static void readBothEnabled(double &pos1, double &pos2, bool &ok1, bool &ok2) { + pos1 = 0; + pos2 = 0; + ok1 = false; + ok2 = false; + + if (g_enc1Enabled) { + ok1 = readAngleFiltered(g_enc1, pos1); + if (g_enc2Enabled) + delay(1); // brief gap before reading enc2 + } + if (g_enc2Enabled) { + ok2 = readAngleFiltered(g_enc2, pos2); + } +} + +/** Snap filtered counts, apply software offset, normalize to [0,360), 3 dp. */ +static double displayDeg(uint8_t encId, double filteredCounts) { + double raw = rawDisplayDeg(filteredCounts); + double off = (encId == 1) ? g_offsetDeg1 : g_offsetDeg2; + + + return normalizeDeg3(raw - off); +} + +// ─── Register Dump +// ──────────────────────────────────────────────────────────── + +static void printAllRegisters() { + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + return; + } + + Serial.printf("\n╔══════════════════════════════════════════════╗\n"); + Serial.printf("║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", + g_activeEnc); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { + uint8_t addr; + const char *name; + } regs[] = { + {REG_CUST_RESERVE_0, "CustReserve0 (0x00)"}, + {REG_CUST_RESERVE_1, "CustReserve1 (0x01)"}, + {REG_ZERO_POS_L, "ZeroPos_L (0x02)"}, + {REG_ZERO_POS_H, "ZeroPos_H (0x03)"}, + {REG_CUST_CONFIG_0, "CustConfig0 (0x04)"}, + {REG_CPR_SET1, "CPR_Set1 (0x05)"}, + {REG_CPR_SET2, "CPR_Set2 (0x06)"}, + {REG_RESOLUTION, "Resolution (0x07)"}, + {REG_LOCK, "Lock (0x10)"}, + }; + + for (auto &r : regs) { + uint8_t val = enc->spiRead(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); + } + + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + uint8_t resReg = enc->spiRead(REG_RESOLUTION); + + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf("║ HW Zero Pos : %5u (%.3f deg) ║\n", zp, + countsToDeg(zp)); + Serial.printf("║ Resolution : %-30s ║\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +// ─── Help +// ───────────────────────────────────────────────────────────────────── + +static void printHelp() { + Serial.println( + F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 Independent Dual — Commands ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read enabled encoders (SSI, one-shot) ║")); + Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); + Serial.println(F("║ o — Offset: current pos reports as ║")); + Serial.println(F("║ o clear — Remove software offset (back to raw) ║")); + Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); + Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); + Serial.println(F("║ r — Read register e.g. 'r 07' ║")); + Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); + Serial.println(F("║ u — Unlock config registers ║")); + Serial.println(F("║ z — HW zero position = 0x0000 (SPI) ║")); + Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); + Serial.println( + F("║ h — Show this help ║")); + Serial.println( + F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Serial Command Parser +// ──────────────────────────────────────────────────── + +static void handleSerial() { + if (!Serial.available()) + return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) + return; + + // ── Software angle offset "o [deg]" or "o clear" ───────────────────── + if (line.length() >= 1 && + tolower((unsigned char)line[0]) == 'o' && + (line.length() == 1 || line[1] == ' ')) { + String arg = (line.length() > 2) ? line.substring(2) : String(""); + arg.trim(); + arg.toLowerCase(); + + if (arg == "clear") { + g_offsetDeg1 = 0.0; + g_offsetDeg2 = 0.0; + Serial.println(F("[OFFSET] Cleared — both encoders report raw hardware angles")); + } else { + double targetDeg = (arg.length() > 0) ? arg.toDouble() : 0.0; + double pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEnabled(pos1, pos2, ok1, ok2); + + if (g_enc1Enabled) { + if (ok1) { + double raw1 = rawDisplayDeg(pos1); + g_offsetDeg1 = raw1 - targetDeg; + Serial.printf("[OFFSET] ENC1 raw=%.3f → reports as %.3f (offset=%.3f)\n", + raw1, targetDeg, g_offsetDeg1); + } else { + Serial.println(F("[OFFSET] ENC1 read failed — offset unchanged")); + } + } + if (g_enc2Enabled) { + if (ok2) { + double raw2 = rawDisplayDeg(pos2); + g_offsetDeg2 = raw2 - targetDeg; + Serial.printf("[OFFSET] ENC2 raw=%.3f → reports as %.3f (offset=%.3f)\n", + raw2, targetDeg, g_offsetDeg2); + } else { + Serial.println(F("[OFFSET] ENC2 read failed — offset unchanged")); + } + } + } + return; + } + + // OTP burn — requires the exact string "burn" to prevent accidents + if (line.equalsIgnoreCase("burn")) { + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + return; + } + Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", + g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + return; + } + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Read both enabled encoders (SSI) ───────────────────────────────────── + case 'p': { + double pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEnabled(pos1, pos2, ok1, ok2); + if (g_enc1Enabled) + printSinglePosition(1, pos1, ok1); + if (g_enc2Enabled) + printSinglePosition(2, pos2, ok2); + break; + } + + // ── Continuous stream toggle ────────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Select active encoder for SPI commands ──────────────────────────────── + case '1': + if (!g_enc1Enabled) { + Serial.println(F("[ERR] ENC1 is not enabled.")); + break; + } + g_activeEnc = 1; + Serial.println(F("[INFO] Active encoder: ENC1")); + break; + case '2': + if (!g_enc2Enabled) { + Serial.println(F("[ERR] ENC2 is not enabled.")); + break; + } + g_activeEnc = 2; + Serial.println(F("[INFO] Active encoder: ENC2")); + break; + + // ── Register dump ───────────────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ───────────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); + break; + } + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + uint8_t val = enc->spiRead(addr); + Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", g_activeEnc, + addr, val, val); + break; + } + + // ── Write single register "w " ────────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + break; + } + char *ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + enc->spiWrite(addr, val); + uint8_t rb = enc->spiRead(addr); + Serial.printf( + "[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────────── + case 'u': { + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + break; + } + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + Serial.printf("[ENC%u SPI] Registers unlocked (0xAB → Lock reg)\n", + g_activeEnc); + break; + } + + // ── Set zero position ───────────────────────────────────────────────────── + case 'z': { + AEAT8800 *enc = activeEncoder(); + if (!enc) { + Serial.printf("[ERR] ENC%u is not enabled.\n", g_activeEnc); + break; + } + Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow regs...\n", + g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_ZERO_POS_L, 0x00); + enc->spiWrite(REG_ZERO_POS_H, 0x00); + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, + zp == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn guard (must type "burn" exactly) ───────────────────────────────── + case 'b': + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + + // ── Help ────────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup +// ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // ── External antenna + // ───────────────────────────────────────────────────────── GPIO3 LOW + // activates the RF switch; GPIO14 HIGH selects the external antenna. + pinMode(WIFI_ENABLE, OUTPUT); + digitalWrite(WIFI_ENABLE, LOW); + delay(100); + pinMode(WIFI_ANT_CONFIG, OUTPUT); + digitalWrite(WIFI_ANT_CONFIG, HIGH); + + // ── Encoder configuration (wizard or defaults) + // ───────────────────────────────────────────── + EncoderConfig cfg1, cfg2; + if (RUN_SETUP_WIZARD) { + runSetupWizard(cfg1, cfg2); + } else { + applyDefaultDualConfig(cfg1, cfg2); + Serial.println(F( + "[INFO] Setup wizard skipped — ENC1+ENC2 on default pins, stream ON")); + } + + // ── GPIO init for enabled encoders + // ─────────────────────────────────────────── + if (g_enc1Enabled) + initEncoderPins(cfg1); + if (g_enc2Enabled) + initEncoderPins(cfg2); + + // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI + // read + delay(5); + + // ── Instantiate encoder objects + // ─────────────────────────────────────────────── + if (g_enc1Enabled) + g_enc1 = new AEAT8800(cfg1.pinCLK, cfg1.pinDIN, cfg1.pinDOUT, cfg1.pinSEL); + if (g_enc2Enabled) + g_enc2 = new AEAT8800(cfg2.pinCLK, cfg2.pinDIN, cfg2.pinDOUT, cfg2.pinSEL); + + // ── SPI configuration + // ──────────────────────────────────────────────────────── + Serial.println( + F("╔══════════════════════════════════════════════════════════╗")); + Serial.println( + F("║ AEAT-8800-Q24 Independent | XIAO ESP32-C6 ║")); + Serial.println( + F("╠══════════════════════════════════════════════════════════╣")); + + if (g_enc1Enabled) { + Serial.print(F("║ Configuring ENC1 ... ")); + bool ok = g_enc1->configure(); + Serial.println(ok ? F("OK ║") + : F("FAILED — SSI reads will still be tried ║")); + } + if (g_enc2Enabled) { + Serial.print(F("║ Configuring ENC2 ... ")); + bool ok = g_enc2->configure(); + Serial.println(ok ? F("OK ║") + : F("FAILED — SSI reads will still be tried ║")); + } + + Serial.println( + F("╠══════════════════════════════════════════════════════════╣")); + + // ── Initial SSI position read + // ───────────────────────────────────────────────── + double filt1 = 0, filt2 = 0; + bool r1 = false, r2 = false; + readBothEnabled(filt1, filt2, r1, r2); + + if (g_enc1Enabled) { + if (r1) + Serial.printf("║ ENC1 Position : %5u counts (%.3f deg) ║\n", + (unsigned)(filt1 + 0.5), countsToDeg((uint16_t)(filt1 + 0.5))); + else + Serial.println( + F("║ ENC1 Position : READ ERROR ║")); + } + if (g_enc2Enabled) { + if (r2) + Serial.printf("║ ENC2 Position : %5u counts (%.3f deg) ║\n", + (unsigned)(filt2 + 0.5), countsToDeg((uint16_t)(filt2 + 0.5))); + else + Serial.println( + F("║ ENC2 Position : READ ERROR ║")); + } + + Serial.println( + F("╠══════════════════════════════════════════════════════════╣")); + if (!RUN_SETUP_WIZARD) { + Serial.println( + F("║ Continuous stream ON (send 'c' to toggle) ║")); + } + Serial.println( + F("║ Type 'h' for command help ║")); + Serial.println( + F("╚══════════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop +// ──────────────────────────────────────────────────────────────── + +void loop() { + handleSerial(); + + if (g_streaming && (millis() - g_lastStream >= 33)) { + g_lastStream = millis(); + + double pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEnabled(pos1, pos2, ok1, ok2); + + if (g_enc1Enabled && g_enc2Enabled) { + float d1 = ok1 ? (float)displayDeg(1, pos1) : -1.0f; + float d2 = ok2 ? (float)displayDeg(2, pos2) : -1.0f; + if (ok1 && ok2) + Serial.printf("ENC1: %.3f deg | ENC2: %.3f deg\n", d1, d2); + else if (!ok1 && !ok2) + Serial.println(F("ENC1: ERR | ENC2: ERR")); + else if (!ok1) + Serial.printf("ENC1: ERR | ENC2: %.3f deg\n", d2); + else + Serial.printf("ENC1: %.3f deg | ENC2: ERR\n", d1); + } else if (g_enc1Enabled) { + if (ok1) + Serial.printf("ENC1: %.3f deg\n", displayDeg(1, pos1)); + else + Serial.println(F("ENC1: ERR")); + } else if (g_enc2Enabled) { + if (ok2) + Serial.printf("ENC2: %.3f deg\n", displayDeg(2, pos2)); + else + Serial.println(F("ENC2: ERR")); + } + } +} diff --git a/firmware/dual_aeat8800_star/dual_aeat8800_star.ino b/firmware/dual_aeat8800_star/dual_aeat8800_star.ino index c0fb79d..5f556e2 100644 --- a/firmware/dual_aeat8800_star/dual_aeat8800_star.ino +++ b/firmware/dual_aeat8800_star/dual_aeat8800_star.ino @@ -1,694 +1,694 @@ -/** - * ============================================================ - * AEAT-8800-Q24 — Dual 16-bit Absolute Magnetic Encoder - * Star-Topology Clock Wiring (each encoder has dedicated CLK) - * Board : Seeed Studio XIAO ESP32-C6 - * - * ── WHY STAR TOPOLOGY ──────────────────────────────────────── - * SSI protocol does not support multiple slaves on one shared - * clock line. An unclocked slave holds DOUT in high-impedance - * only when its own CLK is idle. Giving each encoder a dedicated - * CLK line means the inactive slave is never clocked, so its - * DOUT stays tri-state and bus contention is eliminated. - * - * ── PIN MAPPING ────────────────────────────────────────────── - * Signal │ Arduino │ GPIO │ Notes - * ────────────────┼─────────┼───────┼──────────────────────── - * CLK1 │ D8 │ 19 │ Encoder 1 dedicated clock - * CLK2 │ D5 │ 23 │ Encoder 2 dedicated clock - * DIN / NSL │ D10 │ 18 │ Shared: SSI enable / SPI MOSI - * DOUT │ D9 │ 20 │ Shared: data from encoders - * SEL1 │ D3 │ 21 │ Encoder 1 SSI_SPI_SEL - * SEL2 │ D4 │ 22 │ Encoder 2 SSI_SPI_SEL - * WIFI_ENABLE │ — │ 3 │ RF switch control (active LOW) - * WIFI_ANT_CONFIG │ — │ 14 │ Antenna select (HIGH = external) - * - * ── DUAL-ENCODER BUS ARBITRATION ───────────────────────────── - * SSI read ENC1 : SEL1=HIGH, SEL2=LOW, clock CLK1 × 20 bits. - * → ENC2 unclocked + SPI/idle → DOUT high-impedance. - * SSI read ENC2 : SEL2=HIGH, SEL1=LOW, clock CLK2 × 20 bits. - * → ENC1 unclocked + SPI/idle → DOUT high-impedance. - * SPI access ENC1: SEL1=LOW (SPI mode), SEL2=HIGH (SSI idle), - * bit-bang on CLK1. CLK2 stays idle — ENC2 DOUT stays quiet. - * SPI access ENC2: SEL2=LOW (SPI mode), SEL1=HIGH (SSI idle), - * bit-bang on CLK2. CLK1 stays idle — ENC1 DOUT stays quiet. - * - * ── SSI FRAME (20 bits, 16-bit resolution) ─────────────────── - * Bits [19:4] = 16-bit absolute position, MSB first - * Bit [3] = Ready (must be 1; retry if 0) - * Bit [2] = MHi (magnet too strong / too close) - * Bit [1] = MLo (magnet too weak / too far) - * Bit [0] = Even parity over all 20 bits - * Data sampled on the FALLING edge of CLK (datasheet p.15). - * - * ── SPI PROTOCOL ───────────────────────────────────────────── - * Write : 0b01_aaaaaa_dddddddd (16 bits, MSB first) - * Read : 0b10_aaaaaa (8-bit cmd) then 8-bit reply - * CLK idles HIGH (CPOL=1); encoder captures DIN on rising CLK (CPHA=1). - * - * ── KEY TIMING (datasheet Fig. 8 & timing table) ──────────────── - * Symbol │ Min │ Unit │ Datasheet description - * ──────────┼──────┼──────┼────────────────────────────────────────────── - * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time - * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and - * │ │ │ first SCL falling edge - * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock - * │ │ │ period for an SSI read - * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads - * ──────────┼──────┼──────┼────────────────────────────────────────────── - * Notes (datasheet p.15): - * • CLK = 1 when inactive; DIN = 1 when inactive. - * • CLK must be HIGH when switching between SSI and SPI modes. - * • NSL must be held HIGH for at least 3 ms after power-up before - * the first SSI read. - * • The user is advised to read from the SSI falling edge. - * • SSI data length depends on resolution setting: - * 16-bit → 20 total bits (16 pos + Ready + MHi + MLo + Parity) - * All timing margins use SSI_HALF_US = 5 µs (>> all minimum requirements). - * - * ── SERIAL COMMANDS ────────────────────────────────────────── - * p — Read position from both encoders (SSI, one-shot) - * c — Toggle continuous stream (both encoders, 100 ms) - * 1 / 2 — Select active encoder for SPI commands - * s — Dump all SPI config registers (active encoder) - * r — Read register at hex address e.g. "r 07" - * w — Write register e.g. "w 10 AB" - * u — Unlock config registers (0xAB → Lock reg) - * z — Set zero position = 0x0000 (shadow only) - * burn — Burn shadow regs to OTP ⚠ IRREVERSIBLE - * h — Show this help - * - * Author : Swaraj Dangare - * ============================================================ - */ - -// ─── Pin Definitions ────────────────────────────────────────────────────────── -#define PIN_CLK1 D8 // GPIO19 — Encoder 1 dedicated clock -#define PIN_CLK2 D8 // GPIO23 — Encoder 2 dedicated clock -#define PIN_DIN D10 // GPIO18 — Shared DIN / NSL (SSI enable / SPI MOSI) -#define PIN_DOUT D9 // GPIO20 — Shared DOUT (data output from encoders) -#define PIN_SEL1 D3 // GPIO21 — Encoder 1 SSI_SPI_SEL -#define PIN_SEL2 D4 // GPIO22 — Encoder 2 SSI_SPI_SEL -#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) -#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) - -// ─── Register Addresses ─────────────────────────────────────────────────────── -#define REG_CUST_RESERVE_0 0x00 -#define REG_CUST_RESERVE_1 0x01 -#define REG_ZERO_POS_L 0x02 -#define REG_ZERO_POS_H 0x03 -#define REG_CUST_CONFIG_0 0x04 -#define REG_CPR_SET1 0x05 -#define REG_CPR_SET2 0x06 -#define REG_RESOLUTION 0x07 -#define REG_VCC 0x0A -#define REG_LOCK 0x10 -#define REG_PROG_CUST 0x11 - -// ─── Register Values ────────────────────────────────────────────────────────── -#define UNLOCK_KEY 0xAB -#define PROG_KEY 0xA1 -#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V -#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair -#define VAL_CPR1 0x40 // 0x05 CPR1=0b0100, no hysteresis -#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF - -// ─── SSI Timing ─────────────────────────────────────────────────────────────── -// Timing constants derived from AEAT-8800-Q24 datasheet timing table (Fig. 8): -// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL falling edge -// tREQ2 >= 200 ns NSL low time after rising edge of last clock period for an SSI read -// tNSLH >= 200 ns NSL high time between 2 successive SSI reads -// tsw(SEL) >= 1 µs SSI_SPI_SEL switch time -// SSI_HALF_US = 5 µs is used for every CLK half-period and for all -// tREQ / tREQ2 / tNSLH margins, giving 7–25× margin over the minimums -// and matching the clock rate of the proven single-encoder firmware. -// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. -#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity -#define SSI_HALF_US 5 // 5 µs half-period → ~100 kHz SSI clock -#define SSI_MONOFLOP_US 20 // 20 µs monoflop recovery after NSL HIGH - -// ─── AEAT8800 Class ─────────────────────────────────────────────────────────── -// Each instance owns its CLK pin so SSI and SPI operations on enc1 and enc2 -// use completely independent clock lines — no shared-bus arbitration needed. - -class AEAT8800 { -public: - AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) - : _clk(clk), _din(din), _dout(dout), _sel(sel) {} - - /** Assert SEL HIGH → SSI mode. Call only after peer is deselected. */ - void select(); - - /** Assert SEL LOW → SPI/idle mode. Safe to call at any time. */ - void deselect(); - - /** Bit-bang one SPI register read using this encoder's CLK. */ - uint8_t spiRead(uint8_t addr); - - /** Bit-bang one SPI register write using this encoder's CLK. */ - void spiWrite(uint8_t addr, uint8_t data); - - /** Unlock and write all required OTP shadow registers with readback verify. - * Precondition: peer encoder's SEL must be HIGH (SSI idle) before calling - * so its DOUT does not contend the shared bus during SPI readback phases. - * Returns true on success, false if any register readback mismatches. */ - bool configure(); - - /** Perform one 20-bit SSI read. Stores position in `pos` (0–65535). - * Precondition: select() must already have been called. - * Returns false and prints the reason if Ready=0 or parity fails. */ - bool readAngleRaw(uint16_t &pos); - - /** Read angle in degrees [0.0, 360.0). Returns -1.0f on read error. */ - float readAngleDegrees(); - -private: - uint8_t _clk, _din, _dout, _sel; -}; - -// ─── select / deselect ──────────────────────────────────────────────────────── - -void AEAT8800::select() { - // CLK must be HIGH before the SEL transition (datasheet p.15 and p.21: - // "Make sure CLK is high when switching between SSI and SPI modes.") - digitalWrite(_clk, HIGH); - digitalWrite(_sel, HIGH); - delayMicroseconds(1); // tsw(SEL) >= 1 µs -} - -void AEAT8800::deselect() { - digitalWrite(_sel, LOW); - delayMicroseconds(1); // brief settle before next bus activity -} - -// ─── SPI Write ──────────────────────────────────────────────────────────────── - -void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { - int prevSel = digitalRead(_sel); - - // CLK HIGH before SEL edge; drive SEL LOW for SPI mode - digitalWrite(_clk, HIGH); - digitalWrite(_sel, LOW); - delayMicroseconds(1); // tsw(SEL) >= 1 µs - - // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first - uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); - - for (int i = 15; i >= 0; i--) { - digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK falling edge - digitalWrite(_clk, LOW); // falling edge - delayMicroseconds(SSI_HALF_US); - digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN - delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns - } - - digitalWrite(_din, HIGH); // release DIN to idle HIGH - digitalWrite(_clk, HIGH); // ensure CLK HIGH before SEL change - digitalWrite(_sel, prevSel); // restore caller's SEL state -} - -// ─── SPI Read ───────────────────────────────────────────────────────────────── - -uint8_t AEAT8800::spiRead(uint8_t addr) { - int prevSel = digitalRead(_sel); - - digitalWrite(_clk, HIGH); - digitalWrite(_sel, LOW); - delayMicroseconds(1); // tsw(SEL) >= 1 µs - - // 8-bit command: opcode 0b10 (2b) + addr (6b) - uint8_t cmd = (0b10u << 6) | (addr & 0x3F); - - for (int i = 7; i >= 0; i--) { - digitalWrite(_din, (cmd >> i) & 1u); - digitalWrite(_clk, LOW); - delayMicroseconds(SSI_HALF_US); - digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN - delayMicroseconds(SSI_HALF_US); - } - - digitalWrite(_din, HIGH); // release DIN; encoder now drives DOUT for reply - - uint8_t result = 0; - for (int i = 0; i < 8; i++) { - digitalWrite(_clk, LOW); // falling edge — encoder shifts DOUT - delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall - digitalWrite(_clk, HIGH); // rising edge — master captures DOUT - result = (result << 1) | (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) - delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns - } - - digitalWrite(_clk, HIGH); - digitalWrite(_din, HIGH); - digitalWrite(_sel, prevSel); - return result; -} - -// ─── Configure ──────────────────────────────────────────────────────────────── - -bool AEAT8800::configure() { - // Unlock must be the very first SPI write (datasheet p.10 note 3) - spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); // allow lock state to propagate internally - - struct RegTarget { uint8_t addr, val; const char* name; }; - static const RegTarget targets[] = { - { REG_VCC, VAL_VCC, "0x0A (VCC)" }, - { REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)" }, - { REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)" }, - { REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)" }, - }; - - for (const auto& r : targets) { - spiWrite(r.addr, r.val); - delayMicroseconds(5); // propagation margin before readback - uint8_t rb = spiRead(r.addr); - if (rb != r.val) { - Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", - r.name, r.val, rb); - return false; - } - } - - deselect(); // explicit deselect on exit - return true; -} - -// ─── SSI Read ───────────────────────────────────────────────────────────────── - -bool AEAT8800::readAngleRaw(uint16_t &pos) { - // Precondition: select() already called — SEL is HIGH, encoder in SSI mode - - // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) - digitalWrite(_clk, HIGH); - digitalWrite(_din, HIGH); - delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 successive SSI reads - - // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) - digitalWrite(_din, LOW); - delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL falling edge and first SCL falling edge - - uint32_t raw = 0; - for (int i = 0; i < SSI_TOTAL_BITS; i++) { - digitalWrite(_clk, LOW); // SCL falling edge — encoder shifts next bit onto DO - delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet (data stable after CLK fall) - raw = (raw << 1) | (uint32_t)digitalRead(_dout); // sample DO after falling edge (datasheet Fig. 8, p.15) - digitalWrite(_clk, HIGH); // SCL rising edge - delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) - } - - delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising edge of last clock period for an SSI read - - // End of frame: NSL HIGH → load mode (encoder resumes tracking position) - digitalWrite(_din, HIGH); - delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes internal load cycle - - // Unpack 20-bit frame (datasheet Fig. 8–9) - uint8_t parity = (raw >> 0) & 0x1u; - uint8_t mlo = (raw >> 1) & 0x1u; - uint8_t mhi = (raw >> 2) & 0x1u; - uint8_t ready = (raw >> 3) & 0x1u; - uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); - - (void)parity; // value is implicitly checked via __builtin_popcount below - - if (!ready) { - Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", (unsigned)raw); - return false; - } - - if (mhi) Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); - if (mlo) Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); - - // Even parity: total 1-bit count across all 20 raw bits must be even - if (__builtin_popcount((unsigned)raw) % 2 != 0) { - Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); - return false; - } - - pos = position; - return true; -} - -float AEAT8800::readAngleDegrees() { - uint16_t raw = 0; - if (!readAngleRaw(raw)) return -1.0f; - return (raw / 65536.0f) * 360.0f; -} - -// ─── Global Encoder Instances ───────────────────────────────────────────────── -AEAT8800 enc1(PIN_CLK1, PIN_DIN, PIN_DOUT, PIN_SEL1); -AEAT8800 enc2(PIN_CLK2, PIN_DIN, PIN_DOUT, PIN_SEL2); - -// ─── Global State ───────────────────────────────────────────────────────────── -static bool g_streaming = false; -static uint32_t g_lastStream = 0; -static uint8_t g_activeEnc = 1; // 1 or 2 — target for SPI serial commands - -// ─── Helpers ───────────────────────────────────────────────────────────────── - -/** Return a pointer to the currently selected encoder. */ -static inline AEAT8800* activeEncoder() { - return (g_activeEnc == 1) ? &enc1 : &enc2; -} - -/** Raise the peer's SEL to SSI/idle, isolating its DOUT from the bus. */ -static inline void isolatePeer() { - if (g_activeEnc == 1) { enc2.select(); } else { enc1.select(); } -} - -/** Lower the peer's SEL back to SPI/idle after the transaction. */ -static inline void releasePeer() { - if (g_activeEnc == 1) { enc2.deselect(); } else { enc1.deselect(); } -} - -const char* resolutionStr(uint8_t regVal) { - switch (regVal & 0x03) { - case 0x00: return "10-bit (1024 cpr)"; - case 0x01: return "12-bit (4096 cpr)"; - case 0x02: return "14-bit (16384 cpr)"; - case 0x03: return "16-bit (65536 cpr)"; - default: return "unknown"; - } -} - -// ─── Serial Output Helpers ──────────────────────────────────────────────────── - -void printSinglePosition(uint8_t id, uint16_t pos, bool ok) { - if (ok) { - double deg = (pos / 65536.0) * 360.0; - Serial.printf("[ENC%u] Pos=%5u Angle=%8.4f deg\n", id, pos, deg); - } else { - Serial.printf("[ENC%u] READ ERROR\n", id); - } -} - -void printAllRegisters() { - AEAT8800* enc = activeEncoder(); - - Serial.printf("\n╔══════════════════════════════════════════════╗\n"); - Serial.printf( "║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", g_activeEnc); - Serial.println(F("╠══════════════════════════════════════════════╣")); - - struct { uint8_t addr; const char* name; } regs[] = { - { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, - { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, - { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, - { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, - { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, - { REG_CPR_SET1, "CPR_Set1 (0x05)" }, - { REG_CPR_SET2, "CPR_Set2 (0x06)" }, - { REG_RESOLUTION, "Resolution (0x07)" }, - { REG_LOCK, "Lock (0x10)" }, - }; - - isolatePeer(); // peer SEL HIGH → its DOUT tri-state during SPI reads - - for (auto& r : regs) { - uint8_t val = enc->spiRead(r.addr); - Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); - } - - uint8_t lo = enc->spiRead(REG_ZERO_POS_L); - uint8_t hi = enc->spiRead(REG_ZERO_POS_H); - uint16_t zp = ((uint16_t)hi << 8) | lo; - uint8_t resReg = enc->spiRead(REG_RESOLUTION); - - releasePeer(); - - Serial.println(F("╠══════════════════════════════════════════════╣")); - Serial.printf( "║ HW Zero Pos : %5u (%.4f deg) ║\n", - zp, (zp / 65536.0) * 360.0); - Serial.printf( "║ Resolution : %-30s ║\n", resolutionStr(resReg)); - Serial.println(F("╚══════════════════════════════════════════════╝\n")); -} - -void printHelp() { - Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); - Serial.println(F("║ AEAT-8800-Q24 DUAL Star-Topology Command Menu ║")); - Serial.println(F("╠══════════════════════════════════════════════════════╣")); - Serial.println(F("║ p — Read both encoders (SSI, one-shot) ║")); - Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); - Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); - Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); - Serial.println(F("║ r — Read register e.g. 'r 07' ║")); - Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); - Serial.println(F("║ u — Unlock config registers ║")); - Serial.println(F("║ z — Set zero position = 0x0000 ║")); - Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); - Serial.println(F("║ h — Show this help ║")); - Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); -} - -// ─── Dual SSI Read (used by 'p' command and continuous stream) ──────────────── - -static void readBothEncoders(uint16_t &pos1, uint16_t &pos2, - bool &ok1, bool &ok2) { - // Read ENC1: SEL2 LOW (already), raise SEL1, clock CLK1 - enc2.deselect(); - enc1.select(); - ok1 = enc1.readAngleRaw(pos1); - enc1.deselect(); - - delay(1); // inter-encoder gap; NSL HIGH > tNSLH before next read - - // Read ENC2: SEL1 LOW (already), raise SEL2, clock CLK2 - enc1.deselect(); - enc2.select(); - ok2 = enc2.readAngleRaw(pos2); - enc2.deselect(); -} - -// ─── Serial Command Parser ──────────────────────────────────────────────────── - -void handleSerial() { - if (!Serial.available()) return; - - String line = Serial.readStringUntil('\n'); - line.trim(); - if (line.length() == 0) return; - - // OTP burn requires the exact string "burn" to prevent accidental triggers - if (line.equalsIgnoreCase("burn")) { - AEAT8800* enc = activeEncoder(); - Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", g_activeEnc); - enc->spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - enc->spiWrite(REG_PROG_CUST, PROG_KEY); - Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); - return; - } - - char cmd = (char)tolower((unsigned char)line[0]); - - switch (cmd) { - - // ── Read both positions (SSI) ───────────────────────────────────────── - case 'p': { - uint16_t pos1 = 0, pos2 = 0; - bool ok1 = false, ok2 = false; - readBothEncoders(pos1, pos2, ok1, ok2); - printSinglePosition(1, pos1, ok1); - printSinglePosition(2, pos2, ok2); - break; - } - - // ── Continuous stream toggle ────────────────────────────────────────── - case 'c': - g_streaming = !g_streaming; - Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); - break; - - // ── Select active encoder for SPI operations ────────────────────────── - case '1': - g_activeEnc = 1; - Serial.println(F("[INFO] Active encoder: ENC1")); - break; - case '2': - g_activeEnc = 2; - Serial.println(F("[INFO] Active encoder: ENC2")); - break; - - // ── Register dump (SPI) ─────────────────────────────────────────────── - case 's': - printAllRegisters(); - break; - - // ── Read single register "r " ───────────────────────────── - case 'r': { - if (line.length() < 3) { - Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); - break; - } - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); - isolatePeer(); - uint8_t val = activeEncoder()->spiRead(addr); - releasePeer(); - Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", - g_activeEnc, addr, val, val); - break; - } - - // ── Write single register "w " ────────────────── - case 'w': { - if (line.length() < 5) { - Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); - break; - } - char* ptr = nullptr; - uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); - uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); - activeEncoder()->spiWrite(addr, val); - isolatePeer(); - uint8_t rb = activeEncoder()->spiRead(addr); - releasePeer(); - Serial.printf("[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", - g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); - break; - } - - // ── Unlock registers ────────────────────────────────────────────────── - case 'u': - activeEncoder()->spiWrite(REG_LOCK, UNLOCK_KEY); - Serial.printf("[ENC%u SPI] Registers unlocked (0xAB written to Lock reg)\n", - g_activeEnc); - break; - - // ── Set zero position ───────────────────────────────────────────────── - case 'z': { - AEAT8800* enc = activeEncoder(); - Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow registers...\n", - g_activeEnc); - enc->spiWrite(REG_LOCK, UNLOCK_KEY); - delayMicroseconds(10); - enc->spiWrite(REG_ZERO_POS_L, 0x00); - enc->spiWrite(REG_ZERO_POS_H, 0x00); - isolatePeer(); - uint8_t lo = enc->spiRead(REG_ZERO_POS_L); - uint8_t hi = enc->spiRead(REG_ZERO_POS_H); - releasePeer(); - uint16_t zp = ((uint16_t)hi << 8) | lo; - Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, - zp == 0x0000 ? "OK" : "MISMATCH!"); - break; - } - - // ── Burn guard (user must type "burn" exactly) ──────────────────────── - case 'b': - Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); - Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); - break; - - // ── Help ────────────────────────────────────────────────────────────── - case 'h': - default: - printHelp(); - break; - } -} - -// ─── Setup ──────────────────────────────────────────────────────────────────── - -void setup() { - Serial.begin(115200); - delay(300); - - // ── External antenna ───────────────────────────────────────────────────── - // GPIO3 LOW activates the RF switch control circuit; GPIO14 HIGH selects - // the external antenna over the built-in ceramic one. - pinMode(WIFI_ENABLE, OUTPUT); - digitalWrite(WIFI_ENABLE, LOW); // activate RF switch control - delay(100); - pinMode(WIFI_ANT_CONFIG, OUTPUT); - digitalWrite(WIFI_ANT_CONFIG, HIGH); // select external antenna - - // ── GPIO init — all bus pins to safe idle states ────────────────────────── - pinMode(PIN_CLK1, OUTPUT); digitalWrite(PIN_CLK1, HIGH); // CLK1 idles HIGH - pinMode(PIN_CLK2, OUTPUT); digitalWrite(PIN_CLK2, HIGH); // CLK2 idles HIGH - pinMode(PIN_DIN, OUTPUT); digitalWrite(PIN_DIN, HIGH); // NSL/DIN idles HIGH - pinMode(PIN_DOUT, INPUT); - pinMode(PIN_SEL1, OUTPUT); digitalWrite(PIN_SEL1, LOW); // SPI/idle mode - pinMode(PIN_SEL2, OUTPUT); digitalWrite(PIN_SEL2, LOW); // SPI/idle mode - - // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI read - delay(5); - - // ── Boot banner ─────────────────────────────────────────────────────────── - Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); - Serial.println(F( "║ AEAT-8800-Q24 DUAL | Star-CLK | XIAO ESP32-C6 ║")); - Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); - Serial.println(F( "║ CLK1=GPIO19(D8) CLK2=GPIO23(D5) DIN=GPIO18(D10) ║")); - Serial.println(F( "║ DOUT=GPIO20(D9) SEL1=GPIO21(D3) SEL2=GPIO22(D4) ║")); - Serial.println(F( "║ Antenna : External [GPIO3=LOW, GPIO14=HIGH] ║")); - Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); - - // ── Configure ENC1 ──────────────────────────────────────────────────────── - // Raise SEL2 (ENC2 → SSI/idle) so ENC2's DOUT does not contend the shared - // bus during ENC1's SPI readback transactions. - Serial.print(F( "║ Configuring ENC1 ... ")); - enc2.select(); - delayMicroseconds(1); - bool ok1 = enc1.configure(); // leaves ENC1 SEL LOW on exit - enc2.deselect(); - Serial.println(ok1 ? F("OK ║") - : F("FAILED ║")); - - // ── Configure ENC2 ──────────────────────────────────────────────────────── - Serial.print(F( "║ Configuring ENC2 ... ")); - enc1.select(); - delayMicroseconds(1); - bool ok2 = enc2.configure(); // leaves ENC2 SEL LOW on exit - enc1.deselect(); - Serial.println(ok2 ? F("OK ║") - : F("FAILED ║")); - - Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); - - // ── Initial position read ───────────────────────────────────────────────── - uint16_t pos1 = 0, pos2 = 0; - bool r1 = false, r2 = false; - readBothEncoders(pos1, pos2, r1, r2); - - if (r1) - Serial.printf( "║ ENC1 Position : %5u counts (%.4f deg) ║\n", - pos1, (pos1 / 65536.0) * 360.0); - else - Serial.println(F("║ ENC1 Position : READ ERROR ║")); - - if (r2) - Serial.printf( "║ ENC2 Position : %5u counts (%.4f deg) ║\n", - pos2, (pos2 / 65536.0) * 360.0); - else - Serial.println(F("║ ENC2 Position : READ ERROR ║")); - - Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); - Serial.println(F( "║ Type 'h' for command help ║")); - Serial.println(F( "╚══════════════════════════════════════════════════════════╝\n")); -} - -// ─── Main Loop ──────────────────────────────────────────────────────────────── - -void loop() { - handleSerial(); - - if (g_streaming && (millis() - g_lastStream >= 100)) { - g_lastStream = millis(); - - uint16_t pos1 = 0, pos2 = 0; - bool ok1 = false, ok2 = false; - readBothEncoders(pos1, pos2, ok1, ok2); - - float deg1 = ok1 ? (pos1 / 65536.0f) * 360.0f : -1.0f; - float deg2 = ok2 ? (pos2 / 65536.0f) * 360.0f : -1.0f; - - if (ok1 && ok2) { - Serial.printf("ENC1: %.4f deg | ENC2: %.4f deg\n", deg1, deg2); - } else if (!ok1 && !ok2) { - Serial.println(F("ENC1: ERR | ENC2: ERR")); - } else if (!ok1) { - Serial.printf("ENC1: ERR | ENC2: %.4f deg\n", deg2); - } else { - Serial.printf("ENC1: %.4f deg | ENC2: ERR\n", deg1); - } - } -} +/** + * ============================================================ + * AEAT-8800-Q24 — Dual 16-bit Absolute Magnetic Encoder + * Star-Topology Clock Wiring (each encoder has dedicated CLK) + * Board : Seeed Studio XIAO ESP32-C6 + * + * ── WHY STAR TOPOLOGY ──────────────────────────────────────── + * SSI protocol does not support multiple slaves on one shared + * clock line. An unclocked slave holds DOUT in high-impedance + * only when its own CLK is idle. Giving each encoder a dedicated + * CLK line means the inactive slave is never clocked, so its + * DOUT stays tri-state and bus contention is eliminated. + * + * ── PIN MAPPING ────────────────────────────────────────────── + * Signal │ Arduino │ GPIO │ Notes + * ────────────────┼─────────┼───────┼──────────────────────── + * CLK1 │ D8 │ 19 │ Encoder 1 dedicated clock + * CLK2 │ D5 │ 23 │ Encoder 2 dedicated clock + * DIN / NSL │ D10 │ 18 │ Shared: SSI enable / SPI MOSI + * DOUT │ D9 │ 20 │ Shared: data from encoders + * SEL1 │ D3 │ 21 │ Encoder 1 SSI_SPI_SEL + * SEL2 │ D4 │ 22 │ Encoder 2 SSI_SPI_SEL + * WIFI_ENABLE │ — │ 3 │ RF switch control (active LOW) + * WIFI_ANT_CONFIG │ — │ 14 │ Antenna select (HIGH = external) + * + * ── DUAL-ENCODER BUS ARBITRATION ───────────────────────────── + * SSI read ENC1 : SEL1=HIGH, SEL2=LOW, clock CLK1 × 20 bits. + * → ENC2 unclocked + SPI/idle → DOUT high-impedance. + * SSI read ENC2 : SEL2=HIGH, SEL1=LOW, clock CLK2 × 20 bits. + * → ENC1 unclocked + SPI/idle → DOUT high-impedance. + * SPI access ENC1: SEL1=LOW (SPI mode), SEL2=HIGH (SSI idle), + * bit-bang on CLK1. CLK2 stays idle — ENC2 DOUT stays quiet. + * SPI access ENC2: SEL2=LOW (SPI mode), SEL1=HIGH (SSI idle), + * bit-bang on CLK2. CLK1 stays idle — ENC1 DOUT stays quiet. + * + * ── SSI FRAME (20 bits, 16-bit resolution) ─────────────────── + * Bits [19:4] = 16-bit absolute position, MSB first + * Bit [3] = Ready (must be 1; retry if 0) + * Bit [2] = MHi (magnet too strong / too close) + * Bit [1] = MLo (magnet too weak / too far) + * Bit [0] = Even parity over all 20 bits + * Data sampled on the FALLING edge of CLK (datasheet p.15). + * + * ── SPI PROTOCOL ───────────────────────────────────────────── + * Write : 0b01_aaaaaa_dddddddd (16 bits, MSB first) + * Read : 0b10_aaaaaa (8-bit cmd) then 8-bit reply + * CLK idles HIGH (CPOL=1); encoder captures DIN on rising CLK (CPHA=1). + * + * ── KEY TIMING (datasheet Fig. 8 & timing table) ──────────────── + * Symbol │ Min │ Unit │ Datasheet description + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * tsw(SEL) │ 1 │ µs │ SSI_SPI_SEL switch time + * tREQ │ 300 │ ns │ SCL high time between NSL falling edge and + * │ │ │ first SCL falling edge + * tREQ2 │ 200 │ ns │ NSL low time after rising edge of last clock + * │ │ │ period for an SSI read + * tNSLH │ 200 │ ns │ NSL high time between 2 successive SSI reads + * ──────────┼──────┼──────┼────────────────────────────────────────────── + * Notes (datasheet p.15): + * • CLK = 1 when inactive; DIN = 1 when inactive. + * • CLK must be HIGH when switching between SSI and SPI modes. + * • NSL must be held HIGH for at least 3 ms after power-up before + * the first SSI read. + * • The user is advised to read from the SSI falling edge. + * • SSI data length depends on resolution setting: + * 16-bit → 20 total bits (16 pos + Ready + MHi + MLo + Parity) + * All timing margins use SSI_HALF_US = 5 µs (>> all minimum requirements). + * + * ── SERIAL COMMANDS ────────────────────────────────────────── + * p — Read position from both encoders (SSI, one-shot) + * c — Toggle continuous stream (both encoders, 100 ms) + * 1 / 2 — Select active encoder for SPI commands + * s — Dump all SPI config registers (active encoder) + * r — Read register at hex address e.g. "r 07" + * w — Write register e.g. "w 10 AB" + * u — Unlock config registers (0xAB → Lock reg) + * z — Set zero position = 0x0000 (shadow only) + * burn — Burn shadow regs to OTP ⚠ IRREVERSIBLE + * h — Show this help + * + * Author : Swaraj Dangare + * ============================================================ + */ + +// ─── Pin Definitions ────────────────────────────────────────────────────────── +#define PIN_CLK1 D8 // GPIO19 — Encoder 1 dedicated clock +#define PIN_CLK2 D8 // GPIO23 — Encoder 2 dedicated clock +#define PIN_DIN D10 // GPIO18 — Shared DIN / NSL (SSI enable / SPI MOSI) +#define PIN_DOUT D9 // GPIO20 — Shared DOUT (data output from encoders) +#define PIN_SEL1 D3 // GPIO21 — Encoder 1 SSI_SPI_SEL +#define PIN_SEL2 D4 // GPIO22 — Encoder 2 SSI_SPI_SEL +#define WIFI_ENABLE 3 // GPIO3 — RF switch control (LOW = active) +#define WIFI_ANT_CONFIG 14 // GPIO14 — Antenna select (HIGH = external) + +// ─── Register Addresses ─────────────────────────────────────────────────────── +#define REG_CUST_RESERVE_0 0x00 +#define REG_CUST_RESERVE_1 0x01 +#define REG_ZERO_POS_L 0x02 +#define REG_ZERO_POS_H 0x03 +#define REG_CUST_CONFIG_0 0x04 +#define REG_CPR_SET1 0x05 +#define REG_CPR_SET2 0x06 +#define REG_RESOLUTION 0x07 +#define REG_VCC 0x0A +#define REG_LOCK 0x10 +#define REG_PROG_CUST 0x11 + +// ─── Register Values ────────────────────────────────────────────────────────── +#define UNLOCK_KEY 0xAB +#define PROG_KEY 0xA1 +#define VAL_VCC 0x00 // 0x0A [1]=0 → 3.3 V +#define VAL_CFG0 0x00 // 0x04 PWM mode, 1 pole-pair +#define VAL_CPR1 0x40 // 0x05 CPR1=0b0100, no hysteresis +#define VAL_CPR2 0x04 // 0x06 16-bit abs, CW, zero-latency OFF + +// ─── SSI Timing ─────────────────────────────────────────────────────────────── +// Timing constants derived from AEAT-8800-Q24 datasheet timing table (Fig. 8): +// tREQ >= 300 ns SCL high time between NSL falling edge and first SCL falling edge +// tREQ2 >= 200 ns NSL low time after rising edge of last clock period for an SSI read +// tNSLH >= 200 ns NSL high time between 2 successive SSI reads +// tsw(SEL) >= 1 µs SSI_SPI_SEL switch time +// SSI_HALF_US = 5 µs is used for every CLK half-period and for all +// tREQ / tREQ2 / tNSLH margins, giving 7–25× margin over the minimums +// and matching the clock rate of the proven single-encoder firmware. +// SSI_MONOFLOP_US: encoder internal load-cycle recovery after NSL goes HIGH. +#define SSI_TOTAL_BITS 20 // 16-bit position + Ready + MHi + MLo + Parity +#define SSI_HALF_US 5 // 5 µs half-period → ~100 kHz SSI clock +#define SSI_MONOFLOP_US 20 // 20 µs monoflop recovery after NSL HIGH + +// ─── AEAT8800 Class ─────────────────────────────────────────────────────────── +// Each instance owns its CLK pin so SSI and SPI operations on enc1 and enc2 +// use completely independent clock lines — no shared-bus arbitration needed. + +class AEAT8800 { +public: + AEAT8800(uint8_t clk, uint8_t din, uint8_t dout, uint8_t sel) + : _clk(clk), _din(din), _dout(dout), _sel(sel) {} + + /** Assert SEL HIGH → SSI mode. Call only after peer is deselected. */ + void select(); + + /** Assert SEL LOW → SPI/idle mode. Safe to call at any time. */ + void deselect(); + + /** Bit-bang one SPI register read using this encoder's CLK. */ + uint8_t spiRead(uint8_t addr); + + /** Bit-bang one SPI register write using this encoder's CLK. */ + void spiWrite(uint8_t addr, uint8_t data); + + /** Unlock and write all required OTP shadow registers with readback verify. + * Precondition: peer encoder's SEL must be HIGH (SSI idle) before calling + * so its DOUT does not contend the shared bus during SPI readback phases. + * Returns true on success, false if any register readback mismatches. */ + bool configure(); + + /** Perform one 20-bit SSI read. Stores position in `pos` (0–65535). + * Precondition: select() must already have been called. + * Returns false and prints the reason if Ready=0 or parity fails. */ + bool readAngleRaw(uint16_t &pos); + + /** Read angle in degrees [0.0, 360.0). Returns -1.0f on read error. */ + float readAngleDegrees(); + +private: + uint8_t _clk, _din, _dout, _sel; +}; + +// ─── select / deselect ──────────────────────────────────────────────────────── + +void AEAT8800::select() { + // CLK must be HIGH before the SEL transition (datasheet p.15 and p.21: + // "Make sure CLK is high when switching between SSI and SPI modes.") + digitalWrite(_clk, HIGH); + digitalWrite(_sel, HIGH); + delayMicroseconds(1); // tsw(SEL) >= 1 µs +} + +void AEAT8800::deselect() { + digitalWrite(_sel, LOW); + delayMicroseconds(1); // brief settle before next bus activity +} + +// ─── SPI Write ──────────────────────────────────────────────────────────────── + +void AEAT8800::spiWrite(uint8_t addr, uint8_t data) { + int prevSel = digitalRead(_sel); + + // CLK HIGH before SEL edge; drive SEL LOW for SPI mode + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 16-bit frame: opcode 0b01 (2b) + addr (6b) + data (8b), MSB first + uint16_t word = (0b01u << 14) | ((addr & 0x3F) << 8) | (data & 0xFF); + + for (int i = 15; i >= 0; i--) { + digitalWrite(_din, (word >> i) & 1u); // DIN valid before CLK falling edge + digitalWrite(_clk, LOW); // falling edge + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns + } + + digitalWrite(_din, HIGH); // release DIN to idle HIGH + digitalWrite(_clk, HIGH); // ensure CLK HIGH before SEL change + digitalWrite(_sel, prevSel); // restore caller's SEL state +} + +// ─── SPI Read ───────────────────────────────────────────────────────────────── + +uint8_t AEAT8800::spiRead(uint8_t addr) { + int prevSel = digitalRead(_sel); + + digitalWrite(_clk, HIGH); + digitalWrite(_sel, LOW); + delayMicroseconds(1); // tsw(SEL) >= 1 µs + + // 8-bit command: opcode 0b10 (2b) + addr (6b) + uint8_t cmd = (0b10u << 6) | (addr & 0x3F); + + for (int i = 7; i >= 0; i--) { + digitalWrite(_din, (cmd >> i) & 1u); + digitalWrite(_clk, LOW); + delayMicroseconds(SSI_HALF_US); + digitalWrite(_clk, HIGH); // rising edge — encoder captures DIN + delayMicroseconds(SSI_HALF_US); + } + + digitalWrite(_din, HIGH); // release DIN; encoder now drives DOUT for reply + + uint8_t result = 0; + for (int i = 0; i < 8; i++) { + digitalWrite(_clk, LOW); // falling edge — encoder shifts DOUT + delayMicroseconds(SSI_HALF_US); // DOUT valid <= 200 ns after CLK fall + digitalWrite(_clk, HIGH); // rising edge — master captures DOUT + result = (result << 1) | (uint8_t)digitalRead(_dout); // sample on rising edge (datasheet p.20) + delayMicroseconds(SSI_HALF_US); // last iteration: thi(CLK) >= 300 ns + } + + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + digitalWrite(_sel, prevSel); + return result; +} + +// ─── Configure ──────────────────────────────────────────────────────────────── + +bool AEAT8800::configure() { + // Unlock must be the very first SPI write (datasheet p.10 note 3) + spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); // allow lock state to propagate internally + + struct RegTarget { uint8_t addr, val; const char* name; }; + static const RegTarget targets[] = { + { REG_VCC, VAL_VCC, "0x0A (VCC)" }, + { REG_CUST_CONFIG_0, VAL_CFG0, "0x04 (CFG0)" }, + { REG_CPR_SET1, VAL_CPR1, "0x05 (CPR1)" }, + { REG_CPR_SET2, VAL_CPR2, "0x06 (CPR2)" }, + }; + + for (const auto& r : targets) { + spiWrite(r.addr, r.val); + delayMicroseconds(5); // propagation margin before readback + uint8_t rb = spiRead(r.addr); + if (rb != r.val) { + Serial.printf("[ERR] Reg %s verify: wrote 0x%02X readback 0x%02X\n", + r.name, r.val, rb); + return false; + } + } + + deselect(); // explicit deselect on exit + return true; +} + +// ─── SSI Read ───────────────────────────────────────────────────────────────── + +bool AEAT8800::readAngleRaw(uint16_t &pos) { + // Precondition: select() already called — SEL is HIGH, encoder in SSI mode + + // CLK = 1 when inactive; DIN = 1 when inactive (datasheet note) + digitalWrite(_clk, HIGH); + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_HALF_US); // tNSLH >= 200 ns: NSL high time between 2 successive SSI reads + + // NSL LOW → shift mode: encoder freezes position into shift register (Fig. 8) + digitalWrite(_din, LOW); + delayMicroseconds(SSI_HALF_US); // tREQ >= 300 ns: SCL high time between NSL falling edge and first SCL falling edge + + uint32_t raw = 0; + for (int i = 0; i < SSI_TOTAL_BITS; i++) { + digitalWrite(_clk, LOW); // SCL falling edge — encoder shifts next bit onto DO + delayMicroseconds(SSI_HALF_US); // read from SSI falling edge per datasheet (data stable after CLK fall) + raw = (raw << 1) | (uint32_t)digitalRead(_dout); // sample DO after falling edge (datasheet Fig. 8, p.15) + digitalWrite(_clk, HIGH); // SCL rising edge + delayMicroseconds(SSI_HALF_US); // CLK high hold (CLK = 1 when inactive) + } + + delayMicroseconds(SSI_HALF_US); // tREQ2 >= 200 ns: NSL low time after rising edge of last clock period for an SSI read + + // End of frame: NSL HIGH → load mode (encoder resumes tracking position) + digitalWrite(_din, HIGH); + delayMicroseconds(SSI_MONOFLOP_US); // monoflop recovery: encoder completes internal load cycle + + // Unpack 20-bit frame (datasheet Fig. 8–9) + uint8_t parity = (raw >> 0) & 0x1u; + uint8_t mlo = (raw >> 1) & 0x1u; + uint8_t mhi = (raw >> 2) & 0x1u; + uint8_t ready = (raw >> 3) & 0x1u; + uint16_t position = (uint16_t)((raw >> 4) & 0xFFFFu); + + (void)parity; // value is implicitly checked via __builtin_popcount below + + if (!ready) { + Serial.printf("[ERR] Ready=0 (raw=0x%05X) — data not valid\n", (unsigned)raw); + return false; + } + + if (mhi) Serial.println(F("[WARN] MHi=1 — magnet too strong / too close")); + if (mlo) Serial.println(F("[WARN] MLo=1 — magnet too weak / too far")); + + // Even parity: total 1-bit count across all 20 raw bits must be even + if (__builtin_popcount((unsigned)raw) % 2 != 0) { + Serial.printf("[ERR] Parity error (raw=0x%05X)\n", (unsigned)raw); + return false; + } + + pos = position; + return true; +} + +float AEAT8800::readAngleDegrees() { + uint16_t raw = 0; + if (!readAngleRaw(raw)) return -1.0f; + return (raw / 65536.0f) * 360.0f; +} + +// ─── Global Encoder Instances ───────────────────────────────────────────────── +AEAT8800 enc1(PIN_CLK1, PIN_DIN, PIN_DOUT, PIN_SEL1); +AEAT8800 enc2(PIN_CLK2, PIN_DIN, PIN_DOUT, PIN_SEL2); + +// ─── Global State ───────────────────────────────────────────────────────────── +static bool g_streaming = false; +static uint32_t g_lastStream = 0; +static uint8_t g_activeEnc = 1; // 1 or 2 — target for SPI serial commands + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +/** Return a pointer to the currently selected encoder. */ +static inline AEAT8800* activeEncoder() { + return (g_activeEnc == 1) ? &enc1 : &enc2; +} + +/** Raise the peer's SEL to SSI/idle, isolating its DOUT from the bus. */ +static inline void isolatePeer() { + if (g_activeEnc == 1) { enc2.select(); } else { enc1.select(); } +} + +/** Lower the peer's SEL back to SPI/idle after the transaction. */ +static inline void releasePeer() { + if (g_activeEnc == 1) { enc2.deselect(); } else { enc1.deselect(); } +} + +const char* resolutionStr(uint8_t regVal) { + switch (regVal & 0x03) { + case 0x00: return "10-bit (1024 cpr)"; + case 0x01: return "12-bit (4096 cpr)"; + case 0x02: return "14-bit (16384 cpr)"; + case 0x03: return "16-bit (65536 cpr)"; + default: return "unknown"; + } +} + +// ─── Serial Output Helpers ──────────────────────────────────────────────────── + +void printSinglePosition(uint8_t id, uint16_t pos, bool ok) { + if (ok) { + double deg = (pos / 65536.0) * 360.0; + Serial.printf("[ENC%u] Pos=%5u Angle=%8.4f deg\n", id, pos, deg); + } else { + Serial.printf("[ENC%u] READ ERROR\n", id); + } +} + +void printAllRegisters() { + AEAT8800* enc = activeEncoder(); + + Serial.printf("\n╔══════════════════════════════════════════════╗\n"); + Serial.printf( "║ AEAT-8800-Q24 — ENC%u SPI Register Dump ║\n", g_activeEnc); + Serial.println(F("╠══════════════════════════════════════════════╣")); + + struct { uint8_t addr; const char* name; } regs[] = { + { REG_CUST_RESERVE_0, "CustReserve0 (0x00)" }, + { REG_CUST_RESERVE_1, "CustReserve1 (0x01)" }, + { REG_ZERO_POS_L, "ZeroPos_L (0x02)" }, + { REG_ZERO_POS_H, "ZeroPos_H (0x03)" }, + { REG_CUST_CONFIG_0, "CustConfig0 (0x04)" }, + { REG_CPR_SET1, "CPR_Set1 (0x05)" }, + { REG_CPR_SET2, "CPR_Set2 (0x06)" }, + { REG_RESOLUTION, "Resolution (0x07)" }, + { REG_LOCK, "Lock (0x10)" }, + }; + + isolatePeer(); // peer SEL HIGH → its DOUT tri-state during SPI reads + + for (auto& r : regs) { + uint8_t val = enc->spiRead(r.addr); + Serial.printf("║ %-22s 0x%02X (%3u) ║\n", r.name, val, val); + } + + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + uint16_t zp = ((uint16_t)hi << 8) | lo; + uint8_t resReg = enc->spiRead(REG_RESOLUTION); + + releasePeer(); + + Serial.println(F("╠══════════════════════════════════════════════╣")); + Serial.printf( "║ HW Zero Pos : %5u (%.4f deg) ║\n", + zp, (zp / 65536.0) * 360.0); + Serial.printf( "║ Resolution : %-30s ║\n", resolutionStr(resReg)); + Serial.println(F("╚══════════════════════════════════════════════╝\n")); +} + +void printHelp() { + Serial.println(F("\n╔══════════════════════════════════════════════════════╗")); + Serial.println(F("║ AEAT-8800-Q24 DUAL Star-Topology Command Menu ║")); + Serial.println(F("╠══════════════════════════════════════════════════════╣")); + Serial.println(F("║ p — Read both encoders (SSI, one-shot) ║")); + Serial.println(F("║ c — Toggle continuous stream (100 ms) ║")); + Serial.println(F("║ 1 / 2 — Select active encoder for SPI cmds ║")); + Serial.println(F("║ s — Dump SPI registers (active encoder) ║")); + Serial.println(F("║ r — Read register e.g. 'r 07' ║")); + Serial.println(F("║ w — Write register e.g. 'w 10 AB' ║")); + Serial.println(F("║ u — Unlock config registers ║")); + Serial.println(F("║ z — Set zero position = 0x0000 ║")); + Serial.println(F("║ burn — Burn OTP ⚠ IRREVERSIBLE ║")); + Serial.println(F("║ h — Show this help ║")); + Serial.println(F("╚══════════════════════════════════════════════════════╝\n")); +} + +// ─── Dual SSI Read (used by 'p' command and continuous stream) ──────────────── + +static void readBothEncoders(uint16_t &pos1, uint16_t &pos2, + bool &ok1, bool &ok2) { + // Read ENC1: SEL2 LOW (already), raise SEL1, clock CLK1 + enc2.deselect(); + enc1.select(); + ok1 = enc1.readAngleRaw(pos1); + enc1.deselect(); + + delay(1); // inter-encoder gap; NSL HIGH > tNSLH before next read + + // Read ENC2: SEL1 LOW (already), raise SEL2, clock CLK2 + enc1.deselect(); + enc2.select(); + ok2 = enc2.readAngleRaw(pos2); + enc2.deselect(); +} + +// ─── Serial Command Parser ──────────────────────────────────────────────────── + +void handleSerial() { + if (!Serial.available()) return; + + String line = Serial.readStringUntil('\n'); + line.trim(); + if (line.length() == 0) return; + + // OTP burn requires the exact string "burn" to prevent accidental triggers + if (line.equalsIgnoreCase("burn")) { + AEAT8800* enc = activeEncoder(); + Serial.printf("[OTP] Unlocking ENC%u and burning shadow regs to OTP...\n", g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_PROG_CUST, PROG_KEY); + Serial.println(F("[OTP] Done. Power-cycle the encoder to verify.")); + return; + } + + char cmd = (char)tolower((unsigned char)line[0]); + + switch (cmd) { + + // ── Read both positions (SSI) ───────────────────────────────────────── + case 'p': { + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEncoders(pos1, pos2, ok1, ok2); + printSinglePosition(1, pos1, ok1); + printSinglePosition(2, pos2, ok2); + break; + } + + // ── Continuous stream toggle ────────────────────────────────────────── + case 'c': + g_streaming = !g_streaming; + Serial.printf("[INFO] Continuous stream %s\n", g_streaming ? "ON" : "OFF"); + break; + + // ── Select active encoder for SPI operations ────────────────────────── + case '1': + g_activeEnc = 1; + Serial.println(F("[INFO] Active encoder: ENC1")); + break; + case '2': + g_activeEnc = 2; + Serial.println(F("[INFO] Active encoder: ENC2")); + break; + + // ── Register dump (SPI) ─────────────────────────────────────────────── + case 's': + printAllRegisters(); + break; + + // ── Read single register "r " ───────────────────────────── + case 'r': { + if (line.length() < 3) { + Serial.println(F("[ERR] Usage: r e.g. 'r 07'")); + break; + } + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, nullptr, 16); + isolatePeer(); + uint8_t val = activeEncoder()->spiRead(addr); + releasePeer(); + Serial.printf("[ENC%u SPI-RD] Reg 0x%02X = 0x%02X (%u)\n", + g_activeEnc, addr, val, val); + break; + } + + // ── Write single register "w " ────────────────── + case 'w': { + if (line.length() < 5) { + Serial.println(F("[ERR] Usage: w e.g. 'w 10 AB'")); + break; + } + char* ptr = nullptr; + uint8_t addr = (uint8_t)strtoul(line.c_str() + 2, &ptr, 16); + uint8_t val = (uint8_t)strtoul(ptr, nullptr, 16); + activeEncoder()->spiWrite(addr, val); + isolatePeer(); + uint8_t rb = activeEncoder()->spiRead(addr); + releasePeer(); + Serial.printf("[ENC%u SPI-WR] Reg 0x%02X <- 0x%02X | Readback: 0x%02X %s\n", + g_activeEnc, addr, val, rb, (rb == val) ? "OK" : "MISMATCH!"); + break; + } + + // ── Unlock registers ────────────────────────────────────────────────── + case 'u': + activeEncoder()->spiWrite(REG_LOCK, UNLOCK_KEY); + Serial.printf("[ENC%u SPI] Registers unlocked (0xAB written to Lock reg)\n", + g_activeEnc); + break; + + // ── Set zero position ───────────────────────────────────────────────── + case 'z': { + AEAT8800* enc = activeEncoder(); + Serial.printf("[ENC%u ZERO] Writing 0x0000 to ZeroPos shadow registers...\n", + g_activeEnc); + enc->spiWrite(REG_LOCK, UNLOCK_KEY); + delayMicroseconds(10); + enc->spiWrite(REG_ZERO_POS_L, 0x00); + enc->spiWrite(REG_ZERO_POS_H, 0x00); + isolatePeer(); + uint8_t lo = enc->spiRead(REG_ZERO_POS_L); + uint8_t hi = enc->spiRead(REG_ZERO_POS_H); + releasePeer(); + uint16_t zp = ((uint16_t)hi << 8) | lo; + Serial.printf("[ENC%u ZERO] Readback: 0x%04X — %s\n", g_activeEnc, zp, + zp == 0x0000 ? "OK" : "MISMATCH!"); + break; + } + + // ── Burn guard (user must type "burn" exactly) ──────────────────────── + case 'b': + Serial.println(F("[WARN] OTP BURN is IRREVERSIBLE!")); + Serial.println(F("[WARN] Type exactly 'burn' and press Enter to confirm.")); + break; + + // ── Help ────────────────────────────────────────────────────────────── + case 'h': + default: + printHelp(); + break; + } +} + +// ─── Setup ──────────────────────────────────────────────────────────────────── + +void setup() { + Serial.begin(115200); + delay(300); + + // ── External antenna ───────────────────────────────────────────────────── + // GPIO3 LOW activates the RF switch control circuit; GPIO14 HIGH selects + // the external antenna over the built-in ceramic one. + pinMode(WIFI_ENABLE, OUTPUT); + digitalWrite(WIFI_ENABLE, LOW); // activate RF switch control + delay(100); + pinMode(WIFI_ANT_CONFIG, OUTPUT); + digitalWrite(WIFI_ANT_CONFIG, HIGH); // select external antenna + + // ── GPIO init — all bus pins to safe idle states ────────────────────────── + pinMode(PIN_CLK1, OUTPUT); digitalWrite(PIN_CLK1, HIGH); // CLK1 idles HIGH + pinMode(PIN_CLK2, OUTPUT); digitalWrite(PIN_CLK2, HIGH); // CLK2 idles HIGH + pinMode(PIN_DIN, OUTPUT); digitalWrite(PIN_DIN, HIGH); // NSL/DIN idles HIGH + pinMode(PIN_DOUT, INPUT); + pinMode(PIN_SEL1, OUTPUT); digitalWrite(PIN_SEL1, LOW); // SPI/idle mode + pinMode(PIN_SEL2, OUTPUT); digitalWrite(PIN_SEL2, LOW); // SPI/idle mode + + // tPwrUp ~4 ms (datasheet p.6) + NSL must be HIGH >= 3 ms before first SSI read + delay(5); + + // ── Boot banner ─────────────────────────────────────────────────────────── + Serial.println(F("\n╔══════════════════════════════════════════════════════════╗")); + Serial.println(F( "║ AEAT-8800-Q24 DUAL | Star-CLK | XIAO ESP32-C6 ║")); + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + Serial.println(F( "║ CLK1=GPIO19(D8) CLK2=GPIO23(D5) DIN=GPIO18(D10) ║")); + Serial.println(F( "║ DOUT=GPIO20(D9) SEL1=GPIO21(D3) SEL2=GPIO22(D4) ║")); + Serial.println(F( "║ Antenna : External [GPIO3=LOW, GPIO14=HIGH] ║")); + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + + // ── Configure ENC1 ──────────────────────────────────────────────────────── + // Raise SEL2 (ENC2 → SSI/idle) so ENC2's DOUT does not contend the shared + // bus during ENC1's SPI readback transactions. + Serial.print(F( "║ Configuring ENC1 ... ")); + enc2.select(); + delayMicroseconds(1); + bool ok1 = enc1.configure(); // leaves ENC1 SEL LOW on exit + enc2.deselect(); + Serial.println(ok1 ? F("OK ║") + : F("FAILED ║")); + + // ── Configure ENC2 ──────────────────────────────────────────────────────── + Serial.print(F( "║ Configuring ENC2 ... ")); + enc1.select(); + delayMicroseconds(1); + bool ok2 = enc2.configure(); // leaves ENC2 SEL LOW on exit + enc1.deselect(); + Serial.println(ok2 ? F("OK ║") + : F("FAILED ║")); + + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + + // ── Initial position read ───────────────────────────────────────────────── + uint16_t pos1 = 0, pos2 = 0; + bool r1 = false, r2 = false; + readBothEncoders(pos1, pos2, r1, r2); + + if (r1) + Serial.printf( "║ ENC1 Position : %5u counts (%.4f deg) ║\n", + pos1, (pos1 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC1 Position : READ ERROR ║")); + + if (r2) + Serial.printf( "║ ENC2 Position : %5u counts (%.4f deg) ║\n", + pos2, (pos2 / 65536.0) * 360.0); + else + Serial.println(F("║ ENC2 Position : READ ERROR ║")); + + Serial.println(F( "╠══════════════════════════════════════════════════════════╣")); + Serial.println(F( "║ Type 'h' for command help ║")); + Serial.println(F( "╚══════════════════════════════════════════════════════════╝\n")); +} + +// ─── Main Loop ──────────────────────────────────────────────────────────────── + +void loop() { + handleSerial(); + + if (g_streaming && (millis() - g_lastStream >= 100)) { + g_lastStream = millis(); + + uint16_t pos1 = 0, pos2 = 0; + bool ok1 = false, ok2 = false; + readBothEncoders(pos1, pos2, ok1, ok2); + + float deg1 = ok1 ? (pos1 / 65536.0f) * 360.0f : -1.0f; + float deg2 = ok2 ? (pos2 / 65536.0f) * 360.0f : -1.0f; + + if (ok1 && ok2) { + Serial.printf("ENC1: %.4f deg | ENC2: %.4f deg\n", deg1, deg2); + } else if (!ok1 && !ok2) { + Serial.println(F("ENC1: ERR | ENC2: ERR")); + } else if (!ok1) { + Serial.printf("ENC1: ERR | ENC2: %.4f deg\n", deg2); + } else { + Serial.printf("ENC1: %.4f deg | ENC2: ERR\n", deg1); + } + } +} diff --git a/firmware/dual_encoder/dual_encoder.ino b/firmware/dual_encoder/dual_encoder.ino index e1ecd67..7096c07 100644 --- a/firmware/dual_encoder/dual_encoder.ino +++ b/firmware/dual_encoder/dual_encoder.ino @@ -1,270 +1,270 @@ -#include -#include -#include -#include -#include -#include -#include // For std::sort - -/** - * ============================================================ - * Dual Encoder BLE Firmware Template [firmware/dual_encoder/] - * Board: XIAO ESP32C3 / ESP32C6 - * Sensor: 2x AS5047D 14-bit Magnetic Rotary Encoder (SPI) - * - * Features: - * - Reads two encoders via SPI using two separate CS pins. - * - Sends data via BLE when connected (responds to "READ"). - * - Automatically reads and outputs to Serial every 500ms - * when BLE is disconnected. - * ============================================================ - */ - -// ============================================================ -// CONFIGURE BEFORE FLASHING -// ============================================================ -#define ESP_NAME "DUAL_ENCODER_ESP" -#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" -#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" -// ============================================================ - -// ---------------- AS5047D SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC 0x3FFC // Diagnostic and AGC register -#define MAG 0x3FFD // CORDIC magnitude register -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 -#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 - -// SPI Pins (XIAO ESP32C3/C6) -// SCK=D1, MISO=D0, MOSI=D10 -// Two CS pins for the two encoders -const int PIN_CS1 = D7; // CS for Encoder 1 -const int PIN_CS2 = D6; // CS for Encoder 2 - -const int PIN_SCK = D8; -const int PIN_MISO = D9; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// ---------------- BLE STATE ---------------- -BLECharacteristic *pChar; -bool deviceConnected = false; -bool readRequested = false; -bool zeroRequest = false; -double zeroOffset1 = 0.0; -double zeroOffset2 = 0.0; -uint32_t packetIdx = 0; // Global packet counter - -// ---------------- BLE CALLBACKS ---------------- -class MyServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer *pServer) { - deviceConnected = true; - Serial.println("[BLE] Connected"); - } - void onDisconnect(BLEServer *pServer) { - deviceConnected = false; - Serial.println("[BLE] Disconnected"); - BLEDevice::getAdvertising()->start(); - } -}; - -class WriteCallback : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic *pChar) { - String value = pChar->getValue().c_str(); - if (value == "READ") { - readRequested = true; - } else if (value == "ZERO") { - zeroRequest = true; - Serial.println("[CMD] Zero reset requested"); - } - } -}; - -// ---------------- UTILS ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read(int csPin) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(csPin, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(csPin, HIGH); - delayMicroseconds(1); - digitalWrite(csPin, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(csPin, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t AS5047D_ReadRegister(int csPin, uint16_t address) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(csPin, LOW); - SPI.transfer16(makeReadCmd(address)); - digitalWrite(csPin, HIGH); - delayMicroseconds(1); - digitalWrite(csPin, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(csPin, HIGH); - SPI.endTransaction(); - return result; -} - -// ---------------- STATISTICS ---------------- -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -double getUltraPrecisionReading(int csPin) { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(csPin); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; // Retry on parity error - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); // Brief yield to keep BLE alive - } - - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - double rawAngle = (finalCounts * 360.0) / 16384.0; - return rawAngle; -} - -// ---------------- SETUP ---------------- -void setup() { - Serial.begin(115200); - - pinMode(PIN_CS1, OUTPUT); - digitalWrite(PIN_CS1, HIGH); - pinMode(PIN_CS2, OUTPUT); - digitalWrite(PIN_CS2, HIGH); - - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS1); - - BLEDevice::init(ESP_NAME); - BLEServer *pServer = BLEDevice::createServer(); - pServer->setCallbacks(new MyServerCallbacks()); - BLEService *pService = pServer->createService(SERVICE_UUID); - pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, - BLECharacteristic::PROPERTY_NOTIFY | - BLECharacteristic::PROPERTY_WRITE); - pChar->addDescriptor(new BLE2902()); - pChar->setCallbacks(new WriteCallback()); - pService->start(); - BLEDevice::getAdvertising()->start(); - Serial.println("[BLE] Advertising as '" ESP_NAME "'"); -} - -// ---------------- MAIN LOOP ---------------- -void loop() { - - // Auto-trigger read every 500ms if BLE is not connected - if (!deviceConnected) { - static unsigned long lastAutoReadTime = 0; - if (millis() - lastAutoReadTime >= 500) { - lastAutoReadTime = millis(); - readRequested = true; - } - } - - // On-demand read from BLE, or auto read from loop above - if (readRequested) { - readRequested = false; - packetIdx++; - - double rawAngle1 = getUltraPrecisionReading(PIN_CS1); - double rawAngle2 = getUltraPrecisionReading(PIN_CS2); - - // Handle zero reset (applied on next READ after ZERO command) - if (zeroRequest) { - zeroOffset1 = rawAngle1; - zeroOffset2 = rawAngle2; - zeroRequest = false; - Serial.printf("[ZERO] Offsets set to %.5f and %.5f\n", zeroOffset1, zeroOffset2); - } - - // Apply zero offset and normalize to [0, 360) for Enc 1 - double angle1 = rawAngle1 - zeroOffset1; - if (angle1 < 0) angle1 += 360.0; - if (angle1 >= 360.0) angle1 -= 360.0; - int angleInt1 = (int)(angle1 * 10000.0); - - // Apply zero offset and normalize to [0, 360) for Enc 2 - double angle2 = rawAngle2 - zeroOffset2; - if (angle2 < 0) angle2 += 360.0; - if (angle2 >= 360.0) angle2 -= 360.0; - int angleInt2 = (int)(angle2 * 10000.0); - - // Read diagnostics Enc1 - uint16_t diaagc1 = AS5047D_ReadRegister(PIN_CS1, DIAAGC); - uint16_t mag1_reg = AS5047D_ReadRegister(PIN_CS1, MAG); - uint8_t agc1 = diaagc1 & 0xFF; - uint8_t cof1 = (diaagc1 >> 9) & 1; - uint8_t magl1 = (diaagc1 >> 10) & 1; - uint8_t magh1 = (diaagc1 >> 11) & 1; - uint16_t magnitude1 = mag1_reg & 0x3FFF; - - // Read diagnostics Enc2 - uint16_t diaagc2 = AS5047D_ReadRegister(PIN_CS2, DIAAGC); - uint16_t mag2_reg = AS5047D_ReadRegister(PIN_CS2, MAG); - uint8_t agc2 = diaagc2 & 0xFF; - uint8_t cof2 = (diaagc2 >> 9) & 1; - uint8_t magl2 = (diaagc2 >> 10) & 1; - uint8_t magh2 = (diaagc2 >> 11) & 1; - uint16_t magnitude2 = mag2_reg & 0x3FFF; - - // BLE message: single encoder uses same format, here we concatenate M0 and M1 - String bleMsg = String(packetIdx) - + "|M0:" + String(angleInt1) + "," + String(packetIdx) + "," + String(agc1) + "," + String(magnitude1) + "," + String(magl1) + "," + String(magh1) + "," + String(cof1) - + "|M1:" + String(angleInt2) + "," + String(packetIdx) + "," + String(agc2) + "," + String(magnitude2) + "," + String(magl2) + "," + String(magh2) + "," + String(cof2); - - if (deviceConnected && pChar) { - pChar->setValue(bleMsg.c_str()); - pChar->notify(); - } - - Serial.printf("[READ #%u] M0=%d (%.5f deg) | M1=%d (%.5f deg) \n", - packetIdx, angleInt1, angle1, angleInt2, angle2); - } - - delay(1); -} +#include +#include +#include +#include +#include +#include +#include // For std::sort + +/** + * ============================================================ + * Dual Encoder BLE Firmware Template [firmware/dual_encoder/] + * Board: XIAO ESP32C3 / ESP32C6 + * Sensor: 2x AS5047D 14-bit Magnetic Rotary Encoder (SPI) + * + * Features: + * - Reads two encoders via SPI using two separate CS pins. + * - Sends data via BLE when connected (responds to "READ"). + * - Automatically reads and outputs to Serial every 500ms + * when BLE is disconnected. + * ============================================================ + */ + +// ============================================================ +// CONFIGURE BEFORE FLASHING +// ============================================================ +#define ESP_NAME "DUAL_ENCODER_ESP" +#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" +#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" +// ============================================================ + +// ---------------- AS5047D SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC 0x3FFC // Diagnostic and AGC register +#define MAG 0x3FFD // CORDIC magnitude register +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 +#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 + +// SPI Pins (XIAO ESP32C3/C6) +// SCK=D1, MISO=D0, MOSI=D10 +// Two CS pins for the two encoders +const int PIN_CS1 = D7; // CS for Encoder 1 +const int PIN_CS2 = D6; // CS for Encoder 2 + +const int PIN_SCK = D8; +const int PIN_MISO = D9; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// ---------------- BLE STATE ---------------- +BLECharacteristic *pChar; +bool deviceConnected = false; +bool readRequested = false; +bool zeroRequest = false; +double zeroOffset1 = 0.0; +double zeroOffset2 = 0.0; +uint32_t packetIdx = 0; // Global packet counter + +// ---------------- BLE CALLBACKS ---------------- +class MyServerCallbacks : public BLEServerCallbacks { + void onConnect(BLEServer *pServer) { + deviceConnected = true; + Serial.println("[BLE] Connected"); + } + void onDisconnect(BLEServer *pServer) { + deviceConnected = false; + Serial.println("[BLE] Disconnected"); + BLEDevice::getAdvertising()->start(); + } +}; + +class WriteCallback : public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pChar) { + String value = pChar->getValue().c_str(); + if (value == "READ") { + readRequested = true; + } else if (value == "ZERO") { + zeroRequest = true; + Serial.println("[CMD] Zero reset requested"); + } + } +}; + +// ---------------- UTILS ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read(int csPin) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(csPin, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(csPin, HIGH); + delayMicroseconds(1); + digitalWrite(csPin, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(csPin, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t AS5047D_ReadRegister(int csPin, uint16_t address) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(csPin, LOW); + SPI.transfer16(makeReadCmd(address)); + digitalWrite(csPin, HIGH); + delayMicroseconds(1); + digitalWrite(csPin, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(csPin, HIGH); + SPI.endTransaction(); + return result; +} + +// ---------------- STATISTICS ---------------- +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +double getUltraPrecisionReading(int csPin) { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(csPin); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; // Retry on parity error + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); // Brief yield to keep BLE alive + } + + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + double rawAngle = (finalCounts * 360.0) / 16384.0; + return rawAngle; +} + +// ---------------- SETUP ---------------- +void setup() { + Serial.begin(115200); + + pinMode(PIN_CS1, OUTPUT); + digitalWrite(PIN_CS1, HIGH); + pinMode(PIN_CS2, OUTPUT); + digitalWrite(PIN_CS2, HIGH); + + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS1); + + BLEDevice::init(ESP_NAME); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new MyServerCallbacks()); + BLEService *pService = pServer->createService(SERVICE_UUID); + pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_NOTIFY | + BLECharacteristic::PROPERTY_WRITE); + pChar->addDescriptor(new BLE2902()); + pChar->setCallbacks(new WriteCallback()); + pService->start(); + BLEDevice::getAdvertising()->start(); + Serial.println("[BLE] Advertising as '" ESP_NAME "'"); +} + +// ---------------- MAIN LOOP ---------------- +void loop() { + + // Auto-trigger read every 500ms if BLE is not connected + if (!deviceConnected) { + static unsigned long lastAutoReadTime = 0; + if (millis() - lastAutoReadTime >= 500) { + lastAutoReadTime = millis(); + readRequested = true; + } + } + + // On-demand read from BLE, or auto read from loop above + if (readRequested) { + readRequested = false; + packetIdx++; + + double rawAngle1 = getUltraPrecisionReading(PIN_CS1); + double rawAngle2 = getUltraPrecisionReading(PIN_CS2); + + // Handle zero reset (applied on next READ after ZERO command) + if (zeroRequest) { + zeroOffset1 = rawAngle1; + zeroOffset2 = rawAngle2; + zeroRequest = false; + Serial.printf("[ZERO] Offsets set to %.5f and %.5f\n", zeroOffset1, zeroOffset2); + } + + // Apply zero offset and normalize to [0, 360) for Enc 1 + double angle1 = rawAngle1 - zeroOffset1; + if (angle1 < 0) angle1 += 360.0; + if (angle1 >= 360.0) angle1 -= 360.0; + int angleInt1 = (int)(angle1 * 10000.0); + + // Apply zero offset and normalize to [0, 360) for Enc 2 + double angle2 = rawAngle2 - zeroOffset2; + if (angle2 < 0) angle2 += 360.0; + if (angle2 >= 360.0) angle2 -= 360.0; + int angleInt2 = (int)(angle2 * 10000.0); + + // Read diagnostics Enc1 + uint16_t diaagc1 = AS5047D_ReadRegister(PIN_CS1, DIAAGC); + uint16_t mag1_reg = AS5047D_ReadRegister(PIN_CS1, MAG); + uint8_t agc1 = diaagc1 & 0xFF; + uint8_t cof1 = (diaagc1 >> 9) & 1; + uint8_t magl1 = (diaagc1 >> 10) & 1; + uint8_t magh1 = (diaagc1 >> 11) & 1; + uint16_t magnitude1 = mag1_reg & 0x3FFF; + + // Read diagnostics Enc2 + uint16_t diaagc2 = AS5047D_ReadRegister(PIN_CS2, DIAAGC); + uint16_t mag2_reg = AS5047D_ReadRegister(PIN_CS2, MAG); + uint8_t agc2 = diaagc2 & 0xFF; + uint8_t cof2 = (diaagc2 >> 9) & 1; + uint8_t magl2 = (diaagc2 >> 10) & 1; + uint8_t magh2 = (diaagc2 >> 11) & 1; + uint16_t magnitude2 = mag2_reg & 0x3FFF; + + // BLE message: single encoder uses same format, here we concatenate M0 and M1 + String bleMsg = String(packetIdx) + + "|M0:" + String(angleInt1) + "," + String(packetIdx) + "," + String(agc1) + "," + String(magnitude1) + "," + String(magl1) + "," + String(magh1) + "," + String(cof1) + + "|M1:" + String(angleInt2) + "," + String(packetIdx) + "," + String(agc2) + "," + String(magnitude2) + "," + String(magl2) + "," + String(magh2) + "," + String(cof2); + + if (deviceConnected && pChar) { + pChar->setValue(bleMsg.c_str()); + pChar->notify(); + } + + Serial.printf("[READ #%u] M0=%d (%.5f deg) | M1=%d (%.5f deg) \n", + packetIdx, angleInt1, angle1, angleInt2, angle2); + } + + delay(1); +} diff --git a/firmware/master/master.ino b/firmware/master/master.ino index a792f3b..d0a56af 100644 --- a/firmware/master/master.ino +++ b/firmware/master/master.ino @@ -1,469 +1,469 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Oliver Master Gateway - Robust Discovery Edition - * Hardware: XIAO ESP32C6 - * Features: - * - 30s blocking discovery for all 5 slaves - * - Continuous re-discovery for missing slaves - * - BLE command interface for manual re-discovery - * - Detailed status reporting - * Author: Swaraj Dangare - */ - -#define NUM_SLAVES 1 // FIXED: Was 4, now 5 -#define WIFI_CHANNEL 11 // ESP-NOW channel (use 1, 6, or 11 to isolate from other Oliver sets) -#define SERVICE_UUID "6ab88bb9-cf50-4564-b1c4-f53be2abc53f" -#define CHARACTERISTIC_UUID "1d4cd358-172d-4c33-b0b2-ddce9a071aab" -#define COMMAND_UUID "308a0c43-80f0-4b01-81e5-bb2798eb92f9" - -typedef struct __attribute__((packed)) { - uint8_t id; - int value; // Angle * 10000 - uint32_t packetIdx; - uint8_t agc; // AS5047D AGC value (0-255) - uint16_t mag; // AS5047D CORDIC magnitude (14-bit) - uint8_t magl; // Magnetic field too low (0 or 1) - uint8_t magh; // Magnetic field too high (0 or 1) - uint8_t cof; // CORDIC overflow (0 or 1) -} Payload; - -uint8_t slaveMACs[NUM_SLAVES][6]; -bool slaveFound[NUM_SLAVES] = {false}; -Payload slaves[NUM_SLAVES]; -uint32_t gatewayPacketIdx = 0; -uint32_t lastSeenTime[NUM_SLAVES] = {0}; // Track last response time - -BLECharacteristic *pChar; -BLECharacteristic *pCommandChar; -bool pcConnected = false; -bool rediscoverRequested = false; -bool readRequested = false; -bool slaveResponded[NUM_SLAVES] = {false}; - -// ---------------- MASTER ENCODER SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC_REG 0x3FFC -#define MAG_REG 0x3FFD -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 - -const int PIN_CS = D7; -const int PIN_SCK = D1; -const int PIN_MISO = D0; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// Master encoder data -Payload masterData = {255, 0, 0, 0, 0, 0, 0, 0}; // id=255 for master - -// ESP-NOW Receive Callback -void onEspNowRecv(const esp_now_recv_info_t *info, const uint8_t *data, - int len) { - if (len == 1) { // Discovery Response - uint8_t id = data[0]; - if (id < NUM_SLAVES) { - if (!slaveFound[id]) { - memcpy(slaveMACs[id], info->src_addr, 6); - slaveFound[id] = true; - esp_now_peer_info_t peer{}; - memcpy(peer.peer_addr, info->src_addr, 6); - peer.channel = WIFI_CHANNEL; - peer.encrypt = false; - esp_now_add_peer(&peer); - // Safe to print here - quick message - Serial.printf( - "[DISCOVERY] Found Slave %d: %02X:%02X:%02X:%02X:%02X:%02X\n", id, - info->src_addr[0], info->src_addr[1], info->src_addr[2], - info->src_addr[3], info->src_addr[4], info->src_addr[5]); - } - lastSeenTime[id] = millis(); - } - } else if (len == sizeof(Payload)) { // Data Response - Payload p; - memcpy(&p, data, sizeof(p)); - if (p.id < NUM_SLAVES) { - slaves[p.id] = p; - lastSeenTime[p.id] = millis(); - slaveResponded[p.id] = true; - } - } -} - -// ---------------- MASTER ENCODER FUNCTIONS ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read() { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t readRegister(uint16_t addr) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(addr)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result & 0x3FFF; -} - -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -double getUltraPrecisionReading() { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); - } - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - return (finalCounts * 360.0) / 16384.0; -} - -// BLE Callbacks -class ServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer *) { - pcConnected = true; - Serial.println("[BLE] Client Connected"); - } - void onDisconnect(BLEServer *) { - pcConnected = false; - Serial.println("[BLE] Client Disconnected"); - BLEDevice::startAdvertising(); - } -}; - -// Command Handler -class CommandCallbacks : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic *pChar) { - String value = - pChar->getValue().c_str(); // Convert std::string to Arduino String - if (value == "READ") { - readRequested = true; - for (int i = 0; i < NUM_SLAVES; i++) - slaveResponded[i] = false; - } else if (value == "REDISCOVER") { - rediscoverRequested = true; - Serial.println("[CMD] Re-discovery requested from PC"); - } - } -}; - -// Discovery Function -void discoverSlaves(uint32_t timeoutMs) { - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - uint32_t startTime = millis(); - - Serial.printf( - "[DISCOVERY] Starting discovery for %d slaves (timeout: %dms)...\n", - NUM_SLAVES, timeoutMs); - - while (millis() - startTime < timeoutMs) { - // Count found slaves - int foundCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) - foundCount++; - } - - // Exit early if all found - if (foundCount == NUM_SLAVES) { - Serial.println("[DISCOVERY] All slaves found!"); - break; - } - - // Send broadcast - uint8_t ping = 0xFF; - esp_now_send(broadcastAddr, &ping, 1); - - // Print status every 2 seconds - static uint32_t lastPrint = 0; - if (millis() - lastPrint > 2000) { - lastPrint = millis(); - Serial.printf("[DISCOVERY] Progress: %d/%d slaves found | Missing: ", - foundCount, NUM_SLAVES); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - Serial.printf("S%d ", i); - } - Serial.println(); - } - - delay(200); // Broadcast every 200ms (was 500ms) - } - - // Final report - int finalCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) - finalCount++; - } - - Serial.println("\n" + String('=', 50)); - Serial.printf("[DISCOVERY] Complete: %d/%d slaves discovered\n", finalCount, - NUM_SLAVES); - if (finalCount < NUM_SLAVES) { - Serial.print("[WARNING] Missing slaves: "); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - Serial.printf("S%d ", i); - } - Serial.println("\n[INFO] Will retry in background..."); - } - Serial.println(String('=', 50) + "\n"); -} - -void setup() { - Serial.begin(115200); - delay(1000); // Give serial time to initialize - - Serial.println("\n\n=== OLIVER MASTER GATEWAY ==="); - Serial.println("Hardware: XIAO ESP32C6"); - Serial.printf("Firmware: Robust Discovery v2.0\n\n"); - - // WiFi Init - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - Serial.printf("[WIFI] MAC Address: %s\n", WiFi.macAddress().c_str()); - - // Master Encoder SPI Init - pinMode(PIN_CS, OUTPUT); - digitalWrite(PIN_CS, HIGH); - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); - Serial.println("[SPI] Master encoder initialized"); - - // Force WiFi channel - esp_wifi_set_promiscuous(true); - esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); - esp_wifi_set_promiscuous(false); - Serial.printf("[WIFI] Channel %d locked\n", WIFI_CHANNEL); - - // ESP-NOW Init - if (esp_now_init() != ESP_OK) { - Serial.println("[ERROR] ESP-NOW Init Failed!"); - return; - } - esp_now_register_recv_cb(onEspNowRecv); - Serial.println("[ESP-NOW] Initialized"); - - // Add Broadcast Peer - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - esp_now_peer_info_t bcast{}; - memcpy(bcast.peer_addr, broadcastAddr, 6); - bcast.channel = WIFI_CHANNEL; - bcast.encrypt = false; - esp_now_add_peer(&bcast); - Serial.println("[ESP-NOW] Broadcast peer added\n"); - - // Initial Discovery (30 seconds, blocking) - discoverSlaves(30000); - - // BLE Init - Serial.println("[BLE] Initializing..."); - BLEDevice::init("Oliver_3"); - BLEServer *pServer = BLEDevice::createServer(); - pServer->setCallbacks(new ServerCallbacks()); - - BLEService *pService = pServer->createService(SERVICE_UUID); - - // Data characteristic (notify) - pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, - BLECharacteristic::PROPERTY_NOTIFY); - pChar->addDescriptor(new BLE2902()); - - // Command characteristic (write) - pCommandChar = pService->createCharacteristic( - COMMAND_UUID, BLECharacteristic::PROPERTY_WRITE); - pCommandChar->setCallbacks(new CommandCallbacks()); - - pService->start(); - - BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); - pAdvertising->addServiceUUID(SERVICE_UUID); - pAdvertising->setScanResponse(true); - BLEDevice::startAdvertising(); - - Serial.println("[BLE] Advertising as 'Oliver_3'"); - Serial.println("\n=== GATEWAY READY ===\n"); -} - -void loop() { - static uint32_t lastRediscover = 0; - - // Handle manual re-discovery request - if (rediscoverRequested) { - rediscoverRequested = false; - Serial.println("\n[CMD] Manual re-discovery triggered!"); - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) { - Serial.printf("[REDISCOVER] Will search for S%d\n", i); - } - } - discoverSlaves(15000); - } - - // Automatic re-discovery every 10 seconds for missing slaves - if (millis() - lastRediscover > 10000) { - lastRediscover = millis(); - int missingCount = 0; - for (int i = 0; i < NUM_SLAVES; i++) { - if (!slaveFound[i]) - missingCount++; - } - - if (missingCount > 0) { - Serial.printf("[AUTO-REDISCOVER] Searching for %d missing slaves...\n", - missingCount); - uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - for (int attempt = 0; attempt < 5; attempt++) { - uint8_t ping = 0xFF; - esp_now_send(broadcastAddr, &ping, 1); - delay(200); - } - } - } - - // ── On-demand read: triggered by BLE "READ" command from PC ── - if (readRequested) { - readRequested = false; - gatewayPacketIdx++; - - // 1. Read master's own encoder + diagnostics - double masterAngle = getUltraPrecisionReading(); - masterData.value = (int)(masterAngle * 10000.0); - masterData.packetIdx = gatewayPacketIdx; - - uint16_t diaagc = readRegister(DIAAGC_REG); - uint16_t mag = readRegister(MAG_REG); - masterData.agc = diaagc & 0xFF; - masterData.mag = mag & 0x3FFF; - masterData.magl = (diaagc >> 8) & 0x01; - masterData.magh = (diaagc >> 10) & 0x01; - masterData.cof = (diaagc >> 9) & 0x01; - - // 2. Request data from all discovered slaves - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i]) { - uint8_t req = i; - esp_now_send(slaveMACs[i], &req, 1); - } - } - - // 3. Wait for slave responses (up to 200ms timeout) - uint32_t waitStart = millis(); - while (millis() - waitStart < 200) { - bool allResponded = true; - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && !slaveResponded[i]) { - allResponded = false; - break; - } - } - if (allResponded) - break; - delay(1); - } - - // 4. Build BLE message (same 7-field format) - String bleMsg = String(gatewayPacketIdx); - - bleMsg += "|M0:" + String(masterData.value) + "," + - String(masterData.packetIdx) + "," + - String(masterData.agc) + "," + String(masterData.mag) + "," + - String(masterData.magl) + "," + String(masterData.magh) + "," + - String(masterData.cof); - - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && slaveResponded[i]) { - bleMsg += "|S" + String(i) + ":" + String(slaves[i].value) + "," + - String(slaves[i].packetIdx) + "," + - String(slaves[i].agc) + "," + String(slaves[i].mag) + "," + - String(slaves[i].magl) + "," + String(slaves[i].magh) + "," + - String(slaves[i].cof); - } else { - bleMsg += "|S" + String(i) + ":OFFLINE,0"; - } - } - - // 5. Send BLE notification - if (pcConnected && pChar) { - pChar->setValue(bleMsg.c_str()); - pChar->notify(); - } - - // 6. Serial log - Serial.printf("[READ #%u] M0=%d", gatewayPacketIdx, masterData.value); - for (int i = 0; i < NUM_SLAVES; i++) { - if (slaveFound[i] && slaveResponded[i]) - Serial.printf(" | S%d=%d", i, slaves[i].value); - else - Serial.printf(" | S%d=OFFLINE", i); - } - Serial.println(); - } - - delay(1); +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Oliver Master Gateway - Robust Discovery Edition + * Hardware: XIAO ESP32C6 + * Features: + * - 30s blocking discovery for all 5 slaves + * - Continuous re-discovery for missing slaves + * - BLE command interface for manual re-discovery + * - Detailed status reporting + * Author: Swaraj Dangare + */ + +#define NUM_SLAVES 1 // FIXED: Was 4, now 5 +#define WIFI_CHANNEL 11 // ESP-NOW channel (use 1, 6, or 11 to isolate from other Oliver sets) +#define SERVICE_UUID "6ab88bb9-cf50-4564-b1c4-f53be2abc53f" +#define CHARACTERISTIC_UUID "1d4cd358-172d-4c33-b0b2-ddce9a071aab" +#define COMMAND_UUID "308a0c43-80f0-4b01-81e5-bb2798eb92f9" + +typedef struct __attribute__((packed)) { + uint8_t id; + int value; // Angle * 10000 + uint32_t packetIdx; + uint8_t agc; // AS5047D AGC value (0-255) + uint16_t mag; // AS5047D CORDIC magnitude (14-bit) + uint8_t magl; // Magnetic field too low (0 or 1) + uint8_t magh; // Magnetic field too high (0 or 1) + uint8_t cof; // CORDIC overflow (0 or 1) +} Payload; + +uint8_t slaveMACs[NUM_SLAVES][6]; +bool slaveFound[NUM_SLAVES] = {false}; +Payload slaves[NUM_SLAVES]; +uint32_t gatewayPacketIdx = 0; +uint32_t lastSeenTime[NUM_SLAVES] = {0}; // Track last response time + +BLECharacteristic *pChar; +BLECharacteristic *pCommandChar; +bool pcConnected = false; +bool rediscoverRequested = false; +bool readRequested = false; +bool slaveResponded[NUM_SLAVES] = {false}; + +// ---------------- MASTER ENCODER SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC_REG 0x3FFC +#define MAG_REG 0x3FFD +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 + +const int PIN_CS = D7; +const int PIN_SCK = D1; +const int PIN_MISO = D0; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// Master encoder data +Payload masterData = {255, 0, 0, 0, 0, 0, 0, 0}; // id=255 for master + +// ESP-NOW Receive Callback +void onEspNowRecv(const esp_now_recv_info_t *info, const uint8_t *data, + int len) { + if (len == 1) { // Discovery Response + uint8_t id = data[0]; + if (id < NUM_SLAVES) { + if (!slaveFound[id]) { + memcpy(slaveMACs[id], info->src_addr, 6); + slaveFound[id] = true; + esp_now_peer_info_t peer{}; + memcpy(peer.peer_addr, info->src_addr, 6); + peer.channel = WIFI_CHANNEL; + peer.encrypt = false; + esp_now_add_peer(&peer); + // Safe to print here - quick message + Serial.printf( + "[DISCOVERY] Found Slave %d: %02X:%02X:%02X:%02X:%02X:%02X\n", id, + info->src_addr[0], info->src_addr[1], info->src_addr[2], + info->src_addr[3], info->src_addr[4], info->src_addr[5]); + } + lastSeenTime[id] = millis(); + } + } else if (len == sizeof(Payload)) { // Data Response + Payload p; + memcpy(&p, data, sizeof(p)); + if (p.id < NUM_SLAVES) { + slaves[p.id] = p; + lastSeenTime[p.id] = millis(); + slaveResponded[p.id] = true; + } + } +} + +// ---------------- MASTER ENCODER FUNCTIONS ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read() { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t readRegister(uint16_t addr) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(addr)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result & 0x3FFF; +} + +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); + } + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + return (finalCounts * 360.0) / 16384.0; +} + +// BLE Callbacks +class ServerCallbacks : public BLEServerCallbacks { + void onConnect(BLEServer *) { + pcConnected = true; + Serial.println("[BLE] Client Connected"); + } + void onDisconnect(BLEServer *) { + pcConnected = false; + Serial.println("[BLE] Client Disconnected"); + BLEDevice::startAdvertising(); + } +}; + +// Command Handler +class CommandCallbacks : public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pChar) { + String value = + pChar->getValue().c_str(); // Convert std::string to Arduino String + if (value == "READ") { + readRequested = true; + for (int i = 0; i < NUM_SLAVES; i++) + slaveResponded[i] = false; + } else if (value == "REDISCOVER") { + rediscoverRequested = true; + Serial.println("[CMD] Re-discovery requested from PC"); + } + } +}; + +// Discovery Function +void discoverSlaves(uint32_t timeoutMs) { + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + uint32_t startTime = millis(); + + Serial.printf( + "[DISCOVERY] Starting discovery for %d slaves (timeout: %dms)...\n", + NUM_SLAVES, timeoutMs); + + while (millis() - startTime < timeoutMs) { + // Count found slaves + int foundCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) + foundCount++; + } + + // Exit early if all found + if (foundCount == NUM_SLAVES) { + Serial.println("[DISCOVERY] All slaves found!"); + break; + } + + // Send broadcast + uint8_t ping = 0xFF; + esp_now_send(broadcastAddr, &ping, 1); + + // Print status every 2 seconds + static uint32_t lastPrint = 0; + if (millis() - lastPrint > 2000) { + lastPrint = millis(); + Serial.printf("[DISCOVERY] Progress: %d/%d slaves found | Missing: ", + foundCount, NUM_SLAVES); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + Serial.printf("S%d ", i); + } + Serial.println(); + } + + delay(200); // Broadcast every 200ms (was 500ms) + } + + // Final report + int finalCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) + finalCount++; + } + + Serial.println("\n" + String('=', 50)); + Serial.printf("[DISCOVERY] Complete: %d/%d slaves discovered\n", finalCount, + NUM_SLAVES); + if (finalCount < NUM_SLAVES) { + Serial.print("[WARNING] Missing slaves: "); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + Serial.printf("S%d ", i); + } + Serial.println("\n[INFO] Will retry in background..."); + } + Serial.println(String('=', 50) + "\n"); +} + +void setup() { + Serial.begin(115200); + delay(1000); // Give serial time to initialize + + Serial.println("\n\n=== OLIVER MASTER GATEWAY ==="); + Serial.println("Hardware: XIAO ESP32C6"); + Serial.printf("Firmware: Robust Discovery v2.0\n\n"); + + // WiFi Init + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + Serial.printf("[WIFI] MAC Address: %s\n", WiFi.macAddress().c_str()); + + // Master Encoder SPI Init + pinMode(PIN_CS, OUTPUT); + digitalWrite(PIN_CS, HIGH); + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + Serial.println("[SPI] Master encoder initialized"); + + // Force WiFi channel + esp_wifi_set_promiscuous(true); + esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); + esp_wifi_set_promiscuous(false); + Serial.printf("[WIFI] Channel %d locked\n", WIFI_CHANNEL); + + // ESP-NOW Init + if (esp_now_init() != ESP_OK) { + Serial.println("[ERROR] ESP-NOW Init Failed!"); + return; + } + esp_now_register_recv_cb(onEspNowRecv); + Serial.println("[ESP-NOW] Initialized"); + + // Add Broadcast Peer + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + esp_now_peer_info_t bcast{}; + memcpy(bcast.peer_addr, broadcastAddr, 6); + bcast.channel = WIFI_CHANNEL; + bcast.encrypt = false; + esp_now_add_peer(&bcast); + Serial.println("[ESP-NOW] Broadcast peer added\n"); + + // Initial Discovery (30 seconds, blocking) + discoverSlaves(30000); + + // BLE Init + Serial.println("[BLE] Initializing..."); + BLEDevice::init("Oliver_3"); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new ServerCallbacks()); + + BLEService *pService = pServer->createService(SERVICE_UUID); + + // Data characteristic (notify) + pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_NOTIFY); + pChar->addDescriptor(new BLE2902()); + + // Command characteristic (write) + pCommandChar = pService->createCharacteristic( + COMMAND_UUID, BLECharacteristic::PROPERTY_WRITE); + pCommandChar->setCallbacks(new CommandCallbacks()); + + pService->start(); + + BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(SERVICE_UUID); + pAdvertising->setScanResponse(true); + BLEDevice::startAdvertising(); + + Serial.println("[BLE] Advertising as 'Oliver_3'"); + Serial.println("\n=== GATEWAY READY ===\n"); +} + +void loop() { + static uint32_t lastRediscover = 0; + + // Handle manual re-discovery request + if (rediscoverRequested) { + rediscoverRequested = false; + Serial.println("\n[CMD] Manual re-discovery triggered!"); + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) { + Serial.printf("[REDISCOVER] Will search for S%d\n", i); + } + } + discoverSlaves(15000); + } + + // Automatic re-discovery every 10 seconds for missing slaves + if (millis() - lastRediscover > 10000) { + lastRediscover = millis(); + int missingCount = 0; + for (int i = 0; i < NUM_SLAVES; i++) { + if (!slaveFound[i]) + missingCount++; + } + + if (missingCount > 0) { + Serial.printf("[AUTO-REDISCOVER] Searching for %d missing slaves...\n", + missingCount); + uint8_t broadcastAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + for (int attempt = 0; attempt < 5; attempt++) { + uint8_t ping = 0xFF; + esp_now_send(broadcastAddr, &ping, 1); + delay(200); + } + } + } + + // ── On-demand read: triggered by BLE "READ" command from PC ── + if (readRequested) { + readRequested = false; + gatewayPacketIdx++; + + // 1. Read master's own encoder + diagnostics + double masterAngle = getUltraPrecisionReading(); + masterData.value = (int)(masterAngle * 10000.0); + masterData.packetIdx = gatewayPacketIdx; + + uint16_t diaagc = readRegister(DIAAGC_REG); + uint16_t mag = readRegister(MAG_REG); + masterData.agc = diaagc & 0xFF; + masterData.mag = mag & 0x3FFF; + masterData.magl = (diaagc >> 8) & 0x01; + masterData.magh = (diaagc >> 10) & 0x01; + masterData.cof = (diaagc >> 9) & 0x01; + + // 2. Request data from all discovered slaves + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i]) { + uint8_t req = i; + esp_now_send(slaveMACs[i], &req, 1); + } + } + + // 3. Wait for slave responses (up to 200ms timeout) + uint32_t waitStart = millis(); + while (millis() - waitStart < 200) { + bool allResponded = true; + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && !slaveResponded[i]) { + allResponded = false; + break; + } + } + if (allResponded) + break; + delay(1); + } + + // 4. Build BLE message (same 7-field format) + String bleMsg = String(gatewayPacketIdx); + + bleMsg += "|M0:" + String(masterData.value) + "," + + String(masterData.packetIdx) + "," + + String(masterData.agc) + "," + String(masterData.mag) + "," + + String(masterData.magl) + "," + String(masterData.magh) + "," + + String(masterData.cof); + + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && slaveResponded[i]) { + bleMsg += "|S" + String(i) + ":" + String(slaves[i].value) + "," + + String(slaves[i].packetIdx) + "," + + String(slaves[i].agc) + "," + String(slaves[i].mag) + "," + + String(slaves[i].magl) + "," + String(slaves[i].magh) + "," + + String(slaves[i].cof); + } else { + bleMsg += "|S" + String(i) + ":OFFLINE,0"; + } + } + + // 5. Send BLE notification + if (pcConnected && pChar) { + pChar->setValue(bleMsg.c_str()); + pChar->notify(); + } + + // 6. Serial log + Serial.printf("[READ #%u] M0=%d", gatewayPacketIdx, masterData.value); + for (int i = 0; i < NUM_SLAVES; i++) { + if (slaveFound[i] && slaveResponded[i]) + Serial.printf(" | S%d=%d", i, slaves[i].value); + else + Serial.printf(" | S%d=OFFLINE", i); + } + Serial.println(); + } + + delay(1); } \ No newline at end of file diff --git a/firmware/single_encoder/single_encoder.ino b/firmware/single_encoder/single_encoder.ino index d6a196c..f890e7b 100644 --- a/firmware/single_encoder/single_encoder.ino +++ b/firmware/single_encoder/single_encoder.ino @@ -1,249 +1,249 @@ -#include -#include -#include -#include -#include -#include -#include // For std::sort - -/** - * ============================================================ - * Single Encoder BLE Firmware Template [firmware/single_encoder/] - * Board: XIAO ESP32C3 / ESP32C6 - * Sensor: AS5047D 14-bit Magnetic Rotary Encoder (SPI) - * - * For multi-encoder (master+slave) projects, see: - * firmware/master/master.ino — ESP32C6 master - * firmware/slave/slave.ino — ESP32C3 slave - * ============================================================ - * - * CONFIGURE BEFORE FLASHING: - * Change ESP_NAME, SERVICE_UUID, and CHARACTERISTIC_UUID below. - * Everything else (SPI, sampling algorithm, BLE logic) does not need editing. - * - * Strategy: Hybrid Robust Filtering - * 1. 4096 Samples total. - * 2. Divided into 16 blocks of 256 samples each. - * 3. Each block: Robust Mean (discards samples > 1.5 LSB from mean). - * 4. Final Result: Median of the 16 block-means. - * ============================================================ - * Author: Swaraj Dangare - */ - -// ============================================================ -// CONFIGURE BEFORE FLASHING -// ============================================================ -#define ESP_NAME "YOUR_DEVICE_NAME" -#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" -#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" -// ============================================================ - -// ---------------- AS5047D SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC 0x3FFC // Diagnostic and AGC register -#define MAG 0x3FFD // CORDIC magnitude register -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 -#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 - -// SPI Pins (XIAO ESP32C3/C6) -// SCK=D1, MISO=D0, MOSI=D10, CS=D7 -const int PIN_CS = D7; -const int PIN_SCK = D1; -const int PIN_MISO = D0; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// ---------------- BLE STATE ---------------- -BLECharacteristic *pChar; -bool deviceConnected = false; -bool readRequested = false; -bool zeroRequest = false; -double zeroOffset = 0.0; -uint32_t packetIdx = 0; // Global packet counter - -// ---------------- BLE CALLBACKS ---------------- -class MyServerCallbacks : public BLEServerCallbacks { - void onConnect(BLEServer *pServer) { - deviceConnected = true; - Serial.println("[BLE] Connected"); - } - void onDisconnect(BLEServer *pServer) { - deviceConnected = false; - Serial.println("[BLE] Disconnected"); - BLEDevice::getAdvertising()->start(); - } -}; - -class WriteCallback : public BLECharacteristicCallbacks { - void onWrite(BLECharacteristic *pChar) { - String value = pChar->getValue().c_str(); - if (value == "READ") { - readRequested = true; - } else if (value == "ZERO") { - zeroRequest = true; - Serial.println("[CMD] Zero reset requested"); - } - } -}; - -// ---------------- UTILS ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read() { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t AS5047D_ReadRegister(uint16_t address) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(address)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -// ---------------- STATISTICS ---------------- -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -// ---------------- SETUP ---------------- -void setup() { - Serial.begin(115200); - pinMode(PIN_CS, OUTPUT); - digitalWrite(PIN_CS, HIGH); - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); - - BLEDevice::init(ESP_NAME); - BLEServer *pServer = BLEDevice::createServer(); - pServer->setCallbacks(new MyServerCallbacks()); - BLEService *pService = pServer->createService(SERVICE_UUID); - pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, - BLECharacteristic::PROPERTY_NOTIFY | - BLECharacteristic::PROPERTY_WRITE); - pChar->addDescriptor(new BLE2902()); - pChar->setCallbacks(new WriteCallback()); - pService->start(); - BLEDevice::getAdvertising()->start(); - Serial.println("[BLE] Advertising as '" ESP_NAME "' — awaiting READ command"); -} - -// ---------------- MAIN LOOP ---------------- -void loop() { - // On-demand read: only fires when PC writes "READ" over BLE - if (readRequested) { - readRequested = false; - packetIdx++; - - Serial.printf("[READ #%u] Sampling...\n", packetIdx); - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; // Retry on parity error - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); // Brief yield to keep BLE alive - } - - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - double rawAngle = (finalCounts * 360.0) / 16384.0; - - // Handle zero reset (applied on next READ after ZERO command) - if (zeroRequest) { - zeroOffset = rawAngle; - zeroRequest = false; - Serial.printf("[ZERO] Offset set to %.5f\n", zeroOffset); - } - - // Apply zero offset and normalize to [0, 360) - double angle = rawAngle - zeroOffset; - if (angle < 0) angle += 360.0; - if (angle >= 360.0) angle -= 360.0; - - // Angle as integer x 10000 (matches Oliver master format) - int angleInt = (int)(angle * 10000.0); - - // Read diagnostics - uint16_t diaagc = AS5047D_ReadRegister(DIAAGC); - uint16_t mag = AS5047D_ReadRegister(MAG); - uint8_t agc = diaagc & 0xFF; - uint8_t cof = (diaagc >> 9) & 1; - uint8_t magl = (diaagc >> 10) & 1; - uint8_t magh = (diaagc >> 11) & 1; - uint16_t magnitude = mag & 0x3FFF; - - // BLE message: same 7-field format as Oliver master, single encoder only - // |M0:,,,,,, - String bleMsg = String(packetIdx); - bleMsg += "|M0:" + String(angleInt) + "," - + String(packetIdx) + "," - + String(agc) + "," - + String(magnitude) + "," - + String(magl) + "," - + String(magh) + "," - + String(cof); - - if (deviceConnected && pChar) { - pChar->setValue(bleMsg.c_str()); - pChar->notify(); - } - - Serial.printf("[READ #%u] M0=%d (%.5f deg) | AGC:%u MAG:%u MAGL:%u MAGH:%u COF:%u\n", - packetIdx, angleInt, angle, agc, magnitude, magl, magh, cof); - } - - delay(1); -} +#include +#include +#include +#include +#include +#include +#include // For std::sort + +/** + * ============================================================ + * Single Encoder BLE Firmware Template [firmware/single_encoder/] + * Board: XIAO ESP32C3 / ESP32C6 + * Sensor: AS5047D 14-bit Magnetic Rotary Encoder (SPI) + * + * For multi-encoder (master+slave) projects, see: + * firmware/master/master.ino — ESP32C6 master + * firmware/slave/slave.ino — ESP32C3 slave + * ============================================================ + * + * CONFIGURE BEFORE FLASHING: + * Change ESP_NAME, SERVICE_UUID, and CHARACTERISTIC_UUID below. + * Everything else (SPI, sampling algorithm, BLE logic) does not need editing. + * + * Strategy: Hybrid Robust Filtering + * 1. 4096 Samples total. + * 2. Divided into 16 blocks of 256 samples each. + * 3. Each block: Robust Mean (discards samples > 1.5 LSB from mean). + * 4. Final Result: Median of the 16 block-means. + * ============================================================ + * Author: Swaraj Dangare + */ + +// ============================================================ +// CONFIGURE BEFORE FLASHING +// ============================================================ +#define ESP_NAME "YOUR_DEVICE_NAME" +#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" +#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" +// ============================================================ + +// ---------------- AS5047D SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC 0x3FFC // Diagnostic and AGC register +#define MAG 0x3FFD // CORDIC magnitude register +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 +#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 + +// SPI Pins (XIAO ESP32C3/C6) +// SCK=D1, MISO=D0, MOSI=D10, CS=D7 +const int PIN_CS = D7; +const int PIN_SCK = D1; +const int PIN_MISO = D0; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// ---------------- BLE STATE ---------------- +BLECharacteristic *pChar; +bool deviceConnected = false; +bool readRequested = false; +bool zeroRequest = false; +double zeroOffset = 0.0; +uint32_t packetIdx = 0; // Global packet counter + +// ---------------- BLE CALLBACKS ---------------- +class MyServerCallbacks : public BLEServerCallbacks { + void onConnect(BLEServer *pServer) { + deviceConnected = true; + Serial.println("[BLE] Connected"); + } + void onDisconnect(BLEServer *pServer) { + deviceConnected = false; + Serial.println("[BLE] Disconnected"); + BLEDevice::getAdvertising()->start(); + } +}; + +class WriteCallback : public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pChar) { + String value = pChar->getValue().c_str(); + if (value == "READ") { + readRequested = true; + } else if (value == "ZERO") { + zeroRequest = true; + Serial.println("[CMD] Zero reset requested"); + } + } +}; + +// ---------------- UTILS ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read() { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t AS5047D_ReadRegister(uint16_t address) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(address)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +// ---------------- STATISTICS ---------------- +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +// ---------------- SETUP ---------------- +void setup() { + Serial.begin(115200); + pinMode(PIN_CS, OUTPUT); + digitalWrite(PIN_CS, HIGH); + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + + BLEDevice::init(ESP_NAME); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new MyServerCallbacks()); + BLEService *pService = pServer->createService(SERVICE_UUID); + pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, + BLECharacteristic::PROPERTY_NOTIFY | + BLECharacteristic::PROPERTY_WRITE); + pChar->addDescriptor(new BLE2902()); + pChar->setCallbacks(new WriteCallback()); + pService->start(); + BLEDevice::getAdvertising()->start(); + Serial.println("[BLE] Advertising as '" ESP_NAME "' — awaiting READ command"); +} + +// ---------------- MAIN LOOP ---------------- +void loop() { + // On-demand read: only fires when PC writes "READ" over BLE + if (readRequested) { + readRequested = false; + packetIdx++; + + Serial.printf("[READ #%u] Sampling...\n", packetIdx); + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; // Retry on parity error + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); // Brief yield to keep BLE alive + } + + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + double rawAngle = (finalCounts * 360.0) / 16384.0; + + // Handle zero reset (applied on next READ after ZERO command) + if (zeroRequest) { + zeroOffset = rawAngle; + zeroRequest = false; + Serial.printf("[ZERO] Offset set to %.5f\n", zeroOffset); + } + + // Apply zero offset and normalize to [0, 360) + double angle = rawAngle - zeroOffset; + if (angle < 0) angle += 360.0; + if (angle >= 360.0) angle -= 360.0; + + // Angle as integer x 10000 (matches Oliver master format) + int angleInt = (int)(angle * 10000.0); + + // Read diagnostics + uint16_t diaagc = AS5047D_ReadRegister(DIAAGC); + uint16_t mag = AS5047D_ReadRegister(MAG); + uint8_t agc = diaagc & 0xFF; + uint8_t cof = (diaagc >> 9) & 1; + uint8_t magl = (diaagc >> 10) & 1; + uint8_t magh = (diaagc >> 11) & 1; + uint16_t magnitude = mag & 0x3FFF; + + // BLE message: same 7-field format as Oliver master, single encoder only + // |M0:,,,,,, + String bleMsg = String(packetIdx); + bleMsg += "|M0:" + String(angleInt) + "," + + String(packetIdx) + "," + + String(agc) + "," + + String(magnitude) + "," + + String(magl) + "," + + String(magh) + "," + + String(cof); + + if (deviceConnected && pChar) { + pChar->setValue(bleMsg.c_str()); + pChar->notify(); + } + + Serial.printf("[READ #%u] M0=%d (%.5f deg) | AGC:%u MAG:%u MAGL:%u MAGH:%u COF:%u\n", + packetIdx, angleInt, angle, agc, magnitude, magl, magh, cof); + } + + delay(1); +} diff --git a/firmware/slave/slave.ino b/firmware/slave/slave.ino index ca5f5c0..894f8ea 100644 --- a/firmware/slave/slave.ino +++ b/firmware/slave/slave.ino @@ -1,207 +1,207 @@ -#include -#include -#include -#include -#include - -/** - * Project: Wireless Ultra-Precision Slave (On-Demand) - * Protocol: ESP-NOW (Request -> Response) - * Sensor: AS5047D (SPI) - * Logic: Wait for Request -> Measure (~15ms) -> Reply - * Author: Swaraj Dangare - */ - -#define SLAVE_ID 0 //<--- CHANGE THIS FOR EACH BOARD: 0, 1, 2, 3, 4 -#define WIFI_CHANNEL 11 // Must match master's WIFI_CHANNEL (use 1, 6, or 11) - -// ---------------- COMMUNICATION ---------------- -typedef struct __attribute__((packed)) { - uint8_t id; - int value; // Angle * 10000 - uint32_t packetIdx; - uint8_t agc; // AS5047D AGC value (0-255) - uint16_t mag; // AS5047D CORDIC magnitude (14-bit) - uint8_t magl; // Magnetic field too low (0 or 1) - uint8_t magh; // Magnetic field too high (0 or 1) - uint8_t cof; // CORDIC overflow (0 or 1) -} Payload; - -Payload pkt; -uint32_t packet_counter = 0; - -// ---------------- AS5047D SETTINGS ---------------- -#define ANGLECOM 0x3FFF -#define DIAAGC_REG 0x3FFC -#define MAG_REG 0x3FFD -#define RD 0x40 -#define NUM_BLOCKS 16 -#define SAMPLES_PER_BLOCK 256 -#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 - -// XIAO ESP32C3 SPI Pins (Standard) -const int PIN_CS = D7; -const int PIN_SCK = D1; -const int PIN_MISO = D0; -const int PIN_MOSI = D10; - -SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); - -// ---------------- UTILS & ENCODER ---------------- -uint16_t evenParityBit(uint16_t x) { - x &= 0x7FFF; - return __builtin_parity(x); -} - -uint16_t makeReadCmd(uint16_t addr) { - uint16_t cmd = (1 << 14) | (addr & 0x3FFF); - cmd |= (evenParityBit(cmd) << 15); - return cmd; -} - -uint16_t AS5047D_Read() { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(ANGLECOM)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result; -} - -uint16_t readRegister(uint16_t addr) { - uint16_t result; - SPI.beginTransaction(spiSettings); - digitalWrite(PIN_CS, LOW); - SPI.transfer16(makeReadCmd(addr)); - digitalWrite(PIN_CS, HIGH); - delayMicroseconds(1); - digitalWrite(PIN_CS, LOW); - result = SPI.transfer16(0x0000); - digitalWrite(PIN_CS, HIGH); - SPI.endTransaction(); - return result & 0x3FFF; -} - -// Robust Mean: Calculate mean of samples within 1.5 LSB distance from initial -// median -double getRobustMean(uint16_t *samples, int size) { - double sum = 0; - for (int i = 0; i < size; i++) - sum += (samples[i] & 0x3FFF); - double initialMean = sum / size; - - double robustSum = 0; - int count = 0; - for (int i = 0; i < size; i++) { - uint16_t val = samples[i] & 0x3FFF; - if (abs((double)val - initialMean) < 1.5) { - robustSum += val; - count++; - } - } - return (count > 0) ? (robustSum / count) : initialMean; -} - -double getMedian(double *values, int size) { - std::sort(values, values + size); - return values[size / 2]; -} - -double getUltraPrecisionReading() { - double blockMeans[NUM_BLOCKS]; - uint16_t blockSamples[SAMPLES_PER_BLOCK]; - - for (int b = 0; b < NUM_BLOCKS; b++) { - for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { - uint16_t raw = AS5047D_Read(); - if (((raw >> 15) & 1) == evenParityBit(raw)) { - blockSamples[s] = raw; - } else { - s--; - } - } - blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); - delayMicroseconds(50); // Small yield - } - double finalCounts = getMedian(blockMeans, NUM_BLOCKS); - return (finalCounts * 360.0) / 16384.0; -} - -// ---------------- ESP-NOW CALLBACK ---------------- -void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int len) { - // 1. Discovery Response (Master sends 0xFF) - if (len == 1 && data[0] == 0xFF) { - // Add small random delay to prevent collision when multiple slaves respond - // This staggers responses across 10-30ms window - delayMicroseconds(random(10000, 30000)); // 10-30ms - - uint8_t reply = SLAVE_ID; - // Add master as peer dynamically so we can reply - if (!esp_now_is_peer_exist(info->src_addr)) { - esp_now_peer_info_t peer{}; - memcpy(peer.peer_addr, info->src_addr, 6); - peer.channel = WIFI_CHANNEL; - peer.encrypt = false; - esp_now_add_peer(&peer); - } - esp_now_send(info->src_addr, &reply, 1); - } - - // 2. Data Request (Master sends Slave ID) - if (len == 1 && data[0] == SLAVE_ID) { - // Perform Measurement (Block-Blocking but fast enough ~15-20ms) - double angle = getUltraPrecisionReading(); - - // Read diagnostic registers - uint16_t diaagc = readRegister(DIAAGC_REG); - uint16_t mag = readRegister(MAG_REG); - - pkt.id = SLAVE_ID; - pkt.value = (int)(angle * 10000.0); - pkt.packetIdx = packet_counter++; - pkt.agc = diaagc & 0xFF; - pkt.mag = mag & 0x3FFF; - pkt.magl = (diaagc >> 8) & 0x01; - pkt.magh = (diaagc >> 10) & 0x01; - pkt.cof = (diaagc >> 9) & 0x01; - - esp_now_send(info->src_addr, (uint8_t *)&pkt, sizeof(pkt)); - } -} - -void setup() { - Serial.begin(115200); - Serial.println("init"); - // SPI Setup - pinMode(PIN_CS, OUTPUT); - digitalWrite(PIN_CS, HIGH); - SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); - - // WiFi / ESP-NOW Setup - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - - // Force WiFi channel (must match master) - esp_wifi_set_promiscuous(true); - esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); - esp_wifi_set_promiscuous(false); - - if (esp_now_init() != ESP_OK) { - Serial.println("ESP-NOW Init Failed"); - return; - } - esp_now_register_recv_cb(onDataRecv); - - Serial.printf("Slave %d Ready | Channel %d | MAC: %s\n", SLAVE_ID, - WIFI_CHANNEL, WiFi.macAddress().c_str()); -} - -void loop() { - // Nothing here - totally interrupt driven - delay(100); +#include +#include +#include +#include +#include + +/** + * Project: Wireless Ultra-Precision Slave (On-Demand) + * Protocol: ESP-NOW (Request -> Response) + * Sensor: AS5047D (SPI) + * Logic: Wait for Request -> Measure (~15ms) -> Reply + * Author: Swaraj Dangare + */ + +#define SLAVE_ID 0 //<--- CHANGE THIS FOR EACH BOARD: 0, 1, 2, 3, 4 +#define WIFI_CHANNEL 11 // Must match master's WIFI_CHANNEL (use 1, 6, or 11) + +// ---------------- COMMUNICATION ---------------- +typedef struct __attribute__((packed)) { + uint8_t id; + int value; // Angle * 10000 + uint32_t packetIdx; + uint8_t agc; // AS5047D AGC value (0-255) + uint16_t mag; // AS5047D CORDIC magnitude (14-bit) + uint8_t magl; // Magnetic field too low (0 or 1) + uint8_t magh; // Magnetic field too high (0 or 1) + uint8_t cof; // CORDIC overflow (0 or 1) +} Payload; + +Payload pkt; +uint32_t packet_counter = 0; + +// ---------------- AS5047D SETTINGS ---------------- +#define ANGLECOM 0x3FFF +#define DIAAGC_REG 0x3FFC +#define MAG_REG 0x3FFD +#define RD 0x40 +#define NUM_BLOCKS 16 +#define SAMPLES_PER_BLOCK 256 +#define TOTAL_SAMPLES (NUM_BLOCKS * SAMPLES_PER_BLOCK) // 4096 + +// XIAO ESP32C3 SPI Pins (Standard) +const int PIN_CS = D7; +const int PIN_SCK = D1; +const int PIN_MISO = D0; +const int PIN_MOSI = D10; + +SPISettings spiSettings(10000000, MSBFIRST, SPI_MODE1); + +// ---------------- UTILS & ENCODER ---------------- +uint16_t evenParityBit(uint16_t x) { + x &= 0x7FFF; + return __builtin_parity(x); +} + +uint16_t makeReadCmd(uint16_t addr) { + uint16_t cmd = (1 << 14) | (addr & 0x3FFF); + cmd |= (evenParityBit(cmd) << 15); + return cmd; +} + +uint16_t AS5047D_Read() { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(ANGLECOM)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result; +} + +uint16_t readRegister(uint16_t addr) { + uint16_t result; + SPI.beginTransaction(spiSettings); + digitalWrite(PIN_CS, LOW); + SPI.transfer16(makeReadCmd(addr)); + digitalWrite(PIN_CS, HIGH); + delayMicroseconds(1); + digitalWrite(PIN_CS, LOW); + result = SPI.transfer16(0x0000); + digitalWrite(PIN_CS, HIGH); + SPI.endTransaction(); + return result & 0x3FFF; +} + +// Robust Mean: Calculate mean of samples within 1.5 LSB distance from initial +// median +double getRobustMean(uint16_t *samples, int size) { + double sum = 0; + for (int i = 0; i < size; i++) + sum += (samples[i] & 0x3FFF); + double initialMean = sum / size; + + double robustSum = 0; + int count = 0; + for (int i = 0; i < size; i++) { + uint16_t val = samples[i] & 0x3FFF; + if (abs((double)val - initialMean) < 1.5) { + robustSum += val; + count++; + } + } + return (count > 0) ? (robustSum / count) : initialMean; +} + +double getMedian(double *values, int size) { + std::sort(values, values + size); + return values[size / 2]; +} + +double getUltraPrecisionReading() { + double blockMeans[NUM_BLOCKS]; + uint16_t blockSamples[SAMPLES_PER_BLOCK]; + + for (int b = 0; b < NUM_BLOCKS; b++) { + for (int s = 0; s < SAMPLES_PER_BLOCK; s++) { + uint16_t raw = AS5047D_Read(); + if (((raw >> 15) & 1) == evenParityBit(raw)) { + blockSamples[s] = raw; + } else { + s--; + } + } + blockMeans[b] = getRobustMean(blockSamples, SAMPLES_PER_BLOCK); + delayMicroseconds(50); // Small yield + } + double finalCounts = getMedian(blockMeans, NUM_BLOCKS); + return (finalCounts * 360.0) / 16384.0; +} + +// ---------------- ESP-NOW CALLBACK ---------------- +void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int len) { + // 1. Discovery Response (Master sends 0xFF) + if (len == 1 && data[0] == 0xFF) { + // Add small random delay to prevent collision when multiple slaves respond + // This staggers responses across 10-30ms window + delayMicroseconds(random(10000, 30000)); // 10-30ms + + uint8_t reply = SLAVE_ID; + // Add master as peer dynamically so we can reply + if (!esp_now_is_peer_exist(info->src_addr)) { + esp_now_peer_info_t peer{}; + memcpy(peer.peer_addr, info->src_addr, 6); + peer.channel = WIFI_CHANNEL; + peer.encrypt = false; + esp_now_add_peer(&peer); + } + esp_now_send(info->src_addr, &reply, 1); + } + + // 2. Data Request (Master sends Slave ID) + if (len == 1 && data[0] == SLAVE_ID) { + // Perform Measurement (Block-Blocking but fast enough ~15-20ms) + double angle = getUltraPrecisionReading(); + + // Read diagnostic registers + uint16_t diaagc = readRegister(DIAAGC_REG); + uint16_t mag = readRegister(MAG_REG); + + pkt.id = SLAVE_ID; + pkt.value = (int)(angle * 10000.0); + pkt.packetIdx = packet_counter++; + pkt.agc = diaagc & 0xFF; + pkt.mag = mag & 0x3FFF; + pkt.magl = (diaagc >> 8) & 0x01; + pkt.magh = (diaagc >> 10) & 0x01; + pkt.cof = (diaagc >> 9) & 0x01; + + esp_now_send(info->src_addr, (uint8_t *)&pkt, sizeof(pkt)); + } +} + +void setup() { + Serial.begin(115200); + Serial.println("init"); + // SPI Setup + pinMode(PIN_CS, OUTPUT); + digitalWrite(PIN_CS, HIGH); + SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); + + // WiFi / ESP-NOW Setup + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + + // Force WiFi channel (must match master) + esp_wifi_set_promiscuous(true); + esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); + esp_wifi_set_promiscuous(false); + + if (esp_now_init() != ESP_OK) { + Serial.println("ESP-NOW Init Failed"); + return; + } + esp_now_register_recv_cb(onDataRecv); + + Serial.printf("Slave %d Ready | Channel %d | MAC: %s\n", SLAVE_ID, + WIFI_CHANNEL, WiFi.macAddress().c_str()); +} + +void loop() { + // Nothing here - totally interrupt driven + delay(100); } \ No newline at end of file diff --git a/projects/block_height/BLADE_OFFSET_PROBE.py b/projects/block_height/BLADE_OFFSET_PROBE.py index 5c09682..7385e8c 100644 --- a/projects/block_height/BLADE_OFFSET_PROBE.py +++ b/projects/block_height/BLADE_OFFSET_PROBE.py @@ -1,326 +1,326 @@ -""" -Author: Swaraj Dangare -""" -import asyncio -import time -import sys -import select -import numpy as np -from collections import deque -from bleak import BleakClient, BleakScanner -import os -import csv -from datetime import datetime - -# BLE configuration -DEVICE_NAME = "AIRPROBE_MASTER_GATEWAY" -CHARACTERISTIC_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" -COMMAND_UUID = "8d53dc1d-1db7-4cd3-868b-8a527460aa84" - - -class GatewayInterface: - def __init__(self): - self.start_time = time.time() - self.last_g_idx = -1 - self.missed_packets = 0 - self.client = None - - # Manual sampling mode - self.manual_mode = True - self.samples_per_measurement = 5 - self.current_samples = { - 'M0': [], 'S0': [] - } - self.sample_metadata = { - 'M0': [], 'S0': [] - } - self.collecting = False - self.measurement_id = 0 - - # Legacy variance tracking (kept for reference) - self.sample_size = 100 - self.encoder_samples = { - 'M0': deque(maxlen=self.sample_size), - 'S0': deque(maxlen=self.sample_size), - } - - # ---------- CSV LOGGING ---------- - os.makedirs("logs", exist_ok=True) - ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - self.csv_path = f"logs/airprobe_log_{ts}.csv" - self.csv_file = open(self.csv_path, "w", newline="") - self.csv_writer = csv.writer(self.csv_file) - - self.csv_writer.writerow([ - "timestamp", - "uptime_s", - "measurement_id", - "sample_num", - "gateway_idx", - "encoder", - "angle_deg", - "median", - "jitter", - "precision_um", - "pkt", - "agc", - "mag", - "magl", - "magh", - "cof", - "status" - ]) - - print(f"[LOG] CSV logging to {self.csv_path}") - - def variance(self, key): - vals = list(self.encoder_samples[key]) - return np.var(vals) if len(vals) > 1 else 0.0 - - def start_measurement(self): - """Initialize a new measurement session""" - self.measurement_id += 1 - self.collecting = True - for key in self.current_samples: - self.current_samples[key] = [] - self.sample_metadata[key] = [] - print("\nCollecting 5 samples", end="", flush=True) - - def calculate_precision_metrics(self, samples): - """Calculate median, jitter, and precision from samples""" - if len(samples) < 3: - return None, None, None - - median_angle = np.median(samples) - jitter = max(samples) - min(samples) - # Assuming 183mm reach (from reference script) - precision_um = 183 * (jitter * np.pi / 180.0) * 1000 - return median_angle, jitter, precision_um - - def display_results(self): - """Display measurement results with precision metrics""" - print("\n\n" + "="*130) - print(f"=== AIRPROBE PRECISION MEASUREMENT #{self.measurement_id} | Uptime {int(time.time() - self.start_time)}s ===") - print("="*130) - print( - f"{'ENC':<4} | {'MEDIAN (deg)':>12} | {'JITTER (deg)':>13} | {'PRECISION (μm)':>15} | " - f"{'AGC':<4} | {'MAG':<5} | {'STATUS':<12}" - ) - print("-" * 130) - - for enc_name in ['M0', 'S0']: - samples = self.current_samples[enc_name] - - if len(samples) == 0: - print(f"{enc_name:<4} | {'---':>12} | {'---':>13} | {'---':>15} | {'---':<4} | {'---':<5} | OFFLINE") - continue - - median, jitter, precision = self.calculate_precision_metrics(samples) - - if median is None: - print(f"{enc_name:<4} | {'INSUFFICIENT':>12} | {'DATA':>13} | {'---':>15} | {'---':<4} | {'---':<5} | ERROR") - continue - - # Get metadata from last sample - meta = self.sample_metadata[enc_name][-1] if self.sample_metadata[enc_name] else {} - agc = meta.get('agc', '---') - mag = meta.get('mag', '---') - status = meta.get('status', 'OK') - - print( - f"{enc_name:<4} | {median:12.5f} | {jitter:13.5f} | {precision:15.1f} | " - f"{agc:<4} | {mag:<5} | {status:<12}" - ) - - print("="*130) - print("\nPress Enter to measure again (Q to quit)") - - def log_measurement(self): - """Log all samples from current measurement to CSV""" - for enc_name in ['M0', 'S0']: - samples = self.current_samples[enc_name] - median, jitter, precision = self.calculate_precision_metrics(samples) - - for i, angle in enumerate(samples): - meta = self.sample_metadata[enc_name][i] if i < len(self.sample_metadata[enc_name]) else {} - - self.csv_writer.writerow([ - time.time(), - round(time.time() - self.start_time, 3), - self.measurement_id, - i + 1, - meta.get('g_idx', ''), - enc_name, - angle, - median if median is not None else '', - jitter if jitter is not None else '', - precision if precision is not None else '', - meta.get('pkt', ''), - meta.get('agc', ''), - meta.get('mag', ''), - meta.get('magl', ''), - meta.get('magh', ''), - meta.get('cof', ''), - meta.get('status', '') - ]) - - self.csv_file.flush() - - def handle_data(self, payload): - # Handle incoming BLE data - collect samples in manual mode - parts = payload.split('|') - try: - g_idx = int(parts[0]) - - if self.last_g_idx != -1 and g_idx - self.last_g_idx > 1: - self.missed_packets += g_idx - self.last_g_idx - 1 - self.last_g_idx = g_idx - - if not self.collecting: - return # Ignore data when not actively collecting - - # Progress indicator - print(".", end="", flush=True) - - # -------- MASTER -------- - _, d = parts[1].split(":") - fields = d.split(",") - - ang = float(fields[0]) / 10000.0 - pkt = int(fields[1]) - agc = int(fields[2]) - mag = int(fields[3]) - magl = fields[4] - magh = fields[5] - cof = fields[6] - - status = "MASTER" - if cof == "1": - status = "CORDIC_ERR" - elif magl == "1": - status = "FIELD_HIGH" - elif magh == "1": - status = "FIELD_LOW" - - self.current_samples['M0'].append(ang) - self.sample_metadata['M0'].append({ - 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, - 'magl': magl, 'magh': magh, 'cof': cof, 'status': status - }) - - # -------- SLAVE (S0 only) -------- - name = "S0" - idx = 2 # S0 is at index 2 in the parts array - - if idx < len(parts): - _, d = parts[idx].split(":") - fields = d.split(",") - - if fields[0] != "OFFLINE": - ang = float(fields[0]) / 10000.0 - pkt = int(fields[1]) - agc = int(fields[2]) - mag = int(fields[3]) - magl = fields[4] - magh = fields[5] - cof = fields[6] - - status = "OK" - if cof == "1": - status = "CORDIC_ERR" - elif magl == "1": - status = "FIELD_HIGH" - elif magh == "1": - status = "FIELD_LOW" - - self.current_samples[name].append(ang) - self.sample_metadata[name].append({ - 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, - 'magl': magl, 'magh': magh, 'cof': cof, 'status': status - }) - - # Check if we've collected enough samples - # Use M0 as reference (master is always present) - if len(self.current_samples['M0']) >= self.samples_per_measurement: - self.collecting = False - self.display_results() - self.log_measurement() - - except Exception as e: - print(f"\nParse error: {e}") - print(payload) - - async def send_cmd(self, cmd): - if self.client and self.client.is_connected: - try: - await self.client.write_gatt_char(COMMAND_UUID, cmd.encode()) - print(f"\n✓ Sent command: {cmd}\n") - except Exception: - print("\n✗ Command characteristic not available on gateway\n") - - -iface = GatewayInterface() - - -def notify(_, data): - iface.handle_data(data.decode()) - - -async def get_key(): - if sys.platform == "win32": - return None - if select.select([sys.stdin], [], [], 0)[0]: - return sys.stdin.read(1) - return None - - -async def main(): - print("Scanning for gateway...") - dev = await BleakScanner.find_device_by_filter(lambda d, a: d.name == DEVICE_NAME) - if not dev: - print("✗ Gateway not found") - return - - async with BleakClient(dev) as c: - iface.client = c - await c.start_notify(CHARACTERISTIC_UUID, notify) - print("✓ Connected to AIRPROBE_MASTER_GATEWAY\n") - - print("=" * 80) - print(" AIRPROBE PRECISION MEASUREMENT SYSTEM") - print(" Mode: Manual sampling (5 samples per encoder)") - print(" Encoders: M0 (Master) + S0 (Slave)") - print("=" * 80) - print("\nPress Enter to start a measurement (Q to quit)\n") - - try: - while c.is_connected: - k = await get_key() - if k: - if k.lower() == 'q': - print("\nDisconnecting...") - break - elif k == '\n': - # Start a new measurement - iface.start_measurement() - # Data will be collected via notify callback - # When 5 samples collected, results will auto-display - await asyncio.sleep(0.1) - except KeyboardInterrupt: - print("\n\nDisconnecting...") - - -if __name__ == "__main__": - if sys.platform != "win32": - import tty, termios - old = termios.tcgetattr(sys.stdin) - try: - tty.setcbreak(sys.stdin.fileno()) - asyncio.run(main()) - finally: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old) - iface.csv_file.close() - else: - asyncio.run(main()) - iface.csv_file.close() - +""" +Author: Swaraj Dangare +""" +import asyncio +import time +import sys +import select +import numpy as np +from collections import deque +from bleak import BleakClient, BleakScanner +import os +import csv +from datetime import datetime + +# BLE configuration +DEVICE_NAME = "AIRPROBE_MASTER_GATEWAY" +CHARACTERISTIC_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" +COMMAND_UUID = "8d53dc1d-1db7-4cd3-868b-8a527460aa84" + + +class GatewayInterface: + def __init__(self): + self.start_time = time.time() + self.last_g_idx = -1 + self.missed_packets = 0 + self.client = None + + # Manual sampling mode + self.manual_mode = True + self.samples_per_measurement = 5 + self.current_samples = { + 'M0': [], 'S0': [] + } + self.sample_metadata = { + 'M0': [], 'S0': [] + } + self.collecting = False + self.measurement_id = 0 + + # Legacy variance tracking (kept for reference) + self.sample_size = 100 + self.encoder_samples = { + 'M0': deque(maxlen=self.sample_size), + 'S0': deque(maxlen=self.sample_size), + } + + # ---------- CSV LOGGING ---------- + os.makedirs("logs", exist_ok=True) + ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + self.csv_path = f"logs/airprobe_log_{ts}.csv" + self.csv_file = open(self.csv_path, "w", newline="") + self.csv_writer = csv.writer(self.csv_file) + + self.csv_writer.writerow([ + "timestamp", + "uptime_s", + "measurement_id", + "sample_num", + "gateway_idx", + "encoder", + "angle_deg", + "median", + "jitter", + "precision_um", + "pkt", + "agc", + "mag", + "magl", + "magh", + "cof", + "status" + ]) + + print(f"[LOG] CSV logging to {self.csv_path}") + + def variance(self, key): + vals = list(self.encoder_samples[key]) + return np.var(vals) if len(vals) > 1 else 0.0 + + def start_measurement(self): + """Initialize a new measurement session""" + self.measurement_id += 1 + self.collecting = True + for key in self.current_samples: + self.current_samples[key] = [] + self.sample_metadata[key] = [] + print("\nCollecting 5 samples", end="", flush=True) + + def calculate_precision_metrics(self, samples): + """Calculate median, jitter, and precision from samples""" + if len(samples) < 3: + return None, None, None + + median_angle = np.median(samples) + jitter = max(samples) - min(samples) + # Assuming 183mm reach (from reference script) + precision_um = 183 * (jitter * np.pi / 180.0) * 1000 + return median_angle, jitter, precision_um + + def display_results(self): + """Display measurement results with precision metrics""" + print("\n\n" + "="*130) + print(f"=== AIRPROBE PRECISION MEASUREMENT #{self.measurement_id} | Uptime {int(time.time() - self.start_time)}s ===") + print("="*130) + print( + f"{'ENC':<4} | {'MEDIAN (deg)':>12} | {'JITTER (deg)':>13} | {'PRECISION (μm)':>15} | " + f"{'AGC':<4} | {'MAG':<5} | {'STATUS':<12}" + ) + print("-" * 130) + + for enc_name in ['M0', 'S0']: + samples = self.current_samples[enc_name] + + if len(samples) == 0: + print(f"{enc_name:<4} | {'---':>12} | {'---':>13} | {'---':>15} | {'---':<4} | {'---':<5} | OFFLINE") + continue + + median, jitter, precision = self.calculate_precision_metrics(samples) + + if median is None: + print(f"{enc_name:<4} | {'INSUFFICIENT':>12} | {'DATA':>13} | {'---':>15} | {'---':<4} | {'---':<5} | ERROR") + continue + + # Get metadata from last sample + meta = self.sample_metadata[enc_name][-1] if self.sample_metadata[enc_name] else {} + agc = meta.get('agc', '---') + mag = meta.get('mag', '---') + status = meta.get('status', 'OK') + + print( + f"{enc_name:<4} | {median:12.5f} | {jitter:13.5f} | {precision:15.1f} | " + f"{agc:<4} | {mag:<5} | {status:<12}" + ) + + print("="*130) + print("\nPress Enter to measure again (Q to quit)") + + def log_measurement(self): + """Log all samples from current measurement to CSV""" + for enc_name in ['M0', 'S0']: + samples = self.current_samples[enc_name] + median, jitter, precision = self.calculate_precision_metrics(samples) + + for i, angle in enumerate(samples): + meta = self.sample_metadata[enc_name][i] if i < len(self.sample_metadata[enc_name]) else {} + + self.csv_writer.writerow([ + time.time(), + round(time.time() - self.start_time, 3), + self.measurement_id, + i + 1, + meta.get('g_idx', ''), + enc_name, + angle, + median if median is not None else '', + jitter if jitter is not None else '', + precision if precision is not None else '', + meta.get('pkt', ''), + meta.get('agc', ''), + meta.get('mag', ''), + meta.get('magl', ''), + meta.get('magh', ''), + meta.get('cof', ''), + meta.get('status', '') + ]) + + self.csv_file.flush() + + def handle_data(self, payload): + # Handle incoming BLE data - collect samples in manual mode + parts = payload.split('|') + try: + g_idx = int(parts[0]) + + if self.last_g_idx != -1 and g_idx - self.last_g_idx > 1: + self.missed_packets += g_idx - self.last_g_idx - 1 + self.last_g_idx = g_idx + + if not self.collecting: + return # Ignore data when not actively collecting + + # Progress indicator + print(".", end="", flush=True) + + # -------- MASTER -------- + _, d = parts[1].split(":") + fields = d.split(",") + + ang = float(fields[0]) / 10000.0 + pkt = int(fields[1]) + agc = int(fields[2]) + mag = int(fields[3]) + magl = fields[4] + magh = fields[5] + cof = fields[6] + + status = "MASTER" + if cof == "1": + status = "CORDIC_ERR" + elif magl == "1": + status = "FIELD_HIGH" + elif magh == "1": + status = "FIELD_LOW" + + self.current_samples['M0'].append(ang) + self.sample_metadata['M0'].append({ + 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, + 'magl': magl, 'magh': magh, 'cof': cof, 'status': status + }) + + # -------- SLAVE (S0 only) -------- + name = "S0" + idx = 2 # S0 is at index 2 in the parts array + + if idx < len(parts): + _, d = parts[idx].split(":") + fields = d.split(",") + + if fields[0] != "OFFLINE": + ang = float(fields[0]) / 10000.0 + pkt = int(fields[1]) + agc = int(fields[2]) + mag = int(fields[3]) + magl = fields[4] + magh = fields[5] + cof = fields[6] + + status = "OK" + if cof == "1": + status = "CORDIC_ERR" + elif magl == "1": + status = "FIELD_HIGH" + elif magh == "1": + status = "FIELD_LOW" + + self.current_samples[name].append(ang) + self.sample_metadata[name].append({ + 'g_idx': g_idx, 'pkt': pkt, 'agc': agc, 'mag': mag, + 'magl': magl, 'magh': magh, 'cof': cof, 'status': status + }) + + # Check if we've collected enough samples + # Use M0 as reference (master is always present) + if len(self.current_samples['M0']) >= self.samples_per_measurement: + self.collecting = False + self.display_results() + self.log_measurement() + + except Exception as e: + print(f"\nParse error: {e}") + print(payload) + + async def send_cmd(self, cmd): + if self.client and self.client.is_connected: + try: + await self.client.write_gatt_char(COMMAND_UUID, cmd.encode()) + print(f"\n✓ Sent command: {cmd}\n") + except Exception: + print("\n✗ Command characteristic not available on gateway\n") + + +iface = GatewayInterface() + + +def notify(_, data): + iface.handle_data(data.decode()) + + +async def get_key(): + if sys.platform == "win32": + return None + if select.select([sys.stdin], [], [], 0)[0]: + return sys.stdin.read(1) + return None + + +async def main(): + print("Scanning for gateway...") + dev = await BleakScanner.find_device_by_filter(lambda d, a: d.name == DEVICE_NAME) + if not dev: + print("✗ Gateway not found") + return + + async with BleakClient(dev) as c: + iface.client = c + await c.start_notify(CHARACTERISTIC_UUID, notify) + print("✓ Connected to AIRPROBE_MASTER_GATEWAY\n") + + print("=" * 80) + print(" AIRPROBE PRECISION MEASUREMENT SYSTEM") + print(" Mode: Manual sampling (5 samples per encoder)") + print(" Encoders: M0 (Master) + S0 (Slave)") + print("=" * 80) + print("\nPress Enter to start a measurement (Q to quit)\n") + + try: + while c.is_connected: + k = await get_key() + if k: + if k.lower() == 'q': + print("\nDisconnecting...") + break + elif k == '\n': + # Start a new measurement + iface.start_measurement() + # Data will be collected via notify callback + # When 5 samples collected, results will auto-display + await asyncio.sleep(0.1) + except KeyboardInterrupt: + print("\n\nDisconnecting...") + + +if __name__ == "__main__": + if sys.platform != "win32": + import tty, termios + old = termios.tcgetattr(sys.stdin) + try: + tty.setcbreak(sys.stdin.fileno()) + asyncio.run(main()) + finally: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old) + iface.csv_file.close() + else: + asyncio.run(main()) + iface.csv_file.close() + diff --git a/projects/block_height/README.md b/projects/block_height/README.md index 43d129a..6352157 100644 --- a/projects/block_height/README.md +++ b/projects/block_height/README.md @@ -1,184 +1,184 @@ -# Block Height Measurement System - -## Overview -Measure vertical height of blocks using a 40mm link attached to an encoder shaft. The system calculates height from rotation angle using trigonometry. - -## Files -- `block_height_encoder.ino` - ESP32 firmware (same as ultra precision encoder) -- `block_height_receiver.py` - Python receiver with height calculation - -## Setup -1. Attach 40mm link perpendicular to encoder shaft -2. Upload `block_height_encoder.ino` to ESP32C6 -3. Install dependencies: `pip install bleak numpy scipy` -4. Run `python block_height_receiver.py` - -## Usage - -### Measuring Block Height -1. **Zero at ground**: Touch link end to ground, press `Z` -2. **Measure block**: Touch link end to block top, press `Enter` -3. **Read height**: System displays vertical distance in mm - -### Commands -- `Enter` - Measure angle and calculate height -- `Z` - Zero encoder at current position (ground reference) -- `D` - Toggle diagnostic data display (ON/OFF) -- `L` - Set link length (default: 40mm) -- `C` - **Calibrate starting angle** (new!) -- `Ctrl+C` - Quit - -## Calibration Mode (NEW!) - -The `starting_angle` parameter accounts for the initial angle of the link when the encoder is at zero. Use calibration mode to determine the optimal value. - -### How to Calibrate - -1. Press `C` to enter calibration mode -2. For each of 5 measurements: - - Position link at a known height - - Press Enter to measure angle - - Input the actual height in mm -3. System calculates optimal `starting_angle` using least-squares optimization -4. Review the verification errors -5. Apply or discard the calibration - -### Example Calibration Session - -``` ->> Command [Enter/Z/D/L/C]: c - -============================================================ - STARTING ANGLE CALIBRATION MODE -============================================================ - -Instructions: -1. Position the link at a known height -2. Press Enter to measure the angle -3. Enter the actual height in mm -4. Repeat for 5 different heights - -[1/5] Press Enter to measure... - Measured angle: 0.15234° - Enter actual height (mm): 5.0 - ✓ Point 1 recorded - -[2/5] Press Enter to measure... - Measured angle: 2.45123° - Enter actual height (mm): 10.0 - ✓ Point 2 recorded - -... (3 more measurements) - -Calculating optimal starting angle... - -============================================================ - CALIBRATION RESULTS -============================================================ - -Old starting angle: 59.200° -New starting angle: 58.743° - -Verification: - Point 1: Actual=5.00mm, Predicted=5.02mm, Error=+0.02mm - Point 2: Actual=10.00mm, Predicted=9.98mm, Error=-0.02mm - Point 3: Actual=15.00mm, Predicted=15.01mm, Error=+0.01mm - Point 4: Actual=20.00mm, Predicted=19.99mm, Error=-0.01mm - Point 5: Actual=25.00mm, Predicted=25.00mm, Error=+0.00mm - -Apply this calibration? (y/n): y -✓ Starting angle updated to 58.743° -Note: This value is not saved permanently. Update it in the code if needed. -``` - -## Mathematics - -### Height Calculation Formula -``` -height = (L × cos(θ₀)) - (L × cos(θ₀ + θ)) - -Where: - L = link length (40mm) - θ₀ = starting_angle (calibrated parameter) - θ = measured angle from encoder -``` - -### Calibration Algorithm - -The calibration uses **least-squares optimization** to find the `starting_angle` that minimizes prediction errors: - -1. Collect N measurements: (θᵢ, hᵢ) where hᵢ is actual height -2. Define error function: - ``` - E(θ₀) = Σ [h_predicted(θ₀, θᵢ) - hᵢ]² - ``` -3. Minimize E(θ₀) using scipy.optimize.minimize (Nelder-Mead method) -4. Return optimal θ₀ - -**Why this works:** The starting angle affects all measurements systematically. By measuring multiple known heights, we can back-calculate the angle that makes all predictions match reality. - -## Features - -### Color-Coded Output -- **Cyan (Bold)** - Angle measurements -- **Green (Bold)** - Height measurements -- **Yellow** - Diagnostic data -- **Magenta** - Info messages -- **Red** - Critical warnings -- **Blue** - Calibration mode - -### Diagnostic Toggle -- Press 'D' to show/hide diagnostic data -- Keeps display clean during measurements -- Still monitors for warnings (MAGL, MAGH, COF) - -### Angle Unwrapping -- Automatically handles 0°/360° boundary crossings -- Prevents false high jitter readings near zero -- Ensures accurate statistics - -### High Precision -- 4096-sample averaging per measurement -- Median of 5 measurements -- Sub-micron angle precision -- Height precision depends on link length and angle - -## Output Example - -``` ------------------------------------------------------------- - ANGLE : 15.23400 degrees - VERTICAL HEIGHT: 10.523 mm ------------------------------------------------------------- - Read SUCCESS -``` - -With diagnostics enabled (press 'D'): -``` ------------------------------------------------------------- - ANGLE : 15.23400 degrees - VERTICAL HEIGHT: 10.523 mm - - DIAGNOSTIC DATA: - RAW JITTER : 0.00120 deg (0.8 microns) - ALL READINGS : [15.23222, 15.23252, 15.23459, 15.23559, 15.23407] - AGC (Gain) : 70 - MAG (Magn.) : 4640 - MAGL (High) : 0 - MAGH (Low) : 0 - COF (Ovflow) : 0 ------------------------------------------------------------- - Read SUCCESS -``` - -## Notes -- Firmware includes angle inversion (360° - angle) for correct orientation -- Zero offset stored in RAM (resets on ESP32 power cycle) -- **Starting angle calibration not saved permanently** - update `self.starting_angle` in code after calibration -- Link must be perpendicular to shaft for accurate measurements -- AGC value of ~128 indicates optimal magnetic field strength -- For best calibration results, use heights spanning your measurement range - ---- - -**Author:** Swaraj Dangare +# Block Height Measurement System + +## Overview +Measure vertical height of blocks using a 40mm link attached to an encoder shaft. The system calculates height from rotation angle using trigonometry. + +## Files +- `block_height_encoder.ino` - ESP32 firmware (same as ultra precision encoder) +- `block_height_receiver.py` - Python receiver with height calculation + +## Setup +1. Attach 40mm link perpendicular to encoder shaft +2. Upload `block_height_encoder.ino` to ESP32C6 +3. Install dependencies: `pip install bleak numpy scipy` +4. Run `python block_height_receiver.py` + +## Usage + +### Measuring Block Height +1. **Zero at ground**: Touch link end to ground, press `Z` +2. **Measure block**: Touch link end to block top, press `Enter` +3. **Read height**: System displays vertical distance in mm + +### Commands +- `Enter` - Measure angle and calculate height +- `Z` - Zero encoder at current position (ground reference) +- `D` - Toggle diagnostic data display (ON/OFF) +- `L` - Set link length (default: 40mm) +- `C` - **Calibrate starting angle** (new!) +- `Ctrl+C` - Quit + +## Calibration Mode (NEW!) + +The `starting_angle` parameter accounts for the initial angle of the link when the encoder is at zero. Use calibration mode to determine the optimal value. + +### How to Calibrate + +1. Press `C` to enter calibration mode +2. For each of 5 measurements: + - Position link at a known height + - Press Enter to measure angle + - Input the actual height in mm +3. System calculates optimal `starting_angle` using least-squares optimization +4. Review the verification errors +5. Apply or discard the calibration + +### Example Calibration Session + +``` +>> Command [Enter/Z/D/L/C]: c + +============================================================ + STARTING ANGLE CALIBRATION MODE +============================================================ + +Instructions: +1. Position the link at a known height +2. Press Enter to measure the angle +3. Enter the actual height in mm +4. Repeat for 5 different heights + +[1/5] Press Enter to measure... + Measured angle: 0.15234° + Enter actual height (mm): 5.0 + ✓ Point 1 recorded + +[2/5] Press Enter to measure... + Measured angle: 2.45123° + Enter actual height (mm): 10.0 + ✓ Point 2 recorded + +... (3 more measurements) + +Calculating optimal starting angle... + +============================================================ + CALIBRATION RESULTS +============================================================ + +Old starting angle: 59.200° +New starting angle: 58.743° + +Verification: + Point 1: Actual=5.00mm, Predicted=5.02mm, Error=+0.02mm + Point 2: Actual=10.00mm, Predicted=9.98mm, Error=-0.02mm + Point 3: Actual=15.00mm, Predicted=15.01mm, Error=+0.01mm + Point 4: Actual=20.00mm, Predicted=19.99mm, Error=-0.01mm + Point 5: Actual=25.00mm, Predicted=25.00mm, Error=+0.00mm + +Apply this calibration? (y/n): y +✓ Starting angle updated to 58.743° +Note: This value is not saved permanently. Update it in the code if needed. +``` + +## Mathematics + +### Height Calculation Formula +``` +height = (L × cos(θ₀)) - (L × cos(θ₀ + θ)) + +Where: + L = link length (40mm) + θ₀ = starting_angle (calibrated parameter) + θ = measured angle from encoder +``` + +### Calibration Algorithm + +The calibration uses **least-squares optimization** to find the `starting_angle` that minimizes prediction errors: + +1. Collect N measurements: (θᵢ, hᵢ) where hᵢ is actual height +2. Define error function: + ``` + E(θ₀) = Σ [h_predicted(θ₀, θᵢ) - hᵢ]² + ``` +3. Minimize E(θ₀) using scipy.optimize.minimize (Nelder-Mead method) +4. Return optimal θ₀ + +**Why this works:** The starting angle affects all measurements systematically. By measuring multiple known heights, we can back-calculate the angle that makes all predictions match reality. + +## Features + +### Color-Coded Output +- **Cyan (Bold)** - Angle measurements +- **Green (Bold)** - Height measurements +- **Yellow** - Diagnostic data +- **Magenta** - Info messages +- **Red** - Critical warnings +- **Blue** - Calibration mode + +### Diagnostic Toggle +- Press 'D' to show/hide diagnostic data +- Keeps display clean during measurements +- Still monitors for warnings (MAGL, MAGH, COF) + +### Angle Unwrapping +- Automatically handles 0°/360° boundary crossings +- Prevents false high jitter readings near zero +- Ensures accurate statistics + +### High Precision +- 4096-sample averaging per measurement +- Median of 5 measurements +- Sub-micron angle precision +- Height precision depends on link length and angle + +## Output Example + +``` +------------------------------------------------------------ + ANGLE : 15.23400 degrees + VERTICAL HEIGHT: 10.523 mm +------------------------------------------------------------ + Read SUCCESS +``` + +With diagnostics enabled (press 'D'): +``` +------------------------------------------------------------ + ANGLE : 15.23400 degrees + VERTICAL HEIGHT: 10.523 mm + + DIAGNOSTIC DATA: + RAW JITTER : 0.00120 deg (0.8 microns) + ALL READINGS : [15.23222, 15.23252, 15.23459, 15.23559, 15.23407] + AGC (Gain) : 70 + MAG (Magn.) : 4640 + MAGL (High) : 0 + MAGH (Low) : 0 + COF (Ovflow) : 0 +------------------------------------------------------------ + Read SUCCESS +``` + +## Notes +- Firmware includes angle inversion (360° - angle) for correct orientation +- Zero offset stored in RAM (resets on ESP32 power cycle) +- **Starting angle calibration not saved permanently** - update `self.starting_angle` in code after calibration +- Link must be perpendicular to shaft for accurate measurements +- AGC value of ~128 indicates optimal magnetic field strength +- For best calibration results, use heights spanning your measurement range + +--- + +**Author:** Swaraj Dangare diff --git a/projects/block_height/README_polynomial.md b/projects/block_height/README_polynomial.md index e3e59a3..14228f4 100644 --- a/projects/block_height/README_polynomial.md +++ b/projects/block_height/README_polynomial.md @@ -1,134 +1,134 @@ -# Polynomial Curve Fitting Version - -## Overview -This is a **simplified version** that uses polynomial regression to directly map angle → height, **without any trigonometry or starting_angle parameter**. - -## Key Differences from Trigonometric Version - -| Feature | Trigonometric Version | Polynomial Version | -|---------|----------------------|-------------------| -| **Model** | `height = L×cos(θ₀) - L×cos(θ₀+θ)` | `height = a₀ + a₁×θ + a₂×θ² + ...` | -| **Parameters** | `starting_angle`, `link_length` | Polynomial coefficients | -| **Calibration** | Optimizes `starting_angle` | Fits polynomial curve | -| **Complexity** | Physics-based (requires understanding) | Pure data fitting (black box) | -| **Extrapolation** | Good (follows physics) | Poor (can diverge outside range) | - -## Usage - -### 1. Run the Script -```bash -python3 block_height_receiver_polynomial.py -``` - -### 2. Calibrate First (REQUIRED) -Press `C` to enter calibration mode: -- Choose polynomial degree (1-5, default=2) - - **1 = Linear**: Simple, but may not fit well - - **2 = Quadratic**: Good balance (recommended) - - **3 = Cubic**: More flexible - - **4-5 = Higher order**: Risk of overfitting -- Measure at least `degree + 2` points (e.g., 4 points for quadratic) -- More points = better fit -- Type `done` when finished - -### 3. Measure Heights -After calibration, press `Enter` to measure. - -## Commands -- `Enter` - Measure angle and calculate height -- `Z` - Zero encoder at current position -- `D` - Toggle diagnostic display -- `C` - Calibrate polynomial curve -- `Ctrl+C` - Quit - -## Example Calibration - -``` ->> Command [Enter/Z/D/C]: c - -============================================================ - POLYNOMIAL CURVE FITTING CALIBRATION -============================================================ - -Polynomial degree (1=linear, 2=quadratic, 3=cubic) [default=2]: 2 - -Using 2-degree polynomial - -[Point 1] Press Enter to measure... - Measured angle: 0.00000° - Enter actual height (mm): 0.0 - ✓ Point 1 recorded - -[Point 2] Press Enter to measure... - Measured angle: 4.98470° - Enter actual height (mm): 3.0 - ✓ Point 2 recorded - -... (collect more points) - -[Point 10] Press Enter to measure... - Measured angle: 22.52680° - Enter actual height (mm): 14.455 - ✓ Point 10 recorded - -[Point 11] Press Enter to measure (or type 'done' to finish)...done - -Fitting 2-degree polynomial... - -============================================================ - CALIBRATION RESULTS -============================================================ - -Polynomial degree: 2 -Number of points: 10 -R² (fit quality): 0.999876 (1.0 = perfect) -RMS Error: 0.0523 mm - -Polynomial coefficients: - a2: -1.234567e-03 - a1: 6.543210e-01 - a0: 1.234567e-02 - -height = 0.0123 + 0.6543*angle - 0.0012*angle^2 - -Verification: -Point Angle Actual Predicted Error ------------------------------------------------------------- -1 0.00000 0.000 0.012 +0.012 -2 4.98470 3.000 2.997 -0.003 -... -10 22.52680 14.455 14.450 -0.005 - -✓ Calibration complete! Polynomial coefficients saved. -``` - -## Advantages -✅ **No physics knowledge needed** - Just fit a curve to data -✅ **No starting_angle** - One less parameter to worry about -✅ **Flexible** - Can fit any smooth curve -✅ **Simple** - Easy to understand - -## Disadvantages -❌ **Black box** - No physical meaning -❌ **Poor extrapolation** - Don't measure outside calibrated range -❌ **Overfitting risk** - High-degree polynomials can be unstable -❌ **Needs recalibration** - If link length changes - -## Recommendations -- Use **2nd degree (quadratic)** for most cases -- Calibrate with **8-15 points** spread across your measurement range -- Include points at 0mm (ground reference) -- Don't extrapolate beyond calibrated range -- R² > 0.999 indicates excellent fit - -## When to Use This Version -- You want simplicity over physics -- You don't care about the physical model -- You're measuring within a fixed range -- You want to avoid trigonometry - -## When to Use Trigonometric Version -- You want physically meaningful parameters -- You need to extrapolate beyond calibrated range -- You want to understand the system behavior -- Link length might change +# Polynomial Curve Fitting Version + +## Overview +This is a **simplified version** that uses polynomial regression to directly map angle → height, **without any trigonometry or starting_angle parameter**. + +## Key Differences from Trigonometric Version + +| Feature | Trigonometric Version | Polynomial Version | +|---------|----------------------|-------------------| +| **Model** | `height = L×cos(θ₀) - L×cos(θ₀+θ)` | `height = a₀ + a₁×θ + a₂×θ² + ...` | +| **Parameters** | `starting_angle`, `link_length` | Polynomial coefficients | +| **Calibration** | Optimizes `starting_angle` | Fits polynomial curve | +| **Complexity** | Physics-based (requires understanding) | Pure data fitting (black box) | +| **Extrapolation** | Good (follows physics) | Poor (can diverge outside range) | + +## Usage + +### 1. Run the Script +```bash +python3 block_height_receiver_polynomial.py +``` + +### 2. Calibrate First (REQUIRED) +Press `C` to enter calibration mode: +- Choose polynomial degree (1-5, default=2) + - **1 = Linear**: Simple, but may not fit well + - **2 = Quadratic**: Good balance (recommended) + - **3 = Cubic**: More flexible + - **4-5 = Higher order**: Risk of overfitting +- Measure at least `degree + 2` points (e.g., 4 points for quadratic) +- More points = better fit +- Type `done` when finished + +### 3. Measure Heights +After calibration, press `Enter` to measure. + +## Commands +- `Enter` - Measure angle and calculate height +- `Z` - Zero encoder at current position +- `D` - Toggle diagnostic display +- `C` - Calibrate polynomial curve +- `Ctrl+C` - Quit + +## Example Calibration + +``` +>> Command [Enter/Z/D/C]: c + +============================================================ + POLYNOMIAL CURVE FITTING CALIBRATION +============================================================ + +Polynomial degree (1=linear, 2=quadratic, 3=cubic) [default=2]: 2 + +Using 2-degree polynomial + +[Point 1] Press Enter to measure... + Measured angle: 0.00000° + Enter actual height (mm): 0.0 + ✓ Point 1 recorded + +[Point 2] Press Enter to measure... + Measured angle: 4.98470° + Enter actual height (mm): 3.0 + ✓ Point 2 recorded + +... (collect more points) + +[Point 10] Press Enter to measure... + Measured angle: 22.52680° + Enter actual height (mm): 14.455 + ✓ Point 10 recorded + +[Point 11] Press Enter to measure (or type 'done' to finish)...done + +Fitting 2-degree polynomial... + +============================================================ + CALIBRATION RESULTS +============================================================ + +Polynomial degree: 2 +Number of points: 10 +R² (fit quality): 0.999876 (1.0 = perfect) +RMS Error: 0.0523 mm + +Polynomial coefficients: + a2: -1.234567e-03 + a1: 6.543210e-01 + a0: 1.234567e-02 + +height = 0.0123 + 0.6543*angle - 0.0012*angle^2 + +Verification: +Point Angle Actual Predicted Error +------------------------------------------------------------ +1 0.00000 0.000 0.012 +0.012 +2 4.98470 3.000 2.997 -0.003 +... +10 22.52680 14.455 14.450 -0.005 + +✓ Calibration complete! Polynomial coefficients saved. +``` + +## Advantages +✅ **No physics knowledge needed** - Just fit a curve to data +✅ **No starting_angle** - One less parameter to worry about +✅ **Flexible** - Can fit any smooth curve +✅ **Simple** - Easy to understand + +## Disadvantages +❌ **Black box** - No physical meaning +❌ **Poor extrapolation** - Don't measure outside calibrated range +❌ **Overfitting risk** - High-degree polynomials can be unstable +❌ **Needs recalibration** - If link length changes + +## Recommendations +- Use **2nd degree (quadratic)** for most cases +- Calibrate with **8-15 points** spread across your measurement range +- Include points at 0mm (ground reference) +- Don't extrapolate beyond calibrated range +- R² > 0.999 indicates excellent fit + +## When to Use This Version +- You want simplicity over physics +- You don't care about the physical model +- You're measuring within a fixed range +- You want to avoid trigonometry + +## When to Use Trigonometric Version +- You want physically meaningful parameters +- You need to extrapolate beyond calibrated range +- You want to understand the system behavior +- Link length might change diff --git a/projects/block_height/block_height_receiver.py b/projects/block_height/block_height_receiver.py index d093297..a768e84 100644 --- a/projects/block_height/block_height_receiver.py +++ b/projects/block_height/block_height_receiver.py @@ -1,356 +1,356 @@ -""" -Author: Swaraj Dangare -""" -import asyncio -import statistics -import math -from bleak import BleakClient, BleakScanner -import numpy as np -from scipy.optimize import least_squares - -# BLE Configuration - -ESP_NAME = "BlockOffsetEncoder" -SERVICE_UUID = "4fafc201-1fb5-459e-8fcc-c5c9c331914b" -CHAR_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" - -# ANSI Color Codes -class Colors: - CYAN = '\033[96m' - GREEN = '\033[92m' - YELLOW = '\033[93m' - RED = '\033[91m' - MAGENTA = '\033[95m' - BLUE = '\033[94m' - BOLD = '\033[1m' - RESET = '\033[0m' - -class HighPrecisionReceiver: - def __init__(self): - - self.latest_angle = None - self.latest_diagnostics = {} # Store AGC, MAG, MAGL, MAGH, COF - self.device = None - self.message_received = asyncio.Event() - self.starting_angle = 56.809 #59.2 56.809 - # Block height measurement configuration - self.link_length = 40.0 # mm - self.show_diagnostics = False # Toggle for diagnostic display - - def notification_handler(self, sender, data): - msg = data.decode() - try: - # New Format: "E0:66.4340,AGC:128,MAG:5432,MAGL:0,MAGH:0,COF:0" - # Parse all fields - parts = msg.split(',') - - # Extract angle from first part - if ':' in parts[0]: - _, angle_str = parts[0].split(':') - self.latest_angle = float(angle_str) - - # Extract diagnostic data - self.latest_diagnostics = {} - for part in parts[1:]: - if ':' in part: - key, value = part.split(':') - self.latest_diagnostics[key] = int(value) - - self.message_received.set() - except Exception as e: - print(f" [!] Parse Error: {e}") - - async def get_single_reading(self, client): - self.message_received.clear() - await client.write_gatt_char(CHAR_UUID, b"X") - try: - # The Ultra-Precision firmware takes ~160ms to sample 4096 times (16 blocks) - await asyncio.wait_for(self.message_received.wait(), timeout=5.0) - return self.latest_angle - except asyncio.TimeoutError: - return None - - async def zero_encoder(self, client): - """Send 'Z' command to reset encoder to zero""" - await client.write_gatt_char(CHAR_UUID, b"Z") - await asyncio.sleep(0.1) # Give firmware time to process - print(f"{Colors.MAGENTA} [INFO] Zero reset command sent to encoder{Colors.RESET}") - - def set_link_length(self): - """Allow user to configure link length""" - try: - new_length = float(input(f"Enter link length in mm (current: {self.link_length}mm): ")) - if new_length > 0: - self.link_length = new_length - print(f"{Colors.MAGENTA} [INFO] Link length set to {self.link_length}mm{Colors.RESET}") - else: - print(f"{Colors.RED} [ERROR] Link length must be positive{Colors.RESET}") - except ValueError: - print(f"{Colors.RED} [ERROR] Invalid input{Colors.RESET}") - - def calculate_height(self, angle_deg): - """Calculate vertical height from angle using trigonometry""" - # Height = link_length × sin(angle) - angle_rad = math.radians(self.starting_angle+angle_deg) - height_mm = (self.link_length * math.cos(math.radians(self.starting_angle)))-(self.link_length * math.cos(angle_rad)) - return height_mm - - async def calibrate_starting_angle(self, client): - """Calibration mode: collect 10 measurements and back-calculate starting_angle""" - print("=" * 60) - print(" STARTING ANGLE CALIBRATION MODE") - print("=" * 60) - print(f"\n{Colors.YELLOW}Instructions:{Colors.RESET}") - print("1. Position the link at a known height") - print("2. Press Enter to measure the angle") - print("3. Enter the actual height in mm") - print("4. Repeat for 10 different heights\n") - - calibration_data = [] # Store (angle, actual_height) pairs - - for i in range(10): - input(f"\n{Colors.GREEN}[{i+1}/10] Press Enter to measure...{Colors.RESET}") - - # Get angle measurement - results = [] - for _ in range(5): - val = await self.get_single_reading(client) - if val is not None: - results.append(val) - await asyncio.sleep(0.1) - - if len(results) >= 3: - # Apply inversion and unwrapping - inverted_results = [360 - r for r in results] - has_low = any(r < 10 for r in inverted_results) - has_high = any(r > 350 for r in inverted_results) - - if has_low and has_high: - unwrapped = [r if r < 180 else r - 360 for r in inverted_results] - angle = statistics.median(unwrapped) - if angle < 0: - angle += 360 - else: - angle = statistics.median(inverted_results) - - print(f" Measured angle: {Colors.CYAN}{angle:.5f}°{Colors.RESET}") - - # Get actual height from user - while True: - try: - actual_height = float(input(f" Enter actual height (mm): ")) - break - except ValueError: - print(f" {Colors.RED}Invalid input, try again{Colors.RESET}") - - calibration_data.append((angle, actual_height)) - print(f" {Colors.GREEN}✓ Point {i+1} recorded{Colors.RESET}") - else: - print(f" {Colors.RED}Failed to get reading, try again{Colors.RESET}") - return - - # Back-calculate optimal starting_angle using least-squares - print(f"\n{Colors.YELLOW}Calculating optimal starting angle...{Colors.RESET}") - - # Store original starting angle (don't modify during calibration) - original_starting_angle = self.starting_angle - - def residuals(starting_angle_guess): - """Calculate residuals (errors) for least_squares optimization""" - errors = [] - for angle_deg, actual_height in calibration_data: - # Calculate predicted height - angle_rad = math.radians(starting_angle_guess[0] + angle_deg) - predicted_height = (self.link_length * math.cos(math.radians(starting_angle_guess[0]))) - \ - (self.link_length * math.cos(angle_rad)) - error = predicted_height - actual_height - errors.append(error) - return errors - - # Optimize starting_angle using least_squares (Levenberg-Marquardt) - # This is much faster and more accurate than Nelder-Mead for this problem - result = least_squares(residuals, [original_starting_angle], method='lm') - optimal_angle = result.x[0] - - print(f"\n{Colors.BOLD}{Colors.GREEN}=" * 60) - print(" CALIBRATION RESULTS") - print("=" * 60 + Colors.RESET) - print(f"\nOld starting angle: {Colors.YELLOW}{original_starting_angle:.3f}°{Colors.RESET}") - print(f"New starting angle: {Colors.GREEN}{Colors.BOLD}{optimal_angle:.3f}°{Colors.RESET}") - - # Show prediction errors - print(f"\n{Colors.CYAN}Verification:{Colors.RESET}") - for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): - angle_rad = math.radians(optimal_angle + angle_deg) - predicted_height = (self.link_length * math.cos(math.radians(optimal_angle))) - \ - (self.link_length * math.cos(angle_rad)) - error = predicted_height - actual_height - print(f" Point {i}: Actual={actual_height:.2f}mm, Predicted={predicted_height:.2f}mm, Error={error:+.2f}mm") - - # Ask user to apply - apply = input(f"\n{Colors.YELLOW}Apply this calibration? (y/n): {Colors.RESET}").strip().lower() - if apply == 'y': - self.starting_angle = optimal_angle - print(f"{Colors.GREEN}✓ Starting angle updated to {optimal_angle:.3f}°{Colors.RESET}") - print(f"{Colors.MAGENTA}Note: This value is not saved permanently. Update it in the code if needed.{Colors.RESET}") - else: - print(f"{Colors.YELLOW}Calibration discarded{Colors.RESET}") - - async def run(self): - print(f"Scanning for {ESP_NAME}...") - self.device = await BleakScanner.find_device_by_name(ESP_NAME) - - if not self.device: - print(f"Error: Could not find device named '{ESP_NAME}'") - return - - print(f"Found {self.device.name} ({self.device.address}). Connecting...") - - # Retry mechanism for connection - max_retries = 3 - client = None - - for attempt in range(max_retries): - try: - client = BleakClient(self.device, timeout=10.0) - await client.connect() - if client.is_connected: - break - except Exception as e: - print(f"Connection attempt {attempt+1}/{max_retries} failed: {e}") - if attempt < max_retries - 1: - await asyncio.sleep(2.0) - else: - print("Failed to connect after multiple retries.") - return - - # Proceed if connected - try: - print(f"Connected: {client.is_connected}") - await client.start_notify(CHAR_UUID, self.notification_handler) - - print("\n" + "="*60) - print(f"{Colors.BOLD}{Colors.CYAN} BLOCK HEIGHT MEASUREMENT SYSTEM{Colors.RESET}") - print(f" Link Length: {Colors.YELLOW}{self.link_length}mm{Colors.RESET}") - print(" Logic: Median of 5 blocks (4096-sample filtered each)") - print("="*60) - print(f"\n{Colors.BOLD}Commands:{Colors.RESET}") - print(f" {Colors.GREEN}Enter{Colors.RESET} - Measure angle and height") - print(f" {Colors.YELLOW}Z{Colors.RESET} - Zero at ground reference") - print(f" {Colors.CYAN}D{Colors.RESET} - Toggle diagnostic display") - print(f" {Colors.MAGENTA}L{Colors.RESET} - Set link length") - print(f" {Colors.BLUE}C{Colors.RESET} - Calibrate starting angle") - print(f" {Colors.RED}Ctrl+C{Colors.RESET} - Quit\n") - - try: - while True: - user_input = input("\n>> Command [Enter/Z/D/L/C]: ").strip().upper() - - if user_input == 'Z': - await self.zero_encoder(client) - continue - elif user_input == 'D': - self.show_diagnostics = not self.show_diagnostics - status = "ON" if self.show_diagnostics else "OFF" - print(f"{Colors.MAGENTA} [INFO] Diagnostic display: {status}{Colors.RESET}") - continue - elif user_input == 'L': - self.set_link_length() - continue - elif user_input == 'C': - await self.calibrate_starting_angle(client) - continue - - # print("Sampling 5 sets of data from ESP32...", end="", flush=True) - - results = [] - for i in range(5): - val = await self.get_single_reading(client) - if val is not None: - results.append(val) - print(".", end="", flush=True) - await asyncio.sleep(0.1) # Brief gap between requests - - if len(results) >= 3: - # Apply 360° inversion first - inverted_results = [360 - r for r in results] - - # Detect angle wrap-around at 0°/360° boundary - # If we have values both near 0° and near 360°, unwrap them - has_low = any(r < 10 for r in inverted_results) - has_high = any(r > 350 for r in inverted_results) - - if has_low and has_high: - # Unwrap: convert 350-360° to negative equivalent (-10 to 0°) - unwrapped = [r if r < 180 else r - 360 for r in inverted_results] - final_median = statistics.median(unwrapped) - range_val = max(unwrapped) - min(unwrapped) - - # Convert back to positive 0-360° range if needed - if final_median < 0: - final_median += 360 - else: - # No wrap-around, use normal calculation - final_median = statistics.median(inverted_results) - range_val = max(inverted_results) - min(inverted_results) - - # Calculate vertical height from angle - height_mm = self.calculate_height(final_median) - - # Calculate physical precision for link - # angle_deg * (pi/180) * link_length - precision_microns = self.link_length * (range_val * 3.14159 / 180.0) * 1000 - - print(f"\n" + "-"*60) - print(f"{Colors.CYAN}{Colors.BOLD} ANGLE : {final_median:.5f} degrees{Colors.RESET}") - print(f"{Colors.GREEN}{Colors.BOLD} VERTICAL HEIGHT: {height_mm:.3f} mm{Colors.RESET}") - # print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") - # print(f" ALL READINGS : {[round(r, 5) for r in results]}") - - # Display diagnostic data only if enabled - if self.show_diagnostics and self.latest_diagnostics: - print(f"\n{Colors.YELLOW} DIAGNOSTIC DATA:{Colors.RESET}") - print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") - print(f" ALL READINGS : {[round(r, 5) for r in results]}") - print(f" AGC (Gain) : {self.latest_diagnostics.get('AGC', 'N/A')}") - print(f" MAG (Magn.) : {self.latest_diagnostics.get('MAG', 'N/A')}") - print(f" MAGL (High) : {self.latest_diagnostics.get('MAGL', 'N/A')}") - print(f" MAGH (Low) : {self.latest_diagnostics.get('MAGH', 'N/A')}") - print(f" COF (Ovflow) : {self.latest_diagnostics.get('COF', 'N/A')}") - - print("-"*60) - - # Check for diagnostic warnings - if self.latest_diagnostics.get('MAGL', 0) == 1: - print(f"{Colors.RED} [WARNING] Magnetic field too HIGH (AGC=0x00)!{Colors.RESET}") - print(f"{Colors.RED} Action: Move magnet further from sensor.{Colors.RESET}") - elif self.latest_diagnostics.get('MAGH', 0) == 1: - print(f"{Colors.RED} [WARNING] Magnetic field too LOW (AGC=0xFF)!{Colors.RESET}") - print(f"{Colors.RED} Action: Move magnet closer to sensor.{Colors.RESET}") - elif self.latest_diagnostics.get('COF', 0) == 1: - print(f"{Colors.RED} [WARNING] CORDIC overflow detected!{Colors.RESET}") - print(f"{Colors.RED} Action: Check sensor alignment and magnetic field.{Colors.RESET}") - elif precision_microns > 50: - print(f"{Colors.YELLOW} [WARNING] Jitter is {precision_microns:.1f}u, which exceeds 50u limit.{Colors.RESET}") - print(f"{Colors.YELLOW} Check for vibrations or move the arm slightly.{Colors.RESET}") - else: - print(f"{Colors.GREEN} Read SUCCESS{Colors.RESET}") - else: - print("\n[ERROR] Failed to collect enough samples from BLE.") - - except KeyboardInterrupt: - print("\nDisconnecting...") - finally: - if client and client.is_connected: - await client.stop_notify(CHAR_UUID) - await client.disconnect() - - except Exception as e: - print(f" [!] Unexpected Error: {e}") - -if __name__ == "__main__": - receiver = HighPrecisionReceiver() - try: - asyncio.run(receiver.run()) - except KeyboardInterrupt: - pass +""" +Author: Swaraj Dangare +""" +import asyncio +import statistics +import math +from bleak import BleakClient, BleakScanner +import numpy as np +from scipy.optimize import least_squares + +# BLE Configuration + +ESP_NAME = "BlockOffsetEncoder" +SERVICE_UUID = "4fafc201-1fb5-459e-8fcc-c5c9c331914b" +CHAR_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" + +# ANSI Color Codes +class Colors: + CYAN = '\033[96m' + GREEN = '\033[92m' + YELLOW = '\033[93m' + RED = '\033[91m' + MAGENTA = '\033[95m' + BLUE = '\033[94m' + BOLD = '\033[1m' + RESET = '\033[0m' + +class HighPrecisionReceiver: + def __init__(self): + + self.latest_angle = None + self.latest_diagnostics = {} # Store AGC, MAG, MAGL, MAGH, COF + self.device = None + self.message_received = asyncio.Event() + self.starting_angle = 56.809 #59.2 56.809 + # Block height measurement configuration + self.link_length = 40.0 # mm + self.show_diagnostics = False # Toggle for diagnostic display + + def notification_handler(self, sender, data): + msg = data.decode() + try: + # New Format: "E0:66.4340,AGC:128,MAG:5432,MAGL:0,MAGH:0,COF:0" + # Parse all fields + parts = msg.split(',') + + # Extract angle from first part + if ':' in parts[0]: + _, angle_str = parts[0].split(':') + self.latest_angle = float(angle_str) + + # Extract diagnostic data + self.latest_diagnostics = {} + for part in parts[1:]: + if ':' in part: + key, value = part.split(':') + self.latest_diagnostics[key] = int(value) + + self.message_received.set() + except Exception as e: + print(f" [!] Parse Error: {e}") + + async def get_single_reading(self, client): + self.message_received.clear() + await client.write_gatt_char(CHAR_UUID, b"X") + try: + # The Ultra-Precision firmware takes ~160ms to sample 4096 times (16 blocks) + await asyncio.wait_for(self.message_received.wait(), timeout=5.0) + return self.latest_angle + except asyncio.TimeoutError: + return None + + async def zero_encoder(self, client): + """Send 'Z' command to reset encoder to zero""" + await client.write_gatt_char(CHAR_UUID, b"Z") + await asyncio.sleep(0.1) # Give firmware time to process + print(f"{Colors.MAGENTA} [INFO] Zero reset command sent to encoder{Colors.RESET}") + + def set_link_length(self): + """Allow user to configure link length""" + try: + new_length = float(input(f"Enter link length in mm (current: {self.link_length}mm): ")) + if new_length > 0: + self.link_length = new_length + print(f"{Colors.MAGENTA} [INFO] Link length set to {self.link_length}mm{Colors.RESET}") + else: + print(f"{Colors.RED} [ERROR] Link length must be positive{Colors.RESET}") + except ValueError: + print(f"{Colors.RED} [ERROR] Invalid input{Colors.RESET}") + + def calculate_height(self, angle_deg): + """Calculate vertical height from angle using trigonometry""" + # Height = link_length × sin(angle) + angle_rad = math.radians(self.starting_angle+angle_deg) + height_mm = (self.link_length * math.cos(math.radians(self.starting_angle)))-(self.link_length * math.cos(angle_rad)) + return height_mm + + async def calibrate_starting_angle(self, client): + """Calibration mode: collect 10 measurements and back-calculate starting_angle""" + print("=" * 60) + print(" STARTING ANGLE CALIBRATION MODE") + print("=" * 60) + print(f"\n{Colors.YELLOW}Instructions:{Colors.RESET}") + print("1. Position the link at a known height") + print("2. Press Enter to measure the angle") + print("3. Enter the actual height in mm") + print("4. Repeat for 10 different heights\n") + + calibration_data = [] # Store (angle, actual_height) pairs + + for i in range(10): + input(f"\n{Colors.GREEN}[{i+1}/10] Press Enter to measure...{Colors.RESET}") + + # Get angle measurement + results = [] + for _ in range(5): + val = await self.get_single_reading(client) + if val is not None: + results.append(val) + await asyncio.sleep(0.1) + + if len(results) >= 3: + # Apply inversion and unwrapping + inverted_results = [360 - r for r in results] + has_low = any(r < 10 for r in inverted_results) + has_high = any(r > 350 for r in inverted_results) + + if has_low and has_high: + unwrapped = [r if r < 180 else r - 360 for r in inverted_results] + angle = statistics.median(unwrapped) + if angle < 0: + angle += 360 + else: + angle = statistics.median(inverted_results) + + print(f" Measured angle: {Colors.CYAN}{angle:.5f}°{Colors.RESET}") + + # Get actual height from user + while True: + try: + actual_height = float(input(f" Enter actual height (mm): ")) + break + except ValueError: + print(f" {Colors.RED}Invalid input, try again{Colors.RESET}") + + calibration_data.append((angle, actual_height)) + print(f" {Colors.GREEN}✓ Point {i+1} recorded{Colors.RESET}") + else: + print(f" {Colors.RED}Failed to get reading, try again{Colors.RESET}") + return + + # Back-calculate optimal starting_angle using least-squares + print(f"\n{Colors.YELLOW}Calculating optimal starting angle...{Colors.RESET}") + + # Store original starting angle (don't modify during calibration) + original_starting_angle = self.starting_angle + + def residuals(starting_angle_guess): + """Calculate residuals (errors) for least_squares optimization""" + errors = [] + for angle_deg, actual_height in calibration_data: + # Calculate predicted height + angle_rad = math.radians(starting_angle_guess[0] + angle_deg) + predicted_height = (self.link_length * math.cos(math.radians(starting_angle_guess[0]))) - \ + (self.link_length * math.cos(angle_rad)) + error = predicted_height - actual_height + errors.append(error) + return errors + + # Optimize starting_angle using least_squares (Levenberg-Marquardt) + # This is much faster and more accurate than Nelder-Mead for this problem + result = least_squares(residuals, [original_starting_angle], method='lm') + optimal_angle = result.x[0] + + print(f"\n{Colors.BOLD}{Colors.GREEN}=" * 60) + print(" CALIBRATION RESULTS") + print("=" * 60 + Colors.RESET) + print(f"\nOld starting angle: {Colors.YELLOW}{original_starting_angle:.3f}°{Colors.RESET}") + print(f"New starting angle: {Colors.GREEN}{Colors.BOLD}{optimal_angle:.3f}°{Colors.RESET}") + + # Show prediction errors + print(f"\n{Colors.CYAN}Verification:{Colors.RESET}") + for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): + angle_rad = math.radians(optimal_angle + angle_deg) + predicted_height = (self.link_length * math.cos(math.radians(optimal_angle))) - \ + (self.link_length * math.cos(angle_rad)) + error = predicted_height - actual_height + print(f" Point {i}: Actual={actual_height:.2f}mm, Predicted={predicted_height:.2f}mm, Error={error:+.2f}mm") + + # Ask user to apply + apply = input(f"\n{Colors.YELLOW}Apply this calibration? (y/n): {Colors.RESET}").strip().lower() + if apply == 'y': + self.starting_angle = optimal_angle + print(f"{Colors.GREEN}✓ Starting angle updated to {optimal_angle:.3f}°{Colors.RESET}") + print(f"{Colors.MAGENTA}Note: This value is not saved permanently. Update it in the code if needed.{Colors.RESET}") + else: + print(f"{Colors.YELLOW}Calibration discarded{Colors.RESET}") + + async def run(self): + print(f"Scanning for {ESP_NAME}...") + self.device = await BleakScanner.find_device_by_name(ESP_NAME) + + if not self.device: + print(f"Error: Could not find device named '{ESP_NAME}'") + return + + print(f"Found {self.device.name} ({self.device.address}). Connecting...") + + # Retry mechanism for connection + max_retries = 3 + client = None + + for attempt in range(max_retries): + try: + client = BleakClient(self.device, timeout=10.0) + await client.connect() + if client.is_connected: + break + except Exception as e: + print(f"Connection attempt {attempt+1}/{max_retries} failed: {e}") + if attempt < max_retries - 1: + await asyncio.sleep(2.0) + else: + print("Failed to connect after multiple retries.") + return + + # Proceed if connected + try: + print(f"Connected: {client.is_connected}") + await client.start_notify(CHAR_UUID, self.notification_handler) + + print("\n" + "="*60) + print(f"{Colors.BOLD}{Colors.CYAN} BLOCK HEIGHT MEASUREMENT SYSTEM{Colors.RESET}") + print(f" Link Length: {Colors.YELLOW}{self.link_length}mm{Colors.RESET}") + print(" Logic: Median of 5 blocks (4096-sample filtered each)") + print("="*60) + print(f"\n{Colors.BOLD}Commands:{Colors.RESET}") + print(f" {Colors.GREEN}Enter{Colors.RESET} - Measure angle and height") + print(f" {Colors.YELLOW}Z{Colors.RESET} - Zero at ground reference") + print(f" {Colors.CYAN}D{Colors.RESET} - Toggle diagnostic display") + print(f" {Colors.MAGENTA}L{Colors.RESET} - Set link length") + print(f" {Colors.BLUE}C{Colors.RESET} - Calibrate starting angle") + print(f" {Colors.RED}Ctrl+C{Colors.RESET} - Quit\n") + + try: + while True: + user_input = input("\n>> Command [Enter/Z/D/L/C]: ").strip().upper() + + if user_input == 'Z': + await self.zero_encoder(client) + continue + elif user_input == 'D': + self.show_diagnostics = not self.show_diagnostics + status = "ON" if self.show_diagnostics else "OFF" + print(f"{Colors.MAGENTA} [INFO] Diagnostic display: {status}{Colors.RESET}") + continue + elif user_input == 'L': + self.set_link_length() + continue + elif user_input == 'C': + await self.calibrate_starting_angle(client) + continue + + # print("Sampling 5 sets of data from ESP32...", end="", flush=True) + + results = [] + for i in range(5): + val = await self.get_single_reading(client) + if val is not None: + results.append(val) + print(".", end="", flush=True) + await asyncio.sleep(0.1) # Brief gap between requests + + if len(results) >= 3: + # Apply 360° inversion first + inverted_results = [360 - r for r in results] + + # Detect angle wrap-around at 0°/360° boundary + # If we have values both near 0° and near 360°, unwrap them + has_low = any(r < 10 for r in inverted_results) + has_high = any(r > 350 for r in inverted_results) + + if has_low and has_high: + # Unwrap: convert 350-360° to negative equivalent (-10 to 0°) + unwrapped = [r if r < 180 else r - 360 for r in inverted_results] + final_median = statistics.median(unwrapped) + range_val = max(unwrapped) - min(unwrapped) + + # Convert back to positive 0-360° range if needed + if final_median < 0: + final_median += 360 + else: + # No wrap-around, use normal calculation + final_median = statistics.median(inverted_results) + range_val = max(inverted_results) - min(inverted_results) + + # Calculate vertical height from angle + height_mm = self.calculate_height(final_median) + + # Calculate physical precision for link + # angle_deg * (pi/180) * link_length + precision_microns = self.link_length * (range_val * 3.14159 / 180.0) * 1000 + + print(f"\n" + "-"*60) + print(f"{Colors.CYAN}{Colors.BOLD} ANGLE : {final_median:.5f} degrees{Colors.RESET}") + print(f"{Colors.GREEN}{Colors.BOLD} VERTICAL HEIGHT: {height_mm:.3f} mm{Colors.RESET}") + # print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") + # print(f" ALL READINGS : {[round(r, 5) for r in results]}") + + # Display diagnostic data only if enabled + if self.show_diagnostics and self.latest_diagnostics: + print(f"\n{Colors.YELLOW} DIAGNOSTIC DATA:{Colors.RESET}") + print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") + print(f" ALL READINGS : {[round(r, 5) for r in results]}") + print(f" AGC (Gain) : {self.latest_diagnostics.get('AGC', 'N/A')}") + print(f" MAG (Magn.) : {self.latest_diagnostics.get('MAG', 'N/A')}") + print(f" MAGL (High) : {self.latest_diagnostics.get('MAGL', 'N/A')}") + print(f" MAGH (Low) : {self.latest_diagnostics.get('MAGH', 'N/A')}") + print(f" COF (Ovflow) : {self.latest_diagnostics.get('COF', 'N/A')}") + + print("-"*60) + + # Check for diagnostic warnings + if self.latest_diagnostics.get('MAGL', 0) == 1: + print(f"{Colors.RED} [WARNING] Magnetic field too HIGH (AGC=0x00)!{Colors.RESET}") + print(f"{Colors.RED} Action: Move magnet further from sensor.{Colors.RESET}") + elif self.latest_diagnostics.get('MAGH', 0) == 1: + print(f"{Colors.RED} [WARNING] Magnetic field too LOW (AGC=0xFF)!{Colors.RESET}") + print(f"{Colors.RED} Action: Move magnet closer to sensor.{Colors.RESET}") + elif self.latest_diagnostics.get('COF', 0) == 1: + print(f"{Colors.RED} [WARNING] CORDIC overflow detected!{Colors.RESET}") + print(f"{Colors.RED} Action: Check sensor alignment and magnetic field.{Colors.RESET}") + elif precision_microns > 50: + print(f"{Colors.YELLOW} [WARNING] Jitter is {precision_microns:.1f}u, which exceeds 50u limit.{Colors.RESET}") + print(f"{Colors.YELLOW} Check for vibrations or move the arm slightly.{Colors.RESET}") + else: + print(f"{Colors.GREEN} Read SUCCESS{Colors.RESET}") + else: + print("\n[ERROR] Failed to collect enough samples from BLE.") + + except KeyboardInterrupt: + print("\nDisconnecting...") + finally: + if client and client.is_connected: + await client.stop_notify(CHAR_UUID) + await client.disconnect() + + except Exception as e: + print(f" [!] Unexpected Error: {e}") + +if __name__ == "__main__": + receiver = HighPrecisionReceiver() + try: + asyncio.run(receiver.run()) + except KeyboardInterrupt: + pass diff --git a/projects/block_height/block_height_receiver_polynomial.py b/projects/block_height/block_height_receiver_polynomial.py index 53b9396..49ded21 100644 --- a/projects/block_height/block_height_receiver_polynomial.py +++ b/projects/block_height/block_height_receiver_polynomial.py @@ -1,354 +1,354 @@ -""" -Author: Swaraj Dangare -""" -import asyncio -import statistics -import math -from bleak import BleakClient, BleakScanner -import numpy as np - -# BLE Configuration - -ESP_NAME = "BlockOffsetEncoder" -SERVICE_UUID = "4fafc201-1fb5-459e-8fcc-c5c9c331914b" -CHAR_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" - -# ANSI Color Codes -class Colors: - CYAN = '\033[96m' - GREEN = '\033[92m' - YELLOW = '\033[93m' - RED = '\033[91m' - MAGENTA = '\033[95m' - BLUE = '\033[94m' - BOLD = '\033[1m' - RESET = '\033[0m' - -class PolynomialHeightReceiver: - def __init__(self): - - self.latest_angle = None - self.latest_diagnostics = {} # Store AGC, MAG, MAGL, MAGH, COF - self.device = None - self.message_received = asyncio.Event() - - # Polynomial coefficients (will be set during calibration) - # Default: 3rd order polynomial [a0, a1, a2, a3] where height = a0 + a1*angle + a2*angle^2 + a3*angle^3 - # Pre-calibrated coefficients (from user's calibration): - self.poly_coeffs = np.array([-1.065580e-05, 2.174321e-03, 5.983315e-01, -3.448675e-02]) - self.poly_degree = 3 # Default to 3rd order (cubic) - - # Configuration - self.show_diagnostics = False # Toggle for diagnostic display - - def notification_handler(self, sender, data): - msg = data.decode() - try: - # New Format: "E0:66.4340,AGC:128,MAG:5432,MAGL:0,MAGH:0,COF:0" - # Parse all fields - parts = msg.split(',') - - # Extract angle from first part - if ':' in parts[0]: - _, angle_str = parts[0].split(':') - self.latest_angle = float(angle_str) - - # Extract diagnostic data - self.latest_diagnostics = {} - for part in parts[1:]: - if ':' in part: - key, value = part.split(':') - self.latest_diagnostics[key] = int(value) - - self.message_received.set() - except Exception as e: - print(f" [!] Parse Error: {e}") - - async def get_single_reading(self, client): - self.message_received.clear() - await client.write_gatt_char(CHAR_UUID, b"X") - try: - # The Ultra-Precision firmware takes ~160ms to sample 4096 times (16 blocks) - await asyncio.wait_for(self.message_received.wait(), timeout=5.0) - return self.latest_angle - except asyncio.TimeoutError: - return None - - async def zero_encoder(self, client): - """Send 'Z' command to reset encoder to zero""" - await client.write_gatt_char(CHAR_UUID, b"Z") - await asyncio.sleep(0.1) # Give firmware time to process - print(f"{Colors.MAGENTA} [INFO] Zero reset command sent to encoder{Colors.RESET}") - - def calculate_height(self, angle_deg): - """Calculate height from angle using polynomial fit""" - if self.poly_coeffs is None: - print(f"{Colors.RED} [ERROR] No calibration data! Run calibration first (press 'C'){Colors.RESET}") - return 0.0 - - # Evaluate polynomial: height = a0 + a1*x + a2*x^2 + ... - height_mm = np.polyval(self.poly_coeffs, angle_deg) - return height_mm - - async def calibrate_polynomial(self, client): - """Calibration mode: collect measurements and fit polynomial curve""" - print("=" * 60) - print(" POLYNOMIAL CURVE FITTING CALIBRATION") - print("=" * 60) - print(f"\n{Colors.YELLOW}Instructions:{Colors.RESET}") - print("1. Position the link at a known height") - print("2. Press Enter to measure the angle") - print("3. Enter the actual height in mm") - print("4. Collect at least 5 points (more is better!)") - print("5. Type 'done' when finished\n") - - # Ask for polynomial degree - while True: - try: - degree_input = input(f"Polynomial degree (1=linear, 2=quadratic, 3=cubic) [default=3]: ").strip() - if degree_input == "": - self.poly_degree = 3 - break - degree = int(degree_input) - if 1 <= degree <= 5: - self.poly_degree = degree - break - else: - print(f"{Colors.RED}Please enter a degree between 1 and 5{Colors.RESET}") - except ValueError: - print(f"{Colors.RED}Invalid input{Colors.RESET}") - - print(f"\n{Colors.CYAN}Using {self.poly_degree}-degree polynomial{Colors.RESET}\n") - - calibration_data = [] # Store (angle, actual_height) pairs - point_num = 1 - - while True: - user_input = input(f"\n{Colors.GREEN}[Point {point_num}] Press Enter to measure (or type 'done' to finish)...{Colors.RESET}").strip().lower() - - if user_input == 'done': - if len(calibration_data) < self.poly_degree + 2: - print(f"{Colors.RED}Need at least {self.poly_degree + 2} points for {self.poly_degree}-degree polynomial!{Colors.RESET}") - continue - break - - # Get angle measurement - results = [] - for _ in range(5): - val = await self.get_single_reading(client) - if val is not None: - results.append(val) - await asyncio.sleep(0.1) - - if len(results) >= 3: - # Apply inversion and unwrapping - inverted_results = [360 - r for r in results] - has_low = any(r < 10 for r in inverted_results) - has_high = any(r > 350 for r in inverted_results) - - if has_low and has_high: - unwrapped = [r if r < 180 else r - 360 for r in inverted_results] - angle = statistics.median(unwrapped) - if angle < 0: - angle += 360 - else: - angle = statistics.median(inverted_results) - - print(f" Measured angle: {Colors.CYAN}{angle:.5f}°{Colors.RESET}") - - # Get actual height from user - while True: - try: - actual_height = float(input(f" Enter actual height (mm): ")) - break - except ValueError: - print(f" {Colors.RED}Invalid input, try again{Colors.RESET}") - - calibration_data.append((angle, actual_height)) - print(f" {Colors.GREEN}✓ Point {point_num} recorded{Colors.RESET}") - point_num += 1 - else: - print(f" {Colors.RED}Failed to get reading, try again{Colors.RESET}") - - # Fit polynomial curve - print(f"\n{Colors.YELLOW}Fitting {self.poly_degree}-degree polynomial...{Colors.RESET}") - - angles = np.array([d[0] for d in calibration_data]) - heights = np.array([d[1] for d in calibration_data]) - - # Fit polynomial using numpy polyfit - self.poly_coeffs = np.polyfit(angles, heights, self.poly_degree) - - # Calculate R² (coefficient of determination) - predicted_heights = np.polyval(self.poly_coeffs, angles) - residuals = heights - predicted_heights - ss_res = np.sum(residuals**2) - ss_tot = np.sum((heights - np.mean(heights))**2) - r_squared = 1 - (ss_res / ss_tot) - rms_error = np.sqrt(np.mean(residuals**2)) - - print(f"\n{Colors.BOLD}{Colors.GREEN}=" * 60) - print(" CALIBRATION RESULTS") - print("=" * 60 + Colors.RESET) - print(f"\nPolynomial degree: {self.poly_degree}") - print(f"Number of points: {len(calibration_data)}") - print(f"R² (fit quality): {Colors.GREEN}{r_squared:.6f}{Colors.RESET} (1.0 = perfect)") - print(f"RMS Error: {rms_error:.4f} mm") - - # Show coefficients - print(f"\n{Colors.CYAN}Polynomial coefficients:{Colors.RESET}") - for i, coeff in enumerate(self.poly_coeffs): - power = self.poly_degree - i - print(f" a{power}: {coeff:.6e}") - - # Show equation - equation = "height = " - for i, coeff in enumerate(self.poly_coeffs): - power = self.poly_degree - i - if i > 0: - equation += " + " if coeff >= 0 else " - " - equation += f"{abs(coeff):.4f}" - else: - equation += f"{coeff:.4f}" - - if power > 0: - equation += f"*angle^{power}" if power > 1 else "*angle" - print(f"\n{Colors.YELLOW}{equation}{Colors.RESET}") - - # Show prediction errors - print(f"\n{Colors.CYAN}Verification:{Colors.RESET}") - print(f"{'Point':<8} {'Angle':<12} {'Actual':<10} {'Predicted':<12} {'Error':<10}") - print("-" * 60) - - for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): - predicted_height = np.polyval(self.poly_coeffs, angle_deg) - error = predicted_height - actual_height - print(f"{i:<8} {angle_deg:<12.5f} {actual_height:<10.3f} {predicted_height:<12.3f} {error:+10.3f}") - - print(f"\n{Colors.GREEN}✓ Calibration complete! Polynomial coefficients saved.{Colors.RESET}") - print(f"{Colors.MAGENTA}Note: Coefficients are stored in memory only. They will be lost on restart.{Colors.RESET}") - - async def run(self): - print(f"Scanning for {ESP_NAME}...") - self.device = await BleakScanner.find_device_by_name(ESP_NAME) - - if not self.device: - print(f"Error: Could not find device named '{ESP_NAME}'") - return - - print(f"Found {self.device.name} ({self.device.address}). Connecting...") - - # Retry mechanism for connection - max_retries = 3 - client = None - - for attempt in range(max_retries): - try: - client = BleakClient(self.device, timeout=10.0) - await client.connect() - if client.is_connected: - break - except Exception as e: - print(f"Connection attempt {attempt+1}/{max_retries} failed: {e}") - if attempt < max_retries - 1: - await asyncio.sleep(2.0) - else: - print("Failed to connect after multiple retries.") - return - - # Proceed if connected - try: - print(f"Connected: {client.is_connected}") - await client.start_notify(CHAR_UUID, self.notification_handler) - - print("\n" + "="*60) - print(f"{Colors.BOLD}{Colors.CYAN} POLYNOMIAL HEIGHT MEASUREMENT SYSTEM{Colors.RESET}") - print(" Logic: Polynomial curve fitting (angle → height)") - print("="*60) - print(f"\n{Colors.BOLD}Commands:{Colors.RESET}") - print(f" {Colors.GREEN}Enter{Colors.RESET} - Measure angle and height") - print(f" {Colors.YELLOW}Z{Colors.RESET} - Zero at ground reference") - print(f" {Colors.CYAN}D{Colors.RESET} - Toggle diagnostic display") - print(f" {Colors.BLUE}C{Colors.RESET} - Calibrate polynomial curve") - print(f" {Colors.RED}Ctrl+C{Colors.RESET} - Quit\n") - - try: - while True: - user_input = input("\n>> Command [Enter/Z/D/C]: ").strip().upper() - - if user_input == 'Z': - await self.zero_encoder(client) - continue - elif user_input == 'D': - self.show_diagnostics = not self.show_diagnostics - status = "ON" if self.show_diagnostics else "OFF" - print(f"{Colors.MAGENTA} [INFO] Diagnostic display: {status}{Colors.RESET}") - continue - elif user_input == 'C': - await self.calibrate_polynomial(client) - continue - - results = [] - for i in range(5): - val = await self.get_single_reading(client) - if val is not None: - results.append(val) - print(".", end="", flush=True) - await asyncio.sleep(0.1) - - if len(results) >= 3: - # Apply inversion and unwrapping - inverted_results = [360 - r for r in results] - has_low = any(r < 10 for r in inverted_results) - has_high = any(r > 350 for r in inverted_results) - - if has_low and has_high: - unwrapped = [r if r < 180 else r - 360 for r in inverted_results] - final_median = statistics.median(unwrapped) - range_val = max(unwrapped) - min(unwrapped) - if final_median < 0: - final_median += 360 - else: - final_median = statistics.median(inverted_results) - range_val = max(inverted_results) - min(inverted_results) - - # Calculate height using polynomial - height_mm = self.calculate_height(final_median) - - print(f"\n" + "-"*60) - print(f"{Colors.CYAN}{Colors.BOLD} ANGLE : {final_median:.5f} degrees{Colors.RESET}") - print(f"{Colors.GREEN}{Colors.BOLD} HEIGHT : {height_mm:.3f} mm{Colors.RESET}") - - # Display diagnostic data only if enabled - if self.show_diagnostics and self.latest_diagnostics: - precision_microns = 40.0 * (range_val * 3.14159 / 180.0) * 1000 - print(f"\n{Colors.YELLOW} DIAGNOSTIC DATA:{Colors.RESET}") - print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") - print(f" ALL READINGS : {[round(r, 5) for r in results]}") - print(f" AGC (Gain) : {self.latest_diagnostics.get('AGC', 'N/A')}") - print(f" MAG (Magn.) : {self.latest_diagnostics.get('MAG', 'N/A')}") - print(f" MAGL (High) : {self.latest_diagnostics.get('MAGL', 'N/A')}") - print(f" MAGH (Low) : {self.latest_diagnostics.get('MAGH', 'N/A')}") - print(f" COF (Ovflow) : {self.latest_diagnostics.get('COF', 'N/A')}") - - print("-"*60) - print(f"{Colors.GREEN} Read SUCCESS{Colors.RESET}") - else: - print("\n[ERROR] Failed to collect enough samples from BLE.") - - except KeyboardInterrupt: - print("\nDisconnecting...") - finally: - if client and client.is_connected: - await client.stop_notify(CHAR_UUID) - await client.disconnect() - - except Exception as e: - print(f" [!] Unexpected Error: {e}") - -if __name__ == "__main__": - receiver = PolynomialHeightReceiver() - try: - asyncio.run(receiver.run()) - except KeyboardInterrupt: - pass +""" +Author: Swaraj Dangare +""" +import asyncio +import statistics +import math +from bleak import BleakClient, BleakScanner +import numpy as np + +# BLE Configuration + +ESP_NAME = "BlockOffsetEncoder" +SERVICE_UUID = "4fafc201-1fb5-459e-8fcc-c5c9c331914b" +CHAR_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8" + +# ANSI Color Codes +class Colors: + CYAN = '\033[96m' + GREEN = '\033[92m' + YELLOW = '\033[93m' + RED = '\033[91m' + MAGENTA = '\033[95m' + BLUE = '\033[94m' + BOLD = '\033[1m' + RESET = '\033[0m' + +class PolynomialHeightReceiver: + def __init__(self): + + self.latest_angle = None + self.latest_diagnostics = {} # Store AGC, MAG, MAGL, MAGH, COF + self.device = None + self.message_received = asyncio.Event() + + # Polynomial coefficients (will be set during calibration) + # Default: 3rd order polynomial [a0, a1, a2, a3] where height = a0 + a1*angle + a2*angle^2 + a3*angle^3 + # Pre-calibrated coefficients (from user's calibration): + self.poly_coeffs = np.array([-1.065580e-05, 2.174321e-03, 5.983315e-01, -3.448675e-02]) + self.poly_degree = 3 # Default to 3rd order (cubic) + + # Configuration + self.show_diagnostics = False # Toggle for diagnostic display + + def notification_handler(self, sender, data): + msg = data.decode() + try: + # New Format: "E0:66.4340,AGC:128,MAG:5432,MAGL:0,MAGH:0,COF:0" + # Parse all fields + parts = msg.split(',') + + # Extract angle from first part + if ':' in parts[0]: + _, angle_str = parts[0].split(':') + self.latest_angle = float(angle_str) + + # Extract diagnostic data + self.latest_diagnostics = {} + for part in parts[1:]: + if ':' in part: + key, value = part.split(':') + self.latest_diagnostics[key] = int(value) + + self.message_received.set() + except Exception as e: + print(f" [!] Parse Error: {e}") + + async def get_single_reading(self, client): + self.message_received.clear() + await client.write_gatt_char(CHAR_UUID, b"X") + try: + # The Ultra-Precision firmware takes ~160ms to sample 4096 times (16 blocks) + await asyncio.wait_for(self.message_received.wait(), timeout=5.0) + return self.latest_angle + except asyncio.TimeoutError: + return None + + async def zero_encoder(self, client): + """Send 'Z' command to reset encoder to zero""" + await client.write_gatt_char(CHAR_UUID, b"Z") + await asyncio.sleep(0.1) # Give firmware time to process + print(f"{Colors.MAGENTA} [INFO] Zero reset command sent to encoder{Colors.RESET}") + + def calculate_height(self, angle_deg): + """Calculate height from angle using polynomial fit""" + if self.poly_coeffs is None: + print(f"{Colors.RED} [ERROR] No calibration data! Run calibration first (press 'C'){Colors.RESET}") + return 0.0 + + # Evaluate polynomial: height = a0 + a1*x + a2*x^2 + ... + height_mm = np.polyval(self.poly_coeffs, angle_deg) + return height_mm + + async def calibrate_polynomial(self, client): + """Calibration mode: collect measurements and fit polynomial curve""" + print("=" * 60) + print(" POLYNOMIAL CURVE FITTING CALIBRATION") + print("=" * 60) + print(f"\n{Colors.YELLOW}Instructions:{Colors.RESET}") + print("1. Position the link at a known height") + print("2. Press Enter to measure the angle") + print("3. Enter the actual height in mm") + print("4. Collect at least 5 points (more is better!)") + print("5. Type 'done' when finished\n") + + # Ask for polynomial degree + while True: + try: + degree_input = input(f"Polynomial degree (1=linear, 2=quadratic, 3=cubic) [default=3]: ").strip() + if degree_input == "": + self.poly_degree = 3 + break + degree = int(degree_input) + if 1 <= degree <= 5: + self.poly_degree = degree + break + else: + print(f"{Colors.RED}Please enter a degree between 1 and 5{Colors.RESET}") + except ValueError: + print(f"{Colors.RED}Invalid input{Colors.RESET}") + + print(f"\n{Colors.CYAN}Using {self.poly_degree}-degree polynomial{Colors.RESET}\n") + + calibration_data = [] # Store (angle, actual_height) pairs + point_num = 1 + + while True: + user_input = input(f"\n{Colors.GREEN}[Point {point_num}] Press Enter to measure (or type 'done' to finish)...{Colors.RESET}").strip().lower() + + if user_input == 'done': + if len(calibration_data) < self.poly_degree + 2: + print(f"{Colors.RED}Need at least {self.poly_degree + 2} points for {self.poly_degree}-degree polynomial!{Colors.RESET}") + continue + break + + # Get angle measurement + results = [] + for _ in range(5): + val = await self.get_single_reading(client) + if val is not None: + results.append(val) + await asyncio.sleep(0.1) + + if len(results) >= 3: + # Apply inversion and unwrapping + inverted_results = [360 - r for r in results] + has_low = any(r < 10 for r in inverted_results) + has_high = any(r > 350 for r in inverted_results) + + if has_low and has_high: + unwrapped = [r if r < 180 else r - 360 for r in inverted_results] + angle = statistics.median(unwrapped) + if angle < 0: + angle += 360 + else: + angle = statistics.median(inverted_results) + + print(f" Measured angle: {Colors.CYAN}{angle:.5f}°{Colors.RESET}") + + # Get actual height from user + while True: + try: + actual_height = float(input(f" Enter actual height (mm): ")) + break + except ValueError: + print(f" {Colors.RED}Invalid input, try again{Colors.RESET}") + + calibration_data.append((angle, actual_height)) + print(f" {Colors.GREEN}✓ Point {point_num} recorded{Colors.RESET}") + point_num += 1 + else: + print(f" {Colors.RED}Failed to get reading, try again{Colors.RESET}") + + # Fit polynomial curve + print(f"\n{Colors.YELLOW}Fitting {self.poly_degree}-degree polynomial...{Colors.RESET}") + + angles = np.array([d[0] for d in calibration_data]) + heights = np.array([d[1] for d in calibration_data]) + + # Fit polynomial using numpy polyfit + self.poly_coeffs = np.polyfit(angles, heights, self.poly_degree) + + # Calculate R² (coefficient of determination) + predicted_heights = np.polyval(self.poly_coeffs, angles) + residuals = heights - predicted_heights + ss_res = np.sum(residuals**2) + ss_tot = np.sum((heights - np.mean(heights))**2) + r_squared = 1 - (ss_res / ss_tot) + rms_error = np.sqrt(np.mean(residuals**2)) + + print(f"\n{Colors.BOLD}{Colors.GREEN}=" * 60) + print(" CALIBRATION RESULTS") + print("=" * 60 + Colors.RESET) + print(f"\nPolynomial degree: {self.poly_degree}") + print(f"Number of points: {len(calibration_data)}") + print(f"R² (fit quality): {Colors.GREEN}{r_squared:.6f}{Colors.RESET} (1.0 = perfect)") + print(f"RMS Error: {rms_error:.4f} mm") + + # Show coefficients + print(f"\n{Colors.CYAN}Polynomial coefficients:{Colors.RESET}") + for i, coeff in enumerate(self.poly_coeffs): + power = self.poly_degree - i + print(f" a{power}: {coeff:.6e}") + + # Show equation + equation = "height = " + for i, coeff in enumerate(self.poly_coeffs): + power = self.poly_degree - i + if i > 0: + equation += " + " if coeff >= 0 else " - " + equation += f"{abs(coeff):.4f}" + else: + equation += f"{coeff:.4f}" + + if power > 0: + equation += f"*angle^{power}" if power > 1 else "*angle" + print(f"\n{Colors.YELLOW}{equation}{Colors.RESET}") + + # Show prediction errors + print(f"\n{Colors.CYAN}Verification:{Colors.RESET}") + print(f"{'Point':<8} {'Angle':<12} {'Actual':<10} {'Predicted':<12} {'Error':<10}") + print("-" * 60) + + for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): + predicted_height = np.polyval(self.poly_coeffs, angle_deg) + error = predicted_height - actual_height + print(f"{i:<8} {angle_deg:<12.5f} {actual_height:<10.3f} {predicted_height:<12.3f} {error:+10.3f}") + + print(f"\n{Colors.GREEN}✓ Calibration complete! Polynomial coefficients saved.{Colors.RESET}") + print(f"{Colors.MAGENTA}Note: Coefficients are stored in memory only. They will be lost on restart.{Colors.RESET}") + + async def run(self): + print(f"Scanning for {ESP_NAME}...") + self.device = await BleakScanner.find_device_by_name(ESP_NAME) + + if not self.device: + print(f"Error: Could not find device named '{ESP_NAME}'") + return + + print(f"Found {self.device.name} ({self.device.address}). Connecting...") + + # Retry mechanism for connection + max_retries = 3 + client = None + + for attempt in range(max_retries): + try: + client = BleakClient(self.device, timeout=10.0) + await client.connect() + if client.is_connected: + break + except Exception as e: + print(f"Connection attempt {attempt+1}/{max_retries} failed: {e}") + if attempt < max_retries - 1: + await asyncio.sleep(2.0) + else: + print("Failed to connect after multiple retries.") + return + + # Proceed if connected + try: + print(f"Connected: {client.is_connected}") + await client.start_notify(CHAR_UUID, self.notification_handler) + + print("\n" + "="*60) + print(f"{Colors.BOLD}{Colors.CYAN} POLYNOMIAL HEIGHT MEASUREMENT SYSTEM{Colors.RESET}") + print(" Logic: Polynomial curve fitting (angle → height)") + print("="*60) + print(f"\n{Colors.BOLD}Commands:{Colors.RESET}") + print(f" {Colors.GREEN}Enter{Colors.RESET} - Measure angle and height") + print(f" {Colors.YELLOW}Z{Colors.RESET} - Zero at ground reference") + print(f" {Colors.CYAN}D{Colors.RESET} - Toggle diagnostic display") + print(f" {Colors.BLUE}C{Colors.RESET} - Calibrate polynomial curve") + print(f" {Colors.RED}Ctrl+C{Colors.RESET} - Quit\n") + + try: + while True: + user_input = input("\n>> Command [Enter/Z/D/C]: ").strip().upper() + + if user_input == 'Z': + await self.zero_encoder(client) + continue + elif user_input == 'D': + self.show_diagnostics = not self.show_diagnostics + status = "ON" if self.show_diagnostics else "OFF" + print(f"{Colors.MAGENTA} [INFO] Diagnostic display: {status}{Colors.RESET}") + continue + elif user_input == 'C': + await self.calibrate_polynomial(client) + continue + + results = [] + for i in range(5): + val = await self.get_single_reading(client) + if val is not None: + results.append(val) + print(".", end="", flush=True) + await asyncio.sleep(0.1) + + if len(results) >= 3: + # Apply inversion and unwrapping + inverted_results = [360 - r for r in results] + has_low = any(r < 10 for r in inverted_results) + has_high = any(r > 350 for r in inverted_results) + + if has_low and has_high: + unwrapped = [r if r < 180 else r - 360 for r in inverted_results] + final_median = statistics.median(unwrapped) + range_val = max(unwrapped) - min(unwrapped) + if final_median < 0: + final_median += 360 + else: + final_median = statistics.median(inverted_results) + range_val = max(inverted_results) - min(inverted_results) + + # Calculate height using polynomial + height_mm = self.calculate_height(final_median) + + print(f"\n" + "-"*60) + print(f"{Colors.CYAN}{Colors.BOLD} ANGLE : {final_median:.5f} degrees{Colors.RESET}") + print(f"{Colors.GREEN}{Colors.BOLD} HEIGHT : {height_mm:.3f} mm{Colors.RESET}") + + # Display diagnostic data only if enabled + if self.show_diagnostics and self.latest_diagnostics: + precision_microns = 40.0 * (range_val * 3.14159 / 180.0) * 1000 + print(f"\n{Colors.YELLOW} DIAGNOSTIC DATA:{Colors.RESET}") + print(f" RAW JITTER : {range_val:.5f} deg ({precision_microns:.1f} microns)") + print(f" ALL READINGS : {[round(r, 5) for r in results]}") + print(f" AGC (Gain) : {self.latest_diagnostics.get('AGC', 'N/A')}") + print(f" MAG (Magn.) : {self.latest_diagnostics.get('MAG', 'N/A')}") + print(f" MAGL (High) : {self.latest_diagnostics.get('MAGL', 'N/A')}") + print(f" MAGH (Low) : {self.latest_diagnostics.get('MAGH', 'N/A')}") + print(f" COF (Ovflow) : {self.latest_diagnostics.get('COF', 'N/A')}") + + print("-"*60) + print(f"{Colors.GREEN} Read SUCCESS{Colors.RESET}") + else: + print("\n[ERROR] Failed to collect enough samples from BLE.") + + except KeyboardInterrupt: + print("\nDisconnecting...") + finally: + if client and client.is_connected: + await client.stop_notify(CHAR_UUID) + await client.disconnect() + + except Exception as e: + print(f" [!] Unexpected Error: {e}") + +if __name__ == "__main__": + receiver = PolynomialHeightReceiver() + try: + asyncio.run(receiver.run()) + except KeyboardInterrupt: + pass diff --git a/projects/block_height/calibrate_offline.py b/projects/block_height/calibrate_offline.py index 45c9a1d..785c7f4 100644 --- a/projects/block_height/calibrate_offline.py +++ b/projects/block_height/calibrate_offline.py @@ -1,69 +1,69 @@ -#!/usr/bin/env python3 -""" -Offline calibration script to calculate optimal starting_angle from collected data -Author: Swaraj Dangare -""" - -import math -from scipy.optimize import least_squares - -# Calibration data: (angle_deg, actual_height_mm) -calibration_data = [ - (359.99749, 0.00), - (0.86023, 0.5), - (1.69302, 1.005), - (1.79689, 1.05), - (1.99437, 1.180), - (4.98561, 3.00), - (8.52139, 5.185), - (12.08255, 7.50), - (15.24499, 9.055), - (22.52680, 14.455), -] - -# System parameters -link_length = 40.0 # mm -initial_guess = 59.2 # degrees (current starting_angle) - -def residuals(starting_angle_guess): - """Calculate residuals (errors) for least_squares optimization""" - errors = [] - for angle_deg, actual_height in calibration_data: - # Calculate predicted height - angle_rad = math.radians(starting_angle_guess[0] + angle_deg) - predicted_height = (link_length * math.cos(math.radians(starting_angle_guess[0]))) - \ - (link_length * math.cos(angle_rad)) - error = predicted_height - actual_height - errors.append(error) - return errors - -# Optimize starting_angle using least_squares (Levenberg-Marquardt) -print("Calculating optimal starting angle...") -result = least_squares(residuals, [initial_guess], method='lm') -optimal_angle = result.x[0] - -print("\n" + "="*60) -print(" CALIBRATION RESULTS") -print("="*60) -print(f"\nOld starting angle: {initial_guess:.3f}°") -print(f"New starting angle: {optimal_angle:.3f}°") - -# Show prediction errors -print(f"\nVerification:") -print(f"{'Point':<8} {'Angle':<12} {'Actual':<10} {'Predicted':<12} {'Error':<10}") -print("-" * 60) - -total_squared_error = 0 -for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): - angle_rad = math.radians(optimal_angle + angle_deg) - predicted_height = (link_length * math.cos(math.radians(optimal_angle))) - \ - (link_length * math.cos(angle_rad)) - error = predicted_height - actual_height - total_squared_error += error**2 - print(f"{i:<8} {angle_deg:<12.5f} {actual_height:<10.3f} {predicted_height:<12.3f} {error:+10.3f}") - -rms_error = math.sqrt(total_squared_error / len(calibration_data)) -print("-" * 60) -print(f"RMS Error: {rms_error:.4f} mm") - -print(f"\n✓ Update self.starting_angle = {optimal_angle:.3f} in your code") +#!/usr/bin/env python3 +""" +Offline calibration script to calculate optimal starting_angle from collected data +Author: Swaraj Dangare +""" + +import math +from scipy.optimize import least_squares + +# Calibration data: (angle_deg, actual_height_mm) +calibration_data = [ + (359.99749, 0.00), + (0.86023, 0.5), + (1.69302, 1.005), + (1.79689, 1.05), + (1.99437, 1.180), + (4.98561, 3.00), + (8.52139, 5.185), + (12.08255, 7.50), + (15.24499, 9.055), + (22.52680, 14.455), +] + +# System parameters +link_length = 40.0 # mm +initial_guess = 59.2 # degrees (current starting_angle) + +def residuals(starting_angle_guess): + """Calculate residuals (errors) for least_squares optimization""" + errors = [] + for angle_deg, actual_height in calibration_data: + # Calculate predicted height + angle_rad = math.radians(starting_angle_guess[0] + angle_deg) + predicted_height = (link_length * math.cos(math.radians(starting_angle_guess[0]))) - \ + (link_length * math.cos(angle_rad)) + error = predicted_height - actual_height + errors.append(error) + return errors + +# Optimize starting_angle using least_squares (Levenberg-Marquardt) +print("Calculating optimal starting angle...") +result = least_squares(residuals, [initial_guess], method='lm') +optimal_angle = result.x[0] + +print("\n" + "="*60) +print(" CALIBRATION RESULTS") +print("="*60) +print(f"\nOld starting angle: {initial_guess:.3f}°") +print(f"New starting angle: {optimal_angle:.3f}°") + +# Show prediction errors +print(f"\nVerification:") +print(f"{'Point':<8} {'Angle':<12} {'Actual':<10} {'Predicted':<12} {'Error':<10}") +print("-" * 60) + +total_squared_error = 0 +for i, (angle_deg, actual_height) in enumerate(calibration_data, 1): + angle_rad = math.radians(optimal_angle + angle_deg) + predicted_height = (link_length * math.cos(math.radians(optimal_angle))) - \ + (link_length * math.cos(angle_rad)) + error = predicted_height - actual_height + total_squared_error += error**2 + print(f"{i:<8} {angle_deg:<12.5f} {actual_height:<10.3f} {predicted_height:<12.3f} {error:+10.3f}") + +rms_error = math.sqrt(total_squared_error / len(calibration_data)) +print("-" * 60) +print(f"RMS Error: {rms_error:.4f} mm") + +print(f"\n✓ Update self.starting_angle = {optimal_angle:.3f} in your code") diff --git a/setup.sh b/setup.sh index c03383e..372c650 100755 --- a/setup.sh +++ b/setup.sh @@ -1,43 +1,43 @@ -#!/bin/bash -# ESP_Encoder - Environment Setup Script -# Sets up a shared Python virtual environment for all projects in this repo - -set -e - -echo "=== ESP Encoder Setup ===" -echo - -# Check if Python 3 is available -if ! command -v python3 &> /dev/null; then - echo "Error: python3 is not installed" - exit 1 -fi - -PYTHON_VERSION=$(python3 --version) -echo "Found: $PYTHON_VERSION" - -# Create virtual environment -if [ -d ".venv" ]; then - echo "Removing existing .venv..." - rm -rf .venv -fi - -echo "Creating virtual environment..." -python3 -m venv .venv - -# Activate and install -echo "Installing dependencies..." -.venv/bin/pip install --upgrade pip -.venv/bin/pip install -r requirements.txt - -source .venv/bin/activate - -echo -echo "=== Setup Complete ===" -echo -echo "To activate the environment:" -echo " source .venv/bin/activate" -echo -echo "Then navigate to any project directory to run its scripts." -echo "See each project's README for usage details." -echo +#!/bin/bash +# ESP_Encoder - Environment Setup Script +# Sets up a shared Python virtual environment for all projects in this repo + +set -e + +echo "=== ESP Encoder Setup ===" +echo + +# Check if Python 3 is available +if ! command -v python3 &> /dev/null; then + echo "Error: python3 is not installed" + exit 1 +fi + +PYTHON_VERSION=$(python3 --version) +echo "Found: $PYTHON_VERSION" + +# Create virtual environment +if [ -d ".venv" ]; then + echo "Removing existing .venv..." + rm -rf .venv +fi + +echo "Creating virtual environment..." +python3 -m venv .venv + +# Activate and install +echo "Installing dependencies..." +.venv/bin/pip install --upgrade pip +.venv/bin/pip install -r requirements.txt + +source .venv/bin/activate + +echo +echo "=== Setup Complete ===" +echo +echo "To activate the environment:" +echo " source .venv/bin/activate" +echo +echo "Then navigate to any project directory to run its scripts." +echo "See each project's README for usage details." +echo