极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1704|回复: 0

机器人制作开源方案 | 莲花灯

[复制链接]
发表于 2023-11-24 10:23:19 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-11-24 10:23 编辑

1. 功能描述
       莲花灯是一款基于莲花形象设计的机器人,本文示例将用两种模式来实现莲花灯的亮灭功能。
       自主模式:用 光强传感器【https://www.robotway.com/h-col-137.html】 控制莲花灯的灯叶开合。暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭。
       遥控模式:采用 蓝牙串口模块【https://www.robotway.com/h-col-141.html】 控制灯叶开合。灯叶打开,灯亮;灯叶闭合,灯灭。

2. 结构说明
       莲花灯采用“探索者”结构件搭建、辅以外观设计而成,由曲柄摇杆机构和平行四连杆机构构成一个二级升降机构,通过杠杆来控制莲花灯的开合。

       莲花灯的灯叶开合主要是由膨胀机构来控制的,膨胀轮是整个结构的核心部分,这种结构的优点是可实现收缩和膨胀,从而来控制灯叶的开合。
膨胀轮

3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板
Basra主控板(兼容Arduino Uno)
扩展板
Bigfish2.1扩展板
传感器
光强传感器
通信
蓝牙串口模块
电池
7.4V锂电池

电路连接:
       ① 灯带:连在Bigfish扩展板的D9、D10接口上
       ② 舵机:连在Bigfish扩展板的D4端口上
       ③ 蓝牙串口模块:安装在Bigfish扩展坞上
       ④ 光强传感器:连在Bigfish扩展板的A0端口上

4. 功能实现
4.1自主模式

编程环境:Arduino 1.8.19
下面提供一个实现暗光情况下灯叶打开,灯亮;强光情况下灯叶闭合,灯灭的参考程序(light.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-10-25 https://www.robotway.com/

  6.   ------------------------------*/

  7. /*

  8. * Light测试例程

  9. * 2018/04/17

  10. * ————————————

  11. * 接线:

  12. *    灯带:9、10

  13. *    舵机:4

  14. *    蓝牙:Bigfish扩展坞

  15. *    光强:A0

  16. * ————————————

  17. * 功能:

  18. *    控制模式:蓝牙控制灯叶开合

  19. *    自主模式:光强传感器控制灯叶开合

  20. *   

  21. *    灯叶打开,灯亮;灯叶闭合,灯灭

  22. */

  23. #include <ServoTimer2.h>

  24. #include "light.h"

  25. ServoTimer2 myServo;

  26. int servo_port = 4;       //定义舵机引脚

  27. int sensor_port = A0;     //定义光强传感器引脚

  28. int servo_value = 1550;   //定义舵机初始值 PWM

  29. /*

  30. int open_angle = 1150;    //灯叶打开时舵机的值

  31. int close_angle = 1550;   //灯叶闭合时舵机的值

  32. */

  33. void setup() {

  34.   Serial.begin(9600);

  35.   PortInit();

  36.   myServo.write(servo_value);

  37.   delay(1000);

  38. }

  39. void loop() {

  40.   /*Bluetooth Mode*/   

  41.   if(SerialRead() == '1'){

  42.     Serial.println("Bluetooth Mode");

  43.     while(true){

  44.       switch(SerialRead()){

  45.         case '2':

  46.           Serial.println("OPEN");

  47.           ServoGo(1150);   //OPEN

  48.         break;

  49.         case '3':

  50.           Serial.println("CLOSE");

  51.           ServoGo(1550);   //CLOSE

  52.         break;

  53.         default:break;

  54.       }

  55.      

  56.       if(SerialRead() == '4') {

  57.         Serial.println("Auto Mode");

  58.         break;

  59.       }

  60.     }

  61.   }



  62.   /* Auto Mode*/

  63.   AutoMode();  

  64. }

  65. /*端口初始化*/

  66. void PortInit(){

  67.   pinMode(sensor_port, INPUT);

  68.   pinMode(servo_port, OUTPUT);

  69.   pinMode(9, OUTPUT);

  70.   pinMode(10, OUTPUT);

  71.   digitalWrite(9, LOW);

  72.   digitalWrite(10, LOW);

  73.   myServo.attach(servo_port);

  74. }

  75. /*串口控制*/

  76. char SerialRead(){

  77.   char c;

  78.   while(Serial.available()) {

  79.     c = Serial.read();  

  80.   }

  81.   return c;

  82. }

  83. /*自主模式*/

  84. void AutoMode(){

  85.   if(digitalRead(sensor_port)){   //亮光下,光强返回值1,灯叶闭合,灯光关闭

  86.     ServoGo(1550);

  87.   }

  88.   if(!digitalRead(sensor_port)){   //黑暗中,光强返回0,灯叶打开,灯光开启

  89.     ServoGo(1150);

  90.   }

  91. }

  92. /*舵机控制*/

  93. void ServoGo(int where){   //舵机控制函数,参数:目标角度

  94.   int delta = where - servo_value;    //delta < 0: OPEN ; delta > 0: CLOSE

  95.   if(delta == 0) return;

  96.   float light_value = delta < 0 ? 0 : 255;   

  97.   int diff = delta < 0 ? -1 : 1;



  98.   for(int i=0;i<abs(delta);i++){

  99.     servo_value += diff;

  100.     if(delta < 0){

  101.       light_value += 0.65;   //0.65 (255 / delta);

  102.       if(light_value > 255) light_value = 255;

  103.     }else if(delta > 0){

  104.       light_value -= 0.65;

  105.       if(light_value < 0) light_value = 0;

  106.     }

  107.    

  108.     LightState(&light_value);  

  109.     myServo.write(servo_value);

  110.     delay(10);  

  111.   }

  112. }

  113. /*灯光控制*/

  114. void LightState(float * value){

  115.   analogWrite(9, *value);

  116.   analogWrite(10, 0);

  117. }


复制代码

4.2遥控模式
APP设置:将文末资料中的“BLE_SPP_PRO.apk”安装到手机中。
① 搜索蓝牙

② 连接蓝牙

③ 模式选择

④ 按键设置

⑤ 各按键发送值

5. 资料清单
资料内容:
①程序源代码
②样机3D文件
资料下载链接:莲花灯-概述 https://www.robotway.com/h-col-287.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 22:33 , Processed in 0.038863 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表