2018年8月18日土曜日

Node.js 色々(html socket.io child_proces)

前回はnodeをwindows10にインストールし,ブラウザにHallo worldを表示
してみました.次回RaspberryPiにインストールしてみるといいましたが,
かなり昔の話で方法を忘れてしまいました.こまめにメモするんだった・・・

今回は一通りセットアップが終わったRaspberryPiを使用し,
私が良く使うモジュールについてメモしたいと思います.

RaspberryPiはsambaでファイル共有し,sshでリモート接続できるように
なっています.とりあえず適当なテストフォルダを用意しtest.js,test.htmlを
作りました.細かいことはわかりませんが,jsはサーバで実行されるプログラムで
htmlはクライアント(ブラウザ)で実行されるプログラムという認識でいいのでしょうか.



・html
接続があった場合,外部のhtmlファイルを表示させてみようと思います.
何をするにもまずはこれからですね.
test.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Client</title>
</head>
<body>
  <p>Hello World!!</p>
</body>
</html>

test.js
var app = require('http').createServer(handler)
var fs = require('fs');

app.listen(3000); // HTTPポートオープン

//接続があった場合の処理
function handler (req, res) {
//ファイルリード
  fs.readFile(__dirname + '/test.html',
  //エラーの場合の処理
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading test.html');
    }
//通常処理
    res.writeHead(200);
    console.log("Server Started!!");
    res.end(data);
  });
}

windowsのターミナルから接続し,作ったディレクトリに移動します.
node testでサーバを起動できます.
ブラウザから「RasPiのアドレス:3000」にアクセスします.
「Hello World!!」が表示できたかと思います.



・socket.io
サーバとクライアントで通信させてみようと思います.
これができるとブラウザ経由でRasPiを操作できるようになります.

htmlファイルはボタンを追加し,massageを送れるようにします.
emitでデータを送ります.送るデータはjson形式というらしい.また,
socket.ioモジュールを読み込みます.
test.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Client</title>
  <script src="/socket.io/socket.io.js"></script>
</head>
<body>
  <p>Hello World!!</p>
  <input type="button" value="on" onclick="send('hello!!')"/>
</body>
<script>
var socket = io.connect();

function send(send_data){
    socket.emit('massage',{ data:send_data});
};
</script>
</html>

jsファイルは受け取ったメッセージをコンソール上に表示します.
モジュールとしてsocket.ioを追加.onで受信した場合の処理を記述します.
test.js

var app = require('http').createServer(handler)
var fs = require('fs');
var io = require('socket.io')(app); //socket.io

app.listen(3000); // HTTPポートオープン

//接続があった場合の処理
function handler (req, res) {
//ファイルリード
  fs.readFile(__dirname + '/test.html',
  //エラーの場合の処理
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading test.html');
    }
//通常処理
    res.writeHead(200);
    console.log("Server Started!!");
    res.end(data);
  });
};

//アクセスがあった場合
io.on('connection', function (socket) {
  //massageを受信した場合
  socket.on('massage', function (data) {
    // クライアントから受け取ったデータを出力する
    console.log(data);
  });
});

同じようにnodeを起動し,ブラウザからアクセスします.
ボタンを押したら { data: 'hello!!' } が表示されると思います.



・child_proces
サーバー上のshellコマンドなどを動かしたい時,child_procesで動かすことができます.

test.jsのみ書き換え,先ほどのボタン入力があった場合に「ls -l」を実行してみたいと
思います.child_processモジュールを追加し,socket.onのところにコードを追加します.
test.js

var app = require('http').createServer(handler)
var fs = require('fs');
var io = require('socket.io')(app); //socket.io
var exec = require('child_process').exec; //child_process

app.listen(3000); // HTTPポートオープン

//接続があった場合の処理
function handler (req, res) {
//ファイルリード
  fs.readFile(__dirname + '/test.html',
  //エラーの場合の処理
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading test.html');
    }
//通常処理
    res.writeHead(200);
    console.log("Server Started!!");
    res.end(data);
  });
};

//アクセスがあった場合
io.on('connection', function (socket) {
  //massageを受信した場合
  socket.on('massage', function (data) {
    // クライアントから受け取ったデータを出力する
    console.log(data);
    
    //ls -lを実行
    exec('ls -l', function(err, stdout, stderr){
  console.log(stdout);
  });
  });
});


同じようにnodeを起動し,ブラウザからアクセスします.
ボタンを押したら以下のように表示されると思います.
{ data: 'hello!!' }
合計 28
drwxr-xr-x 41 pi pi  4096  8月 18 21:34 node_modules
-rw-r--r--  1 pi pi 10624  8月 18 21:34 package-lock.json
-rw-r--r--  1 pi pi   250  8月 18 21:34 package.json
-rwxr--r--  1 pi pi   381  8月 18 21:35 test.html
-rwxr--r--  1 pi pi   976  8月 18 21:50 test.js




ここまでで,3つのNodeモジュールを使用してみました.
実はこの3つだけで非常に幅広いことが可能になります.
例えば,ブラウザ経由で音楽をかけたり,RaspPiに接続された温度計の情報を
ブラウザに表示したりすることが可能かと思います.夢が広がりますね.

あと良く使うのはexpressモジュールですが,まだうまく扱えていないので
次回まとめたいと思います.



2018年8月17日金曜日

Node.js windows10にインストールしてみる

お久しぶりです.
2018年上半期は就活&その他イベントで忙しく,なかなか更新できませんでした.
そんな中何となくnode.jsいじっていたので,少しまとめておきたいと思います.
今回はインストールからwebサーバーのサンプルまで.

windows10はココからダウンロードできました.
インストールは特に設定もなくnextしていけばOK.
windows power shell で以下のようにバージョンが確認できれば完了です.

> node -v
v8.11.2

ウェブサーバのサンプルを試してみます.
適当なエディタで以下のようなファイルを作成.
hello_http.js



const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});



power shellで作ったファイルがあるフォルダに移動.
>cd "作ったファイルのパス"

以下コマンドでサーバ起動
>node hello_http
Server running at http://127.0.0.1:3000/

ブラウザにlocalhost:3000と入力し,アクセスできます.





これで一応windows10環境でnode.jsが使えるようになりました.
以前までの私は,慣れない中いくつものソフトをインストールしwebサーバ
を構築しやっと簡単なことができるといった感じだったのでNodeの簡単さに非常に
感動しています.

ただ私はRaspberryPiで使用する事を前提にNodeをいじっていたので,
次回からはRaspberry Piにインストールする方法と使ってみて便利だったモジュール
の紹介をしたいと思います.

2018年1月24日水曜日

温湿計付きWiFi時計を作ってみた2

前回の続きでソフト編です.

やりたいことは,
1.時間をネットワークで自動同期.
2.BME280から温度・湿度・気圧を取得
3.7セグに時間を表示
4.液晶に時計と温度等のグラフを表示
です.

1.時間をネットワークで自動同期.
NTPClientライブラリを使用します.
https://github.com/arduino-libraries/NTPClient
zipを解凍しArduinoのlibrariesフォルダに入れます.
使い方はサイトにあるサンプルのとおりです.
日本時間に合わせるには以下のように初期化します.
NTPClient timeClient(ntpUDP, "jp.pool.ntp.org", 3600*9, 60000);


2.BME280から温度・湿度・気圧を取得
ボッシュ社のセンサで,温度,湿度,気圧を取得することができます.
マイコンとの接続はI2Cです.
データシート
特に深く考えずに値を取得できればいいので,適当なヘッダを作りました.
何らかのフィルタをかけてくれていますが,動いたので良しとしました.
元のサンプルプログラムを見つけられませんでした.すいません.


3.7セグに時間を表示
マトリクスLCDドライバ,HT16K33を使用しています.接続はI2Cです.
コレも深く考えずヘッダを作成.以前の記事を参考にしています.
数字の点灯パターンをあらかじめ宣言しておきます.


4.液晶に時計と温度等のグラフを表示
コレを一番頑張りました.マイコンから液晶を触るのはとても大変で
何時間もデータシートとにらめっこすることになりますが,
しかしこの液晶は使いやすいライブラリが公開されているのでプログラミングは楽です.
Adafruit_GFX.hとAdafruit_ST7735.hを使用します.
コチラを参考にさせて頂きました.

4つの画面(時計,温度,湿度,気圧)をボタンで切り替えられるようになっています.
それぞれの画面は必要領域のみ更新し,チラつきを抑えます.
また100ms割り込みでボタンを監視し,一定時間以上入力がなければ
自動でOFFになります.
コレの画面のレイアウトに開発時間の大半を費やしました.




結構気に入っていてたまに画面を切り替えてはニヤニヤしています笑
実用性もなかなかあり,時計はもちろんエアコンや加湿器の
電源を入れる目安にしています.
ネットワーク上から見れたりすると便利かなと思いますので時間が
あればいじりたいと思います.

以下使用プログラム
ESP-WROOM-02_digital_clock
BME280
SEG7_LED

2018年1月23日火曜日

eagle+elecrowで基盤外注してみた

あけましておめでとうございます.caketetuです.

前回の投稿からずいぶん時間が経ってしまいましたが,
年末にElecrowにPCB基盤を外注した話です.

基板外注業者は,最近増えていて結構な数がありますが,
Elecrowを選んだのは,価格と納期です.
品質に難ありと聞きますが,それは設計段階である程度カバーしようかと.

今回はお試しということで以前ユニバーサル基盤で作った
温湿度センサ付きWIFI時計をPCB基盤で作ってみます.

回路図です.

あとで気づきましたが,マイコンからトランジスタへの
配線は,直結しないと電流が足らず液晶が点灯しないようです.



ガバーデータ作成にはeagleを使いました.詳しい使い方はここでは
割愛しますが,作成の手順としては

1.schematicで回路図を作成
2.boardを開き部品を配置
3.Net classesを設定し,オートルーティングを実行
4.気になるところを手作業で変更
5.DRCを実行し,ガーバー出力

実際の作成では,回路図の前にライブラリの編集作業がありました(これが
結構大変だった...).
自分はeagle/lbr下にマイライブラリフォルダを作成しています.

5.ではElecrowで設定ファイルをダウンロードしておきます.

できたものがコチラ



できたガバーデータのうち必要なものをzipで圧縮します.
出来上がり図を見たいですが,Elecrowサイトでは見ることが
できないので,fusionPCBサイトで確認します.






確認したらElecrowで発注するだけです.特に困ることはない
と思います.今回は,2層基板5枚,色は緑でその他はすべて
標準の設定で発注しました.

運送業者はOSCが早いみたいです.納期を気にしなければ
安いものでいいと思います.

2017 12/24 発注
2017 12/29 作成された基盤のメールが届く
2017 12/31 自宅に到着

早いですね.大体一週間ぐらいで届きます.
気になる料金は
基板代 $4.9
配送料と手数料 $13.23
合計 $18.13
でした.日本円で2000円ぐらいです.
配送オプションによってもっと安くできます.

届いたのがこちら.7枚届きました.






気になるところは特に無しです.
スルーホールが良く見えない箇所がいくつか存在しましたが,
内部ではきちんとつながっているようです.

完成




致命的なミスによりジャンパを余儀なくされました...






現在は,このような基盤の外注も簡単にできます.
やはりPCB基盤の方が完成度が高く,コンパクトにできる
所がいいですね.
今後も,コレだ!と思う基盤ができたら,積極的に活用
しようと思います.