CAN通信アダプタ Raspberry Pi zero W

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が必要なのでパターンカットとリード線出しを行う。本ページの最上部のリンク先の記事を参考に工作した。

Schematic

Enclosure

FRISKのケースに Raspberry Pi zeroを収容するには次の項目を解決する必要がある。

  1. CANコントローラ基板のピンヘッダ/ターミナルブロックの干渉
  2. microUSBコネクタの露出
  3. 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

左下の赤丸部がシャットダウン用タクトスイッチ。これで通信がとんでも安心してシャットダウンできる。

コメントを残す

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