1. はじめに
この記事は Raspberry Pi5でロボットを自作した記録です。参考にした書籍はkuro 著 技術評論社「RaspberryPiでロボット制作(コミュニケーションロボットSIROの制作日誌」(以後、参考書(SIRO本)と呼びます)です。なお、この書籍は2024年8月発刊ですが、Raspberry Pi4B を土台としており、これをRaspberry Pi5 で構築したいなあと思ったことと、他の電子部品が現在では入手が困難なものもあり、一苦労しましたので記録を残そうと思いました。どなたかの参考となりましたら幸いです。

開発パソコンのブラウザで、ラジコンとして動かしているところです。
2. 背景
2.1. 動機
2025年、ChatGPTを中心とした生成AIは、文章生成能力の飛躍的な向上、エージェント機能やディープリサーチの登場により歴史上類を見ない労働生産性の向上を予感させるものであり、2〜3年前までは誰も思い浮かばなかった事態を引き起こしました。アメリカではなんとホワイトカラーのレイオフが始まりました。
なんとか時代について行かねば!
「次は Physical AI だ」NvidiaのCEO Jenson Huang は語ったそうです。
なら次は Physical AIだ!っということで、まずはロボットを作ることにしました。
前作の記事(AI-OCRを自作しました(2025.2))でも紹介しておりますが、私は現在、とある企業の人事・給与事務の統括をしており、部下の人員削減の一方、業務量の増大に日々頭を抱えている者です。
部下たちを過重労働から救うべく、立ち上がったのです。(まだ1歩目ですけど。。。)
2.2. 開発環境
・Raspberry Pi OS(64-bit) Release Date 1 Oct 2025
・Python 3.15.5
・pip 25.3
・開発用PCの VScode よりSSHでログインし開発
・時々、RealVNCでログイン
・VENVを使用。環境作る際に--system-site-packagesオプションを指定して、プリインストールされているライブラリを使用可能にしました。
2.3. ハード
・モータードライバー DEV8835使用ステッピング&DCモータードライバーモジュール
・走行モーター CHANCS MOTOR社のN2Oモーター(DC3V,35RPM)
・超音波センサ HC-SR04
・温湿度センサ BME280
3. ハマったところ
3.1. モーター
まず最初に、モーターは参考書(SIRO本)ズバリのものは手に入らなかったのですが、Amazonでそれらしいものがありましたので、それを注文しました。
CHANCS MOTOR社のN2Oモーター(DC3V,35RPM)です。
なかなか届かないねー、と思っていた矢先、しわくちゃの紙袋に入って国際郵便で送ってきました。深セン市だ。しまった。
そう思いつつも逸る気持ちは押されえれず、コードとコンデンサをはんだ付けしました。
モータードライバにつなぎ、テストプログラムRUN。
えっ、片側は回転しているけど、もう片方がブルブル震えるだけ。
うわー。やられた。。。海外から届いたものを返品するにはどうするんだっけ。。。Amazon嫌い!と本気で思いました。
ハンダ付けしてしまったので、返品は不可と思われます。諦めて、電子部品ショップを探すことにしました。
なんと近所に老舗のショップ「カホパーツセンター」がある。すぐに駆けつけました。
値段もそう変わらず、同じようなモーター(ただし6V)がありましたので早速購入しました。
ちなみにそのとき店内でかかっていたラジオの内容が面白くて、後日、なんの番組か調べました。
新しく買ってきたモーターをつないでRUN。同じ症状!!!
やってしまった。。。余計な買い物をしてしまった。。。
試行錯誤の結果、モーターもモータードライバもどこも悪くなく、私がつなぎ間違えているだけでした。
ゴメンナサイ。(平身低頭)
【教訓】
届いたら、まずは動作確認をする。
見た目で判断しない。
3.2. モータードライバー
これはAmazonでは手に入りませんでした。そこで「カホパーツセンター」へ買いに行きました。
ありましたよ。DRV8835が!
参考書(SIRO本)で使っているPOLOLU社のものではありませんでしたが、ありました。
早速家に帰り、組み立てようとして唖然。。。
参考書(SIRO本)では、左側がIN側なのですが、買ってきたチップは右側がIN側でした。
上下ひっくり返せばいいやん、と慣れた人なら思うのでしょうが、ピンの順番が参考書(SIRO本)と違うため、ラズパイのどのピンを、DRV8835のどのピンにつなぐということを本気で理解する必要が生まれました。
勉強になりました!天神様に感謝!
【教訓】
ちゃんと仕様書を理解すること
3.3. バッテリー
ロボットが自由に行動するためには、バッテリーは命でしょう。しかしながらこれをしくじりました。
Raspberry Pi5は、5V-5Aの電源供給が必要です!
そんな大電力を供給できるバッテリーは現在存在しないに等しい。。。というのをRaspberry Pi5を買ったあとに知りました。
Raspberry Pi4Bならば 5V-3Aで動くらしい。その出力なら購入可能なバッテリーがある。
Pi4Bにすれば良かったのか。。。いや、そんな根性ではつまらん!
そのうち5V-5Aのバッテリーが出るか、別の解決策が見つかるであろうと未来に期待して現在は電源ケーブルにて動かしています。
3.4. スピーカー
参考書(SIRO本)では、ミニプラグでスピーカーとRaspberry Piを接続していたのですが、私が購入したRaspberry Pi5ではミニプラグが廃止されています。。。またやってしまった。。。
そこで困ったなぁと思っていたら、近くのホームセンターで、ミニBluetoothスピーカーが在庫処分品として売られていたので即GET!
ケガの功名でスピーカーを外出しできるのは良かったと思います。
なぜなら、配線に悩まなくてもいいし、本体を軽量化できるからです。
3.5. Open JTalk
皆様はご存じだと思いますが、私は初めて知ったので、ご紹介します。
ロボットをしゃべらせるのに、名古屋工業大学が開発した音声合成ソフト「Open JTalk」を使用します。バージョンは1.11-5です。
open-jtalk本体と、mecab、音声データは、参考書(SIRO本)に紹介されたやり方で難なくインストールできました。
しかしながら、テストプログラムで「おはようございます。」と発声させようとすると、次のようなエラーが出ます。
再生中 raw データ '/tmp/siro_openjtalk.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
numid=3,iface=MIXER,name='Master Playback Volume'
; type=INTEGER,access=rw------,values=2,min=0,max=65536,step=1
: values=19661,19661
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: text2mecab() in text2mecab.c: Wrong character.
WARNING: JPCommonLabel_make() in jcomon_label.c: No phoneme.
Error: waveform cannot be synthesized.
open-jtalk と mecabのバージョンが合っていないの?
強引にインストールした訳ではなく、ちゃんと apt でインストールしたので問題ない筈なのですが。。。
解決には相当苦しみました。(ソースをダウンロードしてきてコンパイルするなどしたが改善しませんでした。)
結局、この時点では解決できず、しばらく保留して他の機能導入に進むことにしました。
後日、理由が分かりました!! 本当にマヌケな理由でした。。。(後述の Juliusでその理由が分かります。)
3.6. Julius
音声認識には名古屋工業大学、京都大学が開発した音声認識ソフト「Julius」を使用しています。
「ジュリアス」と呼ぶのが正しいのでしょうか?個人的には「ジュリアス・シーザー(ユリウス・カエサル)」に引っ掛けたネーミングセンスにツボっていまして、「ユリウス」と呼んでしまいます。
参考書(SIRO本)ではソースコードをダウンロードしてきてコンパイルして導入します。参考書(SIRO本)ではバージョン4.5をインストールしていますが、ここはあえて最新バージョン4.6をインストールしました。
やはりハマりました。
【その1】
テストプログラムを走らせると、次のエラーを吐きます。
SyntaxError: Non-UTF-8 code starting with '\xa4' in file /home/jupit/SIRO_PROJ/SIRO_test_voice_recognition.py on line 58, but no encoding declared; see https://peps.python.org/pep-0263/ for details
テストプログラム SIRO_test_voice_recognition.py の58行目に、得体のしれない'\xa4'という文字がいる??
ここって
if('おはよう' in words[i][0] and float(words[i][1]) > 0.9):
ってコードなんですが、「おはよう」を変な文字コードで見ているってこと??
はっと閃きました!
SIRO_test_voice_recognition.pyの文字コードを調べると、EUC-JPとなっていました!!
じゃあ、なんでそうなった!?
そうです、ロケールの文字セットをうっかり、EUP-JPとしていました。
Control Centreで文字セットを UTF-8 に変えSIRO_test_voice_recognition.pyをnkfでUTF-8に変えると正常に稼働するようになりました。
そして、mecabも正常に稼働するようになり、open-jtalkも正常に稼働するようになりました。
【教訓」
基本動作の徹底
【その2】
juliusを複数の辞書(GRAM1~GRAM16)で動かすと、Segmentation faultで落ちる。
./julius_module.sh: 26 行: 2546 Segmentation fault julius -C $AM -n 3 -rejectshort 500 -lv 2000 -zc 25 -zmean -48 -input pulseaudio -nostrip -lmp 10 5 -lmp2 10 5 -gram $GRAM1,$GRAM2,$GRAM3,$GRAM4,$GRAM5 -gram $GRAM6,$GRAM7,$GRAM8,$GRAM9,$GRAM10 -gram $GRAM11,$GRAM12,$GRAM13,$GRAM14,$GRAM15 -gram $GRAM16 -module
試しに、GRAM1だけで動かすと正常に稼働する。
参考書(SIRO本)で使用しているバージョン4.5では16個の辞書で稼働するようですが、手前がインストールしたバージョン4.6では仕様が変わって正常に稼働しないということでしょうか?
そのへんは分からなかったので、辞書(.voca、.grammar)を統合してそれぞれ一つにしました。
(なお、カテゴリで重複があると次のmkdfa.plでエラーを吐くので重複するものは間引く必要があります)
そして、mkdfa.plを走らせてdictファイル等を作成します。
そうすると正常に稼働しました。
3.7. 温湿度センター
参考書(SIRO本)では、Adafruit社のBME280を使っていますが、同じものが手に入らなかったので、Neyzo社のBME280をAmazonで購入しました。
pipで smbus2 と python-BME280 をインストールして、次のようなコードを書けば使えます。
import time
import smbus2
import bme280
port = 1
address = 0x76
bus = smbus2.SMBus(port)
calibration_params = bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address, calibration_params)
temp = 0.0
humid = 0.0
temp_offset = -2.1
humid_offset = 2.0
WBGT = 0.0
try:
while True:
temp = data.temperature + temp_offset
humid = data.humidity + humid_offset
WBGT = 0.725*temp + 0.0368*humid + 0.00364*temp*humid - 3.246
print("temp:{:.1f}".format(temp))
print("humid:{:.1f}".format(humid))
print("WBGT:{:.1f}".format(WBGT))
time.sleep(3)
except KeyboardInterrupt as reigai:
print("Ctrl C......")
finally:
print("SIRO stopping......")
4. そのほか有益情報
4.1. OpenCVについて
(1)インストールについて
参考書(SIRO本)では、OpenCVのインストール方法が記載されていませんが apt でインストールできます。
$sudo apt install python3-opencv
(2)カスケード分類機について
参考書(SHIRO本)で紹介されていますが、OpenCVにはカスケード分類器(機械学習モデル)が用意されており、GitHubからダウンロードできます。
opencv
opencv/data/haarcascades/というフォルダにあります。
今回は、この中の haarcascade_frontalface_alt.xml を使用して、顔(の正面映像)から被写体(ヒト)の分類を行いました。
5. まとめ
(1)なんとか初歩的な部分については実装できました。
- 「前進」「左」などを言葉で指示すると、そのように動きます
- 私の顔を認識しており、左右に私が動くと、それを追いかけます
- 褒めると「ぴぽ」とR2D2のような喜び声を上げます <-カワイすぎます
- 「今日は何日?」と聞くと、「2025年11月23日」と答えてくれます
- 「気温?」と聞くと、「17.0度、湿度50.1%」と答えてくれます
- 手元のスマホでWIFI越しに操作できます
(2)今後はさらに次のような機能の実装を行いたいです。
- Juliusの代わりに OpneAI Whisper を使ってみる
- LLMと連動して言葉のキャッチボールができるようにする
- アームを追加し物を持ってくる
- 画像認識をもとに自分の進路を決めさせる
あげればキリがありませんし、難しそうですが考えるだけで面白そうです。
折角学んだ DeepLearningや統計モデルを活用し放題な気がします。
ちなみにロボットの名前をまだ決めていません。「ロボットといえば」というので浮かんだ名前
- アトム
すでに壮大なプロジェクトが稼働しており、私のレベルでアトムを名乗るのはおこがましいです - ドラえもん
すごく好きなのですが、すごくファンが多く、中途半端なものを作ったらミリオネアレベルで非難ゴーゴーな気がしますので、辞退します - アナライザー
私の科学への憧憬の原点「宇宙戦艦ヤマト」に敬意を表したい気持ちを形にするという意味でアナライザーにしようかな?と思いましたが、アナライザーには重大な欠陥(所謂セクハラ癖)があるのでこれもパスかなあ
名前が決まって、面白い機能を実装したらまた記事を書きます。
以上
参考文献
【Raspberry Piでロボット制作】
https://gihyo.jp/book/2024/978-4-297-14315-2
【Open JTalk】
https://open-jtalk.sp.nitech.ac.jp
【Julius】
https://github.com/julius-speech
【OpenCV】
https://github.com/opencv/opencv

