始めに

最近Rustをかじってみました。普通にPCで動かすのも何かな?と思っていたところ、『基礎から学ぶ 組込みRust』なる本が出ました。この中ではseeedのwio-terminalという端末を使用して、組み込み向けのRustプログラミングを行っています。早速書籍とwio-terminalを購入しやってみました。本では最終的にwio-terminalのマイク入力のFFTを行い、LCDにリアルタイムに表示するアプリケーションを作成いたします。これに刺激を受け何か作りたいなーと思い、そういえば、ギターに使えるチュナーなどもできないかと思いつき、プロジェクトをスタートさせました。ググるとアナログをうまく使った方法やストロボLEDを使った方法がありますが、今回考えている、周波数を計算して平均律との差を出力する方式は見つかりません。なければ作ってしまおうということで、一から作ることとしました。

参考文献、サイト

『基礎から学ぶ 組込みRust』
この本が無ければ始まっておりませんでした。wio-terminalでRust使うときの環境設定がすべて書かれております。

上記本のgithubサイト
用例のファイルが入っております。が、虫食いになっており本が無いと使えません・・・。

12平均律と周波数
12平均律についての数式とサイン波のサンプルが付属しています。このサイトをもとに計算式を作成しました。

作り方

    1. 前提条件:上記『基礎から学ぶ 組込みRust』をもとにwio-terminalの環境構築を行ってあること。基本はarmのthumbv7em-none-eabihfのクロスコンパイル環境とRust環境(cargo等)、そしてwio-terminalのUSB接続設定、シリアル設定が必要です。筆者はひねくれているので、Raspberry pi 4のサーバ上に環境を構築し動作に成功しております。もちろんPCのUbuntuなどでも動くはずです。

 

    以下のアドレスからRustのプロジェクトをダウンロードします。
$ git clone https://github.com/yoshiki9636/gtuner_wio_terminal
    接続したwio-terminalを書きこみモードにして、プロジェクト内でrunさせます。この時–releaseオプションをつけてください。(つけないとADCが動作しないようです。)
$ cd gtuner_wio_terminal/
$ cargo run --release

使い方

1.楽器で音を出すと、LCDにその時の音名と高さ、どれだけ平均律からずれているかが表示されます。

2.ピッチは初期値がA=440Hzに設定されています。変えたい場合は、上部のボタンで変更できます。左のボタンで1Hzずつ上昇します。真ん中のボタンで1Hzずつ降下します。

アルゴリズム

難しくないので、コード見てください。一応コメントもつけております。

最後に

かなり久々に新しい言語でプログラムを書いてみました(試しにPHP書いて以来)。基本的にPythonみたいなものとCを知っていれば、概念的なものの理解にはそう難しくないかもと感触を受けました。(まだ知らない大変なものが居るのかもしれませんが・・・) wio-terminalはコンパクトにI/Oが揃っていて、お手軽にプロトタイプを作れそうな気がしますので、また何か思いつくことがあったら、これで作ってみようと思います。最後に数々の情報を与えてくれた『基礎から学ぶ 組込みRust』の作者の方々に感謝いたします。

广告
将在 10 秒后关闭
bannerAds