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

79ad93af49daf0b5bda635087cd032c8?s=47 su-
September 08, 2018

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

79ad93af49daf0b5bda635087cd032c8?s=128

su-

September 08, 2018
Tweet

Transcript

  1. 12.

    効率よくテスト環境構築するためのツール Raspberry Pi 3 model B+ 10,000円弱(電源、SDカード込) Debian linux (ARM)

    Wifi/Ethernet : クラウド連携 Bluetooth v4.2 Arduino(Seeeduino v4.2) 約1000円 センサ、アクチュエータ系のドライバ豊富 Groveシリーズ
  2. 13.

    RPi + Arduinoは相性が良い Raspberry Pi 3 model B+ Arduino (Seeeduino)

    両方 ネットワーク環境 ◯  5GHz/2.4GHzWifi/Eth △  ネットワーク環境なし  (別モジュール追加) 開発環境 ◯  複数プログラミング言語環境 △  基本C/C++言語 UI ◯  リッチなUI △  簡単なUI HW連携 △  センサ/アクチュエータ系  ドライバ 少数 ◯  センサ/アクチュエータ系  ドライバ 多数
  3. 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
  4. 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
  5. 19.
  6. 24.
  7. 25.
  8. 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/
  9. 27.
  10. 28.
  11. 29.
  12. 30.
  13. 31.
  14. 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
  15. 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[]
  16. 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
  17. 41.
  18. 42.
  19. 43.
  20. 44.
  21. 45.