两块 Arduino板之间 CAN 总线发送接收和显示数据

本文介绍如何通过CAN总线在两个Arduino之间传递模拟引脚的值,该值最终显示在LCD屏幕上。内容涉及CAN总线的终端电阻、连接到现有总线的注意事项、CAN总线消息的结构以及数据打包和解析的方法。示例代码展示了发送和接收端的实现。
摘要由CSDN通过智能技术生成

本文的目的是传输连接到线性电位器的模拟引脚的值。 数据将通过 CAN 总线从一个 Arduino 发送到另一个 Arduino,然后在连接到第二个 Arduino 的 LCD 上显示该值。如下图,

材料

接线图

CAN 总线终端

CAN 总线需要在总线的每一端都有 120 欧姆的终端电阻。 Seeed Studio 防护罩内置终端电阻器。 当你像我在这个例子中所做的那样,将两个 Seeed CAN 总线屏蔽连接在一起时,你将拥有一个正确端接的 CAN 总线。 如果您计划连接到已有终端的现有 CAN 总线,您可以禁用内置终端电阻。 要禁用终止,您可以切断走线 P1 或拆焊电阻器 R1。

连接到现有的 CAN 总线

如果您计划连接到现有的 CAN 总线(例如在汽车中),您需要移除/禁用屏蔽板上的终端电阻,如上所述。 车辆中的 CAN 总线已经具有终端电阻器。 添加带有终端电阻的新节点将导致错误并中断总线上的通信。

另一个重要步骤是连接 Arduino 板和车辆之间的公共接地。如果您在 OBD2 端口连接,则引脚 5 提供信号接地。如果您找不到信号接地线,则底盘接地就足够了。

CAN 总线消息

每条消息都由一个 id 和一些数据组成。十六进制的 id 从 0x000 开始到 0x7FF 或 十进制从0 到 2047。在大多数系统中,较低的 id 值被认为更重要。总线通过让较低的 id 赢得碰撞来处理碰撞。每条消息的数据可以介于 1 到 8 个字节之间。每个字节的值可以是 0 到 255 或十六进制 0x00 到 0xFF。当您发送 CAN 总线消息时,您将传输 id、字节数(这称为 DLC)和实际数据。接收方只会读取您所说的消息中应该包含的字节数。因此,如果您发送 4 个 DLC 但消息包含 8 个字节,则接收器将仅读取前 4 个字节。每条消息 8 个字节有点限制,但代价是总线的高可靠性。因此,有时您必须创造性地将数据填充到这些字节中。如果您发送的值小于 255,您可以只使用一个字节。更大的数字将需要使用多个字节。可以发送 Ascii 代码,但每条消息只能发送 8 个字符。无论您使用什么方法填充数据,也必须使用任何方法在接收器上取消填充数据。在这里的简单示例中,我进行了一些数学运算,将值的范围限制为 0-255。模拟引脚产生 0-1024 之间的值。我只是简单地将结果除以四,以得到可以在单个字节中发送的数据。

CAN 总线可以以多种不同的速度运行,最高可达 1 Mbit/s。典型的速率为 100 kbit/s、125 kbit/s 和 500 kbit/s。较慢的速率允许更长的总线。总线上的所有设备必须以相同的速度传输。

代码

发送端代码

接收端代码

详情参阅 - 亚图跨际

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino和Python之间互相发送和读取数据,可以使用串口通信实现。 以下是一个示例代码,演示如何在Arduino和Python之间互相发送和读取数据: 在Arduino端: ```c++ void setup() { Serial.begin(9600); } void loop() { // 读取串口数据 if (Serial.available()) { int data = Serial.read(); // 将读取到的数据发送回去 Serial.println(data); } } ``` 在Python端: ```python import serial # 设置串口参数 ser = serial.Serial('COM3', 9600, timeout=1) # 发送数据Arduino ser.write(b'Hello Arduino!') # 读取Arduino发送数据 while True: if ser.in_waiting > 0: data = ser.readline().decode().strip() print(data) ``` 在上面的代码中,Arduino通过`Serial.read()`函数读取串口中的数据,并使用`Serial.println()`函数将读取到的数据发送回去。 Python代码中,首先使用`serial.Serial()`函数设置串口参数。然后,使用`ser.write()`函数向Arduino发送数据。接下来,使用一个`while`循环不断读取Arduino发送数据。使用`ser.in_waiting`函数检查是否有数据可读,如果有,则使用`ser.readline()`函数读取一行数据,使用`decode()`函数将字节数据转换为字符串,使用`strip()`函数去除字符串两端的空格和换行符。最后,打印读取到的数据。 注意:在Arduino和Python之间发送和读取数据时,请确保发送和读取的数据格式相同。例如,如果Arduino发送的是二进制数据,而Python代码中使用`readline()`函数读取数据,则可能无法正确读取数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值