Edited by SimonLong at Jan 04, 2016 02:08
iBailys 机器人 一,作品因解决这些问题而诞生: 1.身处信息时代信息多而杂 2.工作学习时间需要互联网进行工作 但一些无关信息总是弹出 3.一下要拿手机扫一下单词 一下要放下手机拿笔写字 用户体验很糟糕 4.手机屏幕太小 查询资料不方便 5.工作时键盘鼠标操作与拿笔切换不方便
二,实现功能: 1.通过电机舵机实现跟着人手移动,这样一来省却了调节的麻烦(这一点用红外实现), 二来可以给APP开发用户提供一些动作开发的硬件。 2.语音操作,用户可以通过语音实现一系列功能,比如打开app等,解决总是在不同输入 设备切换的问题。 3.内置的app 可以实现查单词、找作业答案、百度搜索的功能。
三,制作简介与流程: 1.0简介 这是创马比赛的一个作品完成的比较仓促,现场演示效果不太好。 iBailys总共由两大部分组成。 一是 Arduino 负责机械控制部分 控制灯的移动 二是 Lemaker Guitar 开发板 安装安卓系统 实现APP软件与硬件的配合 Hints:Lemaker Guitar 安卓系统时要安装 安卓官网最新V1511及以上 因为之前版本摄像头驱动有问题,无法使用!安装后摄像头要用OTG线将USB 转成安卓接口插在Lemaker Guitar 上。 1.1红外传感跟随手移动原理
当手至在一侧被红外所感应到 则步进电机移动 移动到让手进入进入红外交叉区域 两个红外传感都收到信号 此时停止
这是左右移动原理 上下移动也是如此
但是经过我们做出来实践后发现 效果很差!需要改进 问题出现在 1)红外传感交叉识别后的区域面积大!泛射严重 2)红外感应识别 4s 一个周期 刷新率低 3)在上面下面都加上红外传感模块后 几乎整个灯罩都是前方都是交叉区
改进设想: 1)通过图像识别实现跟踪移动 调节灯源位置 2)通关光线传感器 实现触碰息光 实现调节
1.2语音识别模块 语音识别进行APP打开操作 打开百度搜索一些信息 这些通过调用Turing OS的API实现 由于当时系统版本升级了 我们写的APP出现一些问题 过段时间发上来 APP的资料
1.3实现效果 iBailys可以外接一个显示器,然后再通过灯罩上的摄像头照的相片进行作业答案搜索,或使用有道词典照相搜词功能进行取词,在语言模块没完成之前这些都要通过鼠标进行操作。
语音进行交互有个问题 要将APP了得 button 都进行定义才能精确进行交互 这需要有道词典等APP开发公司组织合作完成。
材料准备: Arduino uno一个 ULN2003步进电机驱动板X1 HC-SR501人体红外传感器模块X43d打印件舵机插件 3d打印件舵机接件 3d打印件大齿轮 3d打印件小齿轮 杜邦线若干 按钮X1 9g舵机X1 28BYJ-48步进电机X1 Led灯X1 电阻500欧一个 面包板 外部5伏电源
硬件连接: ULN2003步进电机驱动板与28BYJ-48步进电机连接: 电机 驱动板 Vcc -- vcc A -- A B -- B C -- C D -- D ULN2003步进电机驱动板与arduino UNO连接: 驱动板 UNO BJ1 -- D8 BJ2 -- D9 BJ3 -- D10 BJ4 -- D11 VCC -- +5V(外部供电正5伏,UNO没有那么大的驱动电流。) Gun -- 地 红外传感器及其元件与arduino UNO的连接: 元件 UNO 红外传感器1的out -- D2 红外传感器2的out -- D3 红外传感器3的out -- D4 红外传感器4的out -- D5 9克舵机信号out -- D6 Led阴极 -- D7 (led阳极接+5) 按钮一端 -- D12 (按钮另一端接+5v) Arduino代码: - #include <Servo.h> //调用舵机的函数库
- #define LED 7 // light
- #define KEY 12 // key press
- int KEY_NUM = 0; //按键键值存放变量,不等于1说明有按键按下
- #define p1 2 //红外传感器的引脚2,3,4,5脚
- #define p2 3
- #define p3 4
- #define p4 5
- #define PWM_pin 6 //舵机的信号引脚
- int pulsewidth = 0; //定义变量,舵机的脉冲宽度的
- Servo myservo; //定义一个舵机伺服电机对象
- #define Pin0 8 //定义四个步进电机的相位引脚,8,9,10,11
- #define Pin1 9
- #define Pin2 10
- #define Pin3 11
- int _step = 0; //步数
- boolean dir; //布尔变量,确定步进电机是正转还是反转
- int stepperSpeed = 5; //电机转速,5ms一步
- int iCurrentAngle = 45;
- int iDebugAngle = 45;
- int iDeltaSpeed = 1; // speed per 1 frequence
- int s1=0,s2=0,s3=0,s4=0; //定义4个存储红外传感器数值的量
- void setup()
- {
- pinMode(p1,INPUT); //初始化红外传感器的端口
- pinMode(p2,INPUT);
- pinMode(p3,INPUT);
- pinMode(p4,INPUT);
- myservo.attach(6); //6号引脚输出舵机电机控制信号
- Serial.begin(9600);
- pinMode(Pin0, OUTPUT); //初始化步进电机的端口
- pinMode(Pin1, OUTPUT);
- pinMode(Pin2, OUTPUT);
- pinMode(Pin3, OUTPUT);
- myservo.write(iCurrentAngle);
- pinMode(LED,OUTPUT); //定义LED为输出引脚
- pinMode(KEY,INPUT_PULLUP); //定义KEY为带上拉输入引脚
- digitalWrite(LED,HIGH);
- }
- void judgeDir()
- {
- int i=0;
- s1=digitalRead(p1); // up数字读红外传感器的数值
- s2=digitalRead(p2); // down
- s3=digitalRead(p3); // left
- s4=digitalRead(p4); // down
- //pulse(90); //初始化舵机的角度90°
- if(s1 == HIGH && s2 == LOW)
- {
- // turn down
- if(iCurrentAngle <70)
- {
- iDebugAngle = iCurrentAngle;
- iCurrentAngle += iDeltaSpeed;
- myservo.write(iCurrentAngle);
- delay(15);
- }
- }
- else if(s1 == LOW && s2 == HIGH)
- {
- // turn up
- if(iCurrentAngle > 25)
- {
- iDebugAngle = iCurrentAngle;
- iCurrentAngle -= iDeltaSpeed;
- myservo.write(iCurrentAngle);
- delay(15);
- }
- }
- else
- {
- // do nothing
- }
- if(s3 == HIGH && s4 == LOW)
- {
- // turn right
- for(int i = 0; i<20; ++i)
- {
- stepper( false);
- }
- }
- else if(s3 == LOW && s4 == HIGH)
- {
- // turn left
- for(int i = 0; i<20; ++i)
- {
- stepper( true);
- }
- }
- else
- {
- // do nothing
- }
- Serial.print(iDebugAngle);
- Serial.print(" ; ");
- Serial.print(s1);
- Serial.print(" ; ");
- Serial.print(s2);
- Serial.print(" ; ");
- Serial.print(s3);
- Serial.print(" ; ");
- Serial.print(s4);
- Serial.println(" ----------------------------");
- //////////////////////////////////////////
-
- //delay(150);
- }
- void loop()
- {
- //stepper( true);
- judgeDir();
- ScanKey();
- /*
- int i=0;
- s1=digitalRead(p1); // up数字读红外传感器的数值
- s2=digitalRead(p2); // down
- s3=digitalRead(p3); // left
- s4=digitalRead(p4); // r ightmmmmmmmmmmmmmmm,,,
- //pulse(90); //初始化舵机的角度90°
- if(HIGH==s1) //判断第一个红外传感器是否是1,
- {
- for(i=90;i>0;i--) //i从90变到0
- {
- myservo.write(i); //舵机转到i角度
- delay(15);
- if(LOW==s1)
- {
- break;
- } //如果s1是低电平,就跳出循环
- }
- }
- if(HIGH==s2)
- {
- for(i=90;i<180;i++)
- {
- myservo.write(i);
- delay(15);
- if(LOW==s2)
- {
- break;
- }
- }
- }
-
- if(HIGH==s3) //判断第三红外传感器是否高电平
- {
- dir=true; //是的话就赋dir为真,即步进电机反转
- stepper(dir); //将dir传递到stepper函数,stepper为让步进电机转动函数
- }
- if(HIGH==s4)
- {
- dir=false;
- stepper( dir);
- }
- */ //注释掉
- //*******************************舵机的初始化函数
- void pulse(int angle) //设置舵机角度为angle
- {
- pulsewidth=int ((angle*11)+500); //计算高电平时间
- digitalWrite(PWM_pin,HIGH); //设置高电平
- delayMicroseconds(pulsewidth); //延时pulsewidth (us)
- digitalWrite(PWM_pin,LOW); //设置低电平
- delay(20-pulsewidth/1000); //延时20-pulsewidth/1000 (ms)
- }
- //************************************步进电机转动函数
- void stepper(boolean dir)
- {
- switch(_step){
- case 0:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, HIGH);
- break;
- case 1:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, HIGH);
- digitalWrite(Pin3, HIGH);
- break;
- case 2:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, HIGH);
- digitalWrite(Pin3, LOW);
- break;
- case 3:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, HIGH);
- digitalWrite(Pin2, HIGH);
- digitalWrite(Pin3, LOW);
- break;
- case 4:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, HIGH);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, LOW);
- break;
- case 5:
- digitalWrite(Pin0, HIGH);
- digitalWrite(Pin1, HIGH);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, LOW);
- break;
- case 6:
- digitalWrite(Pin0, HIGH);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, LOW);
- break;
- case 7:
- digitalWrite(Pin0, HIGH);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, HIGH);
- break;
- default:
- digitalWrite(Pin0, LOW);
- digitalWrite(Pin1, LOW);
- digitalWrite(Pin2, LOW);
- digitalWrite(Pin3, LOW);
- break;
- }
- if(dir){
- _step++;
- }else{
- _step--;
- }
- if(_step>7){
- _step=0;
- }
- if(_step<0){
- _step=7;
- }
- delay(stepperSpeed);
- }
- //*******************************************************************///
- int iKeyState = 0;
- void ScanKey() //按键扫描程序
- {
- int curState = digitalRead(KEY);
- Serial.println(curState);
- if( curState == LOW)
- {
-
- if(iKeyState == 1)
- {
- //delay(20);
- digitalWrite(LED,HIGH); //LED的状态翻转
- iKeyState = 0;
- }
- else
- {
- //delay(20);
- digitalWrite(LED,LOW); //LED的状态翻转
- iKeyState = 1;
- }
- delay(300);
- }
- }
Copy the Code
|