忘備録-備忘録

技術的な備忘録

node-redをNginxのリバースプロキシを使い80番ポートで動かす

2018-11-29 20:28:00 | raspberry ...

node-redは1880番ポートで動作しています。アクセス毎にhttp://foo.bar:1880/とポート番号を入力するのは面倒です。WebサーバのNginxのリバースプロキシ機能を使うと簡単に80番ポートで公開可能になります。

Nginxのインストール

$ sudo apt-get install nginx

Nginxの設定

/etc/nginx/sites-available/default ファイルを次のように書き換えます。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                proxy_http_version 1.1;
                 proxy_set_header Upgrade $http_upgrade;
                 proxy_set_header Connection "upgrade";
                proxy_pass http://127.0.0.1:1880/;
        }
}

Nginxの再起動

$ sudo systemctl restart nginx.service

node-redを起動しブラウザでアクセスするとアクセス可能です。うまく設定すると既存のWebと共存可能になります。

参考


aiy voicebonnetのボタンのLEDをJavaで制御する

2018-11-26 20:37:00 | raspberry ...

/sys/class/leds/ktd202x:led1/device/reset ファイルに”1”を書き込むとリセット

/sys/class/leds/ktd202x:led1/device/registers ファイルにLEDの色データを書き込むとボタンの色が変更できます。

import java.io.*;

public class led
{
    /**
     * led クラスのインスタンスのためのコンストラクタ
     */
    public led()
    {
        // インスタンス変数の初期化
        try {
            PrintWriter leddev = new PrintWriter(new BufferedWriter(new FileWriter("/sys/class/leds/ktd202x:led1/device/reset")));
            leddev.print("1");
            leddev.close();
        } catch(Exception e) {
            System.out.println("LED write error" + e);
        }

    }

    /**
     * LEDの初期化
     *
     * @param  なし
     * @return   なし
     */
    public static void resetLed()
    {
         try {
            PrintWriter leddev = new PrintWriter(new BufferedWriter(new FileWriter("/sys/class/leds/ktd202x:led1/device/reset")));
             leddev.print("1");
            leddev.close();
        } catch(Exception e) {
            System.out.println("LED write error" + e);
        }
    }

    /**
     * LEDの明るさを変える
     *
      * @param  r,g,b   明るさ 赤 緑 青
     * @return        なし
     */
    public static void changeLed(int r,int g,int b)
    {
         if( r > 255 ) r = 255;
        if( r <   0 ) r = 0;
         if( g > 255 ) g = 255;
        if( g <   0 ) g = 0;
        if( b > 255 ) b = 255;
        if( b <   0 ) b = 0;

        try {
            PrintWriter leddev = new PrintWriter(new BufferedWriter(new FileWriter("/sys/class/leds/ktd202x:led1/device/registers")));
            leddev.print("led1=" + r + ";ch1_enable=1;led2=" + g + ";ch2_enable=1;led3=" + b + ";ch3_enable=1;");
             leddev.close();
        } catch(Exception e) {
             System.out.println("LED write error" + e);
        }
    }

    /**
     * メイン
     */
    public static void main(String args[])
    {
        led.changeLed(255,0,255);
        try {
            Thread.sleep(3000);
        } catch(Exception e) {
           
         }
        led.resetLed();
    }

}


google aiy project 再インストール

2018-11-19 20:33:00 | raspberry ...

google aiy voice kit & google aiy vision kit でアップデートがうまくいかなかったため手動でアップデートしました。

1.うまくアップデートできないパッケージを削除します。

$ sudo apt-get remove aiy-voicebonnet-soundcard-dkms
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  aiy-vision-dkms avahi-utils
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  aiy-core aiy-full aiy-projects-python aiy-voicebonnet-routes
  aiy-voicebonnet-soundcard-dkms
0 upgraded, 0 newly installed, 5 to remove and 0 not upgraded.
36 not fully installed or removed.
After this operation, 1,963 kB disk space will be freed.
Do you want to continue? [Y/n] y

2.うまく削除されたら再度インストールします。

$ sudo apt-get install aiy-vision-dkms avahi-utils aiy-projects-python  aiy-voicebonnet-soundcard-dkms

3.ドライバを再度インストールします。

$ ls /usr/src
aiy-1.1                        leds-ktd202x-1.1           pwm-soft-1.1
aiy-vision-1.1                 linux-headers-4.14.79+     sense-hat
aiy-voicebonnet-soundcard-1.0  linux-headers-4.14.79-v7+

$ sudo dkms install -m aiy -v 1.1

$ sudo dkms install -m aiy-voicebonnet-soundcard -v 1.0

$ sudo dkms install -m leds-ktd202x -v 1.1

$ sudo dkms install -m pwm-soft -v 1.1

$ sudo dkms install -m aiy-vision -v 1.1

参考


JavaでRaspberry PiのIO制御

2018-11-16 20:45:00 | raspberry ...

JavaからRaspberry PiのIOを制御できるライブラリにpi4jがあります。

インストール

Java Runtime (JRE/JDK)WiringPi Native Libraryをあらかじめインストールしておく必要があります。

$ curl -s get.pi4j.com | sudo bash

コンパイル

次のコマンドでソースコードをコンパイルします。

$ /opt/pi4j/bin/pi4j –c sample.java

実行

次のコマンドで実行します。

$ /opt/pi4j/bin/pi4j sample

bluejの設定

bluejを使うと簡単にプログラミングできるようです。次のコマンドで設定ファイルを開きます。

$ sudo leafpad /usr/share/bluej/bluej.defs

ファイルの192行目あたりに次の1行を追加します。

#bluej.userlibLocation=C\:\\some\\directory\\somewhere
bluej.userlibLocation=/opt/pi4j/lib                                        #<--この1行を追加

参考サイト


javaでシリアル通信

2018-11-15 20:29:00 | raspberry ...

ライブラリをインストールします。

$ sudo apt-get install librxtx-java

サンプルコードを入力します。(ARMアーキテクチャ環境のJava7でRXTXをビルドするのページより)

//http://d.hatena.ne.jp/talisker_ZQN/20130508/1368017726
import gnu.io.CommPortIdentifier;
import java.util.Enumeration;

public class Test{
  public static void main(String[] args){
    System.out.println("main method start.");
    try{
      Enumeration portList = CommPortIdentifier.getPortIdentifiers();
      CommPortIdentifier port = null;
      while (portList.hasMoreElements()) {
        port = (CommPortIdentifier)portList.nextElement();
        System.out.println(port.getName());
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

コンパイル&実行します。

コンパイル

$ javac -cp .:/usr/share/java/RXTXcomm.jar Test.java

実行 シリアルポートの一覧が表示される

$ java -cp .:/usr/share/java/RXTXcomm.jar -Djava.library.path=/usr/lib/jni Test


Javaからシリアル(RS232C)通信をするのページ
にサンプルプログラムが存在するので動作チェックすることができます。

//http://ytkoks.github.io/programming/2012/08/31/serial-communications-with-java/
import java.io.*;
import java.util.*;
import gnu.io.*;

public class serial implements SerialPortEventListener {
    private SerialPort port;
    private static BufferedReader reader;

    serial() {
        try {
            // Serial port initialize
            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("/dev/ttyS0");
            port = (SerialPort)portId.open("serial", 2000);

            port.setSerialPortParams(
                9600,                   // 通信速度[bps]
                SerialPort.DATABITS_8,   // データビット数
                SerialPort.STOPBITS_1,   // ストップビット
                SerialPort.PARITY_NONE   // パリティ
            );
            port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

            reader = new BufferedReader(
                     new InputStreamReader(port.getInputStream()));

            try {
                port.addEventListener(this);
                port.notifyOnDataAvailable(true);
            } catch (TooManyListenersException e) {
                System.out.println("Error: " + e);
            }

        } catch (Exception e) {
            System.out.println("Error: " + e);
            System.exit(1);
        }
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            OutputStream out = port.getOutputStream();
            boolean flagQuit = false;
            while (!flagQuit) {
                String input = br.readLine();
                if (input.length() > 0) {
                    if (input.equals(":quit"))
                        break;
                    input += "\r";
                    out.write(input.getBytes("US-ASCII"));
                }

            }

            port.close();

        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }

    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            String buffer = null;
            try {
                while (reader.ready()) {
                    buffer = reader.readLine();
                    System.out.println(buffer);
                }
            } catch (IOException ex){
                ex.printStackTrace();
                System.exit(1);
            }
        }
    }

    public static void main(String arg[]) {
        serial serial = new serial();
        serial.run();
    }
}

 

参考