【主旨】
爱心工具
【设计背景】日常生活中,常常会遇到一些囧境:如弹钢琴时需要翻乐谱很麻烦;一些残疾人没有双手,无法自己翻书。这时候,我们就想能不能做一款自动翻书的装置。我们通过大量实验,并利用当下先进的单片机技术,在简化翻书机机械结构的同时优化了用户指令的获取方式,提高了用户的使用体验,实现了低成本、高性价比等目标。
【功能简介】本项目设计了一款声控自动翻书装置。该装置由声音传感器模块、涡轮风扇模块、翻页舵机模块、和固定页面等模块构成。通过声音传感器识别语音判断是否需要翻页以及翻页方向,由涡轮风扇吸起纸张,然后通过舵机翻页。最后风扇和翻书舵机回归原位,再由压书舵机压住书本防止风吹书翻页。本设计采用简洁高效的机械结构以及负压吸附原理来实现翻书动作,克服了传统翻书机结构复杂、翻书动作繁琐的缺点。经测试,翻书机能够较好地实现翻书功能,指令识别准确率高、翻书成功率高,具有较好的应用前景。
【设计原理】本翻书机的最大功能是通过声控翻书。人们在翻书时,动作主要是将书页从一端翻到另一端。这一过程可简化为两个部分:捏住纸张和移动纸张。本机利用风机和翻书杆来实现这两个过程。 为了实现捏住纸张这一功能,本设计利用负压吸附原理,通过驱动风机制造负压从而使纸张自动吸附在风机上。将风机置于纸张一定高度之上,启动风机,风机产生气流。根据伯努利定理,气压差使得纸张主动吸附到风机上。同时,为了避免风机扇叶对纸张造成损伤,风机下端使用纱网将其隔开。负压吸附纸张抬起后,翻书杆横向摆动,使得被吸附的纸张翻页;然后,减速电机启动,抬高涡轮风扇防止风扇阻挡视线;最后,由压书舵机向下启动压住书脚,防止书本胡乱翻页,保证读者阅读体验。下图是所示是硬件整体的结构图:
1.涡轮风扇
涡轮风扇,又称离心式风扇。涡轮风扇的风向是垂直方向的,小型的涡轮风扇产生的风压大小刚好可以满足我们吸取一张书页重量,同时不会把纸张弄破。而且,涡轮风扇转动时的噪音也会很小,不会对读者造成影响。风扇的开启和关闭我们这里使用了L298电机驱动模块控制。Aduino控制板的A3、A4口连接到L298上控制风扇,开启和关闭都很简单。下图为涡轮风扇:
2.风扇摇头控制舵机
在本项目设计的翻书装置中需要一个风扇作为吸附纸张起来的工具,设计要达到能完成前后翻书的要求。风扇要能够左右移动,于是我们想到可以使用舵机转向特性来带动风扇的转向,控制好风扇转向的弧度半径也能实现风扇左右平移,同时在翻书动作结束之后还可以让风扇转到书以外的上方避免影响到读者。如下图所示:
为了能让风扇移动的距离尽量大,需要做一个横杆将风扇伸出较远的地方,但是横杆伸出越远就就在横向上产生越大的阻力,经过试验我们发现18cm的横向距离就能满足我们的要求。但此时横线阻力已经比较大了,所以转向电机我们要选择大扭力的。这里我们使用型号为 LDX-335MG数字舵机。该款电机为180°转向,具有防烧、耐高温等特性,专用于机器人领域上。如下图为我们安装好的金属舵机转向结构图:
舵机和风扇会被升降平台提升和放下。这款舵机的响应速度很快,在急动和急停情况下,会产生严重的抖动,所以在控制舵机转向过程中我们设计了一个能让舵机平缓转动的语句:
3.起降电机
为了让风扇吸附到纸张,同时把纸张提起来,我们需要将风扇和纸张同时提起。升降结构上我们使用直流减速电机带动丝杆,通过丝杆的位移功能将风扇和纸张一同抬起。在开始设计过程中我们还需注意到风扇是和大扭力的舵机连接的,由于升降平带的减速电机和丝杆都是金属,整体重量会比较大,如果我们将升降升降平台做到转向舵机上,必然会对舵机产生更大的压力。所以我们决定将升降平台做到最下面,而转向舵机和风扇作为一个整体将被升降平台同时抬起和放下,在限位杆上我们加入了限位开关用来定位直流减速电机的初始位置。如下图所示:
4.翻书舵机
在最初的讨论中我们设想的是利用风扇可以位移直接把吸附着的纸张直接连同风扇一起移动到书的另一半。但是我们在实验过程中发现,风扇带动纸张转动时候经常容易掉下,造成翻页失败率过高。原因是风扇风力不是特别强,于是我们换成风力较大的风扇,翻页的成功率也有很大的提高,但新的缺点就是大风扇带来的噪音很大,体验非常糟糕。后来我们又讨论出可以用一个专门的舵机来把已经吸附起来的纸张拨动到另一面,利用前文提到的转动风扇达到移动风扇的原理实现这一要求。因为只是拨动一页纸,所需要的力气非常小,所以这里我们选用了体积小巧的9g舵机。这款舵机价格便宜、体积很小、工作电流也比较小,需要的电压只有5V,可以直接由Adrduino上的5V输出给它供电。如下图所示:
5.压书舵机
为了防止在阅读过程中,避免书被风吹或者其他因素导致书本被动翻动,我们还在左上方和右上方设置了两个舵机。这两个舵机在每次翻书动作介绍后自动将书本压着 以防止移动。如下图所示:
#include <Servo.h>
Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;
void setup() {
servo_1.attach(2);
int b = servo_1.read();
if(b<=60){
for(int i = b;i<=60;i++ )
{
servo_1.write(i);
delay(40);
}
}
if(b>60){
for(int i = b;i>=60;i-- )
{
servo_1.write(i);
delay(40);
}
}
Serial.begin(9600);
// put your setup code here, to run once:
servo_2.attach(3);
servo_3.attach(5);
servo_4.attach(4);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
servo_2.write(1);
servo_3.write(179);
servo_4.write(140);
int a = servo_1.read();
while(digitalRead(A0)==1)
{
digitalWrite(A1,LOW);
digitalWrite(A2,HIGH);
}
digitalWrite(A1,HIGH);
digitalWrite(A2,LOW);
delay(10000);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
for(int i = a;i>=10;i-- )
{
servo_1.write(i);
delay(40);
}
delay(5000);
}
void loop() {
fangshu();
while(1){
youfanshu();
zuofanshu();
}
}
void fangshu()
{
int a = servo_1.read();
for(int i = a;i<=60;i++ )
{
Serial.println(2222);
servo_1.write(i);
delay(40);
}
delay(500);
servo_3.write(35);
servo_4.write(10);
delay(500);
int b = servo_1.read();
for(int i = b;i>=10;i-- )
{
Serial.println(3333);
servo_1.write(i);
delay(40);
}
delay(5000);
}
void youfanshu(){
digitalWrite(A1,HIGH);//上升1秒钟
digitalWrite(A2,LOW);
delay(1000);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
int b = servo_1.read();//风扇舵机从0板正
for(int i = b;i<=50;i++ )
{
servo_1.write(i);
delay(40);
}
int a =servo_2.read();//板正后搬书舵机转过去
for(int i = a;i<=179;i++ )
{
servo_2.write(i);
delay(10);
}
servo_3.write(179);//压书舵机抬高
servo_4.write(140);
delay(500);
for(int i = 50;i>=20;i-- )//风扇舵机摆到右脚
{
servo_1.write(i);
delay(40);
}
delay(500);
digitalWrite(A1,LOW);//风扇电机下降
digitalWrite(A2,HIGH);
delay(10000);
digitalWrite(A3,LOW);//风扇开启
digitalWrite(A4,HIGH);
digitalWrite(A1,HIGH);//上升
digitalWrite(A2,LOW);
delay(12000);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
delay(50);
for(int i = 179;i>=0;i-- )
{
servo_2.write(i);
delay(10);
}
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
for(int i = 20;i<=50;i++ )//风扇舵机摆到右脚
{
servo_1.write(i);
delay(40);
}
servo_3.write(35);
servo_4.write(10);
for(int i = 50;i>=10;i-- )
{
servo_1.write(i);
delay(40);
}
delay(5000);
}
void zuofanshu(){
digitalWrite(A1,HIGH);//上升1秒钟
digitalWrite(A2,LOW);
delay(1000);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
int b = servo_1.read();//风扇舵机从0板正
for(int i = b;i<=50;i++ )
{
servo_1.write(i);
delay(40);
}
servo_3.write(179);//压书舵机抬高
servo_4.write(140);
delay(500);
for(int i = 50;i<=110;i++ )//风扇舵机摆到右脚
{
servo_1.write(i);
delay(40);
}
delay(500);
digitalWrite(A1,LOW);//风扇电机下降
digitalWrite(A2,HIGH);
delay(10000);
digitalWrite(A3,LOW);//风扇开启
digitalWrite(A4,HIGH);
digitalWrite(A1,HIGH);//上升
digitalWrite(A2,LOW);
delay(12000);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
delay(50);
int a =servo_2.read();//板正后搬书舵机转过去
for(int i = a;i<=179;i++ )
{
servo_2.write(i);
delay(10);
}
delay(1000);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
for(int i = 179;i>=0;i-- )
{
servo_2.write(i);
delay(10);
}
for(int i = 110;i>=50;i-- )//风扇舵机摆到右脚
{
servo_1.write(i);
delay(40);
}
servo_3.write(35);
servo_4.write(10);
for(int i = 50;i>=10;i-- )
{
servo_1.write(i);
delay(40);
}
delay(5000);
}
【总结】
经过反复测验,我们的自动翻书机工作性能良好,实现了自动翻书功能。在我们的比赛作品完成之际,我们要向我们的导师表示感谢!老师的指导伴随了我们作品的整个过程:最初,在创客课程上,老师和我们一起头脑风暴,确定了翻书机的课题;接下来,老师指导我们硬件设计,软件编程。在这个过程中,我们学到了很多很多!也让我们心中种下了创客发明的种子,只要有好的想法和创意,就一定要努力去实现!