A portable, no_std Amplitude Shift Keying (ASK/OOK) modem driver for 433 MHz RF transceivers.
This crate implements a full software modem compatible with cheap 433 MHz ASK/OOK transceivers (like FS1000A and XY-MK-5V), designed for use on both AVR (e.g. Arduino Uno) and ARM Cortex-M microcontrollers.
- 🛠 Built with [
embedded-hal
] traits for maximum portability - 📡 Software-based ASK modem with transmit & receive support
- 🧠 Demodulation via a software phase-locked loop (PLL)
- 🧾 RadioHead-compatible 4b6b symbol encoding
- 📦 Message framing with headers, preamble, and CRC validation
- 💤 Sleep, idle, transmit, receive, and CAD modes via
AskMode
- 💥 Interrupt-safe using
critical-section
- 🔒
no_std
and embedded-friendly
Each AskDriver
instance manages the RF link using a timer-driven tick()
interface. The driver samples the RX pin and modulates the TX pin at a fixed interval (usually every 62.5 µs for 2 kbps). All state — including framing, CRC, and symbol decoding — is handled in software.
use ask433::driver::AskDriver;
use embedded_hal::blocking::delay::DelayUs;
use heapless::Vec;
let mut driver = AskDriver::new(tx, rx, None, 8, None, None); // 8 ticks per bit (2kbps)
let mut delay = ...; // Your DelayUs provider
let msg = Vec::from_slice("Hello, World!".as_bytes()).unwrap();
driver.send(msg);
loop {
driver.tick();
delay.delay_us(63).ok();
if driver.available() {
if let Some(payload) = driver.receive() {
// Handle message payload
}
}
}
Platform | Status | Notes |
---|---|---|
Arduino Uno (AVR) | ✅ | Tested with arduino-hal |
STM32, nRF, etc. | ✅ | Works with HALs supporting DelayUs or CountDown |
RTIC | ✅ | Compatible via tick() ISR |
You can use either:
• delay-loop
: a blocking loop to call tick()
• timer-isr
: an interrupt handler that calls tick()
See src/timer.rs
for examples.
ASK_MAX_PAYLOAD_LEN
: 67 bytes total (RadioHead compatible)ASK_HEADER_LEN
: 4 bytes (to, from, id, flags)ASK_PREAMBLE_LEN
: 8 bytes (0x55 training pattern)ASK_MAX_MESSAGE_LEN
: 60 bytes usable application dataASK_MAX_BUF_LEN
: Total transmission buffer (preamble + encoded)
- Fully interrupt-safe using
critical-section
- No heap allocation or dynamic dispatch
- Efficient symbol encoding using lookup tables
- Overflow-safe
millis()
-based timers for duration tracking
Licensed under either of: • MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT) • Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
Pull requests and issue reports are welcome! This project is in early development and feedback is appreciated — especially around portability, signal reliability, and architecture improvements.
• Inspired by RadioHead and VirtualWire
• Uses 4b6b
encoding patterns compatible with FS1000A-style radios
• Built with <3 for embedded systems and open hardware