使用Arduino的智能盲棒

原文:https://circuitdigest.com/microcontroller-projects/arduino-smart-blind-stick

使用Arduino的智能盲棒

ARDUINO项目

经过**阿斯温斯·拉吉(Aswinth Raj)** 2018年1月8日
在这里插入图片描述

听说过休·赫尔(Hugh Herr)吗?他是一位著名的美国攀岩运动员,打破了残疾的局限。他坚信技术可以帮助残疾人过上正常的生活。赫尔在他的TED演讲中说:“*人类不是残疾人。一个人永远不会被打破。我们的建筑环境,我们的技术已损坏并被禁用。我们人民不必接受我们的局限,而是可以通过技术创新来转移残疾*”。这些不只是言语,他还为他们过着自己的生活,今天他使用假肢,声称过着正常的生活。因此,是的,技术确实可以消除人类的残疾。考虑到这一点,让我们使用一些简单的开发板和传感器来使用Arduino构建超声波盲人手杖 对于视力障碍者而言,其效果不仅仅只是一根棍子。

这款智能摇杆将配备一个超声波传感器以感应到任何障碍物的距离,LDR可以感应照明条件,以及一个RF遥控器,盲人可以使用该遥控器远程定位其摇杆。所有反馈将通过蜂鸣器提供给盲人。当然,您可以使用振动电机代替蜂鸣器,并利用自己的创造力进一步提高。

在这里插入图片描述

所需材料:

  1. Arduino Nano(任何版本均可使用)
  2. 超声波传感器HC-SR04
  3. LDR
  4. 蜂鸣器和LED
  5. 7805
  6. 433MHz射频发射器和接收器
  7. 电阻器
  8. 电容器类
  9. 按钮
  10. 洞洞板
  11. 焊接套件
  12. 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值