質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

JSONに保存した赤外線データを使って赤外線照射したいのですが、エラーが出てできません。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 614

KRSugar

score 16

前提・実現したいこと

Raspberry Pi と大宮技研さんのIRMagician を使って、赤外線リモコンを作っています。

赤外線の周波数などをjsonで記録するところまではいいたのですが、照射することができません。
以下のPython3コードで実行してみました。どのようにすればいいのでしょうか

(大宮技研様のサンプルコードを参考にさせていただきました http://www.omiya-giken.com/?page_id=1231)

発生している問題・エラーメッセージ

======================== RESTART: /home/pi/IRplay.py ========================
Usage: # python /home/pi/IRplay.py filename
Traceback (most recent call last):
  File "/home/pi/IRplay.py", line 24, in <module>
    ser.write("n,%d\r\n" % recNumber)
  File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 518, in write
    d = to_bytes(data)
  File "/usr/lib/python3/dist-packages/serial/serialutil.py", line 63, in to_bytes
    raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: 'n,472\r\n'

該当のソースコード

import sys
import serial
import time
import json
import urllib3
from time import sleep

while True:
        ser = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)
        #ser = serial.Serial("/dev/tty.usb0121", 9600, timeout = 1)
        ser.readline()

        argvs = sys.argv
        argc = len(argvs)
        if (argc != 2):
                print ('Usage: # python %s filename' % argvs[0])

        json_data = {"postscale": 100, "freq": 38, "data": [112, 1, 49, 15, 4, 4, 5, 4, 5, 4, 9, 4, 5, 4, 5, 4, 9, 4, 4, 4, 8, 4, 5, 4, 5, 4, 9, 4, 8, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 5, 4, 9, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 8, 4, 9, 4, 5, 4, 5, 4, 72, 19, 110, 12, 33, 15, 4, 4, 4, 4, 4, 4, 8, 5, 4, 4, 5, 4, 9, 4, 4, 4, 8, 4, 5, 4, 5, 4, 9, 4, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 9, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 9, 4, 9, 4, 5, 4, 5, 4, 104, 15, 4, 4, 5, 4, 5, 4, 9, 4, 4, 4, 5, 4, 9, 4, 4, 4, 8, 4, 5, 4, 5, 4, 9, 4, 9, 4, 5, 4, 5, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 8, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 8, 4, 9, 4, 5, 4, 5, 4, 105, 15, 4, 4, 5, 4, 9, 4, 5, 4, 4, 4, 8, 4, 9, 4, 5, 4, 8, 4, 5, 4, 5, 4, 9, 4, 9, 4, 5, 4, 5, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 9, 4, 5, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 8, 4, 10, 22, 112, 9, 209, 15, 5, 4, 9, 4, 4, 4, 4, 4, 5, 4, 9, 4, 9, 4, 4, 4, 9, 4, 5, 4, 5, 4, 9, 4, 9, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 9, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 4, 9, 4, 9, 4, 121, 74, 52, 66, 61, 61, 68, 45, 79, 37, 93, 17, 5, 4, 9, 4, 9, 4, 9, 4, 4, 4, 4, 4, 8, 4, 5, 4, 9, 4, 5, 4, 5, 4, 9, 4, 9, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 9, 4, 5, 4, 5, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 9, 4, 5, 4, 99, 72, 54, 67, 61, 56, 69, 48], "format": "raw"}

        recNumber = len(json_data['data'])
        rawX = json_data['data']

        ser.write("n,%d\r\n" % recNumber)
        ser.readline()

        postScale = json_data['postscale']
        ser.write("k,%d\r\n" % postScale)
#time.sleep(1.0)
        ser.readline()

        for n in range(recNumber):
                bank = n / 64
                pos = n % 64
                if (pos == 0):
                        ser.write("b,%d\r\n" % bank)

                ser.write("w,%d,%d\n\r" % (pos, rawX[n]))

        ser.write("p\r\n")
        ser.readline()

ser.close()

補足情報(FW/ツールのバージョンなど)

Raspberry Pi W です。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

ser.write関数にはbyte型を渡す必要があります。
python3環境で実行している場合は"n,%d\r\n" % recNumberstr型なので提示エラーが発生しています。~.encode()byte型に変換するとよいでしょう。
参考:python3 pySerial TypeError: unicode strings are not supported, please encode to bytes:

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • JSONに関する質問
  • JSONに保存した赤外線データを使って赤外線照射したいのですが、エラーが出てできません。