本命だろうと思うDockerでやってみる。以前に、
https://isehara-3lv.sakura.ne.jp/blog/2023/04/22/dockerでgolangのbuild環境を作る/
で作成しているDockerのコンテナ起動して、コンソールからRustインストールすると当たり前にコンパイルできる。crossを使わなくてcargoで普通に管理できるからやはりこれが本命。
ペリフェラルを使うためのライブラリは、
https://github.com/golemparts/rppal
を使うのが一般的のようなのでこれを使ってみます。基本のLチカというサンプルがあったので、GPIOを使ったサンプルプログラムをビルドしてみました。
https://misoji-engineer.com/archives/rust-led.html
このソースのままでmain.rsにコピーしてcargo buildでコンパイルが完了しました。
コンパイル前には、Cargo.tomlの[dependencies]にrppalの追加が必要です。Rustは必要なライブラリをソースコードとは別に定義ファイルで管理するようになっています。
# cat Cargo.toml
[package]
name = "led_blink"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rppal = "0.14.0"
初回はrppalのコンパイルも入るので多少時間はかかりますが、次回からは短縮されるはずです。
# cargo build
Updating crates.io index
Downloaded rppal v0.14.1
Downloaded libc v0.2.147
Downloaded 2 crates (766.8 KB) in 0.86s
Compiling libc v0.2.147
Compiling rppal v0.14.1
Compiling led_blink v0.1.0 (/root/rust/led_blink)
Finished dev [unoptimized + debuginfo] target(s) in 21.72s
P.S. (2023/8/5)
ラズパイzeroに転送して実行させると、
$ ./led_blink
Illegal instruction
と言われた、ラズパイzero上にRustをインストールしてビルドさせるとおよそ2分でビルド出来たから、実機ビルドでも取り敢えず許容範囲。
<実行させたコード:0.1秒ごとにハイ・ローを切り替え>
extern crate rppal;
use std::error::Error;
use std::thread;
use std::time::Duration;
use rppal::gpio::Gpio;
const GPIO_LED1: u8 = 17;
const GPIO_LED2: u8 = 27;
fn main() -> Result<(), Box> {
let mut led1 = Gpio::new()?.get(GPIO_LED1)?.into_output();
let mut led2 = Gpio::new()?.get(GPIO_LED2)?.into_output();
// Blink the LED by setting the pin's logic level high for 1000 ms.
loop{
led2.set_high();
led1.set_high();
thread::sleep(Duration::from_millis(100));
led1.set_low();
led2.set_low();
thread::sleep(Duration::from_millis(100));
}
}
確認はピンの信号波形をオシロで観察、
admin