TOPに戻る

ラズパイ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 ダウンロード

  サポートソフト 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
import time
import logging
#logging.basicConfig(level=logging.DEBUG)

# Start with creating a network representing one CAN bus
network = canopen.Network()

# Add some nodes with corresponding Object Dictionaries
node = canopen.RemoteNode(12,'Downloads/BLVD-KRD_CANopen_V200.eds')
network.add_node(node)

network.check()

# Connect to the CAN bus
# sudo ip link set can0 up type can bitrate 1000000
network.connect(bustype='socketcan', channel='can0')

print("\n=== start  ID=12 OrientalMotor ===\n")
vendor_id = node.sdo[0x1018][1].raw
print("vendor_id " ,vendor_id) 
device_name    = node.sdo[0x1008].raw
print('Manufacturer device name ',device_name)
Motor_temp    = node.sdo[0x407d].raw
print('Motor_temp  ',float(Motor_temp/10.0))

print("\n #6000 \n") 
Max_torqe    = node.sdo[0x6072].raw
print('Max torqe',Max_torqe)
Target_position    = node.sdo[0x607a].raw
print('Target position',Target_position)

# Disconnect from CAN bus
network.disconnect()

 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
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 2c:cf:67:12:09:42 brd ff:ff:ff:ff:ff:ff
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can 
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT group default qlen 1000
    link/ether 2c:cf:67:12:09:43 brd ff:ff:ff:ff:ff:ff

 

連載 ラズパイ5 +Python+CANopenでモータを回す

(1) 構成と環境(オリエンタルモーター の「BLMR5100K-A-B」 + 「BLVD-KRD」)

(2) サポート・ソフト MEXE02

(3) PythonでSDOの読み出し(仮)caninfo.py

(4) CANopenのベーシックな規格とSDO/PDO、オブジェクト・ディクショナリ<前編>

(5) CANopenのベーシックな規格とSDO/PDO、オブジェクト・ディクショナリ<後編>

(6) 二つの状態遷移(NMTとStatus Machine)

(7) CANバス信号を見る<前編>canreset.py candump0.py

(8) CANバス信号を見る<中編>Arduino

(9) CANバス信号を見る<後編>CANopenのデコードができ無償で使えるツールAnalog Devices TMCL-IDE

(10) モーション CiA 402の規格<Homing mode> canHome.py

(11) モーション CiA 402の規格<Profile Position Mode (PPM)-前編> canPPMread.py

(12) モーション CiA 402の規格<Profile Position Mode (PPM)-中編> caninfo2.py canppm.py

(13) モーション CiA 402の規格<Profile Position Mode (PPM)-後編> canppm2.py