原文:https://circuitdigest.com/microcontroller-projects/arduino-smart-blind-stick
使用Arduino的智能盲棒
经过**阿斯温斯·拉吉(Aswinth Raj)** 2018年1月8日
听说过休·赫尔(Hugh Herr)吗?他是一位著名的美国攀岩运动员,打破了残疾的局限。他坚信技术可以帮助残疾人过上正常的生活。赫尔在他的TED演讲中说:“*人类不是残疾人。一个人永远不会被打破。我们的建筑环境,我们的技术已损坏并被禁用。我们人民不必接受我们的局限,而是可以通过技术创新来转移残疾*”。这些不只是言语,他还为他们过着自己的生活,今天他使用假肢,声称过着正常的生活。因此,是的,技术确实可以消除人类的残疾。考虑到这一点,让我们使用一些简单的开发板和传感器来使用Arduino构建超声波盲人手杖 对于视力障碍者而言,其效果不仅仅只是一根棍子。
这款智能摇杆将配备一个超声波传感器以感应到任何障碍物的距离,LDR可以感应照明条件,以及一个RF遥控器,盲人可以使用该遥控器远程定位其摇杆。所有反馈将通过蜂鸣器提供给盲人。当然,您可以使用振动电机代替蜂鸣器,并利用自己的创造力进一步提高。
所需材料:
- Arduino Nano(任何版本均可使用)
- 超声波传感器HC-SR04
- LDR
- 蜂鸣器和LED
- 7805
- 433MHz射频发射器和接收器
- 电阻器
- 电容器类
- 按钮
- 洞洞板
- 焊接套件
- 9V电池
您可以从这里购买该智能盲棒 项目的所有必需组件。
盲杆电路图:
这个Arduino Smart Blind Stick项目需要两个独立的电路。一个是将安装在盲人的棍子上的主电路。另一个是小型远程RF发射器电路,将用于定位主电路。下图显示了使用超声波传感器构建盲棒的主板电路图 :
如我们所见,Arduino Nano用于控制所有传感器,但是您也可以使用arduino uno来构建此Smart盲杆,但要遵循相同的引脚排列和程序。整个电路板由9V电池供电,该电池使用7805稳压器调节至+ 5V。超声波传感器是由5V供电,它的触发和回声引脚连接到Arduino的管脚3和2所示的上。该LDR与电阻器的值10K以形成一个分压器和电压差由Arduino的ADC管脚A1读取连接。ADC引脚A0用于从RF接收器读取信号。电路板的输出由连接到引脚12的蜂鸣器提供。
RF遥控电路如下所示。其工作方式也将进一步说明。
我使用了一个小技巧来使此RF远程控制电路正常工作。通常,在使用此433 MHz射频模块时,需要一个编码器和解码器或两个MCU才能工作,就像我们之前的射频发送器和接收器电路一样,我们分别使用了HT12D和HT12E,解码器和编码器IC。但是,在我们的应用中,我们只需要接收器来检测发送器是否正在发送一些信号。因此,发送器的数据引脚连接到电源的接地或Vcc。
接收器的数据引脚通过RC滤波器,然后提供给Arduino,如下所示。现在,只要按下按钮,接收器就会重复输出一些恒定的ADC值。当未按下按钮时,无法观察到此重复。因此,我们编写了Arduino程序来检查重复的值,以检测按钮是否被按下。这样盲人才能跟踪自己的棍子。您可以在此处查看:射频发射器和接收器如何工作。
我用一块洞洞板焊接了所有的连接,使它与棍子完好连接。但是,您也可以将它们放在面包板上。这些是我使用arduino为该盲棒项目制作的板**。**
用于智能盲棒的Arduino程序:
一旦我们准备好硬件,就可以将Arduino连接到我们的计算机并开始编程。此页面使用的完整代码位于页面底部,您可以将其直接上传到Arduino开发板。但是,如果您想知道代码的工作原理,请进一步阅读。
像所有程序一样,我们从*void* *setup()开始*以初始化Input Output Pins。在我们的程序中,蜂鸣器和触发器引脚是输出设备,而回声引脚是输入设备。我们还初始化了串行监视器以进行调试。
void setup()
{
Serial.begin(9600);
pinMode(Buzz,OUTPUT);
digitalWrite(Buzz,LOW);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
}
在*主*循环内,我们正在读取所有传感器数据。我们首先读取超声波传感器的距离数据,LDR的光强度和RF信号以检查按钮是否被按下。所有这些数据都保存在一个变量中,如下所示,以备将来使用。
calculate_distance(trigger,echo);
Signal = analogRead(Remote);
Intens = analogRead(Light);
我们首先检查远程信号。我们使用一个称为“ *likely_count”*的变量来检查从射频接收器重复多少次相同的值。仅当按下按钮时才会发生此重复。因此,如果计数超过100,我们将触发“远程按下”警报。
//Check if Remote is pressed
int temp = analogRead(Remote);
similar_count=0;
while (Signal==temp)
{
Signal = analogRead(Remote);
similar_count++;
}
//If remote pressed
if (similar_count<100)
{
Serial.print(similar_count); Serial.println("Remote Pressed");
digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW);
}
您也可以在计算机上的“串行监视器”上检查它:
接下来,我们检查盲人周围的光线强度。如果LDR的值小于200,则认为它很暗,我们通过蜂鸣器向他发出警告,并带有200ms的特定延迟音。如果强度非常高,超过800,则我们还会发出另一声警告。通过更改以下代码中的相应值,可以轻松更改警报音和强度。
//If very dark
if (Intens<200)
{
Serial.print(Intens); Serial.println("Bright Light");
digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);
delay(500);
}
//If very bright
if (Intens>800)
{
Serial.print(Intens); Serial.println("Low Light");
digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);
}
最后,我们开始测量到任何障碍物的距离。如果测得的距离超过50厘米,则不会发出警报。但是,如果它小于50厘米,警报将通过蜂鸣器发出蜂鸣声来开始。当物体靠近蜂鸣器时,蜂鸣间隔也会减少。物体离得越近,蜂鸣器将发出更快的蜂鸣声。这可以通过创建与测量距离成比例的延迟来完成。由于Arduino中的delay()无法接受变量,因此我们必须使用for循环,该循环基于所测得的距离进行循环,如下所示。
if (dist<50)
{
Serial.print(dist); Serial.println("Object Alert");
digitalWrite(Buzz,HIGH);
for (int i=dist; i>0; i--)
delay(10);
digitalWrite(Buzz,LOW);
for (int i=dist; i>0; i--)
delay(10);
}
了解有关使用超声波传感器和Arduino测量距离的更多信息。
通过更改我们用来比较的值,该程序可以轻松地适合您的应用程序。您可以使用串行监视器来调试是否触发了错误警报。如果您有任何问题,可以使用下面的评论部分来发表您的问题
Arduino盲目行动:
终于是时候测试我们的盲目arduino项目了。确保按照电路图进行连接,并且程序已成功上传。现在,使用9V电池为两个电路供电,您应该开始看到结果。将超声波传感器移到靠近物体的位置,您会注意到蜂鸣器发出蜂鸣声,并且当操纵杆靠近物体时,蜂鸣声的频率会增加。如果LDR漆黑或光线太强,蜂鸣器会发出蜂鸣声。如果一切正常,蜂鸣器将不会发出蜂鸣声。
当您按遥控器上的按钮时,蜂鸣器会发出一声长鸣。该 视频的末尾显示了使用Arduino的盲人用Smart Stick的完整工作。我还使用一个小棒来安装整个组件,您可以使用一个更大的棒或一个实际的盲棒并将其付诸实践。
如果您的蜂鸣器总是蜂鸣,则表示警报被错误触发。您可以打开串行监视器以检查参数,并检查哪些参数处于临界状态并进行调整。与往常一样,您可以在评论部分中发布您的问题以获取帮助。希望您理解该项目并喜欢构建一些东西。
/*
* Program for Blind Man Stick
* Code by B.Aswinth Raj
* Dated: 03-11-2017
* Website: www.circuitdigest.com
*/
const int trigger = 3; //Trigger pin of 1st Sesnor
const int echo = 2; //Echo pin of 1st Sesnor
const int Buzz = 13; //Echo pin of 1st Sesnor
const int Remote = A0; //Echo pin of 1st Sesnor
const int Light = A1; //Echo pin of 1st Sesnor
long time_taken;
int dist;
int Signal;
int Intens;
int similar_count;
void setup() {
Serial.begin(9600);
pinMode(Buzz,OUTPUT);
digitalWrite(Buzz,LOW);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
/*###Function to calculate distance###*/
void calculate_distance(int trigger, int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>300)
dist=300;
}
void loop() { //infinite loopy
calculate_distance(trigger,echo);
Signal = analogRead(Remote);
Intens = analogRead(Light);
//Check if Remote is pressed
int temp = analogRead(Remote);
similar_count=0;
while (Signal==temp)
{
Signal = analogRead(Remote);
similar_count++;
}
//If remote pressed
if (similar_count<100)
{
Serial.print(similar_count); Serial.println("Remote Pressed");
digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW);
}
//If very dark
if (Intens<200)
{
Serial.print(Intens); Serial.println("Bright Light");
digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200);
digitalWrite(Buzz,LOW);delay(200);
delay(500);
}
//If very bright
if (Intens>800)
{
Serial.print(Intens); Serial.println("Low Light");
digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500);
digitalWrite(Buzz,LOW);delay(500);
}
if (dist<50)
{
Serial.print(dist); Serial.println("Object Alert");
digitalWrite(Buzz,HIGH);
for (int i=dist; i>0; i--)
delay(10);
digitalWrite(Buzz,LOW);
for (int i=dist; i>0; i--)
delay(10);
}
//Serial.print("dist=");
//Serial.println(dist);
//Serial.print("Similar_count=");
//Serial.println(similar_count);
//Serial.print("Intens=");
//Serial.println(Intens);
}