回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【创意】舞龙灯 中等

头像 HonestQiao 2024.03.05 229 2

引言

 

每年春节的时候,作为湖北地区的传统风俗,舞龙灯走村串巷,锣鼓喧天、焰火闪耀,好不热闹。
今年是龍年,龍年春节,龙灯贺喜,所以我使用ESP32制作一个智能舞龙灯,祝大家龍年大吉大利!

项目介绍

 

今年是龍年,龍年春节,来一条能够自动摇头摆尾舞动的龙灯,一定是最合适的。
这个项目就是使用ESP32来控制2个舵机,实现龙灯的自动摇头和摆尾,为春节增添一份祥和喜乐的气氛。

制作材料

 

要完成这个智能龙灯,需要的材料如下:

材料清单

  • FireBeetle 2 ESP32-E IoT 开发板 X1 链接
  • FireBeetle 2:Gravity IO扩展板 X1 链接
  • DMS-MG90 金属9g舵机 X2 链接
  • 手工龙灯 X1
  • 筷子 X2
  • 桐木板 X1

46741709661592_.pic.jpg

 

46591709660364_.pic.jpg

 

46611709660367_.pic.jpg

 

46671709660375_.pic.jpg

制作过程

步骤1 在舵机上安装筷子

将两根筷子的一头,适当的位置用美工刀切割凹槽(与螺丝吻合),以便安装在舵机的支架上:

46601709660366_.pic.jpg

 

实际安装后如下:

46681709660379_.pic.jpg

步骤2 测试舵机控制

筷子安装完毕后,首先进行舵机角度控制,测试180度控制,以及指定角度的控制。

步骤3 底座制作和测试

首先,使用桐木板制作一个底座:

46691709660381_.pic.jpg

 

然后将舵机安装到底座上:

iShot_2024-03-06_02.07.44.png

 

然后进行测试:

步骤4 安装底座和舵机到龙灯内部

将底座,安装到龙灯支柱上:

46621709660369_.pic.jpg

 

并使用胶枪进行固定:

46631709660370_.pic.jpg

 

最终安装后的成品如下:

46651709660372_.pic.jpg

 

我将其放置到了一个手机架上,以便进行调试。

步骤5 功能调试和测试

安装完成后,先控制舵机小角度运行,以免撑坏了龙灯。

然后再逐步进行调整,使得头部和尾部,均能转到合适的位置即可。

 

作品演示

 

安装调试完成后,就可以实际使用了,最终的演示效果如下:

总结

 

 

1.  在实际开发的过程中,也遇到过一些问题,并一一解决:

1). 舵机同时控制的问题:

     在ESP32上,两个舵机,不能同时控制,只能一个先控制,延时一段时间之后,再控制第二个,否则可能造成第二个的控制混乱。

    我有一个MG90S是360度的,想要同时控制,结果导致其不停转圈。最后分开控制,就有问题了。

 

2.  后续优化考虑:

1). 效果更好的由头摆尾:
    头部和尾部,使用T字杆进行控制,这样子就不会有空转的时候,效果会更好

2). 声音:

    后续可以加入龙吟声音播放,效果更好。

 

3. 总结:
1). FireBeetle 2 ESP32-E结合扩展板,能够非常好的进行原型的制作,非常方便连接舵机进行控制。
2). 舵机调试需要不断修改参数进行测试,micropython非常方便进行快速开发和调试

最后,特别感谢提供这次“我为家乡打Call”,让创客活动融入到实际生活中来,既有趣又有意义!!!

代码
import machine
from machine import Pin, PWM
import time
 

D6  = machine.Pin(14)
D13 = machine.Pin(12)

'''
0.5ms	0°		1638
1ms		45°		3276
1.5ms	90°		4915
2ms		135 °	6553
2.5ms	180°	8192
'''

h0 = 50						# 频率
t0 = 0.10						# 最小时间单位
n0 = 1/h0 * 1000				# 1秒计数次数
d0 = pow(2, 16) / (n0 / t0)		# 最小周期单位
i0 = 0.5 / t0					# 0度时间单位数
i1 = 2.5 / t0					# 180度时间单位数

s1 = PWM(D6)
s2 = PWM(D13)

s1.freq(h0) # 50Hz,20ms
s2.freq(h0) # 50Hz,20ms

s1.duty_u16(int(d0 * 1.5/t0))
time.sleep(0.5)
s2.duty_u16(int(d0 * 1.5/t0))
time.sleep(0.5)

# 头部参数
i10 = 1.05 / t0
i11 = 2.15 / t0

# 尾部参数
i20 = 1.25 / t0
i21 = 2.15 / t0

while True:
    if True:
        print("向左")
        for i in range(i10,i11+1):
            print("	L:", i)
            s1.duty_u16(int(d0*i))  # i * 45度
            time.sleep(0.4)
        
        print("向右")
        for i in range(i11,i10-1,-1):
            print("	R:", i)
            s1.duty_u16(int(d0*i))  # i * 45度
            time.sleep(0.4)

    if True:
        print("向左")
        for i in range(i20,i21+1):
            print("	L:", i)
            s2.duty_u16(int(d0*i))  # i * 45度
            time.sleep(0.4)

        print("向右")
        for i in range(i21,i20-1,-1):
            print("	R:", i)
            s2.duty_u16(int(d0*i))  # i * 45度
            time.sleep(0.4)
        
s1.deinit()              # turn off PWM on the pin
s2.deinit()              # turn off PWM on the pin


线路连接图

 

舞龙灯.drawio.png

评论

user-avatar
  • 罗罗罗

    罗罗罗2024.04.06

    666

    0
    • 伦**

      伦**2024.03.17

      666

      0