Arduino真的是好用,
已经上瘾。
这次做的是风洞稳定小球系统
一、元件模块
Arduino正面
Arduino引脚接线
驱动板,反正是freescale小破车上用的那款
电源。
风洞
风扇型号
二、Arduino代码
一言不合就上代码
#include <PID_v1.h> int inputPin=4; // define ultrasonic signal receiver pin ECHO to D4 int outputPin=5; // define ultrasonic signal transmitter pin TRIG to D5 int pwm = 6; //pwm输出D6 int dis=0; double Setpoint, Input, Output; PID myPID(&Input, &Output, &Setpoint,0.7,5.3,0.8, DIRECT); void setup() { Serial.begin(9600); pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); pinMode(pwm, OUTPUT); Setpoint=160; Input=150; myPID.SetMode(AUTOMATIC); } void loop() { dis=distanceM(); Input=255-map(dis,0,45,20,200); myPID.Compute(); analogWrite(pwm, Output); Serial.print(" "); Serial.print(Input); Serial.print(" "); Serial.println(Output); } int distanceM() { digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); // Pulse for 10μs to trigger ultrasonic detection delayMicroseconds(10); digitalWrite(outputPin, LOW); int distance = pulseIn(inputPin, HIGH); // Read receiver pulse time distance= distance/58; // Transform pulse time to distance Serial.print(distance); //Ourput distance delay(50); return distance; }
之前已经说过连接了
再发一遍
传感器SRF05超声波
VCC ------------5V
GND ------------GND
PIN ECHO -----D4
PIN TRIG ----- D5
代码里使用了一个自带库PID_v1.h
myPID(&Input, &Output, &Setpoint,0.7,5.3,0.8, DIRECT);
输入,输出,稳定收敛位置点,Kp,Ki,Kd,直接方式。
Input=255-map(dis,0,45,20,200);
这里是一个映射,因为我的传感器放在了风洞的上端
这样距离顶端越近数值就越小,所以需要改个符号。
让它的数值和高度成正比。
而PWM正好是0-255的数值,所以这样改。
PWM的输出脚是D6,
频率是1kHz,虽然频率低了但是还够用。
三、参数调试
接下来用串口数据来看
分别是距离,input,output。
我把数据拿下来用matlab来plot
红色代表高度,还是比较稳定的
黄色就是PWM的值。
因为之前测试传感器非常稳定,
所以数据输入我并没有用Kalman filter来处理。
被风扇砍了一刀,
综上,没有烂尾,万岁!
时间: 2024-10-13 07:38:14