元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

mbed LPC1768とpythonでCAN通信するだけ

mbedとWindows 10とでCAN送受信します。

必要なもの

  • mbed LPC1768 ×1
  • CANale pro ×1
  • MCP2551モジュール ×1

ja.aliexpress.com

ja.aliexpress.com


USB-CAN変換はamazonとかで売ってるのもあるね






接続

接続はmbed Handbookのとおり
今回はpin29, 30のみ使用しました。

  • p29 - CTX
  • p30 - CRX
  • VU - VCC
  • GND - GND

f:id:sgrsn1711:20210622223350p:plain

CAN - Handbook | Mbedより

Windows側はCANable(USB-CAN変換)を接続します。

CANableとMCP2551のCANH, CANL GNDを接続します。
CANableのショートコネクタは基板側にセットします

f:id:sgrsn1711:20210622223824j:plain




コード

コード(mbed側)

#include "mbed.h"
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
CAN can(p30, p29);
 
int main() {
    printf("main()\n");
    char counter = 0;
    can.frequency(100000);
    CANMessage msg;
    while(1) {
        printf("loop()\r\n");
        if(can.read(msg)) {
            for(int i = 0; i < msg.len; i++)
            printf("%d, ", msg.data[i]);
            led2 = !led2;
        } 
        wait(0.2);
        can.write(CANMessage(0x123, &counter, 1));
        counter++;
    }
}


windows側 (python)

python-canをインストールします。

$ pip install python-can
$ pip3 install python-can
import can

def demo():
  msg = [1,2,3,4,5,6,7,8]
  can_bus = can.interface.Bus(bustype='slcan', channel='COM20', bitrate=100000)

  while True:
    try:
      send_msg = can.Message(arbitration_id=0x201, data=msg, is_extended_id=False)
      can_bus.send(send_msg)
      received_msg = can_bus.recv(0.1)
      if received_msg:
        print(received_msg)

    except KeyboardInterrupt:
      can_bus.close()
      break

if __name__ == '__main__':
  demo()

実行結果

python
f:id:sgrsn1711:20210622223937p:plain

mbed側
f:id:sgrsn1711:20210622223952p:plain