CAN network adapter
Raspberry Pi zero を使用したCAN通信が可能なアダプタ。PCに接続して使用する。ケースはFRISK。本家フォーラムの記事を参考に製作した。2021年8月に製作した記録。
参考記事
[quick-guide] CAN bus on raspberry pi with MCP2515
CAN bus communication to and from a Pi
Block diagram
Hardware plan
操作盤のMac/PCとラズパイはUSB接続。ラズパイへの電源供給を兼ねる。ラズパイとCANコントローラはSPI接続。
graph LR
pc[Mac/PC]
raspi[Raspberry Pi zero]
subgraph CAN PCB
ctrl[MCP2515<br>8MHz]
trcv[Transceiver<br>TJA]
ctrl --- trcv
end
bus((CAN<br>bus))
pc -- USB --- raspi
pc -- Wi-Fi --- raspi
raspi -- SPI --- ctrl
trcv --- bus
Software plan
操作盤はシリアルコンソールとする。ソフトウェアはMacはscreen, WindowsならTeratermを使用している。ラズパイのOTGを利用してシリアル通信で接続しgettyでログイン可能に設定する。このあとはpython-canなどを利用してCAN通信のプログラムを実行できる。
利便性のためWi-Fiでsshとftpでの接続も用意するがCPU速度が遅いzeroでは常用しないつもり。
graph LR
subgraph Mac/Windows
term[Serial console]
pcssh[SSH]
pcftp[FTP]
end
subgraph Raspberry Pi zero
otg[USB OTG Serial]
prg[Python-can]
candrv[Socket CAN]
pissh[SSH]
piftp[vsftp]
otg --- prg --- candrv
end
term --- otg
pcssh --- pissh
pcftp --- piftp
candrv --- bus((CAN<br>Protcol))
Schematic
CANコントローラ基板は積層して収容する。MCP2515を使用した基板は安価な中国製のものだ。電源は5Vでロジックレベルも5Vなのだがラズパイのロジックは3.3Vである。CANコントローラMCP2515は3.3Vロジックが直接接続可能であるが、CANトランシーバは5Vが必要なのでパターンカットとリード線出しを行う。本ページの最上部のリンク先の記事を参考に工作した。
Enclosure
FRISKのケースに Raspberry Pi zeroを収容するには次の項目を解決する必要がある。
- CANコントローラ基板のピンヘッダ/ターミナルブロックの干渉
- microUSBコネクタの露出
- MicroSDカードの干渉
どちらもケースをピンバイス、ドリル、ナイフ、ヤスリで加工することで対応した。
まずCANコントローラ基板からピンヘッダとターミナルブロックを除去する。ピンヘッダは最初にプラスチック製のベースブロックをニッパで切断してから1ピンづつはんだこてをあてて取ると簡単。
Raspberry PiとMCP2515はSPI接続となるよう配線する。
クリスタルがフタと干渉するが基板を少々削って斜めに置くと収まった。
microUSBはφ3mmのドリルと小さな棒ヤスリで加工。
CAN通信線はリード線直出し。線色はJ1939を模倣してCANHを黄色に、CANLを緑色にした。
Software installation
以降はソフトウェアのインストールと設定だがメモ程度の記載にとどめる。システムのバージョン等に依存する内容であり正確性を担保できない。公式ドキュメントを参照するほうがよい。
OS
OSは情報が多いRaspberry Pi OSとする。インストールは公式のツールRaspberry Pi Imagerを使用した。
以下設定のメモ。
公式ドキュメント : Configuration
/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=********-** rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_serial
modules-load=dwc2,g_serial : USB接続でシリアル通信
/boot/config.txt
dtoverlay=dwc2
dtoverlay=mcp2515-can0:oscillator=8000000,interrupt=25
追加行分のみ
dtoverlay=dwc2 : USB OTGドライバ指定 What's DWC2?
oscillator=8000000 : MCP2515に接続されているクリスタルの周波数[Hz]
interrupt=25 : MCP2515の割り込み端子に接続するGPIO番号
Wi-Fiの接続設定
Networkへの接続のためにWi-Fiの設定をする。まずネットワークアクセスポイントを登録。
/boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="wi-fi router 1"
psk="暗号化キー1"
}
network={
ssid="wi-fi router 2"
psk="暗号化キー2"
}
ssh接続の設定
Create 'ssh' file in 'boot' directory
$ touch boot/ssh
ここで一旦シャットダウンし電源を切断する。
起動
ラズパイのmicroUSBとPCのUSB Aをケーブルで接続。電源が供給されラズパイが起動する。PC側のターミナルを起動する。
- Mac
$ ssh pi@raspberrypi.local
- Windows(teraterm proの例)
> ttermpro raspberrypi.local
接続できたら初期パスワードでログイン。
Login : pi
password : raspberry
初期設定を標準ツールで実施する。
$ raspi-config
設定
- Change User Password : パスワードの変更
- System Options > Hostname : ホスト名設定
- Advanced Options > Expand Filesystem : 使用可能メモリの拡張
- Localisation Options > Locale : en_GB.UTF-8 UTF-8, ja_JP.UTF-8 UTF-8 / Default:en_GB
- Localisation Options > Timezone : Asia > Tokyo
再起動。
$ sudo reboot
Serialでログイン可能に
参照 : Add serial terminal in Jessie (systemd) after boot
$ sudo ln –s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttyGS0.service
$ sudo systemctl start getty@ttyGS0.service
再起動
$ sudo reboot
Serialでログイン
- Mac
$ screen /dev/tty.usb***** 115200
*****は環境により異なる。
- Windows(teraterm proの例)
> ttermpro /C=** /BAUD=115200 /CDATABIT=8 /CPARITY=none /CSTOPBIT=1
/C=**はcom port番号。
ログインできたらSystemをアップデート。
$ sudo apt update
$ sudo apt upgrade
FTPサーバをインストール
vscodeからftp経由でアクセスするため。
$ sudo apt install vsftpd
/etc/vsftpd.conf
設定はお好みで。
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
/etc/vsftpd.chroot_list
pi
python modules
python関連のモジュールをインストールする。python-can, python-rpi.gpio, can-utilsは必須。
$ sudo apt -y install python3-numpy
$ sudo apt -y install python3-scipy
$ sudo apt -y install python3-pandas
$ sudo apt -y install python3-matplotlib
$ sudo apt -y install python3-openpyxl
$ sudo apt -y install python3-can
$ sudo apt -y install python3-rpi.gpio
$ sudo apt -y install python3-pip
$ sudo pip3 install fastapi
$ sudo pip3 install uvicorn
$ sudo apt -y install can-utils
$ sudo apt -y install lrzsz
$ sudo apt -y install python3-pigpio
$ sudo systemctl enable pigpiod.service
CAN bus link
CAN busへのリンクは起動時に実行してしまおう。
/etc/rc.local
/sbin/ip link set can0 up type can bitrate 500000
Setting the date and time
Raspberyy Pi の時計合わせを考える。通常はNTPで同期するが、Networkがない環境で使いたい。バッテリバックアップ付きのRTCを実装するとFRISKには収納できない。そこでPCからログインする都度にdateコマンドでPCの時計と同期をとることにした。
Windows10からTera TermでログインするためTera Termのマクロを使用する。
LoginSetDate.ttl
connect '/F=serial.INI'
;sendln ''
wait 'raspberrypi login:'
sendln 'pi'
wait 'Password:'
sendln 'raspberry'
gettime Cmd "sudo date --set='%Y/%m/%d %H:%M:%S'"
wait 'pi@raspberry:~$ '
sendln Cmd
end
serial.INIはシリアル接続のための設定ファイル。
Shutdown button
通信が沈黙し、そのまま電源を切断したことが何度かあった。シャットダウンスイッチは用意しておくべきだ。タクトスイッチをGND(#39)とGPIO21(#40)に接続し設定ファイルを更新する。debounceは1000msとした。1s以上の長押しでシャットダウンする。
/boot/config.txt
dtoverlay=gpio-shutdown,debounce=1000,gpio_pin=21
左下の赤丸部がシャットダウン用タクトスイッチ。これで通信がとんでも安心してシャットダウンできる。