加速度センサーを使い、「人の動きと連動して動作するUWPアプリ」を作るラズパイ3&Toradex、Windows 10 IoT Coreで楽しみながら検証するIoT実践入門(4)(2/3 ページ)

» 2016年06月16日 05時00分 公開
[薬師寺国安PROJECT KySS]

「AccelerometerScript.cs」「TextScript.cs」のコードを記述する

 今回は、マイクロソフトのGitHub Pagesに登録されているWindows 10 IoT Coreの開発者向けサンプルである「samples-develop.zip」の、Accelerometerフォルダにあるサンプルコードをベースに、今回のUWPアプリ用に追記・改変していくことにする。

 Unity 5.3で書き出したUWPのプロジェクトファイルをVS2015で開き、「AccelerometerScript.cs」を以下のように修正する。コードの文字列はかなり長いが、該当するコードの近くにコメントアウトで解説を追記しているので、必要に応じて参照してほしい。

  1. using UnityEngine;
  2. using System;
  3. using System.Threading;
  4. using Windows.Devices.Enumeration;
  5. /*アプリケーションから内蔵回路 (i 2 c) バスを介して接続された周辺機器との通信に使用する型が含*まれているWindows.Device.12c名前空間を読み込む*/
  6. using Windows.Devices.I2c;
  7. /*doube型の変数X、Y、Zを定義したAccelerationという構造体を定義しておく*/
  8. struct Acceleration
  9. {
  10. public double X;
  11. public double Y;
  12. public double Z;
  13. };
  14. /*Protocol列挙体を宣言してI2Cで初期化しておく*/
  15. enum Protocol { I2C };
  16. public class AccelerometerScrpt : MonoBehaviour
  17. {
  18. /*プロトコルにはI2Cを指定*/
  19. private Protocol HW_PROTOCOL = Protocol.I2C;
  20. /*各レジスタのアドレスについては下記のPDFの22ページ目の「レジスタ・マップ」を参照のこと*/
  21. /* http://akizukidenshi.com/download/ds/freescale/ADXL345_jp.pdf*/
  22. /* 電力制御レジスタのアドレスを指定*/
  23. private const byte ACCEL_REG_POWER_CONTROL = 0x2D;
  24. /* データ形式レジスタのアドレスを指定 */
  25. private const byte ACCEL_REG_DATA_FORMAT = 0x31;
  26. /* X軸のデータレジスタのアドレスを指定*/
  27. private const byte ACCEL_REG_X = 0x32;
  28. /* Y軸のデータレジスタのアドレスを指定*/
  29. private const byte ACCEL_REG_Y = 0x34;
  30. /* Z軸のデータレジスタのアドレスを指定 */
  31. private const byte ACCEL_REG_Z = 0x36;
  32. /*今回使用する加速度センサーのアドレスを指定*/
  33. private const byte ACCEL_I2C_ADDR = 0x53;
  34. private I2cDevice I2CAccel;
  35. private Timer periodicTimer;
  36.    /*TextScript.cs内でも使用する変数であるため、グローバルな変数として宣言しておく*/
  37.    /*各変数には加速度センサーのX、Y、Zの値が格納される*/
  38. public static double xValue;
  39. public static double yValue;
  40. public static double zValue;
  41. /*四次元数の回転を表すメンバー変数accelerationを宣言する*/
  42. private Quaternion acceleration;
  43. void Start()
  44. {
  45. /* I2Cバス、加速度計、およびタイマーを初期化するInitAccel()メソッドを実行する */
  46. InitAccel();
  47. }
  48. void Update()
  49. {
  50.        /*別スレッドからAccelerometerValueメソッドを1秒ごとに呼び出す*/
  51. Invoke("AccelerometerValue", 1.0f);
  52. }
  53. /*Update()メソッドより常に呼び出されるAccelerometerValueメソッド*/
  54. private void AccelerometerValue()
  55. {
  56. /*float型に変換した加速度センサーの各値を指定し、その値に応じてCubeを回転させる*/
  57.     /*引数には、X、Y、Z、Wの値が必要だが、今回Wの値は不要なので、0.0fと指定しておく*/
  58. acceleration.x = (float)xValue;
  59. acceleration.y = (float)yValue;
  60. acceleration.z = (float)zValue;
  61. transform.rotation = new Quaternion(acceleration.x, acceleration.y, acceleration.z, 0.0f);
  62. }
  63. /* I2Cバス、加速度計、およびタイマーを初期化する処理 */
  64. private void InitAccel()
  65. {
  66. /* プロトコルと加速度計を初期化する */
  67. switch (HW_PROTOCOL)
  68. {
  69.         /*プロトコルがI2Cの時にはInitI2CAccel()メソッドを実行する*/
  70. case Protocol.I2C:
  71. InitI2CAccel();
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77.   /*プロトコルがI2Cの時に実行される処理*/
  78. private async void InitI2CAccel()
  79. {
  80. try
  81. {
  82. /*加速度センサーのアドレスを2cConnectionSettingsに指定する*/
  83. var settings = new I2cConnectionSettings(ACCEL_I2C_ADDR);
  84. /*バス速度を400 kHzに指定する */
  85. settings.BusSpeed = I2cBusSpeed.FastMode;
  86.          /* システム上のすべてのI2Cコントローラーを返す、セレクタ文字列を取得する。 */
  87. string aqs = I2cDevice.GetDeviceSelector();
  88.      /* 択されたバスコントローラとI2C設定された、I2Cデバイスを作成する。*/
  89. var dis = await DeviceInformation.FindAllAsync(aqs); I2CAccel = await I2cDevice.FromIdAsync(dis[0].Id, settings);
  90. if (I2CAccel == null)
  91. {
  92. return;
  93. }
  94. }
  95. catch
  96. {
  97. return;
  98. }
  99. /*加速度計を初期化し、2バイトの書き込みバッファを作成する*/
  100.       /*0x01のセットは±4GSの範囲になる */
  101. byte[] WriteBuf_DataFormat = new byte[] { ACCEL_REG_DATA_FORMAT, 0x01 };
  102.      /*0x08は、測定モードに加速度計を置く*/
  103. byte[] WriteBuf_PowerControl = new byte[] { ACCEL_REG_POWER_CONTROL, 0x08 };
  104. /* レジストリ設定を書きこむ */
  105. try
  106. {
  107. I2CAccel.Write(WriteBuf_DataFormat);
  108. I2CAccel.Write(WriteBuf_PowerControl);
  109. }
  110. /* 書き込みに失敗した場合は実行を停止する */
  111. catch
  112. {
  113. return;
  114. }
  115. /*100ms毎のデータを読み取るようにタイマーを作成、初期化する*/
  116. periodicTimer = new Timer(this.TimerCallback, null, 0, 100);
  117. }
  118.   /*タイマーから呼び出されるTimerCallback()メソッド処理*/
  119. private void TimerCallback(object state)
  120. {
  121. /* 読み取りおよびフォーマット加速度計データ処理 */
  122. try
  123. {
  124. /*Acceleration型のaccel変数にReasAccel()メソッドの戻り値を格納する*/
  125. Acceleration accel = ReadAccel();
  126.        /*各変数に、戻り値からX、Y、Zを取得して格納する*/
  127. xValue = accel.X;
  128. yValue = accel.Y;
  129. zValue = accel.Z;
  130. }
  131. catch
  132. {
  133. return;
  134. }
  135. }
  136.   /*TimerCallbackから呼び出されるReadAccell()メソッド処理*/
  137. private Acceleration ReadAccel()
  138. {
  139. /* ADXL345は、1024のユニークな値を与える10ビットの解像度を持つ*/
  140. const int ACCEL_RES = 1024;
  141.       /* ADXL345は、8Gの合計ダイナミックレンジを持っている*/
  142. const int ACCEL_DYN_RANGE_G = 8;
  143.       /*Gユニットにrawのint型の比の値を設定する*/
  144. const int UNITS_PER_G = ACCEL_RES / ACCEL_DYN_RANGE_G;
  145. byte[] ReadBuf;
  146. byte[] RegAddrBuf;
  147. /* 加速度センサーからの読み込み。第1のX軸レジスタのアドレスを書き込み、
  148. *ReadBufにI2Cの軸を読みむ*/
  149. switch (HW_PROTOCOL)
  150. {
  151. case Protocol.I2C:
  152.             /*32バイトの軸を得るために6バイト順次読み出す*/
  153. ReadBuf = new byte[6];
  154.            /*読み込んだアドレスを登録する*/
  155.     RegAddrBuf = new byte[] { ACCEL_REG_X };
  156. I2CAccel.WriteRead(RegAddrBuf, ReadBuf);
  157. break;
  158. default:
  159. ReadBuf = new byte[6];
  160. break;
  161. }
  162. /* システムのエンディアンを確認し、必要に応じてバイトを反転する*/
  163. if (!BitConverter.IsLittleEndian)
  164. {
  165. Array.Reverse(ReadBuf, 0, 2);
  166. Array.Reverse(ReadBuf, 2, 2);
  167. Array.Reverse(ReadBuf, 4, 2);
  168. }
  169.     /* rawの16ビットデータ値を得るために、各軸(X、Y、Z)の2つの8ビットバイトを連結する*必要がある
  170. */
  171. short AccelerationRawX = BitConverter.ToInt16(ReadBuf, 0);
  172. short AccelerationRawY = BitConverter.ToInt16(ReadBuf, 2);
  173. short AccelerationRawZ = BitConverter.ToInt16(ReadBuf, 4);
  174. /*rawの値をGに変換する*/
  175. Acceleration accel;
  176. accel.X = (double)AccelerationRawX / UNITS_PER_G;
  177. accel.Y = (double)AccelerationRawY / UNITS_PER_G;
  178. accel.Z = (double)AccelerationRawZ / UNITS_PER_G;
  179.      /*accelを戻り値とする*/
  180. return accel;
  181. }
  182. }
リスト1 修正した「AccelerometerScript.cs」の中身

 修正箇所は以下の通りだ。

photo
photo
photo
photo

 続いて、「TextScript.cs」のコードも記述する(次ページのリスト2)。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Server & Storage 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー

髫エ蟷「�ス�ャ髫エ魃会スス�・髫エ蟶キ�」�ッ闖ォ�」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。