极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2688|回复: 0

开源项目分享 | 无线充电智能车

[复制链接]
发表于 2023-1-6 08:49:38 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-1-6 08:49 编辑

本文素材来源于宁夏大学
作者:白二曹、王瑞、穆琴、王童兵
指导老师:康彩


一、项目简介
1.功能介绍
(1)流程描述
        用户端浏览器访问http://127.0.0.1页面显示小车所有信息及所需数据
         →网页通过与小车的WIFI模块连接检测小车是否可以正常工作;
         →手动通过红外遥控器电源按钮启动小车或者网页端点击启动启动小车;
         →通过网页端或红外遥控对其进行速度和方向的调节;
         →到达充电桩通过小车和充电桩的协同作用反馈电量信息,网页通过电量转化为的续航里程距离下一充电桩的位置判断是否需要充电,或者用户自己进行判断并选择合适的方案(网页判断指令只提供参考价值);
         →若需要充电则发送指令小车接收指令并启动充电模式。

(2)主流程的流程图



(3)分块功能
        ① 无线充电:无线充电桩采用电磁感应式无线充电传输系统。系统由发射线圈L1和接收线圈L2组成,2个线圈组在一起构成电磁耦合感应器,发射线圈所携带的电流产生磁场,并通过线圈耦合使接收线圈产生电压,充电桩上的红外发射模块与小车上的电量检测器协同工作判断车是否需要进行无线充电。
        ② 自动控制:充电桩上有光电接触开关和红外发射模块,车沿规定路线经过无线充电桩时,充电桩上的光电接触开关被遮挡,无线发射模块开始工作;红外发射模块全程工作,与小车上的红外接收器配合用以检测小车是否到达充电区域,其与小车上的低压报警装置结合,便可判断小车在此充电区域是否停止充电(判断条件:红外模块检测到小车到达充电区及低压报警装置工作),若判断需要充电,网页发送充电指令WiFi模块接收指令后启动自动充电程序小车进行充电。
        ③ 红外遥控:红外遥控是在没有网络时用户端网页与WIFI模块不能正常通信的情况下采用红外遥控的方法对小车的行进方向与速度进行调整和实现避障功能,以及在进行无线充电时微调车体相对充电桩的位置使其达到高效充电的效果。
        ④ 网页显示:用户启动无线充电智能车后,车体上会显示智能车电量,网页端将显示所有数据(包括:电量、电压、续航里程、温度、小车线路是否正常、是否需要充电等),网页端还可以控制智能车的行进方向及速度,需要充电时,网页端也可以显示充电界面与完成充电界面。各团队成员间已将iis系统搭建成功,可实现不同电脑在同一局域网下访问该页面的功能。

2.先进性、创新性与智能性
(1)先进性:此智能车采用目前前沿的充电方式对电源进行充电,且可通过多种传感器的相互配合实现自动充电的功能。该智能车将数据监测及操作系统、报警系统、温度检测、用户体验及反馈信息服务等功能集成于网页端,可实现网页端控制及无网络状态下的手动控制,更加全面系统的对智能车进行操控。
(2)创新性与智能性:此无线充电小车采用用户端网页与WiFi模块数据连接进行远程控制与数据传输,通过数据传输反馈小车的整体性能与能量指标,通过自动检测电量数值与充电桩保持通信进行自动充电和自动调节车体使其正对充电位置以达到能量转化的最高效率,在网络失去联系的情况下可以采取红外遥控的方法对小车进行控制;网页端可以在设置IP地址相同和允许公开访问的情况下可实现多用户同时对网页进行浏览,查看小车的所有参数数据和性能指标。

二、制作过程
1. 思路来源
       从现状来看现有的有线充电有诸多弊端例如:找到充电桩后接口标准不一,充不了;公用充电桩太难占;充电桩分布不均,村民买车最吃亏;电压过高容易引发火灾和其他的人员伤亡和财产损失……因此无线充电技术的应用将填补这空白区域,无线充电技术暂时没有能够完全达到客户和商家的满意程度,但它的优势还是值得一提的,首先无线充电不限地理环境的影响,不限车辆的型号,不限用户的多少,占地小、充电便利性高、可无人值守、人工维护成本低、空间利用率更高等诸多优势,一旦无线充电技术实现成熟化,其面对的市场或将是全球的各个领域和行业都会有所涉及,无线充电技术应用于电动车等出行工具来讲,前景是非常可观的,所以我们组对于这一想法展开讨论后大家一致同意这个项目的想法,决定首先做一个基础一体化的小车模型来为后期的研发做基础。

2. 方案选择过程
对于方案选择,我们初选方案有三个:
       方案一:不使用无线充电技术,而是做一款大容量的“超级电池”,其可保障智能车行驶数百公里。经过分析及我们现有条件的限制,一致觉得此方案无法实现,故放弃此方案。
       方案二:改造现有有线充电桩的充电方式,优化路径,增大可利用空间以增加充电桩数目,采用新技术,提高有线充电桩的质量。经实地调研与后期讨论,认为此方案花费较大,并不符合市场需求,故放弃此方案。
       方案三:采用无线充电技术,做一套无线充电装置,改善电动车的充电方式及其自动控制能力以提高电动车性能。经过数次讨论与研究,我们一致认为此方案为最可行的方案。

3. 制作过程照片


三、程序源代码
1. 网页部分

2.驱动、控制部分
  1. #include<IRremote.h>//使用IRRemote函数库.

  2. #define choose 2 //1为通过串口打印码值模式

  3. #definechoose2 4 //3为通过串口打印码值模式

  4. //.......................................................................................……//

  5. ////////////////////////////电机设置////////////////////////////////

  6. #define leftA_PIN3;

  7. #define leftB_PIN4;

  8. #define leftC_PIN 5;

  9. #define leftD.PIN 6;

  10. #define rigbtA_PIN 7;

  11. #define rightB_PIN 8;

  12. #define rightC_PIN 11;

  13. #define rightD_PIN 12;

  14. void motor pinint(); //引脚初始化

  15. void forward(); //前进

  16. void back( ); //后退

  17. void turnLeftOrigin(); //原地左

  18. void turnRightOrigin(); //原地右

  19. void turnRightforword();//右前

  20. void turnLeftfonword(); //左前

  21. void turnLeftback(); //左后



  22. void setup();

  23. {

  24. Serial.begin(9600);//9600(PC端使用)

  25. motor pinint();//电机引脚初始化

  26. Irrecv.enablelRIn();//启动红外解码

  27. }

  28. void loop();

  29. {

  30. if(choose==1 && choose2==3) scan();.

  31. else if(choose==2 && choose2==4) rev();

  32. }

  33. /*电机引脚初始化*/

  34. void motor_pinint();

  35. {

  36. pinMode(leftA_PIN, OUTPUT); //设置引脚为输出引脚

  37. pinMode(leftB_PIN, OUTPUT); //设置引脚为输出引脚

  38. pinMode(leftC_PIN, OUTPUT);

  39. pinMode(leftD_PIN, OUTPUT);

  40. pinMode(rightA_PIN, OUTPUT); //设置引脚为输出引脚

  41. PinMode(rightB_PIN, OUTPUT); //设置引脚为输出引脚

  42. pinMode (rightC_PIN, OUTPUT);

  43. pinMode (rightD_PIN, OUTPUT);

  44. }

  45. /*************************************

  46. forward子函数——前进子函数

  47. 函数功能∶控制车前进

  48. **************************************/

  49. void forward();

  50. {

  51. analogWrite(leftA_PIN, 30);

  52. analogWrite(leftB_PIN, 0); //左轮前进

  53. analogWriteleftC_PIN, 30);

  54. analogWriteleftP_PIN, 0);

  55. //----------------------------------------------//

  56. analogWrite(rightA_PIN, 60);

  57. analogWrite(rightB_PIN, 0); //右轮前进

  58. analogWrite(rightC_PIN, 60);

  59. analogWrite(rightp_PIN, 0);

  60. }

  61. /*******************************

  62. back子函数——后退子函数..

  63. 函数功能∶控制车后退.

  64. *******************************/

  65. void back();

  66. {

  67. analogWrite(leftA_PIN, 0);

  68. analogWrite(leftB_PIN, 30); //左轮后退..

  69. analogWrite(leftC_PIN,0);

  70. analogWrite(leftD_PIN,30);

  71. analogWrite(rightA_PIN, 0);

  72. analogWrite(rightB_PIN, 70); //右轮后退

  73. analogWrite(rightC_PIN, 0);

  74. analogWrite(rightD_PIN, 70);

  75. }

  76. /***********************************

  77. turnLeftOrigin 子函数——原地左转子函数.

  78. 函数功能∶控制车原地左转.

  79. ***********************************/

  80. void turnLeftOrigin();

  81. {

  82. analogWrite(leftA_PIN, 0);

  83. analogWrite(leftB_PIN, 120); //左轮后退.

  84. analogWrite(leftC_PIN, 0);

  85. analogWrite(leftD_PIN, 120);

  86. analogWrite(rightA_PIN, 120);

  87. analogWrite(rightB_PIN, 0); //右轮前进

  88. analogWrite(rightC_PIN, 120);

  89. analogWrite(rigbtD_PIN, 0);

  90. }

  91. /*****************************************

  92. turnRightOrgin子函数——原地右转子函数

  93. 函数功能∶控制车原地右转..

  94. *****************************************/

  95. void turnRightOrigin();

  96. {

  97. analogWrite(leftA_PIN, 120);

  98. analogWrite(leftB_PIN, 0); //左轮前进..

  99. analogWrite(leftC_PIN, 120);

  100. analogWrite(leftD_PIN, 0);

  101. analogWrite(rightA_PIN, 0);

  102. analogWrite(rightB_PIN, 120); //右轮后退..

  103. analogWrite(rightC_PIN, 0);

  104. analogWrite(rightD_PIN, 120);

  105. }

  106. /***********************************************

  107. turnRightforword子函数——右前运动子函数

  108. 函数功能∶控制车右前

  109. void turnRightforword();

  110. {

  111. analogWrite(leftA_PIN, 200);

  112. analogWrite(leftB_PIN, 0); //左轮快前进

  113. analogWrite(leftC_PIN, 200);

  114. analogWrite(leftD_PIN, 0);

  115. analogWrite(rightA_PIN, 120);

  116. analogWrite(rightB_PIN, 0); //右轮慢前进

  117. analogWrite(rightC_PIN,120);

  118. analogWrite(rightD_PIN, 0);

  119. }

  120. /***************************************

  121. turnLeftforward子函数——左前运动子函数

  122. 函数功能∶控制车左前

  123. void turnLeftforword();

  124. {

  125. analogWrite(leftA_PIN, 120);

  126. analogWrite(leftB_PIN, 0); //左轮慢前进.

  127. analogWrite(leftC_PIN, 120);

  128. analogWrite(leftD_PIN, 0);

  129. analogWrite(rightA_PIN, 200);

  130. analogWrite(rightB_PIN, 0); //右轮快前进

  131. analogWrite(rightC_PIN, 200);

  132. analogWrite(rightD_PIN, 0);

  133. }

  134. /******************************************

  135. turnRightforword子函数——右后运动子函数

  136. 函数功能:控制车右后

  137. ******************************************/

  138. void turnRightback();

  139. {

  140. analogWrite(leftA_PIN, 0);

  141. analogWrite(leftB_PIN, 200); //左轮快后退

  142. analogWrite(leftC_PIN, 0);

  143. analogWrite(leftP_PIN, 200);

  144. analogWrite(rightA_PIN, 0);

  145. analogWrite(rightB_PIN, 120); //右轮慢后退..

  146. analogWrite(rightC_PIN, 0);

  147. analogWrite(rightD_PIN, 120);

  148. }

  149. /***********************************************

  150. turnLeftforward子函数——左后运动子函数.

  151. 函数功能∶控制车左后.

  152. ***********************************************/

  153. void turnleftback();

  154. {

  155. analogWrite(leftA_PIN, 0);

  156. analogWrite(leftB_PIN, 120); //左轮慢后退.

  157. analogWrite(leftC_PIN, 0);

  158. analogWrite(leftD_PIN, 120);

  159. analogWrite(rightA_PIN, 0);

  160. analogWrite(rightB_PIN, 200); //右轮快后退

  161. analogWrite(rightC_PIN, 0);

  162. analogWrite(rightD_PIN, 200);

  163. }

  164. /*****************************************

  165. stop子函数——停止子函数..

  166. 函数功能∶控制车停止

  167. *****************************************/

  168. void_stop();

  169. {

  170. analogWrite(leftA_PIN, 0);

  171. analogWrite(leftB_PIN, 0); //左轮静止不动

  172. analogWrite(leftC_PIN, 0);

  173. analogWrite(leftD_PIN, 0);

  174. analogWrite(rightA_PIN, 0);

  175. analogWrite(rightB PIN, 0); //右轮静止不动

  176. analogWrite(rightC_PIN, 0);

  177. analogWrite(rightD_PIN, 0);

  178. }

  179. void rev(void);

  180. {

  181. if (irrecv.decode(&results)) {   //解码成功,把数据放入results.value 变量中

  182. if ((results.value == 16718055)||(result.value == 1033561079))

  183.   {

  184. forward(); //2前进

  185. delay(3000);

  186. _stopl);

  187. }

  188. else if((results.value == 1675477))

  189. {

  190. if (irrecv2.decode(&results2)) {

  191. if(results2.value == 12345677)

  192. {

  193. _stopl);

  194. }

  195. else if((results.value ==16738455))

  196. {

  197. forward(); //0前进

  198. }

  199. else if ((results.value == 465573243) || (results.value==16730805)|| (results.value == 1228587814)||(reultsvalue == 1045675)||(results.value == 1333775926)||(results.value == 304335233)|| (results.value == 891929274)||(results.value == 93040025)

  200. {

  201. back(); //8后退

  202. delay(500);

  203. _stop();

  204. }

  205. else if (resuls.value == 16724175)||(results.value == 2534850111)||(results.value == 814588342)|| (results.value == 2534850111)||(results.value == 16724175))

  206. {

  207. turnLeftforward();//1左前

  208. delay(500);

  209. _stopl);

  210. }

  211. else if((results.value == 16743045)||(ceault5.xaluge==1635910171))

  212. {

  213. turnRightforward(); //3右前

  214. delay(500);

  215. _stop();

  216. }

  217. else if ((results .value == 1209942246) || (results.value == 851901943) || (results.value ==   16728765) || (results.value == 2364611682) || (results.value==3833948210) || (results.value == 1253111733) || (results.value==2268352677))

  218. {

  219. turnleftback();   //7左后

  220. delay(500);

  221. _stop();

  222.       }

  223. else if ((results.value == 16732845) || (results.value == 1623741183) || (results.value ==

  224. 1053031451) || (results.value == 3680188601) || (results.value == 2405230358) || (results.value == 3337729400))

  225. {

  226. turnRightback();   //9右后

  227. delay(500);

  228. _stop();

  229. }

  230. else if ((results.value == 2351064443) ||   (results.value == 16716015) || (results.value == 3640844469) ||(results.value == 3606423579))

  231. {

  232. turnLeftOrigin(); //4原地左转

  233. delay(250);

  234. _stop();

  235. }

  236. else if((results.value == 16734885) || (results.value == 71952287) || (results.value == 16716015) || (results.value == 2351064443))

  237. {

  238. turnRistougin(); //6原地右转

  239. delay(250);

  240. _stop();

  241. }

  242. else if (results.value == 1217346747) || (results.value == 16726215) || (results.value == 2740225102))

  243.       {

  244. _stop(); //5停止

  245. }

  246. irrecv.resume(); //继续等待接收下一组信号

  247. } if(results.value ==0x16)

  248. delay(600);//延时600毫秒,做一个简单的消抖

  249. }

  250. }

  251. }

  252. void scan(void){

  253. if(irrecv.decode(&results)){   //解码成功,把数据放入results变量中.

  254. Serial.print("irCode:");   //把数据输入到串口

  255. Serial print(results.value, DEC); //显示红外编码,

  256. Serial.print(", bits: ");

  257. Serial.print(results.bits); //显示红外编码位数..

  258. Irrecv.resume(); //继续等待接收下一组信号.,

  259. }

  260. if(results.value==0x16){

  261. digitalWriter9, HIGH);

  262. Delay(600); //延时600毫秒,做一个简单的消抖.

  263. }

  264. }

  265. void scan1(void){

  266. if(irrecv2.decode(&results)){   //解码成功,把数据放入results变量中

  267. //把数据输入到串口

  268. Serial.print(“irCode2:");

  269. Serial.print(results2.value, DEC); //显示红外编码.

  270. SeriaLprint(", bits: ");

  271. Serial.println(results2.bits); //显示红外编码位数

  272. Serial.print(results2.value, DEC); //显示红外编码

  273. Serial print(", bits: ");

  274. Serial.println(results2.bits);//显示红外编码位数.

  275. irrecv2.resume(); //继续等待接收下一组信号.

  276. }

  277. }
复制代码


想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 04:29 , Processed in 0.039425 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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