obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますAWS Lambdaからサーボを動作させるサンプルが動作しない
-
https://obniz.com/ja/doc/guides/nodejs/aws-lambda
に記載のサーボを動作させるサンプルを実行したところ、以下の問題が発生しました。
①callbackが返らず?タイムアウトになる
②サーボが回ったり、回らなかったりする。obnizOSは3.4.4
aws側のNode.jsは14.xを選択。作成側は14.16.1を利用。
タイムアウトは15秒としています。await obniz.wait(500)をコメントアウトすると、callbackは返ってくるのですが原因がわかりませんでした。
解決する手法を教えていただけないでしょうか。
-
context.callbackWaitsForEmptyEventLoop = false;
を設定すれば、Node.js イベントループが空になるまで待機せずにコールバックが返るため、とりあえずタイムアウトしなくなる。
-
context.callbackWaitsForEmptyEventLoop = false;
にてコールバックが変えるようになったことから、プログラムは正常に動いていて、obniz.close後のコネクションのリトライにてイベントループが発生していると思われます。こちらはobniz.js 3.14.0にて修正した項目になりますので、最新のobniz.jsにて試して頂けないでしょうか。
また、
②サーボが回ったり、回らなかったりする。
こちらについては、いくつか考えられますが
-
プログラム実行前のサーボモータの状態によっては動かないことがあります。
サーボモーターは角度を指定するモーターになっていますので、もともとその角度の状態になっていた場合は、動かず、そのままの状態になります。 -
サーボモーターへの指示を出してから切断(obniz.close)までの時間が短すぎて、サーボモーターが回る前に切断されている可能性があります。obniz.wait(500);などをobniz.close()の前に設定いただければと思います。
obnizBoardではコネクションがつながったらQR表示がPinAssignの表示に変わりますので、コネクションが張られているかどうかの参考にしていただければと思います。
-
-
遅くなりました。回答ありがとうございます。
ですが・・・①の現象は治らずでした。
以下、試したソースコードになります。
※サーボの制御は消しています。
※auto_connect: falseにし、obniz.connect();を追加したものも試しましたが、現象変わらずでした。var Obniz = require("obniz"); exports.handler = function(event, context, callback) { var obniz = new Obniz("ID"); obniz.onconnect = async function () { await obniz.wait(500) obniz.close(); callback(null, "success"); }; };
また使用しているobniz.jsは3.15.1になります。
念のため、npm listの結果を添付します。└─┬ obniz@3.15.1 ├── @types/tv4@1.2.30 ├─┬ @types/ws@6.0.4 │ └── @types/node@15.6.0 ├── eventemitter3@3.1.2 ├─┬ js-yaml@3.14.1 │ ├─┬ argparse@1.0.10 │ │ └── sprintf-js@1.0.3 │ └── esprima@4.0.1 ├─┬ node-dir@0.1.17 │ └─┬ minimatch@3.0.4 │ └─┬ brace-expansion@1.1.11 │ ├── balanced-match@1.0.2 │ └── concat-map@0.0.1 ├── node-fetch@2.6.1 ├── semver@5.7.1 ├── tv4@1.3.0 └─┬ ws@6.2.1 └── async-limiter@1.0.1