用于手语翻译的传感器手套

一种传感器手套,可将手势转换为文本和语音,通过蓝牙连接的 Android 应用程序提供。

应用和平台

项目介绍

介绍

顾名思义,该设备是一种基于传感器的可穿戴设备,可将简单的手势转换为文本和语音。我决定在大学里做一个项目。

方法论

对于这个项目,将使用的工具和技术是 Atmega328p 微处理器、蓝牙(蓝牙模块)、Flex 传感器、加速度计、电源模块、电阻器和文本转语音软件(蓝牙终端应用程序)。柔性传感器根据手势测量手指的弯曲,并输出与弯曲量相对应的阻力变化。加速度计传感器测量手在 X、Y 和 Z 轴上的线性运动,并输出与这些轴上的运动相对应的不同 X、Y 和 Z 值。

然后,来自传感器的所有数据都由Arduino Nano处理,它涉及所有传感器输出的IF/ELSE和OR逻辑组合,以便将结果输出与有关字母表的不同符号的预存储值相匹配。为此,根据从重复测量中获得的测量数据,为每个字母表和单手可以识别的单词设置适当的范围。HC-05蓝牙模块连接到Arduino NANO。然后,处理后的数据以字符串格式传输到蓝牙模块(发射器)。Android 手机还具有内置蓝牙功能。然后将这两个蓝牙设备配对,并将字符串传输到 Android 应用程序。

Android 应用程序通过蓝牙以字节格式接收数据,然后将它们转换为字符串。最后,使用 Android mobile 的文本转语音应用程序将字符串转换为语音。整个系统安装在普通手套上,便于操作并准确识别手势。

图 1,硬件案例图

图 2,软件案例图

图 3,传感器手套操作流程图

图 4,Android 应用操作流程图

该系统设计背后的主要原理是阻力的变化、重力加速度和实时系统。

电阻与柔性传感器的工作方式有关。柔性传感器弯曲得越多,阻力就越大。印在传感器上的导电墨水充当电阻器。当传感器是直的时,这个电阻约为25k。当传感器弯曲时,导电层被拉伸,导致横截面减小。这种减小的横截面导致电阻增加。在90°角下,该电阻约为100KΩ。

当传感器再次拉直时,电阻恢复到其原始值。可以通过测量电阻来确定传感器的弯曲程度。读取柔性传感器的最简单方法是将其与固定值电阻器(通常为 10 或 47 kΩ)连接以创建分压器,如图 5 所示。然后,将固定值下拉电阻和柔性传感器之间的点连接到Arduino的ADC输入。这样,就可以创建一个可变电压输出,该输出可以由Arduino的ADC输入读取。

图5 分压器

弯曲传感模块

在手套上,5 个不同的手指安装了 5 个柔性传感器。柔性传感器根据手指的弯曲量改变阻力。柔性传感器的引脚 1 连接到 Arduino Nano 上的 3.3v,然后,引脚 2 连接到一个 10k 欧姆电阻器,该电阻器充当分压器。下拉电阻器和柔性传感器之间的点连接到Arduino上的模拟引脚。图 6 显示了弯曲传感模块。

图 6、弯曲传感模块

位置传感模块

该系统中的加速度计(ADXL 335)用作倾斜检测器。它具有从 1.5 伏到 3.5 伏不等的模拟输出。ADXL335 是一款三轴模拟加速度计集成电路 (IC),它将 X、Y 和 Z 轴加速度读取为模拟电压。通过测量重力加速度,加速度计可以计算出它相对于地球倾斜的角度。通过

感应动态加速度的量,加速度计可以了解设备移动的速度和方向。该设备的基本功能是检测手的倾斜,并根据有意义的手势将相关数据发送到接收数据并保存数据的微控制器。图 7 显示了 Arduino nano 与加速度计的接口,以产生位置传感模块。

传动模块

蓝牙模块负责将输出数据发送到移动应用程序,实现文本到语音的转换,包括 HC-05 蓝牙和 Arduino 微控制器。微控制器处理所表示的短语,并将该数据发送到 HC-05 模块,以将数据发送到通过蓝牙连接到它的 android 设备。图8显示了传输模块。

图8,传输模块

注意: 我强烈建议小心焊接,因为柔性传感器引脚非常脆弱。你决定你想要的布局,因为我的布局有点乱,我不建议任何人按照我的方式做。您可以选择是否使用性能板,只需确保所有组件都正确牢固地连接到手套即可。

我使用 Arduino Nano 的 USB 线作为电源,但您可能会决定使用电池。弄清楚如何自己使用电池,这并不是很困难。由于设备空间不足且不便,我选择不使用电池。

如果您想知道为什么我的原型只有 3 个柔性传感器,其中 3 个在焊接过程中损坏,这就是为什么我建议您在焊接时要小心。中指上的柔性传感器也损坏了,但直到我已经焊接了它,我才注意到。

理想情况下,惯性测量单元 (IMU) 在这个项目中用途更好,但由于一些烦人的因素,我无法及时获得一个。

如果您有任何其他疑问,请随时在评论部分提及。

完成焊接后,最终产品应如下所示:

图 9,原型

至于 Android 应用程序,您可以选择使用 MIT 应用程序 inventor 2 或您作为 Android 开发人员精通的任何其他工具为自己创建一个。如果您想要我创建的那个,请在评论中提及,因为您必须直接与我交谈。应用程序如下所示:

图 10,Android 应用程序

代码

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

  const int flex1 = A0;
  const int flex2 = A1;
  const int flex3 = A2;
  const int xpin = A3;                  // x-axis of the accelerometer
  const  int ypin = A4;                  // y-axis
  const int zpin = A5;                  //  z-axis (only on 3-axis models)


void setup() {
  // put your setup  code here, to run once:
 Serial.begin(9600);
 mySerial.begin(9600);
 delay(15000);
}

void  loop() {
  // put your main code here, to run repeatedly:
  int x = analogRead(xpin);
  delay(50);

  int y = analogRead(ypin);
  delay(50);

  int z =  analogRead(zpin);
  delay(50);
  int thumb;
  int pointer;
  int middle;
  int nomx;
  int nomy;
  int nomz;
  
  thumb = analogRead(flex1);
  pointer = analogRead(flex2);
  middle = analogRead(flex3);
  nomx = x-265;
  nomy = y-253;
  nomz = z-323;

 
  Serial.print(thumb);
   Serial.print("\	");
  Serial.print(pointer);
   Serial.print("\	");
  Serial.print(middle);
   Serial.print("\	");
  Serial.print(nomx);
  Serial.print("\	");
  Serial.print(nomy);
  Serial.print("\	");
  Serial.print(nomz);
  Serial.print("\
");
  Serial.println("");
  delay(500);


   //group1
  if ((thumb  > 175)  && (thumb < 210) && (pointer > 210) && (pointer < 235) && (nomy > 75) &&  (nomy < 95))  {
    mySerial.print("LOOK FORWARD");
    }
    else if  ((thumb > 175)  && (thumb < 200) && (pointer > 210) && (pointer < 235) && (nomy  > 160) && (nomy < 175))  {
    mySerial.print("LOOK DOWN");
    }
    else  if ((thumb > 175)  && (thumb < 200) && (pointer > 210) && (pointer < 230)&& (nomy  > 20) && (nomy < 35))  {
    mySerial.print("LOOK UP");
    }

  //group2
   else if ((thumb > 160)  && (thumb < 195) &&(pointer > 160) && (pointer < 200)  && (nomy > 28) && (nomy < 43))  {
    mySerial.print("OKAY");
  }
  else  if ((thumb > 190)  && (thumb < 210) && (pointer > 180) && (pointer < 200) && (nomy  > 160) && (nomy < 180))  {
    mySerial.print("HOLD");
    }
    else  if ((thumb > 160)  && (thumb < 200) &&(pointer > 160) && (pointer < 190) && (nomy  > 60) && (nomy < 75))  {
    mySerial.print("PRONTO");
  }

   //group3
    else if ((thumb > 230)  && (thumb < 250) && (pointer > 150) && (pointer < 180)  && (nomy >80) && (nomy < 100))  {
    mySerial.print("CALL ME");
    }
    else if ((thumb > 230)  && (thumb < 250) && (pointer > 150) && (pointer < 180)  && (nomy >105) && (nomy < 125))  {
    mySerial.print("THUMBS DOWN");
    }
    else if ((thumb > 230)  && (thumb < 250) && (pointer > 150) && (pointer < 189)  && (nomy >58) && (nomy < 70))  {
    mySerial.print("I LOVE YOU");
    }
    else if ((thumb > 230)  && (thumb < 250) && (pointer > 220) && (pointer < 235)  && (nomy > 80) && (nomy < 105))  {
    mySerial.print("GIVE ME");
    }
    else if ((thumb > 175)  && (thumb < 195) && (pointer > 170) && (pointer < 190)  && (nomy > 90) && (nomy < 110))  {
    mySerial.print("GIVE ME SOME");
    }     
  else{
    mySerial.print("...");
  }
  }

电路原理图

此原理图显示了组件连接方式的一般概述。它的设计带有 fritzing

电路图

该电路图是在烧焦时制作的,显示了组件如何连接在一起。 请注意,使用 LCD 是您应该做出的选择。尽管我在电路图中包含了一个 LCD,但我没有将其整合到我的最终原型中,最终只使用了我开发的 Android 应用程序。 最后,我在电路图中使用了Arduino Mega,但在最终原型中使用了Nano

Similar Posts

Leave a Reply