Add expression pedal calibration: cal min/cal max
- Remove fixed 0-4095 mapping, use cal_min/cal_max instead - Auto-calibrate minimum at boot (assumes pedal at heel) - 'cal min' sets current position as heel (0) - 'cal max' sets current position as toe (127) - Map cal_min->0, cal_max->127 with clamping - Update 'exp' command to show raw ADC + cal values
This commit is contained in:
@@ -9,18 +9,24 @@ ExpressionPedal::ExpressionPedal(uint8_t adc_pin)
|
||||
, midi_channel(1)
|
||||
, midi_cc(4)
|
||||
, last_read_time(0)
|
||||
, current_raw(0)
|
||||
, cal_min(0)
|
||||
, cal_max(4095)
|
||||
{
|
||||
}
|
||||
|
||||
void ExpressionPedal::begin() {
|
||||
Serial.printf("[EXP] Expression pedal on ADC1_CH4 (GPIO%d)\n", adc_pin);
|
||||
Serial.printf("[EXP] Expression pedal on ADC1_CH3 (GPIO%d)\n", adc_pin);
|
||||
analogReadResolution(12);
|
||||
pinMode(adc_pin, INPUT);
|
||||
delay(10);
|
||||
uint16_t initial = analogRead(adc_pin);
|
||||
current_value = adc_to_midi(initial);
|
||||
current_raw = analogRead(adc_pin);
|
||||
cal_min = current_raw;
|
||||
current_value = adc_to_midi(current_raw);
|
||||
last_sent_value = current_value;
|
||||
Serial.printf("[EXP] Initial ADC: %d -> MIDI: %d\n", initial, current_value);
|
||||
Serial.printf("[EXP] Calibrating... press toe then type 'cal max'\n");
|
||||
Serial.printf("[EXP] Current ADC: %d -> MIDI: %d\n", current_raw, current_value);
|
||||
Serial.printf("[EXP] cal_min=%d cal_max=%d (default)\n", cal_min, cal_max);
|
||||
}
|
||||
|
||||
void ExpressionPedal::update(UsbMidiTransport& midi) {
|
||||
@@ -28,8 +34,8 @@ void ExpressionPedal::update(UsbMidiTransport& midi) {
|
||||
if (now - last_read_time < READ_INTERVAL_MS) return;
|
||||
last_read_time = now;
|
||||
|
||||
uint16_t raw = analogRead(adc_pin);
|
||||
uint8_t new_value = adc_to_midi(raw);
|
||||
current_raw = analogRead(adc_pin);
|
||||
uint8_t new_value = adc_to_midi(current_raw);
|
||||
|
||||
if (new_value > current_value + HYSTERESIS ||
|
||||
new_value + HYSTERESIS < current_value ||
|
||||
@@ -44,7 +50,22 @@ void ExpressionPedal::update(UsbMidiTransport& midi) {
|
||||
}
|
||||
}
|
||||
|
||||
void ExpressionPedal::set_cal_min() {
|
||||
cal_min = current_raw;
|
||||
if (cal_min >= cal_max) cal_max = cal_min + 1;
|
||||
Serial.printf("[EXP] cal_min set to %d (ADC raw)\n", cal_min);
|
||||
}
|
||||
|
||||
void ExpressionPedal::set_cal_max() {
|
||||
cal_max = current_raw;
|
||||
if (cal_max <= cal_min) cal_min = cal_max - 1;
|
||||
Serial.printf("[EXP] cal_max set to %d (ADC raw)\n", cal_max);
|
||||
}
|
||||
|
||||
uint8_t ExpressionPedal::adc_to_midi(uint16_t adc_value) {
|
||||
uint32_t scaled = (uint32_t)adc_value * 127 / 4095;
|
||||
return (uint8_t)scaled;
|
||||
if (adc_value <= cal_min) return 0;
|
||||
if (adc_value >= cal_max) return 127;
|
||||
uint32_t span = cal_max - cal_min;
|
||||
uint32_t offset = adc_value - cal_min;
|
||||
return (uint8_t)(offset * 127 / span);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user