at_yukari.hara
2020年3月16日 9時53分
Armadillo-640でApache2とNode.jsを使ってTTLシリアルJPEGカメラを遠隔で操作してみました。
環境
・遠隔操作環境:Apache2+Node.js
・カメラ制御:Python3
・ネットワーク:有線LAN
※今回使用したカメラはこちらです。
※手順やコードはこちらを参考させていただきました。
手順
1.カメラの準備
Armadillo-640:TTLシリアルJPEGカメラで撮影した画像を保存するの手順を行い、「camera.py」の画像の保存先を変更してください。
【変更前】 IMAGE_FILE = '/root/image.jpg' 【変更後】 IMAGE_FILE = '/var/www/html/image.jpg'
2.Node.jsの準備
Armadillo-640でNode.jsを使ってみるを参考にNode.jsの動作環境を構築します。
3.Apache2をインストール
以下のコマンドを実行して、Apache2をインストールします。
[armadillo ~]# apt-get install apache2
※http://[ArmadilloのIPアドレス]でApache2のページが表示されていることを確認してください。
4.必要なモジュールのインストール
以下のコマンドを実行して、socket.ioモジュールをインストールします。
[armadillo ~]# cd /var/www/html/ [armadillo ~/var/www/html]# npm install socket.io
5.ブラウザの作成
以下の4つのファイルを「/var/www/html/」以下に置きます。 ①a_camera.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Armadillo</title> <link rel="stylesheet"href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript" src="./a_camera.js"></script> <link href="./a_camera.css" type="text/css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Armadillo</h1> <h4>LED</h4> <div class="row"> <button type="button" id="ledOn" class="col-md-1 btn btn-danger">LED ON</button> <button type="button" id="ledOff" class="col-md-1 btn btn-danger">LED OFF</button> <button type="button" id="photoOn" class="col-md-1 btn btn-danger">PTHOTO ON</button> </div> <img src="image.jpg" width="160" height="120"> </div> </body> </html>
②a_camera.css
//a_camera.css @charset "utf-8"; div.container div.row { margin-bottom: 20px; } button { margin: 3px; } h4 { margin-bottom: 0; } div.log p { margin: 0; padding: 0; line-height: 1.2; }
③a_camera.js
$(function() { var socket = io.connect(); socket.on("s2c_LS_DATA", function(data){AppendLsLog(data.value)}); $("form").submit(function(e){ console.log("submit"); var message = $("#msgForm").val(); $("#msgForm").val(''); socket.emit("client_to_server", {value : message}); e.preventDefault(); }); $("button#ledOn").on('click', function() { console.log("LED ON"); socket.emit("c2s_LED_ON", null); }); $("button#ledOff").on('click', function() { console.log("LED OFF"); socket.emit("c2s_LED_OFF", null); }); $("button#photoOn").on('click', function() { console.log("pthoto start"); socket.emit("c2s_PTHOTO_ON", null); setTimeout(function () { location.reload(); }, 7000); }); }); function AppendLsLog(text) { console.log(text); $("#lightSensorLogs").append("<p>" + text + "</p>"); }
④node_a_camera.js
var http = require('http'); var socketio = require('socket.io'); var path = require('path'); var fs = require('fs'); var mime = { ".html": "text/html", ".js" : "application/javascript", ".css" : "text/css", }; var server = http.createServer(function(req, res) { if (req.url == '/') { filePath = '/pimouse.html'; } else { filePath = req.url; } var fullPath = __dirname + filePath; console.log('fullPath : ' + fullPath); res.writeHead(200, {"Content-Type": mime[path.extname(fullPath)] || "text/plain"}); fs.readFile(fullPath, function(err, data) { if (err) { } else { res.end(data, 'UTF-8'); } }); }).listen(3000); console.log('Server running at http://localhost:3000/'); var io = socketio.listen(server); io.sockets.on('connection', function(socket) { var timer_lt = { id : null, is_on : 0, } socket.on('client_to_server', function(data) { io.sockets.emit('server_to_client', {value : data.value}); }); socket.on('c2s_LED_ON', function(data) { OnLed(); }); socket.on('c2s_LED_OFF', function(data) { OffLed(); }); socket.on('c2s_PTHOTO_ON', function(data) { Onphoto(); }); socket.on('disconnect', function() { if (timer_lt.is_on == 1) { clearInterval(timer_lt.id); } OffLed(); }); }); // LED ON function OnLed() { // shell実行(非同期) // http://tkybpp.hatenablog.com/entry/2016/04/25/163246 const exec = require('child_process').exec; exec('echo 1 > /sys/class/leds/red/brightness', (err, stdout, stderr) => { }); console.log("LED ON"); } // LED OFF function OffLed() { const exec = require('child_process').exec; exec('echo 0 > /sys/class/leds/red/brightness', (err, stdout, stderr) => { }); console.log("LED OFF"); } // PHOTO ON function Onphoto() { const exec = require('child_process').exec; exec('python3 /root/camera.py', (err, stdout, stderr) => { }); console.log("PHOTO ON"); }
6.確認
以下のコマンドで実行します。
[armadillo ~/var/www/html]# node node_a640.js
以下のURLにアクセスをします。
http://[ArmadilloのIPアドレス]:3000
このような画面が表示されます。
LEDのON/OFFをクリックするとArmadilloのLEDに反映されます。
PHOTOをクリックするとカメラで撮影した画像が表示されます。