builderscon 2018 day 2
https://builderscon.io/tokyo/2018/session/58b03ed2-91a5-4f94-84fd-363e799efa38
ハードウェアをE2Eテストできないなんて誰が言った?- IoTのテストを自動化するメソッド 〜HW編〜@ksksue
View Slide
自己紹介す〜twitter : @ksksue所属:(株)Photosynth (Akerun) 回路設計、Node.js
HWテスト1.機能テスト2.耐久テスト ・優秀なエンジニアが作った100 回テストされたHW ・平凡なエンジニアが作った100万回テストされたHW
・HWは不確実性が多い
効率よくテストするtime100万回 テスト100万回 テスト100万回 テストテストAテストBテストC環境構築環境構築環境構築
環境構築とテスト環境構築環境構築 環境構築100万回 テスト100万回 テスト100万回 テスト
環境構築とテスト環境構築環境構築 環境構築100万回 テスト100万回 テスト100万回 テスト価値
環境構築とテスト環境構築環境構築 環境構築100万回 テスト100万回 テスト100万回 テスト価値がんばらない
HWテスト自動化ポイント・いかに時間をかけずにテスト環境構築するか・並行してSWチームメンバにテスト環境を作ってもらう ・使いやすいHWインタフェースを用意する
HWテスト環境〜弊社の場合〜
テスト環境 基本構成USBシリアル通信センサアクチュエータセンサアクチュエータWifi/ Ethテスト対象RPiArduino
効率よくテスト環境構築するためのツールRaspberry Pi 3 model B+10,000円弱(電源、SDカード込)Debian linux (ARM)Wifi/Ethernet : クラウド連携Bluetooth v4.2Arduino(Seeeduino v4.2)約1000円センサ、アクチュエータ系のドライバ豊富Groveシリーズ
RPi + Arduinoは相性が良いRaspberry Pi 3model B+Arduino(Seeeduino)両方ネットワーク環境 ◯ 5GHz/2.4GHzWifi/Eth△ ネットワーク環境なし (別モジュール追加)開発環境 ◯ 複数プログラミング言語環境△ 基本C/C++言語UI ◯ リッチなUI△ 簡単なUIHW連携 △ センサ/アクチュエータ系 ドライバ 少数◯ センサ/アクチュエータ系 ドライバ 多数
サクッと環境構築(RPi)1. PCでmicroSDカードにイメージ書込$ sudo dd bs=4m if=2018-06-27-raspbian-stretch.img \of=/dev/rdisk22. 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
サクッと環境構築(Arduino)1. PC上にArduino IDEをインストール2. プログラミング3. PCとArduinoをUSBで接続4. スケッチ(コード)を流し込む
キーワード検索Arduino IDE
シンプルな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.');});RPisample.js
HWテスト環境 実装編
ArduinoArduinoRPiアクチュエータ(モーター)センサ
ArduinoRPiアクチュエータ(モーター)センサArduino
テストシナリオ例for( i=0; i < TEST_LOOP_NUM; i++) {・クラウド経由で解錠する・ドア閉まったら施錠する}・施解錠の回数を確認・エラー率を確認
ドアセンサ
サーボモーター(角度制御モーター)SG-5010850円 #include #define SERVO_PIN 3Servo servo;void setup() {servo.attach(SERVO_PIN);}void loop() {servo.write(90);delay(1000);servo.write(0);delay(1000);}Arduinohttp://akizukidenshi.com/catalog/g/gM-08913/
赤外線レーザー型 距離センサVL53L0X Time-of-Flight距離センサモジュールhttps://www.switch-science.com/catalog/2894/#include #include 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
シリアル通信内容?USBシリアル通信センサアクチュエータセンサアクチュエータWifi/ Ethテスト対象RPiArduino
シリアル通信内容?USBシリアル通信センサアクチュエータセンサアクチュエータWifi/ Ethテスト対象RPiArduinojsonnodejs
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 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通信charbooleanintfloat[]
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);}});RPilib/aio.jsRPitestapp.js改行をデリミタにしてパースJSONパースevent emitter
結果予測施解錠回数時間障害
リチウム電池の放電特性電池電圧使用期間
放電特性と施解錠回数の実測値電池電圧施解錠回数
まとめ・HWテスト耐久テスト大事・ただしテスト環境構築がんばらない・RPi / Arduinoでサクッと作ろう・HWインタフェースはSW開発者に合わせると幸せ