lynx   »   [go: up one dir, main page]

ラベル flask の投稿を表示しています。 すべての投稿を表示
ラベル flask の投稿を表示しています。 すべての投稿を表示

2021年7月15日木曜日

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

サーボモーターと3Dプリンターで作成した小型ターンテーブルをRaspberry Pi Zero上のREST APIで制御するには、以下の手順を実行します。

〇Raspberry Pi Zeroとターンテーブル

開発手順 1. 回転台部分の作成
OpenSCADで以下のファイルを実行し、回転部分のモデルをSTLで保存します。保存したSTLファイルをUltimaker Curaでgcodeにスライスして3Dプリンターで印刷します。

〇OpenSCADの回転部分の画面

// servo TURNTABLE
TURNTABLE_DIAMETER_L=42;
TURNTABLE_HEIGHT_L=3;
TURNTABLE_DIAMETER_LL=47;
TURNTABLE_HEIGHT_LL=2;

// servoアームシャフト部分の穴
LARGE_HOLE_HEIGHT=0.0;
LARGE_HOLE_DIAMETER=7.8;
ARM_HEIGHT=2;
SPACE_HOLE=15;
SMALL_HOLE_RADIUS=4.2/2;

// アーム固定用ネジ穴
SCREW_HOLE_POS=8.5;
SCREW_HOLE_DIAMETER=1+1;
SCREW_HOLE_HEIGHT=10;

difference(){
    union(){
        translate([0, 0, 0])
        linear_extrude(height=TURNTABLE_HEIGHT_L){
            circle(TURNTABLE_DIAMETER_L/2, $fn=50);
        }
        translate([0, 0, -TURNTABLE_HEIGHT_LL])
        linear_extrude(height=TURNTABLE_HEIGHT_LL){
            circle(TURNTABLE_DIAMETER_LL/2, $fn=50);
        }
    }
    union(){
        translate([0, 0, TURNTABLE_HEIGHT_L-(LARGE_HOLE_HEIGHT+ARM_HEIGHT)-0.5])
        linear_extrude(height=LARGE_HOLE_HEIGHT+ARM_HEIGHT){
            circle(LARGE_HOLE_DIAMETER/2, $fn=50);
        }
        translate([0, 0, TURNTABLE_HEIGHT_L-ARM_HEIGHT])
        linear_extrude(height=ARM_HEIGHT){
            polygon(points = [
              [0, LARGE_HOLE_DIAMETER/2],
              [0, -LARGE_HOLE_DIAMETER/2],
              [SPACE_HOLE, -SMALL_HOLE_RADIUS],
              [SPACE_HOLE, SMALL_HOLE_RADIUS]
            ]);
            polygon(points = [
              [0, LARGE_HOLE_DIAMETER/2],
              [0, -LARGE_HOLE_DIAMETER/2],
              [-SPACE_HOLE, -SMALL_HOLE_RADIUS],
              [-SPACE_HOLE, SMALL_HOLE_RADIUS]
            ]);
        }
        translate([SCREW_HOLE_POS, 0, TURNTABLE_HEIGHT_L-(ARM_HEIGHT+SCREW_HOLE_HEIGHT)])
        linear_extrude(height=ARM_HEIGHT+SCREW_HOLE_HEIGHT){
            circle(SCREW_HOLE_DIAMETER/2, $fn=50);
        }
        translate([-SCREW_HOLE_POS, 0, TURNTABLE_HEIGHT_L-(ARM_HEIGHT+SCREW_HOLE_HEIGHT)])
        linear_extrude(height=ARM_HEIGHT+SCREW_HOLE_HEIGHT){
            circle(SCREW_HOLE_DIAMETER/2, $fn=50);
        }

    }
}

2. 回転台を支える天板部分の作成
OpenSCADで以下のファイルを実行し、回転台を支える天板部分のモデルをSTLで保存します。保存したSTLファイルをUltimaker Curaでgcodeにスライスして3Dプリンターで印刷します。

〇OpenSCADの回転台を支える天板部分の画面

// TURNTABLE 天板
TURNTABLE_DIAMETER_L=42+1;
TURNTABLE_HEIGHT_L=3;
TURNTABLE_DIAMETER_LL=47+1;
TURNTABLE_HEIGHT_LL=2;
// 箱の大きさ
MOUNTER_THICK=2;
BOX_SIZE=50;

difference(){
    union(){
        translate([-BOX_SIZE/2, -BOX_SIZE/2, 0])
        linear_extrude(height=TURNTABLE_HEIGHT_L+TURNTABLE_HEIGHT_LL){
                square([BOX_SIZE, BOX_SIZE]);
        }
    }
    union(){
        translate([0, 0, 0])
        linear_extrude(height=TURNTABLE_HEIGHT_L){
            circle(TURNTABLE_DIAMETER_L/2, $fn=50);
        }
        translate([0, 0, TURNTABLE_HEIGHT_L])
        linear_extrude(height=TURNTABLE_HEIGHT_LL){
            circle(TURNTABLE_DIAMETER_LL/2, $fn=50);
        }
    }
}

3. サーボモーター固定台の作成
OpenSCADで以下のファイルを実行し、サーボモーター固定台のモデルをSTLで保存します。保存したSTLファイルをUltimaker Curaでgcodeにスライスして3Dプリンターで印刷します。

〇OpenSCADのサーボモーター固定台の画面

// サーボモーター固定台
MOUNTER_THICK=2;
BOX_SIZE=50-MOUNTER_THICK*2;

MOUNTER_W=23;
MOUNTER_D=9;
HOLE_RADIUS=0.6;

HANDLE_W = 5;
HANDLE_H=12.2;

SERVO_BOTTOM=7;
SERVO_OFFSET=12.2;
HOLE2_DIAMETER=3; // 穴の大きさは適宜変更してください

module mounter2()
{
    difference()
    {
        union()
        {
            translate([-HANDLE_W-SERVO_OFFSET/2, 0, 0])
            linear_extrude(height=MOUNTER_THICK){
                square([MOUNTER_W+HANDLE_W*2, MOUNTER_D]);
            }

            translate([-HANDLE_W-SERVO_OFFSET/2, 0, MOUNTER_THICK])
            linear_extrude(height=HANDLE_H){
                square([HANDLE_W, MOUNTER_D]);
            }
            translate([MOUNTER_W-SERVO_OFFSET/2, 0, MOUNTER_THICK])
            linear_extrude(height=HANDLE_H){
                square([HANDLE_W, MOUNTER_D]);
            }
        }
        rotate([-90,0,0])
        translate([-HANDLE_W/2-SERVO_OFFSET/2, -MOUNTER_THICK-HANDLE_H/2, 0])
        linear_extrude(height=MOUNTER_D){
            circle(HOLE_RADIUS, $fn=50);
        }

        rotate([-90,0,0])
        translate([MOUNTER_W+HANDLE_W/2-SERVO_OFFSET/2, -MOUNTER_THICK-HANDLE_H/2, 0])
        linear_extrude(height=MOUNTER_D){
            circle(HOLE_RADIUS, $fn=50);
        }

    }   

    // servo motor直下
    translate([-BOX_SIZE/2, MOUNTER_D, 0])
    linear_extrude(height=MOUNTER_THICK){
        square([BOX_SIZE, SERVO_BOTTOM]);
    }
    translate([-BOX_SIZE/2, MOUNTER_D+SERVO_BOTTOM, 0])
        linear_extrude(height=HANDLE_H+MOUNTER_THICK){
            square([BOX_SIZE, MOUNTER_THICK]);
    }

}
mounter2();

4. ターンテーブル底板の作成
OpenSCADで以下のファイルを実行し、ターンテーブル底板のモデルをSTLで保存します。保存したSTLファイルをUltimaker Curaでgcodeにスライスして3Dプリンターで印刷します。

〇OpenSCADのターンテーブル底板の画面

// ターンテーブルの底版
THICK=2;
BOX_SIZE=50;

// サーボモーター固定台の幅
SERVO_W=14.4;

difference(){
    union(){
        translate([-BOX_SIZE/2, -BOX_SIZE/2, 0])
        linear_extrude(height=THICK){
                square([BOX_SIZE, BOX_SIZE]);
        }
                
        translate([-BOX_SIZE/2+THICK, -BOX_SIZE/2+THICK, THICK])
        linear_extrude(height=THICK){
                square([BOX_SIZE-THICK*2, BOX_SIZE-THICK*2]);
        }
    }
    translate([-SERVO_W/2, -BOX_SIZE/2+THICK, THICK])
    linear_extrude(height=THICK){
            square([SERVO_W, BOX_SIZE-THICK*2]);
    }
}

5. ターンテーブル側面の作成
OpenSCADで以下のファイルを実行し、ターンテーブル側面のモデルをSTLで保存します。保存したSTLファイルをUltimaker Curaでgcodeにスライスして3Dプリンターで印刷します。

〇OpenSCADのターンテーブル側面の画面

// ターンテーブルの側面
BOX_THICK=2;
BOX_SIZE=50;
BOX_HEIGHT=31.4;

// サーボモーター接続用ケーブルの穴
CABLE_HOLE_W=6;
CABLE_HOLE_H=2;

difference(){
    union(){
        translate([-BOX_SIZE/2, -BOX_SIZE/2, 0])
        linear_extrude(height=BOX_HEIGHT){
                square([BOX_SIZE, BOX_THICK]);
        }

        translate([-BOX_SIZE/2, BOX_SIZE/2-BOX_THICK, 0])
        linear_extrude(height=BOX_HEIGHT){
                square([BOX_SIZE, BOX_THICK]);
        }

        translate([-BOX_SIZE/2, -BOX_SIZE/2, 0])
        linear_extrude(height=BOX_HEIGHT){
                square([BOX_THICK, BOX_SIZE]);
        }

        translate([BOX_SIZE/2-BOX_THICK, -BOX_SIZE/2, 0])
        linear_extrude(height=BOX_HEIGHT){
                square([BOX_THICK, BOX_SIZE]);
        }
    }
    translate([-CABLE_HOLE_W/2, -BOX_SIZE/2, BOX_HEIGHT-CABLE_HOLE_H])
    linear_extrude(height=CABLE_HOLE_H){
            square([CABLE_HOLE_W, BOX_THICK]);
    }

}

6. 3Dプリンターで作成した部品の確認
この時点で以下の写真のような5つの部品があるので、適宜バリなどを取っておきます。

7. 回転部分とサーボモーター付属のアームのネジ止め
回転部分とサーボモーター付属のアームをネジ止めします。

8. 底板とサーボモーター固定台の接着
タミヤセメントなどの接着剤を使用して、底板とサーボモーター固定台を接着します。接着剤を塗って接着した後、クリップなどで固定しておきます。
サーボモーターが中心に来るように、底板部分の短い板の部分とサーボモーターの垂直部分が同じ側になるように接着します。

9. サーボモーターの取り付け
以下の秋月電子さんで販売しているサーボモーターをサーボモーター固定台にネジ止めします。このとき、サーボモーターのシャフトが中心側に来るように取り付けます。

360°連続回転サーボ(ローテーションサーボ) SG90-HV
https://akizukidenshi.com/catalog/g/gM-14382/


10.回転台を支える天板部分と側面部分の接着
タミヤセメントなどの接着剤を使用して、回転台を支える天板部分と側面部分を接着します。完全に固定されるまで、重しなどを乗せておきます。

11. 手順9と手順10で作成した部品をはめ込む
手順9で作成した部品と手順10で作成した部品をはめ込むと以下の様な写真の状態になります。サーボモーターのケーブルは側面の窪みのところから外部へ出します。

12. サーボモーターとRaspberry Pi Zeroの接続と回転部分のはめ込み
サーボモーターのケーブルとRaspberry Pi Zeroをジャンパ線などで以下の様に接続します。
下図の4番ピン(5V power)→サーボモーターのオレンジ色のケーブル端子
下図の6番ピン(Ground)→サーボモーターの茶色のケーブル端子
下図の32番ピン(PWM0)→サーボモーターの黄色のケーブル端子

配線が終了したら最後に回転部分をはめ込みます

13. Raspberry Pi Zeroに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

14. flaskとRpi.GPIOモジュールがインストールされた仮想環境を作成する
pipenvを使用する場合は以下のコマンドで、REST API用の仮想環境を作成します。REST APIを実装するためにflask、サーボモーターを制御するためにRPi.GPIOをインストールします。
mkdir -p ~/turntable

cd ~/turntable

pipenv --python 3

pipenv install flask

pipenv shell

python -m pip install RPi.GPIO

15. Flask REST APIアプリケーションの作成
/turntableに回転速度を指定するdegreeパラメータと動作秒数を指定するdurationパラメータでアクセスしたとき、サーボモーターを回転するようにします。

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


GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.OUT)


app = Flask(__name__)

@app.route('/turntable')
def turntable():
  degree = int(request.args.get('degree', ''))
  duration = int(request.args.get('duration', ''))
  pwm = GPIO.PWM(12, 50) # pin=12, 50Hz
  pwm.start(0)
  pwm.ChangeDutyCycle( 2.5 + (12.0-2.5)/180*(degree+90))
  time.sleep(duration)
  pwm.stop()
  return {"status":"ok"}

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

flask run -h 0.0.0.0

ブラウザから以下のアドレスにアクセスします。小型ターンテーブルがゆっくりと2秒間回転する事を確認します。
http://<Raspberry Pi ZeroのIP>:5000/turntable?degree=1&duration=2

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

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

2021年7月11日日曜日

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_temp

cd ./m5stickc_temp

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('/temp', methods=["POST"])
def m5stick_temp():
    temp = float(request.json['temp'])
    print("temp:{}".format((temp)))
    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 math
import urequests
import ujson
import network

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

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


# Wifiの初期化
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())

connect_wifi()

# ADC初期化
pin33 = machine.ADC(machine.Pin(33))
pin33.atten(machine.ADC.ATTN_11DB)
pin33.width(machine.ADC.WIDTH_10BIT)

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

    # 温度センサー測定
    # 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
    # REST APIに通知
    data = ujson.dumps({"temp":str(temperature)})
    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デバイスまとめ

2021年6月24日木曜日

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月22日火曜日

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月20日日曜日

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月16日水曜日

Raspberry Pi Zeroとゼロワン リレー回路 拡張基板で100V電源オンオフを制御するREST APIを作成する

Raspberry Pi Zeroとゼロワン リレー回路 拡張基板で100V電源オンオフを制御するREST APIを作成するには以下の手順を実行します。
100V電源でショートなどすると危険なので細心の注意を払いましょう。

〇Raspberry Pi Zeroとゼロワン リレー回路 拡張基板を接続した写真

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

pip3 install flask

3. Flask REST APIアプリケーションの作成
/relayにアクセスされたとき、指定したstateパラメータによって100V電源の点灯・消灯を制御できるREST APIをflaskで作成します。

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

app = Flask(__name__)

pin = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)

@app.route('/relay')
def control_relay():
  state = request.args.get('state', '')
  if state == 'on' or state == '1':
    GPIO.output(pin, GPIO.HIGH)
  if state == 'off' or state == '0':
    GPIO.output(pin, GPIO.LOW)
  return {"result":"ok"}

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

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

次に、ブラウザから以下のアドレスにアクセスして、100V電源を制御できることを確認します。
・リレーオン
http://<Raspberry Piのホスト名またはIPアドレス>:5000/relay?state=on

・リレーオフ
http://<Raspberry Piのホスト名またはIPアドレス>:5000/relay?state=off

関連項目 ・Raspberry Pi Zeroとゼロワン リレー回路 拡張基板で100V電源をオンオフする

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

Groveデバイスまとめ

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

2021年5月12日水曜日

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_sound_sensorにアクセスされたとき、音量の情報を取得してJSONで返すコードを実装します。

app.py
from flask import Flask, jsonify, request
from grove.grove_sound_sensor import GroveSoundSensor
import time

app = Flask(__name__)

PIN_A0 = 0
sensor = GroveSoundSensor(PIN_A0)

@app.route('/grove_sound_sensor')
def get_grove_sound_sensor():
  return {"sound":sensor.sound}

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

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

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

関連情報 ・Groveデバイスまとめ

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

2021年5月3日月曜日

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.grove_ultrasonic_ranger import GroveUltrasonicRanger
import time

app = Flask(__name__)

PIN_D5 = 5
sensor = GroveUltrasonicRanger(PIN_D5)

@app.route('/grove_ultrasonic_ranger')
def grove_ultrasonic_ranger():
  return {"distance":sensor.get_distance()}

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

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

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

関連情報 ・Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと超音波距離センサモジュールで距離データを送受信する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離をPostgreSQLに保存する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離を取得する

Groveデバイスまとめ

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

2021年4月28日水曜日

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日火曜日

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月24日土曜日

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月20日火曜日

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月17日土曜日

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月12日月曜日

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月7日水曜日

Raspberry Pi Zero上のFlaskで、キャラクタ液晶ディスプレイモジュールにテキストを表示するREST APIを作成する

Raspberry Pi Zero上のFlaskで、キャラクタ液晶ディスプレイモジュールにテキストを表示する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. 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アプリケーションの作成 /displayに以下のパラメータを渡すとキャラクタ液晶ディスプレイモジュールに表示するコードを実装します。 line1 → 1行目に表示する文字列 line2 → 2行目に表示する文字列 app.py
from flask import Flask, jsonify, request
import smbus
import time

i2c = smbus.SMBus(1)
addr_lcd=0x3e

# Initialize
# Function Set
i2c.write_byte_data(addr_lcd, 0x00, 0x38)
time.sleep(0.01)

# Function Set
i2c.write_byte_data(addr_lcd, 0x00, 0x39)
time.sleep(0.01)

# Internal OSC frequency
i2c.write_byte_data(addr_lcd, 0x00, 0x14)
time.sleep(0.01)

# Contrast set
i2c.write_byte_data(addr_lcd, 0x00, 0x70)
time.sleep(0.01)

# Power/ICON/Constrast control
i2c.write_byte_data(addr_lcd, 0x00, 0x56)
time.sleep(0.01)

# Follower control
i2c.write_byte_data(addr_lcd, 0x00, 0x6c)
time.sleep(0.01)

# Function set
i2c.write_byte_data(addr_lcd, 0x00, 0x38)
time.sleep(0.01)

# Display ON/OFF control
i2c.write_byte_data(addr_lcd, 0x00, 0x0c)
time.sleep(0.01)

# Clear Display
i2c.write_byte_data(addr_lcd, 0x00, 0x01)
time.sleep(0.1)

app = Flask(__name__)

@app.route('/display')
def show_message():
  line1 = request.args.get('line1', '')
  line2 = request.args.get('line2', '')
  for ch in line1.encode("shift_jis"):
    i2c.write_byte_data(addr_lcd, 0x40, ch)
    time.sleep(0.01)

  i2c.write_byte_data(addr_lcd, 0x00, 0xc0)
  for ch in line2.encode("shift_jis"):
    i2c.write_byte_data(addr_lcd, 0x40, ch)
    time.sleep(0.01)
  return jsonify({"line1":line1, "line2":line2})

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

flask run -h 0.0.0.0

次に、ブラウザから以下のアドレスにアクセスして、2行分の文字列が表示されることを確認します。
http://<Raspberry Piのホスト名またはIPアドレス>:5000/display?line1=Hello&line2=コンニチハ

関連情報 ・秋月電子のRaspberry Piキャラクタ液晶ディスプレイモジュール
https://akizukidenshi.com/catalog/g/gK-11354/

2021年3月20日土曜日

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

Raspberry Pi ZeroとBME680センサーで、温度・気圧・湿度・ガスの情報を返すREST APIを作成するには、以下の手順を実行します。

※Raspberry Pi ZeroとBME680の接続は「Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する」を参照してください。

開発手順 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. bme680モジュールとflaskがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、bme680とflask用の仮想環境を作成します。
mkdir -p ~/bme680_flask

cd ~/bme680_flask

pipenv --python 3

pipenv install bme680 flask smbus

pipenv shell

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

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

try:
    sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
    sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)

sensor.set_gas_heater_temperature(320)
sensor.set_gas_heater_duration(150)
sensor.select_gas_heater_profile(0)

app = Flask(__name__)

@app.route('/bme680')
def get_bme680():
  data = {}
  while True:
    if sensor.get_sensor_data():
      if sensor.data.gas_resistance:
        data = {"temperature":sensor.data.temperature, "pressure":sensor.data.pressure, "humidity":sensor.data.humidity, "gas":sensor.data.gas_resistance}
      break
  return jsonify(data)

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

flask run -h 0.0.0.0

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

関連情報 ・bme680-pythonのgithubリポジトリ
https://github.com/pimoroni/bme680-python

2016年8月16日火曜日

flaskでhello worldを行うDockerコンテナを作成する

flaskでhello worldを行うDockerコンテナを作成するには、以下のDockerfileを使用します。

使用するDockerfile
FROM ubuntu:16.04

RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:en
ENV LC_ALL ja_JP.UTF-8

RUN apt-get update \
  && apt-get -y install python-pip \
  && pip install --upgrade Flask

CMD "/bin/bash"

以下のコマンドでコンテナの作成を行う。
docker build -t ub1604flask .

以下のコマンドでコンテナの実行を行う。
docker run -v `pwd`/dat:/dat -p 5000:5000 --rm -it ub1604flask python /dat/app.py

dat/app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

ブラウザからはホストのIPアドレス:5000でアクセスする。
Лучший частный хостинг