Arduino-创建动态规则

Arduino-创建动态规则,arduino,Arduino,我想为arduino创建一个程序,以便能够随时添加和删除控制某些管脚的规则,而不是硬编码它们。 例如,这样的规则: 如果pin1=高,pin2=低,则pin3=高 我想变成这样: if(pin1 == HIGH && pin2 == LOW){ digitalWrite(pin3, HIGH); } 假设我们通过命令行将规则作为字符串传递。 如何将此字符串转换为规则?这样做可能吗?您的第二段代码: if(pin1 == HIGH && pin2 == LO

我想为arduino创建一个程序,以便能够随时添加和删除控制某些管脚的规则,而不是硬编码它们。 例如,这样的规则:

如果pin1=高,pin2=低,则pin3=高

我想变成这样:

if(pin1 == HIGH && pin2 == LOW){
   digitalWrite(pin3, HIGH);
}
假设我们通过命令行将规则作为字符串传递。
如何将此字符串转换为规则?这样做可能吗?

您的第二段代码:

if(pin1 == HIGH && pin2 == LOW){
   digitalWrite(pin3, HIGH);
}
由IDE编译成机器代码。然后将该机器代码上载到Arduino并执行

因此,不能只发送这样的字符串

if pin1=HIGH and pin2=LOW then pin3=HIGH
对于Arduino,因为在您的程序将其转换为所需的形式后,Arduino端缺少完整的IDE和编译器内容。一个C++编译器工具链是大的——几十兆字节!在Arduino号上没有这样的位置

你能做的:为你的规则发明一种简单的语言,并为它开发一个解释器,然后在Arduino上运行


也许你也不需要重新发明轮子-谷歌在AVR CPU上运行简单的基本解释器,并对其中一个进行调整。

你所要求的是可能的,但你需要做很多工作


方法1(大胆思考):

您正在寻找的是一种软件实现,它与PAL(可编程阵列逻辑)和CPLD(复杂可编程逻辑器件)的操作方式相当。如果阅读本文,您将了解如何在硬件中实现这一点:

PAL可以在一组输入和输出之间创建任意组合逻辑规则,也就是说,任何可以表示为and、OR和NOT的逻辑方程的东西都可以编程。它通过“燃烧”一组保险丝进行编程,这些保险丝将输入连接到逻辑门,然后连接到输出。上载到这些设备的只是一组0和1

您可以在软件中使用0和1的数组来表示保险丝,从而实现这样的功能。硬代码将在数组上运行并计算输出。您需要开发使用正确保险丝加载阵列的方法

PAL的一种常用编程方法是使用VHDL语言。这种语言的编译器采用类似于您的表达式,并将其转换为PAL可以使用的and、OR和NOT的集合。搜索将产生对这种语言的无休止的讨论,例如:

您必须创建接受文本输入并确定保险丝的编译器。您将承担一些重要任务:

  • 特定于域的语言分析器()

  • 一个PAL编译器(我不建议任何人自己做),和

  • 用于模拟PAL的Arduino代码

当您创建自己的等效VHDL和PAL时,您可能会认为您可以将PAL芯片放在原型板上并完成


方法2(更实用):

实现相同结果的更简单方法是真值表。真值表相当于一组逻辑表达式。要实现真值表,请将逻辑表达式转换为一个表,每个输入案例对应一行。以下是驱动输出的两个输入的真值表示例:

IN1  IN2  OUT
0    0    1
0    1    0
1    0    1
1    1    1
这种真值表实现的代码如下所示:

const int IN1 = 6;
const int IN2 = 7;
const int OUTA = 13;

byte table[4] = {1, 0, 1, 1};

void loop() {
  int in1;
  int in2;
  byte outbit;
  size_t ix;
  //
 in1 = digitalRead(IN1);
 in2 = digitalRead(IN2);
 ix = in2 * 2 + in1;
 outbit = table[ix];
 digitalWrite(OUTA, outbit);
}
逻辑规则的完整表达式是4字节的数组。要“编程”一个新的输出方程,只需发送一组新的4个值,对于特定的方程,发送“0 1 0”。您的程序将接收值列表并将其存储在表数组中。一旦存储了新的值/规则,输出的功能就会改变

只要您有足够的RAM来存储表,这种类型的可编程逻辑是可行的。对于4个输入,您只需要16个值,对于5个输入,您只需要32个值



你的问题在电子设计中提出了一个尖锐的观点:你需要为正确的问题选择正确的设备。代码并不总是更好或更容易。避免使用锤子-钉子陷阱(当你唯一的工具是锤子时,每个问题看起来都像钉子)。PAL/CPLD和微控制器是一个强大的组合。

为了补充@jdr5ca提到的真值表方法,最好了解arduino中使用的控制器以及Arduno库

引脚0至7为端口D,引脚8至15为端口B。每个端口由三个单字节寄存器表示-端口_u为输出/偏置电阻,引脚_u为输入状态,DDR_u为方向。当您调用
digitalRead(pin)
时,代码会看到该引脚在哪个范围内,读取该端口的
pin
,然后位移动并屏蔽该值以仅给出该引脚的状态。这对于一次读取一个pin很方便,但比读取多个pin更不方便

因此,如果您创建一个包含256个条目的真值表,您可以使用一行从输入0到7的值写入管脚8到15的输出,而不是将寄存器解码为管脚,然后再次编码:

byte table[256] = {0};

void loop() {
   PORTB = table[PIND];
}

然后,您可以添加一些内容从序列中读取,并动态地将新值加载到表中。

命令行指向什么?你能指定吗?我想把一个文本字符串转换成一个规则。例如,我想创建一个类似“pin1==1&&pin2==0&&pin3==0然后pin3=HIGH”的规则。我只是希望能够添加(或删除)规则并将它们传递给程序。为什么不通过串行端口发送文本并解释文本?你可以从那里做任何你想做的事。。。您可以直接发送字符串“pin1==1&&pin2==0&&pin3==0”,并将程序驱动器的pin3设置为高电平。你有多少“规则”?要得到一个合适的答案,让自己离你想要实现的目标更近一步,首先要弄清楚你想要什么样的规则