これは #NervesJP Advent Calendar 2021の17日目に書こうとして挫折してた記事です。
はじめに
FA (Factory Automation) の現場に Nerves/Elixir を使えないかと画策してまして、前回の記事 でオレオレハードウェアのコンセプトについて書きました。今回はどのように設計して製作したのかを書いてみます。
- 概要とコンセプト
- 設計・製作(この記事)
- ファームウェアのポーティング
- 環境試験
元になる BeagleBone の設計
前回の記事で書いたとおり、ExiBee は BeagleBone のハードウェア設計をベースにしています。BeagleBone は世代を追うごとにいくつかバリエーションがあります。
- BeagleBone / BeagleBoneBlack (BBB): オリジナルの設計
- Seeed 製品
- BeagleBoneGreen (BBG): BeagleBoneBlack に Grove コネクタを追加したもの
- BeagleBoneGreen Wireless (BBGW): BBG に WiFi/BluetoothモジュールのWL1835を載せたもの
ExiBee は無線を積むので素直に考えると BBGW が一番近い先祖になります。ただし後述するように、無線まわりのピン配線は BBB→BBB Wireless→BBG→BBG Wireless で微妙に設計が異なっており、ここを間違えると素直に Nerves (Buildroot) の MIX_TARGET=bbb の資産に乗っかれません。このあたりの調査にわりと時間を溶かしました。
設計
ExiBee の設計は、私と、実際に基板の設計・実装を担当してくれた梅沢無線電機の内藤さんとで、メールと Zoom でのやりとりを重ねながら詰めていきました。
ボードの構成
ExiBee は共通の CPU ボードに、用途別の入出力ボード(Combo/DIO/AIO)をフレキシブルケーブルで接続する構成にしています。

左から、Comboモジュール完成版、Comboボード、CPUボード、ケースの正面パーツ。
- CPU ボード: SoC・電源・共通I/O(LAN, 無線, RTC, USB, Grove等)を担う。単体でも SBC として使える
- Combo ボード: シリアル・絶縁DI/DO・アナログ入出力を少しずつ揃えた、いわば「小さくまとまったPLC」
- DIO ボード: デジタル入出力に振ったボード(DIx16, DOx16、フォトカプラで絶縁)
- AIO ボード: アナログ入出力に振ったボード(4-20mAカレントループ、AIx8, AOx8)
前回の記事で書いた「1デバイス・1CPU」の考え方どおり、Combo/DIO/AIO はそれぞれ単体でも動作するモジュールとして設計しています。
SoC/SiP の検討
SoC は単体のチップではなく、TI の AM335x (ARM Cortex-A8 1GHz) に電源IC・発振子・RAM・eMMC までひとまとめにした Octavo Systems の OSD3358-C-SiP という SiP (System in Package) を採用しました。BGA (Ball Grid Array)パッケージなので基板実装のハードルは上がりますが、周辺部品をまとめて枯らせるメリットの方が大きいと判断しています。なにせ電源ラインに欠かせないコンデンサまで内蔵してますもので。
このSiPには温度範囲違いで2種類あり、産業用途なので温度範囲の広い OSD3358-512M-ICB (-40℃〜85℃) を選定しました。通常品の OSD3358-512M-BCB (0℃〜85℃) より高価ですが、屋外や空調のない盤内に置くことを考えるとここは譲れません。
ところがここで思わぬ壁にぶつかりました。2021年2月、コロナ禍による半導体不足のあおりを受けて、肝心の OSD3358-512M-ICB が Digikey/Mouser ともに在庫ゼロ、辛うじて Arrow に2個だけ、という状況になったのです。車載用チップが優先されてそれ以外の納期が軒並み伸びているタイミングでした。
このままでは試作すら進められないので、
- 最初の試作1台は在庫のあった
-BCB(0〜85℃) を使ってひとまず動かす - 環境負荷試験(後述の環境試験編で扱う予定)にかける分は
-ICBを待つ - 開発用の DIO/AIO は温度範囲を妥協して
-BCBで組む
という段取りに割り切りました。1ヶ月ほど経った3月、実装工場の製造ラインがちょうど -BCB の裏面部品実装を終えて表面部品にかかる直前というタイミングで -ICB の入荷連絡が来て、ライン止めてでも -ICB に切り替えるかどうかの判断を迫られる一幕もありました。結局切り替えてもらい、量産分は無事 -ICB で揃えられています。

Digikey のページより。
衝突の解消
I/Oのコネクタは物理的な制約があるので何でも欲しいI/Oを載せられるわけではありません。あとSiPもBGAでやたら端子が出ているとは言え、たくさんの機能を実現するためのピン配置を多重化しており、どれかを活かすためには別の機能を諦めないとならないシーンがあります。
I/Oコネクタをどうするか
産業用の入出力としてどこまで揃えるかは、限られたコネクタピン数とのトレードオフです。特に Combo ボードのシリアル(RS422/485)と、AI/AOの点数のバランスには最後まで悩みました。
- RS485を全二重で使えるようにする(RTS/CTS込み)→ AIx5, AOx1 か AIx6, AOx0
- RS485を半二重に割り切る → AIx7, AOx1 か AIx8, AOx0
半二重で困る現場はそう多くないだろうという判断で、最終的に RS485は半二重のみ、AIを多めに確保 という構成に落ち着きました。
無線周りの検討
もう一つ悩んだのが無線まわりです。BLE用に想定していたUART3が、他の必要な信号と丸かぶりしてしまい、かつ逃がし先がありませんでした。
- UART3のままだと詰む → 別のUARTに割り当てる
- BLEでRTS/CTSを使うかどうかで割り当て候補が変わる
- 使わないなら UART4 に割り当てて解決
- 使うなら コンソールをUART4に追い出して、BLEをUART0にする必要あり
さらにWiFi用の WL_SDIO_CMD (SiP側のMMC2_CMD) はどこにも逃がせない固定ピンで、これが割り当てられている B14 ピンの使い方が BeagleBone の世代によって異なっていることが分かりました。BBB/BBGでは B14 はJTAGのEMU4も兼ねる GPIO1_16 に繋がっているのに対し、BBG Wirelessでは同じピンがWiFiモジュール側に専有されています。つまりBBGWは無線を積む代わりにこのGPIOを犠牲にしている設計だったわけです。
最終的に、ExiBeeの無線まわりは素直に BBG Wireless の配線をそのまま踏襲することにしました。
- 有線LAN: BBGに倣ってMII1系統(1000BASE-Tは狙わない。100BASE-TXとはPoEの回路自体が別物になるため)
- WiFi: MMC2系統(BBGWと同じ)
- BLE: UART4、RTS/CTSなし
BBB Wireless と BBG Wireless とで無線周りの設計が違うというのは、実際に両方の回路図を突き合わせてみるまで気づきませんでした。
SiP ピンの割当
モードを持つピンは基本的に BeagleBone のリセットモード(モード7)のまま使う方針にしました。これを崩すと Buildroot 側の Device Tree をゼロから作り直すことになり、Nerves の資産に乗る旨味が消えてしまうためです。
外部に出すP9コネクタ互換ピンについては、
- BBB/BBGのP9とピン互換にする
- ただしSiPから出てない信号や、CPUボード内部で使ってしまって外に出しようがない信号はNo Contactにする
- 例: UART1はRS485に、UART4はBLEに使うのでP9には出さない
- 逆にSPI0/SPI1はアナログボード用に使うのでP9に出す
という基本方針で決めています。地味なところでは、電源LEDの色を「緑ではなく青、できれば紫にしてほしい」という要望を出したりもしました(前回の記事で触れた「やる気の出る外観」の一環です)。
製作
実機の製作は、まず試作を行って致命的な問題が無いかを確認し、それからたくさん作るようにしました。
試作
設計をある程度固めたところで試作に入りますが、前述の半導体不足のあおりで試作初号機はやむなく温度範囲の狭い -BCB で組みました。この時期はメールとZoomでのやりとりの密度がかなり上がり、週に何度もオンライン打ち合わせをしていた記憶があります。
試作機の立ち上げでは、AIOボードのアナログ入力を担当しているPIC(SPI経由でADCを読み、CPU側にはI2Cでブリッジする構成、コンセプト編で触れた「別にCPUを設ける」方式)まわりで、I2Cバスがまれに解放されなくなるという厄介な不具合が発生しました。詳細は次の「バグ」の節で書きます。
製作個数と製作コスト
製作は年度予算の範囲で発注する形をとりました。基本的には「予算内でComboを何台作れるか」から始まり、DIO/AIOとの配分を何度もやり取りしながら詰めていくことになります。
コスト構造としては、
- CPUボードだけはBGA実装が必要なので、実装工場に検査設備込みで依頼する初期費用がそれなりに高い
- Combo/DIO/AIOそれぞれのボード種類ごとに、メタルマスク代・マウンタセットアップ代などの初期費用がかかる
- 基板の品種を増やすほど初期費用がn倍で効いてくる
という具合で、「3種類まんべんなく作る」より「品種を絞って台数を稼ぐ」方が単価は下がります。最終的には
- Combo x6
- DIO x2
- AIO x2
という配分に落ち着きました。ケースは納期が長いので、実際に使う台数より多めに10台単位でまとめて先行発注しています。
ざっくりした感覚値としては、CPUボードの初期実装費用だけで十数万円、Combo/DIO/AIOそれぞれの初期費用が10〜13万円程度、量産後の1台あたりの単価がボード種別によって12〜16万円程度、という規模感でした(部品の入手状況や実装業者の見積もりで変動するので、あくまで当時の目安です)。

出来上がったマシン。左からComboモジュール、DIOモジュール、AIOモジュール。
バグ
実際に基板を起こしてみると、当然ながらいくつか問題が見つかりました。
CPU-IOボード間コネクタのSPI信号の食い違い
CPUボードとIOボードをつなぐフレキケーブル用コネクタ(CN4)で、SPI関連の信号配列がCPU側とIO側とで食い違っていることが判明しました。幸い今回はCPUボードからSPIを直接操作する使い方をしていなかったため、フレキケーブルの該当端子をカプトンテープで絶縁して未接続にする、という応急処置で切り抜けています。次バージョンに向けてCPUボード上に0Ωジャンパ抵抗のパターンを追加し、普段は切り離しておけるようにする改修を入れました。
LED3/LED4の入れ替わり
CPUボードの回路図上でLED3とLED4の割り当てが逆になっているミスも見つかり、これは素直に回路図を修正しています。
AIOのI2Cバスが稀に解放されない
AIOボードのPICが、CPU側からデータ読み出し終了を指示されたにもかかわらず、まれにI2Cバスを解放しないままになるという不具合がありました。PIC側のSPIアクセスを止めると発生しなくなる一方で、SDAラインに直列抵抗を挟んでどちらがバスをドライブしているか調べると、どうもCPU側がSDAをLに引っ張っているように見える……という、原因の切り分けが最後まで難航した一件です。
最終的な原因は、I2CのSCL信号にオーバーシュート・アンダーシュートによる「ひげ」が乗っており、それを本来関係のないRTCが誤って拾ってしまい、意図しないタイミングでデータを送出していた、というものでした。対策としてSCLラインに22pFのキャパシタを追加し、ひげを吸収することで解決しています。同じ I2C バスに複数デバイスをぶら下げる構成だと、こういう形で無関係なデバイスが割り込んでくることがあるという教訓です。
AIOのアナログ出力LEDが電源投入直後に不安定になる
AIOボードのAO(アナログ出力)は、電源投入直後にLEDがランダムっぽく点灯し、PoEの給電を切ると全点灯、キャパシタの電荷が残っている間に再投入するとちらつく、という現象がありました。使っているD/AチップのマニュアルにC「出力0mAで何も接続されていない場合はLED表示が不安定になる」旨の記載があり、これが該当していそうだという結論になっています。
まとめ
産業用途に Nerves を導入するために独自のハードウェアを構成することにしました。ここではプロジェクト当初を振り返ってその設計と製作について書き起こしました。
半導体不足という外的要因に振り回されつつも、BeagleBoneファミリーのピン配置の細かい差異を調べ上げ、実装後に見つかった不具合をひとつずつ潰しながら、なんとか量産までこぎつけた、というのが実際のところです。次回はこの基板にNervesのファームウェアをポーティングした話を書く予定です。




