LSM303D 3軸加速度センサ+地磁気センサ
enviro pHAT
RasPi や RasPi Zero に付けられる拡張基板。
加速度センサ、地磁気センサ、光センサ、温度湿度センサなどがついていてお得。
本家はこちら
python によるライブラリが公開されている。
GitHub - pimoroni/enviro-phat: Python libraries and examples for the Pimoroni Enviro pHAT
これを使えば簡単に操作できそう。
しかし、C/C++から使おうとすると、C/C++用のライブラリは上記のリポジトリにはなさそう。まぁ、普通は python ライブラリがあれば十分なわけだが。
基板上の各種センサは I2C IFを持っているので、RasPi用の I2Cライブラリを使えばデータの取得はできそう。I2Cデバイスのアドレスは公開されている。
あとは、各デバイスが出力するデータのフォーマットがわかれば、読み取れるはず。
そこらへんは、python ライブラリのソースと各デバイスのデータシートを見ればわかるだろう。
- BMP280 temperature/pressure sensor
- TCS3472 light and RGB colour sensor
- Two LEDs for illumination
- LSM303D accelerometer/magnetometer sensor
- ADS1015 4-channel 3.3v, analog to digital sensor (ADC)
ん?今気がついたが、ADCが乗っているということは、センサ類はアナログ出力で、それをADCに入力し、ADCが I2C でセンサ値をデジタル出力している、ということか。
- 0x49: ADS1015
- 0x29: TCS3472
- 0x1d: LSM303D
- 0x77: BMP280
DeepLearningお勉強の段取り
基本的には、エッジ側でのコンピューティング技術を習得したい。
もちろん、モデルの学習はエッジ側ではなく、クラウド側でやっておき、学習済のモデルで、識別や検出だけを行う。
理論を理解するには python でゼロから実装するのが一番だが、時間が惜しいので数あるフレームワークの使い方を覚えるところから始める。
- TensorFlow
- TensorFlow + Keras
- Chainer
エッジ側という意味で、
Sony さんの nnabla は CUDA が使える、ということで NVIDIA の GPU を使う想定。
一方、Leap Mind さんの Blueoil は FPGA を使う想定。
性能がもっと低くてよければ
- RaspberryPi + Movidius
というのもある。お手軽に試せる。
お勉強の環境としてはGoogle collabolatory がベスト。
https://colab.research.google.com/notebooks/welcome.ipynb
各種フレームワークがインストール済な環境を無料で使える。
作業結果は Jupyter Notebook として保存できる。Github に保存するのがよい。
また、なんと素晴らしいことに GPU も使えるらしい。
いつまで無料で使えるかわからないが、ここから始めるのがよさそう。
FPGA でディープラーニング
何年振りかでEmbedded Technology 展に行ってきた。
今年受けたカンファレンスの中で断トツに面白かったのが中原先生のもの。
http://3状態ディープラーニングの学習からFPGA実現まで
このときの資料は公開されている。
資料には書かれていない、先生の話がとても分かりやすく、ためになった。
GPU、FPGAの長所・短所を知りたかったのだが、スライド9ページに
まとめられていた。
現時点では、処理速度においてGPUのほうが速い場合が多いらしい。
それはディープラーニングのアルゴリズムに依存したもので、浮動小数点演算が多いと格段に遅くなる。2値化による枝刈りという手法がとても有効で、計算結果の精度を保ったまま、計算量と処理時間を劇的に改善する。2値化はFPGAととても相性がよい。
消費電力の点では、現時点でGPUのほうがFPGAよりかなり大きい。
アルゴリズムは現在、次から次へ新しいものが出ている最中で、1か月で20%性能が上がる、といったことが起きているそうだ。あと2年ぐらいはそんな状況がつづくのではないか、とのこと。なので、現時点ではASICにするのはリスクが高すぎる、新しいアルゴリズムをすぐに試すにはFPGAがいまは一番使えるデバイス、ということだった。
Sonic Pi と USB スピーカー
RasPiにダイソーの300円スピーカーを繋いで、Sonic Pi からの音声出力できている。
この場合、RasPiのスピーカー出力を analog に設定するだけで良かった。
しかし、スピーカーを USBスピーカーに変更したところ、音がでない。(涙
タスクバーのスピーカーアイコンを右クリックすると、メニューがでてくるが、analog と HDMI を選択する事ができる。ここで HDMI を選択し、HDMIなモニタにスピーカーがついていれば、問題なくモニタのスピーカーから音がなる。
しかし、この設定では USBスピーカーに出力されない。
aplay -D plughw:1,0 というふうに、デバイス番号を指定すると USBスピーカーから音は出る。なので、Sonic Pi に出力デバイス指定できれば USBスピーカーから音が出るはず。
とここまでは比較的すぐに思いついたが、この先が長かった。多少ググった範囲では、Sonic Pi 側に出力デバイスを指定する方法は見つからなかった。Orz...
ということは。Sonic Pi はシステムのデフォルト?設定をみて、出力先を判断しているはず。
その観点で、改めてググった。
amixer cset
amixier cset (デバイス番号)でデバイスを設定すると、出力デバイスを覚えてくれるらしい。
alsa-base.conf
/etc/motdprobe.d/alsa-base.conf
ALSA用設定ファイル .asoundrc
スピーカー用、マイク用といった、細かい設定をファイルに設定できるらしい。
スピーカー用のデバイス番号は、
aplay -l
で確認する。
また、マイクのデバイス番号は、
arecord -l
で確認できる。
RaspberryPi3でマイクとスピーカーを使えるようにする | Corgi Lab. 〜備忘録のための技術ブログ〜
Sonic Pi とそのコマンドラインインターフェース
Sonic Pi
RaspberryPi で音符を打ち込んでスピーカーで曲を鳴らすためのソフトウェア(ライブラリ・アプリケーション)を探していたのだが、実はデフォルトで Sonic Pi というとても便利なアプリケーションが入っていることを発見した(汗
対象年齢は🔟歳以上らしい。大変わかりやすい、そして詳しい日本語のヘルプ・チュートリアルがついている。それを見ながらすぐに音を鳴らすことができた。play :E4 といった感じで音階を指定し、sleep 1.25 なで音の長さを指定する。ひたすらこれを繰り返すだけで、曲を鳴らすことができた。(嬉
シンセサイザー機能があり、ピアノやドラムの音を出すことができる。
コマンドラインインターフェース
これだけで十分楽しいのだが、今回はC/C++のアプリケーションから Sonic Pi の機能を利用したい。で、ググったところいくつか使えそうなものを発見した。
- sonic-pi-tool(Rust)
GitHub - lpil/sonic-pi-tool: 🎻 Controlling Sonic Pi from the command line.
- sonic-pi-tool(python)
GitHub - emlyn/sonic-pi-tool: 🎻 Controlling Sonic Pi from the command line, in Python.
python 版は Rust 版をポーティングしたものらしい。個人的には Rust 版で良いのだが、一般的(人に薦めるなら)python 版かな、と思ってまずは python 版をインストールして試した。
実際に試してわかったことだが、 python 版だと使いにくいことがわかった。
Sonic Pi は、入力したスクリプトコードをファイルに保存出来るのだが、python版だとそのファイルをそのままでは利用できない。
スクリプト:play :E4
python版ツール:play( E4 )
と、カッコの有無が違う。では、Rust 版だとどうかと試してみたら、そちらは Sonic Pi で作成したファイルをそのまま利用することができた(嬉
と、ここまできてちょっとした疑問がでてきた。そもそも Sonic Pi は Ruby で書かれている。Ruby 版のコマンドラインツールもあるのでは?
あった。(笑
GitHub - Widdershin/sonic-pi-cli: A simple command line interface for Sonic Pi, written in Ruby
これはまだ試せていないが、Sonic Pi との相性は一番良いはず。
構造体の配列
play と sleep で一音ずつ指定するやり方はコーディングの効率が悪い。音の構造体を作り、その配列として曲データを指定したい。きっとそういうやり方があるはず。
ぐぐったところ、配列を利用した方法は見つかった。音階の配列と音の長さの配列。だがこのやり方だと配列のインデックスがズレるとおかしなことが起こる。
http://www-b.uec.tmu.ac.jp/shakuhachi/SonicPi/SonicPi_memo.pdf
ruby に構造体があることは確認できた。これを使って Sonic Pi の曲データを作れないか、これからやってみる。