Rust

ラズパイでRust|インストールからLチカまで

スポンサーリンク

どうも。まっきーです。

最近Rustがキテるということで、Rustを勉強し始めました。

早速ですが、ラズパイでRustを使ってみようと思います!

本記事ではRustのインストールからLチカまで行います。

一度もLチカをしたことがない!という方はPython版を一度見ておくといいです。

ラズパイでLチカをやってみよう!(Python) 

動作環境

まず動作環境から。

 $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster

必要なもの

必要なもの

  • RaspberryPi 3B+
  • LEDライト
  • ジャンパー線
  • 抵抗400~1000Ωぐらいのもの1つ
  • ブレッドボード

下記のスターターセットで全てそろえることができます。

ラズパイにRustをインストール

下記のコマンドでrustupがインストールできます。

$ curl https://sh.rustup.rs -sSf | sh

以下のような画面が表示されたら、1と入力。

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
:
:
   default host triple: armv7-unknown-linux-gnueabihf
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1

これで、Rustのインストールは完了です。

stable-armv7-unknown-linux-gnueabihf installed - rustc 1.48.0 (7eac88abb 2020-11-16)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.

To configure your current shell, run:
source $HOME/.cargo/env

下記コマンドでパスを通します。

$ export PATH="$HOME/.cargo/bin:$PATH"

rustcとcargoのバージョンを確認しましょう!

$ rustc --version
rustc 1.48.0 (7eac88abb 2020-11-16)
$ cargo --version
cargo 1.48.0 (65cbdd2dc 2020-10-14)

必要なパッケージをインストールします。

sudo apt install pkg-config
sudo apt install libssl-dev
cargo install cargo-edit

 cargo make をインストール(少し時間がかかります)

$ git clone https://github.com/sagiegurari/cargo-make.git
$ cd cargo-make
$ cargo install --force cargo-make

gitをインストールしていない方はこちらのコマンドで。

$ sudo apt-get install git

最新版のアップデートが必要なら下記のコマンドでできます。

$ rustup update

以上で準備は完了です!

始めに、Hello, world を表示させましょう。下記コマンドをそれぞれ実行していきます。

$ cargo new helloworld // バイナリパッケージを作成
     Created binary (application) `helloworld` package

実行後、helloworldディレクトリが作成されます。

helloworldディレクトリに移動します。

$ cd helloworld

下記のコマンドを実行します。

$ cargo run
   Compiling helloworld v0.1.0 (/home/pi/helloworld)
    Finished dev [unoptimized + debuginfo] target(s) in 8.08s
     Running `target/debug/helloworld`
Hello, world!

Hello, worldと表示されれば成功です!

RustでLチカ

Lチカを行うための準備をしましょう。

下記のコマンドを順に入力してください。

$ cargo new led_onoff //パッケージを作成
     Created binary (application) `led_onoff` package
$ cd led_onoff // ディレクトリを移動
$ cargo add rust_gpiozero@* // クレートを追加
    Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding rust_gpiozero v* to dependencies

今回はrust_gpiozeroというクレート(Crate rust_gpiozero)を使用します。

$ cargo add rust_gpiozero@* // クレートを追加
    Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding rust_gpiozero v* to dependencies

上記コマンド実行後、.tomlファイルにマーカーの部分が追加されます。

[package]
name = "led_onoff"
version = "0.1.0"
authors = ["pi"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rust_gpiozero = "*"

回路図

ソースコード

srcディレクトリのmain.rsを編集。

extern crate rust_gpiozero;
use rust_gpiozero::*;

fn main() {
    let mut led = LED::new(23);// GPIOはBCM(GPIO番号)で指定
    led.blink(2.0,2.0);
    // waitがないとチカチカしない 
    // blink実行途中でmainを抜けてしまうため
    led.wait();    
}

blinkは下記のような引数を取ります。

引数(点灯・消灯時間)はf32なので、浮動小数点方式です。

//  on_time:LEDがONの時間  off_time:LEDがOFFの時間
pub fn blink(&mut self, on_time: f32, off_time: f32)

メソッドの中身が知りたい方は「Crate rust_gpiozero」のドキュメントを参考にしてください。

では、実行してみましょう。

$ cargo run // 実行
   Compiling led_onoff v0.1.0 (/home/pi/led_onoff)

2秒ごとにLEDが点滅を繰り返せば成功です!

別のクレートを使用(rppal)

rppalという別のクレートを使用して、Lチカを行ってみます。

こちらの方が多くの方の支持を受けているクレートです。

rppalを追加しましょう。

// rppalクレートを追加
$ cd cargo add rppal@*
    Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding rppal v* to dependencies

先ほどのmain.rsを以下のように書き換えます。

use std::error::Error;
use std::thread;
use std::time::Duration;

use rppal::gpio::Gpio;

fn main() -> Result<(), Box<dyn Error>>{
    // ?はエラー処理
    let gpio = Gpio::new()?;
    // GPIOを出力に設定
    let mut pin = gpio.get(17)?.into_output();

    loop {
        pin.toggle();
        thread::sleep(Duration::from_secs(1));
    }

}

実行しましょう!

$ cargo run

1秒ごとに点滅をすれば成功です!

今後のラズパイではrppalを使ってスイッチ操作等を実装していこうと思います。

今回は以上です!

参考サイト

スポンサーリンク

-Rust