KakipからCAN通信してみました
-KakipにROS2を無事にインストールできたので、モータを回すことにチャレンジします
-まずはCANのポートを使えるようにして送受信してみることにしました
ハードウエア
-KakipにはあらかじめIOとは別にCANのポートが2つ用意されています
-試運転に用いるモータドライバは手元にあったNidecのSU070を使います
-3芯のコードを作成してKakipとモータドライバを接続しました
CANの仕様
-KakipはCAN-FDが標準的に用意されているようです
-ip link showとターミナルから入力すれば、CAN0とCAN1が表示され認識されています
-モータドライバの方は旧来のCAN2.0Bでした
-よってそのままでは通信できません
通信設定
通信設定(ビットレート)を設定してみます
sudo ip link set can0 up type can bitrate 500000
すると
RTNETLINK answers: Invalid argument と怒られました…
ビットレート設定と同時に起動「up」を入れたのがダメだったようです
sudo ip link set can0 type can bitrate 500000
これでビットレートは500kbpsに設定できました
次にCANの起動ですが、
- まずダウン(念のため)
sudo ip link set can0 down - MTUサイズを16(標準CAN)に変更する
sudo ip link set can0 mtu 16 - そのあとでビットレートを設定する
sudo ip link set can0 type can bitrate 500000
これでもダメ。どうやらMTUの変更もサポートされておらず、何が何でもCAN-FDでなければならないようです
結局、あまり美しくない荒業ですが、
通常速度(bitrate)と、高速側速度(dbitrate)の両方を設定し、fd on にする
(dbitrateは適当な値、例えば2Mbpsなどを指定してOSを満足させます)
sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on
がようやくエラーなしで通り、
sudo ip link set can0 up
で起動できました。
ip link show can0 と入力したときに、
3: can0: mtu 72 qdisc noop state UP mode DEFAULT group default qlen 10
のようにstateが「UP」になっていれば通信可能な状態です
コマンド送信
-ROSで動かす前に、ターミナル上でコマンドが送れるかだけ試すことにします
-Linux標準のCANテストツール can-utils を使います。
-ターミナルでツールをインストール
sudo apt update
sudo apt install can-utils
-モータドライバとケーブルで接続し、ドライバ側の電源が入っていることを確認したら
candump can0
-これでバスを流れている情報がターミナルを流れるはずなのですが何も表示されず
-モータドライバの仕様書を読むと、モータ回転指令を出している間しか情報は流れて来ないようです
-それならば、早速モータを回してみます。マニュアル通りに動力系の配線とモータのホールセンサ信号線も接続したら、
-値は16進数で入力します
-CANIDは、速度指令を送る場合0x081となっているので「0x081」(FCD=1,NID=1)
-そこに送るデータは8バイト
-マニュアルによると運転開始は動作指令に1を立てるようなので「0x0001」
-モータ2個の2軸を操作するドライバなので、モータ1とモータ2にそれぞれ回転数を指令する
-正転逆転は値の正負で表現。停止0から最高速3000rpmまでを2バイトの16進数で表現すれば良いようです。
2000rpmなら「0x07D0」で良いはず。
cansend can0 081#000107D007D00000
回りました!
ただ、0.5秒以内に次のコマンドが来ないとタイムアウトとして止まってしまうのでキーボードを連打して次々とコマンドを送れば回り続けることが出来ました
試運転はこれにて終了。通信が正常に出来ることが分かったので、次回はROSからプログラムでモータを回してみます
