Arduino IDE1.6.7以上的版本,允许在串行绘图仪中绘制多个值。我们已经建立了一个示例,向您展示如何使用此功能。
我们用于测试串行绘图仪功能的设置。
目录
串行绘图器
Arduino的串行绘图器非常易于使用。串行绘图器实际上不像串行监视器那样显示一堆数字和/或字符,而是随着时间推移绘制数字,其中y轴是值,x轴是时间。这将生成一个实时绘制的任何数字变量的图形。
y轴具有简单的自动缩放功能,可适应这些值,而x轴则显示最后x条线(即样本)。主循环中的20ms延迟使串行绘图仪显示约。数据的最后15秒(循环本身没有太多处理时间)。增加此延迟(即减少打印频率)以减慢滚动x轴的速度。
串行绘图器功能已经在Arduino IDE中存在了一段时间,但是最新版本使您可以同时绘制多个变量,以便您可以直观地比较它们。我们举了一个实际的例子,该功能可以派上用场。
我们的例子
在我们的示例中,我们将使用与本教程几乎相同的设置。在硬件方面,我们仅向数字引脚3添加通用RC 微伺服电机(舵机)。它还需要连接至5V和GND。
接线和组件概述。
在软件方面,我们将使用相同类型的指数移动平均滤波器(EMA),您可以阅读同一教程以获取有关此内容的说明,并通过串行和ADC进行通信。
在代码中,我们添加了用于打印到串行绘图器的行以及用于伺服控制的行。
#include
Servo myservo; //create servo object
//Global Variables
int sensorPin = 0; //pin number to use the ADC
int sensorValue = 0; //initialization of sensor variable, equivalent to EMA Y
float EMA_a = 0.06; //initialization of EMA alpha
int EMA_S = 0; //initialization of EMA S
int EMA_S_map = 0; //initialization of variable for servo control
void setup(){
Serial.begin(115200); //setup of Serial module, 115200 bits/second
EMA_S = analogRead(sensorPin); //set EMA S for t=1
myservo.attach(3); //servo initialization
}
void loop(){
sensorValue = analogRead(sensorPin); //read the sensor value using ADC
EMA_S = (EMA_a*sensorValue) + ((1-EMA_a)*EMA_S); //run the EMA
Serial.print(sensorValue); //the first variable for plotting
Serial.print(","); //seperator
Serial.println(EMA_S); //the second variable for plotting including line break
EMA_S_map = map(EMA_S, 0, 1023, 0, 180); //map ADC values to servo values (0-180)
myservo.write(EMA_S_map); //send the latest value to the servo
delay(20); //20ms delay
}
此代码的内容位于loop()函数内,该函数是一遍又一遍重复的部分。首先,我们使用ADC读取连接到电位计的引脚,并获得介于0和1023之间的值。然后,在打印电位计的原始值(sensorValue)和滤波值(EMA_S)之前,通过EMA处理该值。
通常,与伺服器有关的线路是控制伺服器所需的基本材料。第1、3和15行都是必需的,后者定义了由Arduino引脚控制伺服器。第26行包含一个方便的Arduino函数,称为map(),该函数将一组数值线性转换为第二组数值。在此设置中使用此功能很有意义,因为我们从ADC获得1024个不同的值,并且由于伺服采用0到180之间的值。
将代码上传到您的Arduino,然后按ctrl + shift + L来查看正在运行的串行绘图仪!为EMA_a选择不同的值(0到1之间)以更改截止频率。0.06非常低,这导致较低的截止频率,因此滤波信号非常平滑且缓慢。
EMA_a = 0.06。蓝色:原始值(电位计),橙色:滤波值(伺服)
EMA_a = 0.3。与上图相同的时间跨度,但响应速度更快。
最后的想法
通常,您希望将打印频率与要执行的实际任务的频率分开。在我们的示例中,如果我们只想每秒打印10次,则伺服器也只会每秒更新10次位置(这很少出现)。因此,执行此操作的最佳方法是将与打印相关的主循环线放在自己的函数中,并根据需要打印到串行绘图仪的次数多次调用此函数。
对于本示例,在串行绘图仪的打印方面完全不需要伺服,但我们认为这是一种物理可视化滤波信号的有趣方式。
文章转载自(Mads Aasvik)
?