「Raspberry Pi」カテゴリーアーカイブ

【ALEXAスキル開発】どうも、今のままではAlexa連携はできないっぽい。

あれからAlexaからWebAPIを実行する方法を探ってみたのですが、

結論から言うと、今のままでは無理っぽいです。

理由は、WebAPIを実行するためには、インターネットからHTTPSでアクセスできることが条件と言うことです。

https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/host-a-custom-skill-as-a-web-service.html

今の環境下では、テレビの赤外線を使用しているラズパイはローカルネットワーク環境下でのみ実行可能で、インターネットからアクセスしようにも、プロバイダー(ビッグローブ)側で自宅IPへの直アクセスもブロックされているっぽいのです。

外からアクセスする手段が無い以上、どうすることもできません。

Arduinoだとこんな感じで使用できるみたいです。

https://dev.classmethod.jp/articles/smart-home-skill/

なので、Alexaスキル開発は一旦中断。

ただ、テレビの赤外線通信はこのままではもったいないので、別の活用法を考えてみたいと思います。

リモコンが無くても、PCやスマホからコントロールできるようにするとか。

ちょっとそっちの方で進めてみましょうか。

他にやることないし。

【ラズパイ】WebAPIで赤外線信号を送信する

結局は、ほとんどの信号をmode2コマンドでトレースして、赤外線信号データを登録しました。

https://github.com/takishita2nd/tv_ir/blob/master/tv.conf

全てきちんと動作することを確認しています。

これをWebAPIで実行できるように、簡易httpサーバをpythonで作成します。

すでにやってきたことなので、サクッと作成。

import json
import time
import threading
import subprocess

from http.server import BaseHTTPRequestHandler
from http.server import HTTPServer
from http import HTTPStatus
from typing import TypeVar
from urllib.parse import urlparse

PORT = 8000

def __main__():
    thread = threading.Thread(target=httpServe)
    thread.start()
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        return

def httpServe():
    handler = StubHttpRequestHandler
    httpd = HTTPServer(('',PORT),handler)
    httpd.serve_forever()

class StubHttpRequestHandler(BaseHTTPRequestHandler):
    server_version = "HTTP Stub/0.1"
    thread = None
    aviFilename = ""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def do_POST(self):
        content_len = int(self.headers.get('content-length'))
        requestBody = json.loads(self.rfile.read(content_len).decode('utf-8'))
        command = requestBody['contents']['command']
        args = ['irsend', 'SEND_ONCE', 'tv', command]
        res = ""
        try:
            res = subprocess.run(args, stdout=subprocess.PIPE)
        except:
            ""

        response = { 'status' : 200 }
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        responseBody = json.dumps(response)

        self.wfile.write(responseBody.encode('utf-8'))

__main__()

これに対して、PostmanというWebAPIを送信するツールを使って、リクエストを送ります。

これで動きました。

【ラズパイ】赤外線信号の学習

えっと、

配線を間違えたせいで、赤外線受信モジュールが壊れました。

まぁ、もう一個あったので、そちらに交換しましたが。

そして、もう一つ、

前回のやり方だと、TVが反応してくれるコマンドもあれば、反応してくれないコマンドもありました。

むしろ、反応してくれないコマンドの方が多い。

なので、やり方を変えます。

こちらの記事を参考にしました。

https://qiita.com/amaebi-tabetai/items/211b9c6f751c96ff1fd7

irrecordというコマンドを使用して、赤外線のデータを何回か入力させて、正しい信号に直してくれることができるみたいです。

irrecord --disable-namespace -f -d /dev/lirc1 --driver default ~/lircd.conf

受信機をlirc1にしているので、こちらを使用します。

pi@raspberrypi:~ $ irrecord --disable-namespace -f -d /dev/lirc1 --driver default ~/lircd.
conf
Using raw access on device /dev/lirc1

irrecord -  application for recording IR-codes for usage with lirc
Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

This program will record the signals from your remote control
and create a config file for lircd.

A proper config file for lircd is maybe the most vital part of this
package, so you should invest some time to create a working config
file. Although I put a good deal of effort in this program it is often
not possible to automatically recognize all features of a remote
control. Often short-comings of the receiver hardware make it nearly
impossible. If you have problems to create a config file READ THE
DOCUMENTATION at https://sf.net/p/lirc-remotes/wiki

If there already is a remote control of the same brand available at
http://sf.net/p/lirc-remotes you might want to try using such a
remote as a template. The config files already contains all
parameters of the protocol used by remotes of a certain brand and
knowing these parameters makes the job of this program much
easier. There are also template files for the most common protocols
available. Templates can be downloaded using irdb-get(1). You use a
template file by providing the path of the file as a command line
parameter.

Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to  <lirc@bartelmus.de> so it can be made available to others.

Press RETURN to continue.

Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...

No significant noise (received 0 bytes)

Enter name of remote (only ascii, no spaces) :
Enter name of remote (only ascii, no spaces) :tv
Using tv.lircd.conf as output filename

Now start pressing buttons on your remote control.

It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.

Press RETURN now to start recording.
................................................................................

Please enter the name for the next button (press <ENTER> to finish recording)
channel1

Now hold down button "channel1".
Timeout (10 seconds), try again (29 retries left).

Now hold down button "channel1".

Please enter the name for the next button (press <ENTER> to finish recording)


Successfully written config file tv.lircd.conf

Press RETURN now to start recording.のところで、学習するボタンをひたすら押し続ける。

それが終われば、コマンド名に名前をつけて終了。

作成されたconfファイルには、こんな感じになっていました。

      begin raw_codes

          name channel1
             9082    4465     624     508     619     514
              621     514     622     515     621     515
              596     541     621    1645     596     541
              640    1636     588    1671     621    1645
              595    1671     596    1683     585    1671
              594     543     564    1703     566    1703
              593     548     560     571     565     573
              563     571     564     572     564     572
              564     572     563     572     563    1708
              567    1696     564    1702     564    1708
              560    1702     576    1692     565    1700
              565

      end raw_codes

これを、前回と同じように/etc/lirc/lircd.conf.d/tv.confに記入して、lircdを再起動。

これで、コマンドが動くことを確認しました。

こっちのやり方の方が確実かもしれない。

【ラズパイ】lircを使用した赤外線信号のトレースと送信

動いた。😄

lircのインストール

$ sudo apt-get install lirc

/boot/config.txtを書き換える。

今回は受信信号をGPIO21、赤外線LEDをGPIO20に接続しています。

# Uncomment this to enable infrared communication.
dtoverlay=gpio-ir,gpio_pin=21
dtoverlay=gpio-ir-tx,gpio_pin=20

/etc/lirc/lirc_options.confを書き換える。

まずはリモコンの信号を受信してデータを取るので、deviceは/dev/lirc1を記入する。

[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc1

lircdを一時停止。

$ sudo service lired stop

リモコンの信号を読み取る。

以下のコマンドを入力後、リモコンのボタンを押す。

今回は音量UPのボタンを押してみた。

mode2 -d /dev/lirc1 > volup.txt

volup.txtには、いかの様に出力されました。

space 16777215
pulse 9059
space 4508
pulse 632
space 501
pulse 635
space 506
pulse 681
space 455
pulse 682
space 456
pulse 630
space 505
pulse 632
space 505
pulse 584
space 1684
pulse 681
space 455
pulse 584
space 1684
pulse 584
space 1684
pulse 584
space 1684
pulse 585
space 1684
pulse 585
space 1685
pulse 640
space 1581
pulse 689
space 1627
pulse 611
space 524
pulse 611
space 1658
pulse 615
space 523
pulse 615
space 1655
pulse 614
space 522
pulse 615
space 1655
pulse 613
space 1654
pulse 614
space 524
pulse 613
space 527
pulse 609
space 525
pulse 611
space 1658
pulse 588
space 549
pulse 608
space 1660
pulse 589
space 548
pulse 589
space 548
pulse 589
space 1679
pulse 592
space 1677
pulse 590
space 1675
pulse 594
pulse 13407
space 63383
space 40258
pulse 9119
space 2190
pulse 643
pulse 21195
space 121207
space 97010
pulse 9169
space 2141
pulse 688
pulse 22186

このデータの中から、一番最初の

space 16777215

と、後半の

pulse 13407
space 63383
space 40258
pulse 9119
space 2190
pulse 643
pulse 21195
space 121207
space 97010
pulse 9169
space 2141
pulse 688
pulse 22186

の部分は、いらないデータなので削除。

※基本的にpulseから始まり、pulse→space→pulse→・・・と続くので、データの数は必然的に奇数となる。なので、それに当てはまらない部分は余計なデータ。

/etc/lirc/lircd.conf.d/配下に、任意の名前.confでファイルを作成。

$ vi /etc/lirc/lircd.conf.d/tv.conf

ファイルの中身はこんな感じ。

begin remote
 name tv
 flags RAW_CODES
 eps 30
 aeps 100
 gap 200000
 toggle_bit_mask 0x0

 begin raw_codes
 name volup
 9059 4508 632 501 635 506 681 455 682 456 630 505 632 505 584 1684 681
 455 584 1684 584 1684 585 1684 585 1685 640 1581 689 1627 611 524 611 1658 615
 523 615 1655 614 522 615 1655 613 1654 614 524 613 527 609 525 611 1658
 588 549 608 1660 589 548 589 548 589 1679 592 1677 590 1675 594

 name voldown
 9087 4478 609 526 588 550 609 527 588 549 609 526 610 527 608 1659 611
 526 610 1659 608 1658 612 1661 606 1658 608 1660 607 1660 611 526 611 1658 610
 527 609 1659 610 1658 608 1659 609 1662 606 528 608 528 608 530 610 1658
 608 528 608 530 608 526 610 529 608 1658 609 1659 608 1657 610
 end raw_codes
end remote

2行目のnameはファイル名と合わせた方が混乱が少ない。

begin raw_codesの中にname コマンド名を記入し、次の行に信号データのみを羅列。※エディターの置換機能を使えば簡単

赤外線を送信する。

/etc/lirc/lirc_options.confを書き換える。

送信を行うので、lirc0に書き換える。

[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc0

lircdを起動。

$ sudo service lired start

confの中身にエラーがあれば以下のコマンドでエラーが出力される。

$ sudo systemctl status lircd.service

以下のコマンドで作成したファイルが見えればOK。

$ irsend LIST '' ''

devinput-32
devinput-64
tv

赤外線LEDをテレビに向けて、コマンドを入力する。

$ irsend SEND_ONCE tv volup
$ irsend SEND_ONCE tv voldown

ようやくテレビが反応してくれました。

参考にしたサイト。

https://deviceplus.jp/hobby/entry_y18/

【ラズパイ】リモコンの赤外線通信を再現してみる。

まずは、前回のプログラムを元に、以下のようなプログラムを作成しました。

import RPi.GPIO as GPIO
import time

def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21,GPIO.IN)
    try:
        while True:
            out = GPIO.input(21)
            if out == 0:
                print(1)
            else:
                print(0)
            time.sleep(0.0001)
    except KeyboardInterrupt:
        GPIO.cleanup()

__main__()

0.1ミリ秒周期で赤外線通信の受信信号を読み取って、0/1で出力するプログラムを作成してみました。

これを使用して、テレビのボリュームUP/DOWNの信号を読み取って、

こんなプログラムを作成して、赤外線LEDを点灯させるプログラムを作成。

import RPi.GPIO as GPIO
import time

pattern = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,
           0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
           1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1]


def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(20,GPIO.OUT)
    try:
        for out in pattern:
            GPIO.output(20, GPIO.HIGH)
            time.sleep(0.0001)
        GPIO.output(20, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
    GPIO.cleanup()

__main__()

import RPi.GPIO as GPIO
import time

pattern = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
           0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,
           0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
           0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,
           1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1]


def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(20,GPIO.OUT)
    try:
        for out in pattern:
            GPIO.output(20, GPIO.HIGH)
            time.sleep(0.0001)
        GPIO.output(20, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
    GPIO.cleanup()

__main__()

これで、リモコンの信号を再現できるはず!

そう思っていましたが、

テレビは何も反応しませんでした。

やっぱり考えは甘かったか。

そこで、ネットの情報を探してみると、

こんなサイトを見つけました。

https://deviceplus.jp/hobby/entry_y18/

リモコンの信号を読み取って、再現するライブラリがラズパイにあるらしい。

しかも、このサイトの中では、音声でテレビをコントロールしようともしている。

ならばこっちは、最終的にAlexaでコントロールできるようにしてしまおうか。

できるよね?

知らんけど。

いろいろ調べてみる。

【ラズパイ】リモコンの赤外線を受信してみる。

赤外線受信モジュールの出力をGPIO21番に接続し、

以下の様にプログラムを組んでみました。

import RPi.GPIO as GPIO
import time
import datetime

def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21,GPIO.IN)
    GPIO.add_event_detect(21, GPIO.BOTH, callback=callback)
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        GPIO.cleanup()

def callback(channel):
    print(str(GPIO.input(21)) + " " + datetime.datetime.now().isoformat())

__main__()

GPIO21の信号が変わったタイミングで割り込みを発生し、そのときの出力値と時間を標準出力で表示させます。

ただ、このテレビのリモコン、電源ボタンを押しっぱなしにしないと信号が出ないみたいで、

で、なおかつ、押しっぱなしにすると信号が出続けるもので。

0 2020-11-24T10:14:30.712150
1 2020-11-24T10:14:30.718138
0 2020-11-24T10:14:30.765131
1 2020-11-24T10:14:30.765352
0 2020-11-24T10:14:30.804348
1 2020-11-24T10:14:30.812659
0 2020-11-24T10:14:30.817313
1 2020-11-24T10:14:30.817765
0 2020-11-24T10:14:30.818497
1 2020-11-24T10:14:30.818897
0 2020-11-24T10:14:30.819593
1 2020-11-24T10:14:30.820053
0 2020-11-24T10:14:30.820533
1 2020-11-24T10:14:30.821233
0 2020-11-24T10:14:30.821634
1 2020-11-24T10:14:30.822347
0 2020-11-24T10:14:30.822964
1 2020-11-24T10:14:30.823503
0 2020-11-24T10:14:30.824101
1 2020-11-24T10:14:30.824575
0 2020-11-24T10:14:30.826361
1 2020-11-24T10:14:30.826822
0 2020-11-24T10:14:30.827364
1 2020-11-24T10:14:30.827968
0 2020-11-24T10:14:30.829730
1 2020-11-24T10:14:30.830241
0 2020-11-24T10:14:30.832033
1 2020-11-24T10:14:30.832501
0 2020-11-24T10:14:30.834314
1 2020-11-24T10:14:30.834766
0 2020-11-24T10:14:30.836554
1 2020-11-24T10:14:30.837033
0 2020-11-24T10:14:30.838794
1 2020-11-24T10:14:30.839353
0 2020-11-24T10:14:30.841086
1 2020-11-24T10:14:30.841601
0 2020-11-24T10:14:30.842042
1 2020-11-24T10:14:30.842722
0 2020-11-24T10:14:30.844382
1 2020-11-24T10:14:30.845010
0 2020-11-24T10:14:30.845743
1 2020-11-24T10:14:30.846213
0 2020-11-24T10:14:30.847861
1 2020-11-24T10:14:30.848455
0 2020-11-24T10:14:30.849055
1 2020-11-24T10:14:30.849573
0 2020-11-24T10:14:30.850183
1 2020-11-24T10:14:30.850725
0 2020-11-24T10:14:30.852405
1 2020-11-24T10:14:30.852972
0 2020-11-24T10:14:30.853503
1 2020-11-24T10:14:30.854129
0 2020-11-24T10:14:30.854628
1 2020-11-24T10:14:30.855277
0 2020-11-24T10:14:30.855717
1 2020-11-24T10:14:30.856376
0 2020-11-24T10:14:30.858106
1 2020-11-24T10:14:30.858635
0 2020-11-24T10:14:30.859222
1 2020-11-24T10:14:30.859775
0 2020-11-24T10:14:30.861550
1 2020-11-24T10:14:30.862049
0 2020-11-24T10:14:30.863799
1 2020-11-24T10:14:30.864357
0 2020-11-24T10:14:30.864821
1 2020-11-24T10:14:30.865492
0 2020-11-24T10:14:30.867127
1 2020-11-24T10:14:30.867739
0 2020-11-24T10:14:30.869522
1 2020-11-24T10:14:30.870102
0 2020-11-24T10:14:30.871770
1 2020-11-24T10:14:30.872296
0 2020-11-24T10:14:30.912677
1 2020-11-24T10:14:30.921864
0 2020-11-24T10:14:30.923867
1 2020-11-24T10:14:30.924497
0 2020-11-24T10:14:30.972354
1 2020-11-24T10:14:30.981305
0 2020-11-24T10:14:30.985768
1 2020-11-24T10:14:30.986297
0 2020-11-24T10:14:30.986901
1 2020-11-24T10:14:30.987434
0 2020-11-24T10:14:30.987902
1 2020-11-24T10:14:30.988581
0 2020-11-24T10:14:30.989105
1 2020-11-24T10:14:30.989750
0 2020-11-24T10:14:30.990292
1 2020-11-24T10:14:30.990898
0 2020-11-24T10:14:30.991490
1 2020-11-24T10:14:30.992017
0 2020-11-24T10:14:30.992618
1 2020-11-24T10:14:30.993143
0 2020-11-24T10:14:30.994968
1 2020-11-24T10:14:30.995415
0 2020-11-24T10:14:30.995996
1 2020-11-24T10:14:30.996558
0 2020-11-24T10:14:30.998247
1 2020-11-24T10:14:30.998835
0 2020-11-24T10:14:31.000531
1 2020-11-24T10:14:31.001089
0 2020-11-24T10:14:31.002897
1 2020-11-24T10:14:31.003358
0 2020-11-24T10:14:31.005463
1 2020-11-24T10:14:31.005794
0 2020-11-24T10:14:31.007627
1 2020-11-24T10:14:31.007885
0 2020-11-24T10:14:31.009823
1 2020-11-24T10:14:31.010188
0 2020-11-24T10:14:31.010786
1 2020-11-24T10:14:31.011313
0 2020-11-24T10:14:31.013177
1 2020-11-24T10:14:31.013577
0 2020-11-24T10:14:31.014196
1 2020-11-24T10:14:31.014723
0 2020-11-24T10:14:31.016505
1 2020-11-24T10:14:31.016988
0 2020-11-24T10:14:31.017615
1 2020-11-24T10:14:31.018132
0 2020-11-24T10:14:31.018801
1 2020-11-24T10:14:31.019244
0 2020-11-24T10:14:31.021049
1 2020-11-24T10:14:31.021532
0 2020-11-24T10:14:31.022264
1 2020-11-24T10:14:31.022711
0 2020-11-24T10:14:31.023231
1 2020-11-24T10:14:31.023825
0 2020-11-24T10:14:31.024497
1 2020-11-24T10:14:31.024954
0 2020-11-24T10:14:31.026808
1 2020-11-24T10:14:31.027232
0 2020-11-24T10:14:31.027891
1 2020-11-24T10:14:31.028356
0 2020-11-24T10:14:31.030251
1 2020-11-24T10:14:31.030616
0 2020-11-24T10:14:31.032629
1 2020-11-24T10:14:31.032920
0 2020-11-24T10:14:31.033644
1 2020-11-24T10:14:31.034099
0 2020-11-24T10:14:31.035998
1 2020-11-24T10:14:31.036321
0 2020-11-24T10:14:31.038409
1 2020-11-24T10:14:31.038591
0 2020-11-24T10:14:31.040637
1 2020-11-24T10:14:31.040889
0 2020-11-24T10:14:31.085001
1 2020-11-24T10:14:31.090315
0 2020-11-24T10:14:31.142103
1 2020-11-24T10:14:31.143617
0 2020-11-24T10:14:31.317687
1 2020-11-24T10:14:31.317986
0 2020-11-24T10:14:31.320925
1 2020-11-24T10:14:31.321246
0 2020-11-24T10:14:31.321999
1 2020-11-24T10:14:31.322382
0 2020-11-24T10:14:31.324284
1 2020-11-24T10:14:31.324646
0 2020-11-24T10:14:31.325373
1 2020-11-24T10:14:31.325785
0 2020-11-24T10:14:31.326453
1 2020-11-24T10:14:31.326927
0 2020-11-24T10:14:31.327589
1 2020-11-24T10:14:31.328064
0 2020-11-24T10:14:31.329898
1 2020-11-24T10:14:31.330335
0 2020-11-24T10:14:31.330809
1 2020-11-24T10:14:31.331572
0 2020-11-24T10:14:31.333278
1 2020-11-24T10:14:31.333753
0 2020-11-24T10:14:31.335543
1 2020-11-24T10:14:31.336043
0 2020-11-24T10:14:31.336674
1 2020-11-24T10:14:31.337190
0 2020-11-24T10:14:31.338941
1 2020-11-24T10:14:31.339489
0 2020-11-24T10:14:31.341160
1 2020-11-24T10:14:31.341743
0 2020-11-24T10:14:31.343484
1 2020-11-24T10:14:31.343990

たぶん、この中に電源の信号パターンがあり、繰り返し送信されているものかと。

それと、この信号を再現させるために、大体0.1ミリ秒ごとに0/1のパターンデータを作成して、送信するっていう形の方が良いのかな。

ちょっとこれを元に考えてみます。

【ラズパイ】赤外線受信を試してみる。

前回は赤外線LED(送信側)を試しましたが、

今回は受信機側を試してみたいと思います。

ドキュメントにこう書いてありました。

受信部に向かって左から出力、GND、VCCということなので、

こういう回路を組んでみました。

出力に発行ダイオードと抵抗を繋げました。

この状態ではなにも信号は与えていませんが、

LEDが点灯しているのは、

この図を見ると、信号を受信したときに出力がHigh→Lowとなるようです。

試しに、エアコンのリモコンの信号を受信機に当ててみたいと思います。

微妙ですが変化があるようですね。

じゃあ、次はこの信号を読み取るプログラムを書いてみますか。

赤外線LED、レシーバを購入しました。

右が赤外線LED、左側が赤外線受信機です。

梅沢無線で買ってきました。

この二つがあれば、赤外線通信ができるはずです。

はい、今度は赤外線をやってみたいと思います。

目指すところは、テレビのリモコンの赤外線を受信機でトレースし、その信号を再現してテレビを操作しちゃおうと考えています。

で、まずは赤外線LED(信号送信側)を試してみようと思うのですが、

例によって、「抵抗は必要なのか?」という疑問が出てきます。

はい、過去に発光ダイオードを抵抗なしで電圧かけたことによって、発光ダイオードを破壊したことがあります。

初心者あるあるですよね??

秋月電子のオンラインショップのページにデータシートなどが掲載されているので、これを確認すると、

https://akizukidenshi.com/catalog/g/gI-03261/

やはり抵抗が必要なようです。

では、何Ωの抵抗が必要なのか。

計算式は、

(V - VF) ÷ IF = Ω

データシートからこの公式に当てはめると、

(5 - 1,6) ÷ 0.1 = 34Ω

手持ちにある20Ωの抵抗を1~2個使えば大体近い値になりそうです。

で、回路を組んでみた。

電圧をかけてみる。

抵抗2個の場合。

抵抗1個の場合。

肉眼では分かりませんが、スマホのカメラを通してみてみると、赤外線LEDの先っちょが赤く光っているのが分かると思います。

写真では1個と2個で違いが分かりませんが、実際にスマホのカメラのプレビュー画面を見てみると、1個の方が光が強いように見えます。

今回は入力を5V一定にしましたが、これをプログラマブルなパルス信号にすると、リモコンの赤外線通信を再現できると思います。

ラズパイ 400(Raspberry Pi 400)が普段使いできるPCになるわけないだろう。

自分、ラズパイ4を使用しているが、この記事には唖然とした。

そりゃ、サイトとしてはラズパイを持ち上げざるを得ないかもしれないけどさぁ。

そもそも、CPUは他のPCと比べて遙かに劣っている。

ラズパイで動作しているOSやアプリケーションはラズパイ用に最適化・軽量化しているので、そんなマシンでPCが使用しているようなアプリがまともに動くわけがない。

Webツールも然りである。ブラウザ自体が軽量化されているので、まともにJSが動く保証はない。

それでもラズパイ4でだいぶマシになった方だけれども。

ただ、ラズパイ4で電子工作を行う場合としては、遙かに魅力的なマシンである事には間違いない。

【ラズパイ】【カメラ】クライアントを閉じたら動画撮影を終了する

前回のままだと、クライアント側(ブラウザ)を撮影中に閉じてしまうと、動画撮影を終了する人がいなくなってしまいます。

これを防ぐためには、クライアントが生存していることを常に確認する処理が必要になります。

まぁ、今回はプレビュー画面で常にデータのやりとりを行っているので、これを利用しましょう。

    def do_GET(self):
        parsed = urlparse(self.path)
        if parsed.path == '/Streaming':
            global lasttime
            lasttime = time.time()

            enc = sys.getfilesystemencoding()

プレビュー画をリクエストがあったら、その時間を記憶しておきます。

def videoCapture():
    global capture
    global out

    while capture:
        nowtime = time.time()
        if nowtime - lasttime > 10:
            capture = False
            out.release()
            out = None
            break
        _, img = cap.read()
        out.write(img)

ビデオキャプチャーの周期処理の中で、現在時刻と、プレビュー画要求時の時刻を比較します。

周期処理の時刻がキャプチャー時の時刻より10秒経過していたら撮影を終了します。

ブラウザを撮影途中で閉じた場合、プレビュー画要求時の時刻が更新されなくなりますので、こうすることで、ブラウザを閉じてから10秒後に撮影は終了します。

さて、カメラでやりたいことが終わってしまった・・・

次何しようかな。