为视障人士提供的语音辅助轮椅

ChangeCode
转载
发布时间: 2025-06-14 15:03:33 | 阅读数 0收藏数 0评论数 0
封面
视障人士 (VIP) 的主要问题是无法正确看到事物,因此他们需要一些双标准或帮助来完成他们的任务。他们看不见。但是他们会说话,我在这里造了一辆声控轮椅。因此,有视觉障碍的人可以使用他们的声音来控制和使用轮椅。这款轮椅还具有地板检测功能。所以我们不用担心楼梯。

准备工作:

材料:

1. ESP12E 微控制器

2. DFRobot 语音识别模块

3. L293D 电机驱动器

4. 2*BO 电机

5. 2*BO 电机轮

6. 定制PCB

7. 3.7V 锂离子电池

8.1 或 2 个脚轮

9. 3.7V 转 5V 升压模块

10. 3D 印刷椅子模型底座

工具:

1. 胶枪

2. 烙铁

3. 助焊剂

4. 焊接引线

5. 切刀

6. 螺丝刀

1

所需组件

1. ESP12E 微控制器

2. DFRobot 语音识别模块

3. L293D 电机驱动器

4. 2*BO 电机

5. 2*BO 电机轮

6. 定制PCB

7. 3.7V 锂离子电池

8.1 或 2 个脚轮

9. 3.7V 转 5V 升压模块

10. 3D 印刷椅子模型底座

1. ESP12E 微控制器 - 这是一款基于 ESP8266 芯片的支持 Wi-Fi 的微控制器。它将充当项目的大脑,控制电机,接收来自语音识别模块的命令,并可能通过 Wi-Fi 连接到其他设备。

2. DFRobot 离线语音识别模块 - 该模块将允许您的项目识别和响应语音命令。它将连接到 ESP12E,ESP12E 将解释识别的命令并相应地控制电机或其他功能。

3.L293D 电机驱动器- L293D 是一款双 H 桥电机驱动器,可让您独立控制两个直流电机的速度和方向。ESP12E 向 L293D 发送控制信号以驱动电机。

4. 2 * BO 电机 - 这些是将驱动轮椅的直流电机。

5. 2 * BO 电机轮 - 这些轮子将连接到 BO 电机上,允许轮椅四处移动。

6. 定制 PCB - 定制 PCB 将被设计为整齐地集成所有组件,使组装更容易、更可靠。

7. 3.7V 锂离子电池 - 该电池将为您的整个项目供电,为 ESP12E、电机和其他组件供电。我选择锂离子电池是因为锂离子电池结构紧凑且能量密度好。

8. 1 或 2 个脚轮 - 脚轮为您的项目提供平衡和支撑,使其能够向不同方向平稳移动而不会翻倒。

9. 3.7V 转 5V 升压模块 - 由于某些组件(如电机驱动器)需要 5V 才能运行,因此该升压模块会将锂离子电池的 3.7V 升压到稳定的 5V 输出。

10. 3D 打印椅子模型底座 - 这是将所有组件固定在一起的结构或框架。它将被设计为容纳电机、车轮和电子设备,构成该项目的物理基础。

所需工具

1. 胶枪

2. 烙铁

3. 助焊剂

4. 焊接引线

5. 切刀

6. 螺丝刀

所需的应用程序/软件

1. Arduino IDE

2.立创EDA

3. 廷克卡德

2

电路图

该电路的主要组件是 ESP8266 模块,这是控制整个系统的核心微控制器。各种 GPIO (通用输入/输出) 引脚连接到不同的组件和模块。RST (Reset) 和 EN (Enable) 是用于重置和启用 ESP8266 的控制引脚。AMS1117-3.3电压调节器.将5伏特转换为3.3V,为ESP8266供电。电容器(C1、C2、C3、C4)通过过滤噪声来稳定ESP8266的电源。离线语音识别模块连接到 esp8266 的 i2c 引脚。红外接收器模块检测地板,信号引脚连接到 A0 引脚ESP8266。CH340G USB 转串口转换器:该电路将 USB 信号转换为 TTL(晶体管-晶体管逻辑)电平信号。它用于从计算机对 ESP8266 进行编程或通信。3.7V 至 5V 升压器这将 3.7V 输入(来自锂离子电池)升压至 5V。L293D 电机驱动器驱动电机。它可以通过切换极性来控制电机的方向。GPIO D6、D7、D8 和 D9 这些引脚来自 ESP8266 用于控制电机驱动器。

3

PCB 设计

在面包板上使用 nodemcu 测试和验证电路后,我决定完成 PCB 设计。所以我把电路图转换成了 PCB。我把所有组件都安排得很紧密,然后完成了 PCB 设计。设计后 PCB 看起来像这样。再次更改 PCB 设计后,我下载了用于 PCB 制造的 Gerber 文件。

4

PCB 制造

为了制造设计的 PCB,我去了 jlcpcb.com。您只需 10 美元即可获得 5 个 PCB。登录您的帐户后,单击立即订购并上传 gerber 文件,之后,我们可以选择颜色、数量、厚度等。在这里,我为我的 PCB 选择紫色。您可以选择任何颜色。然后我们可以选择运输方式并下订单

5

3D 设计

现在我需要制作轮椅模型。因此,在 tinkercad 的帮助下,我设计了一个简单的 3D 模型。

6

打印模型

我使用我的 flashforge adventurer 5m Pro 打印模型。我使用 PLA 耗材进行打印。

7

制作轮椅模型

首先,我将电机放置在轮椅模型中,然后放置主 PCB。我将语音识别模块连接到轮椅的背面。我将红外模块安装在椅子的正面,这样它就可以很容易地检测到地板。

8

准备离线语音识别模块

为此,我们需要将命令教给语音识别模块,打开电路并

使用唤醒词(默认或已学习)唤醒语音助手,然后按照提供的提示说“学习命令词”以启动学习命令短语的过程。在每次学习命令短语之前,有必要删除之前学习的命令短语。请参阅有关如何删除唤醒词和命令短语的说明。

- 提示:现在学习,安静,请根据提示学习命令字!请说出要学习的第一条命令!

- 需要学习的指令短语(以“go forward”为例):“go forward”

- 提示:学习成功,请再说一遍!

- 要学习的指令短语:“go forward”

- 提示:学习成功,请再说一遍!

- 要学习的指令短语:“go forward”

- 提示:好的,成功学会了第一个指令!请说出要学习的第二个命令!

...(继续学习)

与您必须添加 Turn left, turn right 和 stop 的方式相同。请观看此有关 Voice Recognition 模块的教程视频。

9

Arduino 编程

头文件

#include "DFRobot_DF2301Q.h"
DFRobot_DF2301Q_I2C asr;
#include <FastLED.h>
#define NUM_LEDS 2
#define DATA_PIN 0
CRGB leds[NUM_LEDS];

- DFRobot_DF2301Q.h:此库用于与语音识别模块 DFRobot DF2301Q 进行交互

- FastLED.h:此库用于控制 Neopixel (WS2812) LED。

- NUM_LEDS:连接的 LED 数量。

- DATA_PIN:连接到 Neopixel 数据的引脚 line.leds[]:一个数组,用于存储每个 LED 的颜色数据。

#define IN_1 2

#define IN_2 14

#define IN_3 13

#define IN_4 12

- IN_1、IN_2、IN_3 IN_4:这些是连接到控制机器人电机的电机驱动器输入的 GPIO 引脚。

void setup() {
Serial.begin(115200);
while (!(asr.begin())) {
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
pinMode(IN_1, OUTPUT);
pinMode(IN_2, OUTPUT);
pinMode(IN_3, OUTPUT);
pinMode(IN_4, OUTPUT);
Serial.println("Begin ok!");
asr.setVolume(10);
asr.setMuteMode(0);
asr.setWakeTime(100);
uint8_t wakeTime = 0;
wakeTime = asr.getWakeTime();
Serial.print("wakeTime = ");
Serial.println(wakeTime);
}

- Serial Communication:以 115200 的波特率启动串口通信以进行调试。

- 语音模块初始化:代码尝试初始化语音识别模块。如果失败,将打印一条消息,并等待 3 秒,然后再重试。

- LED 初始化:Neopixel LED 使用 FastLED.addLeds 函数进行初始化。

- Motor Control Pins:电机驱动器引脚设置为输出。

语音模块设置

- asr.setVolume(10): 设置音量 - asr.setMuteMode(0): 取消模块静音 - asr.setWakeTime(100): 设置语音模块的唤醒时间 - 唤醒时间被读回并打印以供确认。- 语音模块设置

asr.setVolume(10):设置音量。

asr.setMuteMode(0):取消模块静音。

asr.setWakeTime(100):设置语音模块的唤醒时间。

将读回并打印唤醒时间以供确认。

void loop() {
int flooor= analogRead(A0);
uint8_t CMDID = asr.getCMDID();
if ((CMDID == 22) && (flooor<500))
{ Serial.println("22") ;
goAhead();
}
if ((CMDID == 6) && (flooor<500))
{ Serial.println("6") ;
goRight();
}
if ((CMDID == 7) && (flooor<500))
{ Serial.println("7") ;
goLeft();
}
if ((CMDID == 8)||(flooor>1000))
{ Serial.println("8") ;
goBack();
}
delay(300);
}

模拟输入读数: flooor 是来自引脚 A0 的模拟读数,如果存在下限,则模拟值较低,反之亦然。

语音命令处理:语音识别模块侦听由 CMDID 识别的命令。

- CMDID == 22:如果满足地板条件,则向前移动。

- CMDID == 6:如果满足地板条件,则右转。

- CMDID == 7:如果满足地板条件,则向左转。

- CMDID == 8:向后移动,或者地板条件触发机器人停止或倒车。

- 语音命令处理:语音识别模块侦听由 CMDID 识别的命令。

CMDID 22:如果满足地板条件,则向前移动。

CMDID 6:如果满足地板条件,则右转。

CMDID 7:如果满足地板条件,则向左转。

CMDID 8:向后移动,或者如果地板条件触发机器人停止或倒车。

4. 移动功能

- goAhead():将机器人向前移动。电机驱动器输入设置为向前移动电机,Neopixel LED 设置为洋红色。

void goAhead(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, HIGH);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, HIGH);
leds[0] = CRGB::Magenta;
leds[1] = CRGB::Magenta;
FastLED.show();
delay(50);
}

- goRight():将机器人向右转动。电机驱动器输入设置为转动机器人,Neopixel LED 设置为绿色

void goRight(){
digitalWrite(IN_1, HIGH);
digitalWrite(IN_2, LOW);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, HIGH);
leds[0] = CRGB::Green;
leds[1] = CRGB::Green;
FastLED.show();
delay(50);
}

- goLeft():将机器人向左转动。电机驱动器输入设置为转动机器人,Neopixel LED 设置为蓝色。

void goLeft(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, HIGH);
digitalWrite(IN_3, HIGH);
digitalWrite(IN_4, LOW);
leds[0] = CRGB::Blue;
leds[1] = CRGB::Blue;
FastLED.show();
delay(50);
}

stopRobot():停止机器人。电机驱动器输入设置为停止电机,Neopixel LED 设置为重新

void stopRobot(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, LOW);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, LOW);
leds[0] = CRGB::Red;
leds[1] = CRGB::Red;
FastLED.show();
delay(50);
}
10

源代码

#include "DFRobot_DF2301Q.h"
DFRobot_DF2301Q_I2C asr;
#include <FastLED.h>
#define NUM_LEDS 2
#define DATA_PIN 0
CRGB leds[NUM_LEDS];
#define IN_1 2
#define IN_2 14
#define IN_3 13
#define IN_4 12
void setup() {
Serial.begin(115200);
while (!(asr.begin())) {
Serial.println("Communication with device failed, please check connection");
delay(3000);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
pinMode(IN_1, OUTPUT);
pinMode(IN_2, OUTPUT);
pinMode(IN_3, OUTPUT);
pinMode(IN_4, OUTPUT);
}
Serial.println("Begin ok!");
asr.setVolume(10);
asr.setMuteMode(0);
asr.setWakeTime(100);
uint8_t wakeTime = 0;
wakeTime = asr.getWakeTime();
Serial.print("wakeTime = ");
Serial.println(wakeTime);
}
void loop() {
int flooor= analogRead(A0);
uint8_t CMDID = asr.getCMDID();
if ((CMDID == 22) && (flooor<500))
{ Serial.println("22") ;
goAhead();
}
if ((CMDID == 6) && (flooor<500))
{ Serial.println("6") ;
goRight();
}
if ((CMDID == 7) && (flooor<500))
{ Serial.println("7") ;
goLeft();
}
if ((CMDID == 8)||(flooor>1000))
{ Serial.println("8") ;
goBack();
}
delay(300);
}
void goAhead(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, HIGH);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, HIGH);
leds[0] = CRGB::Magenta;
leds[1] = CRGB::Magenta;
FastLED.show();
delay(50);
}
void goBack(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, LOW);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, LOW);
leds[0] = CRGB::Cyan;
leds[1] = CRGB::Cyan;
FastLED.show();
delay(50);
}
void goRight(){
digitalWrite(IN_1, HIGH);
digitalWrite(IN_2, LOW);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, HIGH);
leds[0] = CRGB::Green;
leds[1] = CRGB::Green;
FastLED.show();
delay(50);
}
void goLeft(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, HIGH);
digitalWrite(IN_3, HIGH);
digitalWrite(IN_4, LOW);
leds[0] = CRGB::Blue;
leds[1] = CRGB::Blue;
FastLED.show();
delay(50);
}
void stopRobot(){
digitalWrite(IN_1, LOW);
digitalWrite(IN_2, LOW);
digitalWrite(IN_3, LOW);
digitalWrite(IN_4, LOW);
leds[0] = CRGB::Red;
leds[1] = CRGB::Red;
FastLED.show();
delay(50);
}


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载