CAN bus no Raspberry pi

Teste a placa adaptador CAN bus MCP2515  modificada para funcionar com os 3.3V do raspberry pi.

Este teste foi efectuado no âmbito das experiências necessárias para a construção da electrónica alternativa para o braço robótico Niryo One.

O niryo shield comunica com os niryo steppers por CAN bus recorrendo um IC MCP2515. Num projecto de electrónica alternativa com o mínimo possível de alterações ao software o mechaduino e o raspberry pi devem comunicar atravéz de CAN bus, e ambos funcionam com nível lógico de 3.3V.

No entanto o adaptador de baixo custo que usa o MCP2515 funciona com uma única alimentação, o que não constitui problema para um dispositivos de nível lógico de 5V como o Arduino UNO, mas para os que funcionam a 3.3V o adaptador não é adequado sem uma alteração a alimentação, de modo a que o TJA1050 CAN-transceiver seja alimentado a 5V, e o MCP2515 a 3.3V

Estas informações estão de acordo com as recolhidas nos endereços abaixo indicados, que indicam ser  necessário uma alteração na alimentação da placa, em particular da forma de alimentar o TJA1050 com 5V enquanto o pino de  alimentação normal fica com 3.3V.

    • https://www.raspberrypi.org/forums/viewtopic.php?t=141052

Do ponto de vista do hardware a forma como a modificação da alimentação é efectuada é ligeiramente diferente. Eu escolhi implementar a alteração no segundo link (dos indicados acima), assim como seguir as suas instruções.

Alteração a placa adaptadora MCP2515

Do ponto de vista do hardware foi efectuada uma interrupção à pista que inicia na bola a esquerda no condensador C5, e deve ser interrompida antes de chegar ao condensador.  Depois da ligação ter sido interrompida foi soldado um fio ao terminal de baixo desse condensador ( a imagem abaixo foi tirada antes da alteração)

localização da pista a cortar junto do condensador C5 (inicia com a bola)

Na foto abaixo a pista já foi interrompida e portanto o 2 pino do transciver já não está ligado com o pino VCC mas sim com o fio vermelho soldado. Após a intervenção deve-se medir a continuidade com um multimetro.

Fio soldado no terminal do condensador para alimentar o CAN transciver a 5V

 

Ligações entre o Raspberry pi e o adaptador CAN bus

pino MCP2515 > pino Raspberry Pi

VCC >  1 (3V3)
GND >  6 (GND)
CS > 24 (CE0)
(MI)SO > 21 (MISO)
(MO)SI > 19 (MOSI)
SCK > 23 (SCK)
INT > 22 (GPIO25)

TJA1050 VCC (fio soldado) > 4 (5V)

Diagrama dos pinos usados no raspberry pi (bolas a escuro com legendas)

Software requerido para operar o CAN bus no raspberry pi

Pelo que percebi para as informações que aqui reproduzo e que estão no segundo link dos citados acima funcionarem o kernel tem de aceitar overlays. As instruções originais são para o kernel 4.4.41, o pi que usei no teste tem o raspbian buster com o kernel 4.19.97.

First update software and install can-utils:

Antes de mais actualizar o software e instalar os utilitarios do CAN bus

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install can-utils

Depois de actualizar e instalar os utilitários do can bus, é necessario alterar algumas configurações de arranque do raspberry pi, nomeadamente activar o overlay do kernel adicionando algumas linhas ao ficheiro /boot/config.txtsudo

nano /boot/config.txt

Adicionar as seguintes linhas ao ficheiro

dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi1-1cs

Após estas alterações reiniciar o raspberry pi e fazer o setup a interface CAN com o seguinte comando:

sudo ip link set can0 up type can bitrate 500000

Se o comando nao devolver nenhum erro, então estará pronto para ser testado. Ver mais abaixo para uma solução permanente.

Para enviar mensagens usa-se o comando cansend conforme o seguinte exemplo:

cansend can0 127#DEADBEEF

Para obter mensagens recebidas usa-se o comando candump conforme o seguinte exemplo:

candump can0
can0 043 [8] 01 01 02 03 00 05 06 07
can0 043 [8] 01 01 02 03 00 05 06 07
can0 043 [8] 01 01 02 03 00 05 06 07

Estes dados recebidos são os enviados pelo arduino transmiter conforme o teste anterior de comunicação com CAN bus entre arduinos.

Para fazer com que a interface CAN fique definida de modo permanente, é necessário adicionar as seguintes linhas ao ficheiro /etc/network/interfaces

auto can0
iface can0 can static
    bitrate 500000

Portanto os testes efectuados segundo a descrição encontrada no segundo link funcionaram na perfeição. Já tenho um placa adaptadora capaz de funcionar como interface CAN bus no raspberry pi.

A próxima experiência neste âmbito será usar outro adaptador MCP2515 num placa de testes com o micro controlador SAMD21 cortex M0 usado no mechaduino e no niryo stepper controller.