60元成本打造esp8266四足机器人
一、材料介绍
1.18650电池2个每个3元
我用的电池是普通18650,买的旧笔记本电池拆出来的。实际使用下来感觉四足机器人需要的电流不大,不用像我一样买18650,容量不是太小的电池都可以,而且没有必要用两节,我这是为了看起来整齐。
2.18650电池盒2个每个1元
根据你所用的电池决定,如果不用18650电池的话可以不要这个电池盒。
3. esp8266(nodemcu)10元
我使用的是比较常见的开发板,只要是esp8266都可以用,不必要追求某个型号。如果想自己画板子的话也可以用esp12那种模组。
4. pca9685舵机扩展板
淘宝上的pca9685都比较贵,这是我当时能找到的最便宜的。不知道现在还有没有卖,也可自己去找找有没有价格更低的。
5.升压板
叠加签到红包以后1.25元,我的方法是将两节18650并联后升压到5v,其实一节也可以。主要是将电池的3.7v升到5v,用来驱动舵机板。
6.3d打印
我不是很了解市面上3d打印的价格,因为我自己买了台打印机,所以这部分价格没有算进去。之前230包邮在闲鱼买的打印机,pla耗材是22块钱1千克。打印这个四足机器人总共也没用多少克材料,对我自己来说几乎没什么成本。
7. sg90舵机8个每个3.5元
舵机价格还是比较贵的,我的方法是用芭芭农场3元红包购买,这样可以3.5元买到。正常价格应该在5元左右吧。舵机必须要使用180度的,只有180度的舵机才可以固定角度,360度的舵机只能控制方向和旋转速度。
二、代码
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();const char* ssid = "WIFI名称";
const char* password = "WIFI密码"; WiFiServer server(80); //http的服务端口void setup() {pinMode(16, OUTPUT); //用于连接Wi-Fi的LED指示灯digitalWrite(16, LOW);Serial.begin(115200);pwm.begin();pwm.setPWMFreq(60); //伺服电机以60hz刷新率工作delay(1000);//连接到无线网络Serial.println();Serial.println();Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("-");}Serial.println("");Serial.println("WiFi connected");//启动服务器server.begin();Serial.println("Server started");//打印IP地址Serial.print("Use this URL to connect: ");Serial.print("http://");Serial.print(WiFi.localIP());Serial.println("/");digitalWrite(16, HIGH);
}void loop() {//检查客户端是否已连接WiFiClient client = server.available();if (!client) {return;}//等到客户端发送一些数据Serial.println("new client");while (!client.available()) {delay(1);}//阅读请求的第一行String request = client.readStringUntil('\r');Serial.println(request);client.flush();//匹配请求if (request.indexOf("/S") != -1) {sleep();}if (request.indexOf("/W") != -1) {normal();}if (request.indexOf("/F") != -1) {normal();forward();forward();forward();forward();}if (request.indexOf("/B") != -1) {normal();backward();backward();backward();backward();}if (request.indexOf("/L") != -1) {normal();left();left();}if (request.indexOf("/R") != -1) {normal();right();right();}if (request.indexOf("/H") != -1) {normal();hello();}if (request.indexOf("/C") != -1) {normal();come();}//返回响应client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");client.println(""); // do not forget this oneclient.println("<!DOCTYPE HTML>");client.println("<html>");client.println("<head>");client.println("<style>");client.println(".button{");
/*----------网页设计----------*/client.println("background-color: #4CAF50; /* GREEN */");client.println("width: 48%;");client.println("border: none;");client.println("color: white;");client.println("padding: 50px 40px;");client.println("text-align: center;");client.println("text-decoration: none;");client.println("display: inline-block;");client.println("font-size: 50px;");client.println("margin: 4px 2px;");client.println("cursor: pointer;");client.println("border-radius: 12px;");client.println("}");client.println("</style>");client.println("</head>");client.println("<body bgcolor=black>");client.println("<button class=\"button\" onclick=\"window.location.href='/F';\">前进</button>");client.println("<button class=\"button\" onclick=\"window.location.href='/B';\">后退</button>");client.println("<br></br>");client.println("<button class=\"button\" onclick=\"window.location.href='/L';\">左转</button>");client.println("<button class=\"button\" onclick=\"window.location.href='/R';\">右转</button>");client.println("<br></br>");client.println("<button class=\"button\" onclick=\"window.location.href='/S';\">睡觉</button>");client.println("<button class=\"button\" onclick=\"window.location.href='/W';\">正常</button>");client.println("<br></br>");client.println("<button class=\"button\" onclick=\"window.location.href='/H';\">你好</button>");client.println("<button class=\"button\" onclick=\"window.location.href='/C';\">来啊</button>");client.println("</body>");client.println("</html>");delay(1);Serial.println("Client disconnected");Serial.println("");
}/*----------动作函数----------*/// | 7 | | 6 |
// ----- ----- ----- -----
// | 3 | | 2 |
// ----- -----
// | 1 | | 0 |
// ----- ----- ----- -----
// | 5 | | 4 |void sleep()
{pwm.setPWM(4, 0, 280);delay(100);pwm.setPWM(5, 0, 280);delay(100);pwm.setPWM(6, 0, 280);delay(100);pwm.setPWM(7, 0, 280);delay(100);pwm.setPWM(0, 0, 510);delay(100);pwm.setPWM(1, 0, 100);delay(100);pwm.setPWM(2, 0, 100);delay(100);pwm.setPWM(3, 0, 510);
}void normal()
{pwm.setPWM(0, 0, 370);delay(100);pwm.setPWM(1, 0, 190);delay(100);pwm.setPWM(2, 0, 190);delay(100);pwm.setPWM(3, 0, 370);delay(100);pwm.setPWM(4, 0, 510);delay(100);pwm.setPWM(7, 0, 100);delay(100);pwm.setPWM(6, 0, 510);delay(100);pwm.setPWM(5, 0, 100);
}void left()
{pwm.setPWM(4, 0, 370);delay(100);pwm.setPWM(0, 0, 510);delay(100);pwm.setPWM(4, 0, 510);delay(100);pwm.setPWM(6, 0, 370);delay(100);pwm.setPWM(2, 0, 280);delay(100);pwm.setPWM(6, 0, 510);delay(100);pwm.setPWM(7, 0, 190);delay(100);pwm.setPWM(3, 0, 510);delay(100);pwm.setPWM(7, 0, 100);delay(100);pwm.setPWM(5, 0, 190);delay(100);pwm.setPWM(1, 0, 280);delay(100);pwm.setPWM(5, 0, 100);delay(100);pwm.setPWM(0, 0, 370);pwm.setPWM(2, 0, 190);pwm.setPWM(3, 0, 370);pwm.setPWM(1, 0, 190);
}void right()
{pwm.setPWM(5, 0, 190);delay(100);pwm.setPWM(1, 0, 100);delay(100);pwm.setPWM(5, 0, 100);delay(100);pwm.setPWM(7, 0, 190);delay(100);pwm.setPWM(3, 0, 280);delay(100);pwm.setPWM(7, 0, 100);delay(100);pwm.setPWM(6, 0, 370);delay(100);pwm.setPWM(2, 0, 100);delay(100);pwm.setPWM(6, 0, 510);delay(100);pwm.setPWM(4, 0, 370);delay(100);pwm.setPWM(0, 0, 190);delay(100);pwm.setPWM(4, 0, 510);delay(100);pwm.setPWM(1, 0, 190);pwm.setPWM(3, 0, 370);pwm.setPWM(2, 0, 190);pwm.setPWM(0, 0, 370);
}void forward()
{ pwm.setPWM(5, 0, 190);delay(50);pwm.setPWM(1, 0, 100);delay(50);pwm.setPWM(5, 0, 100);delay(50);pwm.setPWM(4, 0, 370);delay(50);pwm.setPWM(0, 0, 510);delay(50);pwm.setPWM(4, 0, 510);delay(50);pwm.setPWM(6, 0, 370);delay(50);pwm.setPWM(2, 0, 280);delay(50);pwm.setPWM(6, 0, 510);delay(50);pwm.setPWM(7, 0, 190);delay(50);pwm.setPWM(3, 0, 280);delay(50);pwm.setPWM(7, 0, 100);delay(50);pwm.setPWM(0, 0, 370);pwm.setPWM(1, 0, 190);pwm.setPWM(2, 0, 190);pwm.setPWM(3, 0, 370);
}void backward()
{ pwm.setPWM(7, 0, 190);delay(50);pwm.setPWM(3, 0, 510);delay(50);pwm.setPWM(7, 0, 100);delay(50);pwm.setPWM(6, 0, 370);delay(50);pwm.setPWM(2, 0, 100);delay(50);pwm.setPWM(6, 0, 510);delay(50);pwm.setPWM(5, 0, 190);delay(50);pwm.setPWM(1, 0, 280);delay(50);pwm.setPWM(5, 0, 100);delay(50);pwm.setPWM(4, 0, 370);delay(50);pwm.setPWM(0, 0, 280);delay(50);pwm.setPWM(4, 0, 510);delay(50);pwm.setPWM(3, 0, 370);pwm.setPWM(2, 0, 190);pwm.setPWM(1, 0, 190);pwm.setPWM(0, 0, 370);
}void hello()
{pwm.setPWM(0, 0, 510);delay(100);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 190);delay(500);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 190);delay(500);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 510);
}void come()
{pwm.setPWM(0, 0, 280);delay(100);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 190);delay(500);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 190);delay(500);pwm.setPWM(4, 0, 100);delay(500);pwm.setPWM(4, 0, 510);
}
三、原理介绍
1.PWM
因为使用了pca9685舵机驱动板,所以这里使用的是Adafruit_PWMServoDriver库驱动sg90舵机,原理是通过PWM来控制舵机角度,动作主要是靠PWM来写的。舵机0-180度对应的PWM数值写在表格里了,这里取的是近似值,自己进行微调也可以。
角度 | PWM数值 |
0 | 100 |
45 | 190 |
90 | 280 |
135 | 370 |
180 | 510 |
3.舵机号
图中的舵机号与代码中的舵机号是对应的,比如代码中的pwm.setPWM(4, 0, 370),就是将4号脚置于135度。
3.舵机角度
蓝色角度对应的是4、5、6、7脚,黄色对应的是0、1、2、3脚。这里的角度范围表示舵机能运动的范围以及最大角度。比如当4、6号脚为0度时向上,而5、7脚0度时向下,反之当4、6号脚为180度时向下,而5、7脚180度时向上。
4. 操作页面
操作页面有用小程序的也有用软件的,我这里使用的是网页,用esp8266作为网络服务器,按钮使用html写的。这部分的讲解可以看看b站太极创客esp8266,讲的非常详细,本文所用的代码和太极创客所讲的有很多重合。
四、组装教程
1.程序写入esp8266
打开Arduino,将代码复制进去,然后安装Adafruit_PWMServoDriver库。
将需要连接的WIFI或者热点填写进去
选择nodemcu开发板,具体设置如下。
上传esp8266以后打开串口监视器,波特率选择115200。可以看到此时最后一行显示一个网址,每个人的都会不一样,不要输入我的,输入自己的网址。
用手机浏览器或者电脑浏览器打开,就会显示出操作界面。
2.供电连接
将电池连接到升压板输入端,升压板输出端连接舵机拓展板电源,这样就把电池的3.7V升到5V。注意正负极不要接反了,升压板使用前要先旋转几十圈再用,用万用表检测升压板输出电压是否达到5V。
3.esp8266连接
esp8266通过i2c和舵机拓展板通信,使用杜邦线连接。esp8266的供电由舵机拓展板提供,不需要再额外供电。
esp8266 | 舵机拓展板 |
VIN | V+ |
3.3V | VCC |
GND | GND |
D2 | SDA |
D1 | SCL |
4.安装舵机和3d打印件
3d打印件应该跟图片中一样,安装所用的螺丝用舵机自带的就行,不用额外购买。
如下图把舵机自带的塑料件安装上去,每个腿安装两个。
用舵机自带的螺丝如下图拧上去 ,其他的也一样。一共是4个腿,用8个螺丝。
把四个舵机安装到支架上, 注意线的方向全是向外,用舵机自带的螺丝安装。一共需要8个螺丝,这里只安装4个就够了,不然螺丝会不够用。
将另外4个舵机如下图安装,注意方向不要错了。每个腿需要安装2个螺丝,这里只安装1个,不然螺丝不够用。
5.调整角度
想要正确的安装必须先调整舵机的角度,否则角度不对会伤害舵机。如下图所示,是舵机号所对应的接口。
如下图所示是0、1、2、3号舵机
先将电源、esp8266、0、1、2、3、舵机拓展板都连接上。
进入操作页面点击睡觉
等舵机动作后按照下图的摆放方式将4个腿安装上,并且用舵机自带的螺丝固定,安装过程中要保持通电,尽量按照90度直角安装,如果有倾斜也没关系,这是因为舵机齿轮精度以及安装精度不够,后期可以通过调整代码修正。
再将4、5、6、7号舵机安装上去,重复上面的操作。等待舵机动作后不要断电安装。
如下图所示安装完成,尽量保持水平, 如果有不水平的后期可以通过代码调整。
6. 整理线束
我用的是轧带,价格非常便宜,一块多就可以买500条。先用轧带把电池盒固定住。
再用轧带把机器人头顶上的线都固定住,这样看起来是不是整齐很多了。
五、总结
虽然制作的是四足机器人,但是我认为核心不在机器人上,而是esp8266作为网络服务器使用。如果有了解过b站上太极创客的esp8266讲解就会发现,我所用到的代码除了动作这一部分,很多都是太极创客里使用的例子代码。
我为什么说核心是esp8266而不是机器人的原因,代码中写的动作函数不过是几个pwm调整舵机角度再加几个延时函数,如果仔细处理确实能形成各式各样的动作,但是并没有太大的学习意义。而网络服务那部分的代码算是esp8266的精华所在了,学完太极创客的视频再制作这个四足机器人的话算是完成课后作业了,可以复习一下学过知识。或者说对这部分代码有不理解的人可以看看太极创客的视频,一方面可以了解每一条代码的作用,另一方面对于学习esp8266也非常有帮助。
对于初学者来说这个四足机器人拿去当一个课设或者低级的毕设还凑合,并不是什么高大上的东西。我之所以写出来这篇文章是因为发现网络上关于这个四足机器人的知识太少了,都是成品展示而没有教程,很多人也想了解一下,于是我写出这篇教程希望能帮到一些人。其实很多四足机器人都大同小异,都是pwm的原理,只是用到的开发板、库、函数不同。
我这里使用的是esp8266+舵机拓展板,实际上直接使用esp8266也可以,只是我为了方便加上了舵机拓展板,你甚至可以买一个esp12模组自己画板子做最小系统然后用GPIO直接输出pwm,这样集成度比较高,可以用固定在机器人上。也可以用esp8266+Arduino nano,依然是pwm控制舵机,只不过控制舵机的是Arduino。
最后分享一下3d打印文件,这个是我在T站上找的成品文件,打开以后是切片软件用的,而不是建模的模型。打开以后共5个文件,实际上需要9个零件,除了“身体”部分打印1个,其他的都要打印2个。
链接:https://pan.baidu.com/s/1tMynUvNBgorOKMaqctmovg?pwd=2a9g
提取码:2a9g
因为我经常3d打印所以用的很多模型都是在T站上找的,我会给出网站链接,有兴趣的自己去看看吧,有各种各样的机器人模型以及其他的模型,网站打开进入会比较慢。
Thingiverse - Digital Designs for Physical Objects
六、结果演示
60元成本打造esp8266四足机器人相关推荐
- 2021-09-29破解小米“铁蛋”,只需9999元,你也可以做一个四足机器人!
https://www.eet-china.com/news/202109291008.html 2021-09-29破解小米"铁蛋",只需9999元,你也可以做一个四足机器人! ...
- AI一分钟 | 浙大研发出“踢不倒”的四足机器人;富士康冲击A股上市,AI为最大卖点
一分钟AI 滴滴公布新战略,成立战略事业群和智慧交通事业部 浙江大学熊蓉教授的机器人团队发布"绝影"四足机器人,展现"快稳准"优异性能 苹果智能音箱HomePo ...
- Pepper停产之后,家庭服务机器人的未来产品形态,会是四足机器人吗
引言:7月初Pepper停产的消息,让我回忆起那个经典问题:家庭服务机器人的产品形态,应该是轮式还是双足?没想到很快就发现了一个也许"bingo"的答案:四足机器人. 目录 一.P ...
- 小米CyberDog四足机器人的AI运动系统的实现
2021年8月10日,雷军进行继宣布造车之后的第二次演讲. 在现场的展示中,小米发布了首款四足行走机器人--铁蛋,英文名CyberDog.这只"人类高质量宠物"可以行走.站立.小碎 ...
- 赤兔四足机器人的作用_跑得快,打不死!清华大学开发“小强”机器人,壮汉狂踩也挡不住前进步伐...
大数据文摘编辑部出品 提到蟑螂,很多同学都深恶痛绝. 这种身型小巧的虫子不仅跑得快.繁殖能力强,而且超级抗打抗压,在所有的环境下都能顽强地生存下去. 12mm高的蟑螂可以躲进4mm的缝隙 也难怪周星驰 ...
- 5位华人学生开发出了机器导盲犬!四足机器人技能又+1
丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天是四月的最后一个星期三,也是世界导盲犬日. 而在不久前,来自加州大学伯克利分校的研究团队,开发了一款机器人,可以用来壮大导盲犬的队伍了! ...
- 赤兔四足机器人的作用_腾讯 Robotics X 实验室四足移动机器人Jamoca首亮相,可挑战高难度梅花桩...
11月20日,腾讯公布了其在移动机器人研究方面的新进展:四足移动机器人 Jamoca 和自平衡轮式移动机器人首次对外亮相. Jamoca 是国内首个能完成走梅花桩复杂挑战的四足机器人,而自平衡轮式移动 ...
- 四足机器人|机器狗|仿生机器人|多足机器人|Adams仿真|Simulink仿真|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!
四足机器人|机器狗|仿生机器人|多足机器人|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!QQ:1096474659 基于CPG的四 ...
- MIT四足机器人MIT Cheetah的硬件框架
前几天小米的铁蛋,又让四足机器人火了一把.9999一台,这个价钱还挺香的.众所周知,国内的大部分四足机器狗的涌出,都是因为2019年,MIT的猎豹开源,从硬件到软件.国内四足机器人的研发也就上了一个台 ...
最新文章
- 几种常用编程语言的编程思想和方法 转
- 交易平台基本密钥处理流程(SJL05加密机)
- mysql 复杂统计_MYSQL复杂查询
- oracle获取下级函数,从oracle获取函数和过程签名列表
- Angular、React、Vue.js 等 6 大主流 Web 框架都有什么优缺点?
- Codeforces Round #260 (Div. 2)
- C++判断字符是字母或数字
- outlook域用户名怎么填_家谱制作软件怎么做成电子版
- (一)开始使用混合边缘AI进行面部识别
- mysql 逐行读取文件_PHP fgets()和fgetss():逐行读取文件
- python工资一般多少p-Python P值
- 实战CSS:苏宁商城静态实现
- 从JS库的使用者转变成JS的开发者——第一篇 javascript对象
- web player php,unity web player是什么软件
- java面试职业规划怎么回答,深入分析
- C++内存泄漏和内存碎片的产生及避免策略
- 视频教程-射频工程师工作指南-无线通信
- python forward函数___call__、__init__和 forward三个函数在python中的调用方法
- Zigbee(3) ---- 无线温度检测试验
- 如何设计产品的引流诱饵?如何控制引流产品的成本呢?