1
Fork 0

thingy drives

added deadzone to gamepad controller

mended drive polarity

wait to start telem until awakened by northbridge
(linux doesn't boot in 300 cycles)
This commit is contained in:
Andy Killorin 2025-02-04 15:48:14 -05:00
parent 1c268bba12
commit 17553cf2a3
Signed by: ank
GPG key ID: 23F9463ECB67FE8C
3 changed files with 35 additions and 23 deletions

View file

@ -24,7 +24,6 @@ async fn main() -> anyhow::Result<()> {
let mut active_gamepad = None; let mut active_gamepad = None;
sleep(Duration::from_secs(5)).await; // bad
loop { loop {
while let Some(Event { id,..}) = gamepads.next_event() { while let Some(Event { id,..}) = gamepads.next_event() {
active_gamepad = Some(id); active_gamepad = Some(id);
@ -41,8 +40,14 @@ async fn main() -> anyhow::Result<()> {
let values = gamepad.state(); let values = gamepad.state();
dbg!(values); dbg!(values);
let ly= values.axis_data(ly).map(|d| d.value()).unwrap_or(0.0); let mut ly= values.axis_data(ly).map(|d| d.value()).unwrap_or(0.0);
let rx= values.axis_data(rx).map(|d| d.value()).unwrap_or(0.0); let mut rx= values.axis_data(rx).map(|d| d.value()).unwrap_or(0.0);
for axis in [&mut rx, &mut ly] {
if axis.abs() < 0.05 {
*axis = 0.0;
}
}
let cmd = Command::Twist(ly, rx); let cmd = Command::Twist(ly, rx);

View file

@ -33,26 +33,26 @@ async fn main() -> Result<()> {
write.flush().await?; write.flush().await?;
loop { loop {
//let Some(Ok(data)) = read.next().await else { let Some(Ok(data)) = read.next().await else {
// continue; continue;
//}; };
//if data.enabled { if data.enabled {
// write.send(Command::FeedWatchdog).await?; write.send(Command::FeedWatchdog).await?;
// write.flush().await?; write.flush().await?;
//} else { } else {
// println!("enabled southbridge"); println!("enabled southbridge");
// write.send(Command::Enable).await?; write.send(Command::Enable).await?;
//} }
write.send(Command::Enable).await?; write.send(Command::Enable).await?;
write.flush().await?; write.flush().await?;
//dbg!(&data); //dbg!(&data);
//if let Some(data) = data.sensor_data { if let Some(data) = data.sensor_data {
// let _ = sensor_sender.send(data); let _ = sensor_sender.send(data);
//} }
write.send(dbg!(commands.borrow().clone())).await?; write.send(dbg!(commands.borrow().clone())).await?;
write.flush().await?; write.flush().await?;

View file

@ -6,7 +6,7 @@ use core::{panic::PanicInfo, sync::atomic::Ordering};
use common::{Command, Response, SensorData, BAUDRATE}; use common::{Command, Response, SensorData, BAUDRATE};
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_rp::{bind_interrupts, block::ImageDef, gpio::{Level, Output}, peripherals::{UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver}; use embassy_rp::{bind_interrupts, block::ImageDef, gpio::{Level, Output}, peripherals::{UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver};
use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel}; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel, once_lock::OnceLock};
use embassy_time::{with_deadline, with_timeout, Duration, Instant, Timer}; use embassy_time::{with_deadline, with_timeout, Duration, Instant, Timer};
use embedded_io_async::{BufRead, Read, Write}; use embedded_io_async::{BufRead, Read, Write};
use log::{error, info, trace, warn}; use log::{error, info, trace, warn};
@ -51,8 +51,8 @@ async fn main(spawner: Spawner) {
let mut drive_conf: pwm::Config = Default::default(); let mut drive_conf: pwm::Config = Default::default();
drive_conf.divider = 150.into(); drive_conf.divider = 150.into();
drive_conf.top = 20000; // 5ms drive_conf.top = 20000; // 20ms
drive_conf.compare_b = 1000; // 1.5ms drive_conf.compare_b = 1500; // 1.5ms
drive_conf.compare_a = 1500; // 1.5ms drive_conf.compare_a = 1500; // 1.5ms
let stopped = drive_conf.clone(); let stopped = drive_conf.clone();
let mut drive_pwm = Pwm::new_output_ab(p.PWM_SLICE0, p.PIN_16, p.PIN_17, stopped.clone()); let mut drive_pwm = Pwm::new_output_ab(p.PWM_SLICE0, p.PIN_16, p.PIN_17, stopped.clone());
@ -73,8 +73,10 @@ async fn main(spawner: Spawner) {
spawner.spawn(decoder(rx)).unwrap(); spawner.spawn(decoder(rx)).unwrap();
static STARTUP: OnceLock<()> = OnceLock::new();
static ENABLED: AtomicBool = AtomicBool::new(false); static ENABLED: AtomicBool = AtomicBool::new(false);
spawner.spawn(telemetry(tx, &ENABLED)).unwrap(); spawner.spawn(telemetry(tx, &ENABLED, &STARTUP)).unwrap();
let enabled = &ENABLED; let enabled = &ENABLED;
let mut enable_watchdog = Instant::now(); let mut enable_watchdog = Instant::now();
@ -97,10 +99,12 @@ async fn main(spawner: Spawner) {
COMMANDS.receive().await COMMANDS.receive().await
}; };
STARTUP.get_or_init(||());
match command { match command {
Command::Twist(forward, right) => { Command::Twist(forward, right) => {
drive_conf.compare_a = calc_speed(forward - right); drive_conf.compare_a = calc_speed(-forward - right);
drive_conf.compare_b = calc_speed(forward + right); drive_conf.compare_b = calc_speed(forward - right);
drive_pwm.set_config(&drive_conf); drive_pwm.set_config(&drive_conf);
}, },
Command::Stop => { Command::Stop => {
@ -150,7 +154,10 @@ async fn decoder(mut rx: BufferedUartRx<'static, UART1>) {
/// Receive data from channel and send it over UART /// Receive data from channel and send it over UART
#[embassy_executor::task] #[embassy_executor::task]
async fn telemetry(mut tx: BufferedUartTx<'static, UART1>, enabled: &'static AtomicBool) { async fn telemetry(mut tx: BufferedUartTx<'static, UART1>, enabled: &'static AtomicBool, startup: &'static OnceLock<()>) {
info!("Telemetry waiting...");
startup.get().await;
info!("Telemetry started...");
loop { loop {
let data = with_timeout(Duration::from_millis(20), SENSOR_DATA.receive()).await.ok(); let data = with_timeout(Duration::from_millis(20), SENSOR_DATA.receive()).await.ok();