2013/01/26

Windows8でPSoC 3/5/5LPを使う

先日Bootloader Hostが起動しない、という記事を書きましたが、互換モードの設定を行っても起動しなくなってしまったので、Windowsの再インストールを行いました。

せっかくの再インストールの機会なのでWindows8を導入したのですが、ドライバ周りの対応が完全ではないらしく、いくつか注意する点があります。

1. MiniProg3のドライバがインストールできない

通常は自動でインストールされるMiniProg3のドライバがインストールされないので、手動で組み込む必要があります。
Cypress開発者コミュニティに対処方法が書いてあったので、その手順に従ってインストールを行いました。
この内容は近いうちにKnowledge Baseで公開されるようです。

2. USBUARTのドライバがインストールできない

USBUARTのドライバのinfファイルに署名がないせいで、インストールが途中で止まってしまいます。
Windowsをテストモードに入れることでこれは回避できます。
ベストテクノロジーのブログに同様のドライバのインストール手順が書いてあったので、参考にしてインストールを行いました。

今のところ上の2点以外は問題なく動作しています。
少なくともMiniProg3の問題はCypressで認識しているようなので、次のバージョンのPSoC Creator/Programmerでは改善されているのではないかと思います。

2013/01/23

InvenSense製慣性センサでのDigital Motion Processorの使い方II

InvenSenseからDigital Motion Processor(DMP)ライブラリが公開されました。
Developer's Cornerからダウンロードできます。
I2Cdevlibのライブラリではquaternion出力のみが利用可能でしたが、今回公開されたライブラリでは、歩数計、タップ検出、Android端末用方向検出も利用可能になっています。

これまで公開されていたライブラリとは違い、コードはすべてANSI Cで記述されているのでほとんどのマイコンで使えるはずです。
ダウンロードできるサンプルコードはMSP430向けのものですが、I2C周りの関数の追加すればDMPを利用することができます。

以下にPSoC 5LPに移植する上で気になった点をまとめておきます。

1. i2c_write, i2c_read関数

ドキュメント類に特に指定はありませんでしたが、MSP430のコードを参考にすると符号付き16ビット整数の戻り値が必要なようです。
0で正常終了、それ以外(サンプルコードでは-1)でエラーありを表しているようです。
この部分をSPIに書き換えればMPU6000等をSPI接続で使うこともできます。
SPI接続を行う場合には、読み込みを行う場合にレジスタアドレスのMSBを1にしておく必要があり注意が必要です。

2. 時間管理関数

ディレイ用の関数delay_msが必要ですが、必要なのは50 msまででした。
今回はCyDelayを利用しました。
また、内部時刻取得用の関数get_msも要求されていますが、データ取得のタイムスタンプ用なので用意しなくても問題はないかもしれません。
ここにはFreeRTOSのTick取得関数を使いました。

3. 数学関数

labs, fabsf, minが必要です。
math.h, stdlib.hで定義済みでないかを確認し、必要に応じて追加します。
GCCを使っている場合、fabsf, labsの追加は不要です。

4. ログ出力関数

log_i(...), log_e(...)というログ出力関数がありますが、利用しない場合は空関数をdefineしておきます。

5. 割り込み制御関数

これが最もプラットホームに依存する部分だと思います。
割り込みを利用するポート、ピン、コールバック関数がreg_int_cbの引数です。
PSoC 5LPとは相性が悪いので空関数として、割り込み処理は他の部分に記述しました。

テストプログラムmotion-driver-clientを動作させた動画を以下に示します。


以前に示したピッチ角表示と同じようなものですが、きちんと3軸が動作しているのがわかります。

実際に動作させていくつか気になった点があったのでまとめておきます。

1. SPIバスのスピード

DMP出力は1024バイトのFIFOから読み出しますが、SPIクロックが高くなると読み出しが不安定になる傾向がありました。
また、内蔵プロセッサにコードを流し込む際にも、クロックが高いと失敗することがありました。
動作が不安定な場合はクロックを下げてみるとよいかもしれません。

2. FIFOリセット関数

内部に50 msのソフトウエアディレイが入っているので、FIFOリセット関数mpu_reset_fifoが頻繁に呼び出されるとサンプルレートを上げることができません。
FIFOがオーバーフローしないように必要最小限のDMP出力レートをdmp_set_fifo_rateで設定する必要があります。

3. ジャイロのフルスケールレンジ

DMPは2000 dpsのレンジを仮定して計算を行うようで、それ以外のレンジだと異常なquaternionが出力されます。
加速度のレンジは2, 4, 8, 16 gのどれでも構わないようです。

ライブラリの公開でDMPはかなり利用しやすくなりました。
現在作製している電装基板にはquaternionから求めた姿勢角のリアルタイム出力、ログ機能も追加し、機体に搭載してどの程度使えるものなのかを調べてみるつもりです。

2013/01/19

BGAのリフローはんだ付け

XBee型GPSモジュールの基板が届いたので組み立てを行いました。
BGAパッケージのGPSチップを使ったので、はんだ付けにはリフローが必須になります。
1mmピッチBGA99パッケージのGPSチップ
以前LGAのリフローはんだ付けを行いましたが、はんだマスクの作製などの条件がより厳しくなっています。
基本的にはSwitchScienceのページと同じ手順で作業を行っています。

1. はんだマスクの切り出し

SwitchScienceのページにある手順に従って、CraftROBOでポリプロピレン合成紙を切り出しました。
切り出したはんだマスク。左側が今回使うもので、右側は一緒に作った電装基板用マスク
きれいに切り抜けるのは0.65mmピッチ程度までです。
QFP100の部分を見てわかるとおり、0.5mmピッチでは切り出す方向によって差があり、成功率は半々といったところです。
0.4mmピッチの部分はほぼ全滅でした。

SwichScienceのページには「セロハンテープで、切った部分を取り除く」とありますが、何度もテープをくっつけるとポリプロピレン合成紙の表層をはがしてしまうことがあるようです。
一度で取り除けない箇所はきちんと切り抜かれているかを確認したほうがよさそうです。

2. クリームはんだの塗布・部品のマウント

作製したマスクを使ってクリームはんだを塗布します。
クリームはんだ・スキージは以前にLGAで使ったものです。
クリームはんだ塗布
きちんと塗布できているかを確認した後、部品を載せます。
部品マウント完了


3. リフロー

リフローはアイロンとホットエアを併用して行いました。
アイロン単体でのリフローも行えるようですが、手元にあったもの(EPI International, EP-A1001)では温度が十分上がらなかったので、プリヒートをアイロン単体で行い、本加熱にはホットエアを併用しました。

使用した電気二重層コンデンサELNA DCK-3R3E224-Eがリフローに対応していなかったようで、加熱中に電解液が漏れだしてしまいました。
すぐに取り除いたのでその後の作業に影響はありませんでしたが、事前にリフロー対応か否かを確認しておくべきでした。

手はんだでコネクタ等を取り付けて完成です。
完成した基板
テスターで導通を確認した結果、チップから外に引き出した信号線にはすべて導通があり、GPSモジュールの基本的な動作も確認できました。

このモジュールを使って搬送波位相を取得し、u-bloxのモジュールとの比較を行いたいと思います。

2013/01/15

LEA-6TとNEO-6Pの単独測位精度の比較

u-bloxのGPSモジュールNEO-6Pを手に入れたので、これまで使っていたLEA-6Tと測位精度を比較してみました。
NEO-6PにはPrecise Point Positioning (PPP)という機能がついていて、位置出力のばらつきが小さくなると謳われています。

以前に作製したGPSスプリッタで受信した信号を2台のモジュールに分岐し、5Hzで12時間分のデータを取得、平均座標を中心にばらつきをプロットしたものが下の図です。
PPPの効果は確かにあるようで、NEO-6Pでは測位解が中心付近に集まっています。

中心からの距離を横軸にして、累積比率をプロットしたものが下の図です。
赤: LEA-6T, 青: NEO-6P
この図から平均誤差半径(CEP)はLEA-6Tで3.9m、NEO-6Pで3.8mとなりました。
これはNEO-6Pのデータシートにある、CEP=1mより大きな値です。
今回の測位では、
  • さまざまなGPS衛星の配置に対する評価を行うために長時間のデータを取得した
  • 空が完全には開けていない場所で測位を行った
ので、データシートでの測位条件を満たしていなかったことが原因として考えられます。

NEO-6PはLEA-6Tと同じ値段かつ小型で、LEA-6Tの特徴である高精度クロックは不要なので、今後はNEO-6Pをメインに使っていくつもりです。

2013/01/09

XBee型GPSモジュールの設計

搬送波位相が取得できるGPSモジュールとしてこれまでu-bloxLEO-6T/NEO-6Pを使用してきましたが、入手先はほぼメーカー直販に限られ、メーカーサンプル価格も179USDとかなり高価でした。

u-blox以外で搬送波位相が取得できるモジュールにはNVS Technology AGNV08Cがあります。
入手性はu-bloxのものより良好で、Leocomではチップ単体で3200円、モジュールで5600円程度で購入可能です。
u-blox等のGPSモジュールとの比較レポートを見ると、品質はu-bloxに比べて劣るもののきちんと搬送波位相が取得できているようです。
また、ファームウエア更新で搬送波位相の品質が向上したようなので、u-bloxのものと同程度のデータが取得できると予想できます。
新しいバージョンのRTKLIBではNV08Cの独自フォーマットBINからRINEXへの変換も可能で、ソフトウエアの整備も徐々に進んできているようです。

そこで、電装基板にこのモジュールを簡単に載せられるようにXBeeとピン配置互換の基板を起こしてみました。
XBee-USB変換基板を使えばパソコンを使ったテストも簡単にできるはずです。
GPSチップのパッケージはBGAですが、外周2列以外はほとんど無接続端子なので2層基板でも配線を引き出すことが可能です。

部品代5000円程度で搬送波位相が取得可能なGPSモジュールが作れるので、搬送波位相を利用する上での障壁はだいぶ低くなると思います。