測距モジュールとは?
測距モジュールは、赤外線LEDを使用して非接触で距離を検出することができます。今回はこの測距モジュールとArduino、Node.jsなどを組み合わせることによって「測距モジュールで測定した距離」をブラウザに表示してみたいと思います。
測距モジュールとArduinoの回路を組む
回路はこちらのページを参考にして組みました。
赤外線測距モジュールで物体の距離を測ってみます(1/2)
Arduinoのソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include #define analogPin 1 int threshold = 80; int value = 0; int length = 0; char *jsonStr; void setup() { Serial.begin(9600); } // センサーから読込んだ値を距離(cm)に変換する処理 // 距離が短くなるとセンサー値は大きくなるが、4cm以内になると逆に小さくなっていく注意 int AnaToCm(int analogValue) { // Serial.print(analogValue) ; if (analogValue < 85 ){ length = 0; } // 60cm以上離れている else if (analogValue >= 470){ length = 10; } // 10cm以内 else if (analogValue >= 260){ length = 20; } // 20cm以内(10-20cm) else if (analogValue >= 165){ length = 30; } // 30cm以内(20-30cm) else if (analogValue >= 126){ length = 40; } // 40cm以内(30-40cm) else if (analogValue >= 105){ length = 50; } // 50cm以内(40-50cm) else if (analogValue >= 85 ){ length = 60; } // 60cm以内(50-60cm) return(-1) ; // この行実行は有得ないと思う } void read(int value) { AnaToCm(value); aJsonObject* aJosnLength = aJson.createObject(); aJson.addNumberToObject(aJosnLength,"length", length); jsonStr = aJson.print(aJosnLength); Serial.println(jsonStr); aJson.deleteItem(aJosnLength); free(jsonStr); } void loop() { value = analogRead(analogPin); if (value > threshold) { read(value); } delay(1000); } |
Node.js(サーバ側)のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
var app = require('http').createServer(handler), io = require('socket.io').listen(app), fs = require('fs'), path = require('path'), serialport = require('serialport'); io.set('log level', 1); // Serial Port var portName = 'COM2'; // WINDOWS環境(Macの場合は異なります) var sp = new serialport(portName, { //baudRate: 57600, baudRate: 9600, dataBits: 8, parity: 'none', stopBits: 1, flowControl: false, }); app.listen(3000); function handler(req, res){ var filePath = req.url; if (filePath == '/') { filePath = '/index.html'; } else { filePath = req.url; } //console.log(filePath); var extname = path.extname(filePath); //console.log("filePath: " + filePath); //console.log("ext: " + extname); //contentType切り分け var contentType = 'text/html'; switch (extname) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; } console.log(contentType); //console.log(__dirname + filePath); fs.readFile(__dirname + filePath, function(err, data){ if(err){ res.writeHead(500); return res.end('Error'); } res.setHeader('Content-Type', contentType); res.writeHead(200); res.write(data); res.end(); }); } //以下の処理だとJSON形式のデータが途切れてしまうので、今回はもう少し工夫してみました //data from arduino //sp.on('data', function(data) { // //console.log("serialport data received: " + data); // // try{ // console.log("emit_from_server_length = " + data); // // var length = JSON.parse(data).length; // io.sockets.emit('emit_from_server', length); // // }catch(e){ // console.log('error'); // } //}); //data from arduino var d = ""; sp.on('data', function(data) { //console.log("serialport data received: " + data); //JSON形式のデータが途切れても2回目以降に追加されるようにした d += data; console.log("emit_from_server_d = " + d); //lengthプロパティで文字数を格納 var len = d.length; //文字数が12文字より大きかったら以下の処理を実行 if(len > 12){ try{ var a = JSON.parse(d).length; console.log("emit_from_server_if_try_a = " + a); io.sockets.emit('emit_from_server', a); d = ""; }catch(e){ console.log('error'); d = ""; } } }); sp.on('close', function(err) { console.log('port closed'); }); //serialport open sp.open(function () { console.log('port open'); }); |
Node.js(クライアント側)のソース
1 2 3 4 5 6 7 8 9 10 |
$(function(){ var socket = io.connect(); //length data from server socket.on('emit_from_server', function(data){ appendMsg(data) function appendMsg(text) { $("#chatLogs").append(" |
” + text + ” c.m.
“); } }); });
HTMLのソース
Body部分のみを抜粋しています。
1 2 3 4 5 6 7 8 |
<body> <header class="container_24"></header> <div id="main" class = "grid_16"> <p> Distance <div id="chatLogs"></div> c.m. </p> </div> </body> |
動かしてみる!
以下のように「node app.js」で起動します。
起動するとArduinoから測距モジュールのデータが送信されてくるので、それを変数に格納します。1回目の受信では中途半端にデータが送信されてくる減少が今回は発生したので、2回目のときに欠けているデータを受信するようにしました。
ブラウザで表示すると以下のようになります。上から1回目、2回目、3回目、4回目・・・というようにデータを受信することができました。
今回は壁から離したり近づけたりして測定したので、遠いときは50~60cmが表示され、近いときは10~20cmが表示されるようになっています。
今回は測距モジュールとArduinoとNode.jsとSocket.IOで距離を測定してブラウザに表示させてみました。これを応用すれば他のセンサも組み合わせて色々できそうです。