2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイ Zero W の本体温度を調べる【vcgencmd のインストール @ RaspberryPi OS Lite】

Last updated at Posted at 2022-08-29

RaspberryPi ZeroW で本体の測定温度を知りたい。しかし、RaspberryPi OS Lite (Buster) には vcgencmd コマンドがない

view temperature raspberry pi」でググっても「vcgencmd を使え」という記事ばかりで、vcgencmd コマンドを実行しようにも「コマンドが見つかりません」エラーが出ます。しかも、apt search vcgencmd して検索しても出てこないので、自分のググラビリティとして。

TL; DR (今北産業)

  1. RaspberryPi OS Lite・・・・ には、vcgencmd コマンドは含まれていない。

  2. libraspberrypi-binlibraspberrypi0 を再インストールすると入る。

  3. マスター、BIN ごとくれ。

    sudo apt-get --reinstall install libraspberrypi-bin
    sudo apt-get --reinstall install libraspberrypi0
    
  • 本体温度を取得したいだけで、RPi Zero なので容量などの問題から apt で色々と余分なパッケージをインストールしたくない人は、簡単な自作アプリをビルドして取得してみるのもアリだと思います。アプリは 70KB 程度のサイズです。
  • 併せて読みたい
    • ラズパイ3B+をUSBブートしたい @ Qiita
      ラズパイを Ubuntu で使うも、カーネルに含まれていない(ユーザーランドの)ラズパイ専用ドライバ類が必要な場合の参考に。

TS; DR (kwsk)

基本的に vcgencmd コマンドは libraspberrypi-bin パッケージに含まれています。しかも、libraspberrypi-bin パッケージはデフォルトで Raspberry Pi OS(旧 Raspbian)にインストールされています。

ところが、vcgencmd コマンドはラズパイの VideoCore GPU の情報を取得するためのコマンドであるため、GUI なしの Lite 版には肝心の vcgencmd コマンドはインストールされません

では、libraspberrypi-bin パッケージを入れ直せば良いかというとダメで、vcgencmd は入るものの、コマンドがハードウェアにアクセスするのに必要な ARM 用のドライバが足りません。つまり、ARM チップに対応した libvchiq_arm.soもさらに必要です。

Raspberry Pi Zero 用の libvchiq_arm.so ファイルは libraspberrypi0 パッケージに含まれているので、libraspberrypi0 パッケージも再インストールします。

これにより /opt/vc 下に必要なモジュール(.so ファイル)一式が入ります。

libvchiq_arm.so のソースコードは、以下のリポジトリから参照できます。

Raspberry Pi 用のカーネル、モジュール、Userland ライブラリ、ブートローダー、GPU ドライバ(ファームウェア)などもあります。

とはいえ、libraspberrypi-binlibraspberrypi0 で、ラズパイ用のハードウェア関連の大半のコマンドとドライバがインストールされます。


問題を見つけるまでのログ(手順)はこちら。

コマンドが見つかりません
$ vcgencmd measure_temp
-bash: vcgencmd: コマンドが見つかりません

$ /opt/vc/bin/vcgencmd measure_temp
-bash: /opt/vc/bin/vcgencmd: そのようなファイルやディレクトリはありません

$ /usr/bin/vcgencmd
-bash: /usr/bin/vcgencmd: そのようなファイルやディレクトリはありません
libraspberrypi-binパッケージは入っている
$ apt search libraspberrypi-bin
ソート中... 完了
全文検索... 完了  
libraspberrypi-bin/oldstable,now 1:1.20220308~buster-1 armhf [インストール済み]
  Miscellaneous Raspberry Pi utilities

libraspberrypi-bin-dbgsym/oldstable 2+git20211125~155417+14b90ff-1~buster armhf
  debug symbols for libraspberrypi-bin
libraspberrypi-binパッケージを再インストールするも.soがないそうです
$ sudo apt-get --reinstall install libraspberrypi-bin
** snip **
取得:1 http://archive.raspberrypi.org/debian buster/main armhf libraspberrypi-bin armhf 1:1.20220308~buster-1 [342 kB]
342 kB を 2秒 で取得しました (189 kB/s)      
(データベースを読み込んでいます ... 現在 50400 個のファイルとディレクトリがインストールされています。)
.../libraspberrypi-bin_1%3a1.20220308~buster-1_armhf.deb を展開する準備をしています ...
libraspberrypi-bin (1:1.20220308~buster-1) で (1:1.20220308~buster-1 に) 上書き展開しています ...
libraspberrypi-bin (1:1.20220308~buster-1) を設定しています ...

$ vcgencmd measure_temp
vcgencmd: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory

libvchiq_arm.so は、何なのか調べると、以下の公式リポジトリがヒットしました。

リポジトリを見ると、Raspberry Pi OS のファームウェアのうち、userland で動作するモジュール(カーネルにデフォルトで同梱されない .so ファイル)で、VideoCore(GPU)に関連するもの(/opt/vc/ に設置されるもの)のようです。

では、どのパッケージに、これらモジュール(/opt/vc, libvchiq_arm.so)が含まれているのか探してみました。すると、ラズパイの公式フォーラムに別件で「libvchiq_arm.so をインストールしたい」というケースを見つけました。

どうやら、外付け SSD を USB ブートする際にも libvchiq_arm.so を求められるようで、libraspberrypi0 のパッケージに含まれているっぽい。情報をみると、確かにそれっぽい。

libraspberrypi0のパッケージ情報
$ sudo apt info libraspberrypi0
Package: libraspberrypi0
Version: 1:2+git20230322~143557+9d5250f-1
Priority: optional
Section: libs
Source: raspberrypi-userland
Maintainer: Serge Schneider <serge@raspberrypi.org>
Installed-Size: 542 kB
Depends: raspberrypi-bootloader, libc6 (>= 2.17)
Homepage: https://github.com/raspberrypi/userland
Download-Size: 167 kB
APT-Sources: http://archive.raspberrypi.org/debian bullseye/main armhf Packages
Description: Libraries for the Raspberry Pi's VideoCore IV
 This package contains MMAL and other libraries for the Raspberry Pi's
 VideoCore IV multimedia processor.
libraspberrypi0パッケージを入れると動きました
$ sudo apt-get --reinstall install libraspberrypi0
** snip **
取得:1 http://archive.raspberrypi.org/debian buster/main armhf libraspberrypi0 armhf 1:1.20220308~buster-1 [847 kB]
847 kB を 4秒 で取得しました (230 kB/s)                               
(データベースを読み込んでいます ... 現在 50400 個のファイルとディレクトリがインストールされています。)
.../libraspberrypi0_1%3a1.20220308~buster-1_armhf.deb を展開する準備をしています ...
libraspberrypi0 (1:1.20220308~buster-1) で (1:1.20220308~buster-1 に) 上書き展開しています ...
libraspberrypi0 (1:1.20220308~buster-1) を設定しています ...

$ vcgencmd measure_temp
temp=51.4'C

専用アプリをビルドしてみる

本体の CPU 温度を取得したいだけなのに、パッケージを使ってインストールすると、余分なコマンドなどもインストールされてしまいます。

そんな時には、オリジナルのソースコードを参考に、measure_temp の機能だけに特化したコマンドを作ると便利です。

gcc がインストールされていない場合は、別途インストールが必要ですが、以下のコードを get_temp.c にテキスト保存し、gcc でコンパイルすれば CPU 温度の取得に特化したアプリが作成できます。

get_temp.c
/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of the copyright holder nor the
      names of its contributors may be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <stdlib.h>

#define DEVICE_FILE_NAME "/dev/vcio"
#define MAJOR_NUM 100
#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *)
#define MAX_STRING 1024
#define GET_GENCMD_RESULT 0x00030080

static int mbox_property(int file_desc, void *buf) {
    int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf);
    if (ret_val < 0) {
        perror("ioctl mbox_property failed");
    }
    return ret_val;
}

static int mbox_open() {
    int file_desc = open(DEVICE_FILE_NAME, 0);
    if (file_desc < 0) {
        perror("Cannot open device file");
        exit(EXIT_FAILURE);
    }
    return file_desc;
}

static void mbox_close(int file_desc) {
    close(file_desc);
}

unsigned gencmd(int file_desc, const char *command, char *result, int result_len) {
    unsigned p[(MAX_STRING >> 2) + 7];
    int i = 0;
    int len = strlen(command);

    if (len + 1 >= MAX_STRING) {
        fprintf(stderr, "gencmd length too long: %d\n", len);
        return -1;
    }

    // Prepare the buffer for the mailbox request
    p[i++] = 0; // size (will be filled later)
    p[i++] = 0x00000000; // process request

    p[i++] = GET_GENCMD_RESULT; // the tag id
    p[i++] = MAX_STRING; // buffer size
    p[i++] = 0; // request length (initially zero)
    p[i++] = 0; // error response (initially zero)

    memcpy(p + i, command, len + 1); // copy the command
    i += (MAX_STRING >> 2); // adjust index

    p[i++] = 0x00000000; // end tag
    p[0] = i * sizeof(*p); // actual size of the message

    // Send the request to the VideoCore and get the response
    mbox_property(file_desc, p);

    // Copy the result from the response
    result[0] = '\0';
    strncat(result, (const char *)(p + 6), result_len);

    return p[5]; // Return the result status (0 on success)
}

int main() {
    int mb = mbox_open();
    char result[MAX_STRING] = {};

    // Send the "measure_temp" command to the VideoCore
    int ret = gencmd(mb, "measure_temp", result, sizeof(result));
    if (ret) {
        printf("Error retrieving temperature: %d\n", ret);
    }

    mbox_close(mb);

    // Output the result
    printf("Temperature: %s\n", result);

    return ret;
}
get_temp アプリのコンパイルと実行例
$ gcc -o get_temp get_temp.c

$ ./get_temp
Temperature: temp=42.9'C

動作環境

いんふぉ
$ # モデル名
$ more /proc/device-tree/model
Raspberry Pi Zero W Rev 1.1

$ # OS バージョン
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?