|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 Guc 于 2016-11-23 08:22 编辑
大家好,今天我是搬运工Guc。
在RC Groups看到这个DIY,觉得挺有意思的,所以转来与大家分享,原作者Kapteinkuk。这个模块主要用于提示航模当前的升降状态,通过不同的声音回传,让操作者有直观的感受,以便更好的对航模进行操作。
主要用到:arduino nano、气压计模块ms5611、发射器AM-rt14-433、接收器RRQ3-433.92、电容若干、电阻若干、电源5v模块等。
先看个视频:
下面是DIY过程中的图片及电路图:
做好的模块
机载模块和地面模块的电路图,电路图中注释了所需要的原件
机载模块背面,使用了一个33uf的钽电容
气压计模块通过I2C通信
机载发射模块
发射模块背面
地面模块
地面模块背面
5v供电和音频输出,原作者应该利用其他拆机设备
第一个视频可能看的不是很明白,不怕还有第二个视频:
我们来看看代码:
// All code by Rolf R Bakke, Oct 2012
#include <Wire.h>
const byte led = 13;
unsigned int calibrationData[7];
unsigned long time = 0;
float toneFreq, toneFreqLowpass, pressure, lowpassFast, lowpassSlow ;
int ddsAcc;
void setup()
{
Wire.begin();
Serial.begin(115200);
setupSensor();
pressure = getPressure();
lowpassFast = lowpassSlow = pressure;
}
void loop()
{
pressure = getPressure();
lowpassFast = lowpassFast + (pressure - lowpassFast) * 0.1;
lowpassSlow = lowpassSlow + (pressure - lowpassSlow) * 0.05;
toneFreq = (lowpassSlow - lowpassFast) * 50;
toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
toneFreq = constrain(toneFreqLowpass, -500, 500);
ddsAcc += toneFreq * 100 + 2000;
if (toneFreq < 0 || ddsAcc > 0)
{
tone(2, toneFreq + 510);
}
else
{
noTone(2);
}
ledOff();
while (millis() < time); //loop frequency timer
time += 20;
ledOn();
}
long getPressure()
{
long D1, D2, dT, P;
float TEMP;
int64_t OFF, SENS;
D1 = getData(0x48, 10);
D2 = getData(0x50, 1);
dT = D2 - ((long)calibrationData[5] << 8);
TEMP = (2000 + (((int64_t)dT * (int64_t)calibrationData[6]) >> 23)) / (float)100;
OFF = ((unsigned long)calibrationData[2] << 16) + (((int64_t)calibrationData[4] * dT) >> 7);
SENS = ((unsigned long)calibrationData[1] << 15) + (((int64_t)calibrationData[3] * dT) >> 8);
P = (((D1 * SENS) >> 21) - OFF) >> 15;
//Serial.println(TEMP);
//Serial.println(P);
return P;
}
long getData(byte command, byte del)
{
long result = 0;
twiSendCommand(0x77, command);
delay(del);
twiSendCommand(0x77, 0x00);
Wire.requestFrom(0x77, 3);
if(Wire.available()!=3) Serial.println("Error: raw data not available");
for (int i = 0; i <= 2; i++)
{
result = (result<<8) | Wire.read();
}
return result;
}
void setupSensor()
{
twiSendCommand(0x77, 0x1e);
delay(100);
for (byte i = 1; i <=6; i++)
{
unsigned int low, high;
twiSendCommand(0x77, 0xa0 + i * 2);
Wire.requestFrom(0x77, 2);
if(Wire.available()!=2) Serial.println("Error: calibration data not available");
high = Wire.read();
low = Wire.read();
calibrationData = high<<8 | low;
Serial.print("calibration data #");
Serial.print(i);
Serial.print(" = ");
Serial.println( calibrationData );
}
}
void twiSendCommand(byte address, byte command)
{
Wire.beginTransmission(address);
if (!Wire.write(command)) Serial.println("Error: write()");
if (Wire.endTransmission())
{
Serial.print("Error when sending command: ");
Serial.println(command, HEX);
}
}
void ledOn()
{
digitalWrite(led,1);
}
void ledOff()
{
digitalWrite(led,0);
}
arduino固件下载:
sailplane-variometer.zip
(1.18 KB, 下载次数: 1)
原链接:https://www.rcgroups.com/forums/showthread.php?t=1749208
这个模块我也没有做过,因为用到的东西卖的有点贵,有想法用图传的音频通道来实现该功能,敬请期待!
|
| |