ラベル MSP432P401R の投稿を表示しています。 すべての投稿を表示
ラベル MSP432P401R の投稿を表示しています。 すべての投稿を表示

2015年9月23日水曜日

まさにボトルネック

ADCとD級アンプの間の分圧抵抗をどこに入れよう…w

信号処理もどきを作ったのに、ADCがないので音を出して結果を確かめることができません。部品ぐらい買いに行けばいいんですが、膝を壊していて連休中はあまりでかけないで休むというコンセプトを忠実に守っているため、秋月にいや秋葉原にいけません。

せっかくMSP432P401Rで補聴器の着手できるめどが立ったのに…と思いつつ部品沼を整理していたら、一個だけMCP4725/DCコンバータが出てきました! 在庫リストにも記載されていないので、思いつきで買ってそのまま忘れていたのでしょうw

ということで、出力側の部品が揃いました。

秋月秋月秋月

ということで、まず今まで使ったことのないMCP4725を使ってみます。癖のないI2C仕様で割とすんなりつながった…のですが、何だか動作が不安定です。I2CのSDA線にオシロをつなぐとフリーズしてしまいます。基板裏のプルアップ用ジャンパは問題ないですし、オシロの入力インピーダンスはかなり高いので何か影響を及ぼすとは考えにくいのですが…ともかく、フリーズしていないことをLチカで確認することにして、だましだまし動かしてみます。

そして次に素の状態でMCP4725にどのぐらいの速度でデータを流してみようとして問題発覚。Energia/MSP432はI2Cの速度を切り替えられない。Arduinoだとライブラリのヘッダをちょっと書き換えれば400Khzまでは動くんですが、同じような箇所がMSP432版のドライバライブラリなどには見つかりません。i2c.cなんてソースに

    ASSERT(
            (EUSCI_B_I2C_SET_DATA_RATE_400KBPS == config->dataRate)
            || (EUSCI_B_I2C_SET_DATA_RATE_100KBPS == config->dataRate));

という記述はあるのですが、これを呼び出している側が見つからず、configもdefineも見つからず…。

しかたがないので、100khzで動かしてみましたが、1ワードの送信に3バイト必要+様々なオーバーヘッドで、毎秒約4000回≒2khzがやっと、という有様です。電話を遙かに下回り糸電話レベルの帯域orz

うーん、せめてI2cが400kで動けば16khzで出力できるので帯域は十分なのですが。

Energiaなんかで楽していないで、CMSIS使えってことですかね…ああ面倒くさい…。まぁ電子工作再開したばかりこのにLPC810にI2Cで液晶つないだりしてたので、できないわけじゃないんですけども…API調べたりするのが唯々面倒。


2015年9月22日火曜日

スペクトルアナライザー by MSP432P401R+Energia MT

ピンぼけじゃないもん影だもん(趣味:写真)

■Energia MT=マルチタスク■

EnergiaはArduino互換の開発環境ですが、MSP432P401R版はマルチタスクに対応しています。

マルチタスクというにはあまりにも単純でセマフォとかメールとかまったくありません。でも、今までのArduinoと比べれば格段に作りやすくなりました。

使い方は単純で

  • Energia IDEでタブを開き適当な名前を付ける
  • メイン同様setupとloop関数を用意するが、setupDisplay(), loopDisplay()のようにタスク名が後に続くようにするとsetup+loopのペアを別タスクとして認識する
  • メインに置いたヘッダやメイン上のGlobal変数は別タスクでも認識される

排他などについては厳密な排他制御は無理、暫定的にGlobal上にフラグを置いて自分で制御するしかありません。また、プリエンプションやタスク優先度がどうなっているのかも不明。その辺まったく情報がありません。まぁそのうち何とかなるでしょう。

ということで、とりあえず毎度お馴染みのスペクトルアナライザーをマルチタスクで作ってみました。

■材料

MSP432P401R、アンプ付きマイクAE-MICAMP、超小型グラフィック液晶AQM1284A、ブレッドボード、ジャンパ線…すべて秋月で揃います。合計4000円ぐらい? USBシリアルなども不要なのでArduino uno正規品を買うより安いです。

マイクはアナログ出力なのでドライバ等不要です。液晶についてはAQM1284AのコントローラIC ST7565RのライブラリをAdafruitさんが公開しているので、それを少し改造して使います。

FFTは大浦先生のライブラリそのままですが、M4F対応としてdoubleをfloatに置換して使用します。

以上です。

■配線■

マイクはGND, Vcc(5vが推奨されていますが出力電圧が大きくなりすぎるので3.3vにします)を接続し、OUTをEnergiaのP5.0に接続します。

AQM1284Aは以下の通りです。


AQM1284AEnergia MSP432P401R
VDD3V3
CSP3.0 / 18
RESETP2.5 / 19
RSP5.7 / 17
SCLKP1.5 / 7
SDIP1.6 / 15
GNDGND

■使い方■

各ソースは末尾に掲載します。長くてすみません。

Energiaは最新の16を使用してください。起動する前に、ST7565という名前のフォルダを作り、その中にST7565.cppとST7565.hを入れ、Energiaのlibraryフォルダに入れます。

Enegiaを起動したら、新しいプロジェクトを作り、FFTGraph_MTをコピペします。次に、ウィンドウ右上にある下向き三角をクリックして「新規タブ」を選び、TaskLCDという名前を付けてTaskLCDをコピペします(名前は何でも良いです)。

配線の点検をすませたらMSP432をマイクロUSBで接続し、Energiaでcmd+M、ビルドとプログラムの転送が終わるとグラフィック液晶に表示が出る…はずです。

なお、この作り方は厳密にいえば正しいマルチタスクではありません。TaskLCDが表示している最中にメインスレッドが表示バッファを書き換えてしまうこともありえます。でも、表示中にスペクトルが変わったとしても人間の目で追える変化ではないので、大目に見てやってください。

■毎度お馴染みのハマり■

Adafruitのライブラリの移植は、コンパイルエラーが出る→つぶす→ビルド→エラー→潰す…を淡々と繰り返すだけですが、それで終わらないのがコントラスト設定とpagemapでした。

コントラスト設定は秋月版との液晶の違いかAdafruit版だと真っ黒になってしまうのですが、Voltage Resistor Setを指定して回避できました。

pagemapはコントローラ上のページと液晶の表示位置を対応させるための表ですが、配布されているものと秋月のでは仕様が異なるようで、こんなのが出ました。左上隅から右下隅への直線がちょっと下にずれてます。64ドットで8ページ、たぶん2ページずれているのでしょう。


何度かの途中試行錯誤を経て

逆だ

なんだこれ

最終的にちゃんと表示が出ました。ここまで約1時間。



その次はマイクからの入力が常にゼロという現象が。そんなお行儀のいいアナログ入力はありえないのでしばらく頭を抱えていたのですが、これはanalogRead対応のピンにつないだつもりがanalogWriteのピンだった、というオチ。そりゃ値ゼロだわorz

FFTライブラリはつい最近使ったものなので問題なし。マルチタスク対応に関しては、奇跡的にも一発で動きました。何も難しいことしていないので当たり前ですけども、簡単なところで引っかかるのがこの私orz

でも、「自作補聴器」に今までで一番近づいたなぁ。すごいぞM4F、偉いぞM4F。





2015年9月21日月曜日

Energia16(MacOS X Lion) / Failed: Failed to evaluate GEL_LoadProgramOnly

NMAXSQRT大きすぎるな、今気づいた。

MSP432で遊んでいて、ボードに書き込みをしようとしたら
Failed: Failed to evaluate GEL_LoadProgramOnly
というエラーが出て書き込みができなくなりました。Forumにも同じissueが投稿されていたのですが、最終的には「OSとアプリを再インストールしたら直った」ということですが、それは余りにもリカバリコストが高すぎます。

ので、エラーメッセージにも出ている/var/foldersを消してみたり、Energiaアプリを再インストールしてみたのですが症状は変わらず。当然LaunchPadのUSBケーブルを抜き差ししてもダメ。

ただ、/var/foldersを消そうとしたらFinderがお亡くなりになったので、「これはパーミッションの問題だろうか?」と思い、
  • ディスクユーティリティでアクセス権修正
  • セーフティモードで起動
  • /var/tmp削除
などを行ったのですが変わらず。

ふと思い立ってボード上のリセットボタンを押したら…何事もなく復帰しました。ケーブル抜き差ししてもダメだったのにリセットが効くとは…orz

毎回ではないですが、起動直後にcmd+Mで「ビルド後にシリアルモニタを開く」を選ぶと、再発しやすいような気がします。その場合もリセットで復帰しました。

以下余談。

リカバリーのための諸々の操作の何が悪かったのか、Finderがなんだか不調です。Chromeも起動しなくなってしまいました(再インストールしたら直った)。まぁChromeはタブが増えすぎていたし、メモリをバカ食いするから使わなくても良いかな。

セーフティモードでお掃除したせいか、妙にサクサク動くし。まぁ悪いことばかりではなかった…と…考えましょう。

2015年9月20日日曜日

ゴメン、MSP432P401Rやっぱり速かった

基板裏

えー、前回、MSP432P401Rがイマイチ速くない、という記事を書きました。

32bit 48MhzのMSP432が16bit 16MhzのArduino nanoと比べて約1.7倍速いだけでクロック比やCPU差を考えるとぼろ負け状態でした。

あれ、FPUは仕事してないの?と思ったのですが…よくよく仕様を読んでみれば、M4FのFPUは単精度でした。今回使ったFFTライブラリは倍精度なので、FPU様の恩恵をまったく受けられません。

というわけで、dobuleをfloatにさくっと置換して、実行してみました。

その結果(前回同様64点のFFTを1000回実行)

デバイス結果
MSP432P401R82mSec
Arduino nano1943mSec

前回結果が1142mSecでしたから約14倍スピードアップ! 圧倒的です。一方のArduino nanoはほとんど変わっていません。改めて調べてみるとArduinoはdoubleもfloatも単精度なんですね…知らなかった。Energiaも同じ仕様なのですが、MSP432は特別なのでしょうか。とりあえずfloatが単精度でFPUを使っていることは確認できましたが、もしMSP432だけはdoubleがちゃんと倍精度で実装されているとしたら、この結果は納得がいきます。

前回の結果でも「なんとか補聴器作れるかなぁ…」という程度だったのですが、これなら十分です。あとは私の能力か…そこが一番ネックだな…。

関係ないけど、配列に一定の値を入れて逆FFTかけたらピンクノイズになるんですかね。一度実験したいと思ってたのですが、こないだ「よし、もう買い忘れはないな」とさんざん確認してから発注したにもかかわらず、見事にDACを注文し忘れました。

やはり私の能力が一番のネックだorz

2015年9月19日土曜日

MSP432P401Rがイマイチ速くない?


■追試結果■

イマイチ速くない原因がわかりました。MSP432搭載のFPUは単精度で今回使ったプログラムは倍精度、そのためFPUが寝てる状態でした。ただ、どちらもソフトウェアで演算しているなら、やはりクロック差ほどの性能差が出ていないので疑問は残ります。

追試結果はこちらです(ゴメン、MSP432P401Rやっぱり速かった)。

以下は、新しいCPU到着に浮かれるバカっぷりだけをお楽しみくださいorz

■本文■

ついに届いたぜ、M4Fだぜヒャッハー!

…などと浮かれていたのですが、energia上で浮動小数点64ポイントのFFTを1,000回走らせてみたところ、結果は1143ミリ秒でした。

一方、Arduino nanoに同じソースをコピペして実行したら、1992ミリ秒。

クロック比よりも遅い? 浮動小数点プロセッサはどーなった??

…という残念な結果になりました。

ちゃんとオプチマイズしないとダメですね。ARMに最適化されているであろうCMSIS-DSPはどうかなぁ…。