//! Blinks an LED
//!
//! This assumes that a LED is connected to GPIO4.
//! Depending on your target and the board you are using you should change the pin.
//! If your board doesn't have on-board LEDs don't forget to add an appropriate resistor.
//!
use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::gpio::*;
use esp_idf_hal::peripherals::Peripherals;
use esp_idf_hal::ledc::{config::TimerConfig, LedcDriver, LedcTimerDriver, Resolution};
use esp_idf_hal::prelude::*;
fn main() -> anyhow::Result<()> {
esp_idf_sys::link_patches();
// Take Peripherals
let peripherals = Peripherals::take().unwrap();
let mut led = PinDriver::output(peripherals.pins.gpio1)?;
// Configure and Initialize LEDC Timer Driver
let timer_driver0 = LedcTimerDriver::new(
peripherals.ledc.timer0,
&TimerConfig::default()
.frequency(50.Hz())
.resolution(Resolution::Bits14),
)
.unwrap();
let timer_driver1 = LedcTimerDriver::new(
peripherals.ledc.timer1,
&TimerConfig::default()
.frequency(50.Hz())
.resolution(Resolution::Bits14),
)
.unwrap();
// Configure and Initialize LEDC Driver
let mut driver0 = LedcDriver::new(
peripherals.ledc.channel0,
timer_driver0,
peripherals.pins.gpio7,
)
.unwrap();
// Configure and Initialize LEDC Driver
let mut driver1 = LedcDriver::new(
peripherals.ledc.channel1,
timer_driver1,
peripherals.pins.gpio6,
)
.unwrap();
// Get Max Duty and Calculate Upper and Lower Limits for Servo
let max_duty = driver1.get_max_duty();
println!("Max Duty {}", max_duty);
let min_limit = max_duty * 25 / 1000;
println!("Min Limit {}", min_limit);
let max_limit = max_duty * 125 / 1000;
println!("Max Limit {}", max_limit);
// Define Starting Position
driver0
.set_duty(map(0, 0, 180, min_limit, max_limit))
.unwrap();
driver1
.set_duty(map(0, 0, 180, min_limit, max_limit))
.unwrap();
// Give servo some time to update
FreeRtos::delay_ms(500);
loop {
led.set_high()?;
// Sweep from 0 degrees to 180 degrees
for angle in 0..180 {
// Print Current Angle for visual verification
println!("Current Angle {} Degrees", angle);
// Set the desired duty cycle
driver0
.set_duty(map(angle, 0, 180, min_limit, max_limit))
.unwrap();
// Give servo some time to update
FreeRtos::delay_ms(12);
}
led.set_low()?;
// Sweep from 180 degrees to 0 degrees
for angle in (0..180).rev() {
// Print Current Angle for visual verification
println!("Current Angle {} Degrees", angle);
// Set the desired duty cycle
driver0
.set_duty(map(angle, 0, 180, min_limit, max_limit))
.unwrap();
// Give servo some time to update
FreeRtos::delay_ms(12);
}
}
}
// Function that maps one range to another
fn map(x: u32, in_min: u32, in_max: u32, out_min: u32, out_max: u32) -> u32 {
(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1