2021年6月30日水曜日

OpenSCADとUltimaker Curaを使用して、単3電池保管ケースを作成する

エネループなどの充電池を多く持っていて、電池同士が不意に接触してショートしたら危ないので、保管用ケースを3Dプリンターで作ってみました。OpenSCADとUltimaker Curaを使用して、単3電池保管ケースを作成するには以下の手順を実行します。

〇作成した単3電池保管ケース

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
NUM_OF_COLSで列数を増やすとより多くの電池を収納できます。

・単3電池保管ケースのOpenSCADコード
//単3電池ケース
// 壁の厚さ
WALL_THICK=2;
//直径14.5㎜ -> 余裕を持たせて16mm
//長さ50.5mm -> 余裕を持たせて54mm 
AA_BATTERY_D=16+WALL_THICK*2;
AA_BATTERY_H=16+WALL_THICK;
AA_BATTERY_W=54+WALL_THICK*2;
// 列数
NUM_OF_COLS=4;

module aa_battery()
{
    for( lc = [0 : NUM_OF_COLS-1] ){
        translate([0, lc*(AA_BATTERY_D-WALL_THICK), 0])
        linear_extrude(height=WALL_THICK){
            square([AA_BATTERY_W, AA_BATTERY_D]);
        }
        translate([0, lc*(AA_BATTERY_D-WALL_THICK), 0])
        linear_extrude(height=AA_BATTERY_H){
            square([AA_BATTERY_W, WALL_THICK]);
        }
        translate([0, lc*(AA_BATTERY_D-WALL_THICK)+AA_BATTERY_D-WALL_THICK, 0])
        linear_extrude(height=AA_BATTERY_H){
            square([AA_BATTERY_W, WALL_THICK]);
        }
        translate([0, lc*(AA_BATTERY_D-WALL_THICK), 0])
        linear_extrude(height=AA_BATTERY_H){
            square([WALL_THICK, AA_BATTERY_D]);
        }
        translate([AA_BATTERY_W-WALL_THICK, lc*(AA_BATTERY_D-WALL_THICK), 0])
        linear_extrude(height=AA_BATTERY_H){
            square([WALL_THICK, AA_BATTERY_D]);
        }
    }
}
aa_battery();

・OpenSCADの画面

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

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

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、単4電池保管ケースを作成する
 ※単4電池サイズはこちらをどうぞ。

Lazurite MJ2001とGrove rotary angleセンサーを接続して、取得した角度データを920MHz無線でRaspberry Pi Zeroに送信する

Lazurite MJ2001は低消費電力で920MHz無線に対応したマイコンモジュールです。Lazurite MJ2001とGrove rotary angleセンサーを接続して、取得した角度データを920MHz無線でRaspberry Pi Zeroに送信するには、以下の手順を実行します。

〇Lazurite MJ2001とGrove rotary angleセンサー・Groveスクリューターミナルを接続した写真

開発手順

1. Lazurite MJ2001とGrove rotary angleセンサーの接続
以下の記事を参照してLazurite MJ2001とGrove rotary angleセンサーを接続します。
Lazurite MJ2001とGrove Rotary Angleセンサーを接続して、ツマミの回転角度を取得する

2. 受信側Raspberry Pi ZeroとLazurite MJ2001の接続
以下の記事を参照して受信側のRaspberry Pi ZeroとLazurite MJ2001を接続して、受信プログラムを実行します。
Raspberry Pi Zero/Raspberry Pi PicoとLazurite MJ2001を接続して、920MHz無線で通信する

4. Lazurite IDEでのプログラミングのコンパイル・書き込み
以下のプログラムのSG_PANID, SG_DAの値を変更してから、Lazurite IDEでコンパイルしてMJ2001に書き込みます。
実行後に、Raspberry Pi ZeroにGroverotary angleセンサーのデータが送信されて表示されることを確認します。
#include "sg_rotary_angle_sensor_ide.h"		// Additional Header

// チャンネル
#define SG_CH 36
// PANID
#define SG_PANID 0x1111
// destination address
#define SG_DA  0xABCD
// 送信時に光らせる青色LED
#define BLUE_LED 26
// 送信用バッファ
char buf[128];

void setup() {
	// シリアル初期化
	Serial.begin(115200);
	Serial.println("welcome");
    // 14ピン=A0を入力モードに設定
	pinMode(A0,INPUT);

	// 青色LED off
	pinMode(BLUE_LED,OUTPUT);
	digitalWrite(BLUE_LED,HIGH);

	// 無線初期化
	SubGHz.init();
	SubGHz.setBroadcastEnb(false);
}

void loop() {
    int wl;
	int val;

    // バッファクリア
    for(wl=0;wl<sizeof(buf);wl++)buf[wl]=0;
    
    // Grove Rotraryセンサーの値を読み取る
	val = analogRead(A0);

    // Grove rotary angleセンサーの値をバッファに書き込み
	Print.init(buf, sizeof(buf));
	Print.p("ra:");
	Print.l(val,DEC);
	Print.p("\r\n");

    // バッファの内容を送信
	digitalWrite(BLUE_LED,LOW); // 青色LEDをON
	SubGHz.begin(SG_CH, SG_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW);
    SubGHz.send(SG_PANID, SG_DA, buf, strlen(buf,sizeof(buf)),NULL);
	SubGHz.close();
	digitalWrite(BLUE_LED,HIGH); // 青色LEDをOFF
	// コンソールに出力
	Serial.print(buf);

	sleep(2*1000);
}

関連情報

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

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

CentOS8にpodman-docker/podman-compose/nocodbをインストールする

nocodbはコード無しでデータベースアプリケーションを作成する事のできるソフトウェアです。

〇nocodbの画面

構築手順

以下の手順でpodman-docker/podman-compose/nocodbをインストールできます

1.podman-docker/podman-composeのインストール
podman-docker/podman-composeをインストールしていない場合、以下のコマンドでpodman-docker/podman-composeをインストールします。
sudo yum -y install podman-docker podman-compose

docker version

podman-compose version

2. nocodbとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
podman-compose up -d

docker-compose.yml
version: "2"
services:
  nocodb:
    image: nocodb/nocodb
    container_name: "nocodb"
    environment:
      NC_DB: "pg://db:5432?u=postgres&p=noco&d=noco"
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:13-alpine
    container_name: "nocodb_db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: noco
        POSTGRES_PASSWORD: noco
volumes:
  db-data:
    driver: local

3. ポート開放
firewallの8080番ポートを開けます
sudo firewall-cmd --add-port=8080/tcp --permanent

sudo firewall-cmd --reload

4. ブラウザからhttp://<Dockerホスト名またはIP>:8080/にアクセス
ブラウザからnocodbにアクセスし、最初にユーザを登録します

2021年6月29日火曜日

Lazurite MJ2001とGrove Rotary Angleセンサーを接続して、ツマミの回転角度を取得する

Lazurite MJ2001は低消費電力で920MHz無線に対応したマイコンモジュールです。Lazurite MJ2001とGrove Rotary Angleセンサーを接続して、ツマミの回転角度を取得するには、以下の手順を実行します。

〇Lazurite MJ2001とGrove Rotary Angleセンサー・Groveスクリューターミナルを接続した写真

開発手順

1. Lazurite MJ2001とGroveデバイスの接続
以下の記事を参照してLazurite MJ2001とGroveスクリューターミナルを接続します。その後、GroveケーブルでGroveスクリューターミナルとGrove Rotary Angleセンサーを接続します。
Lazurite MJ2001とGrove光センサーを接続して、明るさを取得する

2. Lazurite IDEでのプログラミングのコンパイル・書き込み
以下のプログラムをLazurite IDEでコンパイルしてMJ2001に書き込みます。MJ2001のコンソールにGrove Rotary Angleセンサーの値が表示されることを確認します。
#include "rotary_angle_sensor_ide.h"		// Additional Header

void setup() {
	// シリアル初期化
	Serial.begin(115200);
	Serial.println("welcome");
	// 14ピン=A0を入力モードに設定
	pinMode(A0,INPUT);
}

void loop() {
	int val;
    // Grove回転角度センサーの値を読み取る
	val = analogRead(A0);
	// コンソールに出力
	Serial.print("rotary angle sensor,");
	Serial.println_long((long)val, DEC);
	delay(2000);
}

関連情報

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

M5StickCのRTCから年月日時分秒をMicroPythonで取得する

M5StickCのRTCから年月日時分秒をMicroPythonで取得するには、以下のコードの様にRTCクラスのdatetimeメソッドを使用します。

main.py
import machine
import time

rtc = machine.RTC()
#help(rtc)

while True:
    # yyyy-mm-dd hh:mi:ss
    print("{}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}".format(rtc.datetime()[0], rtc.datetime()[1], rtc.datetime()[2], rtc.datetime()[4], rtc.datetime()[5], rtc.datetime()[6]))
    time.sleep(2)

・備考
使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

Ubuntu 20.04/Raspberry Piに高速ターミナルエミュレータのalacrittyをインストールする

alacrittyは高速でクロスプラットフォームのターミナルエミュレータです。

インストール手順

1. Rust言語のインストール
※curlをインストールしていない場合は、あらかじめ「sudo apt-get -y install curl」でインストールしておきます。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
※以下の様な選択肢が表示されたら1を入力します
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
インストールしたシェルですぐにRustを使用するために、以下のコマンドを実行します。
source $HOME/.cargo/env

2. 前提条件パッケージのインストール
以下のコマンドを実行して前提条件パッケージをインストールします。
sudo apt-get -y install cmake pkg-config libfreetype6-dev libfontconfig1-dev libxcb-xfixes0-dev libxkbcommon-dev python3

3.alacrittyコマンドのインストール
cargo install alacritty

4.alacrittyコマンドの実行
以下のコマンドを実行して、alacrittyを実行します。
alacritty

〇alacrittyコマンドの実行例(Ubuntu 20.04)

〇alacrittyコマンドの実行例(Raspberry Pi - Raspbian Buster)

トラブルシューティング

以下のエラーが発生した場合は、
error: linker `cc` not found
以下のコマンドを実行してgccをインストールします。
sudo apt-get -y install gcc

関連情報

・alacrittyコマンドのgithubリポジトリ
https://github.com/alacritty/alacritty

2021年6月28日月曜日

Rocky Linux 8.4にフォルダ毎のディスク使用量を分かりやすく表示できるdustコマンドをインストールする

フォルダ毎のディスク使用量を分かりやすく表示できるdustコマンドをインストールするには、以下のコマンドを実行します。

インストール手順

1. Rust言語のインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
※以下の様な選択肢が表示されたら1を入力します
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
インストールしたシェルですぐにRustを使用するために、以下のコマンドを実行します。
source $HOME/.cargo/env

2. dustコマンドのインストール
cargo install du-dust

3. dustコマンドの実行
以下のコマンドを実行して、フォルダ毎の容量を表示する事ができます。
dust

〇dustコマンドの実行例

関連情報

・dustコマンドのgithubリポジトリ https://github.com/bootandy/dust

Rocky Linux 8.4にStellariumをインストールする

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

〇Stellariumの画面

インストール方法

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

関連情報

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

Raspberry Pi PicoとGrove光センサーを接続して、明るさを取得する

Raspberry Pi PicoとGrove光センサーを接続して、明るさを取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとGrove光センサー・Groveスクリューターミナルを接続した写真

開発手順

1. 部品の用意と配線
Raspberry Pi Picoの他、以下の部品とジャンパー線を用意します。

・GROVE - 光センサ v1.2
https://www.switch-science.com/catalog/3284/

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

スクリューターミナルを上面手前に配置したとき、以下の様にスクリューターミナルとRaspberry Pi Picoを接続します。
・GND(左から1番目の端子)をRaspberry Pi PicoのAGNDと印字されているピン(33番ピン)に接続
・VCC(左から2番目の端子)をRaspberry Pi Picoの3V3と印字されているピン(36番ピン)に接続
・D1(右から1番目の端子)をRaspberry Pi Picoの26番ピン(GP26_A0)に接続

Grove - スクリューターミナルとGROVE - 光センサーはGroveケーブルで接続します。

2. プログラミングと実行
ThonnyでRaspberry Pi Picoにmain.pyとして以下のプログラムを保存して、実行します。コンソールに明るさの値が表示されるのを確認します。
import machine 
import time

# Raspberry Pi Picoの26ピン=ADC0
pin26 = machine.ADC(0)

while True:
    value = pin26.read_u16()

    print("lightness:{}".format(value))
    time.sleep(1)

関連情報

Groveデバイスまとめ

Ubuntu20.04に回路シミュレータのQUCSをインストールする

QUCSはオープンソースの回路シミュレータです。

〇QUCSの画面

インストール手順

以下のコマンドを実行して、QUCSをインストールします。
sudo apt-add-repository -y ppa:qucs/qucs

sudo apt-get update

sudo apt-get -y install qucs

関連情報

・QUCSのwebサイト
http://qucs.sourceforge.net/index.html

2021年6月27日日曜日

M5StickCにGrove温度センサーを接続して、MicroPythonで温度を取得する

M5StickCにGrove温度センサーを接続して、MicroPythonで温度を取得するには、以下のコードの様に33番ピンの電圧をADCで読み取って計算します。

〇M5StickCとGrove温度センサーを接続した写真

サンプルコード

以下のコードをmain.pyとして保存して、実行します。コンソールに読み取った温度が表示されます
import machine 
import time
import math

pin33 = machine.ADC(machine.Pin(33))
pin33.atten(machine.ADC.ATTN_11DB)
pin33.width(machine.ADC.WIDTH_10BIT)
while True:
    # 5V=1023 -> 3.6V=1023
    value = pin33.read()*(3.6/5.0)
    # refer to https://wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/
    r = 100000.0 * (1023.0 / value - 1.0)
    temperature = 1.0 / (math.log10(r / 100000.0) / 4275.0 + 1 / 298.15) - 273.15

    print("temp:{:.2f}".format(temperature))
    time.sleep(1)

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

Groveデバイスまとめ

Debian 10(Buster)にDocker/docker-compose/nocodbをインストールする

nocodbはコード無しでデータベースアプリケーションを作成する事のできるソフトウェアです。

〇nocodbの画面

構築手順

以下の手順でDocker/docker compose/nocodbをインストールできます

1.Dockerのインストール
Dockerをインストールしていない場合、以下のコマンドでDockerをインストールします。
sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get -y install docker-ce docker-ce-cli containerd.io

sudo adduser $USER docker
※いったんログアウトします
docker version

2.docker composeのインストール
docker-composeをインストールしていない場合、以下のコマンドでdocker-composeをインストールします。
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

3. nocodbとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  nocodb:
    image: nocodb/nocodb
    container_name: "nocodb"
    environment:
      NC_DB: "pg://db:5432?u=postgres&p=noco&d=noco"
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:13-alpine
    container_name: "nocodb_db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: noco
        POSTGRES_PASSWORD: noco
volumes:
  db-data:
    driver: local

3. ブラウザからhttp://<Dockerホスト名またはIP>:8080/にアクセス
ブラウザからnocodbにアクセスし、最初にユーザを登録します

Rocky Linux 8にディスク使用量・空き容量をCUIでグラフ表示してくれるdufコマンドをインストールする

dufコマンドで、ディスク使用量・空き容量を分かりやすくCUIでグラフ表示する事が出来ます。

〇Rocky Linux 8上のdufの画面

インストール手順

以下のコマンドを実行します。
wget https://github.com/muesli/duf/releases/download/v0.6.2/duf_0.6.2_linux_amd64.rpm

sudo dnf -y install ./duf_0.6.2_linux_amd64.rpm

関連情報

・dufのプロジェクトリポジトリ
https://github.com/muesli/duf

2021年6月26日土曜日

Ubuntu Desktop 20.04/Debian 10(Buster)/Raspberry Piにfre:ac(Flatpak版)をインストールする

fre:acはオーディオ変換機能とCD取り込みを持つアプリケーションです。fre:acをインストールするには以下の手順を実行します。

〇fre:acの画面(Ubuntu 20.04)

〇fre:acの画面(Debian 10)

〇fre:acの画面(Raspbian Buster)

インストール方法

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

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

sudo flatpak -y install flathub org.freac.freac

fre:acの実行

以下のコマンドを実行します。
flatpak run org.freac.freac

関連情報

・fre:acのウェブサイト
https://www.freac.org/

CentOS 8/CentOS 8-StreamにDBクライアントDbGateをインストールする

DbGateはMySQLやPostgreSQLなどの様々なデータベースに対応したDBクライアントです。

・DbGateの画面(CentOS 8)

・DbGateの画面(CentOS 8-Stream)

インストール方法

CentOS 8/CentOS 8-StreamにDBクライアントDbGateをインストールするには、以下のコマンドを実行します。
sudo dnf -y install epel-release

sudo dnf -y install snapd

sudo systemctl enable --now snapd.socket

sudo ln -s /var/lib/snapd/snap /snap

sudo snap install dbgate
※「error: too early for operation, device not yet seeded or device model not acknowledged」というエラーが出た場合は、しばらく待って再実行します。

コマンドからDbGateを実行する場合は以下のコマンドを実行します。
snap run dbgate

関連情報

・DbGateのwebサイト
https://dbgate.org/

Raspberry Piにディスク使用量・空き容量をCUIでグラフ表示してくれるdufコマンドをインストールする

dufコマンドで、ディスク使用量・空き容量を分かりやすくCUIでグラフ表示する事が出来ます。

〇Raspberry Pi上のdufの画面

インストール手順

以下のコマンドを実行します。
wget https://github.com/muesli/duf/releases/download/v0.6.2/duf_0.6.2_linux_armv7.deb

sudo dpkg -i ./duf_0.6.2_linux_armv7.deb

関連情報

・dufのプロジェクトリポジトリ
https://github.com/muesli/duf

2021年6月25日金曜日

Rocky Linux 8.4に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に関する他の記事は、こちらを参照してください。

Rocky Linux 8.4にJoplinをインストールする

JoplinでノートやTODOリストの管理をする事ができます。Markdown記法でメモなどを記述する事ができます。

〇Joplinの画面

インストール方法

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

cd /opt/joplin

sudo wget https://github.com/laurent22/joplin/releases/download/v2.1.5/Joplin-2.1.5.AppImage

sudo chmod +x Joplin-2.1.5.AppImage

sudo wget https://joplinapp.org/images/Icon512.png

cat << EOF | sudo tee /usr/share/applications/joplin.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/joplin/Joplin-2.1.5.AppImage
Icon=/opt/joplin/Icon512.png
Name=Joplin
Categories=Office;
EOF

関連情報

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

音楽ファイルのフォーマットを変換するSoundConverter(サウンド変換)をUbuntu 20.04/Debian 10(Buster)/Raspberry Piにインストールする

SoundConverterアプリケーションで音楽ファイルを様々な形式に変換する事が出来ます。

〇Ubuntu 20.04のSoundConverterのスクリーンショット

〇Debian 10(Buster)のSoundConverterのスクリーンショット

〇Raspberry Pi(Raspbian Buster)のSoundConverterのスクリーンショット

インストール手順

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

sudo apt-get update

sudo apt-get -y install soundconverter

※実行時のメニューには「サウンド変換」と表示されます。

関連項目

・SoundConverterのwebサイト
https://soundconverter.org/

Ubuntu20.04にDocker/docker-compose/nocodbをインストールする

nocodbはコード無しでデータベースアプリケーションを作成する事のできるソフトウェアです。

〇nocodbの画面

構築手順

以下の手順でDocker/docker compose/nocodbをインストールできます

1.Dockerのインストール
Dockerをインストールしていない場合、以下のコマンドでDockerをインストールします。
sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get -y install docker-ce docker-ce-cli containerd.io

sudo adduser $USER docker
※いったんログアウトします
docker version

2.docker composeのインストール
docker-composeをインストールしていない場合、以下のコマンドでdocker-composeをインストールします。
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

3. nocodbとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  nocodb:
    image: nocodb/nocodb
    container_name: "nocodb"
    environment:
      NC_DB: "pg://db:5432?u=postgres&p=noco&d=noco"
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:13-alpine
    container_name: "nocodb_db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: noco
        POSTGRES_PASSWORD: noco
volumes:
  db-data:
    driver: local

3. ブラウザからhttp://<Dockerホスト名またはIP>:8080/にアクセス
ブラウザからnocodbにアクセスし、最初にユーザを登録します

2021年6月24日木曜日

M5StickCのジャイロ加速度センサー(MPU6886)とGroveブザーで、すばやく振り回したときブザー音が鳴るようにする(MicroPython)

M5StickCにはジャイロ加速度センサー(MPU6886)が搭載されています。MicroPythonでM5StickCのジャイロ加速度センサー(MPU6886)とGroveブザーで、すばやく振り回したときブザー音が鳴るようにするには以下の手順を実行します。

〇M5StickCとGroveブザーを接続した写真

開発手順

1. M5StickC上にlibフォルダを作成しAXP192ドライバーをアップロード
以下のページのRAWボタンを右クリックして「名前を付けて保存」を選択してmpu6886.pyをダウンロードします。
https://github.com/tuupola/micropython-mpu6886/blob/master/mpu6886.py

/libフォルダがない場合はThonnyのファイルペインのデバイスから右クリックしてNew directory...を選択して、フォルダ名libを入力して作成します。次にlibフォルダに移動後、PC側フォルダのmpu6886.py上で右クリックメニューからUpload to /libを選択します。

2. プログラミングと実行
MPU6886の加速度センサーの値はx, y, zのタプルで取得する事が出来ます。以下をmain.pyとして、M5StickCに保存して実行します。M5StickCをすばやく振り回すと、ブザー音が短く鳴ります。
import machine
import mpu6886
import time

# ジャイロ加速度計の初期化
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
sensor = mpu6886.MPU6886(i2c)

#sensor.calibrate()

# Groveブザー
pin33 = machine.Pin(33, machine.Pin.OUT)
pin33.value(0)

while True:
    sv = sensor.gyro
    maxval = max(abs(sv[0]), abs(sv[1]), abs(sv[2]))
    if maxval >= 4.2: # 閾値は適当に調整してください
        # ブザーON
        pin33.value(1)
        time.sleep(0.2)

        # ブザーOFF
        pin33.value(0)        

    print(maxval)
    time.sleep(0.1)

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

・MPU6886のドライバー
https://github.com/tuupola/micropython-mpu6886

Groveデバイスまとめ

ESP32-DevkitCとDHT11とCDSで、温度・湿度・明るさのデータをPostgreSQLに保存するデータロガーを作成する

ESP32-DevkitCとDHT11とCDSで、温度・湿度・明るさのデータをPostgreSQLに保存するデータロガーを作成するには、以下の手順を実行します。
構成としてはESP32-DevkitCに接続したDHT11で温度・湿度を取得し、CDSで明るさを取得します。ESP32-DevkitCからWiFi経由でPC側のFlaskのRESTサービスにアクセスしデータを受け渡し、PostgreSQLにデータを保存します。

〇ESP32-DevkitCとDHT11とCDSを接続した写真

データロガーの開発手順

1. PC側:PostgreSQLのデータベースにテーブルを作成する
以下のSQLコマンドを実行して、温度・湿度・明るさを保持するテーブルを作成します。
create table iot_sensor_data
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature integer,
  humidity integer,
  lightness integer,
  constraint pk_iot_sensor_data primary key (device_name, data_ts)
);

※PostgreSQLをインストールしていない場合は、以下の記事を参照してください。
・Ubuntu20.04にインストールしたい場合は、以下の記事のPostgreSQLのインストール部分を参照してください。
Ubuntu 20.04にNextcloud20とPostgreSQL13をインストールする

・Raspberry Piにインストールしたい場合は、以下を参照してください。
Raspberry Pi(Raspbian Buster)にPostgreSQL11をインストールしてtestデータベースとtestユーザを作成する

2. PC側:ユーザの追加
Flaskを実行するユーザpyを作成するには、以下のコマンドを実行します。
sudo addgroup py

sudo adduser --quiet --gecos "" --ingroup py py

3. PC側:pipenvのインストール
sudo apt-get -y install python3-pip python3-distutils python3-dev python3-testresources

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

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

source ~/.bashrc

4. PC側:flaskとpsycopg2のインストール
以下のコマンドで、flaskとpsycopg2をインストールした仮想環境を作成します。
sudo apt-get -y install libpq-dev

sudo mkdir -p /opt/iot_logger

sudo chown py:py /opt/iot_logger
※ここから作成したpyユーザで以下のコマンドを実行します。
cd /opt/iot_logger

pipenv --python 3

pipenv install flask psycopg2-binary

pipenv shell

5. PC側:REST APIでデータを受け取り、PostgreSQLに保存するFlaskアプリケーションの構築
以下のコードを/opt/iot_loggerのapp.pyに保存します。

app.py
from flask import Flask, jsonify, request
import time
import os
import psycopg2
import psycopg2.extras

def dbconnect():
    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'])
    return conn

sql = """insert into iot_sensor_data values ('ESP32-DevkitC', current_timestamp, %s, %s, %s)"""

@app.route('/iot_logger', methods=["POST"])
def iot_logger():
    print(request.get_data())
    temp = int(request.json['temp'])
    humidity = int(request.json['humidity'])
    lightness = int(request.json['lightness'])

    conn = dbconnect()
    #with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
    with conn.cursor() as cur:
        cur.execute(sql , (temp, humidity, lightness))
    conn.commit()
    return {"status":"ok"}

app = Flask(__name__)
app.run(debug=True, host='0.0.0.0', port=5001, threaded=True)

4. PC側:テスト実行
Flaskを実行するには、以下のコマンドを実行します。
export PG_HOST=(PostgreSQLのホスト名またはIPアドレス)
export PG_PORT=(PostgreSQLのポート:デフォルトは5432)
export PG_DB=(PostgreSQLのデータベース名)
export PG_USER=(ユーザ名)
export PG_PASS=(パスワード)

export FLASK_APP=app.py

flask run -h 0.0.0.0 -p 5001
※Ctrl+Cで停止します

5. PC側:サービス化
以下のコマンドでFlaskアプリケーションをサービス化して実行します。
cat << EOF | sudo tee /etc/systemd/system/iot_logger.service
[Unit]
Description=IoT logger
[Service]
Type=simple
Environment=export PG_HOST=(PostgreSQLのホスト名またはIPアドレス)
Environment=export PG_PORT=(PostgreSQLのポート:デフォルトは5432)
Environment=export PG_DB=(PostgreSQLのデータベース名)
Environment=export PG_USER=(ユーザ名)
Environment=export PG_PASS=(パスワード)
Environment=export FLASK_APP=app.py
ExecStart=/opt/iot_logger/.venv/bin/python3 app.py
User=py
Group=py
WorkingDirectory=/opt/iot_logger
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable iot_logger

sudo systemctl start iot_logger

6. ESP32-DevkitC側:ESP32-DevkitCとDHT11/CDSの配線
ESP32-DevkitCとDHT11センサーモジュール/CDSを配線します
DHT11のDigitalピンへ(付属ケーブルの緑) -> ESP32-DevKitCのIO27ピン
DHT11のGNDへ(付属ケーブルの黒) -> ESP32-DevKitCのGNDピン
DHT11のVへ(付属ケーブルの赤) -> ESP32-DevKitCの3V3ピン

※ESP32とDHT11の接続は以下の記事を参照してください。
ESP32-DevkitCとDHT11で計測した温度・湿度をWiFi経由のREST APIで通知する

CDS,10KΩ抵抗を以下の様に接続します。
※CDSの接続は以下の記事を参照してください。
ESP32-DevkitCとCDSで明るさを計測する

4つのエネループをセットした電池ボックスのプラスは5V端子、マイナスはGNDに接続します。
※電池と基板の接続は以下の部品を使用しました。
XHコネクタ ベース付ポスト トップ型 2P B2B-XH-A(LF)(SN)
https://akizukidenshi.com/catalog/g/gC-12247/

電池ボックス 単3×4本 スイッチ付 XHコネクタ付
https://akizukidenshi.com/catalog/g/gP-12242/

7. ESP32-DevkitC側:プログラミング
以下のプログラムをmain.pyとして、ESP32-DevkitCに保存します。dhtのライブラリ導入は、上記のDHT11の記事を参照してください。
import machine 
import time
import dht
import urequests
import ujson
import network

# WiFiのssid
ssid = "WiFiのssid"
# WiFiのパスワード
password = "Wifiのパスワード"
# REST APIの接続先
url = "http://(ホスト名またはIP):(ポート番号)/iot_logger"
header = {'Content-Type':'application/json'}

def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())

# ADC初期化
pin35 = machine.Pin(35, machine.Pin.IN)
cds = machine.ADC(pin35)
cds.atten(machine.ADC.ATTN_11DB) # 11dBの減衰率、約3.6v が最大入力電圧

# DHT11初期化
dht11 = dht.DHT11(machine.Pin(27))
time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 測定
    dht11.measure()
    temp = dht11.temperature()
    humidity = dht11.humidity()
    lightness = cds.read()

    # REST APIに通知
    data = ujson.dumps({"temp":str(temp), "humidity":str(humidity), "lightness":str(lightness)})
    try:
        resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
        print(resp.json())
        resp.close()
    except OSError as err:
        print(err)
        print("----")
    
    # deepsleep
    #time.sleep(2)
    machine.deepsleep(60*60*1000) # 3600sec=1時間

8. ESP32-DevkitC側:データ確認
以下のSQLを実行して、センサーデータが保存されていることを確認します。
select * from iot_sensor_data

2021年6月23日水曜日

Rocky Linux 8.4にPyCharm2021.1.2をインストールする

PyCharmはPython言語のIDEです。

〇PyCharmの画面

インストール方法

以下のコマンドを実行します。
wget https://download.jetbrains.com/python/pycharm-community-2021.1.2.tar.gz

tar xvfz pycharm-community-2021.1.2.tar.gz

sudo mv pycharm-community-2021.1.2 /opt/pycharm-community

cat << EOF | sudo tee /usr/share/applications/pycharm.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/pycharm-community/bin/pycharm.sh
Name=PyCharm
Icon=/opt/pycharm-community/bin/pycharm.png
Categories=Development;
EOF

関連情報

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

Rocky Linux 8.4にMyPaintをインストールする

MyPaintはオープンソースのシンプルなペイントツールです。

〇MyPaintの画面

インストール手順

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

cd /opt/mypaint

sudo wget 'https://github.com/mypaint/mypaint/releases/download/v2.0.1/MyPaint-v2.0.1.AppImage'

sudo chmod +x /opt/mypaint/MyPaint-v2.0.1.AppImage

cat << EOF | sudo tee /usr/share/applications/mypaint.desktop
[Desktop Entry]
Type=Application
Version=1.0
Name=MyPaint
GenericName=MyPaint
Exec=/opt/mypaint/MyPaint-v2.0.1.AppImage
Categories=Graphics;
EOF

関連情報

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

・ブラシの追加方法は「MyPaintにブラシを追加する」を参照してください。

M5StickCにGroveボタンを接続して、MicroPythonでM5ボタンを押したときにブザーを鳴らす

M5StickCにGroveボタンを接続して、MicroPythonでM5ボタンを押したときにブザーを鳴らすには、M5ボタンにつながっている37番ピンの状態をチェックして、Groveブザーに接続されている33番ピンをON/OFFします。

〇M5StickCとGroveブザーを接続した写真

サンプルコード

以下のコードをmain.pyとして保存して、実行します。M5ボタンを押すと0.5秒ブザーが鳴ります。
import machine
import time

# M5StickCのM5ボタン
pin37 = machine.Pin(37, machine.Pin.IN)

# Groveブザー
pin33 = machine.Pin(33, machine.Pin.OUT)
pin33.value(0)

while True:
    if pin37.value() == 0:
        print("pressed.")

        # ブザーON
        pin33.value(1)
        time.sleep(0.5)

        # ブザーOFF
        pin33.value(0)

    time.sleep(0.1)

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

Groveデバイスまとめ

ESP32-DevkitCとCDSで明るさを計測する

ESP32-DevkitCとCDSで明るさを計測するには、以下の手順を実行します。

〇ESP32-DevkitCとCDSを接続した写真

開発手順

1. ESP32-DevkitCの他、以下の部品を用意します。
・CdSセル 5mmタイプ
https://akizukidenshi.com/catalog/g/gI-00110/

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

・プリント基板 両面 HK-PKW01H
https://elpadirect.com/shopdetail/000000001788/
※その他、適当な大きさのユニバーサル基板でも大丈夫です。

・分割ロングピンソケット 1×42 (42P)
https://akizukidenshi.com/catalog/g/gC-05779/
※ESP32-DevkitCを上記基板に挿すのに使用しています

※以下の2つはCDSを上記基板に直付けしない場合は、以下の様なサブ基板を使用します。
・16ホールユニバーサル基板(2.54mm)
https://akizukidenshi.com/catalog/g/gP-02515/

・ピンソケット(メス) 1×3(3P)
https://akizukidenshi.com/catalog/g/gC-10098/

・ピンヘッダ 1×40 (40P)
target=_blank">https://akizukidenshi.com/catalog/g/gC-00167/

〇使用部品(一部)の写真

2. 配線
CDS,10KΩ抵抗を以下の様に接続します。

3.ESP32-DevkitCでのプログラミングと実行
デフォルトだとADCで1Vまでしか測れないので、atttenメソッドで減衰率を設定して3.6Vまで計測できるように設定します。
attenメソッドの詳細は以下を参照してください。
ADC (アナログ/デジタル変換)
https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/quickref.html#adc-analog-to-digital-conversion

以下のプログラムをmain.pyとしてESP32-DevkitCに保存し、実行します。
import machine 
import time

pin35 = machine.Pin(35, machine.Pin.IN)
cds = machine.ADC(pin35)
cds.atten(machine.ADC.ATTN_11DB) # 11dBの減衰率、約3.6V が最大入力電圧

while True:
    lightness = cds.read()
    print("cds: {}".format(lightness))
    time.sleep(2)

2021年6月22日火曜日

M5StickCにGroveブザーを接続して、MicroPythonでブザーを鳴らす

M5StickCにGroveブザーを接続して、MicroPythonでブザーを鳴らすには、以下のコードの様に33番ピンをON/OFFします。

〇M5StickCとGroveブザーを接続した写真

サンプルコード

以下のコードをmain.pyとして保存して、実行します。1秒ブザーが鳴って2秒停止を繰り返します。
import machine
import time
pin33 = machine.Pin(33, machine.Pin.OUT)

while True:
    # ブザーON
    pin33.value(1)
    time.sleep(1)

    # ブザーOFF
    pin33.value(0)
    time.sleep(2)

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

Groveデバイスまとめ

ESP32-DevkitCとBME680で計測した温度・湿度・気圧・ガスセンサー値をWiFi経由のREST APIで通知する

ESP32-DevkitCとBME680で計測した温度・湿度・気圧・ガスセンサー値をWiFi経由のREST APIで通知するには、以下の手順を実行します。今回は、ESP32-DevkitCで計測した温度・湿度・気圧・ガスセンサー値の情報をRESTで送信しPC側のFlaskで受信します。

〇ESP32-DevkitCとBME680を接続した写真

開発手順

1. PC側: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. PC側:flaskがインストールされた仮想環境の作成
pipenvを使用する場合は以下のコマンドで、flask用の仮想環境を作成します。
mkdir -p ~/flask_bme680

cd ~/flask_bme680

pipenv --python 3

pipenv install flask

pipenv shell

3. PC側:Flask REST APIアプリケーションの作成
/bme680にPOSTされた温度・湿度・気圧・ガスセンサー値データを取得して表示し、再びJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/bme680', methods=["POST"])
def receive_bme680_values():
    print(request.get_data())
    temp = request.json['temp']
    humidity = request.json['humidity']
    pressure = request.json['pressure']
    gas = request.json['gas']
    print("temp: {}C".format(temp))
    print("humidity: {}".format(humidity))
    print("pressure: {}".format(pressure))
    print("gas: {}".format(gas))
    return {"temp":str(temp), "humidity":str(humidity), "pressure":str(pressure), "gas":str(gas)}

4. PC側:Flast REST APIアプリケーションの実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

実行時に表示されるURLを控えておきます。

5. ESP32-DevkitC側:BME680の準備
BME680は秋月電子さんの「BME680使用 温湿度・気圧・ガスセンサモジュールキット」を使用しました。
https://akizukidenshi.com/catalog/g/gK-14469/

6. ESP32-DevkitC側:ESP32-DevkitCとBME680の配線
ESP32-DevkitCとBME680センサーモジュールを配線します
ESP32-DevkitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン) -> BME680のVIN
ESP32-DevkitCのIO21ピン(USBを手前・ピン足を下にした時、右上から6番目のピン) -> BME680のSDA
ESP32-DevkitCのIO22ピン(USBを手前・ピン足を下にした時、右上から3番目のピン) -> BME680のSCL
ESP32-DevkitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン) -> BME680のGND

7. ESP32-DevkitC側:ESP32-DevkitCにMicroPythonの導入
PCにインストールしたThonnyなのでMicroPythonファームウェアを書き込みます。
MicroPythonファームウェアは以下のページから「esp32-20210418-v1.15.bin」をダウンロードしておきます。
https://micropython.org/download/esp32/

8. ESP32-DevkitC側:urequests/bme680モジュールのアップロード
以下のページからダウンロードした(RAWボタンでリンク先を保存)urequests.py/bme680.pyをESP32-DevkitCの/libフォルダに配置します(/libフォルダが無い場合はThonnyなどで作成します)
https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py

https://github.com/robert-hh/BME680-Micropython/blob/master/bme680.py

9. ESP32-DevkitC側:プログラミングと実行
以下のコードのssid/パスワード/URLを設定してmain.pyとしてESP32-DevkitCに保存します。実行後、温度と湿度がPC側に2秒おきに表示されることを確認します。
from bme680 import *
import machine 
import time
import urequests
import ujson
import network

# WiFiのssid
ssid = "xxx"
# WiFiのパスワード
password = "xxx"
# REST APIの接続先
url = "http://xxx.xxx.xxx.xxx:5000/bme680"
header = {'Content-Type':'application/json'}


def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())


# BME680初期化
i2c=machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21))
#print(i2c.scan())
bme = BME680_I2C(i2c)
time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 測定&REST APIに通知
    data = ujson.dumps({"temp":str(bme.temperature), "humidity":str(bme.humidity), "pressure":str(bme.pressure), "gas":str(bme.gas)})
    resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
    print(resp.json())
    resp.close()
    
    # deepsleep
    machine.deepsleep(2000)

2021年6月21日月曜日

M5StickCにGroveボタンを接続して、MicroPythonで取得したボタン状態を表示する

M5StickCにGroveボタンを接続して、MicroPythonで取得したボタン状態を表示するには、以下のコードの様に33番ピンの値を取得します。

〇M5StickCとGroveボタンを接続した写真

サンプルコード

以下のコードをmain.pyとして保存して、実行します。
import machine 
import time
pin33 = machine.Pin(33, machine.Pin.IN)

while True:
    # スイッチ
    state = pin33.value()
    if state == 1 :
        print("pressed.")
    else:
        print("released.")
    time.sleep(2)

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

Groveデバイスまとめ

ESP32-DevkitCと照度センサーモジュールで照度を測る

ESP32-DevkitCと照度センサーモジュールで照度を測るには、以下の手順を実行します。
照度モジュールは、秋月電子さんの以下の照度センサーモジュールを使用しました。i2cでESP32-DevkitCと通信します。

TSL25721使用 照度センサーモジュール
https://akizukidenshi.com/catalog/g/gK-15536/

開発手順

1. ピンのハンダ付けと、ESP32-DevkitCへの接続
・ESP32-DevkitCとジャンパー線で接続した照度センサーモジュール

ESP32-DevkitCと照度センサーモジュールは以下の様に接続します(モジュールの裏面にピン略称が印刷されています)
ESP32-DevkitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン) -> TSL25721のVIN
ESP32-DevkitCのIO21ピン(USBを手前・ピン足を下にした時、右上から6番目のピン) -> TSL25721のSDA
ESP32-DevkitCのIO22ピン(USBを手前・ピン足を下にした時、右上から3番目のピン) -> TSL25721のSCL
ESP32-DevkitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン) -> TSL25721のGND

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

import time
from machine import Pin, I2C
i2c=I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)

addr_tsl25721=0x39
#print(i2c.scan())
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
buf = bytearray(1)

buf[0] = VAL_CONTROL_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, buf)

# Reset Config Register
buf[0] = VAL_CONFIG_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, buf)

# Set ALS time
buf[0] = VAL_ATIME_C64
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, buf)

# Power on and enable ALS
buf[0] = VAL_ENABLE
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, buf)
time.sleep(1)

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

  dat = i2c.readfrom_mem(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))
  time.sleep(1)

2021年6月20日日曜日

M5StickCとGrove光センサーで、明るさのデータをREST API経由で送信する

M5StickCとGrove光センサーで、明るさのデータをREST API経由で送信するには、以下の手順を実行します。
構成としてはM5StickCに接続したGrove光センサーで明るさを取得します。M5StickCからWiFi経由でPC側のFlaskのRESTサービスにアクセスしデータを送信します。

〇M5StickCとGrove光センサーを接続した写真

開発手順

1. PC側:pipenvのインストール
sudo apt-get -y install python3-pip python3-distutils python3-dev python3-testresources

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

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

source ~/.bashrc

2. PC側:flaskのインストール
以下のコマンドで、flaskをインストールした仮想環境を作成します。
mkdir -p ./m5stickc_lightness

cd ./m5stickc_lightness

pipenv --python 3

pipenv install flask

pipenv shell

3. PC側:REST APIでデータを受け取り、データを表示するFlaskアプリケーションの構築 以下のコードをapp.pyとして保存します。

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

app = Flask(__name__)

@app.route('/lightness', methods=["POST"])
def m5stick_lighetness():
    lightness = int(request.json['lightness'])
    print("lightness:{}".format((lightness)))
    return {"status":"ok"}

app.run(debug=True, host='0.0.0.0', port=5010, threaded=True)

4. PC側:実行
Flaskを実行するには、以下のコマンドを実行します。
python app.py
※Ctrl+Cで停止します

4. M5StickC側:M5StickC上にlibフォルダを作成しurequestsモジュールをアップロード
以下のページのRAWボタン上で右クリックメニューから「名前を付けてリンク先を保存」を選択して、ダウンロードします。
https://github.com/micropython/micropython-lib/blob/master/python-ecosys/urequests/urequests.py

/libフォルダがない場合はThonnyのファイルペインのデバイスから右クリックしてNew directory...を選択して、フォルダ名libを入力して作成します。次にlibフォルダに移動後、PC側のrequests.py上で右クリックメニューからUpload to /libを選択します。

5. M5StickC側:以下のコードのWiFiのSSID/パスワード/REST APIの接続先を設定して、main.pyとして保存します。実行後、2秒おきにPC側に光センサーの値が表示されることを確認します。

import machine
import time
import urequests
import ujson
import network

# WiFiのssid
ssid = "WiFiのSSID"
# WiFiのパスワード
password = "WiFiのパスワード"

# REST APIの接続先
url = "http://192.168.1.xxx:5010/lightness"
header = {'Content-Type':'application/json'}


def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())

# Grove光センサーの初期化
pin33 = machine.ADC(machine.Pin(33))
pin33.atten(machine.ADC.ATTN_11DB)

time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 光センサー測定
    lightness = pin33.read()

    # REST APIに通知
    data = ujson.dumps({"lightness":str(lightness)})
    try:
        resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
        print(resp.json())
        resp.close()
    except OSError as err:
        print(err)
        print("----")
    
    time.sleep(2)
    # deepsleep
    #machine.deepsleep(60*60*1000) # 3600sec=1時間

関連情報

・使用したMicroPython firmware: esp32-20210418-v1.15.bin
https://micropython.org/download/esp32/

ADC (アナログ/デジタル変換)
※MicroPythonのDocumentation

Groveデバイスまとめ

ESP32-DevkitCとDHT11で計測した温度・湿度をWiFi経由のREST APIで通知する

ESP32-DevkitCとDHT11で計測した温度・湿度をWiFi経由のREST APIで通知するには、以下の手順を実行します。今回は、ESP32-DevkitCで計測した温度・湿度の情報をRESTで送信しPC側のFlaskで受信します。

〇ESP32-DevkitCとDHT11を接続した写真

開発手順

1. PC側: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. PC側:flaskがインストールされた仮想環境の作成
pipenvを使用する場合は以下のコマンドで、flask用の仮想環境を作成します。
mkdir -p ~/flask_dht11

cd ~/flask_dht11

pipenv --python 3

pipenv install flask

pipenv shell

3. PC側:Flask REST APIアプリケーションの作成
/dht11にPOSTされた温度・湿度データを取得して表示し、再びJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/dht11', methods=["POST"])
def receive_temp_adn_humidity():
    print(request.get_data())
    temp = request.json['temp']
    humidity = request.json['humidity']
    print("temp: {}C".format(temp))
    print("humidity: {}C".format(humidity))
    return {"temp":str(temp), "humidity":str(humidity)}

4. PC側:Flast REST APIアプリケーションの実行
Flaskを実行するには、以下のコマンドを実行します。
export FLASK_APP=app.py

flask run -h 0.0.0.0

実行時に表示されるURLを控えておきます。

5. ESP32-DevkitC側:DHT11の準備
以下のようなDHT11温湿度モジュールを準備します。

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

6. ESP32-DevkitC側:ESP32-DevkitCとDHT11の配線
ESP32-DevkitCとDHT11センサーモジュールを配線します
DHT11のDigitalピン(付属ケーブルの緑) -> ESP32-DevKitCのIO32ピン(USBを手前・ピン足を下にした時、左上から7番目のピン)
DHT11のGND(付属ケーブルの黒) -> ESP32-DevKitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン)
DHT11のV(付属ケーブルの赤) -> ESP32-DevKitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン)

7. ESP32-DevkitC側:ESP32-DevkitCにMicroPythonの導入
PCにインストールしたThonnyなのでMicroPythonファームウェアを書き込みます。
MicroPythonファームウェアは以下のページから「esp32-20210418-v1.15.bin」をダウンロードしておきます。
https://micropython.org/download/esp32/

8. ESP32-DevkitC側:urequestsモジュールのアップロード
以下のページからダウンロードした(RAWボタンでリンク先を保存)urequests.pyをESP32-DevkitCの/libフォルダに配置します(/libフォルダが無い場合はThonnyなどで作成します)
https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py

9. ESP32-DevkitC側:プログラミングと実行
以下のコードのssid/パスワード/URLを設定してmain.pyとしてESP32-DevkitCに保存します。実行後、温度と湿度がPC側に2秒おきに表示されることを確認します。
import dht
import machine
import time
import urequests
import ujson
import network

# WiFiのssid
ssid = "xxx"
# WiFiのパスワード
password = "xxx"
# REST APIの接続先
url = "http://xxx.xxx.xxx.xxx:5000/dht11"
header = {'Content-Type':'application/json'}


def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())


# DHT11初期化
dht11 = dht.DHT11(machine.Pin(32))
time.sleep(1)
while True:
    # WiFi接続
    connect_wifi()

    # 測定
    dht11.measure()
    temp = dht11.temperature()
    humidity = dht11.humidity()

    # REST APIに通知
    data = ujson.dumps({"temp":str(temp), "humidity":str(humidity)})
    resp = urequests.post(url, data=data.encode("utf-8"), headers = header)
    print(resp.json())
    resp.close()
    
    # deepsleep
    machine.deepsleep(2000)

2021年6月19日土曜日

Lazurite MJ2001とGrove光センサーを接続して、取得した明るさを920MHz無線でRaspberry Pi Zeroに送信する

Lazurite MJ2001は低消費電力で920MHz無線に対応したマイコンモジュールです。Lazurite MJ2001とGrove光センサーを接続して、取得した明るさを920MHz無線でRaspberry Pi Zeroに送信するには、以下の手順を実行します。

〇Lazurite MJ2001とGrove光センサー・Groveスクリューターミナルを接続した写真

開発手順

1. Lazurite MJ2001とGrove光センサーの接続
以下の記事を参照してLazurite MJ2001とGrove光センサーを接続します。
Lazurite MJ2001とGrove光センサーを接続して、明るさを取得する

2. 受信側Raspberry Pi ZeroとLazurite MJ2001の接続
以下の記事を参照して受信側のRaspberry Pi ZeroとLazurite MJ2001を接続して、受信プログラムを実行します。。
Raspberry Pi Zero/Raspberry Pi PicoとLazurite MJ2001を接続して、920MHz無線で通信する

4. Lazurite IDEでのプログラミングのコンパイル・書き込み
以下のプログラムのSG_PANID, SG_DAの値を変更してから、Lazurite IDEでコンパイルしてMJ2001に書き込みます。
実行後に、Raspberry Pi ZeroにGrove光センサーのデータが送信されて表示されることを確認します。
#include "sg_grove_light_sensor_ide.h"		// Additional Header

// チャンネル
#define SG_CH 36
// PANID
#define SG_PANID 0x1111
// destination address
#define SG_DA  0xABCD
// 送信時に光らせる青色LED
#define BLUE_LED 26
// 送信用バッファ
char buf[128];

void setup() {
	// シリアル初期化
	Serial.begin(115200);
	Serial.println("welcome");
	// 14ピン=A0を入力モードに設定
	pinMode(A0,INPUT);

	// 青色LED off
	pinMode(BLUE_LED,OUTPUT);
	digitalWrite(BLUE_LED,HIGH);

	// 無線初期化
	SubGHz.init();
	SubGHz.setBroadcastEnb(false);
}

void loop() {
    int wl;
	int val;

	// バッファクリア
	for(wl=0;wl<sizeof(buf);wl++)buf[wl]=0;
    
	// Grove光センサーの値を読み取る
	val = analogRead(A0);

	// 光センサーの値をバッファに書き込み
	Print.init(buf, sizeof(buf));
	Print.p("l:"); // lightness=l
	Print.l(val,DEC);
	Print.p("\r\n");

	// バッファの内容を送信
	digitalWrite(BLUE_LED,LOW); // 青色LEDをON
	SubGHz.begin(SG_CH, SG_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW);
	SubGHz.send(SG_PANID, SG_DA, buf, strlen(buf,sizeof(buf)),NULL);
	SubGHz.close();
	digitalWrite(BLUE_LED,HIGH); // 青色LEDをOFF
	// コンソールに出力
	Serial.print(buf);

	sleep(2*1000);
}

関連情報

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

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

Lazurite MJ2001とGrove光センサーを接続して、明るさを取得する

Lazurite MJ2001は低消費電力で920MHz無線に対応したマイコンモジュールです。Lazurite MJ2001とGrove光センサーを接続して、明るさを取得するには、以下の手順を実行します。

〇Lazurite MJ2001とGrove光センサー・Groveスクリューターミナルを接続した写真

開発手順

1. 必要部品の準備
・MJ2001(Lazurite Miniシリーズ、920J後継品)
https://www.switch-science.com/catalog/7162/

・Lazurite Mini writer Type B(Lazurite Miniシリーズ)
https://www.switch-science.com/catalog/2956/
※MJ2001にプログラムを書き込むのに必要です。

・10ピン2.54ピッチ(2×5)←→1.27ピッチ(1×10)変換基板 金フラッシュ (4枚入)
https://akizukidenshi.com/catalog/g/gP-07380/
※1.27mmピッチの1列10ピンを 2.54mmピンの2列x5ピンに変換してくれる基板です

・ピンソケット (メス) 1×10 (10P) 1.27mmピッチ
https://akizukidenshi.com/catalog/g/gC-08695/

・ピンヘッダ 2×20 (40P)
https://akizukidenshi.com/catalog/g/gC-00080/
※5ピン分に切っておきます(2列x5ピン分=合計10ピン)。

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

2. 変換基板の作成
ピッチ変換基板・1x10ピンソケット・ピンヘッダをハンダ付けします。1x10ピンソケットとピンヘッダは反対側に取り付けます。

〇はんだ付け前のピッチ変換基板・1x10ピンソケット・ピンヘッダの写真

〇変換基板に1x10ピンソケット・ピンヘッダを取り付けた写真

3. MJ2001と変換基板とGroveデバイスの接続
LAPIS MJ2001という刻印を下・2x5のコネクタを上にした時、左側に変換基板を取り付けたときに(ハーフピッチのコネクタが外側、2.54mmのピンヘッダが内側)、変換基板とGroveスクリューコネクター端子を下記のように接続します。
・下図の大きな①のピン(小さなコネクタの①=LDO3V)とGroveスクリューコネクターのVCCを接続
・下図の大きな②のピン(小さなコネクタの②=GND)とGroveスクリューコネクターのGNDを接続
・下図の大きな③のピン(小さなコネクタの③=GPIO14)とGroveスクリューコネクターのD1を接続

GroveスクリューコネクターとGrove光コネクターは付属のGroveケーブルで接続します

4. Lazurite IDEでのプログラミングのコンパイル・書き込み
以下のプログラムをLazurite IDEでコンパイルしてMJ2001に書き込みます。MJ2001のコンソールにGrove光センサーの値が表示されることを確認します。
#include "grove_light_sensor_ide.h"        // Additional Header

void setup() {
    // シリアル初期化
    Serial.begin(115200);
    Serial.println("welcome");
    // 14ピン=A0を入力モードに設定
    pinMode(A0,INPUT);
}

void loop() {
    int val;
    // Grove光センサーの値を読み取る
    val = analogRead(A0);
    // コンソールに出力
    Serial.print("lightness,");
    Serial.println_long((long)val, DEC);
    delay(2000);
}

関連情報

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

OpenSCADまとめ

OpenSCADはソースコードで3DモデルをデザインできるCADです。

インストール

OpenSCADは様々なプラットフォームにインストールする事ができます。

Windows10にOpenSCADをインストールする

Ubuntu 22.04にOpenSCADをインストールする

Ubuntu Desktop 20.04にOpenSCADをインストールする

Debian 10(Buster)にOpenSCADをインストールする

Rocky Linux 8.4にOpenSCADをインストールする

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

CentOS 8-StreamにOpenSCADをインストールする

CentOS 8.2にOpenSCADをインストールする(Snap版)

CentOS 8.1にOpenSCADをインストールする

Raspberry Piなどのケースのデザイン

3Dプリンターで色々なものを収納するケースをデザインする事も出来ます。

OpenSCADとUltimaker Curaを使用してRaspberry Pi Picoのケースを作成する

OpenSCADとUltimaker Curaを使用してArduino Nano Everyのケースを作成する

OpenSCADとUltimaker Curaを使用してRaspberry Pi Zero WHのケースを作成する

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する
※サーボモーターで動作する小型ターンテーブルをOpenSCADでデザインしています

OpenSCADとUltimaker Curaを使用してRaspberry Pi Zero WHとゼロワン リレー回路 拡張基板のケースを作成する

OpenSCADとUltimaker Curaを使用してRaspberry Pi Zero WHの土台を作成する

OpenSCADとUltimaker Curaを使用してスピーカー用のケースを作成する

OpenSCADとUltimaker Curaを使用して、FT234X超小型USBシリアル変換モジュールのケースを作成する

OpenSCADとUltimaker Curaを使用して、0.96インチ有機ELディスプレイのケースを作成する

OpenSCADとUltimaker Curaを使用して、スライド式の蓋の電池ボックスケースを作成する

OpenSCADとUltimaker Curaを使用して、Instax miniの写真が収まるフレームを作る

OpenSCADとUltimaker Curaを使用して、Instax miniの写真が収まるフレーム(1つ穴付バージョン)を作る

OpenSCADとUltimaker Curaを使用して、太陽電池が収まるフレームを作る

マイクロUSBコネクタを持つ太陽光LEDスティックを作る

OpenSCADとUltimaker Curaを使用してGrove Sound Sensorのケースを作成する

OpenSCADとUltimaker Curaを使用してGrove Light Sensorのケースを作成する

OpenSCADとUltimaker Curaを使用してGrove温度センサー(Grove Temperature Sensor)のケースを作成する

LEGOと一緒に使うことのできるパーツ作成

OpenSCADとUltimaker Curaを使用して、サーボモーターSG90-HVのギヤとLEGOのシャフトを接続するジョイントを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の突起がついたプレートを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の凹みがついたプレートを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換のシャフトが差し込める2x2ブロックを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の2x4ブロックを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の1x2ブロックを作る

OpenSCADとUltimaker Curaを使用して、SG90サーボモーターを固定できるLEGO互換ブロックを作成する

OpenSCADとUltimaker Curaを使用して、LEGO互換の凹みがついたサーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の突起がついたサーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の垂直方向サーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG90ギアに対応する穴がついたアームを作る
※こちらのページのアームはサーボモーターSG90のギア穴が端に配置されています。

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が端についたアームを作る
※こちらのページのアームはサーボモーターSG92Rのギア穴が端に配置されています。

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG90ギアに対応する穴がついたアーム(中央ギア穴版)を作る
※こちらのページのアームはサーボモーターSG90のギア穴が中央に配置されています。

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が中央についたアームを作る
※こちらのページのアームはサーボモーターSG92Rのギア穴が中央に配置されています。

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG90ギアに対応する穴がついた十字アームを作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームを作る

OpenSCADとUltimaker Curaを使用して、Raspberry Pi ZeroをLEGOブロック上に固定できるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi PicoをLEGOブロック上に固定できるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、LEGOブロック上に固定できるLEDキューブを作成する

OpenSCADとUltimaker Curaを使用して、micro:bitをLEGOブロック上に縦置きできるホルダーを作成する

OpenSCADとUltimaker Curaを使用して、LEGO互換の突起が付いたUSBタイプAのキャップを作る

OpenSCADとUltimaker Curaを使用して、Instax mini用写真フレームを差し込む事のできるLEGOブロックを作る

タミヤの楽しい工作シリーズのユニバーサルプレートと一緒に使うことのできるパーツ作成

工作の時に重宝するちょっとしたパーツをデザインする事も出来ます。

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレートにRaspberry Pi Picoを固定する事のできるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、サーボモーターにつける事ができるホイールを作成する

OpenSCADとUltimaker Curaを使用して、サーボモーターのギヤに直接つける事ができるホイールを作成する

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレート用のサーボモーター固定部品を作る

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレート互換のユニバーサルプレートを作成する

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレート互換の四角形フレームを作成する

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

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


OpenSCADとUltimaker Curaを使用して、TAMIYAのユニバーサルプレートに配置できるブリッジを作る

OpenSCADとUltimaker Curaを使用して、Raspberry Pi Zeroをタミヤのユニバーサルプレートに固定できるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、M3ナットがはめることのできるアームプレートを作る

園芸用小物の作成

園芸の用のラベルの形状・大きさなど、自分好みにデザインできます。

OpenSCADとUltimaker Curaを使用して園芸用ラベルを作成する

OpenSCADとUltimaker Curaを使用して紐や結束バンドで固定できるタグを作成する

OpenSCADとUltimaker Curaを使用して、ペットボトルからシリコンチューブに接続することのできる穴つきキャップを作成する

スタンプ

グリーティングカードなどの修飾に使用するスタンプを作成する事もできます。

OpenSCADとUltimaker Curaを使用して日本語の文字のスタンプを作成する

OpenSCADとUltimaker Curaを使用して月形のスタンプを作成する

OpenSCADとUltimaker Curaを使用して星形のスタンプを作成する

DIYの治具などの作成

DIYなどの治具やちょっとした軽量の物をひっかけるフックなどをデザインする事も出来ます。

OpenSCADとUltimaker Curaを使用して1x4用のソーガイドを作成する

OpenSCADとUltimaker Curaを使用して穴開け用治具を作成する

OpenSCADとUltimaker Curaを使用して吊るしフックを作成する

OpenSCADとUltimaker Curaを使用して棚ダボを作成する

OpenSCADとUltimaker Curaを使用して2x4の断面が短いほうの面の中心にしるしを付ける治具を作成する

OpenSCADとUltimaker Curaを使用してコの字型ハンドル取り合付け穴開け用の治具を作成する

OpenSCADとUltimaker Curaを使用して2x4の断面が長いほうの面に穴を開ける治具を作成する

OpenSCADとUltimaker Curaを使用して2x4の断面が長いほうの面の中心にしるしを付ける治具を作成する

整理整頓・収納

OpenSCADとUltimaker Curaを使用して、単3電池保管ケースを作成する

OpenSCADとUltimaker Curaを 使用して、単4電池保管ケースを作成する

OpenSCADとUltimaker Curaを使用して、接着剤のタミヤセメントのケースを作成する

OpenSCADとUltimaker Curaを使用して、巻取り式コードリールを作る

OpenSCADとUltimaker Curaを使用して、スタック可能な箱を作る

OpenSCADとUltimaker Curaを使用して、1x4材にはめることのできるフックを作る

その他

OpenSCADとUltimaker Curaを使用して、秋月電子さんのユニバーサル基板Dタイプが収まるフレームを作る

OpenSCADとUltimaker Curaを使用して、蝶番を作る