TAMIYA Tracked Vehicle をWiFiで動かして見ました
昔、UNO単体で動かしたTAMIYA模型を先の記事のWiFiBridgeを利用してWiFiで
動かして見ました。Johnny-fiveに必要なモデルが揃っていて、それらを組み合わ
せればLEGOの様な感覚でスクリプトを書く事ができました。いつの間にか、必要な
インフラが揃っていてマニアにはとても便利な時代になっていたのを実感しました。
以下はその時の状況です。
<IOT動作モデルの概要>
前に超音波距離センサーの動作チェックの時に利用したTAMIYAの「タンク工作
基本キット」を使って次の様なIOTの動作モデルを作って検討して見ました。
[全体の構成]
1.先のこちらの記事で記載したWiFiBridgeモジュールを利用
(Frimata実装のUNO+WiFiBridge実装のESP-01の組み合わせ)
2.HC-SR04による距離センサーを搭載
3.モータ駆動にはLS9110Sチップを利用している2チャンネルのHブリッジ
の片方を使用
4.ホストPCからは、モータの回転方向と回転速度を設定
5.WiFiBridgeモジュールからは、前方の障害物までの距離をホストPCに返答
6.モータドライブとHC-SR04コントールの雛形はJohnny-fiveの次のものを
利用
モータドライブ : http://johnny-five.io/examples/motor-hbridge/
HC-SR04 : http://johnny-five.io/examples/proximity-hcsr04/
[使用した主要部品]
1.UNO(firmata)+ESP-01(WiFiBridge)モジュール ---> こちらの記事を参照
2.HC-SR04 ---> こちらの記事を参照
3.L9110Sモータドライブモジュール ---> こちらの記事を参照
4.TAMIYA Tracked Vehicle ---> こちらの記事を参照
5.スマホ充電用バッテリー
[動作状況]
動作状況は次のURLから確認できます。
<テスト内容と結果>
今回の動作モデルでのテストは次の様な内容で、スマホからMIYATAの模型を
コントロールする方法を調べてみました。
1.スマホからMIYATAの模型のモータの回転方向と速度の制御
2.MIYATAの模型からの超音波センサーの応答をスマホで確認
動作させた結果としては、次の様なものでした。
1.スマホからほぼリアルタイムでMIYATAの模型を制御できる事が
判りました。
2.また、MIYATAの模型からの超音波センサーの応答もほぼリアルタイムで
動作する事が判りました。
3.コードの作成に関しては、Johnny-fiveに沢山のサンプルが用意されて
おり、目的の動作をさせる為のスクリプトは比較的簡単に作る事が
できました。
[テストでの機器の接続]
ピン割り付けは、Johnny-fiveのサンプルのものを使っています。
[準備]
HC-SR04の動作には、このデバイスに対応した特別なFirmataが必要です。
次の記事を参考にそれをインストールして下さい。(Firmataの他の機能は
同じ様に使える様です。)
URL : http://johnny-five.io/api/proximity/#pingfirmata
(PingFirmataの項目を参照)
こちらでは、コマンドプロンプトでの次のコマンドで対応しました。
1. npm install -g nodebots-interchange
Firmata交換ソストのインストール
2. interchange install hc-sr04 -a uno -p com3 --firmata
Firmataソフトの交換
(使っている環境ではUNOとのポートはcom3です。利用環境に合わせて
変更が必要です。また、この時UNOへの書き込みが行わるので、
ESP-01とのTX/RXは切り離しておいて下さい。)
下記からダウンロードした2つのファイルをホストPCのHTTPルートに配置し、
node.jsからserver.jsを起動する。
1. HTTPルートに配置する2つのファイル index.html, server.js
2. server.jsの起動 ---> [node server.js] をコマンドプロンプトで実行
コードのダウンロード先はこちら (Download URL is here.)
[コード類]
<index.html> --- Webアクセス用のコード
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>arduino-socket.io</title>
<script src="/socket.io/socket.io.js"></script>
<script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
</head>
<body>
<font size='5'>TAMIYA Tracked Vehicle<br>WiFi Control test</font><br><br>
<form>
<p><font size='4'>Set moving direction</font><br>
<input type="radio" name="dirct" value="back" id="gbak">BAK</input>
<input type="radio" name="dirct" value="stop" id="gstp">STP</input>
<input type="radio" name="dirct" value="fwrd" id="gfwd">FWD</input>
</p>
</form>
<form>
<p><font size='4'>Motor Speed</font><br>
<input type='range' name=Mspd min='90' max='255' id="mspd" value='90'><br>
</p>
</form>
<p>
<span>Forward obstacle (cm)</span><br>
<span id="fdis"></span>
</p>
<script type="text/javascript">
var socket = io();
socket.on("connect", function(){
console.log("connect!!");
socket.on("fwdist", function(value){
$("#fdis").text(value);
});
});
$(function(){
$("#gbak").click(function(){
socket.emit("msg", "Moter=back");
});
$("#gstp").click(function(){
socket.emit("msg", "Moter=stop");
});
$("#gfwd").click(function(){
socket.emit("msg", "Moter=forward");
});
$("#mspd").change(function(){
socket.emit("msg", "Speed="+ mspd.value);
});
});
</script>
</body>
</html>
<server.js> --- node.jsの起動スクリプト
var EtherPortClient = require("etherport-client").EtherPortClient;
var fs = require("fs");
var http = require("http");
var Firmata = require("firmata");
var server = http.createServer();
var five = require("johnny-five");
var board = new five.Board({ // for WiFi connection
io: new Firmata(new EtherPortClient({
host: '192.168.11.57', // <--------- ESP-01 IP address ---------
port: 23 // <--------- ESP-01 Port number ---------
})),
timeout: 1e5
});
board.on("ready", function() {
// Server
server.on("request", function(req, res) {
var stream = fs.createReadStream("index.html");
res.writeHead(200, {
"Content-Type": "text/html"
});
stream.pipe(res);
});
// Socket.IO
var io = require("socket.io").listen(server);
server.listen(8000);
// ultra sonic sensor
var proximity = new five.Proximity({
controller: "HCSR04",
pin: 7
});
// motor
var mspeed = 0;
var dirct = 0; // 0:stop, 1:forward, 2:back
var motor = new five.Motor({
pins: {
pwm: 3,
dir: 12
},
invertPWM: true
});
board.repl.inject({
motor: motor
});
// Control
io.sockets.on("connection", function(socket) {
// check ultra sonic sensor
proximity.on("data", function() {
socket.emit("fwdist", this.cm);
});
// set moter control
socket.on("msg", function(data) {
console.log(data);
if (data=="Moter=back") { // back
dirct = 2;
motor.reverse(mspeed);
} else if(data=="Moter=stop"){ // stop
dirct = 0;
motor.stop();
} else if(data=="Moter=forward"){ // forward
dirct = 1;
motor.forward(mspeed);
} else if(data.substr(0, 6) == "Speed=") { // speed
mspeed = data.substr(6);
if(dirct > 0){
if(dirct == 1) motor.forward(mspeed);
else motor.reverse(mspeed);
}
}
});
});
});
動かして見ました。Johnny-fiveに必要なモデルが揃っていて、それらを組み合わ
せればLEGOの様な感覚でスクリプトを書く事ができました。いつの間にか、必要な
インフラが揃っていてマニアにはとても便利な時代になっていたのを実感しました。
以下はその時の状況です。
<IOT動作モデルの概要>
前に超音波距離センサーの動作チェックの時に利用したTAMIYAの「タンク工作
基本キット」を使って次の様なIOTの動作モデルを作って検討して見ました。
[全体の構成]
1.先のこちらの記事で記載したWiFiBridgeモジュールを利用
(Frimata実装のUNO+WiFiBridge実装のESP-01の組み合わせ)
2.HC-SR04による距離センサーを搭載
3.モータ駆動にはLS9110Sチップを利用している2チャンネルのHブリッジ
の片方を使用
4.ホストPCからは、モータの回転方向と回転速度を設定
5.WiFiBridgeモジュールからは、前方の障害物までの距離をホストPCに返答
6.モータドライブとHC-SR04コントールの雛形はJohnny-fiveの次のものを
利用
モータドライブ : http://johnny-five.io/examples/motor-hbridge/
HC-SR04 : http://johnny-five.io/examples/proximity-hcsr04/
[使用した主要部品]
1.UNO(firmata)+ESP-01(WiFiBridge)モジュール ---> こちらの記事を参照
2.HC-SR04 ---> こちらの記事を参照
3.L9110Sモータドライブモジュール ---> こちらの記事を参照
4.TAMIYA Tracked Vehicle ---> こちらの記事を参照
5.スマホ充電用バッテリー
[動作状況]
動作状況は次のURLから確認できます。
<テスト内容と結果>
今回の動作モデルでのテストは次の様な内容で、スマホからMIYATAの模型を
コントロールする方法を調べてみました。
1.スマホからMIYATAの模型のモータの回転方向と速度の制御
2.MIYATAの模型からの超音波センサーの応答をスマホで確認
動作させた結果としては、次の様なものでした。
1.スマホからほぼリアルタイムでMIYATAの模型を制御できる事が
判りました。
2.また、MIYATAの模型からの超音波センサーの応答もほぼリアルタイムで
動作する事が判りました。
3.コードの作成に関しては、Johnny-fiveに沢山のサンプルが用意されて
おり、目的の動作をさせる為のスクリプトは比較的簡単に作る事が
できました。
[テストでの機器の接続]
ピン割り付けは、Johnny-fiveのサンプルのものを使っています。
[準備]
HC-SR04の動作には、このデバイスに対応した特別なFirmataが必要です。
次の記事を参考にそれをインストールして下さい。(Firmataの他の機能は
同じ様に使える様です。)
URL : http://johnny-five.io/api/proximity/#pingfirmata
(PingFirmataの項目を参照)
こちらでは、コマンドプロンプトでの次のコマンドで対応しました。
1. npm install -g nodebots-interchange
Firmata交換ソストのインストール
2. interchange install hc-sr04 -a uno -p com3 --firmata
Firmataソフトの交換
(使っている環境ではUNOとのポートはcom3です。利用環境に合わせて
変更が必要です。また、この時UNOへの書き込みが行わるので、
ESP-01とのTX/RXは切り離しておいて下さい。)
下記からダウンロードした2つのファイルをホストPCのHTTPルートに配置し、
node.jsからserver.jsを起動する。
1. HTTPルートに配置する2つのファイル index.html, server.js
2. server.jsの起動 ---> [node server.js] をコマンドプロンプトで実行
コードのダウンロード先はこちら (Download URL is here.)
[コード類]
<index.html> --- Webアクセス用のコード
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>arduino-socket.io</title>
<script src="/socket.io/socket.io.js"></script>
<script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
</head>
<body>
<font size='5'>TAMIYA Tracked Vehicle<br>WiFi Control test</font><br><br>
<form>
<p><font size='4'>Set moving direction</font><br>
<input type="radio" name="dirct" value="back" id="gbak">BAK</input>
<input type="radio" name="dirct" value="stop" id="gstp">STP</input>
<input type="radio" name="dirct" value="fwrd" id="gfwd">FWD</input>
</p>
</form>
<form>
<p><font size='4'>Motor Speed</font><br>
<input type='range' name=Mspd min='90' max='255' id="mspd" value='90'><br>
</p>
</form>
<p>
<span>Forward obstacle (cm)</span><br>
<span id="fdis"></span>
</p>
<script type="text/javascript">
var socket = io();
socket.on("connect", function(){
console.log("connect!!");
socket.on("fwdist", function(value){
$("#fdis").text(value);
});
});
$(function(){
$("#gbak").click(function(){
socket.emit("msg", "Moter=back");
});
$("#gstp").click(function(){
socket.emit("msg", "Moter=stop");
});
$("#gfwd").click(function(){
socket.emit("msg", "Moter=forward");
});
$("#mspd").change(function(){
socket.emit("msg", "Speed="+ mspd.value);
});
});
</script>
</body>
</html>
<server.js> --- node.jsの起動スクリプト
var EtherPortClient = require("etherport-client").EtherPortClient;
var fs = require("fs");
var http = require("http");
var Firmata = require("firmata");
var server = http.createServer();
var five = require("johnny-five");
var board = new five.Board({ // for WiFi connection
io: new Firmata(new EtherPortClient({
host: '192.168.11.57', // <--------- ESP-01 IP address ---------
port: 23 // <--------- ESP-01 Port number ---------
})),
timeout: 1e5
});
board.on("ready", function() {
// Server
server.on("request", function(req, res) {
var stream = fs.createReadStream("index.html");
res.writeHead(200, {
"Content-Type": "text/html"
});
stream.pipe(res);
});
// Socket.IO
var io = require("socket.io").listen(server);
server.listen(8000);
// ultra sonic sensor
var proximity = new five.Proximity({
controller: "HCSR04",
pin: 7
});
// motor
var mspeed = 0;
var dirct = 0; // 0:stop, 1:forward, 2:back
var motor = new five.Motor({
pins: {
pwm: 3,
dir: 12
},
invertPWM: true
});
board.repl.inject({
motor: motor
});
// Control
io.sockets.on("connection", function(socket) {
// check ultra sonic sensor
proximity.on("data", function() {
socket.emit("fwdist", this.cm);
});
// set moter control
socket.on("msg", function(data) {
console.log(data);
if (data=="Moter=back") { // back
dirct = 2;
motor.reverse(mspeed);
} else if(data=="Moter=stop"){ // stop
dirct = 0;
motor.stop();
} else if(data=="Moter=forward"){ // forward
dirct = 1;
motor.forward(mspeed);
} else if(data.substr(0, 6) == "Speed=") { // speed
mspeed = data.substr(6);
if(dirct > 0){
if(dirct == 1) motor.forward(mspeed);
else motor.reverse(mspeed);
}
}
});
});
});