LeapmotionとArduinoとCylon.jsでFirmataを利用して連続サーボの回転方向を制御する!俺のフォースを感じろ!
まずこちらのビデオをご覧ください。
これも、相当の力作のはずです!笑。
と言って、自分中では、色々初めての勉強がたくさんありました!
目次
LeapmotionとArduinoとCylon.jsでFirmataを利用して連続サーボの回転方向を制御する!
Leapmotionは、みなさんご存知ですが
https://developer-archive.leapmotion.com/

手の動作さ、指、ジェスチャーなど様々の特徴量を検出できて、高度なセンサーと言えます。
USBで繋いて、すぐ使えます。

中に二つの赤外線カメラと赤外線照射LEDが内蔵されていて、手の画像を撮って画像解析によって3D空間での手や指の位置を割り出しデータに変換してくれます。


3D空間の手の形や、向き、動きなど様々なデータを取れますので
そのデータを利用して、様々な制御もできるはずです。
こんな高度なセンサーが本当に貴重です。
私も実はLeap Motionはだいぶ前(2年前?)購入していましたが
ずっと触る時間をなかなか作れなくて
今日は、まずその実験の第一弾をご紹介したいと思います!
接続
必要なものはパソコン:一台
Leapmotion:一個
Arduino uno(mini もmegaも動くはずです、もちろん互換機も):一個
連続回転サーボ:一台
LED:一つ
USBハブ(オプション):一台
注意、USBハブで接続する場合は、usbのポートのアドレスが刺すところによって変わりますので、それに合わせて、プログラムを変更する必要があります。後ほど、ご説明します。
ジャンパーワイア:数本
LED
LED GNDとPIN 13に接続します。
すぐ隣なので、LEDをそのままArduinoにさします。

連続サーボのGND –> Arduino GND
連続サーボのV –> Arduino 5V
連続サーボのS –> Arduino Pin 3



ソフトウェア
今回のプログラムの最大な特徴はCylon.jsです!

もちろん、IoTのJavaScript フレームワークと言えばもう一つjohnny-fiveもありますが

johnny-fiveを使っての実験はまた別途実施して記事を書きたいと思います。
連続回転サーボの動かし方:
https://cylonjs.com/documentation/drivers/continuous-servo/
連続回転サーボを動かす実験はこの辺の記事もご参照ください。
Leap Motionの使い方:
https://cylonjs.com/documentation/drivers/leapmotion/
手の様々な情報を取得する方法のドキュメントです:
Firmata
今回のプログラムは、Arduinoに焼くのではなく
パソコンとArduino通信しながら、Arduinoに動作させる形式なので
全てのプログラムを実行するには
まず、Standard Frimataを一回Arduinoに焼いておく(アップロード)必要があります。
あなたのArduino IDEを起動して、例のスケッチからStandardFirmataを選んで、Arduino本体にアップロードします。



これでArduinoの本体の準備もOKです。
プログラムの準備
まず好きなところで、フォルダーを作ってください。
mkdir leapmotion
package.jsonを用意します。
{
"name": "leapmotion",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"cylon-firmata": "^0.24.0",
"cylon": "^1.3.0",
"cylon-i2c": "^0.26.1",
"cylon-gpio": "^0.30.1",
"cylon-leapmotion": "^0.21.0",
"leapmotion": "^0.0.4"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
今回のプログラムが必要なパッケージをインストールします。
npm install
プログラム
今回使うプログラムを作ります。
nano app.js
下記の内容をコピーします。
"use strict";
var Cylon = require("cylon");
Cylon.robot({
connections: {
arduino: {
adaptor: "firmata",
port: "/dev/tty.usbmodem1411"
},
leap: {
adaptor: "leapmotion"
}
},
devices: {
servo: {
driver: 'continuous-servo',
pin: 3
},
led: {
driver: "led",
pin: 13,
connection: "arduino"
},
leapmotion: {
driver: "leapmotion",
connection: "leap"
}
},
work: function (my) {
var type = '';
my.leapmotion.on("frame", function (frame) {
//console.log(frame.toString());
if (frame.hands.length > 0) {
my.led.turnOn();
} else {
my.led.turnOff();
}
});
my.leapmotion.on("hand", function (hand) {
type=hand.type;
console.log(type);
});
var clockwise = true;
my.servo.clockwise();
every((1).second(), function() {
if (type == "left") {
my.servo.counterClockwise();
clockwise = false;
} else {
my.servo.clockwise();
clockwise = true;
}
});
}
}).start();
上にも言いましたが、ここで、一つ注意していただきたいところがありまして
port: “/dev/tty.usbmodem1411”
この一行で、arduinoのusbのポートを指定しますが
あなたの環境と私の環境では、違う名前になっているかもしれませんので
必ず、チェックしてみてください。
あなたの環境のusbポートのアドレスに合わせて修正してください。
(例えば、私がUSBハブに接続した時は、ポートのアドレスが “/dev/tty.usbmodem141111″になっていました。)

実行

保存して、実行します!
node app.js



俺のフォースを感じろ!
このセンサーの上に左手と右手交互にかざしてみてください!
回転サーボの回転方向が変わります!

感動の瞬間です!
ビデオ証拠もあります!ご覧ください!
今回は、leapmotionをJavaScriptで制御することを簡単に検証しましたが
今回、左手、右手の判定データしか使っていなくて、シンプルな動作になっていますが
実際、Leapmotionが取れるデータがとても高度で、それを適用していけば
相当高度な面白いものも作れるはずですので
次回発展系を挑戦してみたいと思います!
ではまた!
[amazonjs asin=”B00GWCATS8″ locale=”JP” title=”【国内正規代理店品】 Leap Motion 小型モーションコントローラー 3Dモーション キャプチャー システム”]
[amazonjs asin=”B077JFCPCX” locale=”JP” title=”Feetech FS90R マイクロサーボ 360度連続回転 6V 9G 車輪付き 2点入り 900us-2100us 並行輸入品”]
[amazonjs asin=”B0044X2E5S” locale=”JP” title=”【永久保証付き】Arduino Uno”]
パソコンのない人はこれどうぞ!笑
[amazonjs asin=”B01MRGSA71″ locale=”JP” title=”Apple MacBook Pro 256GB SSD 13インチ Retina Displayモデル Core i5 2.0GHz アップル MLL42J/A スペースグレイ MLL42JA”]