PAWセンサの値をmbedを介してPCで取り込む

技術ネタ

あけましておめでとうございます。佐倉です。
前回mbedを使って、PCにPAWセンサの値を送信する処理を書いたので、これを利用する例をご紹介します。
今回は、Windows上でVS Express for DesktopとC#を使って、どのあたりがどれくらい押されているかをビジュアライズするプログラムをご紹介します。
target
プログラムはこちらで配布しています。VS Express for Desktop 2012以降であれば開けるはずです。

まず、USBケーブルでmbedとPCがつながっていますが、mbedはこのUSBを使ってシリアル通信を行うことができます。
Linux, Macでは自動的にシリアルポートが認識されるようですが、Windowsの場合はドライバをインストールする必要があります。

通信が正しく行われている事を確認するために、ターミナルエミュレータ(TeraTermなど)で受信してみましょう。
シリアルポートの設定は以下のとおりです。

Baud:115200[bps]
データ長:8[bit]
パリティ:なし
ストップビット:1[bit]
フロー制御:なし

正しく通信できていれば、このような出力を見ることができます。
(ここに表示される値はPAWセンサにより個体差があります。)
term

次に、PAWセンサを使うキモとなっている部分をご紹介します。
肝心の部分はこれだけです。受信した文字列を分割し、文字列から電圧へ変換して、キャリブレーションデータを使用して押し込みの変位を計算しています。
[css]

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

//1行分以上データがあれば読み込み
while (sp.BytesToRead >= 30)
{
//読み込み
string line = sp.ReadLine();
//カンマ区切りを分割
string[] lines = line.Split(new char[] { ‘,’, ‘\n’ });

if (lines.Count() != 4)
return;

//読み出し値を電圧に変換
p1 = 3.3 * int.Parse(lines[0]) / 65535.0;
p2 = 3.3 * int.Parse(lines[1]) / 65535.0;
p3 = 3.3 * int.Parse(lines[2]) / 65535.0;
p4 = 3.3 * int.Parse(lines[3]) / 65535.0;

//初めてみ出しであれば、ゼロ点として保存
if (z1 == 0)
z1 = p1;
if (z2 == 0)
z2 = p2;
if (z3 == 0)
z3 = p3;
if (z4 == 0)
z4 = p4;

//ゼロ点を減算
p1 -= z1;
p2 -= z2;
p3 -= z3;
p4 -= z4;

//電圧から高さに変換
h1 = c1a * Math.Pow(p1, 4) + c1b * Math.Pow(p1, 3) + c1c * Math.Pow(p1, 2) + c1d * Math.Pow(p1, 1);
h2 = c2a * Math.Pow(p2, 4) + c2b * Math.Pow(p2, 3) + c2c * Math.Pow(p2, 2) + c2d * Math.Pow(p2, 1);
h3 = c3a * Math.Pow(p3, 4) + c3b * Math.Pow(p3, 3) + c3c * Math.Pow(p3, 2) + c3d * Math.Pow(p3, 1);
h4 = c4a * Math.Pow(p4, 4) + c4b * Math.Pow(p4, 3) + c4c * Math.Pow(p4, 2) + c4d * Math.Pow(p4, 1);

}
}

[/css]

シリアルの受信を含めて、たったのこれだけです。
上で配布しているプロジェクトにはビジュアライズする例が含まれています。是非、色々な物を作ってみてください。
また、PCレスで使用する際も、変位への変換(兼キャリブレーション)の計算は同様ですので、参考にしてみてください。

PAWセンサ
PAWセンサ用ケーブル
mbed NXP LPC1768

タイトルとURLをコピーしました