作業日記@HatenaBlog

各種の作業メモ

IchigoJam のシリアル接続

参考サイト
親子でベーシック入門 IchigoJamではじめてのプログラミング p144

IchigoJam のモータ制御

モータドライバ IC の TA7291P を用いてモータの回転方向、回転速度を制御する。

IC 端子概要

ICピン番号 端子記号 IchigoJam モータ 電池 IC端子説明
1 GND GND --- マイナス極 GND
2 OUT1 --- モータ端子 --- 出力端子
3 未使用 --- --- --- ---
4 Vref OUT5 --- --- 制御電源端子
5 IN1 OUT1 --- --- 入力端子
6 IN2 OUT2 --- --- 入力端子
7 Vcc 5V --- --- ロジック側電源端子
8 Vs --- --- プラス極 出力側電源端子
9 未使用 --- --- --- ---
10 OUT2 --- モータ端子 --- 出力端子

結線図

f:id:sillywalk7:20180721002420p:plain

基本プログラム

回転方向:正転
回転速度:100%

OUT 1,1:OUT 2,0
PWM 5,2000

回転方向:逆転
回転速度:50%

OUT 1,0:OUT 2,1
PWM 5,1000

回転方向:停止
回転速度:停止

OUT 1,1:OUT 2,1

回転制御なし

上記結線図から 4 番ピン~OUT5 を外すと、回転速度は常に 100% となる。

ICピン番号 端子記号 IchigoJam モータ 電池 IC端子説明
4 Vref OUT5 --- --- 制御電源端子

参考サイト

Analogic Intelligence: [Intel Edison]Node.JSでモーター制御①

スマートスピーカでTVチャンネル操作

コマンドの改良

スマートスピーカとRaspberry Piを連携する - 作業日記@HatenaBlog では、broadlink-cli コマンドを Node-RED の exec にフルで記入していた。 これを短縮形に改良する。

シェルスクリプトの作成

$ cd /home/pi/python-broadlink/cli
$ vi ircmd.sh
#!/bin/sh
cd /home/pi/python-broadlink/cli
./broadlink_cli --device @ROOM.device --send @$1

$ chmod u+x ircmd.sh

動作確認

以下のコマンドを実行して、電灯がオンオフするか確認。

$ cd /home/pi/python-broadlink/cli
$ ./ircmd.sh LIGHT.on
$ ./ircmd.sh LIGHT.off

Node-RED の exec ノードを編集

コマンド欄は ircmd.sh のフルパスを、引数は LIGHT.on のみ記述する。(電灯オンの場合)
他の exec ノードも同様に修正する。

  • 修正前
    f:id:sillywalk7:20180513225849p:plain
     
  • 修正後
    f:id:sillywalk7:20180515221050p:plain
     

参考サイト

スマートスピーカとRaspberry Piを連携する

概要

  • Amazon Alexaを使って家電操作をする
  • eRemote mini ( RM mini 3 )を使用する
  • Raspberry Pi 3を使用する
  • Node-REDを使用する

Raspberry Piの準備

gitをインストールする

$ sudo apt-get install git

gitからpython-broadlinkをダウンロードする

$ git clone https://github.com/mjg59/python-broadlink.git

pipをインストールする

$ sudo apt-get install python-dev
$ sudo apt-get install python-pip
$ sudo pip install broadlink

RM mini 3の準備

ネットワーク上にあるRM mini 3を探索する
(前提として、スマホアプリでRM mini 3の無線LAN設定まで終わり、家庭内LANにつながっているものとする)

$ cd ~/python-broadlink/cli
$ ./broadlink_discovery
Discovering...
###########################################
RM2
# broadlink_cli --type 0x2737 --host 192.168.ppp.qqq --mac XXXXXXXXXXXX
Device file data (to be used with --device @filename in broadlink_cli) :
0x2737 192.168.xxx.yyy XXXXXXXXXXXX
temperature = 0.0

探索結果を保存する

$ cd ~/python-broadlink/cli
$ vi ROOM.device
0x2737 192.168.xxx.yyy XXXXXXXXXXXX ← 探索結果のうちこの1行を保存

リモコン学習をさせる(照明器具でテスト)

$ cd ~/python-broadlink/cli
$ ./broadlink_cli --device @ROOM.device --learnfile LIGHT.on
(RM mini3に向けてリモコンのONボタンを押す)
$ ./broadlink_cli --device @ROOM.device --learnfile LIGHT.off
(RM mini3に向けてリモコンのOFFボタンを押す)

動作テスト

$ cd ~/python-broadlink/cli
./broadlink_cli --device @ROOM.device --send @LIGHT.on
./broadlink_cli --device @ROOM.device --send @LIGHT.off

node-REDの準備

node-REDのインストール

$ sudo npm install -g --unsafe-perm node-red

node-REDを起動

$ node-red-pi --max-old-space-size=256

2 May 14:28:00 - [info]

Welcome to Node-RED
===================

2 May 14:28:00 - [info] Node-RED version: v0.18.4
2 May 14:28:00 - [info] Node.js  version: v8.11.1
2 May 14:28:00 - [info] Linux 4.14.37-v7+ arm LE
2 May 14:28:02 - [info] Loading palette nodes
2 May 14:28:05 - [info] Settings file  : /home/pi/.node-red/settings.js
2 May 14:28:05 - [info] User directory : /home/pi/.node-red
2 May 14:28:05 - [warn] Projects disabled : set editorTheme.projects.enabled=true to enable
2 May 14:28:05 - [info] Flows file     : /home/pi/.node-red/flows_raspberrypi.json
2 May 14:28:06 - [info] Creating new flow file
2 May 14:28:06 - [info] Starting flows
2 May 14:28:06 - [info] Started flows
2 May 14:28:06 - [info] Server now running at http://127.0.0.1:1880/

アクセステスト

ブラウザを立ち上げて http://192.168.xxx.yyy:1880/ アクセスする
node-REDのページが表示されたら成功

node-REDの停止

ctrl+Cを押下するとストップする

^C2 May 14:28:57 - [info] Stopping flows
2 May 14:28:57 - [info] Stopped flows

自動起動の設定

sudo systemctl enable nodered.service

Node-RED Alexa Home Skill Bridgeのセットアップ

  1. Node-RED Alexa Home Skill Bridgeにアクセスして Register からユーザ登録する
  2. Devices → Add Deviceで新しい機器を登録する
  3. バイス登録
    • Name: と Description: には自分が分かりやすい名前を付ける
      ここで付けた名前は (1)Amazon Alexa アプリのスマートホームバイス、(2)Node-Red の呼び出しで使われる
    • Amazon Echo から呼び出す名前は、後から Amazon Alexa アプリで変更可
    • リビングの照明をオン、オフする → ON: OFF: にチェックを付ける
    • 明るくする、暗くする → +%: -%: にチェックを付ける
    • Application Type → LIGHT: にチェックを付ける
    • 登録例
      f:id:sillywalk7:20180513205720p:plain
  4. 登録完了
    f:id:sillywalk7:20180513210713p:plain

スマートホームスキル(Node-RED)とデバイスを追加する

  1. スマホAmazon Alexa アプリ または https://alexa.amazon.co.jp/ を使う
  2. スキルで「Node-RED」を検索
  3. Node-RED Alexa Home Skill Bridge のログイン画面が表示される
  4. 上記で登録した ID とパスワードでログインする
  5. バイスが検出された
    f:id:sillywalk7:20180513211804j:plain

Node-RED と Alexa を連携させる

  1. ブラウザから http://192.168.xxx.yyy:1880/ へアクセスして Node-RED の画面を表示
  2. 画面右上の f:id:sillywalk7:20180513212528p:plain メニューから、パレットの管理 → パレット → ノードの追加 を選択
  3. 「alexa-home」で検索し「node-red-contrib-alexa-home-skill」が表示されたら「ノードの追加」を選択
    f:id:sillywalk7:20180513213120p:plain
     
  4. 「現在のノード」に Alexa 用パレットが追加された
    f:id:sillywalk7:20180513213414p:plain
     

Node-RED で家電操作のフローを作成する

  1. 上記のパレット追加画面で [閉じる] ボタンを押して、トップ画面へ戻る
  2. 左メニューの一番下に alexa が追加されているのを確認する
    f:id:sillywalk7:20180513214126p:plain
     
  3. 左側の alexa home を右側へドラッグ&ドロップする
    f:id:sillywalk7:20180513214537p:plain
     
  4. 右側の Alexa Home をダブルクリックすると、以下のウィンドウが出る
    f:id:sillywalk7:20180513215151p:plain
     
  5. Account 欄の右端 f:id:sillywalk7:20180513215440p:plain マークをクリック
     
  6. Node-RED Alexa Home Skill Bridge に登録したアカウントを入力する
    f:id:sillywalk7:20180513215745p:plain
     
  7. しばらく待つと Device 欄に「照明」が表示される
    (表示されないときは削除して再作成する)
    f:id:sillywalk7:20180513221340p:plain
     
  8. アイコン名が「Alexa Home」から「照明」に変わるので、その右隣に「switch」を配置する
    f:id:sillywalk7:20180513221900p:plain
     
  9. switch をダブルクリックして編集ウィンドウを表示
    「==」を選択して、「is true」「is false」の2つを作って「完了」する
    f:id:sillywalk7:20180513222603p:plain
     
  10. switch の右隣に、左側メニューの「vその他」から「exec」を2個配置する
    f:id:sillywalk7:20180513223606p:plain
     
  11. exec のうち1つをダブルクリックで開いて以下を入力する
    • コマンド /home/pi/python-broadlink/cli/broadlink_cli
    • 引数 msg.payload のチェックを外す
      --device @/home/pi/python-broadlink/cli/ROOM.device --send @/home/pi/python-broadlink/cli/LIGHT.on
      ※--device と --send の後ろに @ を必ず付けること
    • 名前 LIGHT.on
    • 同じように LIGHT.off も作成する
    • 編集結果
      f:id:sillywalk7:20180513225849p:plain
       
  12. 「is true」側に LIGHT.on を接続する
    f:id:sillywalk7:20180513231059p:plain
     
  13. 「is false」側に LIGHT.off を接続する
    f:id:sillywalk7:20180513231124p:plain
     
  14. 右上の「デプロイ」ボタンを押して保存する
    f:id:sillywalk7:20180513231401p:plain

動作テスト

  • 「アレクサ、照明をつけて」→ LIGHT.on
  • 「アレクサ、照明を消して」→ LIGHT.off

参考サイト

Raspberry Pi 3 model B のセットアップ

OS のダウンロード・インストール

  1. SD カードをフォーマットする
    SDメモリカードフォーマッター 5.0」を使用する。
    SDメモリカードフォーマッター - SD Association
  2. フォーマットソフトを起動
    フォーマットオプション:上書きフォーマット
    [フォーマット]ボタンを押下
  3. NOOBS 版をダウンロードする
    Download NOOBS for Raspberry Pi
    本稿執筆時は 2018-04-18, ver.2.8
  4. ダウンロードした zip ファイルを解凍し、SDカードへコピーする
  5. SDカードをRaspberry Pi 3本体に挿入して起動する
    予めキーボード、マウス、ディスプレイ、電源などは用意しておくこと
  6. 画面下にあるバーで日本語を選択する
  7. Raspbian を選択してインストール開始
  8. インストール完了後、再起動する

環境設定

Wi-Fi情報の設定 SSIDとパスワードからパスフレーズを作成する。 Wi-Fi設定ファイルに追記する。

$ sudo wpa_passphrase "SSID名" xxx...xxx | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

Wi-Fi設定ファイルを編集する

$ cd /etc/wpa_supplicant
$ sudo vi wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
 ssid=”myhome_ssid” ← 接続する予定のWi-FiのSSID
 #psk=”xxx...xxx” ← 元のパスワード。※※※最後に消す※※※
 psk=yyy...yyy ← 暗号化されたパスワード
 key_mgmt=WPA-PSK
 proto=RSN ← WPA2の場合はRSN、WPAの場合はWPA
 pairwise=CCMP
 group=CCMP
 priority=0
}

設定の再読込

$ wpa_cli -i wlan0 recocnfigure

ネットワークアドレスを固定化する

$ sudo vi /etc/network/interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.xxx.yyy ← 割り当てたいIPアドレス
netmask 255.255.255.0
gateway 192.168.xxx.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

SSHサーバの有効化

$ sudo raspi-config

8 Advanced Options → A4 SSH → Enable → 再起動する

SSHが途中で切れないように維持する

$ sudo vi /etc/ssh/sshd_config
ClientAliveInterval 30

トラブルシュート

RFKillで無線LANがロックされたとき

$ rfkill list all
0: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: hci0: Bluetooth
        Soft blocked: no
        Hard blocked: no

$ rfkill unblock wifi

Wi-Fiの接続状況を確認するとき

$ iwconfig wlan0
$ ifconfig wlan0

wlan0のデバイスをオン、オフするとき (ifdown, ifup が使えない)

$ sudo ip link set wlan0 down
$ sudo ip link set wlan0 up

$ sudo ifdown wlan0
ifdown: unknown interface wlan0

参考サイト

Excel ユーザ定義関数による JAN コード生成

JAN コード

集合包装用商品コード(ITFコード)(14桁)を使った場合。参考サイト

関数種類

  • JAN()
    JANコード(14桁)の数値を返す。
    引数:13桁の数値(Double),返り値:14桁の数値(Double)
  • SJAN()
    JANコード(14桁)の文字列を返す。
    引数:13桁の数値(Double),返り値:14桁の文字列(String)
  • JAN_CHKD()
    JANコード(14桁)のチェックデジット(末尾1桁)を返す。
    引数:13桁の数値(Double),返り値:1桁の数値(Integer)

追加方法

  1. エクセルを起動
  2. 空白のブックを作成する
  3. Alt + F11 を押下
  4. メニュー「挿入(I)」→標準モジュール(M)
  5. 下記のソースコードを貼り付け
  6. マクロ有効ブック(.xlsm)で保存する

ソースコード

'先頭宣言
Option Explicit

'
'JANコード生成(文字列型)
'2018-04-23
'
'ITFコードに基づくJANコード(14桁)を生成する
'13桁の入力値から末尾にチェックデジット1桁を付加して14桁の文字列を返す
'
'1)入力値が13桁数値か判定する → それ以外はエラー終了
'2)入力値を桁分解して配列変数「桁分解(n)」へ格納
'   一位→桁分解(2)
'  十位→桁分解(3)
'   百位→桁分解(4)
'   …
'  一兆位→桁分解(14)
'3)偶数桁 桁分解(n) n=14,12,10,8,6,4,2 を合計して3倍する
'4)奇数桁 桁分解(m) m=13,11, 9,7,5,3   を合計する
'5)上記3)と4)を合計する
'6)上記5)の下1桁の数字を10から引く → 桁分解(1)に格納する(チェックデジット)
'  ※下1桁がゼロで 10 - 0 = 0 のときは、桁分解(1)にゼロを格納する
'
Function SJAN(入力値 As Double) As String

    '変数定義
    Dim 文字列化 As String
    Dim 桁分解(14) As Integer
    Dim i As Integer
    Dim 偶数桁 As Integer
    Dim 奇数桁 As Integer
    
    '再計算の有効化
    Application.Volatile
    
    '入力値は13桁を超過しているか
    '超過した場合は #NUM! を返す
    If Len(CStr(入力値)) > 13 Then
        SJAN = CVErr(xlErrNum)
        Exit Function
    End If
    
    '入力値を13桁に揃える
    '文字列に変換する
    文字列化 = Right("0000000000000" & CStr(入力値), 13)
        
    '配列変数「桁分解(n)」に格納する
    '
    For i = 14 To 2 Step -1
        桁分解(i) = Val(Mid(文字列化, 15 - i, 1))
    Next i

    '偶数桁を合計して3倍する
    'Σ桁分解(n)  n=14,12,10,8,6,4,2
    For i = 2 To 14 Step 2
        偶数桁 = 偶数桁 + 桁分解(i)
    Next i
    '
    偶数桁 = 偶数桁 * 3

    '奇数桁を合計する
    'Σ桁分解(n)  n=13,11,9,7,5,3
    For i = 3 To 13 Step 2
        奇数桁 = 奇数桁 + 桁分解(i)
    Next i
    
    '桁分解(1)にチェックデジットを保存する
    '
    桁分解(1) = 10 - Val(Right(CStr(偶数桁 + 奇数桁), 1))
    If 桁分解(1) = 10 Then 桁分解(1) = 0
    
    'JANコードを返す
    '
    For i = 14 To 1 Step -1
        SJAN = SJAN & CStr(桁分解(i))
    Next i

End Function


'
'JANコード生成(数値型)
'2018-04-23
'
'ユーザ定義関数JANSへ入力値を渡し、返り値(文字列)を数値へ変換する
'
Function JAN(入力値 As Double) As Double

    JAN = Val(SJAN(入力値))

End Function


'
'JANコード チェックデジット生成
'2018-04-23
'
'ユーザ定義関数JANSへ入力値を渡し、返り値(文字列)の下1桁を抽出して数値化する
'
Function JAN_CHKD(入力値 As Double) As Integer

    JAN_CHKD = Val(Right(JAN(入力値), 1))

End Function

OpenVPNを利用したPIA

PIA純正アプリ

インストール時にエラー発生

WARNING: By default, this session does not use any encryption whatsoever. Please do not use it to send sensitive data unless you are sure your connection is secure (by using an encryption plugin, for instance).
  1. PIA managerが非英語環境でインストールできない(ruby周りで異常)
    https://www.privateinternetaccess.com/forum/discussion/27085/ruby-exe-problem
  2. PIA公式サイトを確認するとOpenVPNを使うよう指示あり
    https://www.privateinternetaccess.com/pages/client-support/windows-openvpn
  3. 新たにOpenVPN GUIをDL、インストールした
    Installer (64-bit), Windows Vista and later
    https://swupdate.openvpn.org/community/releases/openvpn-install-2.3.18-I602-x86_64.exe
  4. PIA接続用のOpenVPN設定ファイルをDL、展開した(上記2.の公式サイト指示)
    https://www.privateinternetaccess.com/openvpn/openvpn.zip
  5. サクラエディタGrep置換を使って *.ovpn ファイル中のauth-user-pass の行を
    auth-user-pass auth.txt へ一括置換した
    https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=857
    http://proengineer.internous.co.jp/content/columnfeature/5438
  6. さらに *.ovpn ファイルの最下行に auth-nocache を追加した
    (置換前) disable-occ
    (置換後) disable-occ\nauth-nocache
    Grep置換は正規表現で実行すること(改行コードは LF )
  7. PIA接続用のユーザ名、パスワードを記述した auth.txt ファイルを作成した
  8. OpenVPNの設定フォルダに auth.txt をコピーした
    コピー先 C:\Program Files\OpenVPN\config\
  9. OpenVPNの設定フォルダに *.ovpn ほか全ファイルをコピーした
    コピー先 C:\Program Files\OpenVPN\config\
  10. 完了