$30 off During Our Annual Pro Sale. View Details »

ハードウェアをE2Eテストできないなんて誰が言った? - IoTのテストを自動化するメソッド 〜HW編〜

su-
September 08, 2018

ハードウェアをE2Eテストできないなんて誰が言った? - IoTのテストを自動化するメソッド 〜HW編〜

su-

September 08, 2018
Tweet

Other Decks in Technology

Transcript

  1. ハードウェアをE2Eテストできないなんて誰が 言った? - IoTのテストを自動化するメソッド 〜HW編〜 @ksksue

  2. 自己紹介 す〜 twitter : @ksksue 所属:(株)Photosynth (Akerun) 回路設計、Node.js

  3. HWテスト 1.機能テスト 2.耐久テスト  ・優秀なエンジニアが作った100 回テストされたHW  ・平凡なエンジニアが作った100万回テストされたHW

  4. ・HWは不確実性が多い

  5. 効率よくテストする time 100万回 テスト 100万回 テスト 100万回 テスト テストA テストB

    テストC 環境構築 環境構築 環境構築
  6. 環境構築とテスト 環境構築 環境構築 環境構築 100万回 テスト 100万回 テスト 100万回 テスト

  7. 環境構築とテスト 環境構築 環境構築 環境構築 100万回 テスト 100万回 テスト 100万回 テスト

    価値
  8. 環境構築とテスト 環境構築 環境構築 環境構築 100万回 テスト 100万回 テスト 100万回 テスト

    価値 がんばらない
  9. HWテスト自動化ポイント ・いかに時間をかけずにテスト環境構築するか ・並行してSWチームメンバにテスト環境を作ってもらう  ・使いやすいHWインタフェースを用意する  

  10. HWテスト環境 〜弊社の場合〜

  11. テスト環境 基本構成 USB シリアル通 信 センサ アクチュ エータ センサ アクチュ

    エータ Wifi / Eth テスト 対象 RPi Arduino
  12. 効率よくテスト環境構築するためのツール Raspberry Pi 3 model B+ 10,000円弱(電源、SDカード込) Debian linux (ARM)

    Wifi/Ethernet : クラウド連携 Bluetooth v4.2 Arduino(Seeeduino v4.2) 約1000円 センサ、アクチュエータ系のドライバ豊富 Groveシリーズ
  13. RPi + Arduinoは相性が良い Raspberry Pi 3 model B+ Arduino (Seeeduino)

    両方 ネットワーク環境 ◯  5GHz/2.4GHzWifi/Eth △  ネットワーク環境なし  (別モジュール追加) 開発環境 ◯  複数プログラミング言語環境 △  基本C/C++言語 UI ◯  リッチなUI △  簡単なUI HW連携 △  センサ/アクチュエータ系  ドライバ 少数 ◯  センサ/アクチュエータ系  ドライバ 多数
  14. サクッと環境構築(RPi) 1. PCでmicroSDカードにイメージ書込 $ sudo dd bs=4m if=2018-06-27-raspbian-stretch.img \ of=/dev/rdisk2

    2. RPiにmicroSD挿し電源投入 3. 最初だけネット接続とsshd起動 4. RPiにnodejs環境インストール $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - $ sudo apt-get install -y nodejs
  15. サクッと環境構築(Arduino) 1. PC上にArduino IDEをインストール 2. プログラミング 3. PCとArduinoをUSBで接続 4. スケッチ(コード)を流し込む

  16. キーワード検索 Arduino IDE

  17. シンプルなHWインタフェースを心がける var aio = require('./lib/aio'); // Lock/Unlock イベントによるデータ取得 aio.on('lockEvent', (data)

    => { console.log(data); }); // getによるデータ取得 aio.get((err, data) => { console.log(data); }); // ドアセンサをClose状態にする aio.doorSensorClose(() => { console.log('closed.'); }); // ドアセンサをOpen状態にする aio.doorSensorOpen(() => { console.log('open.'); }); RPi sample.js
  18. HWテスト環境 実装編

  19. None
  20. Arduino Arduino RPi アクチュエータ (モーター) センサ

  21. Arduino RPi アクチュエータ (モーター) センサ Arduino

  22. テストシナリオ例 for( i=0; i < TEST_LOOP_NUM; i++) { ・クラウド経由で解錠する ・ドア閉まったら施錠する

    } ・施解錠の回数を確認 ・エラー率を確認
  23. ドアセンサ

  24. None
  25. None
  26. サーボモーター(角度制御モーター) SG-5010 850円 #include <Servo.h> #define SERVO_PIN 3 Servo servo;

    void setup() { servo.attach(SERVO_PIN); } void loop() { servo.write(90); delay(1000); servo.write(0); delay(1000); } Arduino http://akizukidenshi.com/catalog/g/gM-08913/
  27. None
  28. None
  29. None
  30. None
  31. None
  32. 赤外線レーザー型 距離センサ VL53L0X Time-of-Flight 距離センサモジュール https://www.switch-science.com/catalog/2894/ #include <Wire.h> #include <VL53L0X.h>

    VL53L0X dist_sensor; bool lockState = false; void setup() { dist_sensor.init(); dist_sensor.setTimeout(VL53L0X_TIMEOUT); dist_sensor.startContinuous(); } void loop() { int dist = dist_sensor.readRangeContinuousMillimeters(); if(dist => THRESH_HI) { lockState = false; } else if(dist < THRESH_LO) { lockState = true; } delay(1000); } Arduino
  33. シリアル通信内容? USB シリアル通 信 センサ アクチュ エータ センサ アクチュ エータ

    Wifi / Eth テスト 対象 RPi Arduino
  34. シリアル通信内容? USB シリアル通 信 センサ アクチュ エータ センサ アクチュ エータ

    Wifi / Eth テスト 対象 RPi Arduino json nodejs
  35. ArduinoからRPiへjsonをシリアル通信 { eventName: 'lockEvent',isLocked: true,lockCount:1,powerVolt:[3.292765,3. 300197,3.299182]} /* pretty { eventName:

    'lockEvent', isLocked: true, lockCount: 1, powerVolt: [3.292765, 3.300197, 3.299182] } */ #include <ArduinoJson.h> StaticJsonBuffer<512> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["eventName"] = "lockEvent"; if(lock_unlock_get_status() == 0) { root["isLocked"] = true; } else { root["isLocked"] = false; } root["lockCount"] = lock_unlock_get_count(); JsonArray& p_volt = root.createNestedArray("powerVolt"); p_volt.add(adc_get_power_v(0)); p_volt.add(adc_get_power_v(1)); p_volt.add(adc_get_power_v(2)); root.printTo(Serial); Arduino Serial通信 char boolean int float[]
  36. RPi内で処理 var aio = require('./lib/aio'); // Lock/Unlock イベントによるデータ取得 aio.on('lockEvent', (data)

    => { console.log(data); }); /* { eventName: 'lockEvent', isLocked: true, lockCount: 1, powerVolt: [3.292765, 3.300197, 3.299182] } */ var SerialPort = require('serialport'); var port = new SerialPort(portName); var parser = new SerialPort.parsers.Readline(); port.pipe(this.parser); parser.on('data', (data) => { var res; try { res = JSON.parse(data.toString('utf-8')); } catch(e) { return; } if(res.eventName) { this.emit(res.eventName, res); } }); RPi lib/aio.js RPi testapp.js 改行をデリミタにしてパース JSONパース event emitter
  37. 結果予測 施解錠回数 時間 障害

  38. リチウム電池の放電特性 電池電圧 使用期間

  39. 放電特性と施解錠回数の実測値 電池電圧 施解錠回数

  40. まとめ ・HWテスト耐久テスト大事 ・ただしテスト環境構築がんばらない ・RPi / Arduinoでサクッと作ろう ・HWインタフェースはSW開発者に合わせると幸せ

  41. None
  42. None
  43. None
  44. None
  45. None