我正在尝试使用 Arduino 或 Lilypad 板为我的自行车制作车载系统。
我想我应该使用霍尔效应传感器,但任何替代品也都不错。
我想将我的速度输出到液晶显示器,我想知道最好的方法。
我正在尝试使用 Arduino 或 Lilypad 板为我的自行车制作车载系统。
我想我应该使用霍尔效应传感器,但任何替代品也都不错。
我想将我的速度输出到液晶显示器,我想知道最好的方法。
使用 Starliner 建议的霍尔效应传感器将是与车轮接口的一种方式。不过,鉴于霍尔效应传感器需要支持硬件来获得干净的数字信号,Achim 和 Shutterdrone 使用簧片开关的建议更有意义。
您也许可以从损坏的自行车电脑中取出磁铁和传感器,但如果您不能,当地的零部件商店应该有一个库存。回收传感器和磁铁的优点是您已经拥有安装硬件。
arduino wiki 上有一个关于ReadingRPM信号的页面。要计算速度,请将 RPM 值乘以车轮的周长(2 * pi * 半径 [以米为单位])。结果将以米/分钟为单位。
编辑:我注意到链接代码适用于每转两个脉冲的系统。一块磁铁足以完成您的任务。此外,对于自行车计算机,您可能希望结果以 KPH 为单位(如果您居住在仍然认为这是文明的地方,则为 MPH)。我对 wiki 上的代码做了一些(未经测试的)修改,以打印出 KPH 并将它们粘贴在下面。
volatile byte revolutions;
unsigned int rpmilli;
float speed;
unsigned long timeold;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
revolutions = 0;
rpmilli = 0;
timeold = 0;
}
void loop()
{
if (revolutions >= 20) {
//Update RPM every 20 counts, increase this for better RPM resolution,
//decrease for faster update
// calculate the revolutions per milli(second)
**rpmilli = (millis() - timeold)/revolutions;** EDIT: it should be revolutions/(millis()-timeold)
timeold = millis();
**rpmcount = 0;** (EDIT: revolutions = 0;)
// WHEELCIRC = 2 * PI * radius (in meters)
// speed = rpmilli * WHEELCIRC * "milliseconds per hour" / "meters per kilometer"
// simplify the equation to reduce the number of floating point operations
// speed = rpmilli * WHEELCIRC * 3600000 / 1000
// speed = rpmilli * WHEELCIRC * 3600
speed = rpmilli * WHEELCIRC * 3600;
Serial.print("RPM:");
Serial.print(rpmilli * 60000,DEC);
Serial.print(" Speed:");
Serial.print(speed,DEC);
Serial.println(" kph");
}
}
void rpm_fun()
{
revolutions++;
}
此外,我在此启用了“社区 wiki”,我认为这意味着其他用户可以编辑它。如果我的数学是错误的(你可以证明它!)跳进去为我解决它。:)
实际上,Achim 在这里提出了一个非常好的观点。
簧片(磁性)继电器(开关)和霍尔效应传感器之间存在很大差异。
首先,只要有足够的磁力作用在开关上,簧片继电器就会连接开关,为您提供开/关信号。霍尔效应传感器提供一个电压电平,指示对其施加了多少磁力。
上面显示的代码只能“直接”与簧片继电器一起使用,这并不是说它对霍尔效应传感器根本不起作用,而是说使用霍尔效应传感器会带来额外的挑战。
主要挑战是您将模拟设备视为数字设备 - 期望在脉冲上升时触发。现在,信号不会被脉冲化——它通常会像一个钟形曲线,有各种各样的波动。当磁铁通过霍尔效应传感器时,您可能会多次超过高信号的最小电压(大约 3.5v,IIRC?)。
当然,使用霍尔效应传感器之类的东西时,我们的第一反应是使用 ADC 并读取模拟引脚上的电压电平。但是,在模拟引脚上大约每秒读取 10,000 次(每次读取需要 100uS)。这还假设您所做的只是循环和读取值 - 不会给您留下太多其他时间来更新显示、计算等。更不用说,如果您在错误的时间阅读,您就会错过信号!
我确信可以使用以某种方式链接到 ADC 的中断,但我手头没有这样的知识。
相反,如果您希望使用实际的霍尔效应传感器,我建议将其输入施密特触发器,以将其转换为校准电平的数字(开/关)信号,指示“直接在磁铁下方”。此外,根据施密特触发器中实施的滞后水平,您可能需要进行一些去抖动,以根据当前速度改变去抖动率。然后你可以把它当作一个普通的 Reed 继电器。
!C
霍尔效应传感器和簧片开关是这里提到的最多的,它们是最好的解决方案。
簧片开关会更便宜,但可能会在自行车受到震动时给您错误的脉冲。如果这只是路边骑行中的一个,软件可能很容易将其过滤掉,但是当你骑在鹅卵石上时情况就不同了,这可能会一直给你错误的脉冲。更抗震的簧片开关需要更强的磁场才能激活,但钕磁铁可以解决这个问题。
编辑回答 m.Alin 的问题
簧片开关很快。那是因为簧片的质量低(= 低惯性)和低行程,通常只有十分之几毫米。该簧片开关的操作时间 < 0.6 ms,释放时间 < 0.1 ms。在 36 公里/小时时,当安装在车轮直径的一半时,开关在 1 毫秒内移动 5 毫米。所以它足够快,可以在它通过磁铁时被激活。
这份关于同一个开关的文档给出了 > 10\$^7\$ 操作的预期寿命,但这并不像看起来那么多。如果您每天跑 25 公里,您将在 2 年内达到 10\$^7\$ 转换事件。
编辑结束
霍尔效应开关没有这些缺点,但价格稍贵一些。
您可以在 2 个脉冲之间获得时间 \$T\$ 作为来自传感器的信息。然后
速度 \$ v = \dfrac{\pi D}{T} \$
如果车轮直径 \$D\$ 以米为单位,则以 m/s 为单位,而 \$T\$ 以秒为单位。通过除以 3.6 转换为 km/h,除以 5.79 为 mph。
距离 \$ s = \text{脉冲计数} \times \pi \times D \$
如果车轮直径 \$D\$ 以米为单位,则以米为单位。以公里为单位的距离除以 1000,以英里为单位除以 1609。
磁铁可以安装在车轮轮辋的边缘,霍尔效应传感器安装在非常靠近(但不接触)磁铁的位置。当车轮旋转并且磁铁通过传感器时,传感器将接收到磁场的变化。