👨‍🔧

【Rust&RaspberryPi】LEDチカチカ

2021/03/28に公開

やること

  1. 回路作成
  2. 0.5秒間LEDを点灯させる
  3. 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