TakSan0のアイコン画像
TakSan0 2023年01月26日作成 (2023年05月20日更新) © CC BY 4+
製作品 製作品 閲覧数 17478
TakSan0 2023年01月26日作成 (2023年05月20日更新) © CC BY 4+ 製作品 製作品 閲覧数 17478

ラズパイ化CLOVA-パート1(ガチの改造編)

ラズパイ化CLOVA-パート1(ガチの改造編)

1. はじめに

2022年10月末 衝撃の「LINE Clover アシスタンスサービス終了」の通知が流れました。
なかなか採算が取れないうえに売り上げも減ってきて撤退してしまうのでしょうか?
サービス終了後は Bluetooth スピーカーとしてしか機能しなくなるそうです。
寂しいものです。

スピーカー自体の可愛いキャラクターに愛着がある人もいるし、スピーカーの音質もモノラルとはいえ全方向に聞こえて低音も以外に出て、聞きやすい音で気に入っている人やそのまま使い続けたい人はいるはずです。

発表当時の "#CLOVA " での Tweet 見る限りでは、何とかしてほしいという声が複数流れていました。

というわけで、解決方法の一つのアプローチとして中にラズパイを仕込んで改造してみました。

と言っているうちに、3月30日を迎えとうとうサービス終了してしまいました。

1-1. どこまでできるの?

どこまでできるかは、組み込むソフトウェア次第となりますが、ラズパイ Zero で出来る事は基本的に組み込めます。

まずは、百聞は一見に如かずなので、デモ動画を見ていただければと思います。

ここに動画が表示されます

  • CLOVA 頭部にあるLED やスイッチ類は、全てラズパイ Zeroから制御することが出来ました。
  • Volumio という音楽サーバーソフトを使い、CLOVA をネットワークオーディオとして使ってみる事も検証してみましたができました。
  • ラズパイ経由で Bluetooth スピーカとしてスマホの音楽を鳴らせることも検証済みです。
  • LINE API を組み込んで、声で話した内容を LINE に流したり、 LINE で受信した内容をしゃべらせることもできました。
  • 肝心要のスマートスピーカーとして基本となる会話する機能ですが、AIYキットという製品がラズパイ Zero を使って、Google Assistant 機能で声で話しかけて音声で応答するという事が出来ていましたので、それをベースに検証してみたところできました。

最近は ChatGPT でお馴染みの OpenAI が API を公開したこともあり、皆さん色々と試されているようなので、私もやってみました。

Google SpeechToText でマイクから録音した言葉をテキスト化して OpenAI API で話しをし、その応答を今度は Google TextToSpeech で声に変換して再生する事で、会話することができました。
色々とチューニングが必要そうですが…

それぞれの組み込む手順については、そのうち記事にはしようと思いますが、本記事は分解・改造だけで相当長くなってしまったので、別の記事にしようと考えています。

ここで書いている内容は、はんだ付けを含めた本格的な改造が必要であり難しすぎる為、専用基板を作成して組み立てる形で記事を書き直しています。
ラズパイ化CLOVA-パート2(専用基板編)

2. 分解

工具としては、柄の部分が長い #1 番のドライバー と先の細いピンセット、へら(底面の滑り止めゴムを取る時使う)くらいがあれば十分かと思います。
さらに改造時は半田付けセット(はんだごて、ピンセット、ニッパー、ペンチ等) が必要です
基本的にどのネジがどこについていたがわかるように、小箱等で種類を小分けして分解した順番に並べていく等して、工夫します。

ゴムシールやその他のシールは、再利用やもとに戻すときに使うかもしれないので、残しておくといいです。絨毯の上やごみ・埃がつくと粘着力がなくなり厄介なので、透明の袋の内側に貼っておくといいかと思います。

2-1. 分解手順

底面からアクセスしていきます。

2-1-1. 滑り止めゴム除去

底面に滑り止めのゴムが貼ってありますので、それをはがします。

入口はここから

2-1-2. 透明フィルム除去

さらに透明フィルムが貼ってあるので、それもはがします。

透明フィルムもはがす

2-1-3. 底面ネジ除去

写真の赤▼の位置の4か所ネジを取ります。

底面ネジ位置

2-1-4. 底面を開く

底面は付けたまま、コネクタの口とは反対側に倒すように慎重に開きます。

底面を外す

2-1-5. 底面分離

底面の中央部にフラットケーブルが接続されているので、シールを剥がしてから外します。
先の細いピンセットを爪の下に回り込ませて軽く持ち上げるとロックが外れ、ケーブルを抜くと簡単に取れます。(この時絶対に力を入れない事。抜けないときはロックが外れていません。)

フラットケーブルを外す

ケーブルが外れると底面が分離します。

2-1-6. USB基板除去

USBコネクタ基板の裏にもネジがあるので、写真の赤▼の USBコネクタ基板のネジ位置2か所外して基板をとります。

USB基板ネジ位置

2-1-7. スピーカーカバー分離

写真の赤▼の USBコネクタ基板のネジ位置4か所外してカバーをとります。

スピーカーカバーネジ位置

ネジを外したあと、慎重にゆっくりスライドさせる
分離するとスピーカーの幕がむき出しになるので、傷つけたり破ったりしない様に十分注意が必要です。

スピーカーカバースライド

2-1-8. スピーカー分離

以下2つの写真の赤▼のネジ4か所をはずして分離します。
一番頭に近い奥のネジだけで、手前のものはそのままにします。

分離するともう片方のスピーカーの幕がむき出しになるので、同じ様に十分注意が必要です。

前側
後側

頭部とはスピーカー線でつながっています。
頭部側に貼っているシールをはがすと、コネクタが見えるので外して分離します。

2-1-9. 頭部分離

赤▼の穴の奥にネジがあるので外します。
ここは、穴が深くて見えないうえにネジが長くかなりきつく締めてあるので、ネジを舐めやすいので十分注意が必要です。

頭部固定ネジ位置

ネジを全部外すと頭部の蓋を上向きに引っ張って頭を持ち上げます。マイクケーブルが接続されていて途中までしか上がりませんので、無理やり引っ張らないようにします。

2-1-10. フラットケーブル分離

鼻の裏にあるフロントスイッチ基板を上向きにスライドすると、写真の様に外れてその後ろに隠れているケーブル取付部が見えます。

フロントスイッチ基板の奥

シールを外して、ケーブルを外します。

底面基板接続ケーブルを外す

マイク基板接続ケーブルを外す

頭部カバーが分離します。

頭部カバー分離

2-1-11. バッテリー分離

先ほど外したケーブルと反対側の奥にしたの写真の様な3本線のコネクターがあるので抜き、バッテリー本体を上向きに引っ張ると分離できます。

バッテリーコネクター分離

2-1-12. 基板分離

リアスイッチ・LED基板を上向きにスライドして分離し、さらに下の写真の様にメイン基板を上向きに引っ張ってこれも分離します。

メイン基板分離

パート2で専用改造基板の場合は以下の接続ケーブルを抜く必要ありません。(抜いてももとに戻す必要があるだけですが、一度抜くとつけにくいです。)

底面との接続ケーブルもまだくっついているので抜きます。
ゴムシールの厚みでくっついているだけなので、反対側から下の写真の様にそっと引っ張ると抜けます。

ケーブルを抜く

2-1-13. マイク基板分離

頭部カバーの裏側(耳の真下辺り)にマイク基板がくっついています。
写真の赤▼のネジ位置2か所外して基板をとります。

マイク基板ネジ位置

2-1-14. 分解完了

こんな感じに分離出来たら完成です。

分解後の様子

3. 解析

ここでは分解後に私が調査した結果を記してます。中身をよく理解したい興味のある方だけ見ていただければと思います。
単に同じように改造したいだけの人には不要ですので、その場合 4. 改造に進みます。

3-1. 構成

大まかに以下の様な構成になっているようです。
オリジナルCLOVA構成図

この中で、できる限り使える部品は使う方針で検討しました。
最終的にこんな感じにすればいいのかなと思います。

改造案

各部ごとに、検討内容を説明していきます。

3-1-1. メイン基板

まず CLOVA の心臓部であるメイン基板、そのうちCPU の中身はソフトを含めブラックボックスです。
そしてそのソフトは LINE Clover アシスタンスサービス と連携すること前提に作成されています。サービス終了後に使えるようにするにはこれを改造する必要がありますが、多数の開発者を投入して開発された大規模ソフトウェアである上に、ソースコードのない実質ブラックボックスをリバースエンジニアリングして改造するのは現実的ではありません。
ここは CPU ごとラズパイに置き換えて一から作ることとします。

構成を調べるために軽く基板を確認しました。

メイン基板表

写真の左側が、電源基板のようです。
CPUの電圧が 1.8V の様なので、その電圧はここで作っているようです。そして、中央にある小さな IC が充電用の IC かなと思います。
CPU自体はシールドの中にあるようですが、シールドを外すことが出来なかったので詳細は分かりません。

メイン基板裏
写真の上側が音声系の回路らしく、音声処理系の IC が載っているようで、スピーカーやマイクからの信号はその中に入っているみたいです。

というわけで、この基板の中に CPU と直結して使われている音声制御用のチップが使えませんので、音声関連の回路はラズパイに外付けする必要がありそうです。
音声アナログ出力は HDMI 端子の中に出ていますがそれを取り出す為にコネクターを付けると、かさばって中に入らなくなるので I2S接続のD級アンプを外付けして出力するようにします。

3-1-2. マイク基板

マイク基板は、メイン基板から長めのケーブルで接続されているので分離できるかもしれないという事で、調べてみました。
こんな感じです。
マイク基板

左右ステレオ入力のようです。
基板からどんなデータが出ているかをオシロスコープで調べてみたところ、以下のとおり単純に音声のアナログ信号が出ていました。

マイク信号

ラズパイには A/D変換機 (アナログ->デジタルに変換の仕組み) が搭載されておらず、使うには外付けの必要があります。そのA/D変換回路をわざわざ回路設計して外付けするよりも、デジタル出力 (I2S信号出力)のマイクモジュールを付ける方が安価かつ簡単なため、CLOVA オリジナルのマイクは使わないことにします。CLOVA構成の様にアナログマイクのまま配線を引き延ばしているとノイズに悩まされるリスクもあります。

3-1-3. フロントスイッチ基板

スイッチが1つの単純な基板のようです。
コネクタは特殊で、同じ形のものが見つからなかったので、メーカ・型番は判別しきれませんでした。ですが、接続先であるメイン基板側は JST の ZH 2pin のようで、こちらは入手困難ではありません。
接続は2本線のみで、テスターで当たると片方はグランドと導通があります。
2本とも、その近くにある TP200, TP201 というランドにつながっているようです。検査用のピンだと思いますが、はんだ付けしやすいので、ZH コネクタを使わずに直接このランドに繋げばよさそうです。

フロントスイッチ基板

スイッチが押されると、グランドに導通される回路のようです。
わずかに2個ほど 部品があり、抵抗とコンデンサが並列にスイッチに並列に接続されているのは、チャタリング防止用のフィルタ回路かと思われます。

3-1-4. リアスイッチ・LED基板

スイッチが4つと 3色 LED(RGB LED) が搭載されています。
ざっくり回路を負ったところ、スイッチ回路側は、フロントスイッチ側と同様、抵抗とコンデンサによるチャタリング防止回路で構成されていて、押されるとグランドにショートするのも同じです。
そして、LED 回路側は R, G, B それぞれにトランジスタスイッチング回路が組まれていました。信号を調査したところ、CPU からは ロジック電圧 1.8V の正論理で ON/OFF しているようです。
多分ラズパイの 3.3V で駆動しても問題はないと思いますが、念のため電圧を合わせる為に分圧して半分の電圧で接続すればよさそうです。

リアスイッチ・LED基板

コネクタは 0.5mm ピッチの 9pin コネクタです。結構特殊なのとコネクタの根本にはんだ付けするのは、かなり困難だと思いますが、こちらも TP*** と書かれたランドがたくさんあります。丁度9個あってピン数と一致するので導通をしらべてみたらすべてのピンにランドが割り当たっているようですので、配線はこのランド部分に直接はんだ付けすればよさそうです。

3-1-5. バッテリー

バッテリーはかなり容量の大きいリチウムイオン電池 3.7V 。ただ、ラズパイを使うにはちょっと電圧不足なのでそのままでは使えません。スペース的にもつけたままだと、ラズパイ Zero が入らなくなるので使わないことにします。

バッテリー

使わないことによるデメリットは電源外して持ち運びができなくはなることですが、そもそもたいていの人は電源つないだまま使っているのではないかと思っています。

3-1-6. スピーカーユニット

写真の様なユニットで、二本線のみつながっているのでモノラル仕様のようです。
上向きと下向き両方に膜があり、ボディーギリギリの大きさになっています。

形も特殊ですし、低音も出て全方向に音を出せるような形となっていて、この CLOVA のボディーの形でパフォーマンスを発揮するように設計されているはずなので、これはそのまま使う事とします。

スピーカーユニット

3-1-7. 底面LED基板

おそらく LED のイルミネーション基板のようです。メイン基板と 25pin フラットケーブルでつながっており、色々な信号や電源が通っているようです。

底面LED基板

また、別の CPU が載っているようにも見えますが、この IC は型番を調べても見つかりませんでしたので正体不明です。
うまくいけばこのイルミネーション LED を点灯させることが出来るかと思って解析中です。

幸いこちらもテストピンがいっぱい出ていて、全てのピンがランドにつながっているようです。
現状わかっているのは、 USB コネクタからの 5V 電源を経由していること。ドックの上に置くと充電ができるので、電源の供給元を選択するような回路が入っていること、メイン基板から 1.8V とバッテリー電源が供給されていること、 25pin フラットケーブルの一部に底面の電源スイッチがつながっている事くらいです。

電源はこの底面基板から 5V を取ってラズパイにいれてやり、電源スイッチはスイッチ入力としてラズパイに入れてやることにします。

以上の事より、改造後はこんな感じになるように改造していくことにしました。

改造後の構成図

回路的にはこんな感じになるかと思います。

回路図

点線に囲まれた部分が、CLOVA の基板を流用した部分ですが、あくまでも解析して推測した結果です。回路図中のコネクター系は使わずランドに直接つけることにします。

4. 改造

4-1. 部品準備

4-1-1. 使用部品

基本的に日本で通販か実店舗で入手可能なものばかりです。電子部品屋さんの通販か実店舗で入手できます。(一部昨今の半導体不足により売り切れの可能性は有りますが…)

使用部品は主に以下の感じです。

使用部品一覧

品名 型番/SPEC 参考単価 備考
ラズパイ RaspberryPi ZeroWH 1 3200 制御コンピュータ Zero2W でも可
I2S 3W D級アンプボード MAX98357A 1 1,430
I2S MEMSマイクモジュール SPH0645LM4H 2 1,408
Molex Mini-SPOX コネクタ 5267-02A-X 1 26
MicroSD 16GB 1 750 ラズパイシステム用
ヘッダソケット 2x20 pin 2.54 pitch 1 200 ラズパイのヘッダピンに被せ、直接の半田付けを防ぐ為
抵抗 4.7KΩ 6 5 LED信号出力用
抵抗 330Ω 1 5 LED電流制御用
抵抗 10KΩ 1 5 SWプルアップ用
電線 AWG26 6 40 6色程あれば間違いにくくなる。単価の単位は 1m
ウレタン線 0.5mm 1 45 単価の単位は 1m
熱収縮チューブ 1 30 単価の単位は 1m
スペーサー 2.6Φx2mm 6 ? ラズパイ・D級アンプ固定用
スペーサー 2.6Φx10mm 4 ? マイク固定用
L型金具 1 ? ラズパイ固定板とマイク固定板を固定
なべビス+ナット M2.6x8mm 6 ? ラズパイ固定用
なべビス+ナット M2.6x15mm 4 ? マイク固定用
ポリカネジ+ナット M3x8mm 2 ? ラズパイ固定板とマイク固定板を固定

4-1-2. 工作

固定する板として、プラ板(DAISO の下敷き)を使いました。一番の理由は加工がしやすい事です。(レーザーカッターやルーター等を使わなくても、ハサミで加工できるお手軽さがようです。)それでいて、基板があまり重くないので多少曲がっても差し支えないからです。

このサイトでは、記事にPDF や CAD の DXF 等が貼り付けできないので、画像ファイルを貼り付けました。
複雑ではないので、パパっと作れる人は寸法図を見て CADで描いて印刷し型紙を作ります。
CADって何って方や面倒な方は多少精度は悪くなりますが、以下の様にペイントアプリとWord (Winユーザーの場合)で画像を合わせこんで印刷すると同じ様に型紙が作れます。

ペイントアプリとWordを使った型紙印刷

  1. 本記事の型紙の画像を右クリックして[画像をコピー] してペイントアプリを開いて貼り付けます。
  2. 画像の左の様に固定台の外枠部分を選択してコピーし、Word に貼り付けます。
  3. Word で張り付けた画像を右クリックして [レイアウトの詳細設定] を選び [サイズ]タブの中の高さの所に、合わせこむサイズ(この場合 72mm) にして [OK] を押す。
  4. 固定版2枚分入るはずですので、2つとも出来たら印刷します。
  5. 印刷した型紙の必要部分を切り取り、両面テープでプラ板に貼り付け型紙通り切り取ります。この時穴位置の真下に両面テープを張ると、穴位置がズレにくくなります。

型紙に合わせて切り取る
写真は開発中試行錯誤していた時のものなので、最新の型紙と少し形は違いますが、参考イメージです。
穴はドリルがあれば楽に開けられますが、無ければ仕上がりはかなり悪いですが、太めの千枚通しで開けてそれを広げ、飛び出たバリをニッパーで切るだけでもできなくはないです。

4-1-2-1. ラズパイ固定板

元々のメインボードである基板と同じ形でラズパイやアンプ等を固定できる固定板を作りました。

ラズパイ固定板寸法図

型紙を取り除くとこんな感じの仕上がりになります。
ラズパイ固定板写真
こちらの写真も開発中試行錯誤していた時のものなので、最新の型紙と少し形は違いますが、参考イメージです。

4-1-2-2. マイク固定板

ケースを削ることなく無改造のまま使用すると、バッテリー固定用の筒状部分が干渉するので、色々と試行錯誤してこの形となりました。

マイク固定版寸法図
中央の穴が L型金具の取付穴で、他はマイクモジュール基板を取り付ける穴となります。

型紙を取り除くとこんな感じの仕上がりになります。

マイク固定板写真

4-1-2-3. フラットケーブル作成

底面基板とメイン基板を元々つないでいたフラットケーブルは 線間0.5mm の 25pin と細かく他ピンで専用コネクタも必要なため、これを使用するのは困難です。ですが、下の写真の通りこのスペースに AWG 26 の電線は通りません。
線は通らない

たとえ穴を広げて強引に通したとしても、内部でスピーカーとそのカバーの隙間が細すぎてそこが通りません。

しかもこの部分にはラズパイ向けの電源を通す必要があり、そこそこ電流は必要ですのであまり細い線にするのはよくありません。
被覆がビニールの電線ではかさばるため銅線部分の太さを稼げませんのでウレタンメッキ線を使います。

ウレタン線は、銅線を絶縁のウレタンでメッキしたもので被覆がメッキなので嵩張らないので太さを稼げます。メッキされているところは導通しませんので、半田付けする先の部分だけを半田で溶かして使います。

底面とラズパイをつなぐ線は(5V電源、グランド、電源スイッチの)最低3本です。
バラバラだと穴を通しにくいので、下の写真の様にテープにくっつけてまとめ簡易的なフラットケーブルにします。

簡易フラットケーブル

写真では少し寸法違うのですが、やってみた感じでは 全長 200mm、テープは片側50mmもう片側20mm くらいを開けて貼るくらいが丁度いいかと思います。
簡易ケーブルでは裏表の見分けがつかないので、逆につないでしまう事故を防ぐために電源線は赤グランドを黒の油性マーカーで両方を塗っておくといいでしょう。

4-2. 組み立て

組み立てた後配線しないといけませんが、位置関係をわかりやすくするためにまずは完成イメージを載せます。
試行錯誤して接続しなおしているうちに配線がすっかりスパゲッティになっていますが(言い訳)、接続先が決まっているのでもう少し整理して配線できると思います。ここでは、大体の組み立ての参考として見てください。

この寸法図の向きを表とします。

ラズパイ固定板寸法図

A: ラズパイ固定穴
B: D級アンプ固定穴
C: L型金具固定穴
D: 配線通し用の穴

表面写真

表面には 、マイク基板一式とD級アンプ基板が付きます。
まずは、寸法図の "C" の穴位置に L型金具を写真の様にラズパイの裏がショートしない様にポリカネジで取付ます。裏からビスを差し込み、表側でナットを止める方向です。
その後 寸法図の "B"の穴位置に間にスペーサーを挟んでD級アンプ基板を固定します。
その後、マイク固定台に I2Sマイク基板を両側にスペーサーで取り付けます。
その固定版の真ん中の穴を L型金具に写真の向きにビスで取り付けます。

裏面写真

裏面にはラズパイZero基板が付きます。
ピンヘッダが、D級アンプの裏にきて、MicroSD ソケットが上にくる向きに取り付けます。
寸法図の "A" の穴位置に間にスペーサーを挟んで固定します。ビスの頭がラズパイの表面にくる方向です。

底面写真

底面には特に取り付けるものはありませんが、先ほど作成したフラットケーブルはこちらをから配線することになります。参考に写真だけ載せておきます。ちなみに取付の際は導光板リングを付け忘れたり向きを間違えたりすると後でえらい目にあいますというのだけ覚えておいてください。

4-3. 接続

4-3-1. 接続方法

基本的に、各基板間をはんだ付けして電線でつないでいくという接続方法です。ラズパイの上に被せたピンソケットからつけて、接続先の基板に配線という手順を繰り返すと楽です。
ただし分岐がある場合は、そちら側から先につけた方が楽です。

電線はなるべく最短になる長さから、30mm 程余分な長さにするのが理想です。(自身のない人は 50mm 程と長めにしておいて少しずつ切りながら調整します。 )しかしながら、干渉部分も多いので、結構引き回す必要のある部分もあります。下の写真を参考にしてください。

数か所抵抗を空中配線しています。
抵抗を配線したところ等は銅線部むき出しとなってしまうので、下記写真の様に熱収縮チューブで被せてショートしない様にしてやります。

熱収縮チューブ

上の写真の右側黄色、オレンジ、灰色の電線につながっている抵抗の塊は最終的にはなくなりました。(プルアップ抵抗が必要かどうか試行錯誤していた時期の写真です。)

4-3-1. 配線

大まかにはこんな感じです。

配線図

4-3-2. 接続先

元々の CLOVAの基板は、 TP xxxx (おそらくテストピン) と書かれたランドに接続していきます。接続先がわかりやすいように写真を載せておきます。

4-3-2-1. 底面基板

底面基板からは、ラズパイのメイン電源とグランド、スイッチの3本を取り出します。

その前に底面基板はフラットケーブルを先に通しておかないと後からでは接続難しいので、まず組み立てます。

スピーカー部と基板ホルダー部を下の写真の様にケーブルを通しながら組付け、ねじ止めします。
スピーカー部と基板ホルダー部の組付け

さらにその上にスピーカーカバーを、下の写真の様にケーブルを通しながら組み付け、ねじ止めします。
スピーカーカバー組付け

さらに USB コネクタ基板を取り付けてしまいます。

導光板リングをケーブルに通してから(これを忘れると後でとっても後悔します。)作成した簡易フラットケーブルの先を下の写真の様にはんだ付けして接続します。
底面基板接続先

はんだ付けが終わったら3本の線がお互いショートしていないかをテスターで導通チェックします。ショートしていなければ次は グランドとスイッチ線にテスターを当て、スイッチを押すとショートすることを確認します。

接続したらケーブルを少し折り曲げつつ、なるべくテンションが掛からない様に整形します。底面を閉める時にモゲ無いようにしっかりはんだ付けし、必要に応じてテープ等で補強するのもいいです。
そして底面を慎重に閉めます。フラットケーブル側が蝶番になる向きに少しずつ締めます。

下の写真の様に導光板リングは溝があり底面側にはそれをはめ込む爪があるので、これらがUSBコネクタの下側くらいになるようにはめ込む必要があります。

爪と溝を合わせてはめ込む

底面が閉終わったら、ネジ止めしてしまいます。底面を閉めるときに当たったり外れたりする場合があるので、最後にもう一度テスターで先ほどと同様の導通チェックをします。

問題無ければケーブルのウレタン線の先にビニル電線(+5V に赤、グランドを黒)を継接続して熱収縮チューブを被せます。
ここまで出来たら 、5V とグランドがショートしない様に気を付けながら USBコネクタに電源を差し、+5 と グランドをテスターで当たって、 5V 出ている事と + / - が逆転していない事を必ず確認します。
問題無ければ USB電源を抜いて接続作業を継続していきます。

4-3-2-2. ラズパイ

ラズパイのヘッダピンに直接はんだ付けすると分離できなくなるので後で色々と後悔します。下の写真の様にヘッダピンの部分に 2×20 ピンのヘッダソケットを被せて(はめ込んで)からその上にはんだ付けしていきます。

ヘッダソケットを被せてから

接続先は以下の表の通り。4-3-1. 配線の配線図も参考にして接続します。
"抵抗 を介して接続" とあるところは、抵抗を間に挟んで配線します。

ラズパイPIN番 ラズパイピン番号 接続デバイス 接続先ピン 信号 備考
1 3.3v Power a) I2Sマイク基板, b) リアSW/LED基板 a) 3V, b) TP100 VCC b) 抵抗 330Ω を介して接続
2 5V Power a) フラットケーブルに繋いだ線, b) D級アンプ基板 a) (赤), b) Vin a) 電源入力 USBコネクタから底面基板を経由した大元の電源入力
3 BMC3 リアSW/LED基板 TP105 Vol - SW
5 BMC2 リアSW/LED基板 TP104 Vol + SW
6 Ground a) フラットケーブルに繋いだ線, b) D級アンプ基板 a) (黒), b) GND グランド(電源-)
7 BMC4 フロントSW基板 TP200 Front SW
12 PCM CLK a) D級アンプ, b) I2Sマイク基板 a) BCLK, b) BCLK I2S ベースクロック
15 BMC22 フラットケーブルに繋いだ線 (無色) 底面電源SW
17 3.3v Power フラットケーブルに繋いだ線 (赤色) 底面電源SW SWのプルアップ
20 Ground a) フロントSW基板, b) リアSW/LED基板, c) リアSW/LED基板 a) TP201, b) TP106, c) TP107~109 グランド c) それぞれ、抵抗 4.7KΩを介して接続
26 BMC7 リアSW/LED基板 TP101 Mute SW
29 BMC5 リアSW/LED基板 TP103 BT SW
31 BMC6 リアSW/LED基板 TP107 LED B 抵抗 4.7KΩを介して接続
32 BMC12 (PWM0) リアSW/LED基板 TP108 LED G 抵抗 4.7KΩを介して接続
33 BMC13 (PWM2) リアSW/LED基板 TP109 LED R 抵抗 4.7KΩを介して接続
35 PCM FS a) D級アンプ, b) I2Sマイク基板 a)LRC, b)LRCL I2S L/R選択クロック
38 PCM DIN I2Sマイク基板 DOUT I2S入力
40 PCM DOUT D級アンプ基板 DIN I2S出力

4-3-2-3. フロントスイッチ基板

ラズパイからの配線を直接ランドにくっつけていきます。接続先は以下の通り。

フロントスイッチ基板接続先

4-3-2-4. リアスイッチ・LED基板

これも、ラズパイからの配線を直接ランドにくっつけていきます。ラズパイとは逆の面にあるので、固定版寸法図にある D の穴の下の方を通して配線します(固定版の側面を横切ると、干渉して蓋(顔)を閉められなくなります)。

リアスイッチ・LED基板接続先

4-3-2-6. D級アンプ基板

信号側とスピーカー側がありますが、信号側は基板にシルクで信号名が書いてあるので写真は省きます。

スピーカー側には MOLEX Mini SPOX コネクタに電線(40mm位)を直付けして配線します。もともと基板につけるためのコネクタなので、根元ショートしない様に収縮チューブを被せます。

4-3-2-7. I2Sマイク基板

こちらも、信号名はシルクで書いてあるので写真は省きます。
右用と左用を並列につなぎますが、左は SEL 端子を GND に接続 右は SEL 端子を 3V に接続しておき、その後接続していきます。

頭の裏のケースの形状による干渉が激しい場所なので、配線は下の写真の様にコの字型に配線します。(長さも長い目に)

コの字型に配線

4-3-3. 組み立て

配線が出来たら、下の写真の様に組み立てます。

フロント側

リア側

スイッチ基板からの配線は蓋(顔) に引っかからない様に裏面を通します。

ここまで出来たら、蓋(顔)が閉まるかを確認します。ちゃんとできていたら下まできっちり収まるはずですが、何かが干渉したり引っかかったりすると途中までしか閉まりません。
いったんちゃんと閉まることが確認出来たらもう一度蓋を開けて、配線を噛んだりもげたりしている箇所が無いかを確認します。

その後は、Micro SD を入れたり、場合によっては HDMI にディスプレイや USB 端子に マウス・キーボードを繋ぐ必要があるかもしれないので、蓋は当面開けておきます。

5. ラズパイの基本設定

5.1. ラズパイイメージ書き込み

まず、PC にラズパイ用に使う 16GB のマイクロSD を指しておきます。

ラズパイ公式 Imager を使ってインストールします。 (Raspberry pi Imager を持っていない人は、公式ページの説明を見てインストールします。)
最新の 32bit 版を選べばいいです。

Imager

さらに、左下 [書き込む] ボタンの下にある [歯車] ボタンを押して設定画面を開きます。

インストール設定1

ホスト名は自由に、SSH は有効(パスワード認証の方がわかりやすいと思います)にします。ユーザー名、パスワードは、自分で分かりやすいものを設定するといいです。

インストール設定2

ラズパイZero は 有線ポートは通常無いので、WiFi アクセスポイントの設定も、この時点で設定してWiFi でネットワークにつながるように設定しておきます。WiFi を使う国は "JP" にします。

インストール設定3

ロケール設定をチェックして有効にし、タイムゾーンを Asia/Tokyo キーボードレイアウトを jp にします。

[保存] ボタンを押して、Imager のトップ画面に戻ったら、 [書き込み] を押します。
「データは完全に削除されます。」と表示されるので、 [はい] を選ぶと書き込みが始まります。

書き込み中

15分程待つと書き込み完了したら、MicroSD を取り出します。
書き込み

取り出した MIcroSD をラズパイに差します。

5-2. IPアドレス確認しSSH接続

最初は DHCP (IPアドレス自動割り振り) 設定で起動してしまいますので、IPアドレスがわららず、SSH の接続先が判りません。

IPをスキャンするソフトで調べえるか、
IPスキャンソフト

初回だけ HDMI 端子にディスプレイを繋いで起動し、

ifconfig
と打って

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 26  bytes 2732 (2.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26  bytes 2732 (2.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.33  netmask 255.255.240.0  broadcast 192.168.15.255
        inet6 fe80::5141:efa1:ff31:e5e  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 14156  bytes 1615201 (1.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 987  bytes 108090 (105.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

の様に表示されますが、 wlan0: の2行目 inet 192.168.0.33 の部分が IPアドレスとなります。
Tera-Term の様な SSH クライアントソフトからこの IPアドレスに接続します。
TeraTermの場合

起動毎にアドレスが変わってつながらない場合は IPアドレスを固定するといいでしょう。
私は SSH でつなぐものは大概固定しています。
固定のやり方は "ラズパイ" + "IPアドレス固定" などとググったらわかるかと思います。

5-3. 音声入出力設定

もともと、ラズパイは音声は出力でアナログ出力のみです。音声の入力についてはオプション扱いで OS には標準で組み込まれていません。さらに、音声出力もラズパイ Zero の場合は基本的に HDMI コネクタにのみ出力されていてデフォルトではそちらに出力されるようになっています。

特に OS に組み込まれていない マイク入力のドライバーソフトは、カーネルヘッダーソースを持ってきて、そのヘッダーを使ってドライバーをコンパイルするといった面倒な作業が必要です。
ところが、この I2S MEMSマイクモジュールの開発元である Adafruit が、 I2S MEMSマイク用のインストールスクリプトを用意してくれています。コマンド一つでカーネルヘッダーソースのダウンロードから組み込みまでやってくれます。
しかも、システムアップデート等で万が一動かなくなっても、再度スクリプトを実行することで修復までしてくれるようになっているそうです。
そして、イントール後は I2S 出力もできるようにしてくれているようです。

そのサイトの説明に従って設定してテストします。
Adafruit I2S MEMS Microphone Breakout / Raspberry Pi Wiring & Test

のサイトを開いて、"Update the Pi" から下の手順を全て、順に実行していきます。
"Auto Load at Boot" の所は "Y" を選択して、起動時に自動ロードするようにします。
なので、 "Manual Load" の所はスキップします。

途中で、テストの方法も書いてあるので、録音した音声が再生されるところまで確認できます。

因みに、私の環境では、 .asoundrc に設定を書き込むところは動作はするのですが、再起動すると、なぜか .asoundrc ファイルが消えてしまっていて設定が保持できません。
原因はつかめていませんが、
sudo nano /etc/asound.conf
と打って、そちらに後ろに追加しました。
その時に、ついでにスピーカー側のボリューム制御設定も同じファイルに書いておきます。

参考にそのファイルを載せておきます。

asound.conf

pcm.dspeaker_hw { type hw card 0 } pcm.dmixer { type dmix ipc_key 1024 ipc_perm 0666 slave { pcm "dspeaker_hw" period_time 0 period_size 1024 buffer_size 8192 rate 44100 channels 2 } } ctl.dmixer { type hw card 0 } pcm.softvol { type softvol slave.pcm "dmixer" control.name "PCM" control.card 0 } ctl.softvol { type hw card 0 } pcm.!default { type plug slave.pcm "softvol" } pcm.dmic_hw { type hw card sndrpii2scard channels 2 format S32_LE } pcm.dmic_sv { type softvol slave.pcm dmic_hw control { name "Boost Capture Volume" card sndrpii2scard } min_dB -3.0 max_dB 30.0 }

5-4. ハードウェアチェック

Python で RPi.GPIO というライブラリを使ってチェックします。

ライブラリがインストールされているか確認します。
pip list | grep RPi.GPIO
と打って、入っていたら

RPi.GPIO          0.7.0

の様にライブラリ名とバージョンが表示されれば、インストールされていますのでそのまま進んでください。何も表示されていなければ インストールされていないので、
`pip install RPi.GPIO'
と打ってインストールしておきます。

5-4-1. スイッチ・LEDテスト

mkdir hw_test
と打ってディレクトリを作成し
cd hw_test
でその中に入ります。

nano sw_led_test.py

と打って、nanoエディタを開き、以下を入力(コピペ)してください。

sw_led_test.py

import RPi.GPIO as GPIO import threading import time PIN_FRONT_SW = 4 PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 PIN_POWER_SW = 22 PIN_LED_R = 13 PIN_LED_G = 12 PIN_LED_B = 6 is_active = True def test() : global is_active sw_front_before = -1 sw_back_minus_before = -1 sw_back_plus_before = -1 sw_back_bt_before = -1 sw_back_mute_before = -1 sw_power_before = -1 while(is_active) : sw_front = GPIO.input(PIN_FRONT_SW) sw_back_minus = GPIO.input(PIN_BACK_SW_MINUS) sw_back_plus = GPIO.input(PIN_BACK_SW_PLUS) sw_back_bt = GPIO.input(PIN_BACK_SW_BT) sw_back_mute = GPIO.input(PIN_BACK_SW_MUTE) sw_power = GPIO.input(PIN_POWER_SW) if sw_front_before != sw_front : if (sw_front == GPIO.HIGH) : print("[FRONT] switch is OFF") else : print("[FRONT] switch is ON") if sw_back_minus_before != sw_back_minus : if (sw_back_minus == GPIO.HIGH) : print("[-] switch is OFF") GPIO.output(PIN_LED_B, GPIO.LOW) print("[B] LED is OFF") else : print("[-] switch is ON") GPIO.output(PIN_LED_B, GPIO.HIGH) print("[B] LED is ON") if sw_back_plus_before != sw_back_plus : if (sw_back_plus == GPIO.HIGH) : GPIO.output(PIN_LED_G, GPIO.LOW) print("[R] LED is OFF") print("[+] switch is OFF") else : print("[+] switch is ON") GPIO.output(PIN_LED_G, GPIO.HIGH) print("[R] LED is ON") if sw_back_bt_before != sw_back_bt : if (sw_back_bt == GPIO.HIGH) : print("[BT] switch is OFF") GPIO.output(PIN_LED_R, GPIO.LOW) print("[R] LED is OFF") else : print("[BT] switch is ON") GPIO.output(PIN_LED_R, GPIO.HIGH) print("[R] LED is ON") if sw_back_mute_before != sw_back_mute : if (sw_back_mute == GPIO.HIGH) : print("[MUTE] switch is OFF") else : print("[MUTE] switch is ON") if sw_power_before != sw_power : if (sw_power == GPIO.HIGH) : print("[POWER] switch is OFF") else : print("[POWER] switch is ON") time.sleep(0.1) sw_front_before = sw_front sw_back_minus_before = sw_back_minus sw_back_plus_before = sw_back_plus sw_back_bt_before = sw_back_bt sw_back_mute_before = sw_back_mute sw_power_before = sw_power def main() : global is_active GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_FRONT_SW, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MINUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_PLUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_BT, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MUTE, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_POWER_SW, GPIO.IN) GPIO.setup(PIN_LED_R, GPIO.OUT) GPIO.setup(PIN_LED_G, GPIO.OUT) GPIO.setup(PIN_LED_B, GPIO.OUT) GPIO.output(PIN_LED_R, GPIO.LOW) GPIO.output(PIN_LED_G, GPIO.LOW) GPIO.output(PIN_LED_B, GPIO.LOW) print("Ready! Press any switch to test or press [Enter] key to exit") test_thread = threading.Thread(target = test, args = (), name = 'Test', daemon = True) test_thread.start() input() is_active = False print("Exit") time.sleep(1) test_thread.join() GPIO.cleanup(PIN_FRONT_SW) GPIO.cleanup(PIN_BACK_SW_MINUS) GPIO.cleanup(PIN_BACK_SW_PLUS) GPIO.cleanup(PIN_BACK_SW_BT) GPIO.cleanup(PIN_BACK_SW_MUTE) GPIO.cleanup(PIN_POWER_SW) GPIO.cleanup(PIN_LED_R) GPIO.cleanup(PIN_LED_G) GPIO.cleanup(PIN_LED_B) if __name__ == '__main__': main()

[Ctrl] + [O] で保存し、 [Ctrl] + [X] で終了します。

python sw_led_test.py
と打つと、チェックプログラムが走ります。各スイッチを押してみてください。
画面に

[*]  switch is ON

と表示され、スイッチを離すと

[*]  switch OFF

(* の部分に押されたスイッチの名称)の様に表示されれば、そのスイッチは問題なく接続できています。

また、
[Bluetooth] スイッチを押すと赤色 LED が点灯、
[+] スイッチを押すと緑色 LED が点灯、
[-] スイッチを押すと青色 LED が点灯、
するのが確認出来たら、LED の接続も問題なく接続できています。
なお、RGB LED なので、同時に押すと合成した色になります。

5-4-3. 仕上げ

蓋を閉めると、ラズパイ基板上にあるアクセスランプが見えなくなってしまい、電源が入っているのか現在ディスクアクセス中かが全く分からなくなってしまいます。
そこで、後ろのスイッチの上にある LED にアクセスランプや電源ランプを割り当てます。
またシャットダウンしたくても、一旦SSH等でPCからつなぎに行ってシャットダウンコマンドを打つのも面倒ですので、本体だけでもシャットダウンできるように電源ボタンを割り当てます。

いずれも
/boot/confit.txt に追加するだけで対応できます。

sudo nano /boot/config.txt
と打ち

[All] と書いてある下あたりに以下を追加します。

5-4-3-1. 電源LED

dtoverlay=gpio-poweroff,gpiopin=6,active_low=1

gpiopin=6
でBMC6 に信号が割り当てられるので、電源が ON の間は青色が点灯します。
"4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別の LED ピンに変えると別の色になります。

5-4-3-2. アクセス LED

dtparam=act_led_gpio=13

act_led_gpio=13
でBMC13 に信号が割り当てられるので、アクセス時は赤色が点灯します。
"4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別の LED ピンに変えると別の色になります。
電源LED が青で点灯中は合成色で紫になります。

5-4-3-3. 電源(シャットダウン)ボタン

dtoverlay=gpio-shutdown,gpio_pin=22

gpio_pin=22
でBMC22 に信号が割り当てられるので、底面の電源ボタンを押すとシャットダウンします。。
"4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別のスイッチピンに変えるとそのスイッチでシャットダウンするようになります。

ここまで出来たら、一度
sudo reboot now
と打って、リブートをかけます。次回起動時には LED や電源スイッチが効くようになっているか確認します。
確認出来たら蓋を閉めても支障ないはずです。

なお蓋を閉めるためのネジは止めない方が無難かと思います。ねじ止めしなくても結構きっちりはまります。ただ、顔部分をつかんで持ち歩くとさすがに外れる場合があるので注意が必要です。
別のソフトを入れるためや、MicroSD が壊れた時に交換するのには蓋が開けやすい方がいいからです。

6. アプリケーションソース導入

次に、ラズパイ Zero側のアプリケーションソフトウェア導入が必要です。
詳細は パート2 の 5. アプリケーションの導入 と内容がかぶるので、そちらを参照ください。

7. さいごに

ここまでとっても長い記事となってしまいました。
スマートスピーカとして使うには、ソフトウェア面でまだまだ色々と試したり開発したりが必要です。冒頭の動画で紹介した「出来たこと」については、別途解説の必要があります。
ここではハードウェアの改造とその動作確認までの記事に留め、別途記事を用意してリンクを張る予定です。

記事は見たけど、内容的にも自分には改造できる気がしないという方も少なくないと思います。
現在分解後にメイン基板の交換してコネクタにケーブルを指す程度で、はんだ付けなしで改造できるように、専用基板を開発中です。

専用基板を開発中

開発中の基板を組み込む

ただ、どれだけの需要があるかがわからないので、量産までするか結構迷っています。(部品だけでも結構な値段になり、数をまとめないと部品の値段が跳ね上がりそうです。)
この記事へのコメント や、"#ラズパイ化CLOVA" でのTweet等でコメント・応援いただければありがたいです。
希望が多ければ考えます。

今後の予定としては
① 底面基板の解析
➡せっかくたくさんのイルミネーション用 LED があるので、何とか使えるようにしたい 。i2c で通信している様な信号が出ているので何とかなるかもと、絶賛解析中です。 という事で測定器を駆使して解析を進めていましたが、下の写真の通りなんとか 22個11組の LED をそれぞれ好きな色に光らせ制御する方法が判明しました。

イルミネーション用 LED  プロトコル解析の攻略

但し、今の所ラズパイではなく M5Stack という別のマイコンで制御しています。ラズパイ側で制御できるように改造しようとしているところです。

3.3V -> 1.8V のレベル変換のICが(バッファタイプ&FETタイプの)2種類外付けで必要な為、ますます難易度が上がりそうです。検証用に使った部品は大きくて入らないので、別途部品を手配して色々と試してみようと思っている状況です。

LED底面基板のラズパイからの制御に成功しました。

3.3V -> 1.8V のレベル変換のIC(FETタイプ4本程) の追加が必要です。そのうち記事にも反映します。

② 専用基板の完成
➡プロトタイプ作ってみましたが、何点か問題が出ているので基板作り直す必要ありますし、①の結果回路が必要になると思うので、それも追加したいですね。
➡LED底面基板制御用に、1.8V電源やレベル変換回路とかを追加し問題点を修正した基板を設計し直し、現在基板発注中の到着待ちです。10 枚程作ろうかと思って部品も用意しています。(予算の都合で大量には作れませんが、どこかで提供始めるかも?)
➡とりあえず10枚分基板と部品が届いたので、先ずは第一ロットを10枚程製作中(ほぼ手はんだ)です。
➡また、専用基板での組み立て手順を新たな記事として作成しました。こちら⇒を参照ください。ラズパイ化CLOVA-パート2(専用基板編)

③ ソフト側の試行錯誤
➡ラズパイで色々試さないといけないのですが、明らかに人手が足りないです。ラズパイ得意な協力者を募ろうかな…
➡いくつか機能をバラバラに試してできそうなことが確認できていますが、統合したソフトを作って自動起動し音声で機能を呼び出す様にないといけないかなと考えています。(github に載せて誰でも追加出来るとこまで行けたらなおいいかなと思います)

④ 記事作成
➡出来たことについて順次増やしていこうかと思います。

という感じになるかと思います。乞うご期待。

3
TakSan0のアイコン画像
大阪在住の本業組込み系SEです。ハードに近いところのソフト屋さんです。 電子工作は趣味でやっています。 よろしくお願いします。 ▼こちらにも別の作品を投稿しています。参考まで。 https://protopedia.net/prototyper/taksan
  • TakSan0 さんが 2023/01/26 に 編集 をしました。 (メッセージ: 初版)
  • TakSan0 さんが 2023/01/27 に 編集 をしました。
  • TakSan0 さんが 2023/02/07 に 編集 をしました。 (メッセージ: 底面基板の解析について状況を更新。)
  • TakSan0 さんが 2023/02/14 に 編集 をしました。 (メッセージ: LED底面基板の制御動画を追加)
  • TakSan0 さんが 2023/03/14 に 編集 をしました。 (メッセージ: 基板再発注中・OpenAI 試してみた件)
  • TakSan0 さんが 2023/03/14 に 編集 をしました。
  • TakSan0 さんが 2023/03/31 に 編集 をしました。
  • TakSan0 さんが 2023/03/31 に 編集 をしました。
  • TakSan0 さんが 2023/04/05 に 編集 をしました。 (メッセージ: パート2(専用基板編)へのリンクを追記)
  • TakSan0 さんが 2023/05/20 に 編集 をしました。
ログインしてコメントを投稿する