背景
ラズパイとPC間でCAN通信(単発送信)できるようになりましたので、今回はCANコマンドを定期的に送信してみます。
CAN通信はTCPのようにハンドシェイク形式ではなく、情報を送信周期に従い定期的に送信するという特徴があります。
そのため、コマンドラインから単発で送信するのではなく、ラズパイ内にシェルスクリプトを実装します。
なお、PC側はGUIで定期送信ができるため、その機能を利用します。
前回の記事はこちらをご参照ください。
ラズパイ内にシェルスクリプトを実装
以下サイトを参考にさせていただき、ラズパイ内にシェルスクリプトを実装します。
https://qiita.com/h-kiyo/items/d8583af13768ad67bcd0
ラズパイのターミナルから以下コマンドを打ち込み、シェルスクリプトを作成します。
/bin $ sudo vi cansend.sh
作成完了後、以下コマンドを打ち込み、シェルスクリプトを実行します。
/bin $ bash cansend.sh
CANID=0x100のCANフレームが流れ始めました。
PC(受信側)を確認します。
受信できている!
CANID=0x400に変更し、送信間隔を1秒間隔に変更してみます。
左が送信側(ラズパイ)で、右が受信側(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
修正後のスクリプトです。
#!/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の変数時間を別々にして関数をバックグラウンドで実行する形にしてみました。
一応動作しています。
CANID=0x200の送信周期がCANID=0x100よりも早くなりました。
ラズパイからCANコマンドの定期送信ができましたが、カスタマイズ性が低いので、次はpythonでGUI化に挑戦します。
以下の記事で挑戦しておりますので、ご興味ございましたらご覧くださいませ。
[…] Raspberry PI 4 Model B(ラズパイ)でCAN定期送信してみる […]
[…] Raspberry PI 4 Model B(ラズパイ)でCAN定期送信してみる SHARE […]