2021年4月30日金曜日

AlmaLinux8.3にStellariumをインストールする

Stellariumはパソコン上で星座を表示できるプラネタリウムソフトです。

〇Stellariumの画面

インストール方法

シェルから以下のコマンド実行します
sudo dnf -y install stellarium

関連情報

・Stellariumに関する他の情報はこちらを参照してください。

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと回転ボリュームセンサーで回転角度を取得する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと回転ボリュームセンサーで回転角度を取得するには、以下の手順を実行します。

実装手順

1. 部品の用意と配線
以下の部品を用意して、接続します。

・Grove Base HAT for Raspberry Pi Zero
https://akizukidenshi.com/catalog/g/gM-13879/

・GROVE - Rotary Angle Sensor
※以下のセットの中に含まれています
Grove Inventor Kit for micro:bit
https://akizukidenshi.com/catalog/g/gK-12516/

・Grove Base HAT for Raspberry Piと回転ボリュームセンサー
回転ボリュームセンサーをA0ポートに接続します

2. grove.pyのインストール
以下のコマンドを実行します
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

3. 明るさを取得するプログラムの作成と実行
以下のプログラムを保存して実行します
grove_rotary_angle_value.py
from grove.grove_rotary_angle_sensor import GroveRotaryAngleSensor
import time

PIN_A0 = 0
sensor = GroveRotaryAngleSensor( PIN_A0)
while True:
  print("value: {}".format(sensor.value))
  time.sleep(1)

以下のコマンドで角度を取得するプログラムを実行します
python3 grove_rotary_angle_value.py

関連情報

Groveデバイスまとめ

2021年4月29日木曜日

AlmaLinux8.3にKalziumをインストールする

Kalziumで周期表や元素の融点や沸点などの情報や原子配列を学ぶことができます。

〇Kalziumの画面

インストール方法

以下のコマンドを実行します。
sudo dnf -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install flathub org.kde.kalzium

関連情報

・Kalziumに関する他の記事は、こちらを参照してください。

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと温度センサーのデータを送受信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと温度センサーのデータを送受信するには、以下の手順を実行します。

実装手順

1. grove.pyとpaho-mqttモジュールをインストール
以下のコマンドでgrove.pyとpaho-mqttモジュールをインストールします。
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

pip3 install paho-mqtt

2. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った明るさのデータを表示します。

mosquitto_sub_grove_temp_sensor.py
import paho.mqtt.client as mqtt

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_grove_temp_sensor.py

3. 温度データの送信
以下のプログラムで温度データを送信します。

mosquitto_pub_grove_temp_sensor.py
import paho.mqtt.publish as publish
from grove.factory import Factory
import time

PIN_A0 = 0
sensor = Factory.getTemper("NTC-ADC", PIN_A0)

def read_grove_temp_sensor():
  return sensor.temperature

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

val = read_grove_temp_sensor()
publish.single(topic, "grove_temp_sensor:{}".format(val), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_grove_temp_sensor.py

関連情報

Groveデバイスまとめ

2021年4月28日水曜日

AlmaLinux8.3にGnome Geniusをインストールする

Gnome Geniusは汎用計算機の機能を持つ他、Matlab/Mathmaticaと似た点を持つプログラミング言語です。

〇Gnome Geniusの画面

インストール方法

以下のコマンドを実行します。
sudo dnf -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install flathub org.gnome.Genius

関連情報

・Gnome Geniusに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで取得したデータを返すREST APIを作成する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで取得したデータを返すREST APIを作成するには以下の手順を実行します。

実装手順

1. grove.pyとflaskモジュールをインストール
以下のコマンドでgrove.pyとflaskモジュールをインストールします。
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

pip3 install flask

3. Flask REST APIアプリケーションの作成
/grove_temp_sensorにアクセスされたとき、明るさの情報を取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
from grove.factory import Factory
import time

app = Flask(__name__)

PIN_A0 = 0
sensor = Factory.getTemper("NTC-ADC", PIN_A0)

@app.route('/grove_temp_sensor')
def get_grove_temp_sensor():
  return {"temperature":sensor.temperature}

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

~/.local/bin/flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、温度をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/grove_temp_sensor

関連情報

Groveデバイスまとめ

2021年4月27日火曜日

AlmaLinuxにスタンドアローン版のOmniDBとMariaDBをインストールする

OmniDBはオープンソースのデータベース管理ツールです。

〇スタンドアローン版OmniDBの画面

インストール方法

以下のコマンドを実行します。
1. (任意)MariaDBをインストール
※ローカルでMariaDBを試したい場合は、以下のコマンドを実行します。
sudo dnf -y install mariadb mariadb-server

sudo systemctl enable mariadb.service

sudo systemctl start mariadb.service

sudo mysql -uroot -e "SET PASSWORD = PASSWORD('root'); FLUSH PRIVILEGES;"
※パスワードは適宜変更してください

2. OmniDBのインストール
sudo dnf -y install libXScrnSaver

wget https://github.com/OmniDB/OmniDB/releases/download/3.0.3b/omnidb-app-3.0.3b_linux_x86_64.rpm

sudo dnf -y install omnidb-app-3.0.3b_linux_x86_64.rpm

関連情報

・OmniDBのwebサイト
https://omnidb.org/en/

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで取得したデータをPostgreSQLに保存する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで取得したデータをPostgreSQLに保存するには以下の手順を実行します。

実装手順

1. データ保持用のテーブル作成 PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table grove_temperature_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature float,
  constraint pk_grove_temperature_sensor primary key (device_name, data_ts)
);

2. grove.pyとpsycopg2モジュールをインストール
以下のコマンドでgrove.pyとpsycopg2モジュールをインストールします。
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

pip3 install psycopg2-binary

3. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_grove_temperature_sensor.py
import os
import psycopg2
import psycopg2.extras
from grove.factory import Factory
import time

PIN_A0 = 0
sensor = Factory.getTemper("NTC-ADC", PIN_A0)

device_name = 'test device'
sql = """insert into grove_temperature_sensor values (%s, current_timestamp, %s)"""

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
  cur.execute(sql , (device_name, sensor.temperature))
conn.commit()

4. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_grove_light_sensor.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_grove_temperature_sensor.py

関連情報

Groveデバイスまとめ

2021年4月26日月曜日

AlmaLinux8.3にOpenSCADをインストールする

OpenSCADはプログラムで3Dモデリングを行う事ができるソフトウェアです。

〇OpenSCADの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/openscad

cd /opt/openscad

sudo wget https://files.openscad.org/OpenSCAD-2021.01-x86_64.AppImage

sudo chmod +x OpenSCAD-2021.01-x86_64.AppImage

cat << EOF | sudo tee /usr/share/applications/openscad.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/openscad/OpenSCAD-2021.01-x86_64.AppImage
Name=OpenSCAD
EOF

関連情報

・OpenSCADに関する記事はこちらを参照してください。

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで温度を取得する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで温度を取得するには、以下の手順を実行します。

実装手順

1. 部品の用意と配線
以下の部品を用意して、接続します。

・Grove Base HAT for Raspberry Pi Zero
https://akizukidenshi.com/catalog/g/gM-13879/

・GROVE - 温度センサ
https://www.switch-science.com/catalog/806/

・Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサー

2. grove.pyのインストール
以下のコマンドを実行します
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

3. 明るさを取得するプログラムの作成と実行
以下のプログラムを保存して実行します
grove_temp.py
from grove.factory import Factory
import time

PIN_A0 = 0
sensor = Factory.getTemper("NTC-ADC", PIN_A0)
while True:
  print("temp: {:.1f}C".format(sensor.temperature))
  time.sleep(1)

以下のコマンドで温度を取得するプログラムを実行します。
python3 grove_temp.py

関連情報

・Grove温度センサーのデータをデータベースに記録したい場合は、以下の記事を参照してください。
Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと温度センサーで取得したデータをPostgreSQLに保存する

・BME680センサーのデータをデータベースに記録したい場合は、以下の記事を参照してください。
Raspberry Pi Zeroに接続したBME680センサーのデータをPostgreSQLに保存する

Groveデバイスまとめ

2021年4月25日日曜日

AlmaLinux8.3にメモアプリケーション(Bijiben)をインストールする

メモアプリケーション(Bijiben)で付箋紙のようにメモする事ができます。

〇メモアプリケーション(Bijiben)

インストール方法

以下のコマンドを実行します。
sudo dnf -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install flathub org.gnome.Notes

関連情報

・メモアプリケーション(Bijiben)に関する他の記事は、こちらを参照してください。

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと光センサーの明るさのデータを送受信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと光センサーの明るさのデータを送受信するには、以下の手順を実行します。

開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. paho-mqttモジュールとSeeed-grove.pyがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、paho.mqttとSeeed-grove.py用の仮想環境を作成します。
mkdir -p ~/grovepy_mqtt

cd ~/grovepy_mqtt

pipenv --python 3

pipenv install paho-mqtt Seeed-grove.py==0.3

pipenv shell

3. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った明るさのデータを表示します。

mosquitto_sub_grove_light_sensor.py
import paho.mqtt.client as mqtt

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_grove_light_sensor.py

5. 明るさのデータの送信
以下のプログラムで明るさのデータを送信します。

mosquitto_pub_grove_light_sensor.py
import paho.mqtt.publish as publish
from grove.grove_light_sensor_v1_2 import GroveLightSensor
import time

PIN_A0 = 0
sensor = GroveLightSensor(PIN_A0)

def read_grove_light_sensor():
  return sensor.light

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

val = read_grove_light_sensor()
publish.single(topic, "grove_light_sensor:{}".format(val), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_grove_light_sensor.py

関連情報

Groveデバイスまとめ

2021年4月24日土曜日

AlmaLinux8.3でStacerをインストールする

Stacerでシステムのモニタリングや設定を行うことができます。

〇Stacerの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/stacer

cd /opt/stacer

sudo wget https://github.com/oguzhaninan/Stacer/releases/download/v1.1.0/Stacer-1.1.0-x64.AppImage

sudo chmod +x Stacer-1.1.0-x64.AppImage

cat << EOF | sudo tee /usr/share/applications/stacer.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/stacer/Stacer-1.1.0-x64.AppImage
Name=Stacer
Categories=Accessories;
EOF

関連情報

・Stacerに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと光センサーで取得した明るさのデータを返すREST APIを作成する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと光センサーで取得した明るさのデータを返すREST APIを作成するには以下の手順を実行します。

実装手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. Seeed-grove.pyとpsycopg2モジュールがインストールされた仮想環境を作成する
pipenvを使用する場合は以下のコマンドで、Seeed-grove.py用の仮想環境を作成します。
mkdir -p ~/grovepi_flask

cd ~/grovepi_flask

pipenv --python 3

pipenv install Seeed-grove.py==0.3 flask

pipenv shell

3. Flask REST APIアプリケーションの作成
/grove_light_sensorにアクセスされたとき、明るさの情報を取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
from grove.grove_light_sensor_v1_2 import GroveLightSensor
import time

app = Flask(__name__)

@app.route('/grove_light_sensor')
def get_grove_light_sensor():
  PIN_A0 = 0
  sensor = GroveLightSensor(PIN_A0)
  return {"lightness":sensor.light}

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、明るさの情報をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/grove_light_sensor

関連情報

Raspberry Pi ZeroとCDSとMCP3425で、明るさを返すREST APIを作成する

Raspberry Pi ZeroとBME680センサーで、温度・気圧・湿度・ガスの情報を返すREST APIを作成する

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度の情報を返すREST APIを作成する

Raspberry Pi Zeroと照度センサーモジュールで、照度を返すREST APIを作成する

Groveデバイスまとめ

2021年4月23日金曜日

AlmaLinux8.3にKanboardとMariaDBをインストールする

Kanboardはタスク管理をおこなうPHP製のソフトウェアです。

○Kanboardの画面
ブラウザでhttp://<ホスト名またはアドレス>/kanboard/ にアクセスします。
デフォルト管理者はユーザ名admin、パスワードadminでログインします

インストール手順

以下の手順を実行します。
1. firewallでhttpの80番ポートを開けます
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

2. MariaDBをインストール
sudo dnf -y install mariadb mariadb-server

sudo systemctl enable mariadb.service

sudo systemctl start mariadb.service

sudo mysql -uroot -e "SET PASSWORD = PASSWORD('root'); FLUSH PRIVILEGES;"

mysql -uroot -proot -e "CREATE DATABASE kanboard DEFAULT CHARACTER SET utf8mb4;"
mysql -uroot -proot -e "CREATE USER kanboard@localhost IDENTIFIED BY 'kanboard';"
mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON kanboard.* TO 'kanboard'@'localhost';"
mysql -uroot -proot -e "FLUSH PRIVILEGES;"

3. ApacheとPHPのインストール
sudo dnf install -y httpd \
  php \
  php-mysqlnd \
  php-json \
  php-opcache \
  php-xml \
  php-dom \
  php-mbstring \
  php-gd \
  php-curl

sudo systemctl enable php-fpm
sudo systemctl enable  httpd

4. SELinuxの無効化
sudo setenforce 0
sudo getenforce
sudo sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5. Kanboardのインストール
wget https://github.com/kanboard/kanboard/archive/v1.2.18.zip

unzip v1.2.18.zip

sudo mv kanboard* /opt/kanboard

cp /opt/kanboard/config.default.php /opt/kanboard/config.php

sed -i -e "s#define('DB_DRIVER', 'sqlite');#define('DB_DRIVER', 'mysql');#" /opt/kanboard/config.php
sed -i -e "s#define('DB_USERNAME', 'root');#define('DB_USERNAME', 'kanboard');#" /opt/kanboard/config.php
sed -i -e "s#define('DB_PASSWORD', '');#define('DB_PASSWORD', 'kanboard');#" /opt/kanboard/config.php

sudo chown -R apache:apache /opt/kanboard
sudo ln -s /opt/kanboard/ /var/www/html/

sudo systemctl restart httpd

関連情報

・Kanboardに関する他の情報はこちらを参照してください。

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと光センサーで取得した明るさのデータをPostgreSQLに保存する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと光センサーで取得した明るさのデータをPostgreSQLに保存するには以下の手順を実行します。

実装手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table grove_light_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  lightness float,
  constraint pk_grove_light_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. Seeed-grove.pyとpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、Seeed-grove.py用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/grovepi_pg

cd ~/grovepi_pg

pipenv --python 3

pipenv install Seeed-grove.py==0.3 psycopg2-binary

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_grove_light_sensor.py
import os
import psycopg2
import psycopg2.extras
from grove.grove_light_sensor_v1_2 import GroveLightSensor
import time

PIN_A0 = 0
sensor = GroveLightSensor(PIN_A0)

device_name = 'test device'
sql = """insert into grove_light_sensor values (%s, current_timestamp, %s)"""

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
  cur.execute(sql , (device_name, sensor.light))
conn.commit()

5. プログラムの実行 データベースの接続情報を環境変数に設定してrecord_grove_light_sensor.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_grove_light_sensor.py

関連情報

Groveデバイスまとめ

2021年4月22日木曜日

AlmaLinux8.3にgLabelsをインストールする

gLabelsで名刺や宛先ラベルなどをデザインする事ができます。

〇gLabelsの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/glabels

cd /opt/glabels

sudo wget https://github.com/jimevins/glabels-qt/releases/download/glabels-3.99-master564/glabels-3.99-master564-x86_64.AppImage

sudo chmod +x glabels-3.99-master564-x86_64.AppImage

cat << EOF | sudo tee /usr/share/applications/glabels.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/glabels/glabels-3.99-master564-x86_64.AppImage
Name=gLabes
Categories=Office;
EOF

関連情報

・gLabelsに関する他の情報はこちらを参照してください。

2021年4月21日水曜日

AlmaLinux8.3にGeoGebraをインストールする

GeoGebraは幾何・代数・統計・解析に基づいた動的な数学アプリケーションです。

〇GeoGebraの画面

インストール方法

シェルから以下のコマンド実行します
wget http://www.geogebra.net/linux/rpm/x86_64/geogebra5-5.0.636.0-2670.x86_64.rpm

sudo dnf -y install ./geogebra5-5.0.636.0-2670.x86_64.rpm

関連情報

・GeoGebraに関する他の記事はこちらを参照してください。

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、DHT11の温度・湿度データを送受信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、DHT11の温度・湿度データを送受信するには、以下の手順を実行します。

〇開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. paho-mqttモジュールとsmbusがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、paho.mqttとdht11用の仮想環境を作成します。
mkdir -p ~/dht11_mqtt

cd ~/dht11_mqtt

pipenv --python 3

pipenv install paho-mqtt dht11

pipenv shell

3. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った明るさのデータを表示します。

mosquitto_sub_dht11.py
import paho.mqtt.client as mqtt

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_dht11.py

5. 温度・湿度データの送信
以下のプログラムで温度・湿度データを送信します。

mosquitto_pub_dht11.py
import paho.mqtt.publish as publish
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

def read_dht11():
  data = ""
  while True:
    instance = dht11.DHT11(pin=14)
    result = instance.read()
    if result.is_valid():
      data = "{},{}".format(result.temperature, result.humidity)
      break
  return data

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

val = read_dht11()
publish.single(topic, "dht11:{}".format(val), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_dht11.py

2021年4月20日火曜日

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレートにつける事の出来るブロックを作成する

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレートにつける事の出来るブロックを作成するには以下の手順を実行します。
ユニバーサルプレートの足/土台として使用する事が出来ます。

〇ブロックの写真(2x2と2x4のサイズ)

〇タミヤのユニバーサルプレートにブロックをつけた状態の写真

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
NUM_SHAFT_DとNUM_SHAFT_Wで突起部分の数を調整する事が出来ます。

・タミヤのユニバーサルプレートにつける事のできるキューブのOpenSCADコード
SHAFT_DIAMETER=3;
SHAFT_DISTANCE=5;
SHAFT_HEIGHT=3;
CUBE_H=10;
NUM_SHAFT_W=4;
NUM_SHAFT_D=2;
OFFSET=1;

translate([0, 0, 0])
linear_extrude(height=CUBE_H){
    square([NUM_SHAFT_W*SHAFT_DISTANCE, NUM_SHAFT_D*SHAFT_DISTANCE]);
}


for( lw = [0 : NUM_SHAFT_W-1] ){
    for( ld = [0 : NUM_SHAFT_D-1] ){
        translate([SHAFT_DISTANCE*lw+SHAFT_DIAMETER/2+OFFSET, SHAFT_DISTANCE*ld+SHAFT_DIAMETER/2+OFFSET, CUBE_H])
        linear_extrude(height=SHAFT_HEIGHT){
            circle(SHAFT_DIAMETER/2, $fn=50);
        }
    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

AlmaLinux8.3にVivaldiブラウザをインストールする

Vivaldiは高速・セキュア・フレキシブルなブラウザです。

〇Vivaldiの画面

インストール方法

以下のコマンドを実行します。
wget https://downloads.vivaldi.com/stable/vivaldi-stable-3.7.2218.52-1.x86_64.rpm

sudo dnf -y install vivaldi-stable-3.7.2218.52-1.x86_64.rpm

関連情報

・Vivaldiに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度の情報を返すREST APIを作成する

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度の情報を返すREST APIを作成するには、以下の手順を実行します。

開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. dht11モジュールとflaskがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、dht11とflask用の仮想環境を作成します。
mkdir -p ~/dht11_flask

cd ~/dht11_flask

pipenv --python 3

pipenv install dht11 flask

pipenv shell

3. Flask REST APIアプリケーションの作成
/dht11にアクセスされたとき、温度・湿度の情報を取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

app = Flask(__name__)

@app.route('/dht11')
def get_dht11():
  data = {}
  while True:
    instance = dht11.DHT11(pin=14)
    result = instance.read()
    if result.is_valid():
      data = {"temperature":result.temperature, "humidity":result.humidity}
      break
  return jsonify(data)

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、温度・湿度の情報をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/dht11

2021年4月19日月曜日

AlmaLinux8.3にFreeCADをインストールする

FreeCADはオープンソースのCADアプリケーションです。

〇FreeCADの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/freecad

cd /opt/freecad

sudo dnf -y install libXScrnSaver

sudo wget https://github.com/FreeCAD/FreeCAD/releases/download/0.19.1/FreeCAD_0.19-24276-Linux-Conda_glibc2.12-x86_64.AppImage

sudo chmod +x FreeCAD_0.19-24276-Linux-Conda_glibc2.12-x86_64.AppImage

cat << EOF | sudo tee /usr/share/applications/freecad.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/freecad/FreeCAD_0.19-24276-Linux-Conda_glibc2.12-x86_64.AppImage
Name=FreeCAD
Categories=Development;
EOF

関連情報

・FreeCADに関する他の記事はこちらを参照してください。

Raspberry Pi Zeroに接続したDHT11センサーの温度・湿度データをPostgreSQLに保存する

DHT11センサーの温度・湿度データをPostgreSQLに保存するには以下の手順を実行します。

※Raspberry Pi ZeroとDHT11センサーモジュールの接続については、以下を参照してください。
Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得する

実装手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table dht11_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature float,
  humidity float,
  constraint pk_dht11_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. dht11とpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、dht11とpsycopg2用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/dht11_pg

cd ~/dht11_pg

pipenv --python 3

pipenv install dht11 psycopg2-binary

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_dht11.py
import os
import psycopg2
import psycopg2.extras
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

while True:
  instance = dht11.DHT11(pin=14)
  result = instance.read()
  if result.is_valid():
    print("Temperature: {:.1f}(C)".format(result.temperature))
    print("Humidity: {:.1f}(%)".format(result.humidity))

    device_name = 'test device'
    sql = """insert into dht11_sensor values (%s, current_timestamp, %s, %s)"""

    conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
    with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
      cur.execute(sql , (device_name, result.temperature, result.humidity))
    conn.commit()
    break

GPIO.cleanup()

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_dht11.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python record_dht11.py

関連情報

・蓄積したデータを可視化するにはApache Supersetなどを使用することもできます。
Apache Supersetでデータセットを集計して二重軸時系列グラフ(Mixed Time-Series)で表示する

2021年4月18日日曜日

AlmaLinux8.3にBlenderをインストールする

Blenderはオープンソースの3D CG作成ソフトウェアです。

〇Blenderの画面

インストール方法

以下のコマンドを実行します。
cd /opt

sudo wget https://ftp.nluug.nl/pub/graphics/blender/release/Blender2.92/blender-2.92.0-linux64.tar.xz

sudo tar Jxfv blender-2.92.0-linux64.tar.xz

cat << EOF | sudo tee /usr/share/applications/blender.desktop
[Desktop Entry]
Type=Application
Version=1.0
Name=Blender
Icon=/opt/blender-2.92.0-linux64/blender.svg
Exec=/opt/blender-2.92.0-linux64/blender
Categories=Graphics;
EOF

関連情報

・Blenderに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得する

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得するには、以下の手順を実行します。

実装手順

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得するには、以下の手順を実行します。
1. 部品の用意と配線
以下の部品を用意して、下記回路図に基づいて接続します。

・DHT11センサーモジュール
DHT11温湿度モジュール(Temperature and Humidity Sensor)
https://akizukidenshi.com/catalog/g/gM-07040/

〇Raspberry Pi ZeroとDHT11センサーモジュールを接続した写真

Raspberry Pi ZeroとDHT11は以下の様に接続します
Raspberry Pi 5Vピン(ピン2) -> DHT11の5Vへ(付属ケーブルの赤)
Raspberry Pi GPIO14ピン(ピン8) -> DHT11のDigitalピンへ(付属ケーブルの緑)
Raspberry Pi GNDピン(ピン6) -> DHT11のGNDへ(付属ケーブルの黒)

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. dht11モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、dht11用の仮想環境を作成します。
mkdir -p ~/dht11

cd ~/dht11

pipenv --python 3

pipenv install dht11

pipenv shell

4. 温度・湿度取得プログラムの作成と実行
以下のプログラムを保存して実行します

get_temp_humidity.py
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

# read data using pin 14
instance = dht11.DHT11(pin=14)
result = instance.read()
if result.is_valid():
  print("Temperature: {:.1f}(C)".format(result.temperature))
  print("Humidity: {:.1f}(%)".format(result.humidity))

GPIO.cleanup()

以下のコマンドでプログラムを実行して温度と湿度を表示します
python3 get_temp_humidity.py

関連情報

DHT11センサーを使ってREST APIでデータを提供したり、DBに保存したりすることもできます。以下の記事を参照してください。

Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度の情報を返すREST APIを作成する

Raspberry Pi Zeroに接続したDHT11センサーの温度・湿度データをPostgreSQLに保存する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、DHT11の温度・湿度データを送受信する

2021年4月17日土曜日

AlmaLinux8.3にRawTherapeeをインストールする

RawTherapeeはRAW画像編集アプリケーションです。

〇RawTherapeeの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/rawtherapee

cd /opt/rawtherapee

sudo wget https://rawtherapee.com/shared/builds/linux/RawTherapee_5.8.AppImage

sudo chmod +x RawTherapee_5.8.AppImage

cat << EOF | sudo tee /usr/share/applications/rawtherapee.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/rawtherapee/RawTherapee_5.8.AppImage
Name=RawTherapee
Categories=Graphics;
EOF

関連情報

・RawTherapeeに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとCDSとMCP3425で、明るさを返すREST APIを作成する

Raspberry Pi ZeroとCDSとMCP3425で、明るさを返すREST APIを作成するには、以下の手順を実行します。

※Raspberry Pi ZeroとCDSとMCP3425の接続は以下の記事を参照してください。
Raspberry Pi ZeroとCDSとMCP3425で明るさを測る
https://serverarekore.blogspot.com/2021/04/raspberry-pi-zerocdsmcp3425.html

開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. smbusモジュールとflaskがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとflask用の仮想環境を作成します。
mkdir -p ~/smbus_flask_mcp3425

cd ~/smbus_flask_mcp3425

pipenv --python 3

pipenv install flask smbus

pipenv shell

3. Flask REST APIアプリケーションの作成
/lightnessにアクセスされたとき、明るさを取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
import smbus
import time

i2c = smbus.SMBus(1)
addr_mcp3425=0x68

FIELD_PGA_GAIN_1X = 0x00 # gain 1X
FIELD_SAMPLE_RATE_15SPS_16BIT = 0x08 # 15SPS 16bit sampling
FIELD_CONV_MODE = 0x00 # one-shot
FIELD_READY = 0x80

def read_cds():
  i2c.write_byte(addr_mcp3425, FIELD_PGA_GAIN_1X | FIELD_SAMPLE_RATE_15SPS_16BIT | FIELD_CONV_MODE| FIELD_READY)
  time.sleep(0.15)
  dat = i2c.read_i2c_block_data(addr_mcp3425, 0x00, 3)
  val = (dat[0] << 8) | dat[1]
  return val

app = Flask(__name__)

@app.route('/lightness')
def get_lightness():
  val = read_cds()
  return jsonify({"lightness":val})

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、明るさの情報をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/lightness

2021年4月16日金曜日

AlmaLinux8.3にBlueJをインストールする

BlueJはJava言語の学習に適したIDEです。

〇BlueJの画面

インストール方法

以下のコマンドを実行して、BlueJをインストールします。
sudo yum -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install https://flathub.org/repo/appstream/org.bluej.BlueJ.flatpakref

関連情報

・BlueJに関する他の記事は、こちらを参照してください。

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、CDSの明るさデータを送受信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、CDSの明るさデータを送受信するには、以下の手順を実行します。

※Raspberry Pi ZeroとCDSとMCP3425の接続は以下の記事を参照してください。
Raspberry Pi ZeroとCDSとMCP3425で明るさを測る
https://serverarekore.blogspot.com/2021/04/raspberry-pi-zerocdsmcp3425.html

開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. paho-mqttモジュールとsmbusがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、paho.mqttとsmbus用の仮想環境を作成します。
mkdir -p ~/smbus_mqtt

cd ~/smbus_mqtt

pipenv --python 3

pipenv install paho-mqtt smbus

pipenv shell

3. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った明るさのデータを表示します。

mosquitto_sub_cds.py
import paho.mqtt.client as mqtt
import time

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_cds.py

5. 明るさデータの送信
以下のプログラムで明るさデータを送信します。

mosquitto_pub_cds.py
import paho.mqtt.publish as publish
import smbus
import time

i2c = smbus.SMBus(1)
addr_mcp3425=0x68

FIELD_PGA_GAIN_1X = 0x00 # gain 1X
FIELD_SAMPLE_RATE_15SPS_16BIT = 0x08 # 15SPS 16bit sampling
FIELD_CONV_MODE = 0x00 # one-shot
FIELD_READY = 0x80

def read_cds():
  i2c.write_byte(addr_mcp3425, FIELD_PGA_GAIN_1X | FIELD_SAMPLE_RATE_15SPS_16BIT | FIELD_CONV_MODE| FIELD_READY)
  time.sleep(0.15)
  dat = i2c.read_i2c_block_data(addr_mcp3425, 0x00, 3)
  val = (dat[0] << 8) | dat[1]
  return val

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

val = read_cds()
publish.single(topic, "cds:{}".format(val), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_cds.py

2021年4月15日木曜日

Raspberry Pi Picoと赤外線リモコン受信モジュールOSRB38C9AAで赤外線リモコンを受信する

Raspberry Pi Picoで赤外線リモコンで押されたボタンを取得するには、以下の手順を実行します。

〇Raspberry Pi Picoと赤外線リモコン受信モジュールOSRB38C9AAを接続した写真

実装手順

1. 部品の用意
以下の部品を用意します。

・赤外線リモコン受信モジュールOSRB38C9AA(2個入)
https://akizukidenshi.com/catalog/g/gI-04659/

・オプトサプライ赤外線リモコン
https://akizukidenshi.com/catalog/g/gM-07245/
※NECフォーマットの赤外線リモコンです。

〇オプトサプライ赤外線リモコンの写真

・コネクタ付コード 3P (黒赤黄)
https://akizukidenshi.com/catalog/g/gC-15384/
※これは必須ではないですが、配線がスッキリとできます。

2. Raspberry Pi Picoと赤外線リモコン受信モジュールを配線します
OSRB38C9AAのピン配列を受光面&足を下にした面から見て、
OSRB38C9AAの左側のピン -> Raspberry Pi PicoのGP2ピン
OSRB38C9AAの中央のピン -> Raspberry Pi PicoのGNDピン
OSRB38C9AAの右側のピン -> Raspberry Pi Picoの3V3(OUT)ピン(36番ピン)

3. 「Device drivers for IR (infra red) remote controls」モジュールの導入
Thonnyを利用する場合、mycropython_irモジュールのインストールは以下の手順を実行します。

3-1.micropython_irモジュールのダウンロード
以下のページからCode -> Download ZIPを選択して、モジュールのソースコードをダウンロードします。
ZIPファイルをダウンロード後、解凍しておきます。
https://github.com/peterhinch/micropython_ir

3-2.micropython_irモジュールのアップロード
Thonnyの「表示」メニューから→「ファイル」を選択します。Rapberry Pi Pico側に/libフォルダがなければ、ペイン下側のフォルダで右クリックメニューから[
New Directory...」を選択し、フォルダ名を入力して/libフォルダを作成します。

フォルダ作成ダイアログ

3.3.ローカルPCのフォルダ内のPythonモジュールをアップロード
Raspberry Pi Pico側の/libフォルダに移動後(左側ペインの下のlibフォルダをダブルクリックで移動)、ローカルPCのフォルダにあるir_rxフォルダで右クリックメニューから「upload to /lib」を選択してモジュールのライブラリをアップロードします。

4. プログラミングとプログラムのアップロード
以下のプログラムをmain.pyとしてRaspberry Pi Picoに保存して、実行します。実行後、オプトサプライ赤外線リモコンのボタンを押して、押したボタンに対応するメッセージがコンソールに表示されることを確認します。
main.py
import time
from machine import Pin
from ir_rx.nec import NEC_8

# オプトサプライ赤外線リモコンのデータと対応するボタンのメッセージ
keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF

# 赤外線の信号を受信時に呼び出されるコールバック関数
def callback(data, addr, ctrl):
    global last_code
    if data < 0:  # repeat code -> 同じキーが繰り返しが押されたときの処理
        print(keydata[last_code])
    else:
        last_code = data
        print(keydata[data]) # キーデータに対応する文字列を表示します

# 2番ピンを使用するようにして、NEC 8bitクラスを初期化。上記のcallback関数を登録します。
ir = NEC_8(Pin(2, Pin.IN), callback)
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
while True:
    time.sleep_ms(1000)

Q&A・応用編

Raspberry Pi Picoと赤外線リモコンモジュールと3つのLEDを接続した例です。コメント欄のQ&Aでのコードで使用した回路とコードは以下になります。

○回路図

○ブレッドボード上での実装例

※2022/02/28追記:001様のコメントに対するコード(その1)
A/B/Cボタンで点灯(BボタンLEDは点滅)、電源ボタンで消灯する例です。

import time
from machine import Pin
from ir_rx.nec import NEC_8
from machine import PWM

# オプトサプライ赤外線リモコンのデータと対応するボタンのメッセージ
keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF


# 赤外線の信号を受信時に呼び出されるコールバック関数
def callback(data, addr, ctrl):
    global last_code
    if data < 0:  # repeat code -> 同じキーが繰り返しが押されたときの処理
        print(keydata[last_code])
    else:
        last_code = data
        print(keydata[data]) # キーデータに対応する文字列を表示します

pwm = PWM(machine.Pin(16, machine.Pin.OUT))
pwm.freq(1000)
#led1 = machine.PWM( machine.Pin(16, machine.Pin.OUT))
led2 = machine.Pin(17, machine.Pin.OUT)
led3 = machine.Pin(18, machine.Pin.OUT)


# 2番ピンを使用するようにして、NEC 8bitクラスを初期化。上記のcallback関数を登録します。
ir = NEC_8(Pin(2, Pin.IN), callback)
state_b = False
cnt = 0
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
while True:
    time.sleep_ms(1)
    cnt = cnt + 1
    if last_code == 0x58:
        pwm.duty_u16(65535)
    elif last_code == 0xD8:
        pwm.duty_u16(0)
    if last_code == 0xF8:
        led3.value(1)
    elif last_code == 0xD8:
        led3.value(0)
    # last_codeはグルーバル変数でcallback関数にいつでも書き換えられるので、値をlocal_last_codeに保持
    #local_last_code = last_code
    #while local_last_code == 0x78:
    if last_code == 0x78:
        state_b = True
    elif last_code == 0xD8:
        state_b = False
        led2.value(0)
    if state_b == True:
        if cnt % 1000 < 500:
            led2.value(1)
        else:
            led2.value(0)

※2022/02/28追記: A/B/Cボタンを押している間のみ点灯(BボタンLEDは点滅)するように変更(その2)
import time
from machine import Pin
from ir_rx.nec import NEC_8
from machine import PWM

# オプトサプライ赤外線リモコンのデータと対応するボタンのメッセージ
keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF
last_ticks = time.ticks_ms()


# 赤外線の信号を受信時に呼び出されるコールバック関数
def callback(data, addr, ctrl):
    global last_code
    global last_ticks
    last_ticks = time.ticks_ms() # callback関数が呼ばれた最後の時間を保存
    if data < 0:  # repeat code -> 同じキーが繰り返しが押されたときの処理
        print(keydata[last_code])
    else:
        last_code = data
        #print(keydata[data]) # キーデータに対応する文字列を表示します

pwm = PWM(machine.Pin(16, machine.Pin.OUT))
pwm.freq(1000)
#led1 = machine.PWM( machine.Pin(16, machine.Pin.OUT))
led2 = machine.Pin(17, machine.Pin.OUT)
led3 = machine.Pin(18, machine.Pin.OUT)


# 2番ピンを使用するようにして、NEC 8bitクラスを初期化。上記のcallback関数を登録します。
ir = NEC_8(Pin(2, Pin.IN), callback)
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
state = False
state_cnt = 0
threshold = 400 # コールバック関数が最後に呼ばれて400ms経つと消灯処理を行います
while True:
    time.sleep_ms(100)
    # Bボタン
    if last_code == 0x78 and time.ticks_ms() - last_ticks < threshold:
        state_cnt = state_cnt + 1
        if state_cnt >= 10:
            state_cnt = 0
            if state:
                pwm.duty_u16(0)
                state = False
            else:
                pwm.duty_u16(65535)
                state = True
    # Aボタン
    elif last_code == 0xF8 and time.ticks_ms() - last_ticks < threshold:
        led2.value(1)
    # Cボタン
    elif last_code == 0x58 and time.ticks_ms() - last_ticks < threshold:
        led3.value(1)
    # 一定時間たったら消灯処理
    if time.ticks_ms() - last_ticks >= threshold:
        pwm.duty_u16(0)
        led2.value(0)
        led3.value(0)

※2022/02/28追記: Aボタンがトグル動作、B/Cボタンを押している間のみ点灯するように変更(その3)

import time
from machine import Pin
from ir_rx.nec import NEC_8
from machine import PWM

# オプトサプライ赤外線リモコンのデータと対応するボタンのメッセージ
keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF
last_ticks = time.ticks_ms()


# 赤外線の信号を受信時に呼び出されるコールバック関数
def callback(data, addr, ctrl):
    global last_code
    global last_ticks
    last_ticks = time.ticks_ms()
    if data < 0:  # repeat code -> 同じキーが繰り返しが押されたときの処理
        print(keydata[last_code])
    else:
        last_code = data
        #print(keydata[data]) # キーデータに対応する文字列を表示します

pwm = PWM(machine.Pin(16, machine.Pin.OUT))
pwm.freq(1000)
#led1 = machine.PWM( machine.Pin(16, machine.Pin.OUT))
led2 = machine.Pin(17, machine.Pin.OUT)
led3 = machine.Pin(18, machine.Pin.OUT)


# 2番ピンを使用するようにして、NEC 8bitクラスを初期化。上記のcallback関数を登録します。
ir = NEC_8(Pin(2, Pin.IN), callback)
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
state = False
state_cnt = 0
threshold = 400
state_a = False
while True:
    time.sleep_ms(100)
    # Bボタン
    if last_code == 0x78 and time.ticks_ms() - last_ticks < threshold:
        state_cnt = state_cnt + 1
        if state_cnt >= 10:
            state_cnt = 0
            if state:
                pwm.duty_u16(0)
                state = False
            else:
                pwm.duty_u16(65535)
                state = True
    # Aボタン
    elif last_code == 0xF8 and time.ticks_ms() - last_ticks >= 200:
        # トグル動作
        if state_a == True:
            led2.value(1)
            state_a = False
        else:
            led2.value(0)
            state_a = True
    # Cボタン
    elif last_code == 0x58 and time.ticks_ms() - last_ticks < threshold:
        led3.value(1)
    # 一定時間たったら消灯
    if time.ticks_ms() - last_ticks >= threshold:
        pwm.duty_u16(0)
        led3.value(0)
        last_code = 0xFF


2022/03/02追記:(その4)Aボタンで16ピンLEDが消灯・暗く光るのトグル動作にして、同じLEDがBボタンを押したときに明るく光るサンプル
import time
from machine import Pin
from ir_rx.nec import NEC_8
from machine import PWM

# オプトサプライ赤外線リモコンのデータと対応するボタンのメッセージ
keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF
last_ticks = time.ticks_ms()


# 赤外線の信号を受信時に呼び出されるコールバック関数
def callback(data, addr, ctrl):
    global last_code
    global last_ticks
    last_ticks = time.ticks_ms()
    if data < 0:  # repeat code -> 同じキーが繰り返しが押されたときの処理
        print(keydata[last_code])
    else:
        last_code = data
        #print(keydata[data]) # キーデータに対応する文字列を表示します

pwm = PWM(machine.Pin(16, machine.Pin.OUT))
pwm.freq(1000)


# 2番ピンを使用するようにして、NEC 8bitクラスを初期化。上記のcallback関数を登録します。
ir = NEC_8(Pin(2, Pin.IN), callback)
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
threshold = 400
half_light=False
while True:
    time.sleep_ms(100)
    # Bボタン:押している間は最大点灯
    if last_code == 0x78 and time.ticks_ms() - last_ticks < threshold:
        pwm.duty_u16(65535)
    # Aボタン
    if last_code == 0xF8 and time.ticks_ms() - last_ticks >= 200:
        # トグル動作
        if half_light == True:
            half_light = False
            last_code = 0xff
        else:
            half_light = True # 暗く光るようにフラグ設定
            last_code = 0xff
    # 一定時間たったらクリア
    if time.ticks_ms() - last_ticks >= threshold:
        if half_light == True:
            pwm.duty_u16(5000) # 消灯時に暗く光るように設定
        else:
            pwm.duty_u16(0)

AlmaLinux8.3にdraw.ioをインストールする

draw.io Desktopはオープンソースのチャート描画アプリケーションです。

〇draw.io Desktopの画面

インストール方法

以下のコマンドを実行します。
wget https://github.com/jgraph/drawio-desktop/releases/download/v14.5.1/drawio-x86_64-14.5.1.rpm

sudo dnf -y install ./drawio-x86_64-14.5.1.rpm

関連情報

・draw.ioに関する他の記事は、こちらを参照してください。

Raspberry Pi Zeroに接続したCDSとMCP3425で取得した明るさのデータをPostgreSQLに保存する

CDSとMCP3425で取得した明るさのデータをPostgreSQLに保存するには以下の手順を実行します。

※Raspberry Pi ZeroとCDSとMCP3425の接続は以下の記事を参照してください。
Raspberry Pi ZeroとCDSとMCP3425で明るさを測る
https://serverarekore.blogspot.com/2021/04/raspberry-pi-zerocdsmcp3425.html

実行手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。

create table cds_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  cds_value float,
  constraint pk_cds_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. smbusとpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとPostgreSQL用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/smbus_pg

cd ~/smbus_pg

pipenv --python 3

pipenv install psycopg2-binary smbus

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_cds.py
import os
import psycopg2
import psycopg2.extras
import smbus
import time

i2c = smbus.SMBus(1)
addr_mcp3425=0x68

FIELD_PGA_GAIN_1X = 0x00 # gain 1X
FIELD_SAMPLE_RATE_15SPS_16BIT = 0x08 # 15SPS 16bit sampling
FIELD_CONV_MODE = 0x00 # one-shot
FIELD_READY = 0x80

def read_cds():
  i2c.write_byte(addr_mcp3425, FIELD_PGA_GAIN_1X | FIELD_SAMPLE_RATE_15SPS_16BIT | FIELD_CONV_MODE| FIELD_READY)
  time.sleep(0.15)
  dat = i2c.read_i2c_block_data(addr_mcp3425, 0x00, 3)
  val = (dat[0] << 8) | dat[1]
  return val

while True:
  val= read_cds()
  print("cds:{}".format(val))
  device_name = 'mcp3425'
  sql = """insert into cds_sensor values (%s, current_timestamp, %s)"""
  conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
  with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
    cur.execute(sql , (device_name, val))
  conn.commit()
  time.sleep(1)

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_cds.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_cds.py

2021年4月14日水曜日

AlmaLinux8.3にKritaをインストールする

Kritaはオープンソースのペイントソフトです

○Kritaの画面

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/krita

cd /opt/krita

sudo wget https://download.kde.org/stable/krita/4.4.3/krita-4.4.3-x86_64.appimage

sudo chmod +x krita-4.4.3-x86_64.appimage

cat << EOF | sudo tee -a /usr/share/applications/krita.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/krita/krita-4.4.3-x86_64.appimage
Name=Krita
Categories=Development;
EOF

関連情報

・Kritaに関する他の記事は、こちらを参照してください。

Raspberry Pi ZeroとCDSとMCP3425で明るさを測る

Raspberry Piはアナログ入力を持っていないので、MCP3425というアナログ電圧をデジタルに変換するICを利用します。
MCP3425で変換した電圧はI2Cインターフェイスで取得する事が出来ます。

〇Raspberry Pi ZeroとCDSとMCSP3425を接続した写真

実装手順

Raspberry Pi ZeroとCDSとMCP3425で明るさを測るには、以下の手順を実行します。
1. 部品の用意と配線
以下の部品を用意して、下記回路図に基づいて接続します。

・MCP3425
MCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール
https://akizukidenshi.com/catalog/g/gK-08018/

・CDS
CdSセル 5mmタイプ
https://akizukidenshi.com/catalog/g/gI-00110/

・1KΩ抵抗
カーボン抵抗(炭素皮膜抵抗) 1W1kΩ (100本入)
https://akizukidenshi.com/catalog/g/gR-07980/

・ユニバーサル基板
勿論、他のサイズでも問題ないです。
両面スルーホールガラスコンポジット・ユニバーサル基板 Fタイプ
https://akizukidenshi.com/catalog/g/gP-12731/

〇回路図

Raspberry Pi Zeroと回路図は以下の様に接続します
Raspberry Pi 3.3Vピン(ピン1) -> 回路図の3.3Vへ
Raspberry Pi GPIO 2/SDAピン(ピン3) -> 回路図のSDAへ
Raspberry Pi GPIO 3/SCLピン(ピン5) -> 回路図のSCLへ
Raspberry Pi Groundピン(ピン9) -> 回路図のGNDへ

2. i2cの有効化
raspi-configコマンドなどを使用してi2cを有効化します。

※i2cの有効化については、以下の記事を参照してください。
Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する
https://serverarekore.blogspot.com/2021/03/raspberry-pi-zerobme680.html

3. デバイスの認識の確認
以下のコマンドを実行してアドレス0x68のデバイスが認識されていることを確認します。
i2cdetect -y -1

4. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

5. smbus用の仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbus用の仮想環境を作成します。
mkdir -p ~/smbus

cd ~/smbus

pipenv --python 3

pipenv install smbus

pipenv shell

6. プログラムの作成と実行
以下のプログラムをファイルに保存して、実行します。

test_mcp3425.py
import smbus
import time

i2c = smbus.SMBus(1)
addr_mcp3425=0x68

FIELD_PGA_GAIN_1X = 0x00 # gain 1X
FIELD_SAMPLE_RATE_15SPS_16BIT = 0x08 # 15SPS 16bit sampling
FIELD_CONV_MODE = 0x00 # one-shot
FIELD_READY = 0x80

# Initialize

def read_cds():
  i2c.write_byte(addr_mcp3425, FIELD_PGA_GAIN_1X | FIELD_SAMPLE_RATE_15SPS_16BIT | FIELD_CONV_MODE| FIELD_READY)
  time.sleep(0.15)
  dat = i2c.read_i2c_block_data(addr_mcp3425, 0x00, 3)
  val = (dat[0] << 8) | dat[1]
  return val

while True:
  val= read_cds()
  print("cds:{}".format(val))
  time.sleep(1)

・実行コマンド
以下のコマンドでプログラムを実行し、明るさが画面に表示されることを確認します。止める時はCtrl+Cをクリックします。
python3 test_mcp3425.py

2021年4月13日火曜日

AlmaLinux8.3にInkscapeをインストールする

Inkscapeはオープンソースの画像編集ソフトウェアです。

〇Inkscapeの画面

インストール方法

以下のコマンドを実行します。
sudo yum -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install flathub org.inkscape.Inkscape

関連情報

・Inkscapeに関する他の記事は、こちらを参照してください。

Inkscapeで動画に重ね合わせるための透過PNG画像を作成する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、照度センサーモジュールの照度データを送信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、照度センサーモジュールの照度データを送信/受信するには、以下の手順を実行します。

Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照>度センサーモジュールで照度を測る」を参照してください。

〇開発手順
1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. paho-mqttモジュールとsmbusがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、paho.mqttとsmbus用の仮想環境を作成します。
mkdir -p ~/smbus_mqtt

cd ~/smbus_mqtt

pipenv --python 3

pipenv install paho-mqtt smbus

pipenv shell

3. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った照度データを表示します。

mosquitto_sub_lux.py
import paho.mqtt.client as mqtt
import time

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_lux.py

5. 照度データの送信
以下のプログラムで照度データを送信します。

mosquitto_pub_lux.py
import paho.mqtt.publish as publish
import smbus
import time

i2c = smbus.SMBus(1)
addr_tsl25721=0x39

FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)

# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)

# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)

# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2

  return lux

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

lux= read_lux()
publish.single(topic, "lux:{:.1f}".format(lux), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_lux.py

2021年4月12日月曜日

AlmaLinux8.3にZoteroをインストールする

Zoteroで研究資料の収集・管理・引用・共有をする事ができます。

〇Zoteroの画面

インストール方法

以下のコマンドを実行します。
wget 'https://www.zotero.org/download/client/dl?channel=release&platform=linux-x86_64&version=5.0.96' -O Zotero-5.0.96_linux-x86_64.tar.bz2

tar jxvf Zotero-5.0.96_linux-x86_64.tar.bz2

sudo mv Zotero_linux-x86_64 /opt

cat << EOF | sudo tee /usr/share/applications/zotero.desktop
[Desktop Entry]
Name=Zotero
Exec=/opt/Zotero_linux-x86_64/zotero
Type=Application
Terminal=false
Categories=Office;
MimeType=text/plain
EOF

関連情報

・Zoteroに関する他の記事は、こちらを参照してください。

Raspberry Pi Zeroと照度センサーモジュールで、照度を返すREST APIを作成する

Raspberry Pi Zeroと照度センサーモジュールで、照度を返すREST APIを作成するには、以下の手順を実行します。

Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照>度センサーモジュールで照度を測る」を参照してください。

開発手順

1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. smbusモジュールとflaskがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとflask用の仮想環境を作成します。
mkdir -p ~/smbus_flask

cd ~/smbus_flask

pipenv --python 3

pipenv install flask smbus

pipenv shell

3. Flask REST APIアプリケーションの作成
/bme680にアクセスされたとき、温度・気圧・湿度・ガスの情報を取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
import smbus
import time

i2c = smbus.SMBus(1)
addr_tsl25721=0x39

FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)

# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)

# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)

# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2

  return lux

app = Flask(__name__)

@app.route('/lux')
def get_lux():
  lux = read_lux()
  return jsonify({"lux":lux})

4. 実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、照度の情報をjsonで返すことを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/lux

2021年4月11日日曜日

AlmaLinux8.3にFocusWriterをインストールする

FocusWriterはシンプルなフルスクリーンエディタです。

〇FocusWriterの画面

インストール方法

以下のコマンドを実行します。
sudo dnf -y install flatpak

sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

sudo flatpak -y install flathub org.gottcode.FocusWriter

関連情報

・FocusWriterに関する他の記事は、こちらを参照してください。

Raspberry Pi Zeroに接続した照度センサーモジュールのデータをPostgreSQLに保存する

照度センサーモジュールで取得した照度データをPostgreSQLに保存するには以下の手順を実行します。
Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照度センサーモジュールで照度を測る」を参照してください。

実行手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table lux_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  lux float,
  constraint pk_lux_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. smbusとpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとPostgreSQL用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/smbus_pg

cd ~/smbus_pg

pipenv --python 3

pipenv install psycopg2-binary smbus

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_lux.py
import os
import psycopg2
import psycopg2.extras
import smbus
import time

i2c = smbus.SMBus(1)
addr_tsl25721=0x39

FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)

# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)

# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)

# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2
  return lux


while True:
  lux= read_lux()
  print("lux:{:.1f}".format(lux))
  device_name = 'tsl25721'
  sql = """insert into lux_sensor values (%s, current_timestamp, %s)"""
  conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
  with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
    cur.execute(sql , (device_name, lux))
  conn.commit()
  time.sleep(1)

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_lux.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_lux.py