備忘録　ラズパイ5 ROS2 勉強再開 ⑥ CANopen その1 準備

　ROS2でCANopenのモータを回すところまで進めたいと思います。なかなかこれはという文献にぶち当たっていません。
 　とりあえず、CANバスで、ラズパイ5とモータをつなぐところから始めます。


### 最初に用意するのはラズパイ5のCANインターフェース
　SPI接続の1チャネルCANバス・インターフェースRS485 CAN HATです。


https://www.waveshare.com/wiki/RS485_CAN_HAT

　アマゾンで購入しました。
https://www.amazon.co.jp/MCP2515-RS485%E9%80%9A%E4%BF%A1-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4-Raspberry/dp/B08LCKLHBX

　PCをUSB経由でCANバスに接続する装置Ixxat USB-to-CAN V2 compactを入手します。マルツで購入しました。

https://www.hms-networks.com/p/1-01-0281-12001-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

  https://www.orientalmotor.co.jp/ja/products/detail?hinmei=BLMR5100K-A-B%2BBLVD-KRD&seriesCd=FJ01&additionalHinmei=CCM010B1AAF



### 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用ビューワ（無償）です。現在、アナログ・デバイセズの傘下に入っているようです。

https://www.analog.com/en/resources/evaluation-hardware-and-software/embedded-development-software/software-download.html?swpart=SD_X4DKANQ

　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をダウンロードします。
   
https://www.orientalmotor.co.jp/ja/products/detail?hinmei=BLMR5100K-A-B%2BBLVD-KRD&seriesCd=FJ01&additionalHinmei=CCM010B1AAF

　"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]
 をダウンロードし、インストールします。

 https://www.hms-networks.com/p/1-01-0281-12001-ixxat-usb-to-can-v2-compact?tab=tab-support

　IxxatのUSB-to_CAN V2 CompactとPCをUSBケーブルで接続します。

### 動作確認
 　TMCL-IDE.exeをダブルクリックしてTMCL IDE for MS Windowsを起動します。USB-to_CAN V2 Compactを見つけて左のメニューに項目が追加されています。
  
  ![TMCL101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/677a21d6-7fd5-79ac-b9c0-6210be88e732.png)

　CAN1:CANopen-IXXAT portをクリックすると、右エリアに操作パネルが表示されます。
 　Serach Node ID'sに、今回設定した12の前後のIDを入力し、Connectボタンをクリックします。
  　モータ・コントローラを見つけてきます。

 ![TMCL102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/d1da554d-b97e-6f97-28a4-df61b75817fd.png)

　画面下には、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
```


### 接続
　後になりましたが、上記の作業を行う前に、次のように接続をしておきます。

![bldc5000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a6d5c170-6a7e-708a-536d-180b3a39e8cf.png)



 ![IMGP2226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/72e16c28-1d6e-6da7-36ea-9ea2c361034e.png)




### サポートソフト MEXE02 Ver.4
　オリエンタルモーターのサポート・ソフト（無償）をインストールします。とても機能が豊富です。

https://www.orientalmotor.co.jp/ja/download/software/mexe02-latest?check_logged_in=1

　USBケーブルをPCとコントローラBLVD-KRDに接続します。このソフトはUSB経由でやり取りをするので、CANバスにはデータはほとんど流れません。
 MEXE02をインストールします。
 起動します。COMポートを選択します。
 　画面上部でCOMポートを選択し、ONします。
(m1)簡易通信設定を左のメニューから選びます。
　簡易設定を開始しますをチェックします。ノードIDを選択します。12にしました。ドライバへ反映をクリックします。
 
 ![mexe102a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a56eb895-d0fd-8875-83a1-b5f47be4778c.png)

　コントローラBLVD-KRDの見えるところに、ID=12と書いたラベルを貼っておきます。
  
  (m2)リモート運転を左のメニューから選択します。リモート運転モードをチェックします。Ｓ－ＯＮをONにします。モータからシャリシャリという音が聞こえてきます。矢印のアイコンを押して、モータが回転するかを確認します。

  ![mexe101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/fe2a4f64-11cf-79ff-63f4-f7f34e29d11c.png)

　左のメニューから、(p5)CANopen object通信初期値・設定を選択します。
 　一番下までスクロールします。
  　Mode of operationがProfile velocity modeになっています。このまま利用します。その下には、PDOの設定が表示されています。このまま利用します。

![mexe103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e097a7c0-b3fa-dc54-038d-cf79ac26ffed.png)

　CANopenやツールの使い方は、下記の記事を参照してください。

 https://www.denshi.club/parts/2024/04/razupai5.html