2020年2月28日金曜日

ラズパイ(IOT・57)

接続先のサーバーとして利用するのは、
https://nodejs.org/ja/ からダウンロードすることができる
WindowsやLinux、Macなどがある最も一般的なものを
利用します。汎用性が高いのが魅力ですね。

ラズパイですと、nvmでバージョン指定でインストールも便利です。

まず、サーバー側の簡単なプログラムをササッと
用意してみます。

app.js
var express = require('express');
var app = express();
var http = require('http').Server(app);
const io = require('socket.io')(http);
const PORT = process.env.PORT || 3000;

app.get('/' , function(req, res){
    res.sendFile(__dirname+'/index.html');
});

io.on('connection',function(socket){
    socket.on('message',function(msg){
        console.log('message: ' + msg);
        io.emit('message', msg);
    });
});

http.listen(PORT, function(){
    console.log('server listening. Port:' + PORT);
});


index.html
<!DOCTYPE html>
<html>
<head>
    <title>socket.io chat</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
</head>
<body>
    <ul id="messages"></ul>
    <form id="message_form" action="#">
      <input id="input_msg" autocomplete="off" /><button>Send</button>
    </form>
  <script>
      var socketio = io();
      $(function(){
          $('#message_form').submit(function(){
            socketio.emit('message', $('#input_msg').val());
            $('#input_msg').val('');
            return false;
          });
          socketio.on('message',function(msg){
            $('#messages').append($('<li>').text(msg));
          });
        });
    </script>
</body>
</html>


2020年2月27日木曜日

ラズパイ(IOT・56)

さて、PythonとNode.js をつなぐ、python-socketio
のインストールから行ってみます。

サーバー用のもあるんですが、今回は既存のNode.jsに
つなぐことが目的ですので、クライアント版を使います。
 $ sudo apt-get update
 $ sudo apt-get -y install python3-dev  // 開発用パッケージのインストール
 $ sudo apt-get -y install python3-pip  // pipのインストール


まだ、pipを入れてない場合は、さきに開発環境も
含めてインストールを行います。

クライアントのインストール
 $ pip3 install "python-socketio[asyncio_client]"


すんなりと入れることができました。

2020年2月25日火曜日

ラズパイ(IOT・55)

前回までで、レーザー距離センサーから距離を取得するまで
ができました。取得した距離は、Pythonから値を取得することが
できますが、通常このプログラムを実行したときだけ
値がとれることになります。
例えば、センサーを設置しておき、一定の距離内に誰か
着たら知らせるとかを通知したいと考える場合、
センサー側からプログラムでイベントを発信する必要があります。

これまでは、Node.jsからPythonを呼ぶことはできましたが、
Python側からNode.jsを呼び出せるようにしたいと思います。

そこで、Node.jsとPythonをつないで動的にイベントをPython側から
発信できるようにするために、Python のSocketIOモジュールを
使ってみます。

2020年2月21日金曜日

ラズパイ(IOT・54)

配線もそのままでも使えなくはないのですが、
ちゃんとはんだ付けしないと、動作の途中で
動作不良を起こしたり、移動させるのも一苦労するので、
今回も基板に取り付けてみます。

今回はレーザー距離センサーを取り付けようと
思うのですが、基盤にはんだ付けだと、
外装に取り付ける際、配線が難しくなるので、
抜いたり刺したりが簡単にできるようにコネクタを
使った接続を行います。

前回、購入した圧着ペンチで
ケーブルにコネクターを取り付けて、

基板側に、2.54mmのピンヘッダーをはんだ付け
設定完了です。

2020年2月20日木曜日

ラズパイ(IOT・53)

レーザーセンサーの確認ができたので、
基板にはんだ付けしていきたいと思います。
今回は、取り回しの自由が利くように
コネクタの抜き差しができるようにしてみます。

ということで、配線をコネクター化するための
道具を入手しました。

それと、前前回ノーブランドので調子がわるかった
マルチプレクサ ブレークアウト ボードを
動作確認がとれた方の
HiLetgo TCA9548A
を追加購入しました。

2020年2月19日水曜日

ラズパイ(IOT・52)

サンプルでは、2つのセンサーまでの
利用でしたので、4つのセンサー値をとれるように
改良してみます。
概ね中身はシンプルなので、センサーの番号の部分と
センサーの数に合わせて、定義を増やします。

実行してみると、4つの値が取れていることが
確認できました。

2020年2月18日火曜日

ラズパイ(IOT・51)

色々とありつつも、センサーの取り付けが完了したので、
Pythonから接続されたセンサーを
制御してみます。

当初、レーザー距離計測センサーを導入した際
ダウンロードしたAPIに含まれる
サンプルプログラムの
VL53L0X_TCA9548A_example.py
を実行してみます。

お~。2つの距離がとれていることが
確認できます。
次回は、これを4つの距離が測れるように
改良します。

2020年2月17日月曜日

ラズパイ(IOT・50)

さて、接続が完成したのでラズパイをつかって、
アドレスの状態を確認してみます。

まずツールのインストール
sudo apt-get install i2c-tools python-smbus
機器の確認
sudo i2cdetect -y 1

上記のコマンドで利用されているアドレス部分に
数字が表示されるようになります。

あれっ!?
全てのアドレスが埋まってる(汗

繋いでいないのに...
どうやら、壊れた? はずれの基板をひいてしまったようです。
アマゾンで検索すると、TCA9548Aは色々出てくるのですが
安いのは250円ほど、高いのは1000円ほどです
今回使ったのは、安いやつでした。

しょうがないので、中間価格の
HiLetgo TCA9548A
を購入してみましたら動作確認を取ることができました。
まったく同じに見える基板でも、
中身に違いがあるのかもですね~

2020年2月14日金曜日

ラズパイ(IOT・49)

さて今回は、1つのアドレスで複数のセンサーを制御できるように
拡張ボードのマルチプレクサ ブレークアウト ボードを
配線していきます。


こんな感じで、データ線とクロック線を
複数接続することが可能です。

これを使うことで、接続できる距離センサーの数を
増やすことができるようになったので、
例えば、車のラジコンなど前方だけでなく四方の距離を計測したり
つかえる範囲を増やすことができるようになりました。


2020年2月13日木曜日

ラズパイ(IOT・48)

この前の時に、レーザー距離計測モジュールを
制御して距離を測れるようにしました。
今回は、距離計の数を増やして、これを拡張してみたいと思います。

通常、各センサーには信号を制御するための
アドレスが割り当てられているのですが、
一つ一つのセンサーを制御するためには、
アドレスがバラバラである必要があります。

このため同じアドレスをもつセンサーは、
複数とりつけられないか、アドレスをセンサー側で
変更する必要があります。

で、センサー側にアドレスを変更する機能がない場合に
制御するために使うのが、
TCA9548A I2C IIC マルチプレクサ ブレークアウト ボード 8チャンネル 拡張ボード
です。

これを使うと、1つのアドレスで最大8個の同じアドレスを持つ
センサーを制御することができるようになります。

2020年2月10日月曜日

ラズパイ(IOT・47)

これまで作成したものを実行してみます。
まず、node.jsを実行します。
node app.js
次にブラウザから、nodeに接続します。
http://localhost:3000
そして、しゃべらせたいメッセージを
書き込んでみます。

すると、遠隔操作で自由にしゃべらせる
ことができるようになりました。


https://www.filetalk.info/index.html

2020年2月7日金曜日

ラズパイ(IOT・46)

今度は、Node.js側にメッセージが届いたら、 Pythonへメッセージをパラメータとして送れるように app.jsのプログラムを調整します。
var express = require('express');
var app = express();
var http = require('http').Server(app);
var {PythonShell} = require('python-shell');
const io = require('socket.io')(http);
const PORT = process.env.PORT || 3000;

app.get('/' , function(req, res){
    res.sendFile(__dirname+'/index.html');
});

io.on('connection',function(socket){
  socket.on('message',function(msg){
    console.log('message: ' + msg);
    io.emit('message', msg);
    
      var pyshell = new PythonShell('com.py');
      pyshell.send(msg);
      pyshell.on('message', function(data) {
        console.log('ret:' + data);
      });
  });
});

http.listen(PORT, function(){
  console.log('server listening. Port:' + PORT);
});
webとの受け渡しようのプログラムができました。

https://www.filetalk.info/index.html

2020年2月6日木曜日

ラズパイ(IOT・45)

前回作成したPythonファイルから呼び出す、 音声合成するためのコマンドをsay.shファイルに作成します。
#!/bin/bash

TMP=/tmp/tmp.wav
echo "$1" | open_jtalk \
-m /home/pi/MMDAgent_Example-1.8/Voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open_jtalk_dic_utf_8-1.11 \
-ow $TMP && \
aplay -q $TMP
rm -f $TMP
このプロジェクトでパラメータを受け取り コマンドを作成して、音声合成用の処理を実行します。

https://www.filetalk.info/index.html

2020年2月5日水曜日

ラズパイ(IOT・44)

前回Node.jsからPythonを実行するために python-shellをインストールしました。 つぎに、メッセージをpython側でパラメータを受け取り 発音できるようにコマンドを実行する pythonファイルのcom.pyを作成します。
import sys
import subprocess

data = sys.stdin.readline()
args = ['./say.sh', data]
proc = subprocess.run(args, stdout=subprocess.PIPE)
print(proc)
これで、コマンドとPythonの連携ができるようになりました。

https://www.filetalk.info/index.html

2020年2月4日火曜日

ラズパイ(IOT・43)

Websocketのsocket.ioを利用して
リアルタイムの操作サンプルを作成してみます。
まず、前に作成していた音声合成プログラムに
Node.jsをつないで遠隔地から発生できるようにします。

今回使うものとしましては、
webからの接続用にNode.js
音声合成にopen-jtalk
コマンドの実行にpython
を利用します。

これを実現するために、
Node.jsとpythonを繋げるモジュールをインストールします。
npm install python-shell
そのあと、JavaScriptとして以下を追加します
 var {PythonShell} = require('python-shell');
 PythonShell.runString('print("実行OK!")', null, function (err, result) {
   if (err) throw err;
   
   console.log(result);
 });
実行すると、pythonが実行され結果が表示されるようになります。
https://www.filetalk.info/index.html

2020年2月3日月曜日

ラズパイ(IOT・42)

Websocktについて
Webサービスを提供するときに、従来の場合ですと、
情報をクライアントがリクエストしてきたものを、
サーバーが結果を返すという流れが主流でした。
この場合ですと、リクエストがないと、
サーバー側は新しい情報を送る手段がありませんでした。
そこに、Node.jsのWebsocket機能を使うことによって、
サーバー側からクライアントへ、任意のタイミングで
変更を通知できるようにすることが
できるようになりました。

Websocketを利用できるようにしていきます。
まず、Node.jsのインストール

ここで、Node.jsですが、いまだ発展中ということもあり、
各バージョンで動く動かないの差があったりもします。
そこで、バージョン管理の仕組みが取り入れらています。
Node.jsのバージョン管理に、nvmを利用します。
 $ git clone https://github.com/creationix/nvm.git ~/.nvm
 $ source ~/.nvm/nvm.sh
 $ nvm install 10.15.3
 $ nvm alias default v10.15.3
毎回コマンドを打たなくていいように調整します
 $ vi ~/.bash_profile

  if [[ -s ~/.nvm/nvm.sh ]];
   then source ~/.nvm/nvm.sh
  fi