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:
1 parent
a961fa721b
commit
5ff85c4eb8
21 files changed
+795
-80
No files matched your search
@@ -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)
|
||||
// =====================================================================
|
||||
|
||||
Reference in new issue
Block a user