United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

AIによる人追跡ショッピングカートの開発 ~パート3: ハードウェアの組み立てとテスト~

人物追跡機能付きショッピングカートのフレームとインターフェース用プリント基板を組み立て、ハードウェアの動作を確認するためのPythonスクリプトを書き込みます。

Finished Trolley Frame Assembly

はじめに

この連載のパート2では、人物追跡機能付きショッピングカートのアルミ押出材製フレームを設計しました。また、ショッピングカートの制御システムを構成する電子部品についても調べました。今回は、インターフェース用のプリント基板とフレームを組み立て、すべての構成部品で動作確認を行います。

フレームの組み立て

Frame Assembly - Pad creating a list of parts

まず始めに、フレームを形成するアルミ押出材を切断してきます。切断する長さを、前回設計したCADモデルに基づいてリストにまとめました。「2回測って1回切る(measure twice cut once:行動する前に確認を怠るなという意味)」のことわざを念頭に置いて、アルミ押出材を寸法通りに切断し、ボルト留めもできるようにしました。普段通りにやすりがけをして、押出材の縁に残ったバリを取りました。

Frame Assembly - using Rexroth extrusion system in construction

Rexroth社の押出材を使用しているため、幅広い品揃えのアクセサリーを使うことができました。ここでは、押出材を固定するため、ガセットの代わりに、外形にぴったりと合って見た目がすっきりとするような、丸みを帯びたコーナーブラケットを使用しました。

こちらはキット販売 (420-6959) されており、 コーナーブラケットとM8セルフタッピングねじ3本がセットになっています。これを使えば、素早く簡単に取り付け作業が進み、押出材側の事前準備が必要ありません。セルフタッピングねじをねじ込む際には、手元にある小型のコードレスドライバーだとトルクが不十分であったので、コードレスドリルを使用しました。

Frame Assembly - With corner covers

フレームの角の見栄えをよくするために、コーナーブラケット中心部にある穴に押し込んで取り付けるタイプのキャップ (420-6971) も購入し、取り付けました。

上部分と下部分のフレームを別々に組み立て、四隅の縦に伸びる押出材をねじで固定できるようにします。フレームすべてを組み立てる前に、ショッピングカートの底となる部分にアルミニウム板を取り付けました。ここに配線や制御装置、バッテリーを固定します。

Frame Assembly - with top and bottom frames

プレートを取り付けたので、コーナーブラケットをねじで固定し、かごの底になるベースプレートを取り付けました。最後に上部も取り付け、フレームの完成です。

プリント基板の設計、組み立て

Jetson NanoのGPIOは3.3Vレベルですが、今回私たちが選択した構成部品は、より高い電圧(ほとんどが24V)で動作するため、信号のバッファリングとレベルシフトが可能な基板を設計する必要がありました。

まず、必要となる入力と出力をすべて調べることから始めます。Electromen社製のモータードライバーに必要なのは、速度制御用の0~5Vアナログ信号と、方向制御に4~28Vデジタル入力が必要です。積層信号灯には3つのランプそれぞれに24V入力と、共通のアース接続が付いています。また、2つのIFM近接センサーは、負荷に対して24Vを供給します。

回路図をDesignSpark PCBをつかって書き始めました。Jetson NanoのGPIOピンに対応した40ピンのピンヘッダー、多くの24V、5Vハイサイドスイッチ、そして、オペアンプ回路で構成しています。

PCB Design - Schematic - MOSFET

上3つの24V用ハイサイドスイッチ回路は5Vのものと少し異なり、抵抗器が1つ多く付いています。これは、MOSFETの多くがゲート電圧が20Vを大きく超過するものには耐えられないためです。ここでは、2つの抵抗器で分圧回路をつくり、ゲートとソースの間に12Vの電位差を生むことで、デバイスを動作させるのに十分な電圧を確保しています。

PCB Design - Schematic - low pass filtering

オペアンプ回路では、Jetson NanoからのPWM信号をローパスフィルターに通し、0~3.3Vからモーターコントローラーに適した0~5Vへレベルシフトします。モーターコントローラーの入力はPWM信号ではなくアナログ入力を想定していることから、ローパスフィルターが必要になっています。そしてこれがPWM信号に対し、どういった反応を示すかわからなかったため、他の部品のことも考え、慎重を期してLPF回路とバッファー回路を実装することに決めました。

バッファー回路の簡単なシミュレーションを実行してみると、正しいゲインとなるように抵抗器の値が選択され、回路が期待通りの動作をしていることが確認できました。

近接センサーからの24V信号は、GPIOピンに対して3.3Vで出力されるよう、抵抗値を計算した分圧回路によって処理されます。

PCB Design using DesignSpark PCB

回路図の設計が終わったので、次はプリント基板の部品配置を考えます。今回の基板は、比較的単純にレイアウトを考えることができる基板で、最終的なものはかなりコンパクトになりました。基板の大きさをコンパクトにできたのは、40ピンのピンヘッダーと他の様々な構成部品に接続される多数のコネクターのおかげです。今回は大きな電流容量が不要だった点と、配線しやすい接続方式であった点から、小型のPhoenix Contact MCシリーズのコネクターを選択しました。

PCB Assembly

プリント基板の組み立ては、1時間もかからずに終わりました。ここから、各部分の入出力に関するテストに移ります。

Jetson Nanoのセットアップとテスト

フレームとインターフェース用プリント基板を組み立てたので、Jetson Nanoの設定、GPIOインターフェースのテストを行いました。

まず始めに、5Vの外部電源入力をバレルジャックから行えるように、「J48」が確実にジャンパーされているかどうか確認しました。これによってすべてのベンチテストが容易に行えます。JetsonのGPIOヘッダーは、40ピンのリボンケーブルを介してインターフェース用基板へと接続しました。

Jetson PWMインターフェースの設定

パート1ですでにJetson NanoにLinuxのイメージを書き込んであるので、動作環境は整っていました。ハードウェアのPWMピンを使用するには、LinuxのDevice Treeを通して設定する必要があります。

Screen shot of the Jestson Expansion Header Tool - Configuration

ありがたいことに、Nvidia社からGPIOピンの設定を行うための、CUIベースのPythonスクリプトが提供されています。sudo /opt/nvidia/jetson-io/jetson-io.pyを最大化した端末に入力することで、実行可能です。( ツールを正しく表示するには、ウィンドウを最大化して実行する必要があります。)

Screen shot of the Jestson Expansion Header Tool - Function

ツールを実行し、「Configure 40-pin expansion header」を選択します。次に、「pwm0」と「pwm2」にチェックを入れました。すると、ツールがデバイスツリーオーバーレイ(Device tree overlay)を生成します。その後、これをデバイスツリーブロブ(Device tree blob)にコンパイルし、再起動をすることで適用されます。

次にPythonライブラリの「Jetson.GPIO」をインストールしますが、これはsudo pip install Jetson.GPIOを実行するくらい簡単な作業です。まずは、適用する必要がある一式の「udev」ルールと、いくつかのサンプルPythonアプリケーションが含まれているGithubリポジトリをクローンしておきます。次に、「gpio」という新規のユーザーグループを作成し、sudo groupadd -f -r gpio && sudo usermod -a -G gpio jetsonを実行することで、ユーザーをこのグループに追加していきました。

これが済んだら、udevルールをリポジトリのルート内からsudo cp lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/ によってインストールしました。その後、再起動をかけるか、sudo udevadm control --reload-rules && sudo udevadm triggerを実行して、ルールを適用する必要があります。

GPIOインターフェースのテスト

この時点で、PWM出力が作動し、インターフェース用基板が問題なく0~5Vのアナログ出力を生成できることを確実にするため、PWM用サンプルを実行し、確認しました。出力ピン番号を変更するためと、PWM周波数を上げるための両方の点から、スクリプトを多少変更しています。例えば、PWM周波数が50Hzに設定されていましたが、ローパスフィルターが良好で滑らかなDC電圧を発生させるために1kHz以上必要だった点が挙げられます。

Testing the GPIO Interfaces

オペアンプのチャンネル出力を調べたところ、サンプルコードのPWM値が徐々に上下するのに合わせて、良好で滑らかな0~5Vの出力が見られました。他のPWM出力ピンでもテストするためにサンプルコードを少し変更し実行したところ、再び同じ挙動が見られました。これは、設計段階で実行したシミュレーションの状態とまったく同じものになりました。

PWMが動作していることを確認できたので、次は出力チャンネルのテストに移ります。これもまた、それぞれのテストするGPIOピンにあわせてサンプルスクリプトを変更し、実行しました。こちらもスクリプトのオンオフ制御によって積層信号灯が点滅することで、正常な動作を確認できました。

残るは、2つの近接センサー入力の設定のみです。まずは、分圧回路の電圧出力値がGPIOピンの3.3V制限内かどうかを再度確認するために、マルチメーターを使用してテストを行いました。確認できたので、次に入力ピンを監視するためのサンプルスクリプトである「simple_input.py」を変更し、実行してみると、ピンを小刻みに動かすのと同時に、ターミナルに「HIGH」と「LOW」表示されました。

最終テスト

最終テストは、モータードライバーと非常停止ボタン、モーターの配線を、実際にショッピングカートのフレームに設置されているかのように接続した環境で行います。ここでは、モーターをある方向に動かし、その後反対方向に回すといったことを繰り返すような短いPythonスクリプトを作成しました。

上の動画はJetson Nanoがモーターの速度と方向を実際に制御している様子です。意図したとおりに制御系統が動作していることが確認できます。

次のステップへ

この投稿では、フレームの組み立てとインターフェース用基板の製作、動作理論の考察、そして、Jetson Nanoのセットアップ・テストまで行いました。次のステップでは、機械的な部分を仕上げ、システムの配線を行います。さらに、最初の投稿で実際に動かしたAIモデルからの出力とモーションシステムを繋げることで、ショッピングカートが人を追尾する動作を可能にしていきます。

Engineer of mechanical and electronic things by day, and a designer of rather amusing, rather terrible electric "vehicles" by night.