From 5f9e718f86bbc8db4fc8e58f5d377e4dace5bc65 Mon Sep 17 00:00:00 2001 From: Robert Schauklies Date: Thu, 15 Jan 2026 23:01:35 +0100 Subject: [PATCH] mend --- hardware/connector.FCStd | Bin 103266 -> 103139 bytes spinnyboy_rust/Cargo.lock | 135 +++++++++++++++++++++- spinnyboy_rust/Cargo.toml | 5 +- spinnyboy_rust/src/bin/dc_driver/dshot.rs | 36 +++--- spinnyboy_rust/src/bin/main.rs | 3 +- src/main.py | 60 ++++------ 6 files changed, 177 insertions(+), 62 deletions(-) diff --git a/hardware/connector.FCStd b/hardware/connector.FCStd index c6cc3c9e7b8f9383698e54d78c80c14ae0af6266..309ca54801c26847dfae993c8009b928232f7d3e 100644 GIT binary patch delta 24303 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 { - rx_channel:&'a Channel<'a,esp_hal::Blocking,esp_hal::rmt::Rx>, - tx_channel:&'a Channel<'a,esp_hal::Blocking,esp_hal::rmt::Tx>, + rx_channel: &'a mut Channel<'static, esp_hal::Blocking, esp_hal::rmt::Rx>, + tx_channel: &'a mut Channel<'static, esp_hal::Blocking, esp_hal::rmt::Tx>, speed: DShotSpeed, bit_ticks: BitTicks, } - impl<'a> DShot<'a> { pub fn new( - rx_channel:&'a Channel<'a,esp_hal::Blocking,esp_hal::rmt::Rx>, - tx_channel: &'a Channel<'a,esp_hal::Blocking,esp_hal::rmt::Tx>, + rx_channel: &'a mut Channel<'static, esp_hal::Blocking, esp_hal::rmt::Rx>, + tx_channel: &'a mut Channel<'static, esp_hal::Blocking, esp_hal::rmt::Tx>, speed: DShotSpeed, clk_speed: Option, clk_divider: Option, @@ -134,7 +133,8 @@ impl<'a> DShot<'a> { let bit_ticks = BitTicks::from_clk(clk_speed, clk_divider, speed.bit_times()); Self { - rx_channel: rx_channel,tx_channel: tx_channel, + rx_channel: rx_channel, + tx_channel: tx_channel, speed, bit_ticks, } @@ -166,14 +166,16 @@ impl<'a> DShot<'a> { self.bit_ticks.t1_h, Level::Low, self.bit_ticks.t1_l, - ).into() + ) + .into() } else { PulseCode::new( Level::High, self.bit_ticks.t0_h, Level::Low, self.bit_ticks.t0_l, - ).into() + ) + .into() }; } @@ -182,15 +184,15 @@ impl<'a> DShot<'a> { pulses } - pub fn write_throttle( - &mut self, - throttle: u16, - telemetry: bool, - ) -> Result<(), &'static str> { + pub fn write_throttle(&mut self, throttle: u16, telemetry: bool) -> Result<(), &'static str> { let pulses = self.create_pulses(throttle, telemetry); - self.channel + let tx_chann = self.tx_channel.reborrow(); + let transaction = tx_chann .transmit(&pulses) - .map_err(|_| "Failed to send frame")?; + .unwrap_or(return Err("Failed to send frame")) + .wait() + .unwrap_or(return Err("Waiting failed!")); + Ok(()) } diff --git a/spinnyboy_rust/src/bin/main.rs b/spinnyboy_rust/src/bin/main.rs index 09b3f51..5efd3fc 100644 --- a/spinnyboy_rust/src/bin/main.rs +++ b/spinnyboy_rust/src/bin/main.rs @@ -7,7 +7,7 @@ )] use core::fmt::Write; use alloc::string::ToString; -use esp_hal::uart::{self, Config, Uart}; +use esp_hal::uart::{Config, Uart}; use esp_hal::clock::CpuClock; use esp_hal::delay::Delay; @@ -171,7 +171,6 @@ fn main() -> ! { // pwm_pin.set_timestamp(1000); // Timer::after_millis(1000).await; // } - loop { rprintln!("Hello world!"); delay.delay_millis(3000); diff --git a/src/main.py b/src/main.py index 2a43e84..c96a337 100644 --- a/src/main.py +++ b/src/main.py @@ -87,6 +87,7 @@ def fafo(): bgr = f.read(3) tft._pushcolor(TFTColor(bgr[2],bgr[1],bgr[0])) time.sleep(5) + tft.fill(TFT.BLACK) def tftprinttest(): tft.fill(TFT.BLACK) v = 30 @@ -132,6 +133,7 @@ def start_view(state, rotary): #print(rotary.value()) def draw_edit_menu(state, rotary): + tft.fill(TFT.BLACK) display.print("Deposit speed:") display.print("{: >{w}} RPM".format(config["deposit_rpm"], w=5)) display.print("Coating speed:") @@ -160,7 +162,6 @@ def draw_rpm(rpm): def deposit_view(state, rotary): - # display.fill_rect(0, 0, 127, 14, 1) display.print("Deposit") draw_rpm(state["rpm"]) display.print("Press to") @@ -176,6 +177,7 @@ def coating_view(state, rotary): #def decode_ESC_telemetry(data, motor_poles=14): # if len(data) > 10: + # display.fill_rect(0, 0, 127, 14, 1) # # use latest telemetry # data = data[-10:] # @@ -190,13 +192,13 @@ def coating_view(state, rotary): # erpm = int((data[7] << 8) | data[8]) * 100 # rpm = erpm / (motor_poles / 2) # crc = data[9] -# # print(" Temp (C):", temperature) # print(" Voltage (V):", voltage) # print(" Current (A):", current) # print("Consumption (mAh):", consumption) # print(" Erpm:", erpm) # print(" RPM:", rpm) +# # print(" CRC:", crc) # print() # @@ -207,7 +209,6 @@ async def update_display(): global state global rotary while True: - display.print("LOLOLOL") state["view"](state, rotary) await uasyncio.sleep_ms(200) @@ -263,7 +264,7 @@ def timer_callback(f): def kill_me(f): state["target_rpm"] = 0 -def update_motor_pwm(): +async def update_motor_pwm(): global timer3 global current_rpm pwm = PWM(Pin(26)) @@ -279,30 +280,14 @@ def update_motor_pwm(): pwm.freq(50) timer3.init(mode=Timer.PERIODIC, period=100, callback=timer_callback) - pwm.duty_ns(1055*10**3) - time.sleep(1) - - print((current_rpm*60)/COILS) - pwm.duty_ns(1055*10**3) - - #pwm.duty_ns(1200*10**3) - #global rpm_counter - #rpm_counter= 0 - #time.sleep(10) - - # time.sleep(10) # keep low signal to arm - # # for i in range(1060,1800): - # # pwm.duty_u16(i*3) - # # time.sleep(1) - # pwm.duty_ns(1070*10**3) - # pwm.duty_u16(1700) - # time.sleep(200) pwm.duty_ns(1060*10**3) - state["target_rpm"] = 5000 - timer2.init(mode=Timer.PERIODIC, period=10000, callback=kill_me) - + time.sleep(3) + print((current_rpm*60)/COILS) + state["target_rpm"] = 4000 + coating_time = config["coating_time"]*1000 + timer2.init(mode=Timer.PERIODIC, period=coating_time, callback=kill_me) + while(True): - print(f'target RPM:{state["target_rpm"]}') rpm_pid.setpoint = state["target_rpm"] @@ -323,15 +308,14 @@ def update_motor_pwm(): if state["target_rpm"] == 0: print("Killing Coater!") throttle = 0 - rpm_pid.reset() - #pwm.duty_ns(1800*10**3) - #time.sleep(3) - #return - print(throttle) + if throttle !=0: - new_duty = 1060+(int(660*throttle)) + # print(throttle) + new_duty = 1055+(int(665*throttle)) + print(new_duty) pwm.duty_ns(new_duty*10**3) else: + print("KILLED!") new_duty = 1055 pwm.duty_ns(new_duty*10**3) timer2.deinit() @@ -392,7 +376,6 @@ def on_button_press(p): if state["view"] == edit_coating_rpm_view: state["view"] = edit_coating_time_view rotary.set( - max_val=1000, min_val=0, max_val=9999, range_mode=RotaryIRQ.RANGE_BOUNDED, @@ -521,14 +504,15 @@ tft.fill(TFT.BLACK) # splash() fafo() +tft.fill(TFT.BLACK) # for ff in fonts: # display.set_font(ff) # display.print(text) -update_motor_pwm() +#update_motor_pwm() event_loop = uasyncio.get_event_loop() -# event_loop.create_task(update_display()) - -# #event_loop.create_task(update_motor_pwm()) -# event_loop.run_forever() +event_loop.create_task(update_display()) +update_display() +#event_loop.create_task(update_motor_pwm()) +#event_loop.run_forever()