今更ながらですが、wikipediaでは以下のように説明されています。
つまりまわりくどい表現を人間にとって分かりやすい(より心地よい : sweeter)表現に置き換えてくれるからと読めば良いようですから、それは説明として分かりやすいと思いました。
admin
la vie libre
ラズパイpicoを動かす環境には、
・Arduino IDE(Arduino言語)
・VScodeにPlatformIO(C言語)
gccを使うので、Arduino/M5StackのようなPlatformIOとの組み合わせでは無いですね。
https://qiita.com/n0bisuke/items/f4ff96bd74932c8def77
・Thonny(MicroPython)
が有力どころですが、以下を参考にThonny(4.1.2)、MacBook Airで動かしてみます。
https://krr910183393.wordpress.com/2021/02/15/raspberry-pi-pico-micropython-thonny-python-ide/
Thonnyのインストールは完了している前提で、
① シリアルポートを選択します
Thonnyの右下でインタプリタをインストールして、ファイルから切り離された状態で以下のように見えるはずなのでシリアルポートでラズパイpicoを選択する。シェル画面端のように接続状態になります。
Note : この時にはUSBシリアルで見えていなければならないので外部ファイルモードでは選択できません。Thonnyでは外部ファイルモードを使うのはMicroPythonのUF2ファイルを書き込むときだけです。
このように接続されています。
② サンプルコードを入力します(PICO本体搭載LEDの0.5秒毎ブリンク)
③ 緑矢印をクリックすると起動、停止させるには赤stopアイコンをクリック
ただしこの状態ではpicoにテンポラリーに保存されているだけのようなので、電源オンで自動起動させるためには次のステップが必要
④ 電源オンで自動起動させるには、『ファイル』『名前をつけて保存』でRaspberry Pi Picoにmain.pyの名前で保存すれば自動起動
ただしパソコンのUSB経由でファイルに見えている状態では、そちらが優先されます。コードの書き換え考えたら妥当な仕様ですが。
P.S. (2023/9/5)
Thonny(MicroPython)の実行環境からArduino IDEを使ってしまうと、再度Thonnyを使うときには再度MicroPythonの実行環境をインストールしないといけません。
admin
タイトル通りですが、picoをArduino IDEで使ってみました。
参考は以下のサイトですが、微妙にUIは異なるので想像力を駆使してセットアップ。
https://logikara.blog/raspi-pico-arduinoide/#mokuji_4
ポイントはボード追加とシリアルポートの設定だろうと思います。ボードはリンクの通りのURLから設定すれば良くて、シリアルポートの設定はUF2 Boardを選択します。
白ボタン押しUSBコネクタ挿入で外部ファイルと認識できれば、サンプルプログラムをシリアルで送信、送信完了すると切り離されてプログラムが自動スタートします。
Thonnyでうまく点灯しなかったLEDの動作が確認できました。
admin
今までどう使うかイマイチだったが、Rustで動かそうと思って初めて買ってみた。ピンヘッダーは付いていないから半田付けしてGroveアダプタに差し込んだところ。
動作確認はオンボードのLEDがRustでうまく点灯しないから、USBシリアル経由でメッセージを繰り返し送信するCのサンプルプログラムをビルドしてあるものを書き込んで確認。ビルドファイルがあるので、そのままPICOに書き込めば動くようになっている。
https://nkon.github.io/RasPico-Rust/
の情報から、
https://github.com/raspberrypi/pico-examples
のhello_usbからuf2ファイルをダウンロードしています。
こんな感じでメッセージを繰り返し送信します。
P.S. (2023/8/29)
Rustでうまく点灯できないのは、LEDのポートがbaisc PicoからPico Wで変わっているからでした。
admin
タイトル通りですが、認証方法の変更方法のメールと共に久々立ち上げたら、更新が入っていて更新後は、
とnative supportにようやくなりました。
AutoDeskからのリリースは、
になります。速度は体感変わりないけど、ベンチマークしたら高速化されてるんだろうと思って以下を見ると、
性能は3割改善していて、電池寿命にも貢献があると。いつもACアダプタ使用だから電池寿命は取り敢えず参考ぐらい。
admin
Rustのオンラインブック、
https://doc.rust-jp.rs/book-ja/title-page.html
を読み始めて、第5章までの分です。自分の他言語経験から見てユニークと思えるところを、並びは時系列です。特にC/C++などで起こるメモリ管理上のバグの作り込みを防ぐためのメモリ管理機能(所有権)がいちばん特徴的だろうと思う。
・crate : クレートはRustソースコードを集めたものである、バイナリ形式でもそういうけども
・Cargo.toml : Tom’s Obvious, Minimal Language、パッケージのリストと版数を指定するテキストファイル
・Cargo : Rustのビルドシステム兼パッケージマネージャ
cargo checkでコンパイルエラーがチェックできる
・println! : !はマクロの意味、簡易に結果出力で使用で構造体ではコンパイルエラー、回避方法(20行ぐらい下)はありますが
・関連関数
String::new() :newは関連関数で、Stringインスタンス作成する
・参照変数のmutable化
io::stdin().read_line(&mut guess) : &mutは参照変数をミュータブルにする、記法はmut &guessではない
・Cargo.lockファイル : ビルドの再現性確保のためにクレートのバージョンを保存しておく、自動生成されユーザがいじるファイルでは無い
・traitはデータ型を分類する仕組み、crateの要素(任意の型となりうるSelfに対して定義されたメソッドの集合のこと)、類型的にはJavaのinterfaceのようなもの
・Shadowing : 前の値を新しい値で覆い隠す(shadowする)ことが許されている、型は違っていても同じでも良い
・タプルの要素は型が違っても大丈夫
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0; // タプル要素へのダイレクトアクセス
・Rustの配列は固定長、ベクター型は可変長
let a: [i32: 5] = [1, 2, 3, 4, 5];
・戻り値の指定方法は;をつけてはいけない、-> は戻り値の型を指定
fn five() -> i32 {
5 // it’s formula not statement
} // return value
・条件式を右辺に記述できる
let number = if condition { 5 } else { 6 }; // possible if both type is same
・所有権:これはRustのコア機能(メモリ管理がRustの一大機能)、本質はヒープ領域の管理になりますが
・println!に指示する: 直接エンドユーザ向けの出力で、構造体はこれではダメで
#[derive(Debug)]行を追加必要
・メソッド記法は構造体の文脈で定義(impl Rectangle)される、Golangの構造体との関連付けに書式は違うが似てると思う
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 { // implしてるから&self、構造体インスタンスへの参照
self.width * self.height
}
}
・関連関数:implブロック内で定義される、selfを引数に取らない関数。構造体と関連づけられていないからメソッドではない、String::new()はその例。よくある使い方は構造体のインスタンスを返却する関数。
admin
本命だろうと思う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
以下のサイトを参考にx86のLinux環境でのクロスはできた。
https://betterprogramming.pub/cross-compiling-rust-from-mac-to-linux-7fad5a454ab1
結構普通のやり方だと思うけど、brewでターゲット用のlinkerをインストールしているのが大事なところでしょう。ラズパイ用がbuild出来ないのもおそらくlinkerをインストールしていないからでしょう
% brew install SergioBenitez/osxct/x86_64-unknown-linux-gn
.cargo/config.toml を作成編集
and adding the linker for the target:
[target.x86_64-unknown-linux-gnu]
linker = "x86_64-unknown-linux-gnu-gcc"
% TARGET_CC=x86_64-unknown-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu
Compiling rust v0.1.0 (/Users/xxxxx/rust)
error[E0463]: can't find crate for `std`
=> 見覚えのあるエラーがやはりでる。
% rustup target add x86_64-unknown-linux-gnu
でライブラリインストールして解決。
% TARGET_CC=x86_64-unknown-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu
Compiling rust v0.1.0 (/Users/usamiryuuichi/rust)
Finished release [optimized] target(s) in 1.60s
.cargo/config.tomlはディレクトリの親含めて検索するようですが、今回はプロジェクトのルートに作成。
クロスコンパイルなのでコンパイル時間はネーティブよりかかるのはGolangと同じです。Docker使ってもできるはず、というかラズパイ用のlinkerは同サイトには見えないのでDocker使うのが一番素直な感じがします。Golangでネーティブのgccを使わない限りにおいてはDockerは必要ないので、この点ではGolangのほうが使いやすさはあります。
動作はIntel MacのVMware上のUbuntuで確認しました。
admin