ラズパイ5 +Python+CANopenでモータを回す ② サポート・ソフト MEXE02
BLDCモータをサポート・ソフトなしに回転させることは無理です。現時点で、このコントローラBLVD-KRDにCANopen用のC++もしくはpythonライブラリは提供されていません。
Windows10で動作するサポート・ソフトMEXE02を用いて、赤色の経路でモータを回転させます。モータを回転させる「リモート運転」動作時には、CANバス経由で、CANopenのコマンドが送られると思っていましたが、そうではありません。あくまでもUSB経由でデータのやり取りがなされます。
けれど、いろいろなCANopen関連画面では、CANバスの状態が観測できます。
今後、CANopenの規格の話をしますが、ここでは、CANバスがつながり、BLDCモータを回転させることで動作確認をします。CANバスに流れるデータそのものをロギングする話は別途行います。
●環境
- ハードウェア Raspberry Pi 5(4GBモデル)
- OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
- ラズパイ環境 Python 3.11.2
- Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている
- Windows環境 Python 3.10.5
●MEXE02のダウンロード
MEXE02の概要は、次のWebページで解説されています。
https://www.orientalmotor.co.jp/ja/download/software/mexe02-function
サポートソフト MEXE02 Ver.4 取扱説明書 HM-60378J.pdf
●MEXE02のできること
上記のMEXE02の概要ページで解説されている画面や機能は、AZシリーズ?のようで、コントローラBLVD-KRDでは使えない機能が多いです。
MEXE02を立ち上げるときコントローラBLVD-KRDを選ぶと、ModbusとCANopen用の各種設定画面が出てきます。
(m1) 簡易通信設定
USBケーブルでコントローラBLVD-KRDを接続しています。MEXE02をインストールするとき、USBドライバが入り、仮想COMポートが用意されます。
画面上部でCOMポート番号を選択し、OFF->ONにします。
画面左のメニューから、(m1)簡易通信設定を選びます。「簡易設定を開始します」をチェックして開始します。
ノードIDの変更はこの画面でできます。ほかのCAN機器と重ならない1~127(最大で32台程度)のどれかを入力し、「ドライバへ反映」をクリックすると、ノードIDが変更されます。この連載で1台目は「12」を使います。
通信速度は1000kbps=10Mbpsになっているので、そのまま使います。
●(m12) CANopen通信ステータスモニタ
ノードIDの下の「通信ステータス」がPre-operationalになっています。右の「CANopen通信ステータス」ボタン?をクリックします。
(m12) CANopen通信ステータスモニタの画面が出ます。
「通信ステート」がNMT( Network Management)で、「運転ステート」がStatus Machineを表しています。CANopenの用語ではなく独自の見出しになっています。
電源ON時、通信ステートはPre-operational、運転ステートはSwitch on disabledで、正常です!
二つの「ステート」は、CANopenではベースとなる状態遷移を表しています。あとの連載「二つの状態遷移」で、詳しく説明します。
この状態は、コントローラBLVD-KRDのLEDでも確認できます。
二つのLEDが用意されていて、白色のときは正常です。赤色は異常が発生しています。プログラムを動かした後、正常終了でもPWR/LEDが青色の点滅になる場合があります。
(m12) CANopen通信ステータスモニタの下には、PDOの一つRPDO1が見えています。PDOは別のところで説明しますが、高速に読み書きするオブジェクト・ディクショナリの特別の領域です。
RPDO1は6040hのControlwordがデフォルトで登録されていて、今読み出せている値が'4'です。
スクロールして、全部表示しました。PDO自体はもっとたくさん用意できるのですが、送信と受信で四つずつ設定することが多いようです。
名称のところに機能が書いてあるのが、デフォルトでマッピングされている部分です。変更できます。
たとえば、Position actual value(6064h)は、ロータリ・エンコーダからの情報で、現在の位置を示しています。これは、SDOで読み出せますが、ここではTPDO3にマッピングしています。すると、同期サイクル、多くは毎100msで常に更新された値を読み出せます。
スペックは不明ですが、搭載されているロータリ・エンコーダは分解能が高く、カタログ上位置決め運転時の停止精度は、モータ軸上で±0.72°です。何もしていない状態で、値はふらふら動いています。
表示項目は、RPDO1~RPDO4とTPDO1~TPDO4の八つです。CANopenでは、PDOを要求するリモート・フレームをRPDO(Receive-PDO)、センサ、ここではロータリ・エンコーダからのデータを受けるTPDO(Transmit-PDO)があります。
RPDO2ではModes of operationが'3'です。このコントローラBLVD-KRDでは、
- プロファイル速度モード (pv)
- プロファイル位置モード (pp)
- プロファイルトルクモード(tq)
- ホーミングモード(hm)
が利用できます。'3'はProfile Velocity Mode (pv)で、回転数制御のことです。目標回転数Target velocityを設定しますが、 加速(Profile acceleration )、減速(Profile deceleration)を自分で設定でき、それに従って、コントローラが制御します。
RPDO3はTarget Position(位置)です。
RPDO4はTarget verocity(速度)です。
TPDO1はStatuswordで、今の値は'4704'です。
TPDO2はModes of operation displayで、今の値は'3'です。
TPDO3はPosition actual valueで、今の値は'XXXX'です。変化しています。モータの軸を手でつまんで動かすと、大きく変化します。
TPDO4はVerocity actual valueで、今の値は'XXXX'です。変化しています。モータの軸を手でつまんで動かすと、少し変化します。
インデックスというのが60xxhで示されていますが、CANバスのダンプでは逆順のxx 60と表示されます。
●(m13) フレームモニタ
次は、(m13) フレームモニタです。誰が送信もしくは受信したかがわかるCAN-ID、Frameのデータの長さを表すLength、データ本体のFrameを表示しています。常に最後の状態?しか見れません。
次回のPythonで「SDOの読み出し(仮)」で作るcaninfo.pyを動かします。
SDO(RX)、SDO(TX)のFrameでデータが記録されています。
次回作成するcaninfo.pyのプログラムです。SDOを3か所読み出しています。Pythonの仮想環境で動かしています。
import canopen # Start with creating a network representing one CAN bus # Add some nodes with corresponding Object Dictionaries network.check() # Connect to the CAN bus print("\n=== start ID=12 OrientalMotor ===\n") print("\n #6000 \n") # Disconnect from CAN bus |
can-infoで流れるデータをダンプしました。(m13) フレームモニタで見えているのは、最後のやり取りですね。
使っているcandumpは、 連載「CANバス信号を見る」で説明する予定のcan-utilsソフトです。
●(m14) CANopenオブジェクトディクショナリ
(m14) CANopenオブジェクトディクショナリの画面です。このオブジェクトディクショナリは、メーカのWebサイトからダウンロードしたedsファイル(BLVD-KRD_CANopen_V200.eds)の内容をベースに表示・更新表示します。
最初の部分です。
スクロールしていき、最後の部分です。
基本の(m1) 簡易通信設定と、CANopen関係の三つを紹介しました。
- (m12) CANopen通信ステータスモニタ
- (m13) フレームモニタ
- (m14) CANopenオブジェクトディクショナリ
これ以外に、I/O関係の設定やテストなどもあります。
●(m2) リモート運転
このサポート・ソフトで、モータを回転できる画面は、(m2) リモート運転です。
「リモート運転モード」にチェックを入れます。
ラズパイで、candumpで流れるデータを見ていますが、今は何も流れていません。
中ほどのS-ONのONボタンをクリックします。モータからジャラジャラという音が聞こえてきます。
(m12) CANopen通信ステータスモニタを見ます。運転ステートが、Switch on disabledから連続してOperation enabledへ遷移しています。
- Switch on disabled
- Ready to switch on
- Switch on
- Operation enabled
S-ONした(m2) リモート運転画面です。
「速度x1」ボタンを1回押します。
モータが少しCW方向に回転します。
(m13) フレームモニタは変化していないようです。
ラズパイで見ているcandumpで流れるデータは、まったくないです。
したがって、CANバスには何も指令やデータは流れていないようです。
●MEXE02の(m16) トレースモニタ機能
ラズパイで、CANopenを用いたプログラムを動かしたとき、(m16) トレースモニタ機能を使うと、Position Actual ValueやVelocity Actual Value、Torque actual valueをもとにしたトルク変動率などを表示できます。
なお、画面では日本語になっていますが、CANopenの英語表記と少し違和感がある日本語になっているので、先ほどのActual Valueが間違っているかもしれません。
●Pythonのプログラム環境
2023年10月に更新されたラズパイOS bookwormでは、pythonは仮想環境を利用してプログラムを作ります。
次回の「PythonでSDOの読み出し(仮)」で、詳しく説明します。
python仮想環境 備忘録 仮想環境の作成 python -m venv envtest 有効化 source envtest/bin/activate 無効化 deactivate 初期状態に(いったん deactivate してから) python -m venv --clear envtest
|
envcanという仮想環境を作ります。
yoshi@ras05:~ $ python -m venv envcan
yoshi@ras05:~ $ source envcan/bin/activate
(envcan) yoshi@ras05:~ $ pip install canopen
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting canopen
Using cached https://www.piwheels.org/simple/canopen/canopen-2.2.0-py3-none-any.whl (61 kB)
Collecting python-can>=3.0.0
Using cached https://www.piwheels.org/simple/python-can/python_can-4.3.1-py3-none-any.whl (262 kB)
Collecting wrapt~=1.10
Using cached wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (80 kB)
Collecting packaging>=23.1
Using cached https://www.piwheels.org/simple/packaging/packaging-24.0-py3-none-any.whl (53 kB)
Collecting typing-extensions>=3.10.0.0
Downloading https://www.piwheels.org/simple/typing-extensions/typing_extensions-4.11.0-py3-none-any.whl (34 kB)
Collecting msgpack~=1.0.0
Using cached msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (400 kB)
Installing collected packages: wrapt, typing-extensions, packaging, msgpack, python-can, canopen
Successfully installed canopen-2.2.0 msgpack-1.0.8 packaging-24.0 python-can-4.3.1 typing-extensions-4.11.0 wrapt-1.16.0
(envcan) yoshi@ras05:~ $ pip list
Package Version
----------------- -------
canopen 2.2.0
msgpack 1.0.8
packaging 24.0
pip 23.0.1
python-can 4.3.1
setuptools 66.1.1
typing_extensions 4.11.0
wrapt 1.16.0
プログラムをcaninfo.pyの名称で保存しました。
実行します。最初に、ip link setコマンドでデバイスcan0の状態をUPに設定します。
(envcan) yoshi@ras05:~ $ sudo ip link set can0 up type can bitrate 1000000
(envcan) yoshi@ras05:~ $ python caninfo.py
=== start ID=12 OrientalMotor ===
vendor_id 702
Manufacturer device name BLVD-KRD
Motor_temp 33.5
#6000
Max torqe 10000
Target position 0
◆can0がネットワーク・デバイスに登録され、起動状態になったかを確認 (envcan) yoshi@ras05:~ $ ip link |