First end-to-end movement
This commit is contained in:
parent
f7483fe42a
commit
1498fd27ff
6 changed files with 436 additions and 92 deletions
|
|
@ -43,7 +43,7 @@ mod app {
|
|||
|
||||
use qmc5883l::{self, QMC5883L};
|
||||
|
||||
use radomctl_protocol::*;
|
||||
use radomctl_protocol::{HostMessage, *};
|
||||
|
||||
use crate::bootloader;
|
||||
use rtic_monotonics::systick::prelude::*;
|
||||
|
|
@ -57,6 +57,10 @@ mod app {
|
|||
struct Shared {
|
||||
az_angle: i32,
|
||||
az_compass: i32,
|
||||
az_target: i32,
|
||||
|
||||
el_angle: i32,
|
||||
el_target: i32,
|
||||
}
|
||||
|
||||
// Local resources go here
|
||||
|
|
@ -223,10 +227,14 @@ mod app {
|
|||
poll_i2c::spawn().ok();
|
||||
poll_spi::spawn().ok();
|
||||
move_az::spawn().ok();
|
||||
move_el::spawn().ok();
|
||||
|
||||
(
|
||||
Shared {
|
||||
az_angle: 0,
|
||||
az_target: 0,
|
||||
el_angle: 0,
|
||||
el_target: 0,
|
||||
az_compass: 0,
|
||||
},
|
||||
Local {
|
||||
|
|
@ -332,16 +340,18 @@ mod app {
|
|||
}
|
||||
}
|
||||
|
||||
#[task(local = [spi1, encoder_az, encoder_el, spi_cs2, spi_cs3], shared = [az_angle])]
|
||||
#[task(local = [spi1, encoder_az, encoder_el, spi_cs2, spi_cs3], shared = [az_angle, el_angle])]
|
||||
async fn poll_spi(mut cx: poll_spi::Context) {
|
||||
let spi1 = cx.local.spi1;
|
||||
let encoder_az = cx.local.encoder_az;
|
||||
let encoder_el = cx.local.encoder_el;
|
||||
|
||||
loop {
|
||||
/*
|
||||
let (diag, gain) = encoder_az.diag_gain(spi1).unwrap();
|
||||
defmt::info!("diag: {:08b} gain: {}", diag, gain);
|
||||
defmt::info!("magnitude: {:?}", encoder_az.magnitude(spi1).unwrap());
|
||||
|
||||
*/
|
||||
let raw_angle = encoder_az.angle(spi1).unwrap();
|
||||
let angle_deg = raw_angle as i32 * 3600 / 16384;
|
||||
|
||||
|
|
@ -349,24 +359,29 @@ mod app {
|
|||
*az_angle = angle_deg;
|
||||
});
|
||||
|
||||
defmt::info!("angle: {:?}", angle_deg);
|
||||
defmt::info!("az angle: {:?}", angle_deg);
|
||||
|
||||
let raw_angle = encoder_el.angle(spi1).unwrap();
|
||||
let angle_deg = raw_angle as i32 * 3600 / 16384;
|
||||
|
||||
cx.shared.el_angle.lock(|el_angle| {
|
||||
*el_angle = angle_deg;
|
||||
});
|
||||
|
||||
defmt::info!("el angle: {:?}", angle_deg);
|
||||
|
||||
Mono::delay(1.millis()).await;
|
||||
}
|
||||
}
|
||||
|
||||
#[task(local = [az_enable, az_dir, az_step], shared = [az_angle, az_compass])]
|
||||
#[task(local = [az_enable, az_dir, az_step], shared = [az_angle, az_target])]
|
||||
async fn move_az(mut cx: move_az::Context) {
|
||||
let az_enable = cx.local.az_enable;
|
||||
let az_dir = cx.local.az_dir;
|
||||
let az_step = cx.local.az_step;
|
||||
|
||||
let mut counter = 0;
|
||||
let mut az_target = 0;
|
||||
|
||||
loop {
|
||||
//let az_target = 1800; //cx.shared.az_compass.lock(|az_compass| *az_compass);
|
||||
|
||||
let az_target = cx.shared.az_target.lock(|az_target| *az_target);
|
||||
let az_angle = cx.shared.az_angle.lock(|az_angle| *az_angle);
|
||||
let diff = az_angle - az_target;
|
||||
|
||||
|
|
@ -385,7 +400,7 @@ mod app {
|
|||
1.millis()
|
||||
};
|
||||
|
||||
if diff.abs() > 5 {
|
||||
if diff.abs() > 50 {
|
||||
az_enable.set_low();
|
||||
if diff < 0 {
|
||||
az_dir.set_high();
|
||||
|
|
@ -401,16 +416,56 @@ mod app {
|
|||
az_enable.set_high();
|
||||
Mono::delay(delay).await;
|
||||
}
|
||||
|
||||
counter = (counter + 1) % 1000;
|
||||
if counter == 0 {
|
||||
az_target = (az_target + 450) % 3600;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[task(binds=OTG_FS, local=[usb_dev, usb_serial, usb_buffer])]
|
||||
fn usb_fs(cx: usb_fs::Context) {
|
||||
#[task(local = [el_enable, el_dir, el_step], shared = [el_angle, el_target])]
|
||||
async fn move_el(mut cx: move_el::Context) {
|
||||
let el_enable = cx.local.el_enable;
|
||||
let el_dir = cx.local.el_dir;
|
||||
let el_step = cx.local.el_step;
|
||||
|
||||
loop {
|
||||
let el_target = cx.shared.el_target.lock(|el_target| *el_target);
|
||||
let el_angle = cx.shared.el_angle.lock(|el_angle| *el_angle);
|
||||
let diff = el_angle - el_target;
|
||||
|
||||
defmt::info!(
|
||||
"angle diff/target/actual: {:?}/{:?}/{:?}",
|
||||
diff,
|
||||
el_target,
|
||||
el_angle
|
||||
);
|
||||
|
||||
let delay = if diff.abs() < 10 {
|
||||
10.millis()
|
||||
} else if diff < 100 {
|
||||
5.millis()
|
||||
} else {
|
||||
1.millis()
|
||||
};
|
||||
|
||||
if diff.abs() > 50 {
|
||||
el_enable.set_low();
|
||||
if diff < 0 {
|
||||
el_dir.set_high();
|
||||
} else {
|
||||
el_dir.set_low();
|
||||
}
|
||||
|
||||
el_step.set_low();
|
||||
Mono::delay(delay / 2).await;
|
||||
el_step.set_high();
|
||||
Mono::delay(delay / 2).await;
|
||||
} else {
|
||||
el_enable.set_high();
|
||||
Mono::delay(delay).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[task(binds=OTG_FS, local=[usb_dev, usb_serial, usb_buffer], shared=[az_target, el_target, az_angle, el_angle])]
|
||||
fn usb_fs(mut cx: usb_fs::Context) {
|
||||
let usb_dev = cx.local.usb_dev;
|
||||
let serial = cx.local.usb_serial;
|
||||
let buffer = cx.local.usb_buffer;
|
||||
|
|
@ -443,8 +498,8 @@ mod app {
|
|||
HostMessage::RequestStatus => {
|
||||
let status = StatusMessage {
|
||||
position: Position {
|
||||
az: 42.0,
|
||||
el: 23.0,
|
||||
az: cx.shared.az_angle.lock(|az| (*az / 10) as f32),
|
||||
el: cx.shared.el_angle.lock(|el| (*el / 10) as f32),
|
||||
az_endcoder: 0.0,
|
||||
el_encoder: 0.0,
|
||||
az_magnetic: 0.0,
|
||||
|
|
@ -457,6 +512,10 @@ mod app {
|
|||
to_vec_cobs::<RadomMessage, USB_BUFFER_SIZE>(&device_msg).unwrap();
|
||||
serial.write(bytes.as_slice()).unwrap();
|
||||
}
|
||||
HostMessage::SetTarget(pos) => {
|
||||
cx.shared.az_target.lock(|az| *az = (pos.az * 10.0) as i32);
|
||||
cx.shared.el_target.lock(|el| *el = (pos.el * 10.0) as i32);
|
||||
}
|
||||
HostMessage::TriggerDFUBootloader => {
|
||||
bootloader::reboot_to_bootloader();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue