Robot: Teensy 3.6 with the old robot's servo wiring and calibration

- LEGACY/Hexapod_Teensy/: old robot sketch (reference only).
- platformio.ini: robot env targets teensy36 (owner-confirmed board).
- Config.h: per-servo SERVOS table (pin, pulse at 0 deg, signed
  us/deg, pulse limits) built from the old sketch's pins, ranges, trims
  and the old Unity servo directions. Rear-left/front-left coxa offsets
  set to 0: the owner re-horns those two servos (the old +-90 left them
  at the end of travel; the sim showed them clamping).
- ServoDriver: 18 servos on hardware PWM (50 Hz, 16-bit); the Teensy 3.6
  Servo library stops at 12.
- Radio on CE 39 / CSN 15 with SPI SCK on pin 14.
- sim: analogWrite/PWM shims, pulses decoded through SERVOS (API v6).
- Docs: CLAUDE.md, READMEs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-10-01 15:53:55 +02:00
1 parent a961fa721b
commit 5ff85c4eb8
21 files changed
+795 -80

No files matched your search

+32
View File
@@ -4,6 +4,7 @@
#include <Servo.h>
#include <Wire.h>
#include <RF24.h>
#include <SPI.h>
#include <EEPROM.h>
#include <HexapodProtocol.h>
#include <stdarg.h>
@@ -13,6 +14,7 @@
SimSerial Serial;
TwoWire Wire;
SPIClass SPI;
SimEEPROM EEPROM;
// =====================================================================
@@ -103,6 +105,36 @@ void Servo::writeMicroseconds(int us) {
g_pins[pin_].writes++;
}
// ---- Hardware PWM (how ServoDriver drives the servos on the Teensy 3.6) ----
static uint32_t g_pwm_bits = 8; // Teensyduino default
static float g_pwm_hz[simhw::MAX_PINS]; // 0 = not set (Teensy default ~488 Hz)
void pinMode(uint8_t pin, uint8_t mode) {
if (pin < simhw::MAX_PINS && mode == INPUT) g_pins[pin].attached = false;
}
void digitalWrite(uint8_t, uint8_t) {}
uint32_t analogWriteResolution(uint32_t bits) {
uint32_t old = g_pwm_bits;
g_pwm_bits = bits;
return old;
}
void analogWriteFrequency(uint8_t pin, float hz) {
if (pin < simhw::MAX_PINS) g_pwm_hz[pin] = hz;
}
// A duty of 0 means no pulses (a relaxed servo); otherwise the pulse width
// follows from duty, resolution and frequency, exactly as on the hardware.
void analogWrite(uint8_t pin, int value) {
if (pin >= simhw::MAX_PINS) return;
if (value <= 0) {
g_pins[pin].attached = false;
return;
}
float hz = g_pwm_hz[pin] > 0 ? g_pwm_hz[pin] : 488.28f;
g_pins[pin].us = (int)lroundf((float)value / (1u << g_pwm_bits) * (1e6f / hz));
g_pins[pin].attached = true;
g_pins[pin].writes++;
}
// =====================================================================
// I2C + MPU6050 (register-level, address 0x68)
// =====================================================================