2020年05月

・最新版 ラズパイOS Raspberry Pi OS 2020/05/27



・Raspberry Pi Imager Toolを使用してSDカードに書き込みます。





・旧バージョンのダウンロードURL

HTTP

こちらでも3種類は場所が異なります。

with desktop and recommended software(いわゆるフルver)
https://downloads.raspberrypi.org/raspbian_full/images/

with desktop(いわゆる通常ver)

https://downloads.raspberrypi.org/raspbian/images/

Lite
https://downloads.raspberrypi.org/raspbian_lite/images/

FTP

FTPは国内にあるミラーサイトだから速いです。中身は同じです。

with desktop and recommended software
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/

with desktop
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

Lite
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/


・Raspi に BME280 温湿度気圧センサーを付けて alexa に 室温 を喋らせてみました。

 2020/5/17現在のものです。
色々とネットで先人の方達のお知恵をお借りしてやっとできました。
ありがとうございます。プログラムなどは、自己責任でお使いください。





参考URL
Raspberry Pi で温湿度気圧センサを使う
https://qiita.com/yukataoka/items/8f9046587c978e91f689

Alexaに部屋の温度と湿度を教えてもらう



P1
スライド1

P2
スライド2

P3
スライド3

P4
スライド4

P5
スライド5


◆I2C(BME280)関係は、下記URLを参照してセットアップします。

Raspberry Pi で温湿度気圧センサを使う
https://qiita.com/yukataoka/items/8f9046587c978e91f689


P6
スライド6

◆簡易HTTPサーバーコード(~/app/alexa/server.py)
#############################################################
import http.server
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #ハンドラを設定
simple_server = http.server.HTTPServer(server_address, handler_class)
simple_server.serve_forever()

◆indexファイル(~/app/alexa/index.html)
#############################################################
<html>
<body>
  Hello Raspi HTTPServer.
</body>
</html>


P7
スライド7

◆Alexaスキルの応答コード (~/app/alexa/cgi-bin/bme280web.py)
#############################################################
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from smbus2 import SMBus
import time
import json

class Bme280:

    def __init__(self, busNumber=1, i2cAddress=0x76):

        self.bus = SMBus(busNumber)
        self.i2cAddress = i2cAddress
        self.digT = []
        self.digP = []
        self.digH = []
        self.timeFine = 0.0
        self.presRaw  = 0.0
        self.tempRaw  = 0.0
        self.humRaw   = 0.0

        osrsT   = 1         #Temperature oversampling x 1
        osrsP   = 1         #Pressure oversampling x 1
        osrsH   = 1         #Humidity oversampling x 1
        mode    = 3         #Normal mode
        tSb     = 5         #Tstandby 1000ms
        filter  = 0         #Filter off
        spi3wEn = 0         #3-wire SPI Disable

        ctrlMeasReg = (osrsT << 5) | (osrsP << 2) | mode
        configReg   = (tSb << 5) | (filter << 2) | spi3wEn
        ctrlHumReg  = osrsH

        self.writeReg(0xF2,ctrlHumReg)
        self.writeReg(0xF4,ctrlMeasReg)
        self.writeReg(0xF5,configReg)
        self.getCalibParam()

        self.readData()

    def writeReg(self, regAddress, data):
        self.bus.write_byte_data(self.i2cAddress, regAddress, data)

    def getCalibParam(self):
        calib = []

        for i in range (0x88,0x88+24):
            calib.append(self.bus.read_byte_data(self.i2cAddress,i))
        calib.append(self.bus.read_byte_data(self.i2cAddress,0xA1))
        for i in range (0xE1,0xE1+7):
            calib.append(self.bus.read_byte_data(self.i2cAddress,i))

        self.digT.append((calib[1] << 8) | calib[0])
        self.digT.append((calib[3] << 8) | calib[2])
        self.digT.append((calib[5] << 8) | calib[4])
        self.digP.append((calib[7] << 8) | calib[6])
        self.digP.append((calib[9] << 8) | calib[8])
        self.digP.append((calib[11]<< 8) | calib[10])
        self.digP.append((calib[13]<< 8) | calib[12])
        self.digP.append((calib[15]<< 8) | calib[14])
        self.digP.append((calib[17]<< 8) | calib[16])
        self.digP.append((calib[19]<< 8) | calib[18])
        self.digP.append((calib[21]<< 8) | calib[20])
        self.digP.append((calib[23]<< 8) | calib[22])
        self.digH.append( calib[24] )
        self.digH.append((calib[26]<< 8) | calib[25])
        self.digH.append( calib[27] )
        self.digH.append((calib[28]<< 4) | (0x0F & calib[29]))
        self.digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F))
        self.digH.append( calib[31] )

        for i in range(1,2):
            if self.digT[i] & 0x8000:
                self.digT[i] = (-self.digT[i] ^ 0xFFFF) + 1

        for i in range(1,8):
            if self.digP[i] & 0x8000:
                self.digP[i] = (-self.digP[i] ^ 0xFFFF) + 1

        for i in range(0,6):
            if self.digH[i] & 0x8000:
                self.digH[i] = (-self.digH[i] ^ 0xFFFF) + 1  

    def readData(self):
        data = []
        for i in range (0xF7, 0xF7+8):
            data.append(self.bus.read_byte_data(self.i2cAddress,i))
        self.presRaw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
        self.tempRaw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
        self.humRaw  = (data[6] << 8)  |  data[7]

    def getPressure(self):
        pressure = 0.0

        v1 = (self.timeFine / 2.0) - 64000.0
        v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * self.digP[5]
        v2 = v2 + ((v1 * self.digP[4]) * 2.0)
        v2 = (v2 / 4.0) + (self.digP[3] * 65536.0)
        v1 = (((self.digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8)  + ((self.digP[1] * v1) / 2.0)) / 262144
        v1 = ((32768 + v1) * self.digP[0]) / 32768

        if v1 == 0:
            return 0
        pressure = ((1048576 - self.presRaw) - (v2 / 4096)) * 3125
        if pressure < 0x80000000:
            pressure = (pressure * 2.0) / v1
        else:
            pressure = (pressure / v1) * 2
        v1 = (self.digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
        v2 = ((pressure / 4.0) * self.digP[7]) / 8192.0
        pressure = pressure + ((v1 + v2 + self.digP[6]) / 16.0)
        return pressure/100

    def getTemperature(self):
        v1 = (self.tempRaw / 16384.0 - self.digT[0] / 1024.0) * self.digT[1]
        v2 = (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * self.digT[2]
        self.timeFine = v1 + v2
        temperature = self.timeFine / 5120.0
        return temperature

    def getHumidity(self):
        varH = self.timeFine - 76800.0
        if varH != 0:
            varH = (self.humRaw - (self.digH[3] * 64.0 + self.digH[4]/16384.0 * varH)) * (self.digH[1] / 65536.0 * (1.0 + self.digH[5] / 67108864.0 * varH * (1.0 + self.digH[2] / 67108864.0 * varH)))
        else:
            return 0
        varH = varH * (1.0 - self.digH[0] * varH / 524288.0)
        if varH > 100.0:
            varH = 100.0
        elif varH < 0.0:
            varH = 0.0
        return varH


temp=20
humi=20
pres=1000

sensor = Bme280()
temp=format(sensor.getTemperature(),'.1f')
humi=format(sensor.getHumidity(),'.1f')
pres=sensor.getPressure()

speak = "現在書斎の室温は{0}度。湿度は{1}パーセント。気圧は{2}ヘクトパスカルです。".format(float(temp), float(humi),int(pres))

resp = {
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "ssml": "<speak>" + speak + "</speak>",
      "type": "SSML"
    },
    "speechletResponse": {
      "outputSpeech": {
      "ssml": "<speak>" + speak + "</speak>"
      },
      "shouldEndSession": True
    }
  },
  "sessionAttributes": {}
}

print("Content-type: application/json\n")
print(json.dumps(resp))
#############################################################

P8
スライド8

◆Webサーバーの起動
$ cd /home/pi/app/alexa
$ python3 server.py


◆Linux (ARM)版をインストール
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ sudo mv ngrok /usr/local/bin/
$ ngrok version
ngrok version 2.2.8

$ ngrok authtoken (自分の認証トークン((authtoken)

◆ngrokで外部に公開します。
$ ngrok http 8000


P9
スライド9

P10

下記URLを参照し、Alexaスキルを作成します。

◆ngrokのダッシュボードで確認して、スキルのエンドポイントに設定する。


Alexaに部屋の温度と湿度を教えてもらう

◆アレクサ スキル開発

◆Alexa公式 動画シリーズ「Alexa道場」


スライド10


P11
スライド11

おしまい


・Windows10Pro X64上 の VMware に macOS 10.15 Catalina のインストールを夢見た。

(注)下記は、すべて夢の中の出来事です。

catalina1015



1.最初に下記URLを参照してMac OS Sierra10.12.4をインストール


2.次に下記URLを参照してSierra10.12.4上でCatalina10.15の
  インストールDISKを作成後、macOS 10.15 Catalinaをインストール
  出来た。


3.2より簡単にインストールする方法

VMWareで「macOS Catalina」 超簡単なインストール手順編



↑このページのトップヘ