Other projects

iBailys Robot designed by Bailys Beads Maker Space in ShenZhen

1 1012
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人体红外传感器模块X4
3d打印件舵机插件
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代码:
  1. #include <Servo.h>   //调用舵机的函数库
  2. #define LED 7   // light
  3. #define KEY 12  // key press

  4. int KEY_NUM = 0;                        //按键键值存放变量,不等于1说明有按键按下

  5. #define p1 2    //红外传感器的引脚2,3,4,5脚
  6. #define p2 3
  7. #define p3 4
  8. #define p4 5

  9. #define PWM_pin 6    //舵机的信号引脚
  10. int pulsewidth = 0;      //定义变量,舵机的脉冲宽度的
  11. Servo myservo;          //定义一个舵机伺服电机对象

  12. #define  Pin0 8     //定义四个步进电机的相位引脚,8,9,10,11
  13. #define  Pin1 9
  14. #define  Pin2 10
  15. #define  Pin3 11
  16. int _step = 0;      //步数
  17. boolean dir;         //布尔变量,确定步进电机是正转还是反转
  18. int stepperSpeed = 5;     //电机转速,5ms一步
  19. int iCurrentAngle = 45;
  20. int iDebugAngle = 45;
  21. int iDeltaSpeed = 1; // speed per 1 frequence
  22. int s1=0,s2=0,s3=0,s4=0;    //定义4个存储红外传感器数值的量
  23. void setup()
  24. {
  25. pinMode(p1,INPUT);      //初始化红外传感器的端口
  26. pinMode(p2,INPUT);
  27. pinMode(p3,INPUT);
  28. pinMode(p4,INPUT);
  29. myservo.attach(6);     //6号引脚输出舵机电机控制信号
  30. Serial.begin(9600);   

  31. pinMode(Pin0, OUTPUT);   //初始化步进电机的端口
  32. pinMode(Pin1, OUTPUT);
  33. pinMode(Pin2, OUTPUT);
  34. pinMode(Pin3, OUTPUT);

  35. myservo.write(iCurrentAngle);

  36.           pinMode(LED,OUTPUT);                                        //定义LED为输出引脚
  37.           pinMode(KEY,INPUT_PULLUP);                //定义KEY为带上拉输入引脚
  38.           digitalWrite(LED,HIGH);
  39. }

  40. void judgeDir()
  41. {
  42. int i=0;         
  43. s1=digitalRead(p1);   // up数字读红外传感器的数值
  44. s2=digitalRead(p2);  //   down
  45. s3=digitalRead(p3);  // left
  46. s4=digitalRead(p4);  // down

  47. //pulse(90);        //初始化舵机的角度90°

  48. if(s1 == HIGH && s2 == LOW)
  49. {
  50.    // turn down
  51.    if(iCurrentAngle <70)
  52.    {
  53.                     iDebugAngle = iCurrentAngle;
  54.                 iCurrentAngle += iDeltaSpeed;
  55.                 myservo.write(iCurrentAngle);
  56.                 delay(15);
  57.         }               
  58. }
  59. else if(s1 == LOW && s2 == HIGH)
  60. {
  61.         // turn up
  62.         if(iCurrentAngle > 25)
  63.         {
  64.         iDebugAngle = iCurrentAngle;
  65.                 iCurrentAngle -= iDeltaSpeed;
  66.                 myservo.write(iCurrentAngle);
  67.                 delay(15);
  68.         }               
  69. }
  70. else
  71. {
  72.     // do nothing
  73. }

  74. if(s3 == HIGH && s4 == LOW)
  75. {
  76.    // turn right
  77.    for(int i = 0; i<20; ++i)
  78.     {
  79.               stepper( false);      
  80.     }
  81. }
  82. else  if(s3 == LOW && s4 == HIGH)
  83. {
  84.         // turn left
  85.          for(int i = 0; i<20; ++i)
  86.     {
  87.               stepper( true);
  88.     }
  89. }
  90. else
  91. {
  92.     // do nothing
  93. }
  94. Serial.print(iDebugAngle);
  95. Serial.print("  ; ");
  96. Serial.print(s1);
  97. Serial.print("  ; ");
  98. Serial.print(s2);
  99. Serial.print("  ; ");
  100. Serial.print(s3);
  101. Serial.print("  ; ");
  102. Serial.print(s4);
  103. Serial.println(" ----------------------------");

  104. //////////////////////////////////////////

  105. //delay(150);
  106. }
  107. void loop()
  108. {
  109.   //stepper( true);
  110.         judgeDir();
  111.     ScanKey();
  112. /*
  113. int i=0;         
  114. s1=digitalRead(p1);   // up数字读红外传感器的数值
  115. s2=digitalRead(p2);  //   down
  116. s3=digitalRead(p3);  // left
  117. s4=digitalRead(p4);  // r ightmmmmmmmmmmmmmmm,,,

  118. //pulse(90);        //初始化舵机的角度90°

  119.          if(HIGH==s1)           //判断第一个红外传感器是否是1,
  120. {
  121.                   for(i=90;i>0;i--)     //i从90变到0
  122.                   {
  123.                           myservo.write(i);       //舵机转到i角度
  124.                           delay(15);
  125.                           if(LOW==s1)
  126. {
  127. break;
  128. }    //如果s1是低电平,就跳出循环
  129.           }
  130. }

  131. if(HIGH==s2)
  132. {
  133.   for(i=90;i<180;i++)
  134.   {
  135.     myservo.write(i);
  136.                   delay(15);
  137.                   if(LOW==s2)
  138. {
  139. break;
  140. }
  141.   }
  142. }


  143. if(HIGH==s3)      //判断第三红外传感器是否高电平
  144. {
  145.          dir=true;       //是的话就赋dir为真,即步进电机反转
  146. stepper(dir);  //将dir传递到stepper函数,stepper为让步进电机转动函数
  147. }
  148. if(HIGH==s4)
  149. {
  150.          dir=false;
  151. stepper( dir);
  152. }
  153. */ //注释掉

  154. //*******************************舵机的初始化函数
  155. void pulse(int angle)                        //设置舵机角度为angle
  156. {
  157.         pulsewidth=int ((angle*11)+500);        //计算高电平时间
  158.         digitalWrite(PWM_pin,HIGH);                                //设置高电平
  159.         delayMicroseconds(pulsewidth);                //延时pulsewidth (us)
  160.         digitalWrite(PWM_pin,LOW);                                //设置低电平
  161.         delay(20-pulsewidth/1000);                                //延时20-pulsewidth/1000 (ms)
  162. }
  163. //************************************步进电机转动函数
  164. void stepper(boolean dir)
  165. {
  166. switch(_step){
  167.     case 0:
  168.       digitalWrite(Pin0, LOW);
  169.       digitalWrite(Pin1, LOW);
  170.       digitalWrite(Pin2, LOW);
  171.       digitalWrite(Pin3, HIGH);
  172.     break;
  173.     case 1:
  174.       digitalWrite(Pin0, LOW);
  175.       digitalWrite(Pin1, LOW);
  176.       digitalWrite(Pin2, HIGH);
  177.       digitalWrite(Pin3, HIGH);
  178.     break;
  179.     case 2:
  180.       digitalWrite(Pin0, LOW);
  181.       digitalWrite(Pin1, LOW);
  182.       digitalWrite(Pin2, HIGH);
  183.       digitalWrite(Pin3, LOW);
  184.     break;
  185.     case 3:
  186.       digitalWrite(Pin0, LOW);
  187.       digitalWrite(Pin1, HIGH);
  188.       digitalWrite(Pin2, HIGH);
  189.       digitalWrite(Pin3, LOW);
  190.     break;
  191.     case 4:
  192.       digitalWrite(Pin0, LOW);
  193.       digitalWrite(Pin1, HIGH);
  194.       digitalWrite(Pin2, LOW);
  195.       digitalWrite(Pin3, LOW);
  196.     break;
  197.     case 5:
  198.       digitalWrite(Pin0, HIGH);
  199.       digitalWrite(Pin1, HIGH);
  200.       digitalWrite(Pin2, LOW);
  201.       digitalWrite(Pin3, LOW);
  202.     break;
  203.       case 6:
  204.       digitalWrite(Pin0, HIGH);
  205.       digitalWrite(Pin1, LOW);
  206.       digitalWrite(Pin2, LOW);
  207.       digitalWrite(Pin3, LOW);
  208.     break;
  209.     case 7:
  210.       digitalWrite(Pin0, HIGH);
  211.       digitalWrite(Pin1, LOW);
  212.       digitalWrite(Pin2, LOW);
  213.       digitalWrite(Pin3, HIGH);
  214.     break;
  215.     default:
  216.       digitalWrite(Pin0, LOW);
  217.       digitalWrite(Pin1, LOW);
  218.       digitalWrite(Pin2, LOW);
  219.       digitalWrite(Pin3, LOW);
  220.     break;
  221.   }
  222.   if(dir){
  223.     _step++;
  224.   }else{
  225.     _step--;
  226.   }
  227.   if(_step>7){
  228.     _step=0;
  229.   }
  230.   if(_step<0){
  231.     _step=7;
  232.   }
  233.   delay(stepperSpeed);

  234. }
  235. //*******************************************************************///
  236. int iKeyState = 0;
  237. void ScanKey()                                                //按键扫描程序
  238. {
  239.   int curState = digitalRead(KEY);
  240.   Serial.println(curState);
  241.    if( curState == LOW)
  242.     {
  243.       
  244.        if(iKeyState == 1)
  245.        {
  246.          //delay(20);        
  247.          digitalWrite(LED,HIGH);                //LED的状态翻转
  248.          iKeyState =  0;
  249.        }
  250.        else
  251.        {
  252.          //delay(20);        
  253.          digitalWrite(LED,LOW);                //LED的状态翻转
  254.          iKeyState =  1;
  255.        }
  256.        delay(300);
  257.     }
  258. }   
Copy the Code


schematic diagram

schematic diagram
Arduino circuit diagram

ArduinoCircuitDiagram

ArduinoCircuitDiagram

You have to log in before you can reply Login | Sign Up

Points Rules