硬件和程序都烧录和上传以后,就要启动狗狗了。那先检查一下动力情况,电池有没有接好,我这里需要调试,所以要接入usb。注意一下,电池没有打开的时候,如果插了usb线,esp32板子上的拨动开关先不要打开。因为他要等电池上的船型开关打开以后再打开,以免出现usb的电从AMS1117的降压芯片中,反向传入到PCA9685上面,导致舵机抽风烧坏。
下面来看看狗狗通电以后,都干了些什么。因为灯哥的代码是了方便大家调试和了解。所以代码相对朴素一些,从程序的角度上来不方便系统阅读。我重新基于灯哥的版本改造了一个胖胖狗。在我的gitcode上面也开源了。胖胖狗代码。在这个版本上我来讲解一下简单的流程。
在原来灯哥的主要代码都在pydog.py文件中,我把这个文件拆分成了:dog_cfg.py用于保存控制变量,dog_control.py用于控制函数。数据和操作分离。config_s.py改成了dog_data.py用模块方式保存和访问数据,另外原来在pydog.py中关于wifi操作的函数和变量我也分解出来到了wifi_moudle.py里面,便于结构化讲解。
程序目录里面有几个文件,不管你是软件还是硬件,关心几个主要的文件,其他的以后再说,源代码目录里面主要是这个几个文件,micropython核心,启动之后会优先加载boot.py,这就是刚刷了系统会有个这个文件,里面其实都是注释掉的说明,因为我这没用到,直接删掉就好了。第二个文件是main.py,他就是整个程序的入口。先看看这个文件内容
# 版权所有 2025 地球仪 (ldhhp@163.com)
# 本文件基于灯哥的 Py-Apple Dog 项目进行修改。
# 原始项目地址:https://github.com/ToanTech/py-apple-quadruped-robot
# 本项目遵循 Apache 许可证 2.0 版。
# 你可以在以下地址获取许可证副本:http://www.apache.org/licenses/LICENSE-2.0
import wifi_moudle
from machine import Timer,Pin,freq
import _thread
from time import sleep_ms
#设置ESP32 8266 频率
freq(240000000)
print("胖胖狗 1.0V")
wifi_moudle.InitWifi()
if wifi_moudle.selfadd =="":
print("网络异常,终止机器狗初始化")
#湃湃狗扬声器引脚 13,其他的自己查一下
beep = Pin(13,Pin.OUT)
while True:
beep.value(1)
sleep_ms(1000)
beep.value(0)
#GPIO 25 打开舵机使能 湃湃狗专用
print("打开GPIO25舵机使能")
pin_servo_vol = Pin(25,Pin.OUT)
pin_servo_vol.value(1)
import dog_control
def webser():
exec(open('web_c.py').read())
#启动Webser 服务
print("启动web线程")
_thread.start_new_thread(webser, ())
def loop(t):
dog_control.mainloop()
sleep_ms(5000)
print("启动30ms间隔机器狗调度进程")
#30ms调度一次机器狗监控进程
t = Timer(1)
t.init(period=30,mode=Timer.PERIODIC,callback=loop)
wifi_moudle内容就是我说的移植后的wifi函数。里面我都有注释,第一个是设置ESP32的时钟频率,照着抄就是了。当然你的设备要不是这个,就记得改动。第二项我优先启动wifi,并且单独写了个配置文件,,其中STA为0,缺省是AP模式,也就是说你通过热点找狗。如果是1,ESSID就是你家wifi的名字,password是密码。狗自己访问路由器并注册IP。一般建议第二种,不然访问了狗,网络就用不了了。注意一下第二个模式最好路由器给狗设置个静态IP绑定。这样IP就不会变了。
再往下,我做了个喇叭处理,如果网络没有初始化成功,我就会卡住一直BBBB。。。的响。起码知道这个地方不对了。你是找不到狗的,或者狗找不到WiFi,就不要白等了。赶紧找问题。
再往下,有个GPIO25中断,这是湃湃狗才有的,他用25引脚产生高频信号,从而使舵机接地开始工作。菠萝狗不需要这个代码,跳过就好。
下面有个web_c.py,他是一个独立线程启动,而且是用exec方式加载,内容是独立运行的。为啥要个独立线程呢?因为他是阻塞式的访问方式。
绑定在了wifi初始化的IP上面,80端口,也就是web默认端口,记得协议必须是http://xxx,有时候浏览器给你刷成了https://xxxx,就需要手工改一下地址。后面while是个死循环,接收浏览器过来的消息,有两个html文件,cal.html,control.html。一个是用来舵机校准的页面,一个是移动控制界面,有个绿色的模拟摇杆球球。因为灯哥是刷新页面方式更新,太慢了。我重新改造了这俩,包括web_c.py.流畅多了。
最后有个timer,这个是个定时触发器,设置30毫秒调用一次。也就是整个狗是33桢的运行速度。调用dog_control中的mainloop函数。这个函数就是整个狗的中枢神经。30毫秒思考一次问题,包括检查平衡,是否需要移动等等。
当从网页上操作的时候,他其实修改的是dog_cfg部分的数据,数据变化了,狗狗的中枢神经,就会根据数据驱动舵机发生变化,比如推动绿色球球,向上部分的数据就修改了,狗狗中枢神经检测到这个值变化了,就开始迈开腿走路了。而在舵机校准界面,修改的是dog_data部分的数据,
用于初始化舵机的各项指标。当舵机安装好以后,标定的时候,会把舵机归0位,咱在把腿脚装上去,其实你会发现有时候对不准,因为齿轮角度问题,会有偏差。用力扭电机会抗拒,千万不可蛮干。只要通过网页,手动调动位置的符合就可以了。
狗狗加电以后,网页能打开就算启动成功了。第一件事就是校准腿脚,也就是标定页面。根据灯哥的视频操作就好。这个校准之后,走路的时候会摇摇晃晃,还会偏离路线,因为标定只是舵机和关节对位。平衡度并没有调整,需要不停在第一个绿球球界面修改俯仰、翻滚等参数,拖动那个横向条条就行了。直到原地踏步基本不乱走就可以了。至此狗狗的基本流程就完事了。后面在来分部份讲运动学原理吧。
另外,有些朋友很着急,一开始就想直接上各种传感器,视觉、声音,AI等等。问怎么做大,怎么实现各种定制功能。我想说的是,如果你真想学好机器狗的设计制作,就不要着急扩展需求,因为玩具陷阱会让你走很多弯路,最后都还是要回到扎扎实实的基础上来.我讲的都是一句话的东西,每一个都够一本书。后面会越来越难,基础一定要打好。久久为功,半年一年的总能入门的。多点耐心就好。