chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

お越しいただきありがとうございます。

このブログでは主に以下の内容を記載しています(自分の記録用)。

  • 何か作った話(自分は何かを作るために生きている..できたらクスっと笑えるものや、アートと絡みたい)(何かに手を出しても続かず、飽きるのが問題)
  • 音楽(AerophoneやDTM(FL-Studio))を勉強しようと思ったが、音楽はレッスンが続けられないので、、絵に転向しようとしたが、DTMに戻った(が、悶々とするだけで何も作っていない)
  • 趣味のロードバイク(坂道をひーこら走ると結構大変な人生(笑)と重なる。。その後、定年・再雇用で仕事のストレスが軽いのでほとんど走っていない。。いかん)

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。
とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。へこんでも創造の力で進みたい
■2023年修正
当初は「あほ道」を進む予定だったが、「あほ道」は情熱と強い信念がないと進めない。自分は歳と共に情熱が落ちてきた。残りの人生は「ワクワク」や「面白い」ものを追いかけたい。ワクワク+面白体験に人生残りの時間とお金をかける*1
定年再雇用後はこれまでの仕事を少し減らして、プログラミング学習の支援活動を行う予定(愛想悪くて生徒様からチェンジ要望が出されるかもしれないが)
■2024年目標再設定
これまで仕事とか趣味はデジタル分野であった。アナログ回路とか電磁気は全く分かっていない。残りの人生は、微積電磁気学、ベクトル解析?を学んで、音、音楽、波形、FFT、アナログ回路、フィルタ回路、アンプ設計等、アナログ方面の理解と作成に取り組みたい。それに、、(来るか来ないか分からいけど)量子コンピューティングは量子の挙動を行列で表現して演算するらしいし。。ちょうどいい。

*1:ちなみに7月で定年・再雇用

memo: SAS

台湾パインを買ってきたので食べる→糖度は13.8%

背景:ヨメサンが台湾パインを買ってきた
課題:フルーツを食べる時に家族の中で甘いかすっぱいで言い争いになる。今回は糖度計で糖度を測った
結論:糖度は13.8度であった。はたして、13.8度ってフルーツの中では甘い方なのかどうなのか?
詳細:

普段は買わないのだけど、なぜかヨメサンが台湾パインを買ってきた。

切り方も書かれているのでそれに倣って切ってみた。パイナップルは見た目ゴツイけど切るのに苦労はしませんでした

葉っぱも付けて盛り付け

食べたところ、繊維質が歯ごたえになって食べ応えがあります。自分は酸っぱいフルーツがかなり苦手で、例えば、甘いと高い評価されているイチゴのあまおうも酸っぱくてあまり安心し食べられない(口に入れると酸っぱーとなるので)。今回買った台湾パインも甘いという評判だけど、切った場所によって甘さが違うようであった。酸っぱいところは酸っぱい。自分は酸っぱいフルーツが苦手で、家族からは甘いものしか食べられない人とバカにされているのだが、甘いか酸っぱいかを定量的に判断すべきということで、糖度計で測ってみた。

結果、糖度は13.8度であった。スーパーのPOP等では、糖度14度ってどう表現されているのだろうか。まぁ甘いけど、甘くておいしいなーという程には味わえないのであった(フルーツとしては甘い方なんでしょうけど)

■追記
すこし検索してみると、フルーツの糖度として13度以上は甘さが強いようでした。なお、感じる甘さには酸味も関係するらしく、パイナップルの場合、酸っぱさと甘さのバランスで味が決まるということかもしれません。

■追記
なんで、パインでアップルなのか?子供のころから不思議でした。パイナップルになった語源は以下らしいです
「パイナップルの名前の由来は、外見が松ぼっくり(pine)に似ていて、味がりんご(apple)に似ているところから」
パイナップルのクラウン挿しにチャレンジしませんか? まるごと1本が超お得! 食べて、育てて、2度楽しめます♪ | 師岡青果株式会社

改めて組み込み用Rustを入れる

課題:ずっと放置していた空気質観測プログラムに気圧計測を加えたい。久しぶりにRustでビルドするとエラーになった
対策:ビルド環境を作り直す(std用)*1
参考資料:Introduction - The Rust on ESP Book
結論:評価ボード(ESP32-C3-Devkit-RUST-1)を使ったLチカまでは確認できた(環境構築と動作確認に半日かかってしまった)
詳細:

途中ちょっと記録が曖昧になったがおおよそ以下
(1)rustupを入れる

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

rustup.rs - The Rust toolchain installer
(2)toolchainを入れる

rustup toolchain install nightly --component rust-src

RISC-V targets only - The Rust on ESP Book
(3)その他ツール類を入れる(自分の環境にはすでに入ってるのでスキップ)*2

cargo install ldproxy

std Development Requirements - The Rust on ESP Book
ldproxy以外にも種々ツールが必要(スキップ)

sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

(4)cargo-generateを入れる

cargo install cargo-generate

Generating Projects from Templates - The Rust on ESP Book
(5)cargo-generateを使ってtemplate(esp-idf-template)をベースにしたプロジェクトを作成

cargo generate esp-rs/esp-idf-template cargo

(6)ビルドしてみる

cargo build

hello worldをprintするだけのソースだが、ビルドは通った。

調子にのってcago runしたら怒られた(WSLなのでUSBが透過に設定していないのでエラーになるのは想定していたが、、epsflashが無いと)

cargo run
   Compiling esp-idf-hal v0.43.1
   Compiling esp-idf-svc v0.48.1
   Compiling template-test-20240420 v0.1.0 (/mnt/c/cygwin64/home/sumi/lang/rust/esp32-c3/template-test-20240420)
    Finished `dev` profile [optimized + debuginfo] target(s) in 5m 28s
     Running `espflash flash --monitor target/riscv32imc-esp-espidf/debug/template-test-20240420`
error: could not execute process `espflash flash --monitor target/riscv32imc-esp-espidf/debug/template-test-20240420` (never executed)

Caused by:
  No such file or directory (os error 2)

cargo配下で動くespflashを入れる*3

cargo install cargo-espflash

espflash - The Rust on ESP Book

cargo runではespflashが正しく起動できないので手で起動してみた

$ cargo espflash flash
Error: espflash::no_serial

  × No serial ports could be detected
  help: Make sure you have connected a device to the host system. If the device is connected but not listed, try
        using the `--list-all-ports` flag.

USBを透過させていないのと、port指定もしていないのでエラーになった。残る作業としては、評価ボードを接続して、USBを透過させて、/dev/ttyXXXと指定したらflash焼けるのではと期待

WSLからUSBが見えるようにWindows側で作業、エラーになる

$  usbipd wsl attach --busid 2-6
usbipd: error: WSL 'usbip' client not correctly installed. See https://github.com/dorssel/usbipd-win/wiki/WSL-support for the latest instructions.

ちょっと検索すると、以下の記述あり

Ubuntu 側で sudo update-alternatives --install を実行してください。

https://another.maple4ever.net/archives/3221/

attachでエラーになったのはusbipdのバージョンが古いせいであった。最新版に上げてテストすると正常にattachできた。

$ usbipd --version
4.1.0+52.Branch.master.Sha.b0b7589d2dc4481b1af481787d6d773f46d0758a
$ usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-2    046d:c058  USB 入力デバイス                                              Not shared
2-5    1199:90b1  Sierra Wireless EM7431 Qualcomm® Snapdragon™ X16 LTE-A, S...  Not shared
2-6    303a:1001  USB シリアル デバイス (COM17), USB JTAG/serial debug unit     Shared

Persisted:
GUID                                  DEVICE
530a5594-cb46-448b-890b-xxxx  Silicon Labs CP210x USB to UART Bridge (COM15)
6b9e6ec4-1707-401f-8d5d-xxxx  USB シリアル デバイス (COM18), USB JTAG/serial debug unit

$ usbipd attach --wsl --busid=2-6
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.17.96.1 to reach the host.

特にデバイス名等指定せずに、cargo-espflashを実行してみるー>/dev/ttyACM0を見つけて接続して正常に焼けた

$ cargo espflash flash
[2024-04-20T10:15:34Z INFO ] Serial port: '/dev/ttyACM0'
[2024-04-20T10:15:34Z INFO ] Connecting...
[2024-04-20T10:15:34Z INFO ] Using flash stub
    Finished `dev` profile [optimized + debuginfo] target(s) in 5.58s
Chip type:         esp32c3 (revision v0.4)
Crystal frequency: 40 MHz
Flash size:        4MB
Features:          WiFi, BLE
MAC address:       34:85:18:00:b3:ac
App/part. size:    497,104/4,128,768 bytes, 12.04%
[00:00:00] [========================================]      13/13      0x0
[00:00:00] [========================================]       1/1       0x8000
[00:00:05] [========================================]     245/245     0x10000
[2024-04-20T10:15:47Z INFO ] Flashing has completed!

cargo-espflashはmonitor機能があり、デバッグ出力を表示させることができる。何も表示されないのは起動時に一回しかlog出力していないためと思われる。

$ cargo espflash monitor
[2024-04-20T10:19:04Z INFO ] Serial port: '/dev/ttyACM0'
[2024-04-20T10:19:04Z INFO ] Connecting...
[2024-04-20T10:19:05Z INFO ] Using flash stub
Commands:
    CTRL+R    Reset chip
    CTRL+C    Exit

サンプルソースに手を加えてLチカとログ出力まではできたので今後の再確認用にソース貼り付け
file: Cargo.toml

[package]
name = "template-test-20240420"
version = "0.1.0"
authors = [foobarbazfred]
edition = "2021"
resolver = "2"
rust-version = "1.71"

[profile.release]
opt-level = "s"

[profile.dev]
debug = true    # Symbols are nice and they don't increase the size on Flash
opt-level = "z"

[features]
default = ["std", "embassy", "esp-idf-svc/native"]

pio = ["esp-idf-svc/pio"]
std = ["alloc", "esp-idf-svc/binstart", "esp-idf-svc/std"]
alloc = ["esp-idf-svc/alloc"]
nightly = ["esp-idf-svc/nightly"]
experimental = ["esp-idf-svc/experimental"]
embassy = ["esp-idf-svc/embassy-sync", "esp-idf-svc/critical-section", "esp-idf-svc/embassy-time-driver"]

[dependencies]
log = { version = "0.4", default-features = false }
esp-idf-svc = { version = "0.48", default-features = false }
anyhow = "1.0.79"

[build-dependencies]
embuild = "0.31.3"

file: src/main.rs

use anyhow::Result;
use std::{thread::sleep, time::Duration};
use esp_idf_svc::hal::gpio::PinDriver;
use esp_idf_svc::hal::peripherals::Peripherals;

fn main() -> Result<()> {

    esp_idf_svc::sys::link_patches();
    esp_idf_svc::log::EspLogger::initialize_default();
    let peripherals = Peripherals::take().unwrap();
    let mut led = PinDriver::output(peripherals.pins.gpio7)?;

    loop{
        log::info!("Hello, world!");
        led.set_high()?;
        sleep(Duration::from_secs(2));
        led.set_low()?;
        sleep(Duration::from_secs(2));
    }
}

espflashのモニタ機能でデバッグ出力を表示

$ cargo espflash monitor
//     Ctrl+Rで一度リセットをかける
I (371) template_test_20240420: Hello, world!
I (4381) template_test_20240420: Hello, world!
I (8381) template_test_20240420: Hello, world!
I (12381) template_test_20240420: Hello, world!
I (16381) template_test_20240420: Hello, world!
I (20381) template_test_20240420: Hello, world!
I (24381) template_test_20240420: Hello, world!

■補足

error: linker `ldproxy` not found
  |
  = note: No such file or directory (os error 2)

error: could not compile `template-test-20240420` (bin "template-test-20240420") due to 1 previous error

あるはずと思って入れなかったldproxyが無いと怒られた。
インストール後、場所を確認、.cargoの下に置かれていた(ディレクトリごと消したので無くなっていた)

$ whereis ldproxy
ldproxy: /home/<uid>/.cargo/bin/ldproxy

WSL(Ubuntu)側で確認すると下記の通り、/dev/ttyACM0が利用可能になっている

$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Apr 20 19:10 /dev/ttyACM0

■補足
前回Docker環境で作ったはずなのだが、どこに作ったのか失念(ブログを読み返すと書いてるだろうけど、、そこまでやる気力がない)。Dockerってイマイチ使いこなせてなくて、ベストプラクティスがよく分からん(原因は勉強不足なのだが (コンテナ用にビルドした結果から新しいコンテナ用イメージを作って新イメージを使うべきなのか、イメージを作らなくても毎回dockefileでビルドからやったらいいのか。。))

■参考URL
std - Rust

*1:これまでに何回ビルド環境を構築したことだろうか・・・

*2:スキップしたらビルド時にエラーになったのでインストールした

*3:espflashってflash writeのようなものと理解していますが、espflashをビルドするのに489パッケージ必要とは・・大げさすぎないか?

RPiにMathematicaを入れてみる

取り組み:RPiにMathematicaを入れてみる
結論:パッケージインストールで何の問題もなくインストールできた
詳細:
微積をやりなおそうとしていて、証明を追いかけるだけでなく、グラフとか微積が本当にそうなるのかをプログラムでも確認できたら理解も深まるかと思った。Pythonで検算するのもいいけど、餅は餅屋ということで、、Mathematica等の専用言語の方がいろいろ便利ではと思えた。が、、Mathematicaは趣味で使うとしても、年度支払いで結構高い。一方、RaspberryBi版だと無料らしい。そこで、RPiにMathematicaを入れてみる
ドキュメントに従って試行錯誤してみる

sudo apt-get update
sudo apt-get install wolfram-engine

上記のインストール作業でエラーもなく一発で入った。MathematicaGUI/CLIが使えるらしいのだが、試しに動かしてみると問題なくグラフも描画できた。ずっと使えそうなので、試用期間に縛られずゆっくり勉強できる。


ちなみに、、今動いているOSは、Debian GNU/Linux 11 (bullseye)

$ cat /etc/*rel*
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

すこし知恵がついてきて、、複数関数の描画

Plot[{Sin[x], Cos[x]}, {x, -Pi, Pi}]


文法を知る必要があるという前提はあるけど、こんなグラフがサクッと描画できるのはすばらしい
MathematicaCLI(バッチ)でも動かせるようだ。

$ cat wave.wls
graph = Plot[{Sin[x], Cos[x]}, {x, -Pi, Pi}]
Export["wave.png", graph]
$ wolframscript -file wave.wls

上記の操作で、PNG形式の波形がファイルに出力される。なお、14秒かかる。これはさすがに遅い。RPiで14秒かかったので、PCでも試してみた。PCだと42秒かかった。なんと。。NotePCなのでゲーミングPC程の性能はないとしても、これは非常識に遅いのではないだろうか*1
Mathematicaは数学用途のすごいソフトだと思うが、自分のようなちょっと使うだけだとオーバースペックで能力を生かしきれず、むしろ初動に時間がかかり。。。って、Mathematicaをタスクとして常駐させてWebサービスのLambda風に使えるとかなんとか*2。。
CLIで対話的に操作して、関数を定義、グラフを出力した例

■参考URL
https://projects.raspberrypi.org/en/projects/getting-started-with-mathematica/2
https://community.wolfram.com/groups/-/m/t/418132
Plot: Visualize or graph a function—Wolfram Documentation
Vector Visualization—Wolfram Language Documentation

*1:13th Gen Intel(R) Core(TM) i7-1370P 1.90 GHz これがスペック高いのか低いのか分からない。1.9Gってちょっと遅い気もするが

*2:よく読むと、自分のPCにタスクを常駐させるのではなく、本物のCloudServiceのようであった

Mathematicaは微積の勉強に役立つ?

フーリエ級数の勉強をしていて、sinΘとsinΘを掛け算して積分したら非0だが、sinΘとsin2Θを掛け算して積分したら0になる・・元の関数f(x)に含まれる波(sin/cos/nΘ)を知りたかったら、調査したい波を掛け合わせて積分して0か非0かで判断できる・・的な説明があって、Pythonでプログラム組んでみようと思った。でもまぁどうせなら、PythonやらPyplotで試行錯誤するのではなく、Mathematica等の数式処理システムの方がサクッと動くのではと期待。微積も一発だろうし、グラフも出るようだ。しかも、Mathematicaは基本Lispらしく、ちょっと仕様を読むとカッコの沼らしい。Lispは好きな言語で、カッコの沼にずっとズブズブなので、これはこれでいいのでは?と思い、まずはお試し版をDLしてみた。
ちなみに、家庭・趣味用で使う場合は、Premium Planで¥24,800/年だ。これはあまりに高すぎる。素人なのに月2千円も払うとは。一方で、RaspberryPy版は無料で使えるらしいので、そっちを使ってみるか。。
いつものことながら、またそのうち飽きてしまうのかもしれないが、Mathematicaのtutorialで勉強して、sin/cosのグラフを描画したり、さくっと微積の計算ができるようになりたい。(お試し版の有効期限は15日。自分が集中していられる時間もそれぐらいかも。)
お試し版を契約するとCloud版のMathematicaも使えるようで、とりあえずSinのグラフを描画してみた

元のf(x)に含まれるsin(Θ)を掛け算すると、積分値は非0であると(下記図の上は確かに正の値のみ)。含まれないsin(4Θ)を掛け算して積分すると0になるはずなのだが(下記図の下側のグラフ)。。面積見るだけだとこれが0になるのかどうかちょっと分からず

積分関数を使って面積を算出しないとちょっと見るだけでは判断つかない
Mathematicaでは積分関数も用意されていて、、以下のように書くと、Cos(x)に対して、0-Pi/2の区間積分してくれるらしい。この手軽さはすばらしい。

Integrate[Cos[x], {x, 0, Pi/2}]

どうせなら、関数を定義してからIntegrateを呼びたい。。
sin(4Θ)が含まれるかを確認するため、sin(4Θ)を掛け算する関数(定義した関数名がf(x)なので若干混乱)を定義して、積分してみた

結果は0となり、元の波形にはsin(4Θ)は含まれないことが分かった(ということと理解)
全く知らない人間がプログラムをインストールして少し調べて数時間で、波形表示、積分までできるとは、さすが専用ソフトはよくできている。
ちなみに、関数定義とは、以下と書かれている

Wolfram言語では,関数定義は,パターンに対する変換規則を与える割当てのことです.

スコープ等の概念はなく、文字列置換して実行されるだけ。。。ということのようです。
■参考URL
解析学の勉強をはかどるために使ったツール #Mathematica - Qiita
Wolfram + Raspberry Pi Project: A Wolfram Engine on Every Raspberry Pi
Wolfram言語チュートリアル:プログラミングの基本
Wolfram Language & System Documentation Center
関数定義 | Wolfram言語プログラミングの基本
科学計算基礎
JSONata およびアセンブリー・アクション

メモ:Udemyの分かりやすいコンテンツ「イメージでわかる電磁気学 - マクスウェル方程式 」

基本的には理論の積み重ねで理解すべきなんだろうけど、まずはざっくりと電磁気学ってどういうものかを理解したい(抽象的、感覚的に)。YouTubeでもいろいろ解説ビデオがあるのだろうけど、Udemyの「イメージでわかる電磁気学 - マクスウェル方程式 -:社会人になってから学ぶ物理学(中級編)」が自分にとっては分かりやすいと思った。
なぜ分かりやすいか? マクスウェル方程式を正面から取り上げている。数学的な解説も少し入っている。(今まだ途中なので、追って記載)

■メモ
cygwinでesptool.pyを入れようとしたらcryptographyをビルドしようとしてエラーになった。

Building wheels for collected packages: cryptography

workaroundとして、cygwinpython-cryptographyパッケージを入れるとcryptographyのビルドは行われずesptool.pyが入った


「電磁気学」に関連する記事一覧 | 学びTimes