本サイトはアフィリエイト広告を利用しています

ラズパイ4からPCへCANコマンドを定期的に送信するスクリプトを書いてみた

ラズパイとCAN通信

背景

ラズパイとPC間でCAN通信(単発送信)できるようになりましたので、今回はCANコマンドを定期的に送信してみます。

CAN通信はTCPのようにハンドシェイク形式ではなく、情報を送信周期に従い定期的に送信するという特徴があります。

そのため、コマンドラインから単発で送信するのではなく、ラズパイ内にシェルスクリプトを実装します。

なお、PC側はGUIで定期送信ができるため、その機能を利用します。

前回の記事はこちらをご参照ください。

ラズパイ内にシェルスクリプトを実装

以下サイトを参考にさせていただき、ラズパイ内にシェルスクリプトを実装します。

https://qiita.com/h-kiyo/items/d8583af13768ad67bcd0

ラズパイのターミナルから以下コマンドを打ち込み、シェルスクリプトを作成します。

/bin $ sudo vi cansend.sh

作成完了後、以下コマンドを打ち込み、シェルスクリプトを実行します。

/bin $ bash cansend.sh
ラズパイ側のCANログ

CANID=0x100のCANフレームが流れ始めました。

PC(受信側)を確認します。

USB2CAN

受信できている!

CANID=0x400に変更し、送信間隔を1秒間隔に変更してみます。

左が送信側(ラズパイ)で、右が受信側(USB2CAN)です。

USB2CAN

1秒間隔でCANID=0x400の送受信ができています。

定期送信するCANコマンドを増やしてみる

定期送信するコマンドが1つでは面白くないので、CAN定期送信対象を1つから2つにしてみます。

CANフレーム①:CANID=100、DATA=11 22 33 44 55 66 77 88

CANフレーム②:CANID=200、DATA=88 77 66 55 44 33 22 11

USB2CAN

修正後のスクリプトです。

#!/bin/bash
while true; do
  echo 100"#"1122334455667788
  cansend can0 100"#"1122334455667788
  sleep 0.1
  echo 200"#"8877665544332211
  cansend can0 200"#"8877665544332211
  sleep 1.0
done

CANコマンド毎に送信間隔を設定してみる

CANコマンドを2つに増やしましたが、送信周期が一律同じでは面白くないため、コマンド毎に異なる送信周期にしてみます。

コードを以下のように修正します。

#!/bin/bash

can1 () {
  while true; do
    echo "100#1122334455667788"
    cansend can0 "100#1122334455667788"
    sleep 0.1
    #echo "200#8877665544332211"
    #cansend can0 "200#8877665544332211"
    sleep 1.0
  done
}

can2 () {
  while true; do
    #echo "100#1122334455667788"
    #cansend can0 "100#1122334455667788"
    sleep 0.1
    echo "200#8877665544332211"
    cansend can0 "200#8877665544332211"
    sleep 0.5
  done
}

# can1 をバックグラウンドで実行
can1 &

# can2 をバックグラウンドで実行
can2 &

# バックグラウンドで実行したプロセスの待機
wait

sleepの変数時間を別々にして関数をバックグラウンドで実行する形にしてみました。

一応動作しています。

USB2CAN

CANID=0x200の送信周期がCANID=0x100よりも早くなりました。

ラズパイからCANコマンドの定期送信ができましたが、カスタマイズ性が低いので、次はpythonでGUI化に挑戦します。

以下の記事で挑戦しておりますので、ご興味ございましたらご覧くださいませ。

2 COMMENTS

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です