Compare commits
5 Commits
39391fb2fe
...
f44f1ca2ab
Author | SHA1 | Date |
---|---|---|
Savanni D'Gerinel | f44f1ca2ab | |
Savanni D'Gerinel | 27b07dc4a8 | |
Savanni D'Gerinel | 75e0a03ff0 | |
Savanni D'Gerinel | 5df343cdeb | |
Savanni D'Gerinel | e7a50040b2 |
|
@ -373,12 +373,12 @@ dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
"cortex-m-rt",
|
"cortex-m-rt",
|
||||||
"embedded-alloc",
|
"embedded-alloc",
|
||||||
"embedded-hal",
|
"embedded-hal 0.2.7",
|
||||||
"fixed",
|
"fixed",
|
||||||
"fugit",
|
"fugit",
|
||||||
"lights-core",
|
"lights-core",
|
||||||
"panic-halt",
|
"panic-halt 0.2.0",
|
||||||
"rp-pico",
|
"rp-pico 0.8.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -429,6 +429,12 @@ version = "0.13.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
|
checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitfield"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
|
@ -775,8 +781,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9"
|
checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bare-metal",
|
"bare-metal",
|
||||||
"bitfield",
|
"bitfield 0.13.2",
|
||||||
"embedded-hal",
|
"embedded-hal 0.2.7",
|
||||||
"volatile-register",
|
"volatile-register",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1067,6 +1073,37 @@ dependencies = [
|
||||||
"void",
|
"void",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-hal"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-hal-async"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884"
|
||||||
|
dependencies = [
|
||||||
|
"embedded-hal 1.0.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-hal-nb"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605"
|
||||||
|
dependencies = [
|
||||||
|
"embedded-hal 1.0.0",
|
||||||
|
"nb 1.1.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-io"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "emseries"
|
name = "emseries"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
@ -1973,6 +2010,26 @@ dependencies = [
|
||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "halloween-leds"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"cortex-m-rt",
|
||||||
|
"embedded-hal 1.0.0",
|
||||||
|
"embedded-io",
|
||||||
|
"panic-halt 1.0.0",
|
||||||
|
"rp-pico 0.9.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hash32"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
|
||||||
|
dependencies = [
|
||||||
|
"byteorder",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.14.5"
|
version = "0.14.5"
|
||||||
|
@ -2022,6 +2079,16 @@ dependencies = [
|
||||||
"http 0.2.12",
|
"http 0.2.12",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heapless"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
|
||||||
|
dependencies = [
|
||||||
|
"hash32",
|
||||||
|
"stable_deref_trait",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "heck"
|
name = "heck"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -3082,6 +3149,12 @@ version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812"
|
checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "panic-halt"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking"
|
name = "parking"
|
||||||
version = "2.2.1"
|
version = "2.2.1"
|
||||||
|
@ -3810,8 +3883,21 @@ dependencies = [
|
||||||
"cortex-m-rt",
|
"cortex-m-rt",
|
||||||
"fugit",
|
"fugit",
|
||||||
"rp2040-boot2",
|
"rp2040-boot2",
|
||||||
"rp2040-hal",
|
"rp2040-hal 0.9.2",
|
||||||
"usb-device",
|
"usb-device 0.2.9",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rp-pico"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b9342d3ac7011ac688300979e9b52a81f0add1d05feb02868cf94bfee0705b28"
|
||||||
|
dependencies = [
|
||||||
|
"cortex-m-rt",
|
||||||
|
"fugit",
|
||||||
|
"rp2040-boot2",
|
||||||
|
"rp2040-hal 0.10.2",
|
||||||
|
"usb-device 0.3.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3832,7 +3918,7 @@ dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
"critical-section",
|
"critical-section",
|
||||||
"embedded-dma",
|
"embedded-dma",
|
||||||
"embedded-hal",
|
"embedded-hal 0.2.7",
|
||||||
"frunk",
|
"frunk",
|
||||||
"fugit",
|
"fugit",
|
||||||
"itertools 0.10.5",
|
"itertools 0.10.5",
|
||||||
|
@ -3841,8 +3927,37 @@ dependencies = [
|
||||||
"pio",
|
"pio",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
"rp2040-hal-macros",
|
"rp2040-hal-macros",
|
||||||
"rp2040-pac",
|
"rp2040-pac 0.5.0",
|
||||||
"usb-device",
|
"usb-device 0.2.9",
|
||||||
|
"vcell",
|
||||||
|
"void",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rp2040-hal"
|
||||||
|
version = "0.10.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d11e711940087f2cdff8aeae9f4b902e2014c06a00b39a1092686b81ec973d6f"
|
||||||
|
dependencies = [
|
||||||
|
"bitfield 0.14.0",
|
||||||
|
"cortex-m",
|
||||||
|
"critical-section",
|
||||||
|
"embedded-dma",
|
||||||
|
"embedded-hal 0.2.7",
|
||||||
|
"embedded-hal 1.0.0",
|
||||||
|
"embedded-hal-async",
|
||||||
|
"embedded-hal-nb",
|
||||||
|
"embedded-io",
|
||||||
|
"frunk",
|
||||||
|
"fugit",
|
||||||
|
"itertools 0.10.5",
|
||||||
|
"nb 1.1.0",
|
||||||
|
"paste",
|
||||||
|
"pio",
|
||||||
|
"rand_core 0.6.4",
|
||||||
|
"rp2040-hal-macros",
|
||||||
|
"rp2040-pac 0.6.0",
|
||||||
|
"usb-device 0.3.2",
|
||||||
"vcell",
|
"vcell",
|
||||||
"void",
|
"void",
|
||||||
]
|
]
|
||||||
|
@ -3871,6 +3986,18 @@ dependencies = [
|
||||||
"vcell",
|
"vcell",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rp2040-pac"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "83cbcd3f7a0ca7bbe61dc4eb7e202842bee4e27b769a7bf3a4a72fa399d6e404"
|
||||||
|
dependencies = [
|
||||||
|
"cortex-m",
|
||||||
|
"cortex-m-rt",
|
||||||
|
"critical-section",
|
||||||
|
"vcell",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rsa"
|
name = "rsa"
|
||||||
version = "0.9.6"
|
version = "0.9.6"
|
||||||
|
@ -5086,6 +5213,16 @@ version = "0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508"
|
checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "usb-device"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6"
|
||||||
|
dependencies = [
|
||||||
|
"heapless",
|
||||||
|
"portable-atomic",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf-8"
|
name = "utf-8"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
|
|
|
@ -30,5 +30,5 @@ members = [
|
||||||
"sgf",
|
"sgf",
|
||||||
"timezone-testing",
|
"timezone-testing",
|
||||||
"tree",
|
"tree",
|
||||||
"visions/server", "gm-dash/server",
|
"visions/server", "gm-dash/server", "halloween-leds"
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
[build]
|
||||||
|
target = "thumbv6m-none-eabi"
|
||||||
|
|
||||||
|
[target.thumbv6m-none-eabi]
|
||||||
|
rustflags = [
|
||||||
|
"-C", "link-arg=--nmagic",
|
||||||
|
"-C", "link-arg=-Tlink.x",
|
||||||
|
"-C", "llvm-args=--inline-threshold=5",
|
||||||
|
"-C", "no-vectorize-loops",
|
||||||
|
]
|
||||||
|
|
||||||
|
runner = "elf2uf2-rs -d"
|
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "halloween-leds"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cortex-m-rt = "0.7.3"
|
||||||
|
embedded-hal = "1.0.0"
|
||||||
|
embedded-io = "0.6.1"
|
||||||
|
panic-halt = "1.0.0"
|
||||||
|
rp-pico = "0.9.0"
|
|
@ -0,0 +1,125 @@
|
||||||
|
#![no_main]
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
/// This application demonstrates using a Raspberry Pi Pico to control an individual SK9822 module.
|
||||||
|
/// Keep in mind that the Pico, though it accepts 5V for power, it runs on 3.3V logic. The GPIO
|
||||||
|
/// pins will emit only 3.3 volts, and the SK9822 needs 5V logic. So, make sure that the GPIO pins
|
||||||
|
/// run through a transistor or a logic level lhifter to go from 3.3V logic to 5V logic.
|
||||||
|
use embedded_hal::{delay::DelayNs, spi::SpiBus};
|
||||||
|
use panic_halt as _;
|
||||||
|
use rp_pico::{
|
||||||
|
entry,
|
||||||
|
hal::{
|
||||||
|
clocks::init_clocks_and_plls,
|
||||||
|
fugit::RateExtU32,
|
||||||
|
gpio::{
|
||||||
|
bank0::{Gpio10, Gpio11},
|
||||||
|
FunctionSpi, Pin, PullDown,
|
||||||
|
},
|
||||||
|
spi::Spi,
|
||||||
|
Clock, Sio, Timer, Watchdog,
|
||||||
|
},
|
||||||
|
pac, Pins,
|
||||||
|
};
|
||||||
|
|
||||||
|
const FPS: u32 = 60;
|
||||||
|
const MS_PER_FRAME: u32 = 1000 / FPS;
|
||||||
|
const XOSC_CRYSTAL_FREQ: u32 = 12_000_000; // MHz, https://forums.raspberrypi.com/viewtopic.php?t=356764
|
||||||
|
|
||||||
|
#[entry]
|
||||||
|
unsafe fn main() -> ! {
|
||||||
|
// rp_pico::pac::Peripherals is a reference to physical hardware defined on the Pico.
|
||||||
|
let mut peripherals = pac::Peripherals::take().unwrap();
|
||||||
|
|
||||||
|
// SIO inidcates "Single Cycle IO". I don't know what this means, but it could mean that this
|
||||||
|
// is a class of IO operations that can be run in a single clock cycle, such as switching a
|
||||||
|
// GPIO pin on or off.
|
||||||
|
let sio = Sio::new(peripherals.SIO);
|
||||||
|
|
||||||
|
// Many of the following systems require a watchdog. I do not know what this does, either, but
|
||||||
|
// it may be some failsafe software that will reset operations if the watchdog detects a lack
|
||||||
|
// of activity.
|
||||||
|
let mut watchdog = Watchdog::new(peripherals.WATCHDOG);
|
||||||
|
|
||||||
|
// Here we grab the GPIO pins in bank 0.
|
||||||
|
let pins = Pins::new(
|
||||||
|
peripherals.IO_BANK0,
|
||||||
|
peripherals.PADS_BANK0,
|
||||||
|
sio.gpio_bank0,
|
||||||
|
&mut peripherals.RESETS,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Initialize an abstraction of the clock system with a batch of standard hardware clocks.
|
||||||
|
let clocks = init_clocks_and_plls(
|
||||||
|
XOSC_CRYSTAL_FREQ,
|
||||||
|
peripherals.XOSC,
|
||||||
|
peripherals.CLOCKS,
|
||||||
|
peripherals.PLL_SYS,
|
||||||
|
peripherals.PLL_USB,
|
||||||
|
&mut peripherals.RESETS,
|
||||||
|
&mut watchdog,
|
||||||
|
)
|
||||||
|
.ok()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// An abstraction for a timer which we can use to delay the code.
|
||||||
|
let mut timer = Timer::new(peripherals.TIMER, &mut peripherals.RESETS, &clocks);
|
||||||
|
|
||||||
|
// Grab the clock and data pins for SPI1. For Clock pins and for Data pins, there are only two
|
||||||
|
// pins each on the Pico which can function for SPI1.
|
||||||
|
let spi_clk: Pin<Gpio10, FunctionSpi, PullDown> = pins.gpio10.into_function();
|
||||||
|
let spi_sdo: Pin<Gpio11, FunctionSpi, PullDown> = pins.gpio11.into_function();
|
||||||
|
|
||||||
|
// Now, create the SPI function abstraction for SPI1 with spi_clk and spi_sdo.
|
||||||
|
let mut spi = Spi::<_, _, _, 8>::new(peripherals.SPI1, (spi_sdo, spi_clk)).init(
|
||||||
|
&mut peripherals.RESETS,
|
||||||
|
// The SPI system uses the peripheral clock
|
||||||
|
clocks.peripheral_clock.freq(),
|
||||||
|
// Transmit data at a rate of 1Mbit.
|
||||||
|
1_u32.MHz(),
|
||||||
|
// Run with SPI Mode 1. This means that the clock line should start high and that data will
|
||||||
|
// be sampled starting at the first falling edge.
|
||||||
|
embedded_hal::spi::MODE_1,
|
||||||
|
);
|
||||||
|
|
||||||
|
// byte count: 4 for the start frame
|
||||||
|
// 1 * 4 for three lights with 4 bytes per light
|
||||||
|
// 4 for the end frame
|
||||||
|
// = 20 bytes
|
||||||
|
let mut lights: [u8; 12] = [0; 12];
|
||||||
|
// We just skip the first four bytes, because the start frame is four bytes of 0.
|
||||||
|
|
||||||
|
// Set the first byte of the one and only lamp. The first byte follows the pattern of three 1
|
||||||
|
// bits followed by five additional bits that indicate an overall brightness level of the
|
||||||
|
// pixel. The datasheet for the SK9822 doesn't specify the exact effect, but it does mean that
|
||||||
|
// the higher this number is, the brighter 255 means for an given LED in the array. 1 is the
|
||||||
|
// lowest brightness that emits light, and 31 is the highest supported brightness.
|
||||||
|
lights[4] = 0xe0 + 1;
|
||||||
|
// Set the Blue light of the dotstar to 255, assuming the dotstar frame format is RBG. Note
|
||||||
|
// that the standard SK9822 datasheed indicates that the format is BGR. Your mileage may vary.
|
||||||
|
lights[6] = 255;
|
||||||
|
|
||||||
|
// The end frame is four bytes of 255.
|
||||||
|
lights[8] = 0xff;
|
||||||
|
lights[9] = 0xff;
|
||||||
|
lights[10] = 0xff;
|
||||||
|
lights[11] = 0xff;
|
||||||
|
|
||||||
|
|
||||||
|
// The rest of this is just a stock pulsating animation which is slightly brightening and
|
||||||
|
// dimming the *blue* LED (on my set of dotstars).
|
||||||
|
let mut brightness = 1;
|
||||||
|
let mut step = 1;
|
||||||
|
loop {
|
||||||
|
if brightness == 64 && step == 1 {
|
||||||
|
step = -1;
|
||||||
|
} else if brightness == 1 && step == -1 {
|
||||||
|
step = 1;
|
||||||
|
};
|
||||||
|
lights[5] = brightness as u8;
|
||||||
|
brightness = brightness + step;
|
||||||
|
|
||||||
|
let _ = spi.write(lights.as_slice());
|
||||||
|
timer.delay_ms(MS_PER_FRAME);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue