👨🔧
【Rust&RaspberryPi】LEDチカチカ
やること
- 回路作成
- 0.5秒間LEDを点灯させる
- 0.5秒間隔でLEDを点滅させる
1. 回路作成
回路図
使用したポート
|PINNo. | PIN名称 |
---|---|
22 | GPIO25 |
20 | GND |
2. 0.5秒間LEDを点灯させる
crate.ioを参考に実装。
crate設定
Cargo.toml
[dependencies]
rppal = "0.11.3"
実装
main.rs
1 use std::error::Error;
2 use std::thread;
3 use std::time::Duration;
4
5 use rppal::gpio::Gpio;
6 use rppal::system::DeviceInfo;
7
8 const GPIO_LED: u8 = 25;
9
10 fn main() -> Result<(), Box<dyn Error>> {
11 println!("Blinking an LED on a {}." , DeviceInfo::new()?.model());
12
13 let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();
14
15 pin.set_high();
16 thread::sleep(Duration::from_millis(500));
17 pin.set_low();
18
19 Ok(())
20 }
コード解説
- GPIO25を出力で設定する。
11 println!("Blinking an LED on a {}." , DeviceInfo::new()?.model());
- GPIO25をHighにする。
15 pin.set_high();
- GPIO25をLowにする。
17 pin.set_low();
3. 0.5秒間隔でLEDを点滅させる
crateの設定
Cargo.toml
[dependencies]
rppal = "0.11.3"
ctrlc = "3.1.8"
実装
main.rs
1 use std::error::Error;
2 use std::thread;
3 use std::time::Duration;
4
5 use rppal::gpio::Gpio;
6 use rppal::system::DeviceInfo;
7
8 use std::sync::atomic::{AtomicBool, Ordering};
9 use std::sync::Arc;
10
11 const GPIO_LED: u8 = 25;
12
13 fn main() -> Result<(), Box<dyn Error>> {
14 let running = Arc::new(AtomicBool::new(true));
15 let r = running.clone();
16
17 ctrlc::set_handler(move || {
18 r.store(false, Ordering::SeqCst);
19 }).expect("Error setting Ctrl-C handler");
20
21 println!("Blinking an LED Chika Chika a {}." , DeviceInfo::new()?.model());
22
23 let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();
24
25 while running.load(Ordering::SeqCst) {
26 pin.set_high();
27 thread::sleep(Duration::from_millis(500));
28 pin.set_low();
29 thread::sleep(Duration::from_millis(500));
30 }
31
32 pin.set_low();
33 Ok(())
34 }
コード解説
- Lチカ状態をCtlr+Cで終了するため、Ctlr+Cを受け付けられるように処理を追加する。
(こちらを参考にしました。細かい動作はまだ、理解できていません。)
14 let running = Arc::new(AtomicBool::new(true));
15 let r = running.clone();
16
17 ctrlc::set_handler(move || {
18 r.store(false, Ordering::SeqCst);
19 }).expect("Error setting Ctrl-C handler");
- Ctlr+Cを受け付けるまでo.5秒間隔でHigh,Lowを繰り返す。
25 while running.load(Ordering::SeqCst) {
26 pin.set_high();
27 thread::sleep(Duration::from_millis(500));
28 pin.set_low();
29 thread::sleep(Duration::from_millis(500));
30 }
- Ctlr+C後に終了するためにLowを設定。
32 pin.set_low();
感想
今回はシンプルにGPIO25を使って、Lチカを実装してみました。
crateが用意されているので、基本的な操作は簡単にできそうな印象です。
今後はGPIOを入力に設定するパターンやI2C、SPI通信など試していきたいと思います。
Discussion