LSM303D 3軸加速度センサ+地磁気センサ

C/C++ソースコードを発見。

github.com

Intelさんの作品の一部らしい。ありがたいことに MIT ライセンス。使える。

 

もっとよいものを見つけた。Adafruit製ドライバソースコードが公開されていた。

github.com

BSDライセンス。ありがたい。こちらのほうがIntelのものに比べて余計なものがついてなさそう。

 

enviro pHAT

RasPi や RasPi Zero に付けられる拡張基板。

akizukidenshi.com

加速度センサ、地磁気センサ、光センサ、温度湿度センサなどがついていてお得。

本家はこちら

Enviro pHATshop.pimoroni.com

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 でセンサ値をデジタル出力している、ということか。

各デバイスのI2Cでのアドレスはここで見つけた。

  • 0x49: ADS1015
  • 0x29: TCS3472
  • 0x1d: LSM303D
  • 0x77: BMP280

 

 

 

 

 

DeepLearningお勉強の段取り

基本的には、エッジ側でのコンピューティング技術を習得したい。

もちろん、モデルの学習はエッジ側ではなく、クラウド側でやっておき、学習済のモデルで、識別や検出だけを行う。

 

理論を理解するには python でゼロから実装するのが一番だが、時間が惜しいので数あるフレームワークの使い方を覚えるところから始める。

  1. TensorFlow
  2. TensorFlow + Keras
  3. Chainer

エッジ側という意味で、

Sony さんの nnabla は CUDA が使える、ということで NVIDIAGPU を使う想定。

一方、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実現まで

このときの資料は公開されている。

www.slideshare.net

資料には書かれていない、先生の話がとても分かりやすく、ためになった。

GPUFPGAの長所・短所を知りたかったのだが、スライド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

ALSAバイスの優先度を設定できるらしい。

/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 の機能を利用したい。で、ググったところいくつか使えそうなものを発見した。

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 の曲データを作れないか、これからやってみる。