複数の WxBeacon2 と連携する
概要
- 複数の WxBeacon2 を起動する
- env2ambientBS.py は各機のデータを全て拾って一つの ambient チャネルへ登録するためデータが混乱する
- 各機のユニークな Bluetooth Device Address で ambient のチャネルごとにデータを割り振る
- env2ambientBS.py のスクリプトを以下のとおり改造する
WxBeacon2 のデバイスアドレス
LE スキャンをする。
$ sudo hcitool lescan LE Scan ... XX:XX:XX:XX:XX:XX (unknown) YY:YY:YY:YY:YY:YY (unknown) ZZ:ZZ:ZZ:ZZ:ZZ:ZZ (unknown) AA:BB:CC:DD:EE:FF IM QQ:QQ:QQ:QQ:QQ:QQ (unknown) GG:HH:II:JJ:KK:LL IM ...
WxBeacon2 の Bluetooth Device Address を各機ごとにメモする。
ここでは AA:BB:CC:DD:EE:FF および GG:HH:II:JJ:KK:LL が該当する。
ソースコードを改造する
参考サイトにあった env2ambientBS.py のソースコードを改造する。(GitHub)
diff は次のとおり。
17,18c17,18 < channelID = 100 < writeKey = 'writeKey' --- > channelID = xxxxx > writeKey = 'xxxxxxxxxxxxxxxx' 20a21,23 > BDAddr = 'XX:XX:XX:XX:XX:XX' > BDAddr = BDAddr.lower() > 52c55 < if companyID == 'ffff': --- > if devs[target]['companyID'] == 'ffff': 77c80,81 < send2ambient(value[6:]) --- > if dev.addr == BDAddr: > send2ambient(value[6:])
上記でメモしたデバイスアドレスは全て大文字で記入する。.lower()で自動的に変換させる。
改造後は WxBeacon2とラズパイを連携させる - 作業日記@HatenaBlog と設定は同じ。
WxBeacon2 の数だけスクリプトを用意して実行する。
WxBeacon2とラズパイを連携させる
WxBeacon2 の入手
直販サイトから入手した。
WxBeacon2 は OMRON の環境センサ 2JCIE-BL の OEM 品らしい。
ユーザーズマニュアル(PDF)
Ambient へ登録
Ambient へユーザ登録(無償)をする。
新規チャネルを 1 つ作成しておくこと。
Raspberry Pi 3 の設定
参考サイトを元に各種設定をする。
なお、Raspberry Pi 3 の初期設定は完了しているものとする。
$ sudo apt-get update $ sudo apt-get upgrade
pyenv を導入
当方環境では python 2,3 が共存している。
2 系、3 系を同時設定が可能な pyenv を導入する。(参考サイト)
必要なパッケージのインストール、git から pyenv をクローンする。
なお、sudo のパスが通らないときは ここ を参照し /etc/sudoers の記述を変更する。
$ sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev $ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
.bash_profile に設定を追加。
$ sudo vi ~/.bash_profile # 以下の内容を追記 export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" . "$HOME/.bashrc"
設定を反映。
.bash_profile があると .bashrc が読み込まれないので注意。(参考サイト)
$ source ~/.bash_profile
インストール可能な python パッケージを確認。
$ pyenv install --list ... ... 3.6.4 3.6.5 3.6.6 ... ...
python 2系、3系を共存させる。
python 2 のバージョン確認。
$ python -V Python 2.7.13
pyenv で 2系、3系をともにインストールする。
本件の参考サイトで使用していた 3.6.5 をインストールする。
$ pyenv install 2.7.13 $ pyenv install 3.6.5
同時使用できるようにする。
$ pyenv global 2.7.13 3.6.5 $ pyenv version 2.7.13 (set by /home/pi/.pyenv/version) 3.6.5 (set by /home/pi/.pyenv/version) $ python -V Python 2.7.13 $ python3 -V Python 3.6.5
pip を最新版にする。
$ pip3 install --upgrade pip
Python BLE ライブラリを導入
$ sudo apt-get install libglib2.0-dev $ pip3 install bluepy
BLE ライブラリが import できない場合は、次を実行する。
bluepy 公式サイトから最新のソースコードを DL する。
$ cd /tmp $ wget https://files.pythonhosted.org/packages/27/91/6cfca10bee9862f93015413cf9e6a52c3081a71f1518963396a055128f8e/bluepy-1.3.0.tar.gz $ tar xvzf bluepy-1.3.0.tar.gz $ cd bluepy-1.3.0 $ sudo python3 setup.py build $ sudo python3 setup.py install
Ambient のライブラリを導入
$ sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
Raspberry Pi 3 の Bluetooth バージョン確認
$ bluetoothd -v 5.43
WxBeacon2 の設定
WxBeacon2 に電池を入れて hcitool で BLE をスキャンする。
末尾が Env のものが WxBeacon2 である。
$ sudo hcitool lescan LE Scan ... ... XX:XX:XX:XX:XX:XX (unknown) AA:BB:CC:DD:EE:FF Env
スキャンした WxBeacon2 に接続してサービスを調べる。
connect コマンドがエラーになる場合は何回かリトライする。
$ gatttool -b AA:BB:CC:DD:EE:FF -t random -I [AA:BB:CC:DD:EE:FF][LE]> connect Attempting to connect to AA:BB:CC:DD:EE:FF Connection successful [AA:BB:CC:DD:EE:FF][LE]> primary attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb attr handle: 0x000c, end grp handle: 0x0016 uuid: 0000180a-0000-1000-8000-00805f9b34fb attr handle: 0x0017, end grp handle: 0x0025 uuid: 0c4c3000-7700-46f4-aa96-d5e974e32a54 attr handle: 0x0026, end grp handle: 0x003a uuid: 0c4c3010-7700-46f4-aa96-d5e974e32a54 attr handle: 0x003b, end grp handle: 0x0043 uuid: 0c4c3030-7700-46f4-aa96-d5e974e32a54 attr handle: 0x0044, end grp handle: 0xffff uuid: 0c4c3040-7700-46f4-aa96-d5e974e32a54 [AA:BB:CC:DD:EE:FF][LE]> exit $
WxBeacon2 をブロードキャストモードにする
設定はスマホアプリ BLE Scanner で行う。
詳細は 参考サイト のプログラム2(ブロードキャストモード) の項目を参照。
データ取得プログラム
計測データを取得する Python ソースコードを DL する。
Github のソースコードを使用する。
$ cd ~ $ mkdir WxBeacon2 $ cd WxBeacon2 wget https://raw.githubusercontent.com/AmbientDataInc/EnvSensorBleGw/master/src/gw_RPi/env2ambientBS.py
ソースコードの修正
Ambient で 新規チャネル を作成しておく。
チャネルID と ライトキー を使う。
$ vi env2ambientBS.py (17行目) channelID = 100 ↓ channelID = xxxxx (18行目) writeKey = 'writeKey' ↓ writeKey = 'xxxxxxxxxxxxxxxx' (52行目) if companyID == 'ffff': ↓ if devs[target]['companyID'] == 'ffff':
プログラムの起動
ヘルプを表示する。
$ sudo python3 env2ambientBS.py -h usage: env2ambientBS.py [-h] [-d] [-o] [-b] [-bb] optional arguments: -h, --help show this help message and exit -d debug msg on -o device is omron env sensor -b device is BBC micro:bit -bb device is BBC micro:bit + BME280
今回は WxBeacon2(オムロン環境センサ)を使用するので -o オプションを付ける。
ret = 200 は ambient からの書き込み成功を意味する。
$ sudo python3 env2ambientBS.py -o omron 23.62 47.29 0 0.02 1011.0 33.18 2.97 sent to Ambient (ret = 200) BTLE Exception while scannning. 23.59 47.29 0 0.01 1011.0 32.77 2.97 sent to Ambient (ret = 200) 23.54 47.33 0 0.02 1011.0 32.77 2.97 sent to Ambient (ret = 200) 23.5 47.36 0 0.02 1011.0 33.57 2.97 sent to Ambient (ret = 200)
バックグラウンドで動作させる。
ログは一切出力しない。
参考サイト
$ sudo nohup python3 env2ambientBS.py -o > /dev/null 2>&1 &
自動起動
$ cd /usr/local/bin/ $ sudo touch WxBeacon2_autostart.sh $ sudo vi WxBeacon2_autostart.sh #!/bin/sh /usr/bin/sudo /usr/bin/nohup /home/pi/.pyenv/shims/python3 env2ambientBS.py -o > /dev/null 2>&1 & $ chmod a+x WxBeacon2_autostart.sh
スクリプトを rc.local に登録する。
$ sudo vi /etc/rc.local exit 0 の手前に以下の行を追加 WxBeacon2_autostart.sh
出力ログ
上記実行時のログについて。
env2ambientBS.py の 58 行目 MSG より。
MSG(temp / 100, humid / 100, light, uv / 100, press / 10, noise / 100, (batt + 100) / 100) 23.62 47.29 0 0.02 1011.0 33.18 2.97
温度 | 相対湿度 | 環境光 | UV指数 | 気圧 | 騒音 | バッテリ電圧 |
---|---|---|---|---|---|---|
degC | %RH | lux | hPa | dB | V | |
23.62 | 47.29 | 0 | 0.02 | 1011.0 | 33.18 | 2.97 |
ambient への書き出し
env2ambientBS.py の 59 行目 sendWithRetry より。
以下の順序で ambient へ送っている。
sendWithRetry({'d1': temp / 100, 'd2': humid / 100, 'd3': press / 10, 'd4': (batt + 100) / 100, 'd5': light, 'd6': noise / 100})
温度 | 相対湿度 | 気圧 | バッテリ電圧 | 環境光 | 騒音 |
---|---|---|---|---|---|
d1 | d2 | d3 | d4 | d5 | d6 |
ambient のグラフ編集
上記 d1 ~ d6 のデータ項目を元に、見やすいようにグラフを編集する。
UI が優れているので慣れれば任意にデザイン可能。
ファイルリスト生成マクロ(エクセル)
概要
選択したフォルダ以下のファイル、フォルダ全てをカレントシートに記載するエクセルマクロ。
' ' このマクロを使用する時は、メニューから ツール(T)→ 参照設定(T)... を選び ' Microsoft Scripting Runtime を有効にすること ' ' 変数宣言を強制 Option Explicit ' フルパス中で選択フォルダ名が何文字目か Dim myCurrentFolderSeparatePoint As Long ' ' ファイルリスト生成マクロ ' Date 17th Apr., 2019 ' Programmed by Takeshi Sasaki ' ' ' 関数呼び出し ' Sub myCall() ' 選択フォルダのフルパス Dim Path As String ' 画面更新の停止(マクロ高速化) Application.ScreenUpdating = False ' フォルダ選択ダイアログ With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then ' フォルダ選択 → OK押下(True) Path = .SelectedItems(1) Else ' Cancel押下(False) Exit Sub End If End With ' ファイルリスト生成準備関数を呼び出し Call setFileList(Path) End Sub ' ' ファイルリスト生成準備関数 ' Sub setFileList(searchPath) ' 変数宣言 Dim startCell As Range Dim maxRow As Long Dim maxCol As Long ' searchPath の中から選択フォルダ名の直前の \ は何文字目か ' Ex. C:\hoge\fuga\foo ← 選択フォルダ foo のフルパス(searchPath) ' 123456789+123456 ← bar 直前の \ は 13文字目 myCurrentFolderSeparatePoint = InStrRev(searchPath, "\") ' カレントシート上でリストのスタート位置を指定する Set startCell = Cells(2, 2) startCell.Select ' カレントシート上の文字を全て消す maxRow = startCell.SpecialCells(xlLastCell).Row ' 最終行 maxCol = startCell.SpecialCells(xlLastCell).Column ' 最終列 With Range(startCell, Cells(maxRow, maxCol)) .ClearContents ' セル内容をクリア .Interior.ColorIndex = 0 ' 背景色を透明 End With ' ファイルリスト生成関数を呼び出し Call getFileList(searchPath) ' リスト書き出し後にセルをスタート位置に戻す startCell.Select End Sub ' ' ファイルリスト生成関数 ' Sub getFileList(searchPath) ' 引数 searchPath には選択フォルダのフルパスを代入 ' File System Object を宣言 Dim FSO As New FileSystemObject Dim objFiles As File Dim objFolders As Folder ' パスの文字列操作用テンポラリ Dim pathTemp As String ' パス中のセパレータ \ の数 Dim separaterNum As Long ' 書き出しセルの横位置(Col)増分 Dim incCol As Long ' サブフォルダがある時は自分自身を再帰呼出し For Each objFolders In FSO.GetFolder(searchPath).SubFolders Call getFileList(objFolders.Path) Next ' searchPath 内のファイル一覧を検索 For Each objFiles In FSO.GetFolder(searchPath).Files ' objFiles → フルパス(文字列) ' 選択フォルダ以下のパス(文字列) ' ※forループ処理のため末尾に \ を意図的に追加している pathTemp = Right(objFiles, Len(objFiles) - myCurrentFolderSeparatePoint) & "\" ' pathTemp 中の \ の数 separaterNum = Len(pathTemp) - Len(Replace(pathTemp, "\", "")) - 1 ' フォルダ名、ファイル名を分割しながらセルに記入する For incCol = 0 To separaterNum ' pathTemp の左側から \ ごとに文字列を区切ってセルに記入 ActiveCell.Offset(0, incCol).Value = Left(pathTemp, InStr(pathTemp, "\") - 1) ' ディレクトリ名のセルに着色する(ファイル名は無色) If incCol > 0 Then ActiveCell.Offset(0, incCol - 1).Interior.ColorIndex = 33 + incCol End If ' pathTemp の左端から \ までを削除して pathTemp に代入 pathTemp = Right(pathTemp, Len(pathTemp) - InStr(pathTemp, "\")) Next incCol '次行のセルへ移動 ActiveCell.Offset(1, 0).Select Next End Sub ' ' EOF '
Raspberry pi に tiarra を導入する
tiarra の導入
Raspberry pi サーバに irc proxy の tiarra を導入する。
tiarra をダウンロード・展開
$ wget http://www.clovery.jp/tiarra/archive/2010/02/tiarra-20100212.tar.gz $ tar xvzf tiarra-20100212.tar.gz $ mv tiarra-20100212 tiarra.d $ cd tiarra.d
設定ファイルをコピー
$ cp -pv sample.conf tiarra.conf
tiarra.conf を編集
$ vi tiarra.conf
general ブロック
言及の無いものはデフォルト値のまま。
general { conf-encoding: jis nick: sillywalk7 user: sillywalk7 name: sillywalk7 tiarra-port: 6667 tiarra-password: XXXXXXXXXXXXX server-in-encoding: jis server-out-encoding: jis client-in-encoding: jis client-out-encoding: jis stdout-encoding: jis
networks ブロック
言及の無いものはデフォルト値のまま。
networks { name: ircnet #name: 2ch #name: freenode #name: ustream }
各ネットワークの設定
上記 networks ブロックで定義した ricnet のみを定義する。
server はひとつだけ定義し、残りは全てコメントアウトする。
freenode など他のネットワーク設定がある場合は ircnet に準じて定義すること。
日本国内の irc サーバ情報は 情報提供サイト を参照のこと。
ircnet { server: 125.6.255.10 6660 6661 6662 6663 6664 6665 6666 6668 6669 in-encoding: jis out-encoding: jis }
tiarra パスワード生成
tiarra ログイン用のパスワードを生成する。
$ ./tiarra --make-password ... Please enter raw password: ******** ←任意のパスワード XXXXXXXXXXXXX is your encoded password. Use this for the general/tiarra-password entry.
生成された XXXXXXXXXXXXX を general ブロックの tiarra-password: に貼り付ける。
チャンネル自動 join
IRC クライアントから tiarra サーバ接続時に自動 join したいチャンネルを指定する。
カンマ区切りで複数指定可。
+ Channel::Join::Connect { channel: #hoge,#fuga,#foo,#bar }
チャンネル名が日本語の場合
まず nkf を導入する。
$ sudo apt-get install nkf
tiarra.conf を Shift-jis 形式に変換する。
(念の為 tiarra.conf を tiarra.conf.orig にバックアップしておく。)
$ cp -pv tiarra.conf tiarra.conf.orig $ nkf -s --overwrite tiarra.conf
vim で文字コードを指定して編集する
参考サイト
Shift-jisで保存すると Raspberry Pi の vim 編集では文字化けするため tiarra.conf を開いた時は以下のコマンドを実行する。
:edit ++encoding=sjis または :e ++enc=sjis
Shift-jis でファイルを保存
:set fileencoding=sjis または :se fenc=sjis
:set enc?
ファイルのエンコード
:se fenc?
自動起動
$ cd /etc/systemd/system/ $ sudo touch tiarra.service $ sudo vi tiarra.service [Unit] Description=do something [Service] ExecStart=/usr/bin/perl /home/pi/tiarra.d/tiarra --config=/home/pi/tiarra.d/tiarra.conf [Install] WantedBy=multi-user.target $ sudo systemctl enable tiarra.service Created symlink /etc/systemd/system/multi-user.target.wants/tiarra.service → /etc/systemd/system/tiarra.service.
起動テスト
tiarra.service は再起動した際に有効となる。
再起動しないでテストしたい場合は以下のコマンドを使用する。
$ sudo systemctl start tiarra.service
自動応答 BOT を設定する
特定ワードに反応してランダム応答する設定をする。
自動応答テキストを用意する
例えば「おみくじ」を作るのであれば以下のようなテキストを用意する。
文字コードは utf-8 とする。
$ cd /home/pi/tiarra.d/ $ touch hogehoge.txt $ vi hogehoge.txt 大吉 中吉 小吉 吉 末吉 凶 大凶
Auto::Random モジュール
tiarra.conf を編集する時は文字コードは utf-8 にする。
各種モジュールの設定は 公式サイト を参照のこと。
$ nkf -w --overwrite tiarra.conf $ vi tiarra.conf
tiarra.conf に Auto::Random モジュールを追加する。
+ Auto::Random { blocks: hogehoge hogehoge { file: /home/pi/tiarra.d/hogehoge.txt file-encoding: utf-8 request: ほげほげ count-query: ほげほげいくつ count-format: ほげほげは#(count)件登録されています。 format: #(message) mask: * *!*@* added-format: #(name|nick.now)さんは ほげほげ に #(message) を追加しました。 removed-format: #(name|nick.now)さんは ほげほげ から #(message) を削除しまし た。 rate: 100 add: ほげほげ追加 remove: ほげほげ削除 modifier: * *@* plum: modifier: * *@* } }
文字コードを shift-jis に戻す
$ nkf -s --overwrite tiarra.conf $ vi tiarra.conf
Auto::Random モジュールを修正
初期状態では Auto::Random にエラーが生じるので LinedDB.pm の 18 行目を次のとおり修正する。
$ cd /home/pi/tiarra.d/module/Tools/ $ vi LinedDB.pm foreach my $key qw(Parse Build Compare Update Hash) { ↓ foreach my $key (qw(Parse Build Compare Update Hash)) {
設定ファイルを再読込
Volumio2 @ Raspberry Pi Zero WH
用意するもの
- Raspberry Pi Zero WH x 1
- pHAT DAC x 1
- micro SD カード 16GB x 1 (容量は任意で)
SD カードフォーマット
- SDメモリカードフォーマッターをダウンロードする
- フォーマットする
Volumio 2 のインストール
最新バージョンの Volumio-2.526 は Raspberry Pi Zero 上で音が再生しない不具合あり。よって1つ前のバージョンを使用する。(2019/01/14現在)
- 予め Raspberry Pi Zero と pHAT DAC を組み立てておく
- HDMI ディスプレイ、 USB キーボード、スピーカーを接続する
- volumio-2.513 をダウンロードする
- Win32 Disk Imager を使って Volumio 2 のイメージを SD カードへ書き込む
- Raspberry Pi Zero 本体へ SD カードを挿入して電源オン
- 自動的に Volumio 2 のイメージ展開が実行される
Volumio 2 のセットアップ
設定には有線 LAN を使用せず全て無線 LAN で済ませる。
最初の無線 LAN 接続
- スマホから SSID が Volumio の無線LANに接続する
接続パスワード: volumio2 - 自動的にブラウザが起動し言語選択メニューが開くので English を選ぶ → Next
- デバイス名 Volumio のまま → Next
- I have an I2S DAC → YES
Select your i2s DAC → pHAT DAC → Next - 自宅の無線 LAN の SSID を選択 → パスワード入力 → Next
- USB ドライブなどがあれば適宜追加 → Next
- Conguratulations → Done
- Restart(再起動する)
固定 IP 設定
- 自宅の無線 LAN ネットワークに繋がったスマホ (PC) から http://volumio.local/ へアクセスする
- 初期画面が表示されたら、画面右下の 歯車アイコン をクリック
- Network を選択
- Wireless Network の項目へ移動
- Automatic IP は On → Off へ変更する
- 固定 IP アドレス、ネットマスク、デフォルトゲートウェイを入力 → Save → Continue
- Hotspot Settings の項目へ移動し Enable Hotspot を On → Off へ変更 → Save
- 歯車アイコン → SHUTDOWN → Restart で再起動する
キーボード操作
キーボードから Volumio 2 にログインする
ログインID: volumio / パスワード: volumio
- apt-get する
# sudo apt-get update # sudo apt-get upgrade
- raspi-config をインストールする
# sudo apt-get install raspi-config ... *** dhcpd.conf (Y/I/N/O/D/Z) [default=N] ? (そのままエンター)
- キーボード設定をインストールする
日本語キーボードの設定をするがここではうまくいかない。
# sudo apt-get install keyboard-configuration Keyboard layout: → Other を選択 Country of origin for the kayboard: → Japanese を選択 Keyboard layout: → Japanese を選択
- vim エディタをインストールする
# sudo apt-get install vim
- 再起動
# sudo reboot
raspi-config 設定
- raspi-config を起動する
# sudo raspi-config
- 4 Localization Options
- I1 Change Locale
- I2 Change Timezone
- Geographic area: Asia
- Time zone: Tokyo
- I3 Change Keyboard Layout
- Keyboard model: Generic 105-key (Intl) PC
- Keyboard layout: Japanese
- Key to function as AltGr: The default for the keyboard layout
- Compose key: No compose key
- I4 Change Wi-Fi Country
- Select the country in which the Pi is to be used: JP Japan
5 Interfacing Options
念のため再起動して完了
# sudo reboot
Raspberry Pi zero wh のセットアップ
SD カードのフォーマット
- 新しい SD カードを用意する
- ここ から SD カードメモリフォーマッターをダウンロードする
- SD カードをフォーマットする
OS のセットアップ
- Download NOOBS for Raspberry Pi から NOOBS Lite をダウンロードする
- zip ファイルを展開して SD カードにコピーする
- Raspberry Pi zero wh に SD カードを挿入して電源オン
- 画面の指示に従い Raspbian Lite をインストールする
apt-get の実行
$ sudo apt-get update $ sudo apt-get upgrade
キーボードレイアウト変更
sudo vi /etc/default/keyboard XKBMODEL="jp106" XKBLAYOUT="jp" XKBVARIANT="OADG109A" XKBOPTIONS="" BACKSPACE="guess"
time zone の変更
- sudo raspi-config を実行
- 4 Localisation Options を選択
- I2 Change Timezone を選択
- Asia を選択
- Tokyo を選択
- Finish を選択
git のインストール
$ sudo apt-get install git
ReSpeaker 2-Mics HAT のセットアップ
- Raspberry Pi zero wh の電源オフ
- ReSpeaker 2-Mics HAT を装着する
- Raspberry Pi zero wh を電源オン
ドライバのセットアップ
$ pwd /home/pi $ sudo git clone https://github.com/respeaker/seeed-voicecard $ cd seeed-voicecard $ sudo ./install.sh $ reboot
デバイスを確認
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA] Subdevices: 7/7 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: seeed2micvoicec [seeed-2mic-voicecard], device 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0
ALSA コントロール設定
$ sudo alsactl --file=asound.state restore alsactl: load_state:1683: Cannot open asound.state for reading: No such file or directory Found hardware: "bcm2835_alsa" "Broadcom Mixer" "" "" "" Hardware is initialized using a generic method Found haedware: "seeed-2mic-voic" "" "" "" "" Hardware is initialized using a generic method
$ sudo alsactl --file=asound.state store $ pwd /home/pi $ ls asound.state seeed-voicecard
入出力テスト
- スピーカーテスト テスト音声が再生される。
$ speaker-test -t wav speaker-test 1.1.3 Playback device is default Stream parameters are 48000Hz, S16_LE, 1 channels WAV file(s) Rate set to 48000Hz (requested 48000Hz) Buffer size range from 12000 to 18000 Period size range from 6000 to 6000 Using max buffer size 18000 Periods = 4 was set period_size = 6000 was set buffer_size = 18000 0 - Front Left Time per period = 1.234349
- マイク録音テスト areord で out.raw に録音データを保存し aplay で再生する。
$ arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw Recording raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono $ aplay --format=S16_LE --rate=16000 out.raw Playing raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
- マイク入力テスト マイクから拾った音声がただちにスピーカーから聞こえる。
arecord -f cd -Dhw:1 | aplay -Dhw:1
Amazon alexa のセットアップ
Amazon Developer アカウント
- ここ を参考に Amazon Developer アカウントを登録する
製品登録
- Amazon 開発者コンソールへアクセスし ALEXA VOICE SERVICE のタブをクリックする
- ここ を参考にセキュリティプロファイルを作成する
- 登録例
- 製品名:hogefuga
- 製品ID:hogefuga
- 製品タイプ:Alexa内蔵の端末
- コンパニオンアプリの使用:はい
- 商品カテゴリ:その他(スマートスピーカー)
- 製品概要:alexa voice service on raspberry pi zero
- エンドユーザーは、商品とどうやり取りするか?:「タッチで開始される」「ハンズフリー」にチェックを入れる
- この製品を商品として配信する予定ですか?:いいえ
- これは子供向け商品、それ以外は13歳以下の子供向けですか?:いいえ
- LWA セキュリティプロファイル
- セキュリティプロファイル(プロフィールを新規作成する)
- セキュリティプロファイル名:Alexa Voice Service on Raspberry Pi Zero W
- セキュリティプロファイル記述:Alexa Voice Service on Raspberry Pi Zero W
- 各種IDの作成
- セキュリティプロファイルID:amzn1.application.xxxxx...
- クライアントID:amzn1.application-oa2-client.xxxxx...
- クライアントのシークレット:xxxxx...
- これらの書面に合意しますにチェックを入れ、[完了する] をクリック
- 商品が作成されました。[OK]をクリックする
- ALEXA VOICE SERVICE タブをクリックし、製品一覧を表示する
- 登録した製品名をクリックする
- 商品の詳細 → セキュリティプロファイル へ移動
- 許可された出荷地:
- http://localhost:3000 [追加]ボタンを押す
- https://localhost:3000 [追加]ボタンを押す
- 許可された返品 URL:
- http://localhost:3000/authresponse [追加]ボタンを押す
- https://localhost:3000/authresponse [追加]ボタンを押す
- [更新] ボタンを押す
クイックセットアップ
参考サイト を元に作業を進める。 - フォルダ作成
$ cd /home/pi/ $ mkdir sdk-folder $ cd sdk-folder $ mkdir sdk-build sdk-source third-party application-necessities $ cd application-necessities $ mkdir sound-files
$ sudo apt-get update $ sudo apt-get -y install git gcc cmake build-essential libsqlite3-dev libcurl4-openssl-dev libfaad-dev libsoup2.4-dev libgcrypt20-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-good libasound2-dev doxygen
- PortAudio 設定
$ cd /home/pi/sdk-folder/third-party && wget -c http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz && tar zxf pa_stable_v190600_20161030.tgz && cd portaudio && ./configure --without-jack && make
- commentjson のインストール
$ sudo apt-get install python-pip $ pip install commentjson Collecting commentjson Installing collected packages: commentjson Successfully installed commentjson-0.7.1
サウンドファイルのダウンロード
- (タイマーとアラーム音をアマゾンのサイトからダウンロード)
$ cd /home/pi/sdk-folder/application-necessities/sound-files/ $ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_02._TTH_.mp3 $ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_02_short._TTH_.wav $ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_01._TTH_.mp3 $ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_01_short._TTH_.wav
AVS デバイス SDK とウェイクワードエンジンのクローン
$ cd /home/pi/sdk-folder/sdk-source $ git clone git://github.com/alexa/avs-device-sdk.git
- 次に third-party ディレクトリにウェイクワードエンジンをクローンする
$ cd /home/pi/sdk-folder/third-party $ git clone git://github.com/Sensory/alexa-rpi.git (ライセンス認証) $ cd ./alexa-rpi/bin/ && ./license.sh
- SDK のビルド
$ cd /home/pi/sdk-folder/sdk-build && cmake /home/pi/sdk-folder/sdk-source/avs-device-sdk -DSENSORY_KEY_WORD_DETECTOR=ON -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=/home/pi/sdk-folder/third-party/alexa-rpi/lib/libsnsr.a -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=/home/pi/sdk-folder/third-party/alexa-rpi/include -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON -DPORTAUDIO_LIB_PATH=/home/pi/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a -DPORTAUDIO_INCLUDE_DIR=/home/pi/sdk-folder/third-party/portaudio/include $ pwd /home/pi/sdk-folder/sdk-build $ sudo make SampleApp -j2
- 設定ファイルの編集
$ vi ~/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json "deviceInfo":{ // Unique device serial number. e.g. 123456 "deviceSerialNumber":"123456", // The Client ID of the Product from developer.amazon.com "clientId":"amzn1.application-oa2-client.xxxxx...", // Product ID from developer.amazon.com "productId":"(製品ID)" },
- ファイルパスを以下のとおり指定する
(ロケールも ja-JP にする)
$ vi ~/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json "cblAuthDelegate":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/cblAuthDelegate.db" }, "miscDatabase":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/miscDatabase.db" }, "alertsCapabilityAgent":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/alerts.db", "alarmSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_01._TTH_.mp3", "alarmShortSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_01_short._TTH_.wav", "timerSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_02._TTH_.mp3", "timerShortSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_02_short._TTH_.wav" }, "settings":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/settings.db", "defaultAVSClientSettings":{ "locale":"ja-JP" } }, "bluetooth" : { "databaseFilePath":"/home/pi/sdk-folder/application-necessities/bluetooth.db" }, "certifiedSender":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/certifiedsender.db" }, "notifications":{ "databaseFilePath":"/home/pi/sdk-folder/application-necessities/notifications.db" },
マイクテスト
- 次のドットファイルを記述
$ vi ~/.asoundrc pcm.!default { type asym playback.pcm { type plug slave.pcm "hw:1,0" } capture.pcm { type plug slave.pcm "hw:1,0" } }
- SoX のインストール
$ sudo apt-get install sox -y
- マイク録音テスト
(Ctrl + Cで中止)
$ rec test.wav $ play test.wav
サウンドデバイスの無効化
$ cd /etc/modprobe.d/ $ sudo vi alsa-blacklist.conf blacklist snd_bcm2835 $ sudo amixer cset numid=3 1 numid=3,iface=MIXER,name='PCM Playback Route' ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0 ; values=1
- dirmngr の導入
$ sudo apt-get install dirmngr
認証
- SampleApp スクリプトで認証させる
$ cd ~/sdk-folder/sdk-build/ $ pwd /home/pi/sdk-folder/sdk-build $ ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json /home/pi/sdk-folder/third-party/alexa-rpi/models
参考サイト
- Build Your Own Amazon Echo Using a RPI and ReSpeaker HAT - Hackster.io
Raspberry Pi Quick Start Guide · alexa/avs-device-sdk Wiki · GitHub
- Raspberry PiでAlexaを動かそう! - slideship.com
- ラズパイでスマートスピーカーを自作(stretch)
- Raspberry Pi 3 Model BとReSpeaker 2-Mics Pi HATでGoogle Assistant SDKを活用する
- Dependencies · alexa/avs-device-sdk Wiki · GitHub
- ラズパイで自作Amazon Echo | yagitsawa's Tech Blog
- 上野家のホームページ - PC/RaspberryPi/スマートスピーカー/alexaAVS Device SDKを動かしてみる - 資料室
- audio output on Pi Zero W with seeedcard mic2 · Issue #1057 · alexa/alexa-avs-sample-app · GitHub
購入先
DSO5072P 200MHz化
作業手順
- Firmware をバックアップする
- 裏蓋を開け半田ゴテでUSB-シリアル接続をする
- PC と DSO5072P を USB 接続し root ログインする
- root ユーザでファイル書き換えなどをする
- 基板上の特定コンデンサ 2 個を除去する
- 完了
Firmware バックアップ
- Backup tool for DSO5000P models からバックアップツール Tools_P_models.zip をダウンロードする
- 圧縮ファイルを解凍し Backup_P_models フォルダの dso5kp_backuptool.up を空の USB メモリへコピーする
- DSO5072P の電源を投入し 本体正面に USB メモリを挿す
- 本体右上の UTILITY を押す
- Firmware Update の F2 ボタンを押す
- F5 ボタンを押してバックアップ開始
- バックアップが完了すると自動的に再起動する
- USB メモリには dump フォルダが作成され 4 つのファイルが保存されている
- boot.bin
- kernel.bin
- logo.bin
- root.bin
シリアル接続
DSO5072P にはシリアルポートがあり、パソコンと USB - シリアル接続すると root でログインできる。
- 本体裏面のネジを緩めて裏蓋を開ける
- USB コネクタの左隣に J801 とシルク印刷された 4 ピンコネクタのパターンがある
- ピン配置は左端から Vcc / GND / Tx / Rx である
- Vcc を除く 3 つのピンにケーブルをハンダ付けして USB シリアルと下表のとおり接続する
- なお USB シリアルの電圧は 3.3V に設定のこと
DSO5072P側 | Vcc | GND | Tx | Rx |
---|---|---|---|---|
ケーブル | 接続しない | ストレート接続 | クロス接続 | クロス接続 |
USB シリアル側 | 接続しない | GND | Rx | Tx |
- PC と USB シリアルを接続し Tera Term を起動する
- Tera Term はシリアルポート接続とする
- Port: USB シリアルの COM ポートを指定
- Baud rate: 115200
- Data: 8 bit
- Parity: none
- Stop: 1 bit
- Flow control: none
- Transmit delay
- 0 msec/char
- 0 msec/line
- DSO5072P 本体の電源を入れる
- [ root@Hantek ~]# のシェルが表示されれば成功
ファイル名を書き換え
[ root@Hantek ~]# ls OurLanguages fpgabank.conf logotype~ sys bin help.db misc.bin sys.inf chk_base_volt i2c.log mnt tdc.log config icon model tdc_edge125M cur_acq.type keyprotocol.inf msg tdc_overtime125M dev language.img mult_adc.log tdc_pulse125M disk_sta.info lib param tdc_slope125M dso linuxrc proc tmp dso.exe logo protocol.inf usr dst1062b logotype root var etc logotype.dis sbin version
ルートディレクトリにある dst1062b を dst1202b へ書き換える。
[ root@Hantek ~]# mv dst1062b dst1202b
2 回連続で再起動する
- EEVblogには 2 回連続で再起動せよとの記述があるためそれに従う
- 再起動すると sys.inf および logotype ファイル内の dst***** は自動的に dst1202b に書き換わる
[ root@Hantek ~]# reboot ... [ root@Hantek ~]# reboot
bootlogo の変更
- 書き換えたが切り替わらず bootlogo も表示されなくなった
[ root@Hantek ~]# vi logotype.dis hantek_DSO5072P ↓ hantek_DSO5202B
コンデンサの除去
- 電源オフ
- 基板上の特定コンデンサ 2 個をハンダごてて加熱、除去する
- 電源オン
- 自己校正(self calibration)を実行する
参考サイト
Hantek - Tekway - DSO hack - get 200MHz bw for free - Page 1
Hantek - Tekway - DSO hack - get 200MHz bw for free - Page 90
Hantek Oscilloscope Hack - 5000P series - Open up to 200 MHZ - YouTube