banner

智伴卫士——360°智能盲人避障腰带

发布时间:2021-05-30
步骤1 作品主旨

【主旨】:关爱盲人、和谐社会

【概述】:

       前段时间,我们拜读了陈燕《耳边的世界》,我深深地感受到盲人生活是多么的艰难,被父母抛弃是多么的可怜,遭到别人的否定是多么的伤心。大家都知道我们健全人都有时不好生存,何况是盲人。

       我们健康的人很难感受到盲人生活的困难,其实当我们换位思考一下,假如我们自己眼睛失明,可能完全不能生活。从起床那一刻起,我们找不到鞋子在哪里,我们找不到门口在哪里,我们找不到衣服在哪里,我们没办法刷牙洗脸,吃饭、出门、上学……

       盲人的困难存在于生活的方方面面,我们现在能力不能够解决他们所有问题,但是我们希望能能够通过我们的能力帮助他们其中一种困难就可以了。事实上,对于绝大多数视障者而言,出行上的困难他们都能想办法克服,当然障碍还是有的,比如,盲道的设计还有许多可以提升和改善的空间,许多需要过马路的地方红绿灯没有提示音,许多公交车站未安装报站音响设备,步行导航的精确度有待提高。因此,我们的团队聚焦于盲人行走的点上,我们希望设计出一款可穿戴的腰带,帮助盲人在行走过程中提示盲人周围的障碍物。

projectImage
步骤2 作品展示
步骤3 功能介绍

【组成结构】:

      (1)360°障碍物检测:使用6个超声波传感器圆周均分安装在腰带上,可以同时检测四周6个方向的障碍物距离;

      (2)360°震动感应:使用6个震动马达,与6个超声波传感器安装位置一致,当时超声波传感器检测到有障碍物时,对应的震动马达会跟进距离值发出不同程度的震动,以提示该方向障碍物距离;

      (3)快速穿戴拆卸:使用弹性松紧带与插卡口制作成快速穿戴拆卸的结构,使用非常方便;

步骤4 硬件清单
硬件清单
1x
Arduino uno
1x
Arduino 扩展板
6x
超声波传感器
6x
震动传感器
1x
7.4V充电锂电池
2x
松紧带
1x
插卡扣
10x20px
杜邦线
步骤5 制作过程

【结构设计】

       我们的产品主体结构是以松紧带为主要载体,在松紧带两端装上插卡扣,围绕松紧带安装上6个超声波传感器和6个震动马达。如下图所示:

projectImage
projectImage

【传感器安装】

       我们使用螺丝将震动模块和超声波模块固定在松紧带上。实际安装过程中,我们发现震动模块只有两颗螺丝固定,因为松紧带的孔是可以因外力变大的,螺母和松紧带容易掉落,即便添加防滑垫片,也没有好的效果,所以我们使用了热缩管作为一条长的垫片,解决了震动模块脱落的问题,超声波模块因为有三颗螺丝,固定效果很好,所以不需要使用垫片,如下图所示:

projectImage
projectImage
projectImage

       线路连接过程中,因为连续比较多,而且复杂,我们使用了便签纸记录每个传感器与Arduino 连接的端口,方便后期调试代码;

projectImage

       传感器都连接好,经过测试保证每根线连通性,然后使用电子胶将裸露的接口全部固化起来,防止在使用过程导线松动出现故障;

projectImage

       插卡扣的安装,如图所示:

projectImage
步骤6 电路原理图
projectImage

       本作品使用了6个超声波模块、6个震动模块,每个超声波占用2个IO口,共需要12个,每个震动器需要占用1个PWM口,一共需要6个,所有模块全部需要18个IO口,但我们拿到的拓展板D4、D5、D6、D7被电机驱动模块占用,导致不管超声波和震动模块的接口都不够使用。

       经过研究实验,我们发现超声波模块TRIG引脚作为超声波发送引脚,可以将6个超声波模块的TIRG引脚并接在一起,在使用的时候可以同时发出超声波,只需要CEHO引脚单独读取数据即可;实验数据如下所示:

projectImage

       另外震动模块需要6个PWM信号口,而Arduino的默认PWM口为3、5、6、9、10、11引脚,拓展板被电机驱动芯片占用5、6引脚,那么只剩4个PWM口,还缺两个。

       经过查阅大量资料,我们找到一个SoftPWM.h库,使用该库文件,可以使用任意IO设置成PWM输出,解决了我们的问题。所以最终IO分配如下图所示,每行两个IO口的左边为超声波的ECHO引脚,右边为震动马达引脚。

projectImage
步骤7 代码编写
代码
#include <SoftPWM.h>
#define motorA 11
#define motorB 10
#define motorC 9
#define motorD 8
#define motorE 2
#define motorF 3
void setup(){
  Serial.begin(9600);
  pinMode(A4, OUTPUT);
  pinMode(A0, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
 
  SoftPWMBegin();
  SoftPWMSet(11, 0);
  SoftPWMSet(10, 0);
  SoftPWMSet(9, 0);
  SoftPWMSet(8, 0);
  SoftPWMSet(2, 0);
  SoftPWMSet(3, 0);
  SoftPWMSetFadeTime(11, 100, 100);
  SoftPWMSetFadeTime(10, 100, 100);
  SoftPWMSetFadeTime(9, 100, 100);
  SoftPWMSetFadeTime(8, 100, 100);
  SoftPWMSetFadeTime(2, 100, 100);
  SoftPWMSetFadeTime(3, 100, 100);
}

void loop(){
  int distanA,distanB,distanC,distanD,distanE,distanF;
  distanA = checkdistanceA();
  checkmotor(distanA,motorA);
  Serial.print("A");
  Serial.print(distanA);
  
  distanB = checkdistanceB();
  checkmotor(distanB,motorB);
  Serial.print("    B");
  Serial.print(distanB);

  distanC = checkdistanceC();
  checkmotor(distanC,motorC);
  Serial.print("    C");
  Serial.print(distanC);

  distanD = checkdistanceD();
  checkmotor(distanD,motorD);
  Serial.print("     D");
  Serial.print(distanD);

  distanE = checkdistanceE();
  checkmotor(distanE,motorE);
  Serial.print("     E");
  Serial.print(distanE);

  distanF = checkdistanceF(); 
  checkmotor(distanF,motorF);
  Serial.print("     F");
  Serial.println(distanF);

  
}

void checkmotor(int distan,int motor)
{
    if(distan<40)
  {
     distan =  map(distan,5,4,255,0);
     SoftPWMSet(motor, distan);
    }
  else SoftPWMSet(motor, 0);
  delay(10);
}
  

float checkdistanceA() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(A0, HIGH) / 58.00;
  delay(10);
  return distance;
}

float checkdistanceB() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(12, HIGH) / 58.00;
  delay(10);
  return distance;
}

float checkdistanceC() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(13, HIGH) / 58.00;
  delay(10);
  return distance;
}

float checkdistanceD() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(A1, HIGH) / 58.00;
  delay(10);
  return distance;
}

float checkdistanceE() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(A2, HIGH) / 58.00;
  delay(10);
  return distance;
}

float checkdistanceF() {
  digitalWrite(A4, LOW);
  delayMicroseconds(2);
  digitalWrite(A4, HIGH);
  delayMicroseconds(10);
  digitalWrite(A4, LOW);
  float distance = pulseIn(A3, HIGH) / 58.00;
  delay(10);
  return distance;
}
步骤8 项目总结

       经过初步试验,我们设计的可穿戴腰带可以在环境不复杂情况下能够很好地反应出障碍物,而使用震动模块,也能让使用者通过触觉感应到各个方向的距离远景,这种方式比语音或者警报等方式,能够在传达信息时互不干扰,而且还不会对周围的人产生声音干扰。

       因此我们认为,我们的可穿戴腰带可以应用于盲人身上,帮助他们在行走过程感应四周环境。

       目前我们的作品还只是第一代研究,还比较简陋、一体化成不不高,各个电路板体积太大等缺点。而且超声波模块在测距方面要求环境比较理想,实际生活中比较复杂。所以我们的团队在接下的时间希望能够继续将这个可穿戴腰带改进优化,可以真用应用于社会,帮助盲人出行。

步骤9 软件源代码
附件
icon 蔡元淇、吕湘:智伴卫士——360°智能盲人避障腰带.zip 1KB
下载
队伍名称 艾娃战队 参赛组别 小学
参赛学生 蔡元淇 浙江省诸暨市天马实验学校 吕湘 浙江省诸暨市天马实验学校
指导老师
范琳虹 浙江省诸暨市天马实验学校
指导老师
金杭炳 浙江省诸暨市天马实验学校