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はどうかなぁ…。

2015年9月16日水曜日

ESP-WROOM-02の電源はかなりシビア?

林さんの髪型を彷彿とさせる配線状況

前回の記事(やっとESP8266(WROOM-02)入手)で、ファームウェアを書き換えるための文字列のスペースが詰まっていたり全角が挟まっていてご迷惑をおかけしました。申し訳ありません。なぜかこのブログを書いているBloggerでは、数日後テキストのスタイルが突然崩れるという珍現象が時々発生します。発表直後には必ず確認しているのですが、後日見ると崩れていて…私も自分でコピペして初めて壊れていることに気づいた次第です。大変申し訳ありませんでした。

さて、某林さんのところでも珍現象が起きていて、どうもESP-WROOM-02のWebサーバが安定しないご様子。数分でフリーズしたり、たまに数時間動いたりする。私のところで正常に動いていたWROOMを送って試したもらったのですが、このときSSIDを林さんちに合わせていなかったので、予備のWiFiを用意してもらいました。するとなんと数時間無事に動作した!…のですが、やっぱり落ちる。林さんの作ったWROOMでも予備WiFiだと比較的安定するものの、やっぱり落ちることは落ちる。

それでここしばらく、林さん、○野さん(伏せ字になってないな)と3人で脳ミソを寄せ集めていたのですが、どうにもならず。

で、ゆうべ、ちょっと確認したいことができたので、私のうちにもう一枚余ってたESP-WROOM-02を組み立てて実験していたのですが…これがまともに動いてくれません。林さんと同様どころか林さんより悪くてsetup()の起動メッセージすらでない。

電源はUSBシリアルの5v出力からDC/DCを使って3.3vに落としているので容量的な問題はないはず。

これも一晩、各種バージョンのファームウェアをアドレス変えながらいろんなパターンで流し込んだりしたのに、状況は変わらず。

…というか変わらなすぎる。ファームが原因なら、もっと毎回違うメッセージが出てくるはず。

というわけで念のため電源電圧を測ってみたら、3.1vしか出ていない? USBシリアルの供給能力が足りないっぽいので、USBシリアルのVcc端子をやめてACアダプタに交換してみました。

すると何事もなかったかのように、Web画面表示が…。

また無駄な苦労をしてしまいました…。

追記:使っている三端子DC/DCについて書きました(リンク)。

今日会社で眠いだろうなぁ…。

寝てないわー3時間寝てないわー(ミサワ
以前Beaglebone blackで作った睡眠・活動計(Play!アプリとBoneScriptの通信 - 1.構成)は今もちゃんと動作していますが、こういう時は便利なのか不便なのか…。寝不足だから眠いのではなく、寝不足だと思うから眠いのだ、と言ったのはどこの漫画家だったか、それとも照井俊光氏の弟子トミ子氏だったか…。

2015年9月15日火曜日

チップコンデンサ2012とジャストサイズ


以前もチップ部品と余ったピンヘッダを使って「ブレッドボードに最適な部品!」とかやっていましたが(「表面実装部品は安いっ」「表面実装部品は安いっ'」)、あれはちょっとハンダ付けが大変でした。あの時使ったのは1608の積層セラミックコンデンサだとピンとチップの間に隙間があるので、ピンをうまく調整しないと落ちてしまうのです。

しかし。本日発見しました。2012のチップコンデンサと、2.5mmピッチのヘッダピンはジャストフィットなのです。指で軽く押し込んでやると、指を離しても落ちません。ハンダ付け楽勝です。ついつい必要以上に量産してしまいましたw

今日使った / 作ったのは4.7μF50Vの積層セラミックですが、このぐらいの容量・耐圧のリードタイプは結構高かったりするので、今後とも活用していきたい…と思ったのですが、品揃えが豊富になると容量がわからないという問題が生じますね。とりあえず一目でわかる4.7と0.1ぐらいにしておこうっと。

2015年9月12日土曜日

32bit CPU搭載インバータw

「マイナスは黒」と書いてあるのはインダクタが赤に届かなかったので

■追記1■

当初この記事では「ジュールシーフ」と表記していましたが、「電子工作部」で「これはジュールシーフではなくてチョッパ型昇圧インバータ」というご指摘をいただきました。ありがとうございます、訂正致しました。

あと、適当に転がっていた0.5wの太陽電池をつないでみたところ、0.2vから動作を開始し0.6vでフル作動の状態になり、この時の電流は約50mAでした。

また、MacのBluetoothキーボードで使用できなくなったマンガン電池では0.2vまでしっかり電池を絞り尽くしました。そういう意味ではジュールシーフと言えなくもw

■追記2■

もうちょっとマシな制御をして指定した電圧でぴたっと止まるようにした続編はこちらです。

■32bit発信器w■

また無駄遣いをしてしまいました。しかも32bit CPUは単に

#include "mbed.h"
AnalogIn vol(dp4);
PwmOut pwm(dp18);
int main() {
    pwm.period(1.0/20000.0);
 
    while(1) {
        pwm = vol;
        wait(0.1);
    }
}

って書いているだけ。要するに単なるデューティー比可変方形波発振回路、CPUのムダにも程があるw

LPC810の方が向いている(こっちも32bitだけど)規模なのですが、LPC810にはADCがないのでLPC1114FN28を使いました。

■昇圧回路1■

回路は「芸が無いにも限度というものが!」と怒られそうですが、電池の1.2vをPFMで3.3vに昇圧してLPC1114と黄色LEDとインバータ回路の電源に。

HOLTEK社 HT77xxA仕様書より引用

■昇圧回路2■

LPC1114で約20khzのPWMを出力して、チョッパ型インバータ回路を構成するMOSFET 2SK2232をスイッチングしています。L1のところにつながっている電源はVccと書いてありますが、実際には電池のプラス極です。逆流防止ダイオードはショットキーバリヤー1S4、パワーインダクタは68μHの表面実装ものにピンヘッダをハンダ付けしたもの、あとは出力用の電解コンデンサ50v22μF、分圧抵抗1kΩと直列の青色LEDです。ボリュームはアナログ入力につながり、PWMのデューティー比を調整しています。

これ書くのに1時間近くかかった…IC1が立派すぎる

PWMをoff(0%)にしてもほんのわずか青色LEDが点灯して電流が流れますが、これは電池の1.2vが素通りになっているためです。Vfが3v近い青色LEDでも1.2vで点灯しちゃうんですね。

前記の通り手持ちの部品の耐圧が最大40v(1S4)しかないので30vまでしか試していませんが、部品(MOSFET, ダイオード, C1)をもっと高耐圧のものにしてLEDとR3を外せば200vぐらいは余裕で出せます。

■LPC1114fn28への書き込み■

いつも説明を省略していますが、LPC1114fn28への書き込み方法はここ(プログラムをフラッシュに書き込む)が詳しいです。

私はmbedのブラウザIDEからダウンロードしたbinをlpc21ispを使ってLPC1114FN28に送っています。

まずターミナルで ls /dev/tty.usb* を実行してUSBシリアルのドライバ名を表示します。私のところでは /dev/tty.usbmodem24131 でした。
USBシリアルのTXDをdp15, RXDをdp16に接続し、あと3.3vとVcc、GNDとGNDを接続します。なお、USBシリアルによってはTXDではなくTXと表記されている場合もあるのでご注意を。で、mbedでのコンパイルが終わるとバイナリがダウンロードされます。そうしたらLPC1114FN28のdp24をGNDに接続し、dp23をちょいとGNDに接触させて離し、dp24も離します。で、ターミナルで以下のコマンドを実行します。なお、このプログラムでは問題ないですが、dp23/24をGPIO特にDigitalOutやPwmOutとして使っている場合、そのままGNDに接続するとチップを破損します。なので、330-1kΩぐらいの抵抗を通じてGNDに接続すると安全です。
lpc21isp -bin <mbedから落ちた.binファイル> /dev/tty.usbmodem24131  115200 48000
メッセージとSector 1:のあとに「.」がととととと…と表示され、書き込みが行われます。もし表示が「Synchronizing (ESC to abort)..」の先に進まないようなら、もう一度dp23とdp24をGndに落としてみてください。
Now launching the brand new code
lpc21isp version 1.97
File Chopper_LPC1114.bin:
loaded...
image size : 11492
Image size : 11492
Synchronizing (ESC to abort)....... OK
Read bootcode version: 1
7
Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B)
Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last.
Erasing sector 0 first, to invalidate checksum. OK
Sector 1: ...........................|.........................|.........................|.........................
Sector 2: ...........................|.........................|.........................|.........
Sector 0: ..........................|.........................|.........................|.........................
Download Finished... taking 8 seconds

2015年9月3日木曜日

MacとWindowsの色の違い

あ り が ち

ちょっとしたWebアプリをPlay+Angular+Bootstrapで作ったです。ロゴ作る人いないっていうから、私がKeynoteに適当なフォントを乗っけて加工して貼りました。指定色を画像と背景とで同じにして、少しずつグラデーション付けて。

で、Macで見て、確認し社内リリース。特にコメントなし。

が。後日Windowsでそのページを見てみたら…画像部分とその周囲の色が違っているorz あわててMacで見ても同じだし…。なので、


  • pngでなくjpegにしてみる→同じ
  • VMBox上で表示された背景色をスポイトで取って塗る→同じ


背景を透過色にすれば良いんだろうけど、適当なツールも時間もない。ので、結局、「どうせ文字から作ったんだから」ということで、CSSで修飾してほぼ同じモノを作ってリリースしました。当たり前だけど、同じ表示になりました。

私は徹頭徹尾デザインセンスのない人間なので、今までこういう作業に関わってきたことなかったのですが…いやー、大変ですね。最近個人的にはサーバサイドでページを生成するより、クライアントサイドでAngularなどを作って生成する方が合理的だと考えているのでHTML/CSS/JSを弄ることが多いのですが(会社ではくそったれStruts2ですが)…せめて、こういう基本的なことぐらいは勉強しておかないといかんです。

はい。

それはともかく…社内のほとんどはWindowsなんだし、はっきり段差付いちゃってるんだから、クレーム入れてくださいよぉ>社内のヒト まさかそういうデザインだと思ったわけではない、と思いたい…。

2015年9月2日水曜日

大きなセグメントLED


比較的簡単に手に入るモノとしては、秋月とaitendoで売ってる高さ58.8mmの16セグメントアノードコモンLEDがお馴染みだと思います。

どっちも基板も付けて売っているんだけど…秋月のは既存のデジタル時計キットに適合させるために7セグメントとして使っているのとドットが1分しか配線されていない。aitendoのは全セグメント配線されているんだけど、端子が左右に離れているのでコネクタ一個でマイコン取り付けておしまい、ということができない。

このぐらいの基板なら自分で設計するのも簡単なことなんだけど、大きいとEagleのフリー版の制限を超えてしまう。まぁKiCAD使えば良いんだけど…わりと微妙な大きさなのでElecrowなどに注文しても少し高く付いてしまう。いっそクラウドファウンディングで募集したりして。「A-2308SR用基板、ゴールは100枚5万円です」…需要ないな、100枚もw

とか書いているこの瞬間に、ESP-WROOM-02にArduinoシールドと組み合わせて使えるようにする基板を作っている人は世界にどれだけいるのだろうか。もちろん完全コンパチにするにはピン足りないし電圧も違うけど、そこを端折ったり工夫したり。

何がでてくるか楽しみ。