Initial commit
commit
c34d5dfa9a
|
@ -0,0 +1,2 @@
|
|||
[registries.jojo-dev]
|
||||
index = "https://git.jojodev.com/joeyahines/_cargo-index.git"
|
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
/.idea
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,17 @@
|
|||
[package]
|
||||
name = "roll_bot"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
structopt = "0.3.26"
|
||||
config = "0.14.0"
|
||||
rppal = "0.18.0"
|
||||
raas_types = { version = "0.0.1", registry = "jojo-dev"}
|
||||
log = "0.4.21"
|
||||
env_logger = "0.11.3"
|
||||
thiserror = "1.0.61"
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
[build]
|
||||
pre-build = [
|
||||
"apt-get --assume-yes install curl unzip",
|
||||
"curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protoc-25.1-linux-x86_64.zip",
|
||||
"unzip protoc-25.1-linux-x86_64.zip -d /opt/protoc",
|
||||
]
|
||||
|
||||
[build.env]
|
||||
passthrough = ["PROTOC=/opt/protoc/bin/protoc"]
|
|
@ -0,0 +1,43 @@
|
|||
mod roll_bot;
|
||||
|
||||
use structopt::StructOpt;
|
||||
|
||||
use std::error::Error;
|
||||
use std::time::Duration;
|
||||
use log::info;
|
||||
|
||||
use crate::roll_bot::RollBot;
|
||||
use rppal::pwm::{Channel, Polarity, Pwm};
|
||||
|
||||
const PERIOD_MS: u64 = 20;
|
||||
const PULSE_MIN_US: u64 = 1000;
|
||||
const PULSE_NEUTRAL_US: u64 = 1500;
|
||||
const PULSE_MAX_US: u64 = 2000;
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
env_logger::init();
|
||||
|
||||
info!("Initializing PWM");
|
||||
let pwm = Pwm::with_period(
|
||||
Channel::Pwm0,
|
||||
Duration::from_millis(PERIOD_MS),
|
||||
Duration::from_micros(PULSE_MAX_US),
|
||||
Polarity::Normal,
|
||||
true,
|
||||
)?;
|
||||
|
||||
info!("Initializing Roll Bot");
|
||||
let roll_bot = RollBot {
|
||||
pwm,
|
||||
move_time: Duration::from_millis(1000),
|
||||
};
|
||||
|
||||
roll_bot.set_pwm_output(Duration::from_micros(PULSE_MIN_US))?;
|
||||
|
||||
loop {
|
||||
roll_bot.roll(5)?;
|
||||
std::thread::sleep(Duration::from_millis(1000));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
use crate::{PULSE_MAX_US, PULSE_MIN_US, PULSE_NEUTRAL_US};
|
||||
use log::info;
|
||||
use rppal::pwm::Pwm;
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
use thiserror::Error;
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum Error {
|
||||
#[error("PWM error")]
|
||||
PWMError(#[from] rppal::pwm::Error),
|
||||
}
|
||||
|
||||
pub struct RollBot {
|
||||
pub pwm: Pwm,
|
||||
pub move_time: Duration,
|
||||
}
|
||||
|
||||
impl RollBot {
|
||||
pub fn set_pwm_output(&self, pulse: Duration) -> Result<(), Error> {
|
||||
info!("Going to {:?}", pulse);
|
||||
self.pwm
|
||||
.set_pulse_width(pulse)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn roll(&self, tumble_times: u32) -> Result<(), Error> {
|
||||
for tumble in 1..=tumble_times {
|
||||
info!("Doing Tumble {}", tumble);
|
||||
|
||||
for step in (PULSE_MIN_US..=PULSE_MAX_US).step_by(1000) {
|
||||
self.set_pwm_output(Duration::from_micros(step))?;
|
||||
thread::sleep(self.move_time);
|
||||
}
|
||||
|
||||
for step in (PULSE_MIN_US..=PULSE_MAX_US).rev().step_by(1000) {
|
||||
self.set_pwm_output(Duration::from_micros(step))?;
|
||||
thread::sleep(self.move_time);
|
||||
}
|
||||
}
|
||||
|
||||
info!("Roll complete!");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue