2016年3月14日月曜日

[Intel Edison]Node.JSでモーター制御②

〜 ブラウザからLED点灯制御 〜

前回、[Intel Edison]Node.JSでモーター制御①の続きです。

ブラウザからモーター制御する前に、少し寄り道してLEDで制御を試してみます。

使用するもの
・LED(二本足なら何でもいいです。)



Intel Edison Kit for Arduinoボード上のGPIO12番とGNDにLEDを接続してブラウザ経由で点灯、消灯を制御してみましょう。本来であれば、LEDは抵抗を入れて接続するべきなのですが、ここでは面倒なので直接IOに接続しています。
※おススメな手段ではないので自己責任で!!

Edisonにシリアル接続でアクセスし、viを使って以下のコードを入力し下さい。

viの使い方:
下のソースコード"var mraa = require("mraa");"~"console.log("Server running at port 1337");"までをマウスで選択してコピー。
Edisonにシリアル接続したターミナル上で
"vi led_ui_sample.js"
と入力してエンターキーを押します。
次に"Esc"キーを押して、"i"キーを押すとキー入力、ペーストが可能な状態になるのでペースト。
":"キーを押すとウィンドウ下部に":"が表示されるので、"wq"と入力してエンターキーを押せば記録されてviが終了します。
詳しい使い方はネット上にゴロゴロあるので調べて下さい。




Terminal -- bash -- 80x24
root@edison:~# vi led_ui_sample.js
var mraa = require("mraa");
var led = new mraa.Gpio(12);
led.dir(mraa.DIR_OUT);

var http = require('http');
var url = require('url');
var ledState = "/off";

function sendResponse(ledOn, remoteIP, response) {

    response.writeHead(200, { 'Content-Type': 'text/html' });
    response.write('<!DOCTYPE html><html lang="en"><head>');
    response.write('<meta charset="utf-8">');
    response.write('<title>LED switch</title>');
    response.write('<style>');
    response.write('body { overflow:hidden; background-color:black; height: 100%;');
    response.write('-webkit-touch-callout: none; -webkit-user-select:none; -webkit-text-size-adjust:none; }');
    response.write('div { text-align: center; position:absolute; font-size: 10em;');
response.write('padding-top: 20%; left:10%; top:10%; width:80%; height:50%;');
if ( ledState == "/on" ) {
   response.write('color:#f00; background:#eee; text-shadow: 0 0 0; font-weight: bold;');
} else {
   response.write('color: #99d79c; background:#004;');
   response.write('text-shadow: 0 0 5px #6ae66e, 0 0 10px #6ae66e, 0 0 20px #6ae66e, 0 0 30px #6ae66e, 0 0 40px #6ae66e;');
}
response.write('user-select: none; }');
    response.write('</style></head>');
    response.write('<body>');
    response.write('<div id="Switch" class="btn">PUSH</div>');
    response.write('<script type="text/javascript">');
    response.write('var element = document.getElementById("Switch");');
response.write('if ("ontouchstart" in window) {');
response.write('element.addEventListener("touchstart",dragBtn);');
response.write('element.addEventListener("touchend",releaseBtn);');
response.write('} else {');
response.write('element.addEventListener("mousedown",dragBtn);');
response.write('element.addEventListener("mouseup",releaseBtn);');
response.write('}');
response.write('function dragBtn(e){');
response.write('element.style.background = "#eee";');
response.write('location.href = "/on";')
response.write('}');
response.write('function releaseBtn(e){');
response.write('element.style.background = "#004";');
response.write('location.href = "/off";');
response.write('}');
    response.write('</script>');
    response.write('</body></html>');
    response.end();
}

function processRequest(request, response) {
    
    var pathName = url.parse(request.url).pathname;
    var remoteIP = request.headers['X-Forwarded-For'];
    if ( remoteIP == undefined ) { remoteIP = request.connection.remoteAddress };
    
    console.log(pathName+" : "+remoteIP+" : "+ledState);

    if ( pathName == "/") { remoteIP = null; }
    if ( pathName != ledState ) {
        ledState = pathName;
        if (ledState == "/on") {
            led.write(1);
        } else {
            led.write(0);
        }
        sendResponse (ledState, remoteIP, response);
    } else {
        led.write(0);
        ledState = "/off";
        sendResponse (ledState, remoteIP, response);
    }
}

http.createServer(processRequest).listen(1337);

console.log("Server running at port 1337");


ExpressやSocket.IOを使えば簡単に出来るかと思うのですが、ここではベーシックな制御方法だけを学習したいので、 ”何も入っていない”、”インターネットにも接続していない”素のEdisonで進めたいと思います。

上記のコードが最適なわけでもないですが、MacとiOS上で動作するブラウザでは動くことを確認しています。
また、不具合も多々ありますので実行に関しては自己責任と言う事でご了承下さい。
問題点の改善法などアドバイスがありましたら、お知らせいただけると非常に助かります。

以上を踏まえたら、とりあえず実行してみましょう。
"configure_edison --enableOneTimeSetup"でWiFiをAPモードで起動させ、
"node led_ui_sample.js"でNode.JSを起動します。
※APモードで起動させる前に必ずパスワードの設定を済ませておいてください。
rootアカウントに設定されたパスワードがWiFiアクセスのパスワードになります。



Terminal -- bash -- 80x24
root@edison:~# configure_edison --enableOneTimeSetup
Scanning and saving WiFi networks...
Scanning: 1 seconds left  

Restarting WiFi access point. Please wait...

From your PC or laptop, connect to the 'EDISON-XX-XX' network 
and visit 'edison.local' in the browser
root@edison:~# :~# node led_ui_sample.js
Server running at port 1337

お使いのPCのWiFiの接続先をEdison(EDISON-XX-XX)にします。
パスワードは、rootアカウントに設定したものと同じです。
※XX-XXの部分はEdisonのMACアドレスの末尾2桁が入ります。

接続を確認出来たら、ブラウザを開き『192.168.42.1:1337』にアクセスします。

PUSH

上記のような画面が出ればアクセスは成功しています。

マウスで画面をクリックするか、タップすると

PUSH

と画面が変化して、LEDが点灯、



離すと消灯すれば成功です。

LEDを接続している端子をモータードライバに接続しているPINアサインに変更すればモーターの制御も出来るようになります。

以上で完了ですが、出来る事が増えてくると具体的にモーターを制御する目的が欲しくなってきますよね?

では、次回は目的をもう少し具体的にしてみたいと思います。

0 件のコメント:

コメントを投稿