スマートホーム構築記

IoTの恩恵を受けたいけど家庭用はなかなか出てこない。なら作ろうというブログ

Rasberry Pi 3でirsendが使えなくなったことに対する対応 【続報】

はじめに

前回の記事でkernelアップグレードに対して/boot以下の設定を書き変えることで使用できるようにしたのですが、
部屋のライトは制御できて,エアコンが制御できない現象が発生しました。

Rasberry Pi 3でirsendが使えなくなったことに対する対応 - 家庭でIoTを実現しよう(Rasberry Pi3 & Jetson Nano)

今回はその対策です。
kernelを書き変えますので同じことをやって起動しなくなる可能性もありますので自己責任にてお願いいたします。
SDカードのバックアップを取ってから実行することをお勧めします。 手順は以下の通りです

  1. OSおよびカーネルを最新版にアップデート
  2. カーネルのソースを一部変更しインストール

環境

項目 内容
バイス Rasberry Pi 3 B+
OS rasbian stretch

今回すべてのコマンドはraspi上で行っています。

OSおよびカーネルのアップデート

既に最新になっている方は読み飛ばしてください。
現在のパッケージを最新版にする。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade

カーネルをstretchの最新版にアップデートする

$ sudo rpi-update

私のrasbianはstretchだったので最新版のbusterに更新します。
/etc/apt/sources.list と/etc/apt/sources.list.d以下のファイルのstretchをbusterに書き変えてください。
書き変え後以下のようにアップグレードします。途中失敗する場合もありますが,upgradeで失敗してもdist-upgradeを実行してください。
どうやらupgradeは一部パッケージの依存関係を解決できないみたいです。
dist-upgradeが成功すれば大丈夫です。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo apt autoremove

一度rebootします。

$ sudo reboot

リブートして以下のコマンドで10.以上の数値が出ればアップデートが正常にできています。

$ cat /etc/debian_version

カーネルのビルド。

公式のドキュメントを参考に実行します。環境に合わせて公式に記載の内容で読み替えてください。 一部ソースの書き換えが入ります。 www.raspberrypi.org

ビルドに必要なパッケージをインストールする。

$ sudo apt-get install git bc bison flex libssl-dev

カーネルのソースをダウンロードする

$ git clone --depth=1 https://github.com/raspberrypi/linux

ソースコードの修正

LIRCのコマンドのバッファーサイズを大きくします。 参考 [Stretch/Buster] Using LIRC with kernel 4.19.X and gpio-ir - Raspberry Pi Forums

@ linux/drivers/media/rc/lirc_dev.c
#define LIRCBUF_SIZE 256 > #define LIRCBUF_SIZE 1024

カーネルのビルド

Raspi3用のコンパイル設定を設定してコンパイルします。

$ cd linux
$ KERNEL=kernel7
$ make bcm2709_defconfig
$ make -j4 zImage modules dtbs

インストール

$sudo make modules_install
$sudo cp arch/arm/boot/dts/*.dtb /boot/
$sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
$sudo reboot

おわりに

お疲れさまでした。以上でirsendでエアコンなどの長い信号も送信できるようになったと思います。
正直全部書き変える必要もないのではと思ったりしているのですが,とりあえず今回はこの方法でうまくいったので記事をまとめました。 一応公式にもこのバグは認識されているとは思うのでそのうち修正されるといいなとは思っていますがとりあえず今は自分で対応するしかありませんね。