将数据从微控制器发送到另一个

时间:2017-01-18 14:22:54

标签: c microcontroller wireless

我正在制作一个项目,需要通过无线方式将数据从一个微控制器发送到另一个微控制器(我将使用433Mhz RF模块或2.4Ghz,还没有做出决定)。具体来说,我正在制作一个控制4个直流电机的操纵杆。所以我的问题是:当我编写代码时,我应该把命令加速' x'电机进入接收器的微控制器(控制电机的电路板)或发射器的微控制器(操纵杆板)?例如,如果我将操纵杆向左移动以加速电机3和4,那么我将在哪里编写此代码? 我在arduino(带有arduino bootloader的ATmega328)中做这个项目。

1 个答案:

答案 0 :(得分:0)

嗯,这绝对是一个主要基于意见的"问题,很可能会被关闭......但是......

这是你的设计,你需要设计它。在这种情况下,没有错误的答案,您可以让操纵杆板根据它们的类型简单地通过操纵杆开关状态或模拟状态......或者......您可以使用操纵杆板使用时间和操纵杆多长时间保持在一个位置,也许计算你认为设备位置应该是什么,然后通过它(你需要以这种方式旋转m步和n步)。或者根据您的整体系统设计,可以提出其他解决方案来平衡微控制器之间的负载。我认为你真正想要做的就是"简单地说#34;使用无线和额外的mcu作为操纵杆未连接的方法。如果操纵杆是连线的并且你用一个mcu做了它们并且这些是基于开关的(不是模拟电阻)操纵杆那么一个mcu将只是以某个间隔读取开关状态,可能是去抖动。那么当你向它添加无线时,你会希望无线解决方案简单地传递相同的开关状态,而不是在相同的寄存器空间中,并且不一定是相同的位位置在任何数据中,而只是开关状态。根据需要,你可以获得操纵杆mcu可以去抖的额外好处。也许只发送状态变化而不必每N个单位时间打扰电机mcu。

我最近尝试了这些模块并且非常失望,但我正在考虑再次尝试它们或者不同的供应商/构建它们。他们应该感觉"就像一条线说串口数据一些慢速4800波特,2400波特等。首先尝试我不得不做的事情就像不断发送一个模式说同一个字节0xAA,然后每隔一段时间就有一个小的有效载荷出现在那里所以搜索0xAA然后当你看到别的东西计算出那么多的字节数就是有效载荷。当我使用单独的计算机/耗材发送数据时,它从那里走下坡路,好像我的大部分成功虽然边缘可能是通过地面噪声而不是实际无线。他们出售了大量的这些,人们使用它们,所以毫无疑问这是我做的或购买垃圾模块,或者我可能不买天线,并焊接等等。

我会推荐两件事。首先使用有线连接获得mcus并运行应用程序,只需要一些跳线。您可能必须回到此处,因为您可能需要更改协议或波特率等。如果无线连接不完全可靠,即使数据没有改变,也许(很可能)你想要经常发送有效载荷,允许偶尔丢失的数据包在下一个处理。第二次学习使用无线连接是一个单独的实验,双方的代码应该只是工作一个问题我如何通过这个界面谈话,没有电机驱动器没有操纵杆,只是代码从一个到另一个说话。

可能是一个好主意,特别是如果你不需要不断传输,就是设计自己的数据包。理想情况下,一个或多个功能,同步模式和长度或同步模式以及校验和或同步模式,长度和校验和(以及有效负载)。所以也许一个0x7E字节作为同步模式,也许你总是要发送32位或4字节的有效载荷,所以不需要长度,然后可能是有效载荷的校验和或整个事物同步模式和有效载荷的校验和。你的接收器然后基本上从uart到字节缓冲区的字节,或者甚至不使用一个非常简单的状态机,如果搜索同步和字节不是0x7E然后丢弃,如果0x7e然后进入有效负载状态,计数为零接收接下来的四个字节(有效载荷),每个字节到达校验和。在有效载荷之后,下一个字节是校验和,如果匹配则整个事物很好将有效载荷传递给控制系统以更新开关状态和/或只是将其推入控制系统正在观察的全局变量,就像它是一个直接连接到操纵杆开关状态。

你可以得到你想要的复杂或不复杂,但我绝不会在这种设计中假设双方总是同步而且每N个字节都是在正确位置发送的N个字节,即使你从来没有丢弃一个字节,这是一个单向通信路径,因此如果接收器在发送器处于中间有效载荷时启动,则接收器在有效载荷/分组的中间出现,并且在解释数据时总是关闭。你可以做任何滑动/ ppp的事情,并通过添加更多的工作确保同步模式永远不会在数据中。或者不是,我怀疑你需要那么复杂,因为我认为你可能每次更新只发送一个或几个字节的实际数据。

为什么我第一次尝试这样的产品时尝试连续流,早在他们在ebay上从中国大肆宣传之前,我们必须确保"转换密度"你连一个状态不能超过一个连续状态的几个单元格,不能说连续两个零或一行连续两个基本上不得不在推送之前在软件中做一个biphase-l(manchester II)字节进入uart,然后在另一侧撤消它。希望硬件为你做到这一点,你不必,但推动来推动你可能必须采取每个字节,只有字节中的每个其他位是有效负载,它旁边的另一位是反向可能必须发送字节0x01(00000001)as(0101010101010110)0x55 0x56。希望你不必这样做,这不是很有趣。

你的微控制器开发工具箱应该包括一些usb到串行解决方案,可以在ebay上从中国或adafruit或sparkfun以10-15美元的价格获得一两分钱。中国有时会有5v或3.3v跳线或开关。开始使用这些模块的一种方法是根据rx或tx模块的需要将这些usb中的一个连接到串行分支5V或3.3。对于tx,将uart输出(tx)在数据引脚上,对于rx,数据引脚上的rx输入。然后启动两个minicom副本或你使用的任何哑终端程序,将它们设置为1200baud之类的慢速,并输入一个并查看你键入的是另一个。按住一个字符,U是一个好的,因为8n1它会产生一个方波。那是干净的吗?如果你减慢双方怎么办?如果加快怎么办?从简单的实验中,您可以开始开发协议。如果你有一个范围(现在有一个更容易,但仍然可以是昂贵的,几百美元,但访问一个非常重要)你可以更容易地做到这一点,用微控制器或usb到串行产生信号或任何然后看看另一方面显示的范围,它有多丑/清洁?您是否可以通过更改数据或使用连续数据敲击界面来使其更好看。