繰返し制御whileについて

4 件の投稿を閲覧中 - 1 ~ 4 件(全 4 件)
  • 著者
    投稿
  • #5839
    ORIteck CO., LTD
    一般参加者

    Arduinoを使用し、MZではSerial通信コンポーネントを使用したセンシングを行う試作アプリの作成をしています。
    スケッチ上は、void loop()内で、Serial.read()での引数の一致でセンシングを開始しSerial.printするプログラムです。

    MZからのSerial.read()への送信に、繰返し制御(WHILE)コンポーネントを使用しているのですが、停止ができません。

    ボタンのアクションイベントで制御を開始し、ボタンのアクションイベントで停止させたい。

    FQA-スレッドアロケータ回答1-を参考に、開始ボタンのアクションイベントでスレッドアロケータを使用し、その中で繰返し制御をする。停止ボタンのアクションイベントで繰返し制御に続行可否falseを渡して停止する。

    添付アプリでは、停止するのですが、本来実現したい、繰返し制御(WHILE)コンポーネントのアクションイベントに、シリアル通信コンポーネントを繋ぎ(ポートに文字列データを出力する)で、シリアル通信コンポーネントのデータ生成イベントでテキストフィールドコンポーネントにイベント内包、イベント対象データでテキストを設定するでは、停止しません。テキストフィールドへのセンシング結果の書き換えが続きます。

    #5841
    MZPlatformユーザー会
    サイト管理者

    繰返し制御(While)は適切に使うのが難しいコンポーネントですので、あまりおすすめできません。

    代わりに、タイマーコンポーネントを使用してはいかがでしょうか。

    ボタンを押したらタイマーを開始し、ボタンを押したらタイマーを停止することが可能で、タイマーのアクションは別スレッドになります。タイマーが動作する間隔がご希望通りにできるかは状況次第ですが、ぜひご検討ください。

    #5843
    ORIteck CO., LTD
    一般参加者

    タイマーコンポーネントの使用も頭にはあったのですが、同じことをしているのに結果が違うと疑問を払いたくなり質問した次第です。繰返し制御(WHILE)は諦めます。

    タイマーコンポーネントを使用しましたが、タイマーコンポーネントの設定間隔とスケッチのloop()内delay()の設定間隔でかなり結果の挙動が違います。

    『タイマーが動作する間隔がご希望通りにできるかは状況次第ですが』この懸念のことでしょうか?

    スケッチや通信環境にもよるのでしょうが、現状は、タイマーコンポーネントの間隔とスケッチのdelay()の間隔が同じもしくは近い値だと、タイマーコンポーネントを停止しても数秒間、シリアル通信コンポーネントの生成イベントが返ってきます。

    タイマーコンポーネントの間隔を長くし、スケッチのdelay()を短くすると問題ありません。

    具体的には、
    タイマーコンポーネント500msec、delay(500)はNG。
    タイマーコンポーネント1000msec、delay(500)はNG。
    タイマーコンポーネント2000msec、delay(500)はOK。
    こんな感じなんですが、こんなもんだと理解する以外ありませんか?

    #5845
    MZPlatformユーザー会
    サイト管理者

    状況次第で詳細はわかりませんが、読んでいる感じだとその結果は妥当だと思います。

    基本的に、Arduino側は極力delayを短くしてください。挙動がおかしくなる場合はある程度の時間を確保した方がよいですが、特に制限がないのであれば、ほぼリアルタイムに反応してくれるようにした方が良いです。0.5秒待つということは、それだけ反応が遅くなるということです。止めたつもりなのにイベントが発生するのはそのせいです。マイコンとセンサの通信に多少時間を空けた方が良い場合もありますが、それでも50msとかだと思います。

    MZのタイマー側は、どのぐらいの間隔でセンサーの値を更新したいかという設定になります。1秒間隔でほしいのか、0.1秒間隔でほしいのかを考えて設定してください。もっと長くて良いなら、長く設定すればよいです。問題になるのは短い場合で、Arduino側の処理時間がタイマーの間隔より長くなってしまうと、正常に動作しない感じになります。

4 件の投稿を閲覧中 - 1 ~ 4 件(全 4 件)
  • このトピックに返信するには、ログインしてください。