日記；回すだけIII ⑯ ラズパイ、C++でプログラミング＜その2 サンプルを動かす（EPOS4）＞ベータ版

### ラズパイにEPOS4のライブラリをインストール
　[EPOS Command Library Documentation](https://maxonjapan.com/wp-content/uploads/manual/epos/EPOS_Command_Library.pdf)の「9.2 Linux」からの記述に従って、ライブラリとサンプル・プログラムをインストールします。
　maxonからダウンロードすればいいのですが、Webブラウザが固まって動かなかったので、WindowsPCでダウンロードし、解凍したのをUSBメモリでラズパイのデスクトップにEPOS-Linux-Libraryフォルダごとコピーします。
　``cd EPOS_Linux_Library``
　でディレクトリに入り、
　``sudo bash ./install.sh``
でインストールします。
　プログラミングの作業は、worksフォルダを作ってその中で行おうと思います。デスクトップに置いてあるサンプルHelloEposCmdフォルダの中身（四つある）をworksへコピーします。
　　home/xxx/Desktop/EPOS-Linux-Library/EPOS_Linux_Library/examples/HelloEposCmd
　Definitions.hはヘッダ・ファイルです。HelloEposCmd.cppはサンプルのソースです。Makefileはmakeの時に使うファイルです。CMakeLists.txtは使いません。
　ターミナルで、worksフォルダに入り、
　``make``
でコンパイルとリンクすると、実行ファイルHelloEposCmdができます。ヘルプを実行します。
　``./HelloEposCmd -h``

```shell
-----------------------------------------------------------------
Epos Command Library Example Program, (c) maxonmotor ag 2014-2019
-----------------------------------------------------------------
Usage: HelloEposCmd
        -h : this help
        -n : node id (default 1)
        -d   : device name (EPOS2, EPOS4, default - EPOS4)
        -s   : protocol stack name (MAXON_RS232, CANopen, MAXON SERIAL V2, default - MAXON SERIAL V2)
        -i   : interface name (RS232, USB, CAN_ixx_usb 0, CAN_kvaser_usb 0,... default - USB)
        -p   : port name (COM1, USB0, CAN0,... default - USB0)
        -b   : baudrate (115200, 1000000,... default - 1000000)
        -l   : list available interfaces (valid device name and protocol stack required)
        -r   : list supported protocols (valid device name required)
        -v   : display device version
```


### PiCAN2のデバイス・ドライバのインストール
　CANバスの用意をします。
　PiCAN2の製品説明のページ　https://copperhilltech.com/pican-2-can-bus-interface-for-raspberry-pi/
　Driver Installationの解説　https://copperhilltech.com/blog/pican2-pican3-and-picanm-driver-installation-for-raspberry-pi/


``sudo nano /boot/config.txt``
でエディタを起動します。
　次の2行を最後に記述します。
``dtparam=spi=on``
``dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25``

　dtparam=spi=onは、メニューのPreferances-Raspberry Pi Configurationからインターフェースでspiを有効にしたら、すでに入っていると思います。上記の解説のページにはもう1行``dtoverlay=spi-bcm2835``ありますが、現時点では不要です。たぶんラズパイ4が出たころから、システムに組み込まれてしまい、添付されなくなっています。追加しても、組み込み時に見つからないとしてはねられるだけです。
　16000000は水晶発振子の周波数です。8MHz、20MHzがあるようです。25はGPIO25ピンで、int信号で使われます。物理的には22番ピンです。mcp2515-can0は、SPIバスのピンの接続指定です。CE0（チップ・セレクト信号で物理ピンでは24番）を使います。残りは標準的に使われる、MOSI；19番ピン、MISO；21番ピン、SCK；23番ピンです。



　CTRL+Oで上書き、CTRL-Xでエディタを抜けます。rebootします。
　``dmesg | egrep "can|spi"``
を実行して、

```
mcp251x spi0.0 can0: MCP2515 successfully initialized.
```

だと、ドライバが組み込まれています。

```
mcp251x spi0.0: MCP251x didn't enter in conf mode after reset
mcp251x spi0.0: Probe failed, err=110
mcp251x: probe of spi0.0 failed with error -110
```

とかだと、ハードを認識していません。err=110はタイムアウトです。

###### 番外
``sudo nano /boot/config.txt``でエディタを起動します。最後に、
``dtdebug=1``
を追加して、CTRL+Oで上書き、CTRL-Xでエディタを抜けます。rebootします。
　``sudo vcdbg log msg``
でデバイス・ドライバの組み込み途中の経過記録を読み出せます。上記のように、組み込みが成功しても失敗しても内容は同じでした。
###### 番外終わり

　正常にデバイス・ドライバがインストールできたら、
``sudo /sbin/ip link set can0 up type can bitrate 500000``
ネットワーク・デバイスとして機能させます。500000である理由は不明です。
``ifconfig``
を実行すると、イーサネットやWi-Fiと同じように情報が表示されます。
![2022-04-27 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f8748a40-ca8c-3305-fe52-f644cf70d0ce.png)






### Visual Studio Codeのインストール
　不要な人は読み飛ばしてください。
　メニューからRecommended Softwareを立ち上げます。Visual Studioで検索し、でてきたVisual Studio Codeにチェックを入れ、Applyをクリックすると、インストールが始まります。

![101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/d50789a1-66f0-a8c6-960a-236214255d2b.png)

　メニューのProgrammingに登録されています。




### 接続①
　EPOS4のマイクロUSBとラズパイのUSBコネクタをつなぎます。EPOS4はCANバスへのブリッジ（ゲートウェイ）になります。
![EPOS4-raspi1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/57e60bca-cc63-9eb5-e7e4-0610401ccd3a.png)
　PiCAN2の情報を調べるので、PiCAN2もつないでおきます。


### サンプルのコンパイル
　サンプルではnodeIdが1ですが、今回のEPOS4では5に設定しているので変更します。
　makeでコンパイルします。以下、手順です。


　cd worksで作業用ディレクトリに移り、HelloEposCmd.cppをオープンします。メニューのTerminalから新規を選びます。数分（理由は不明）経って、画面下にターミナルにプロンプトが出てきます。
　makeはすんでいるので、``./HelloEposCmd``で実行します。モータが動きます。

![2022-04-27 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a4893797-5922-a1d6-6c7b-d09b5e6daae8.png)

　最終的にはCANバス経由でモータを制御したいのですが、CANバスを使用するときのinterface nameはどこにも書かれていませんし、/sys/busなどのディレクトリのファイルを全部開いても記述されていません。下記のパラメータを引っ付けて実行します。maxonのサポートに聞いたパラメタです。

```shell
$ ./HelloEposCmd -l -s "CANopen"
-----------------------------------------------------------------
Epos Command Library Example Program, (c) maxonmotor ag 2014-2019
-----------------------------------------------------------------
default settings:
node id             = 5
device name         = 'EPOS4'
protocal stack name = 'MAXON SERIAL V2'
interface name      = 'USB'
port name           = 'USB0'
baudrate            = 1000000
-----------------------------------------------------------------
interface = CAN_mcp251x 0
            port = CAN0
-----------------------------------------------------------------
```

　interface nameが``CAN_mcp251x 0``であることがわかりました。

### 接続②
　PiCAN2ボードのCAN_HとCAN_L端子を、EPOS4のCANバスにつなぎます。USBケーブルはつないだままでかまいません。終端抵抗はEPOS4の1か所だけで動かしています。1mほどの距離だと、1個でも通信できます。本来CANバスの両端に入れるものですが。
![EPOS4-raspi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/19959368-327c-566b-4fbf-1bbbe5482222.png)


### CANバス対応にプログラムを変更
　MakefileのTARGETの記述を、``TARGET = epos_b``に変更します。
　HelloEposCmd.cppをepos_b.cppにコピペします。次の部分を変更、保存します。

```cpp
void SetDefaultParameters()
{
	//USB
	g_usNodeId = 5;
	g_deviceName = "EPOS4"; 
	g_protocolStackName = "CANopen"; 
	g_interfaceName = "CAN_mcp251x 0"; 
	g_portName = "CAN0"; 
	g_baudrate = 1000000; 
}
```

```shell
make clean
make
./epos_b
```

で実行します。CANバス経由でサンプルのHelloEposCmd.cppを変更したepos_b.cppが実行され、モータが動きます。

（※）このサンプル・プログラムは、ステータスやエラー・フラグをしっかりチェックしてプログラムが組まれています。C++の記述なので、Cだけを学んだ筆者には少し難解です。
　モータは、PPM（Profile Position Mode）でCW；5000、CCW；10000、CW；5000の3回回転します。PVM（Profile Velocity Mode）では、100、500、1000と速度を変化させます。エラー処理も含まれているので、実際の応用プログラムに必要な処理が学べます。