アレクサとスマホで赤外線リモコンを作る。2020.3.20 更新

2020.3.21 大学のネットワークで同じことをしたが、デバイスを検出できない。 セキュリティの関係で、Wifiルーターが SSDP/UPnP を無効にしている? (大学のネットワークではうまくいかない。自宅では正常に動作) 原因は、Wifi ルータの dhcp が、10.*.*.* network で、かつ固定IPの 172.*.*.* network (rapberry pi) と同じでないから。10.*.*.* の固定IPに変更予定(Covidの関係で対応が遅れている。)

2020.3.13 ver 3.00 alexa-local を node-red-contrib-amazon-echo に変更。メモリー使用量を減らし、現在は正常に動作(自宅のネットワーク)。 

2019.6.12 ver 2.00 kernel を新しくすると動かなくなった問題の対策を追加。

2019.5.4 ver 1.01 by R. Saito

このページは、赤外線(波長940nm)リモコンを

(1)アマゾンエコードット(音声)と

(2)Webページで操作する設定方法の記録です。

すでにWeb 上にいっぱいある情報を収集しただけです。多くの情報が すでになくなっているものもあります。

しかし、情報が正確でないものが多く、また、多くの人にとっておすすめの 方法ではありません。

ですが、動作はしていますので、まとめたものが必要だと思いました。

すべてを実行するのに、2ヶ月ぐらいかかりました。またお金も1万円以上かかります。

大変でしたが、勉強になりました。もっとスマートにできればいいですね。

2020.3.20 までの現状のまとめ。

echo dot + node red または Web page から LED シーリングON・OFF動作している。

使用しているのは raspberry pi zero wh + amzon echo dot + 自作赤外線発生ボード(送信のみ)+ 市販赤外ボード(試験、受信)

2020.3.20 現在動作しているが、困難であった点のまとめ(詳細は下記に記述)

市販赤外ボードは赤外線の強度が弱い → 自作ボードによって8畳のどこにあってもOK

lircd (irsend) が現状の raspberry OS で使えない。 → 古いOSに戻すことで使えた。

https://raspibb2.blogspot.com/2019/06/kernel-419raspbian-stretchbusterlirc.html (新しいOSでもlircd を再構築すると動くらしい。まだ試していない 2020.3.22)

node-red で uk のサーバーだと遅い → node-red-contrib-amazon-echo でlocal net で OK echo-dot の node-red のスキルは不使用。

node-red-contrib-amazon-echoでデバイスが認識できない → node-red 配線前にデバイスをecho dot で認識させる。デバイス名をローマ字にしないと文字化けする。echo dot の名前は日本語に変更できる。

node-red-contrib-amazon-echo と apache2 が port 80 を競合 → apache2 のポートを8080に変更。node-red-contrib-amazon-echo では 80->8111 ポートにiptable で変換して使用。

一部のリモコンの信号が認識できない → mode2 コマンドを利用

raspberry pi zero が、数日利用で固まってしまう。→ GUIを使わない、Swapを使わない。その他の不要なservice を停止。現在は 80MB のメモリー使用で安定。

これ以外の対応は多く紹介されているけど、上の条件を同時に満たすのは難しい。

下記は時系列の対応です。

2020. 3. 17 alexa-local が使えなくなっていた(echo dot の仕様変更が原因)ので、node-red-contrib-amazon-echo に変更した。raspberry pi 使用メモリー節約。3.18 動作した。

2019.6.11 1ヶ月以上安定して動いていたのが突然動かなくなりました。sudo apt upgrade が原因 kernel を動作していた古いバージョン4.14.98にして復活。

2019.4.30 正しく動作しています。忘れないうちに、記録します。

情報の整備は、まだ完了していません。少しずつ記録します。

2020.3 月現在で、こんなものがあったら良いと思うもの(メールを期待)

lirc を使わないで、raspberry pi の GPIO を直接操作。(最新のOSを使用)

 (2020.3.20 下記Webページ発見。lircd を作り直す。新しいOSに組み込んでほしい) 

 → https://raspibb2.blogspot.com/2019/06/kernel-419raspbian-stretchbusterlirc.html

 → http://yueno.net/xoops/modules/xpwiki/?PC%2FRaspberryPi%2FWEB%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%2Fkernel4.19%E7%94%A8LIRC%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89

 → wiringPi がある。https://tool-lab.com/raspi-gpio-controlling-command-2/ c コマンドで GPIO port に赤外線の情報を流せばよい。iresend のソースを見る必要があり。(2020.3.22)

irsend.c scanir.c が現在入手できない(どなたかお持ちのかたはメールください)。

node-red 上から exec を使わないで、直接 GPIO を動作したい。

Bluetooth 機器で赤外線の信号を出す装置。

方針 (詳細は、後で記述)

赤外線の動作は、Raspberry Pi zero WH で行う。(消費電力0.25W)

赤外線のコマンドは irsend を使う。このため irsend が使える古いOSを使う。

kernel 4.14.98 を用いる。そうでないと lirc-dev が動作しない。(Raspberry pi 古いカーネルに戻す、で検索。)。

(将来の課題として irsend を使わないで実行したい。)

実際に使う赤外線のコントローラーは自作する。(赤外線LEDの数を増やすことができる)

アマゾンエコーとの接続は Node-red を使う。(設計が簡単)

node-red-contrib-amazon-echo で Echo Dot から デバイスの認識をする。

Web ページでも赤外線の操作できるようにして、スマホで操作可能にする。

apache2 のポートを 80 から8080に変更 (alexa の80と競合しないように)

node-red-contrib-alexa-local を使わない。(Alexa Echo Dot の仕様の変更による。)

node-red-alexa-home-skill-bridgeをつかない。(uk のサーバーに接続するため遅い)

基本的に、local net から使う。外からは、ssh tunnel で接続する。(安全)

Raspberry Pi Zero WH の設定。

Raspberry Pi Zero WH は、消費電力が USB テスターで測定したら、0.25W でした。

動作において全く問題がなく、Wifiが使えるので、電源さえ確保すれば部屋のどこにでも おけます。スマホの予備バッテリーでも、1ヶ月は充分に動作します。予備バッテリーで 動作させると、移動させて試験するときに便利です。

OSを入れるMicroSDは16GBで少し高速のものを使いました。8GBでも問題ありませんが、いろいろインストールすると、6GB ぐらい使いますので、安全を見たほうが良さそうです。

OS kernel 4.14.98 の Rasbian を入れました。”Raspberry pi OS 古いkernel 4.14.98 install" で検索可能です。

Raspberry Pi Zero WH の最初の難関は、USBキーボードとマウスを同時に使えないことです。Wireless キーボードとマウスならば使えました。それ以外の方法もWeb上に公開されています。Wifi と real-VNC server をインストールすれば、そのあとは Windows 10 のパソコンから遠隔操作が可能になりますので、あまり投資をしないで突破したいです。

最終的には GUI や X windows を使わない形(すべてコマンドで行う) にしました。

以下必要な作業をメモします(詳細は必要がありましたら、追加しますが、 Webで検索可能な内容は省略。すべての作業をするのに3ヶ月かかった。)

OSを16GB SDカードに書き込む。OSのインストール。

WifiのIPアドレスを固定アドレスにする。(ssh や、Web server 対応にするため)

sudo apt-get update
sudo apt-get upgrade (カーネルのVersion を変えると irsend が使えなくなる)
sudo rpi-update a08ece3d48c3c40bf1b501772af9933249c11c5b (kernel 4.14 に戻す)
sudo apt-get install emacs    (emacs:標準のエディターです)
sudo apt-get install real-vnc (パソコン上で Raspberry piの操作をするため)
sudo apt-get install npm    (Node-red: 仮想的に回路を作るソフト)
sudo apt-get install apatch2  (Web server)
sudo update-rc.d apache2 defaults (Apatch2 の update)
sudo apt-get install lirc     (赤外線を動作させるためのライブラリー)
sudo apt-get install php5      (Web で PHP を実行)

赤外線リモコン部の作成と試験

最初は、Raspberry_Pi_IR_Control_Expansion_Board を買って動作試験をしました。

https://jp-m.banggood.com/IR-Infrared-Receiver-and-Transmitter-Expansion-Board-For-Raspberry-Pi-p-1102753.html?gmcCountry=JP&currency=JPY&cur_warehouse=CN&createTmp=1&ID=3837&utm_source=googleshopping&utm_medium=cpc_bgcs&utm_content=garman&utm_campaign=pla-jpg-all-mb&gclid=Cj0KCQjwh6XmBRDRARIsAKNInDEaLLoeBe-W8JMXhBDR-3OJBVXiI-r0Tms3aCCzgV_uISx-Vn7o_fEaAprCEALw_wcB

https://www.amazon.com/Raspberry-Controller-Transmitter-Transceiver-Geekworm/dp/B076BDR34K

中国からの輸入で、説明書も全くありませんでしたが、動作しました。 説明書を下記Webページからダウンロードして動作するところまで確認しました。

http://www.raspberrypiwiki.com/index.php/Raspberry_Pi_IR_Control_Expansion_Board#LIRC_Software

説明書どおりですが、説明書の 3.irrecord の部分の部分が不十分ですので、他のページを参考にして、どういう応答があるかを理解する必要がありました。日本語の詳細は

Raspberry Piで学習リモコン

https://qiita.com/gao_/items/e8394656003f349952d6

を参照するのが良いと思います。

また、すべてのリモコンがirrecord で動きません。あるときは、Raw dataとして irrecord を動かす必要があります。また irrecord で学習できないリモコンもありました。最後の部分は、mode2 コマンドを用いて学習することを書いたページがありますので、そこを参照すれば良さそうです。(最後の部分は、まだ完了していません。)最終的には、この基板は既存のリモコンの学習専用として使います。

http://www.raspberrypiwiki.com/index.php/Raspberry_Pi_IR_Control_Expansion_Board

基板は動作をしますが、赤外線LEDが1つしかなく、信号強度も弱いので1つの電灯だけON・OFFできますが、複数の機器を同時にすることはできないので、おすすめできません。

そこでLEDの数を増やし、電流も大きくして自作をすることにしました。自作のページはいろいろありますが、秋月通商ですべて揃うものとして、赤外線LEDドライブ回路の決定版

https://vintagechips.wordpress.com/2013/10/05/%E8%B5%A4%E5%A4%96%E7%B7%9Aled%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%9B%9E%E8%B7%AF%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%89%88/

というページの回路をまず、ブレッドボード上で動作を確認し、更に LED+27Ωの 部分を3つ並列にしても安定して動作することを確認しまして、ユニバーサル基板 (ブレッドボード配線パターン)Dタイプ 47x36mm を半分にカッターでカットシたもの にハンダ付けして回路を作りました。基盤にピンソケット(メス)2x8 (通販コード C-2761) をはんだ付けします。この際、ピンソケットの部分の配線がつながっているところをカッターで切って、テスタターで導通しないことを確認して使いました。

また、トランジスタとLEDは半田を盛る側に取り付けます。最初に半田付けをするときに、熱対策をしなかったため、トランジスタとLEDが熱で壊れてしましました。2回めは、トランジスターを軽く濡れたテッシュを重ねたものを洗濯バサミではさんで、加熱しないようにし、さらにトランジスターの足の部分をピンセットでハサミさらに論文バサミのような強めの洗濯バサミで挟んで、足から熱伝導で熱が伝わるのを阻止した状態で半田付けしましたので、熱による半導体の劣化を防ぐことができました。

秋月通商で購入したもの、抵抗4.7k(通販コードR-07831)、1kΩ(R-07820) 27Ω(R-07960) ,MOSFET(I-09723)3個、(I-06026) 3個、赤外線940nm (I-03261) 2袋、ピンソケット(C-02761)3個、基盤(P-08242)2個、

その他raspberry pi ブレッドボード配線ができるキットが必要です。いろいろ お金がかかります。1万円ぐらいは必要になります。趣味としては高いですね。 部品は余らしても良いですので、余分に買っておいたほうが安全です。

http://akizukidenshi.com/catalog/g/gP-08242/

回路の詳細が知りたい場合には、rsaito@flex.phys.tohoku.ac.jp までメールをくださいませ。基本的には、上記Webページの回路です。

赤外線をTVリモコンなどから学習する

赤外線を学習するときは irrecord を使います。

sudo /etc/init.d/lircd stop
irrecord -d /dev/lirc0 tv.conf

Raspberry Piで学習リモコン

https://qiita.com/gao_/items/e8394656003f349952d6

に詳細があります。そこからの、孫コピペです。

1.Enterキーを2回押して、リモコン学習を開始します。
2.学習したいリモコンのボタンを何度も押して学習します。
  複数のボタンを学習したい場  合は、学習したいリモコンの
  ボタンを何度も押してください。
  ボタンを押すたびに「.」が1個表示されるため、
  "Please keep on pressing buttons like described above."
  と表示されるまで、ボタンを押し続けます。
3."Please keep on pressing buttons like described above."
  が表示されたら、10秒間待ちます。
4."Please enter the name for the next button"が表示されたら、
  登録したいボタン名(on, off など)をを入力してEnterを押します。
5.登録したいリモコンボタンを押して、登録します。

irrecord では、2.のいろいろなキーを . が2行埋まるまで 入力するというところがあります。その部分が動かない場合には、 後述の方法で解決できます。

でできた conf ファイルを /etc/lirc/lircd.conf に追加すれば動きます。

sudo /etc/init.d/lircd restart (irsend が使えるようにします。)
irsend SEND_ONCE tv on (tv on のコマンドを一回送ります。)
pi@raspberrypi:~ $ cat /etc/lirc/lircd.conf 

# Please take the time to finish this file as described in
# https://sourceforge.net/p/lirc-remotes/wiki/Checklist/
# and make it available to others by sending it to
# <lirc@bartelmus.de>
#
# This config file was automatically generated
# using lirc-0.9.4c(default) on Wed Nov 14 07:31:26 2018
# Command line used: -n -d /dev/lirc0 /home/pi/fan.conf
# Kernel version (uname -r): 4.14.79+
#
# Remote name (as of config file): fan
# Brand of remote device, the thing you hold in your hand:
# Remote device model nr:
# Remote device info url:
# Does remote device has a bundled capture device e. g., a
#     usb dongle? :
# For bundled USB devices: usb vendor id, product id
#     and device string (use dmesg or lsusb):
# Type of device controlled
#     (TV, VCR, Audio, DVD, Satellite, Cable, HTPC, ...) :
# Device(s) controlled by this remote:

begin remote

  name  fan
  bits           64
  flags SPACE_ENC
  eps            30
  aeps          100

  header       3467  1754
  one           429  1313
  zero          429   442
  ptrail        428
  gap          78737
  toggle_bit_mask 0x0
  frequency    38000

      begin codes
          jaku                     0x40040B210C445032 0x00000000BEC2FA7D
          kiru                     0x40040B210CCC0CE6 0x00000000BEC2FA7D
          soft                     0x40040B210C8450F2 0x00000000BEC2FA7D
          kyou                     0x40040B210C245052 0x00000000BEC2FA7D
          3h                       0x40040B210CC20CE8 0x00000000BEC2FA7D
          6h                       0x40040B210C620C48 0x00000000BEC2FA7D
          timer1h                  0x40040B210C820CA8 0x00000000BEC2FA7D
          timeroff                 0x40040B210C020C28 0x00000000BEC2FA7D
      end codes

end remote

begin remote

  name  tvold
  bits           32
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       8988  4484
  one           559  1675
  zero          559   570
  ptrail        559
  gap          107670
  toggle_bit_mask 0x0
  frequency    38000

      begin codes
          on                       0x0CF300FF 0xBEFB0A7C
          ch1                      0x0CF308F7 0xBEFB0A7C
          ch2                      0x0CF38877 0xBEFB0A7C
          ch3                      0x0CF348B7 0xBEFB0A7C
          ch4                      0x0CF3C837 0xBEFB0A7C
          ch5                      0x0CF328D7 0xBEFB0A7C
          ch8                      0x0CF3E817 0xBEFB0A7C
          chp                      0x0CF39A65 0xBEFB0A7C
          chm                      0x0CF35AA5 0xBEFB0A7C
          otop                     0x0CF3906F 0xBEFB0A7C
          otom                     0x0CF350AF 0xBEFB0A7C
          mute                     0x0CF3D02F 0xBEFB0A7C
      end codes

end remote

以下 begin remote .... end remote で挟まれた部分を追加する。

begin remote

 name  tv
 bits           32
 flags SPACE_ENC|CONST_LENGTH
 eps            30
 aeps          100

 header       8988  4485
 one           563  1670
 zero          563   568
 ptrail        558
 repeat       8989  2257
 gap          107693
 toggle_bit_mask 0x0
 frequency    38000

     begin codes
         ch1                      0x0CF308F7 0xBECFA22C
         ch2                      0x0CF38877 0xBECFA22C
         ch3                      0x0CF348B7 0xBECFA22C
         ch4                      0x0CF3C837 0xBECFA22C
         ch5                      0x0CF328D7 0xBECFA22C
         ch6                      0x0CF3A857 0xBECFA22C
         ch7                      0x0CF36897 0xBECFA22C
         ch8                      0x0CF3E817 0xBECFA22C
         ch9                      0x0CF318E7 0xBECFA22C
         ch10                     0x0CF39867 0xBECFA22C
         ch11                     0x0CF358A7 0xBECFA22C
         ch12                     0x0CF3D827 0xBECFA22C
         on                       0x0CF300FF 0xBECFA22C
         chp                      0x0CF39A65 0xBECFA22C
         chm                      0x0CF35AA5 0xBECFA22C
         otop                     0x0CF3906F 0xBECFA22C
         otom                     0x0CF350AF 0xBECFA22C
         mute                     0x0CF3D02F 0xBECFA22C
     end codes

end remote
# これは Raw-code で学習した例です。
begin remote

 name  led
 flags RAW_CODES
 eps            30
 aeps          100

 gap          10982

     begin raw_codes

         name mode
            1981    1028    5429    1010    1478     532
            1448     538     418     577     438     555
             417     574     417     579     436     556
             441     558    1410     574     439     555
             439     554     437     585     385     579
             420     575     440     533    1430     584
            1429     553    1405     580     441     570
             401     578     417     575     439     556
             415     578     440     559     444     539
             440     558     437     558     417     575
             440     549     421     578     439     552
             443     536    1432     574    1408     577
             439     554    1410     592    1414     559
             416     576    1429     560    1408     578
             415

         name all
            2009    1009    5434    1035    1427     561
            1409     577     436     558     445     550
             440     554     416     576     418     554
             467     559    1408     575     464     528
             418     577     429     566     417     578
             438     551     419     578    1431     563
             471     497     460     556    1434     552
             449     543     421     578     441     551
             417     576     421     581     474     517
             438     555     417     577     444     579
             412     555     480     512     441     553
             441     561     440     550     417     577
            1454     532    1412     578    1428     564
             436     557    1431     556    1454     539
             415

         name oyasumi
            1941    1039    5424    1017    1432     576
            1409     577     416     578     420     577
             458     529     445     555     437     557
             436     561    1427     556     417     576
             439     556     438     552     443     553
             416     576     419     575    1458     534
             486     505     416     577     417     576
            1430     559     416     578     439     553
             439     556     416     581     470     519
             455     537     443     550     416     577
             442     555     438     554     440     554
             438     558     472     517     438     561
             434     558     449     522    1451     557
             439     555    1430     556    1430     560
             418

         name bright
            2012    1007    5428    1037    1456     533
            1427     562     416     577     440     554
             439     554     418     578     416     578
             415     584    1404     577     420     576
             416     578     438     558     415     577
             440     531     440     578    1452     540
             448     543     439     554     439     556
             436     558     451     543     439     555
            1405     580     441     557     452     539
             440     553     420     576     418     577
             416     577     453     538     444     553
             427     571     448     543     416     577
             440     554    1412     578    1453     533
             428     566     438     557    1432     537
             462

         name dark
            1979    1038    5432    1008    1452     558
            1435     554     443     554     417     577
             418     577     416     555     438     558
             435     581    1452     516     459     552
             420     577     417     579     436     558
             439     556     435     554    1437     537
             469     555     405     575     419     577
             418     577     437     555     418     552
             443     577    1455     516     466     544
             441     552     421     573     420     557
             456     554     443     553     418     577
             442     557     474     495     438     578
             440     553    1452     515    1456     557
             434     539    1430     579     439     554
             441

     end raw_codes

 end remote

赤外線を出すときは、もし tv のリモコンを登録して on という名前をつけたとき

sudo /etc/init.d/lircd restart    サービスの開始
irsend LIST "" ""          登録 conf のリスト
irsend LIST tv ""          tv として登録されたボタンのリスト
irsend SEND_ONCE tv on        tv の on のコマンドを一回送る。

の操作でできます。

pi@raspberrypi:~ $ irsend LIST "" ""

tvold
tv
fan
led
pi@raspberrypi:~ $ irsend LIST tv ""

000000000cf308f7 ch1
000000000cf38877 ch2
000000000cf348b7 ch3
000000000cf3c837 ch4
000000000cf328d7 ch5
000000000cf3a857 ch6
000000000cf36897 ch7
000000000cf3e817 ch8
000000000cf318e7 ch9
000000000cf39867 ch10
000000000cf358a7 ch11
000000000cf3d827 ch12
000000000cf300ff on
000000000cf39a65 chp
000000000cf35aa5 chm
000000000cf3906f otop
000000000cf350af otom
000000000cf3d02f mute
pi@raspberrypi:~ $

irrecord で学習できない場合には以下の方法があります。

(1) irrecord -f -d /dev/lirc0 raw.conf でRaw Mode で実行する。

(2) mode2 コマンドを使ってその後編集。

(2) の方法は、

https://qiita.com/ww24/items/32d2a78c20e6dcc2e68c

に詳細があります。

mode2 -d /dev/lirc0 | sed -ue '1d' | tee aircon_on.txt

でリモコンの一つのボタンを押す。できた aircon_on.txt を編集(最初の大きな数字の行は削除)

cat aircon_on.txt | awk '{if(NR % 30) ORS=" "; else ORS="\n"; print $2}' | cat -; echo

4 桁ぐらいの数字の列ができるので、config file を作り、/etc/lirc/lircd.conf に追加する。

begin remote

  name            aircon
  flags           RAW_CODES
  eps             30
  aeps            100
  gap             200000
  toggle_bit_mask 0x0 

  begin raw_codes
    name on
460 383 496 368 485 376 487 411 454 394 469 25241 3474 1717 450 1244 484 383 483  379 510 351 490 1246 483 376 578 353 418 381
481 385 483 1249 482 378 485 1255 471 1302 430 379 491 1247 499 1226 480 1253 478 1248 486 1242 478 384 487 405 473 1235 477 378
486 382 484 381 484 378 496 370 485 384 482 378 483 379 537 331 481 378 526 1211 480 380 482 1263 495 355 486 378 486 381
482 1245 484 1250 476 388 477 382 489 417 444 384 477 383 485 384 481 394 468 384 479 377 492 381 481 395 475 425 489 344
506 379 446 391 475 379 483 1248 486 1241 486 1304 425 383 481 1291 434 384 484 1250 483 1245 478 34546 3488 1684 477 1248 489 377
484 382 479 405 457 1255 488 373 497 369 478 382 487 380 494 1241 482 377 480 1266 468 1248 480 379 485 1249 481 1244 485 1250
487 1239 480 1263 478 367 484 384 484 1244 484 386 480 385 480 395 465 382 507 356 498 370 485 378 483 380 484 390 484 375
485 376 507 1230 479 380 486 380 484 382 496 364 487 1247 482 378 485 379 487 380 485 382 478 384 483 380 486 391 471 385
479 382 481 384 482 381 482 383 488 383 478 385 484 378 489 374 488 376 487 388 476 379 483 1263 483 368 477 1250 480 381
520 1213 478 384 485 34546 3487 1688 479 1246 482 383 481 382 508 358 484 1255 469 385 485 384 480 391 471 381 482 1252 481 381
478 1251 483 1244 493 403 451 1250 478 1251 477 1249 485 1265 458 1251 483 380 485 381 508 1225 486 378 487 370 485 406 462 380
485 380 482 400 462 392 474 387 476 389 478 381 486 377 489 378 483 385 486 373 484 381 480 386 484 381 484 385 518 1208
487 399 459 382 483 1268 468 386 471 477 387 1249 483 382 505 357 481 1249 480 1253 479 1250 478 383 581 1154 477 385 477 383
485 380 482 383 507 391 459 368 482 386 485 377 511 361 477 382 488 1241 484 1268 485 1221 482 1247 504 362 484 1247 481 381
482 1246 483 1250 482 1246 483 1244 483 1248 479 383 483 384 480 380 486 384 480 384 478 384 481 415 450 383 485 379 484 382
482 385 477 386 481 378 487 1248 486 1243 480 384 482 394 470 390 474 383 482 383 485 381 479 382 480 384 484 384 481 382
482 1250 482 1247 481 407 456 384 480 383 516 349 483 383 504 358 482 385 519 339 494 398 458 389 497 362 482 417 466 362
484 382 520 345 507 358 614 251 484 1243 486 378 486 382 480 408 458 382 481 383 479 1255 479 1247 482 384 479 417 496 334
485 378 480 385 534 329 521 344 487 1247 479 385 478 385 484 379 498 365 482 430 440 379 484 396 468 378 483 387 501 1230
484 1245 476 1256 479 378 484 1248 479 1250 482 1244 481
  end raw_codes

 end remote

赤外コマンドを Shell Script にする。

これを、sh script に組み込んで、tv-on.sh のようにして、 このスクリプトを、Webや echo dot -> node-red から起動するようにします。

# TV turn off tv-on.sh
if [ $1 = "on" ]
then
  irsend SEND_ONCE tv on
# TV turn on
elif [ $1 = "off" ]
then
  irsend SEND_ONCE tv on
fi

次は、ch-local.sh です。これは数値を引数 $1 としてチャンネルを変更します。 bash では、数値の比較は "=" でなく "-eq" を使うことに注意が必要です。

# TV channel selection
# Sendai version. 1, 2, 3, 5, 8
# 11:Mute 12:Volup 13:Voldown
# echo $1 >> /home/pi/ch.log
if [ $1 -eq 1 ]
then
  irsend SEND_ONCE tv ch1
#
elif [ $1 -eq 2 ]
then
   irsend SEND_ONCE tv ch2
#
elif [ $1 -eq 3 ]
then
   irsend SEND_ONCE tv ch3
#
elif [ $1 -eq 5 ]
then
   irsend SEND_ONCE tv ch5
#
elif [ $1 -eq 8 ]
then
   irsend SEND_ONCE tv ch8
#
elif [ $1 -eq 11 ]
then
   irsend SEND_ONCE tv mute
#
elif [ $1 -eq 12 ]
then
   irsend SEND_ONCE tv otop
#
elif [ $1 -eq 13 ]
then
   irsend SEND_ONCE tv otod
else
exit 0
fi

Web ページからの動作

Alexa を用いた動作の前に、Webページで動作することを確認します。

apatch2 (Web server) をインストール(上記の sudo apt-get install apatche2) して、http://192.168.XXX.XXX/index.html がスマホなので見えることを確認します。

port を80から8080に変更します。そのために2つのファイルを変更

/etc/apache2/ports.conf

Listen 80 -> Listen 8080

/etc/apache2/sites-enabled/000-default.conf

VirtualHost *:80> -> <VirtualHost *:8080>

apache2 を再起動

sudo service apache2 stop

sudo service apache2 start

IPaddress:8080 で、Home Page が見えること。 IPaddress で Home Page が見えないこと。

を確認します。

また、動作hは PHP を使いますので、php もインストール (sudo apt-get install php)します。

このインストールの仕方は、"Raspberry pi Web server", "Raspberry pi PHP" で検索可能です。

Webページの画面が変化しないで、コマンドを実行するのは難しかったです。いろいろなページを参考に次のような1ページだけの index.html ファイルを作ってみました。 1 箇所 IP address を編集する必要があり。

<html lang="ja">
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title></title>
  <!--  <script type="text/javascript" src="/cmd.js"></script> -->
  <script type="text/javascript">
/* refered from : http://www.gesource.jp/programming/javascript/20060503.html \
*/
/*  http://www.gesource.jp/programming/javascript/20060501.html */

function createXMLHttpRequest() {
    if (window.XMLHttpRequest) {
       return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
       try {
           return new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
           try {
               return new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e2) {
               return null;
           }
       }
    } else {
       return null;
    }
}

const server_addres = "http://192.168.10.50:8080"
const light_on = "/led.php"
const light_off = "/led-off.php"
const tv_on = "/tv-on.php"
const tv_1  = "/tv-1.php"
const tv_2  = "/tv-2.php"
const tv_3  = "/tv-3.php"
const tv_4  = "/tv-4.php"
const tv_5  = "/tv-5.php"
const tv_8  = "/tv-8.php"
const v_p   = "/v-p.php"
const v_d   = "/v-d.php"
const v_0   = "/v-0.php"

function lightOn()
{
    var url = light_on;
    cmd(url);
}

function lightOff()
{
    var url = light_off;
    cmd(url);
}

function TvOn()
{
    var url = tv_on;
    cmd(url);
}

function Tv1()
{
    var url = tv_1;
    cmd(url);
}
function Tv2()
{
    var url = tv_2;
    cmd(url);
}
function Tv3()
{
    var url = tv_3;
    cmd(url);
}
function Tv4()
{
    var url = tv_4;
    cmd(url);
}
function Tv5()
{
    var url = tv_5;
    cmd(url);
}
function Tv8()
{
    var url = tv_8;
    cmd(url);
}
function Vp()
{
    var url = v_p;
    cmd(url);
}
function Vd()
{
    var url = v_d;
    cmd(url);
}
function V0()
{
    var url = v_0;
    cmd(url);
}

function cmd(url)
{
    var request = createXMLHttpRequest();
    var send_address = server_addres + url
    request.open("GET", send_address, true);
    request.send("");
}

function sleep(ms)
{
    var d1 = new Date();
    while (true) {
	const d2 = new Date();
	if (d2 - d1 > ms) {
	    break;
	}
    }
}
</script>  
  
</head>
<table border="0" cellspacing="0" cellpadding="1">

  <tr>
    <th>
      <form name="light-on">
	<input type=button style="width:200px;height:150px;font-size:2.5em" val ue="電灯 ON" onclick="lightOn()">
      </form>
    </th>
    <th>
      <form name="light-off">
	<input type=button style="width:200px;height:150px;font-size:2.5em" val ue="電灯 OFF" onclick="lightOff()">
      </form>
    </th>
    <th>
      <form name="TV-ON">
	<input type=button style="width:200px;height:150px;font-size:3.0em" val ue="テレビ" onclick="TvOn()">
      </form>
    </th>
  </tr>

  <tr>
    <th>
      <form name="TV-1">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="1ch" onclick="Tv1()">
      </form>
    </th>
    <th>
      <form name="TV-2">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="2ch" onclick="Tv2()">
      </form>
    </th>
    <th>
      <form name="TV-3">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="3ch" onclick="Tv3()">
      </form>
    </th>
  </tr>
  <tr>
    <th>
      <form name="TV-4">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="4ch" onclick="Tv4()">
      </form>
    </th>
    <th>
      <form name="TV-5">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="5ch" onclick="Tv5()">
      </form>
    </th>
    <th>
      <form name="TV-8">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="8ch" onclick="Tv8()">
      </form>
    </th>
  </tr>

  <tr>
    <th>
      <form name="Vup">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="音+" onclick="Vp()">
      </form>
    </th>
    <th>
      <form name="Vdown">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="音−" onclick="Vd()">
      </form>
    </th>
    <th>
      <form name="Vmute">
	<input type=button style="width:200px;height:150px;font-size:4.5em" val ue="無音" onclick="V0()">
      </form>
    </th>
  </tr>
</table>
</html>

この中で、php ファイルが複数参照されます。その例として led.php を示します。 他も irsend の部分を変えればできます。

<?php
$results = shell_exec('irsend SEND_ONCE led mode');
echo $results;
?>

すべて、ファイルは /var/www/html に置きます。

プログラムを変更するには、Table の部分、function の部分、constant の部分の3ヶ所を変更して、該当する php ファイルを作ります。

Raspberry Pi に Node-Red のインストール、設定

Amazon Echoとラズパイで、音声で照明をon/offする

を参照して Node-red を Raspberry Pi にインストールします。

https://qiita.com/kikuzo/items/753b5065dde9633bda18

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
sudo systemctl enable nodered.service

参照した Web ページは、Node-RED Alexa Home Skill Bridge を使っていて、uk へのサーバーを使っています(これでも動作します)が、ローカルのサーバー内だけで 済ませたいので、node-red-contrib-amazon-echo 1.10 を使います。(2020.3.20現在)

sudo npm install node-red-contrib-amazon-echo

(node-red-contrib-amazon-echo をインストールします。)

sudo node-red-stop
sudo node-red-start (node-red を再起動します)

PC 上から、raspberry pi の IPaddress:1880 で Node-red のサーバーに入ります。

右上の三本線を押して、パレットの管理を選択

ノードの追加タブ node-red-contrib-amazon-echo を入力し、追加ボタンを押す。

(注:前は node-red-contrib-alexa-local でしたが、ある場合には削除します。)

(注:ここで node-red-contrib-lirc も追加しておくと、irsend コマンドを 直接操作できる。Execがいらない?まだ試していない。2019.5.29 追記)

ここから先の作業は、https://vogel.at.webry.info/201910/article_3.html?1570354755

を参考にしました。port80 から port8111 へ変更

sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i wlan0 -p tcp -d 172.17.4.125 --dport 80 -j REDIRECT --to-port 8111
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
sudo apt-get install iptables-persistent

2行目で無線LANを使っているので、wlan0 を使います。ip address は raspberry pi のlocal network 上の ip address です。4行目でこの設定が再起動で消えないようにする。

2020.3.21 大学のネットワークで echo dot を使おうとすると、デバイスが検出できない。(解決していない)

その理由の候補として、local network 上に別のWorkstation 上のWeb serverがport 80 を使っている。このポートを変えることはできないので、対応ができない? ルーターをつけてecho dot と、raspberry pi zero wh を独立したネットワーク上に移動する必要があるかも。

Node-red の作業は、amazon echo hub, amazon echo device

ノードを貼り付けて、線でつなぎます。

貼り付けた amacon echo hub をクリックしてポートを8111にします。

Node-red の経験がある人は、線でつないでからデバイスの認識を 

Echo Dotから行うと思いますが、なぜかこれだとうまくいきません。 上記Webページの通り、amazon echo hub, amazon echo device だけをパレット に置いた状態で、echo dot から認識させてください。

また amazon echo device デバイス名を日本語にすると文字化けしますので、 ローマ字で行って、後で Echo Dot で認識したあと、Echo Dot の方の名前を 日本語に直しました。

amazon echo HUB --> amazon echo device --> Exec (その他にある)
                                      |
                                       --> msg.payloadg             
amazon echo device (並列に複数可)をダブルクリック 名前を Denkiにします。
amazon echo HUB は、1個のみです。 

Execをダブルクリックで コマンドとして /home/pi/led-local.sh を入力します。

Debug はそのまま msg.playload の値を表示します。

led-local.sh の中身は、on と off によって分岐しています。

# LED turn off
if [ $1 = "off" ]
then
   irsend SEND_ONCE led mode
   sleep 1
   irsend SEND_ONCE led mode
# LED turn on
elif [ $1 = "on" ]
then
   irsend SEND_ONCE led mode
fi

led-local.sh を実行可能にします。

chmod +x /home/pi/led-local.sh
/home/pi/led-local.sh on

で動作確認できます。

チャンネルを変更する場合には、

amazon echo device ---> Change (機能にある)---> Exec (その他にある)
                                                    |
                                                    --> Debug             

amazon echo device をダブルクリック 名前に channelを入力。

Change をダブルクリック 名前 channel 値を代入 msg.playload 対象の値 msg.bri

Execをダブルクリックで コマンドとして /home/pi/ch-local.sh を入力します。

デブロイして デバイス チャンネルを完成します。

# TV channel selection
# Sendai version. 1, 2, 3, 5, 8
# 11:Mute 12:Volup 13:Voldown
# echo $1 >> /home/pi/ch.log
if [ $1 -eq 1 ]
then
   irsend SEND_ONCE tv ch1
#
elif [ $1 -eq 2 ]
then
    irsend SEND_ONCE tv ch2
#
elif [ $1 -eq 3 ]
then
    irsend SEND_ONCE tv ch3
#
elif [ $1 -eq 5 ]
then
    irsend SEND_ONCE tv ch5
#
elif [ $1 -eq 8 ]
then
    irsend SEND_ONCE tv ch8
#
elif [ $1 -eq 11 ]
then
    irsend SEND_ONCE tv mute
#
elif [ $1 -eq 12 ]
then
    irsend SEND_ONCE tv otop
#
elif [ $1 -eq 13 ]
then
    irsend SEND_ONCE tv otod
else
exit 0
fi

msg.bri の値は数値ですので -eq で比較します。

chmod +x /home/pi/ch-local.sh
/home/pi/ch-local.sh 3

node-red のFlow の書き出し、読み込み

上記のFlowの設定を書き出したもの(JSONと呼ばれるもの?)が以下のとおりです。 これをコピーして Node Red 上の右上の三本線で読み込みをすれば、フローが できます。


[{"id":"d8cf2a31.5fe2b","type":"exec","z":"b3255512.5622c8","command":"/home/pi/led-local.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"LED ライト","x":576.3333129882812,"y":119.33334350585938,"wires":[[],[],[]]},{"id":"e362862b.f30d98","type":"exec","z":"b3255512.5622c8","command":"/home/pi/tv-local.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"寝室のテレビのオンオフ","x":555.3333129882812,"y":437.3333435058594,"wires":[[],[],[]]},{"id":"e97e1d60.054a58","type":"debug","z":"b3255512.5622c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":564.3333129882812,"y":48.333335876464844,"wires":[]},{"id":"ceb21bdb.2fb7b","type":"debug","z":"b3255512.5622c8","name":"tv","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","x":523.3333129882812,"y":356.3333435058594,"wires":[]},{"id":"1ae45a0c.ba9366","type":"debug","z":"b3255512.5622c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":520.3333129882812,"y":544.3333435058594,"wires":[]},{"id":"2234de73.706d02","type":"change","z":"b3255512.5622c8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"bri","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":323,"y":591.3333129882812,"wires":[["1f8d315e.39ef6f","1ae45a0c.ba9366"]]},{"id":"1f8d315e.39ef6f","type":"exec","z":"b3255512.5622c8","command":"/home/pi/ch-local.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"チャンネルの切り替え","x":539.3333129882812,"y":637.3333740234375,"wires":[[],[],[]]},{"id":"8ec5529b.b9b6e8","type":"exec","z":"b3255512.5622c8","command":"/home/pi/hotman.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"ホットマンのオンオフ","x":542.8309631347656,"y":284.323486328125,"wires":[[],[],[]]},{"id":"78d10466.12e0ac","type":"debug","z":"b3255512.5622c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":558,"y":212,"wires":[]},{"id":"6b6114b2.2395dc","type":"amazon-echo-hub","z":"b3255512.5622c8","port":"8111","processinput":"0","discovery":true,"x":85,"y":200,"wires":[["bb3df021.1e7f38","11a9bcff.41d57b","8e8c12af.36185","fd26196e.93cd48"]]},{"id":"bb3df021.1e7f38","type":"amazon-echo-device","z":"b3255512.5622c8","name":"denki","topic":"","x":357.5,"y":89,"wires":[["d8cf2a31.5fe2b","e97e1d60.054a58"]]},{"id":"11a9bcff.41d57b","type":"amazon-echo-device","z":"b3255512.5622c8","name":"hotman","topic":"","x":307.5,"y":206,"wires":[["78d10466.12e0ac","8ec5529b.b9b6e8"]]},{"id":"8e8c12af.36185","type":"amazon-echo-device","z":"b3255512.5622c8","name":"telebi","topic":"","x":303.5,"y":320,"wires":[["e362862b.f30d98","ceb21bdb.2fb7b"]]},{"id":"fd26196e.93cd48","type":"amazon-echo-device","z":"b3255512.5622c8","name":"channel","topic":"","x":265.5,"y":416,"wires":[["2234de73.706d02"]]}]


Alexa アプリ上での設定。

スマホに Alexa アプリをいれる。

(追記:node-red-contrib-amazon-echo の場合には echo dot に  Node-red というスキルが不要です。 Node-redのスキルを入れるとアカウントの入力が必要ですが uk のサーバー上 でのアカウントですので関係ありません。

デバイスが見つからない時は、

amazon echo HUB --> amazon echo device 

以外の配線をすべて消去して、再度 デバイスの検索を行ってください。

アプリの左上の三本線をおして、設定→デバイスの設定→ + を押す。

デバイスを追加→セットアップするデバイスの種類で一番下 その他 を選択

デバイスを検出 (20秒待つ)新しいデバイスが登録される。必要に応じて 自分で設定したグループ( 821セミナー室 など) に入れる。

Raspberry pi の電気とチャンネルが見つかります。 (注:node-red-contrib-amazon-echo を用いた場合です。

(注: alexa-home-skill の場合には、uk のサーバーにログインする必要があります.alexa-home-skill で定義したデバイス、とnode-red-contrib-amazon-echo で定義したデバイスは同じ名前でも違うデバイスですので、混乱しないように必ず片方を利用してください。node-red-contrib-amazon-echo のほうが良いです。node-red-contrib-amazon-echo の欠点は、新しいデバイスを見つけるには、同じ local-net 上で作業をしなければいけません。外部のネットから、作業をするときには、ssh のトンネルを使う方法がありますが、ここでは省略します。 )

アプリ上の デバイス 電気 ON で 電気が動作することを確認します。

アプリの左上の三本線をおして、定形アクションを選択して→ + を押す。

実行条件を設定 → + を押す。アレクサ つけて  を入力

アクションを追加 →+ を押す。スマートホーム、デバイスをコントロール

電気 を選択

電源を選択 オン 次へ

保存すると、アレクサ電気 で電気がON OFFできます。ONとOFFのコマンドが違う 場合には、アレクサつけて、アレクサ消して、のように別のアクションで登録

チャンネルの場合には

アレクサ NHK を入力

アクションを追加 + スマートホーム、デバイスをコントロール

チャンネルを選択 

明るさを選択 3

でできます。アレクサ 電気、 アレクサ NHK で動きます。

https://qiita.com/tstkkmd/items/10fb586be83de96bfe24

2 つ以上の Echo dot + raspberry pi を使う場合

自宅と職場のように、2ヶ所で Echo dot + raspberry pi を使う場合には、

まず、自宅用と職場用の gmail account を作ります。

スマホでは、アレクサアプリ 左上の三本線 設定 

の一番下に、〇〇さんではありませんか?というところで、別のアカウントの設定にできます。職場のローカルネットで、職場のRaspberry Piのデバイス(Node-red)を見つけます。

PC に teraterm pro をインストールして、設定→sshポート転送

ローカルの"localshot" のポート8880 からリモートの192.168.XX.XX:1880

のように転送設定し、設定ファイルを保存します。teraterm の SSH で自宅から、職場のローカルネットにログインできれば、自宅のPCの Web 上で localhost:8880 を開くと、職場の Node-red の編集ができます。また、試してはいませんが、自宅から職場のリモートの操作も アレクサアプリでできると思います。

Raspberry pi 3 (または pi 2) を echo dot のようにする。

これを Amazon voice service というらしいです。この設定方法はかなり試行錯誤しました。

Raspi2にAlexa Voice Service(AVS)を 〜Raspi2にAlexa Voice Service(AVS)をインストール編〜

https://qiita.com/areaz_/items/8e949d45f8afe73dbc76

で解決しました。Raspberry piの特定の directory ~/rasp3-alex 上に必要な ファイルは、3つの sh file と config.json というファイルです。

wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh \ wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/genConfig.sh \ wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/pi.sh

これで一つのコマンドで、setup.sh, genConfig.sh, pi.sh がダウンロードできます。

config.json ファイルもダウンロードして持ってくるのですが、そのためには

Raspi2にAlexa Voice Service(AVS)を 〜AVS設定編〜

https://qiita.com/areaz_/items/60cbdf8059881ee33ec3

に従って作る必要があります。

そのあとは、Raspi2にAlexa Voice Service(AVS)を 〜Raspi2にAlexa Voice Service(AVS)をインストール編〜 を見ながら作業します。

sudo bash setup.sh config.json (途中で agree, enter, yes などを入れます)

sudo bash startsample.sh | grep "To authorize"

で code を https://amazon.com/us/code 上で入力 Allow で登録されます。

C-c で再度

sudo bash startsample.sh を実行

$ sudo bash startsample.sh

動作後のトラブル kernel が 4.19.42+ の場合 2019.6.11

2019.6.11  この日突然 irsend が動かなくなった。
pi@raspberrypi:/etc/rc5.d $ irsend SEND_ONCE 821-l on
 
hardware does not support sending
Error running command: Input/output error
uname -r でカーネルのバージョンを確認 

kernel が 4.19.42+ の場合には、lirc-dev がなくなったのが原因らしい。 (下記追記の記事による)。

下記追記にあるように、gpio-ir を使う提案がある。 試したがうまく行かなかった。(上記エラーは消えたが、irsend で信号が 送られない。)

2019.6.12  kernel を古いVersion に戻すことで復活した!!!

下記Webページを参照した。Raspberry Pi2(使っていなかったもの) のカーネルのバージョンであった、4.14.98まで戻す。

http://marm.cocolog-nifty.com/jokanaan/2018/04/rpi-update-f6e1.html

sudo rpi-update a08ece3d48c3c40bf1b501772af9933249c11c5b

で 4.14.98まで戻す。(やたらに apt upgrade をすべきでない。)

uname -a  で確認
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.98+ #1200 Tue Feb 12 20:11:02 GMT 2019 armv6l GNU/Linux

もどった。lirc ももとに戻す必要がある。(2019.6.11 下記でPatch を当ててしまった。)

sudo apt-get remove lirc   (apt-get purge lirc だと設定ファイルまで消してしまう。)
sudo apt-get install lirc 
/boot/config.txt をもとに戻す
dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17

再起動 sudo /etc/init.d/lircd status irsend LIST "" "" で古い設定が残っていることを確認。

irsend SEND_ONCE led mode で動作を確認。良かった!

動いている Raspberry pi にやたらに sudo apt upgrade をすべきでないことが わかった。デバイスがなくなっている場合がある。

(追記部分、lirc にパッチを当てて gpio-ir で irsend を動かすもの)

以下は 2019.6.11 に lirc にパッチを当てるという方法を試した記録。 エラーはなくなったが、赤外線が出ないようで、うまく行かなかった。 おすすめできない。

https://qiita.com/f_t812/items/304d9558ec74db7309fd

https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=235256

sudo su -c "grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"
sudo apt update
sudo apt install devscripts
sudo apt build-dep lirc
mkdir build
cd build
apt source lirc
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/lirc-gpio-ir.patch
patch -p0 -i lirc-gpio-ir.patch
cd lirc-0.9.4c
debuild -uc -us -b
cd ..
sudo apt install ./liblirc0_0.9.4c-9_armhf.deb ./liblirc-client0_0.9.4c-9_armhf.deb ./lirc_0.9.4c-9_armhf.deb 

インストールのあと、/boot/config.txt に以下を追加

dtoverlay=gpio-ir,gpio_pin=18
dtoverlay=gpio-ir-tx,gpio_pin=17

irrecord, mode2 を使う場合には /etc/lirc/lirc_options.conf を以下のようにする

driver = default
device = /dev/lirc1

irsend を使う場合には、/etc/lirc/lirc_options.conf を以下のようにする

driver = default
device = /dev/lirc0

いずれの場合にも lircd を再起動する。

/etc/init.d/lircd stop
/etc/init.d/lircd start
/etc/init.d/lircd status

irsend コマンドでエラーがでなくなったが、赤外の信号が出て反応してないようだ。 問題は、解決していない。

lirc をあきらめましょう を使ってみる。

feijoa.jp/laboratory/raspberrypi/infrared/

で送信プログラムを使うことも考えて見る必要があるかも。

数カ月動作後、Raspberry pi Zero がフリーズする。

2つ原因があった。

一つは アマゾンエコーがデバイスを探すときに、2019.9まではすべてのポートで検索していたが、2019.9以降は、80番のポートしか探さない。対策は、下記にある。

https://vogel.at.webry.info/201910/article_3.html?1570354755

node-red-contrib-amazon-echo で、8111ポートを見るようにして、 port 80 を 8111 に iptable で変更する必要がある。(詳細は上記Webページ、 注意:上記Web ページのコマンド中の eth0 を wlan0 にしないと、無線LANのポートの変更が実行されない!)

echo dot が80番ポートを使うと、apache2 (web server) のポートを8080に変更する必要あり。(この説明は、このページの上の方で説明)

(注:一つのNICで2つのip address を指定して、片方の ipaddress だけポート80をあけるということもできるらしいが、raspberry pi zero wh の wlan0 が可能かどうか不明)

このページ通りにすれば動作する。途中デバイスの探索されない問題があって 数日かかったが、node-red の配線をする前に検索をすればうまくいくことが分かった。 また検索された、デバイスが文字化けするので最初はローマ字のデバイス名にして echo dot で検索されてから echo dot のほうだけ日本語にすればよいことが分かった。

もう一つはメモリー使用量が多くスワップを使いすぎ。 メモリー(512MB)が足りない。GUI 他を切って、メモリー使用量を100MBにする。 80MB が node-red.

http://denshikousaku.net/extend-life-expectancy-of-raspberry-pi-sd-card

SD カードがお釈迦になった?SDカードの寿命を増やす必要あり。

sudo apt-get remove dphys-swapfile

SWAP を使わないようにする。(メモリー使用量が下がったので不要) 

cat /proc/meminfo 
SwapTotal:             0 kB
SwapFree:              0 kB

0 になった。

SSDを利用?

さらにメモリー消費をへらす。 http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_free_memory_disable_service/

https://www.dogrow.net/linux/blog75/

GUI を使わない。ssh pi@IP-address で login. メモリーの節減になる。

 sudo raspi-config ⇒  Boot Options を選択 ⇒ Desktop / CLI を選択 ⇒ Console を選択   

Finish して再起動。空きメモリ98MB キャシュ利用267MBになった。

http://denshikousaku.net/save-raspberry-pi-memory

rapberry pi メモリ節約 で検索。最小限の動作にする。

使用メモリが毎日少しずつ増えている。/run directory が増えている。対策が必要。

その前に alex-local を node-red-contrib-amazon-echo に変更する。

https://qiita.com/naka-kazz/items/9dce91beaf46a91b4c86

を参考にした。

2020.3.19 の段階で、電気のオンオフは動作している。

pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/netfilter-persistent save [....] Saving netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save done. pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/netfilter-persistent reload [....] Loading netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start done. pi@raspberrypi:/etc/init.d $ sudo iptables

ご意見、質問など

記録ですので、いろいろ間違っている点もあると思います。質問がある場合には、 メール(このHome Pageにアドレスがあります)をいただければ、お返事いたします。 全くの初心者ですので、技術的な質問にはお答えできません。また、これより良い方法がいろいろあると思いますが、対応しない予定です。rsaito at flex.phys.tohoku.ac.jp


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-04-22 (水) 21:13:49