Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ハードウェアを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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 効率よくテストする
    time
    100万回 テスト
    100万回 テスト
    100万回 テスト
    テストA
    テストB
    テストC
    環境構築
    環境構築
    環境構築

    View Slide

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

    View Slide

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

    View Slide

  8. 環境構築とテスト
    環境構築
    環境構築 環境構築
    100万回 テスト
    100万回 テスト
    100万回 テスト
    価値
    がんばらない

    View Slide

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

    View Slide

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

    View Slide

  11. テスト環境 基本構成
    USB
    シリアル通

    センサ
    アクチュ
    エータ
    センサ
    アクチュ
    エータ
    Wifi
    / Eth
    テスト
    対象
    RPi
    Arduino

    View Slide

  12. 効率よくテスト環境構築するためのツール
    Raspberry Pi 3 model B+
    10,000円弱(電源、SDカード込)
    Debian linux (ARM)
    Wifi/Ethernet : クラウド連携
    Bluetooth v4.2
    Arduino(Seeeduino v4.2)
    約1000円
    センサ、アクチュエータ系のドライバ豊富
    Groveシリーズ

    View Slide

  13. RPi + Arduinoは相性が良い
    Raspberry Pi 3
    model B+
    Arduino
    (Seeeduino)
    両方
    ネットワーク環境 ◯
     5GHz/2.4GHzWifi/Eth

     ネットワーク環境なし
     (別モジュール追加)
    開発環境 ◯
     複数プログラミング言語環境

     基本C/C++言語
    UI ◯
     リッチなUI

     簡単なUI
    HW連携 △
     センサ/アクチュエータ系
     ドライバ 少数

     センサ/アクチュエータ系
     ドライバ 多数

    View Slide

  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

    View Slide

  15. サクッと環境構築(Arduino)
    1. PC上にArduino IDEをインストール
    2. プログラミング
    3. PCとArduinoをUSBで接続
    4. スケッチ(コード)を流し込む

    View Slide

  16. キーワード検索
    Arduino IDE

    View Slide

  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

    View Slide

  18. HWテスト環境 実装編

    View Slide

  19. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. ドアセンサ

    View Slide

  24. View Slide

  25. View Slide

  26. サーボモーター(角度制御モーター)
    SG-5010
    850円 #include
    #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/

    View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. 赤外線レーザー型 距離センサ
    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

    View Slide

  33. シリアル通信内容?
    USB
    シリアル通

    センサ
    アクチュ
    エータ
    センサ
    アクチュ
    エータ
    Wifi
    / Eth
    テスト
    対象
    RPi
    Arduino

    View Slide

  34. シリアル通信内容?
    USB
    シリアル通

    センサ
    アクチュ
    エータ
    センサ
    アクチュ
    エータ
    Wifi
    / Eth
    テスト
    対象
    RPi
    Arduino
    json
    nodejs

    View Slide

  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
    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[]

    View Slide

  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

    View Slide

  37. 結果予測
    施解錠回数
    時間
    障害

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  41. View Slide

  42. View Slide

  43. View Slide

  44. View Slide

  45. View Slide