The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

Raspberry PiでBLDCモータを120°通電制御する

はじめに

本ブログの前々記事にてブラシレスDC (BLDC)モータの120°通電制御について書きました。STMicroelectronicsのモータ制御開発キットP-NUCLEO-IHM001の制御装置はもちろんSTM32マイコンの載ったNucleo F302R8です。

このNucleoをRaspberry Piに繋ぎ替えてみたら面白いのではないか──。技術的にはほとんど意味のないことかもしれませんが,Raspberry Pi OS(旧称Raspbian)というLinuxが走っている「コンピュータ」であるRaspberry Piでも交流モータを制御できるのかどうか*1,試してみたいじゃありませんか?

インターネット上にはRaspberry PiでBLDCモータを廻している記事も散見されますが,ESC (electronic speed controller)を途中に挿入している場合が多いようです。モータドライブインバータへのゲートパルスをRaspberry Piで直接生成している例は見つけられませんでしたので,ひょっとすると新しい試みなのかもしれません*2。図1にRaspberry Piを接続したBLDCモータ実験システムを示します。

f:id:s-inoue2010:20210321031911j:plain:w400
図1: Raspberry Piを接続したBLDCモータ実験システム

結論として,C言語でpigpioライブラリ(pigpiod_if2.hではなくpigpio.h)を使い,かつ,マルチコアのRaspberry Piでは,Nucleoに肉薄する制御を(120°通電制御という範囲内で)実現できるらしいことが判りました。

当初はPythonで交流モータを廻すという異端を試してみたかったのですが,今のRaspberry Piではまだ難しいようです*3。 以下では,Raspberry Piでモータを廻すに至る経緯や,プログラム実装への試み,実装したC言語プログラム,シングルコアと4コアの比較について述べます。

目次

Raspberry Piでモータを廻すに至る経緯

Raspberry Piとの再会

新型コロナウイルス対策のためにしばらく在宅勤務となっていますが,年明け頃のある日,久し振りに職場まで出掛けることになりました。その帰路,秋月電子通商にふと立ち寄ると,2,200円で売られているRaspberry Pi Zero WHが目に留まり,気が付けば1,500円のIoT学習HATキットと一緒に衝動買いしておりました。そう,それが本記事のきっかけです。

akizukidenshi.com

その時点で既に私はRaspberry Piを1台所有しておりました。2014年に購入したRaspberry Pi Model B+です。今更説明するまでもありませんが,Raspberry PiLinux等のOSを動かすことのできるシングルボードコンピュータです。また,普通のパソコンとは異なる特徴として,GPIO (general-purpose input/output)がピンヘッダに出ており,ユーザのプログラムによって自由に制御できる点が挙げられます。NucleoやArduinoのようなマイコンボードとパソコンの中間的な存在とでも言いましょうか。IoTに最適なデバイスのひとつと言えるでしょう。しかし,私のRaspberry Pi Model B+は単なるsambaファイルサーバとしてしか活用しておらず,GPIOはLチカやPWMをやっただけで放置しておりました。何とももったいない話です。

f:id:s-inoue2010:20210321020650j:plain:w400
図2: Raspberry Pi Zero WH(アクリルケースに納めたもの)

f:id:s-inoue2010:20210326023404j:plain:w400
図3: IoT学習HATを取り付けた例

図2に示すRaspberry Pi Zero WHはFRISKと同程度の大きさという非常にコンパクトな基板でありながら,1 GHzで動作するBroadcom BCM2835に512 MBのメモリを備え,それに加えて何と無線LANBluetoothまで載っており,GPIOの数はModel A+やB+と同じ,それでいて2,200円で手に入るという,とんでもないコストパフォーマンスのシングルボードコンピュータです。図3は秋月電子通商で手に入るIoT学習HATキットを組み立て,Pi Zero WHに取り付けた状態です。LCDキャラクタディスプレイやLED,圧電ブザー,押しボタンスイッチなどが取り付けられており,GPIOを使ったプログラムの学習やデバッグに役立ちます*4。その後,Pi Zero WHは何故か増殖していき,今のところ,私の手元に4台あります。

f:id:s-inoue2010:20210321021556j:plain:w400
図4: Raspberry Piたち(現在はこれからPi 3 Model A+とPi Zero WHが1台ずつ増えています)

Raspberry Pi Zero WHのCPUは1コアですが,最新のPi 4 Model BやPi 3 Model A+,BのCPUは4コアです。マルチコアの威力も試してみたいということで,Pi 3 Model A+も何故だか2台が我が家に鎮座しています*5。図4に我が家にあるRaspberry Piを示しますが,現在はこれからさらにPi 3 Model A+とPi Zero WHが1台ずつ増殖しております。

ブラシレスDC (BLDC)モータを廻す環境

本ブログの前々記事にてご紹介した通り,STMicroelectronicsのP-NUCLEO-IHM001というこれまたコストパフォーマンスの高いモータ制御開発キットが入手可能です。詳細は本ブログの前々記事をご参照下さい。

negligible.hatenablog.com

これは,(i) マイコンボードNucleo F302R8,(ii) モータドライブ基板X-NUCLEO-IHM07M1(モータドライバIC L6230による三相インバータ),(iii) ブラシレスDCモータBR2804-1700KV,のセットであり,Nucleo F302R8とX-NUCLEO-IHM07M1は2列ピンヘッダ・ピンソケット2つ(C_7とC_10)で上下にスタックする形となっています。

目標としてはBLDCモータのセンサレスベクトル制御を理解し実装することなのですが,今回も含めてホールセンサあり120°通電制御でいろいろな寄り道をし過ぎておりますね…。

pigpioライブラリとの出会い

Raspberry PiのGPIOはPythonをはじめとする様々なプログラミング言語から(さらにはシェルからも)制御できます。そのためにはレジスタを直接制御する(俗にいう“叩く”)こともできるとは思いますが,やはりライブラリを用いるのが一般的かと思われます。以前はWiringPiと呼ばれるライブラリが定番だったようですが,2019年から開発停止しているらしく,代替となる各種ライブラリに注目が集まっているようです。そのうちの1つがpigpioライブラリです*6

abyz.me.uk

非常に豊富な機能が実装されており,かつ,インターネット上の情報を集める限り,リアルタイム性に優れている(ソフトウェアPWMのジッタが少ないなど)ようです。また,GPIOピンへの入力信号の変化を捉える割り込みも作ることができるようです。開発者であるjoan2937さんによるC言語PythonAPIが準備されております。

pigpio公式サイトもさることながら,私はdecafishさんのブログ「腰も砕けよ 膝も折れよ」のpigpioライブラリ関連記事を拝読して勉強させて頂きました。この場を借りて感謝申し上げます。

decafish.blog.ss-blog.jp

ホールセンサあり120°通電制御では制御装置,モータドライバ,ホールセンサで授受する信号は全てディジタル(電流検出値などアナログ信号をA-D変換したディジタル信号も不要)であり,プログラムでの実装も容易です。また,Raspberry Piはアナログ入出力を持っていないのですが,120°通電制御であれば外付けのA-Dコンバータなどは不要です。 さらに,前述の「腰も砕けよ 膝も折れよ」をはじめとするインターネット上の情報に接するに,pigpioライブラリはリアルタイム性に優れているため,これをうまく使えばRaspberry PiでBLDCモータを120°通電制御できるのではないか──。そう考えるに至りました。

予備実験 ~ pigpioライブラリの実力を試す ~

という訳で,pigpioライブラリでBLDCモータ(具体的にはP-NUCLEO-IHM001付属のBR2804-1700KV)を制御できるのかどうかを見極めるため予備実験を試みました。

結論から言うと,pigpioライブラリでローカルのRaspberry PiのGPIOを高速に直接制御できるAPIC言語向けにしか用意されておらず,C言語でなければ要求されるリアルタイム性を実現できない,逆に言えばC言語であれば何とかモータを制御できそうだという見込みを得ました。

表1: pigpioライブラリの2つの動作

動作C言語Pythonroot権限リモート制御リアルタイム性
GPIOを直接制御pigpio.hなし不可😀
pigpiodデーモンと通信pigpiod_if2.hpigpio不要🙂

表1に示すように,pigpioライブラリの動作には2種類あり,(i) root権限が必要ではあるものの,より高いリアルタイム性を狙えるGPIOを直接制御する動作と,(ii) root権限は不要で,しかもリモートのRaspberry PiのGPIOをも制御できるものの,リアルタイム性は若干低いpigpiodデーモンを介した動作,の2つがあります。pigpioライブラリ自体はC言語で書かれており,Python用のモジュールは後者しか用意されておりません。したがって,残念ながら今回のようなBLDCモータの制御にはPythonの適用は難しそうであるとの結論に至りました*7

C言語ライブラリの一方,pigpio.hにおいては,さらに,割り込みを実現する方法としてgpioSetAlertFunc関数を使う方法とgpioSetISRFunc関数を使う方法の2種類が用意されており,より高速な応答を期待できる後者を用いる必要があります。gpioSetISRFunc関数では,公式サイトに

Typically the latency will be of the order of 50 microseconds. The latency is not guaranteed and will vary with system load.

と記載があり,この通りであれば次節で述べるリアルタイム性を何とか満足できるのではないかと考えました。ただし後半の記述からは,バラツキが生じるであろうことが予想できます。やはり,予備実験が必要です*8

要求されるリアルタイム性

図5に前々記事の図6を再掲します。Nucleo F302R8では,ホールセンサからの出力信号の3つのいずれかがHighからLow,またはその逆に変化した際に割り込みルーチンに入り,3つのホールセンサの信号を改めて確認してから現在のセクタを割り出し,インバータのスイッチングパターンを決めておりました*9。これをRaspberry Piで同じように実現するためには,割り込みの応答時間を調べる必要があります。まず,応答時間をどれだけ短くする必要があるのでしょうか。

f:id:s-inoue2010:20201111132141p:plain
図5: 120°通電制御のシーケンス(前々記事の図6)

図6に本ブログの前々記事の図12を再掲します。Nucleo F302R8でBLDCモータを制御した際の実験波形です。このとき,デューティは0.5程度であったと思われますが(可変抵抗器で設定しているため正確な値は不明),電気角1周期が約1.625 msであると読み取れることから,回転数は60 / 1.625 ms / 7 ≈ 5,300 rpmであることが判ります。

f:id:s-inoue2010:20201111141411p:plain
図6: Nucleo F302R8で制御した際のU相出力電圧(U-N間)とアナログ出力したセクタ信号の実験波形(前々記事の図12再掲)

1セクタは(図6で見えるこの特定の電気角1周期についての)平均で271 μsであり,ホールセンサの信号変化を捉えてから,インバータのスイッチングを切り替えるまでに,これよりも十分に高速な処理が可能であれば,少なくとも数千rpmでモータを廻すことが可能であると考えられます。 割り込みの応答速度が1セクタの半分を超えてしまうと,もはやモータを加速するトルクは作られないと予想されるため,割り込み時間は135 μsを十分に下回る必要があります。もし,C言語でのgpioSetISRFunc関数による割り込みが50 μsで応答するならば,十分に高速にモータを廻せそうです。

割り込みの応答時間の測定

当初,インタプリタ言語であるPythonでモータを廻すことができると(変態的で)面白いかと思っておりましたが,結論から言うと,応答時間を測ったところ,P-NUCLEO-IHM001付属のBLDCモータでは難しそうでした*10

C言語Pythonともに以下のような方法で割り込みの応答速度を確認しました。C言語ではgpioSetAlertFunc関数を用いる方法とgpioSetISRFunc関数を用いる方法を両方とも試して比較しています。

IoT学習HATで赤LEDと緑LEDがそれぞれ繋がっているGPIO17とGPIO27を使います。ソフトウェアのmain関数(Pythonでは地の文)で出力に設定したGPIO27の信号を変化させます*11。すると,予め設定しておいた割り込みルーチン(コールバック関数)が呼ばれ,その中でsystem tick*12を取得するとともに,GPIO17をHigh,続いて即座にLowに変化させます*13。さらに,割り込みのきっかけとなったGPIO27をHighに変化させた時点でのsystem tickを格納しているグローバル変数tick_oldとの差分を計算し,それをファイルに書き込みます。

main関数(Pythonでは地の文)の中では,GPIOの初期化等を終えた後,2 ms毎にGPIO27をHigh, Lowに切り替えます。また,GPIO27をHighに変化させる直前にsystem tickを取得し,グローバル変数tick_oldに格納しておきます。これを指定した回数(今回は10,000回としました)だけ繰り返すことにより,割り込みへの応答時間の分布を得ます。

言葉では分かりにくいと思いますので,具体的にはGitHubに置いたソースコードをご覧下さい。C言語の2つのプログラムにはroot権限が必要であるため,sudoしないと動作しませんのでご注意ください。

github.com

シングルコアとマルチコアの違いを知りたかったため,同じ測定をPi Zero WHとPi 3 Model A+で実施しました。図7,8,9に測定結果を示します。少々分かりにくいですが,縦軸が対数グラフとなっているヒストグラムです。

f:id:s-inoue2010:20210325181047p:plain:w600
図7: C言語による割り込みの応答時間の測定結果

f:id:s-inoue2010:20210325181203p:plain:w600
図8: C言語による割り込みの応答時間の測定結果(gpioSetISRFuncのみ拡大)

f:id:s-inoue2010:20210325181248p:plain:w600
図9: Pythonによる割り込みの応答時間の測定結果

図7,8は同じC言語による測定結果です。図7はgpioSetAlertFunc関数とgpioSetISRFunc関数の結果を重ねて表示しており,図8ではgpioSetISRFunc関数による結果のみを抜き出しています。図7を見ると,Pi Zero WHでもPi 3 Model A+でも,gpioSetAlertFunc関数では1 msまで広い範囲でバラツキが見られます。一方で,gpioSetISRFunc関数を使った場合,Pi Zero WHでは150 μs以内にで95.9%の確率で応答し,Pi 3 Model A+では50 μs以内に98.8%の確率で応答することが判りました。特にPi 3 Model A+ではpigpioライブラリの公式サイトに記載の50 μsを概ね満足しており,Nucleo F302R8と同じく10,000 rpmを超える回転数までモータを廻せるのではないかと考えられます。Pi Zero WHでは恐らく数千rpmで頭打ちになると予想できますね。

図9はPythonでの結果です。Pi Zero WHでは2 ~ 3 ms,Pi 3 Model A+でも0.6 ~ 1.9 msの応答時間を要しており,残念ながらこれで今回のモータを廻すのは難しそうです…いやぁ,インタプリタ言語でモータを廻すと楽しそうだったんですけどねぇ…。

モータを廻す

それではついに,モータを廻すこととしましょう…✨

Raspberry PiとX-NUCLEO-IHM07M1の接続

以上より,C言語でかつgpioSetISRFunc関数を使ってBLDCモータを120°通電制御するプログラムを書くこととしますが,その前に,Raspberry PiとX-NUCLEO-IHM07M1およびBLDCモータ,ホールセンサ基板を図10のように接続することとします。

f:id:s-inoue2010:20210325183323p:plain:w600
図10: Raspberry PiとX-NUCLEO-IHM07M1の接続図

EN1, 2, 3はモータドライバL6230のU, V, W相をそれぞれゲートブロック,ゲートデブロックする信号であり,GPIO16, 20, 21に接続します。当然,これらのGPIOは出力に設定します。U, V, W相の上側MOSFETと下側MOSFETのどちらをオンさせるか選択する信号であるIN1, 2, 3は,Raspberry PiにてハードウェアPWMが可能なGPIO12, 13, 18に接続し,同じく出力に設定します。

ホールセンサH1, 2, 3はGPIO2, 3, 4に接続し,もちろん入力に設定します。あとは3.3 Vの電源線とGNDを接続すれば,Raspberry PiからX-NUCLEO-IHM07M1を制御できます。

[追記: 2021/04/01]なお,Raspberry PiのGPIOは電源投入時にすべて入力となりますが,その際に内蔵の抵抗器によってプルアップされるのか,またはプルダウンされるのかはピンによって固定されております*14。仮に入力に設定されるとしても,もしプルアップされていれば,モータドライバIC L6230にとってはHighが入力されたことになってしまい,三相インバータが意図しないスイッチング状態となってモータに異常な電流を流してしまうことがあります。もちろんソフトウェアでプルアップ・ダウンするか否かは選択できるのですが,電源投入からそのソフトウェアの設定が活きるまでには(設定の仕方にも依りますが)秒から分単位の時間を要します。そのため,HATなど周辺回路を設計するには,電源投入時のプルアップ・ダウン状態で問題がないようなピンを選択して割り当てるのが望ましい方法です*15Raspberry Piの40ピンのピンヘッダに出ているGPIO0 ~ 27の範囲では,GPIO0 ~ 8が電源投入時にプルアップされ,それ以外のGPIO9 ~ 27は電源投入時にプルダウンされます。本記事にてEN1, 2, 3およびIN1, 2, 3との接続に割り当てたGPIO16, 20, 21, 12, 13, 18は電源投入時にプルダウンされるピンです。一方,ホールセンサH1, 2, 3との接続に使用するGPIO2, 3, 4は電源投入時にプルアップされるピンです*16。電源投入時のプルアップ・プルダウン設定や電源投入時の挙動については以下のリンクに詳しい説明があります。

www.raspberrypi.org

https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf

Raspberry Piの電源はそのままmicroUSBから得ることにします*17。モータドライバL6230の直流電源は秋月電子のACアダプタから9 Vを与えました。本来は12 Vまで大丈夫のようですが,ビビリなので9 Vに留めました💧

なお,Raspberry PiとX-NUCLEO-IHM07M1,ホールセンサ基板の接続は図1から分かるようにブレッドボード用ジャンパワイヤですので,ちょっとした刺激ですぐに外れてしまいますので注意が必要です。特にGPIO18が何故か外れやすく,気が付くとモータの回転がおかしくなっていました…。

C言語のプログラム

前述の通り,Nucleo F302R8でのプログラムと同じように,ホールセンサH1, 2, 3の信号の変化を捉えて割り込みルーチン(コールバック関数)に入り,そこでセクタを選択して三相インバータ(L6230)のスイッチングパターンを決めるようにしました。また,起動時には強制転流モードで始動を試みます(失敗することもあります💧)。さらに,pigpioライブラリで簡単にsystem tickをμs単位で取得できるので,これを用いてソフト的に回転数を測ることができるようにしました。

また,今回,Raspberry Piには操作ボタンや可変抵抗器などを取り付けなかったため,モータの起動・停止やデューティの変更はすべて標準入力からキーボード操作することとしました。しかも,いわゆるヘッドレス運用をしているためSSH経由です。離れたところからモータをキーボードで制御する──何となく新鮮な感覚でした。

完成したC言語のプログラムはGitHubに置きました。以下をご参照下さい。予備実験と同じくroot権限が必要であるため,sudoしないと動作しませんのでご注意ください。

github.com

実験結果

廻っている様子は動画でご覧下さい。Pi Zero WHとPi 3 Model A+では回転の安定性や,CPUが他のタスクに取られた場合の挙動が随分違うことが判ると思います。1つ目の動画では,Pi Zero WHとPi 3 Model A+の割り込み応答時間のジッタが分かるように波形を動画として撮ってみました。黄色のCH2は,デバッグ用に出力しているセクタ1(図6参照)に入っている期間にHighとなる信号です。Pi 3 Model A+の安定性が際立ちます。パッと見では,Nucleoで廻している場合と区別がつきません(個人の感想です💧)。2つ目の動画では,廻っている途中で新たにもう1つSSHセッションを開くことを試みました。シングルコアのPi Zero WHでは文字がターミナルに表示される毎にモータの回転が乱れ,まるでハードディスクのアクセスのような音が聞こえます。一方,Pi 3 Model A+ではもう1つのSSHセッションを開いてもほとんど回転の乱れはありませんでした。

www.youtube.com
動画1: Raspberry Pi Zero WHと3 A+の割り込み応答時間の比較

www.youtube.com
動画2: モータ回転中にsshで新しいセッションを開いた場合の挙動

定量的な評価もしてみましょう。図11に,Pi Zero WHとPi 3 Model A+のそれぞれについて,デューティを0.06から1.00まで変化させた場合の回転数をプロットしました。

f:id:s-inoue2010:20210413104729p:plain:w600
図11: デューティと回転数

Pi Zero WHでは約6,000 rpmで頭打ちになってしまいます。6,000 rpm (100 s−1)でかつ7極対のモータでは1セクタが238 μsですので,図7に示すように,割り込み応答時間が130 ~ 140 μsになってしまうPi Zero WHではこれが限界となると考えられます。一方,Pi 3 Model A+ではデューティにほぼ比例して回転数が上昇し,デューティ1では約10,800 rpmに達しました。このとき1セクタは132 μsであり,Pi 3 Model A+の割り込み応答時間が50 μsを下回っていることから,まだ余裕があることが判ります(直流電圧を上げればまだ速くなると思われます)。

まとめ

Raspberry Piとの新たな出会い,そしてBLDCモータ制御開発キットとpigpioライブラリが揃ったことにより,Raspberry PiでBLDCモータを120°通電制御することができました。割り込みの応答時間を測る予備実験の結果から,C言語でpigpioライブラリを使うことによりモータを制御できそうであることが判りましたが,シングルコアのPi Zero WHと4コアのPi 3 Model A+では制御性能に無視できない差があることも判りました。さらに,残念ながらPythonでモータを廻すという異端行為は今の段階では難しいことが明らかになりました。もし,Raspberry Pi Picoが手に入ったら,MicroPythonで試してみようと思います。

あとがき

今回,gpioSetISRFunc関数を使いましたが,pigpioライブラリの公式サイトでは,

The underlying Linux sysfs GPIO interface is used to provide the interrupt services.

と言っており,これはLinuxに特有の機能を用いているようですが,sysfsやISRが何なのか,全く理解していません…💧 やはり,Linux,特にカーネルについて基礎的でも良いので勉強してみようと思っています。

また,前々記事は昨年11月,P-NUCLEO-IHM001を購入したのは何と昨年9月です…。もう半年も120°通電制御で寄り道しているんですね…💧 センサレスベクトル制御まで少しずつでも前進していこう…❗ とは言え,Raspberry Piでは本記事のモータ制御の他に,pigpioライブラリ(Pythonのpigpioモジュール)とWebアプリケーションプラットフォームFlaskを使った外出先からエアコンや照明を制御するための赤外線リモコンプロジェクトも並行して進んでおり,それもまとまり次第,本ブログに書こうと思っております。なかなか寄り道癖が治りませんね💦

*1:Raspberry PiリアルタイムOSを載せたり,ベアメタルで使うという記事もありますね。いろんな技術を試してみたいものです。

*2:まぁ,Nucleoみたいな普通のマイコンボードでやろうよという制御ではあるのですが…。

*3:Raspberry Pi PicoのMicroPythonだったらできるかも──などと変なことを考えています。

*4:現在,温湿度気圧計として24時間稼働中です。

*5:Pi 4は電源への要求や発熱が大きいということで,ビビッております…。

*6:pig + pioではなくpi + gpioです。

*7:ただしそれでも数十msオーダの制御には十分に適用可能であると思われます。また,予め波形を作っておくwaveformという機能では,μsオーダの時間分解能でパルスを制御できます。

*8:実際はモータを廻してから予備実験しました…💧 考えるよりまず先に手を動かせ…❗

*9:前々記事ではホールセンサの信号をポーリングで検出していましたが,その後,割り込みを使うようにプログラムを改造しました。

*10:定格回転数での電気角の1周期が遅いモータであれば回せるかもしれません

*11:出力に設定されているGPIOでも,信号がHighからLow,またはその逆に変化すれば割り込みルーチンに入ります。

*12:pigpioライブラリでは1 μs単位で常時カウントアップしているタイマのその時点での下位32 bitを(C言語では)uint32_tとして取得できます。Pythonでは整数型にバイト数の概念がないので,差分を計算する専用関数tickDiffがあります。

*13:この動作は本来不要ですが,オシロスコープで直接割り込み応答時間を確認するために行っています。

*14:電源投入時の入出力ピンの状態がどうなるのか──制御装置としては非常に重要な問題です。設計を誤れば,インバータやモータなど,GPIOの先に接続されている回路や機器を破損することもあり得ます。

*15:次回に紹介させて頂く予定の自作赤外線リモコンHATでは,赤外線LEDを光らせるためのMOSFETのゲートを駆動するために使うGPIOにGPIO6を割り当ててしまい,電源投入からPythonのプログラムを走らせるまでの間に意図せずMOSFETがオンしてしまい,赤外線LEDの電流制限抵抗47 Ωに数十mAの電流が流れ続けて過熱してしまったことがあります。その後,電源投入時にプルダウンされるGPIO13に繋ぎ替えました。

*16:ホールセンサ基板内にも別途プルアップ抵抗器があります。

*17:当初はX-NUCLEO-IHM07M1からRaspberry Piの電源を得ようかと考えましたが,3端子レギュレータか降圧DC-DCコンバータが必要になるので止めました。