ROS2でCANopenのモータを回すところまで進めたいと思います。なかなかこれはという文献にぶち当たっていません。
とりあえず、CANバスで、ラズパイ5とモータをつなぐところから始めます。
最初に用意するのはラズパイ5のCANインターフェース
SPI接続の1チャネルCANバス・インターフェースRS485 CAN HATです。
PCをUSB経由でCANバスに接続する装置Ixxat USB-to-CAN V2 compactを入手します。マルツで購入しました。
環境
- Raspberry Pi 5 8GB
- 追加ボード;NVMe Base for Raspberry Pi 5 (NVMe Base by Pimoroni)
- Crucial クルーシャル P2シリーズ 500GB 3D NAND NVMe PCIe M.2 SSD CT500P2SSD8
- Ubuntu Desktop 24.04LTS(64-bit)
- ROS2;Jazz
使用したモータ
オリエンタルモーター のブラシレスモーターBLVシリーズ Rタイプを使います。同社のWebショップで購入しました。
BLMR5100K-A-B + BLVD-KRD
CANインターフェース
RS485 CAN HATをラズパイ5に取り付けます。I/Oピンにさすだけですが、純正のFANがあるため、そのままでは刺さりません。20ピンx2の下駄を付けます。ねじも六角スペーサを使ってかさ上げします。
エディタnanoでデバイス・ドライバを組み込みます。
$ sudo nano /boot/firmware/config.txt
次の2行をファイルの最後に追加します。
dtparam=spi=on <-ほかのところで設定されていなかったら
dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25
12000000は水晶発振子の周波数です。25はGPIO25ピンで、int信号で使われます。物理的には22番ピンです。mcp2515-can0は、SPIバスのピンの接続指定です。CE0(チップ・セレクト信号で物理ピンでは24番)を使います。残りは標準的に使われる、MOSI;19番ピン、MISO;21番ピン、SCK;23番ピンです。
20ピンx2のソケットにさすだけなので、ピン番号は気にすることはありません。
CTRL+Oで上書き、CTRL-Xでエディタを抜けます。rebootします。
$ dmesg | egrep "can|spi"
を実行して、
$ sudo dmesg | egrep "can|spi"
[ 0.000000] Linux version 6.8.0-1013-raspi (buildd@bos03-arm64-044) (aarch64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #14-Ubuntu SMP PREEMPT_DYNAMIC Wed Oct 2 15:14:53 UTC 2024 (Ubuntu 6.8.0-1013.14-raspi 6.8.12)
[ 0.028745] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[ 0.028751] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
[ 0.028756] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.028762] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
[ 0.819276] usb usb1: Manufacturer: Linux 6.8.0-1013-raspi dwc2_hsotg
[ 1.062037] usb usb2: Manufacturer: Linux 6.8.0-1013-raspi xhci-hcd
[ 1.062487] usb usb3: Manufacturer: Linux 6.8.0-1013-raspi xhci-hcd
[ 1.063447] usb usb4: Manufacturer: Linux 6.8.0-1013-raspi xhci-hcd
[ 1.063819] usb usb5: Manufacturer: Linux 6.8.0-1013-raspi xhci-hcd
[ 3.720866] mcp251x spi0.0 can0: MCP2515 successfully initialized.
だと、ドライバが組み込まれています。
sudo /sbin/ip link set can0 up type can bitrate 500000
で、CANデバイスをセットします。このインターフェースのデフォルトbitrateが500kなので、その数値を書いていますが、1Mでも通ることもあります。
$ sudo /sbin/ip link set can0 up type can bitrate 500000
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 2c:cf:67:30:d7:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.111.110/24 brd 192.168.111.255 scope global dynamic noprefixroute eth0
valid_lft 85855sec preferred_lft 85855sec
inet6 240f:6d:2c00:1:2ecf:67ff:fe30:d78f/64 scope global dynamic noprefixroute
valid_lft 279sec preferred_lft 279sec
inet6 fe80::2ecf:67ff:fe30:d78f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
link/can
4: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 2c:cf:67:30:d7:90 brd ff:ff:ff:ff:ff:ff
CAN用ユーティリティをインストールします。
ID=12に設定したモータのコントローラにダミーデータを送信します。
$ sudo apt install can-utils
$ candump can0 &
$ cansend can0 012#45
$ can0 012 [1] 45
TMCL IDE for MS Windows
TMCLという会社のCANopen用ビューワ(無償)です。現在、アナログ・デバイセズの傘下に入っているようです。
Windows11マシンにインストールします。
C:ドライブのAnalog Devicesフォルダにインストールされます。実行ファイルは"C:\Analog Devices\TMCL-IDE-Rel4.2.0\V4.2.0\TMCL-IDE.exe"です。
オリエンタルモーター のBLVD-KRD用edsファイルBLVD-KRD_CANopen_V200.edsをダウンロードします。
"C:\Analog Devices\TMCL-IDE-Rel4.2.0” にUserEdsフォルダを作り、上記のedsファイルをコピーしておきます。
IxxatのUSB-to_CAN V2 Compact
上記のソフトを利用するために、Windows用CANインターフェースを入手します。
利用できるインターフェース機器の一部です。ここでは、Ixxat (USB-to-CAN V2 Compact)を使っています。
- CAN-USB/2 (ESD)
- Leaf Light v2 (Kvaser)
- IPEH-002021 (Peak)
- Ixxat (USB-to-CAN V2 and USB-to-CAN V2 Compact)
- RTMI(USB-2-RTMI?)
VCI V4 - Windows 11, 10 [Driver, canAnalyser-Mini, Manuals, LabView and other add-ons]
をダウンロードし、インストールします。
IxxatのUSB-to_CAN V2 CompactとPCをUSBケーブルで接続します。
動作確認
TMCL-IDE.exeをダブルクリックしてTMCL IDE for MS Windowsを起動します。USB-to_CAN V2 Compactを見つけて左のメニューに項目が追加されています。
CAN1:CANopen-IXXAT portをクリックすると、右エリアに操作パネルが表示されます。
Serach Node ID'sに、今回設定した12の前後のIDを入力し、Connectボタンをクリックします。
モータ・コントローラを見つけてきます。
画面下には、CANバスのやり取りが表示されています。現在のバージョンでは、CANopenの命令をデコードする機能があります。
この一連の操作をしている前に、ラズパイでは、
$ candump can0 &
を起動しておきます。CANバスを流れるコードがロギングされています。
can0 08C [8] 20 81 11 00 00 00 00 00
can0 08C [8] 20 81 11 00 00 00 00 00
can0 60C [8] 40 60 60 00 00 00 00 00
can0 58C [8] 4F 60 60 00 01 00 00 00
can0 60C [8] 2F 60 60 00 00 00 00 00
can0 58C [8] 60 60 60 00 00 00 00 00
can0 001 [8] 88 00 00 00 00 00 00 03
can0 003 [8] 88 00 00 00 00 00 00 03
can0 004 [8] 88 00 00 00 00 00 00 03
can0 005 [8] 88 00 00 00 00 00 00 03
can0 60A [8] 40 18 10 01 00 00 00 00
can0 60A [8] 80 18 10 01 00 00 04 05
can0 60B [8] 40 18 10 01 00 00 00 00
can0 60B [8] 80 18 10 01 00 00 04 05
can0 60C [8] 40 18 10 01 00 00 00 00
can0 58C [8] 43 18 10 01 BE 02 00 00
can0 60C [8] 40 18 10 02 00 00 00 00
接続
後になりましたが、上記の作業を行う前に、次のように接続をしておきます。
サポートソフト MEXE02 Ver.4
オリエンタルモーターのサポート・ソフト(無償)をインストールします。とても機能が豊富です。
USBケーブルをPCとコントローラBLVD-KRDに接続します。このソフトはUSB経由でやり取りをするので、CANバスにはデータはほとんど流れません。
MEXE02をインストールします。
起動します。COMポートを選択します。
画面上部でCOMポートを選択し、ONします。
(m1)簡易通信設定を左のメニューから選びます。
簡易設定を開始しますをチェックします。ノードIDを選択します。12にしました。ドライバへ反映をクリックします。
コントローラBLVD-KRDの見えるところに、ID=12と書いたラベルを貼っておきます。
(m2)リモート運転を左のメニューから選択します。リモート運転モードをチェックします。S-ONをONにします。モータからシャリシャリという音が聞こえてきます。矢印のアイコンを押して、モータが回転するかを確認します。
左のメニューから、(p5)CANopen object通信初期値・設定を選択します。
一番下までスクロールします。
Mode of operationがProfile velocity modeになっています。このまま利用します。その下には、PDOの設定が表示されています。このまま利用します。
CANopenやツールの使い方は、下記の記事を参照してください。