极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25303|回复: 6

履带精灵1.5号----程式代码(初版+A版)

[复制链接]
发表于 2017-9-30 20:14:35 | 显示全部楼层 |阅读模式
本帖最后由 wing 于 2017-10-9 14:29 编辑

昨天把硬件装好,今日趁热打铁把程式也写好了。
基本功能都正常,然而只是初版还有很大优化空间。
怕之后就没机会了,所以还是先发上来了

界面效果


页面代码
  1. <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><title>PWM</title>
  2. <style type="text/css">input.vertical { -webkit-appearance: slider-vertical; writing-mode: bt-lr; width:100px; height:400px; }</style>
  3. <script type="text/javascript">
  4. function roc(S)
  5. {
  6. var txt;
  7. var url;
  8. url ="pwm2.q?";
  9. if (S==1)
  10. {
  11.   txt = document.getElementById("r_l").value;
  12.   url =url+"l=" + escape(txt);
  13. }
  14. if (S==2)
  15. {
  16.   txt = document.getElementById("r_r").value;
  17.   url =url+"r=" + escape(txt);
  18. }
  19. var xhr = new XMLHttpRequest();
  20. xhr.open("GET", url, true);
  21. xhr.onreadystatechange = function(e){
  22. if (xhr.readyState == 4) {
  23. var rtn = xhr.responseText;
  24. if (rtn.indexOf("l")>=0)
  25. {document.getElementById("t_l").value = rtn;}
  26. if (rtn.indexOf("r")>=0)
  27. {document.getElementById("t_r").value = rtn;}
  28. }};
  29. xhr.send();}
  30. </script>
  31. </head><body><table><tbody><tr><td><input type="range" min="-1000" max="1000" value="0" class="vertical" ontouchend="roc(1)" onmouseup="roc(1)" id="r_l"></td><td><table><tbody><tr><td><label for="t_l">l:</label></td><td><input type="text" id="t_l"></td></tr><tr><td><label for="t_r">r:</label></td><td><input type="text" id="t_r"></td></tr></tbody></table></td><td><input type="range" min="-1000" max="1000" value="0" class="vertical" ontouchend="roc(2)" onmouseup="roc(2)" id="r_r"></td></tr></tbody></table></body></html>
复制代码


主控程式代码

  1. //8266 AP +ws 1.5号机 wifi ssid=ESP8266xxxxxxxx pwd=ap20170930 访问 http://192.168.128.1/pe15.html 可见网页  

  2. #include <ESP8266WiFi.h>
  3. #include <ESP8266WebServer.h>
  4. #include <FS.h>      //文件系统库SPIFFS

  5. ESP8266WebServer server ( 80 );

  6. int p_a_fx =13;   //A机方向  GPIO13 ->D12
  7. int p_a_dl =0;   //A机动力   GPIO0->D3
  8. int p_b_fx =16;   //B机方向  GPIO16->D13
  9. int p_b_dl =12;   //B机动力  GPIO12->D11

  10. void ch_page() {
  11.   if(SPIFFS.exists("/pe15.html")){  //如果文件存在
  12.     File file = SPIFFS.open("/pe15.html", "r");              //打开文件
  13.     size_t sent = server.streamFile(file, "text/html");  //发送内容
  14.     file.close();          //关闭文件
  15.     return;
  16.   }
  17.   else
  18.   {
  19.     handleNotFound(); //404
  20.   }
  21. }

  22. void pwm2_page() {

  23.   String p= "";
  24.   String sv;
  25.   int    iv;
  26.   int    ix;

  27. //server.args()  这个应该是返回参数的个数
  28.   
  29.   if (server.hasArg("r"))      //是否有r参数
  30.   {//设置A机运转状态
  31.   sv=server.arg("r");  
  32.   p="r="+sv;     //取r参数值
  33.   server.send(200, "text/plain", p);
  34.   iv=sv.toInt();
  35.   if (iv>=0){
  36.     digitalWrite(p_a_fx, 1);     //A设置方向为正向
  37.   }  
  38.   else{
  39.     digitalWrite(p_a_fx, 0);     //A设置方向为逆向
  40.     iv=iv*-1;
  41.   }
  42.   if (iv<=200)  //A机动力
  43.     {analogWrite(p_a_dl,0); }
  44.   else
  45.     {analogWrite(p_a_dl,iv); }
  46.   return;
  47.   }
  48.   if (server.hasArg("l"))
  49.   {
  50.   sv=server.arg("l");   
  51.   p="l="+sv;
  52.   server.send(200, "text/plain", p);
  53.   iv=sv.toInt();
  54.   if (iv>=0){
  55.     digitalWrite(p_b_fx, 0);     //B设置方向为逆向 A和变方向是相反的
  56.   }  
  57.   else{
  58.     digitalWrite(p_b_fx, 1);     //B设置方向为正向 A和变方向是相反的
  59.     iv=iv*-1;
  60.   }  
  61.   if (iv<=200)  //B机动力
  62.     {analogWrite(p_b_dl,0); }
  63.   else
  64.     {analogWrite(p_b_dl,iv); }
  65.   return;
  66.   }
  67. }

  68. void handleNotFound() {
  69.   String message = "File Not Found\n\n";
  70.   message += "URI: ";
  71.   message += server.uri();
  72.   message += "\nMethod: ";
  73.   message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
  74.   message += "\nArguments: ";
  75.   message += server.args();
  76.   message += "\n";

  77.   for ( uint8_t i = 0; i < server.args(); i++ ) {
  78.     message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  79.   }

  80.   server.send ( 404, "text/plain", message );  // 返回信息给浏览器(状态码,Content-type, 内容)
  81. }

  82. void setup() {
  83.   SPIFFS.begin();

  84. //启用电机A的2个管脚,全部设置为输出状态  
  85.   pinMode(p_a_fx,OUTPUT); //A机方向
  86.   digitalWrite(p_a_fx, 0);
  87.   pinMode(p_a_dl,OUTPUT); //A机动力
  88.   digitalWrite(p_a_dl, 0);
  89. //启用电机B的2个管脚,全部设置为输出状态  
  90.   pinMode(p_b_fx,OUTPUT); //B机方向
  91.   digitalWrite(p_b_fx, 0);
  92.   pinMode(p_b_dl,OUTPUT); //B机动力
  93.   digitalWrite(p_b_dl, 0);
  94.   
  95.   analogWriteRange(1023);    //PWM取值范围
  96.   
  97.   // 设置内网
  98.   IPAddress softLocal(192,168,128,1);
  99.   IPAddress softGateway(192,168,128,1);
  100.   IPAddress softSubnet(255,255,255,0);
  101.   WiFi.softAPConfig(softLocal, softGateway, softSubnet);
  102.   String apName = ("ESP8266_"+(String)ESP.getChipId());
  103.   const char *softAPName = apName.c_str();
  104.   WiFi.softAP(softAPName, "ap20170930");
  105.   IPAddress myIP = WiFi.softAPIP();


  106.   server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} );
  107.   server.on ( "/pe15.html", ch_page );
  108.   server.on ( "/pwm2.q", pwm2_page );
  109.   server.onNotFound ( handleNotFound );
  110.   server.begin();
  111. }

  112. void loop ( void ) {
  113.   server.handleClient();
  114. }
复制代码


2楼有简单说明

7楼更新程式版本A  2017-10-09

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2017-9-30 20:17:24 | 显示全部楼层
本帖最后由 wing 于 2017-9-30 20:19 编辑

这个是完整的程式文件包,有兴趣的朋友可以观摩一下

网页页面文件是独立的,使用SPIFFS文件保存 上存flash文件工具ESP8266FS-0.3.0(所在位置D:\arduino-1.6.12\tools\ESP8266FS\tool\esp8266fs.jar) 目前只在1.6.12版本中成功上存文件,Flash Size:"4M(1M SPIFFS)" ,数据文件放在工程目录下/data/...文件夹里

最后祝大家节日快乐

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2017-10-1 02:19:49 | 显示全部楼层
这个厉害,楼主那个网页怎么的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-1 20:31:14 | 显示全部楼层
努力微笑 发表于 2017-10-1 02:19
这个厉害,楼主那个网页怎么的

通过两条rang来控制左右履带的速度,样子就是楼顶那个图。
目前还在改进中...
回复 支持 反对

使用道具 举报

发表于 2017-10-3 08:43:55 | 显示全部楼层

通过两条rang来控制左右履带的速度,这个想走直线很难吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-3 13:22:56 | 显示全部楼层
本帖最后由 wing 于 2017-10-3 13:26 编辑
独行者 发表于 2017-10-3 08:43
通过两条rang来控制左右履带的速度,这个想走直线很难吧!


这个问题问得很好,这个是我一直努力的目标之一。
如果有视频就可以更好地说明问题,不过这个有点困难:你知道它需要用手机来控制的,得找另个人拍摄。
那么希望假期结束后还有人能活着回来吧

PS:我上面说“rang”其实是错误的,应该是“range”才对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-9 14:32:33 | 显示全部楼层
本帖最后由 wing 于 2017-10-9 14:36 编辑

更新控制程式 A版本

  1. //8266 AP +ws 1.5号机 wifi ssid=ESP8266xxxxxxxx pwd=ap20171008 访问 http://192.168.128.1/pe15a.html 可见网页  
  2. #include <ESP8266WiFi.h>
  3. #include <ESP8266WebServer.h>
  4. #include <FS.h>      //文件系统库SPIFFS

  5. ESP8266WebServer server ( 80 );

  6. int p_a_fx =13;   //A机方向  GPIO13 ->D12
  7. int p_a_dl =0;   //A机动力   GPIO0->D3
  8. int p_b_fx =16;   //B机方向  GPIO16->D13
  9. int p_b_dl =12;   //B机动力  GPIO12->D11

  10. void ch_page() {
  11.   if(SPIFFS.exists("/pe15a.html")){  //如果文件存在
  12.     File file = SPIFFS.open("/pe15a.html", "r");              //打开文件
  13.     size_t sent = server.streamFile(file, "text/html");  //发送内容
  14.     file.close();          //关闭文件
  15.     return;
  16.   }
  17.   else
  18.   {
  19.     handleNotFound(); //404
  20.   }
  21. }

  22. void pwm2_page() {

  23.   String p= "";
  24.   String sv;
  25.   int    iv;
  26.   int    ix;

  27. //server.args()  这个应该是返回参数的个数
  28.   
  29.   if (server.hasArg("a"))      //是否有a参数
  30.   {//设置A机运转状态
  31.   sv=server.arg("a");  
  32.   p="a="+sv;    //准备A相关的返回值
  33.   iv=sv.toInt();
  34.   if (iv>=0){
  35.     digitalWrite(p_a_fx, 1);     //A设置方向为正向
  36.   }  
  37.   else{
  38.     digitalWrite(p_a_fx, 0);     //A设置方向为逆向
  39.     iv=iv*-1;
  40.   }
  41.   if (iv<=300)  //A机动力
  42.     {analogWrite(p_a_dl,0); }
  43.   else
  44.     {analogWrite(p_a_dl,iv); }
  45.   }
  46.   if (server.hasArg("b"))   //是否有b参数
  47.   {
  48.   sv=server.arg("b");   
  49.   p=p+" b="+sv;    //准备B相关的返回值
  50.   iv=sv.toInt();
  51.   if (iv>=0){
  52.     digitalWrite(p_b_fx, 0);     //B设置方向为逆向 A和变方向是相反的
  53.   }  
  54.   else{
  55.     digitalWrite(p_b_fx, 1);     //B设置方向为正向 A和变方向是相反的
  56.     iv=iv*-1;
  57.   }  
  58.   if (iv<=300)  //B机动力
  59.     {analogWrite(p_b_dl,0); }
  60.   else
  61.     {analogWrite(p_b_dl,iv); }
  62.   }
  63.   server.send(200, "text/plain", p);  //抛出返回信息
  64. }

  65. void handleNotFound() {
  66.   String message = "File Not Found\n\n";
  67.   message += "URI: ";
  68.   message += server.uri();
  69.   message += "\nMethod: ";
  70.   message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
  71.   message += "\nArguments: ";
  72.   message += server.args();
  73.   message += "\n";

  74.   for ( uint8_t i = 0; i < server.args(); i++ ) {
  75.     message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  76.   }

  77.   server.send ( 404, "text/plain", message );  // 返回信息给浏览器(状态码,Content-type, 内容)
  78. }

  79. void setup() {
  80.   SPIFFS.begin();

  81. //启用电机A的2个管脚,全部设置为输出状态  
  82.   pinMode(p_a_fx,OUTPUT); //A机方向
  83.   digitalWrite(p_a_fx, 0);
  84.   pinMode(p_a_dl,OUTPUT); //A机动力
  85.   digitalWrite(p_a_dl, 0);
  86. //启用电机B的2个管脚,全部设置为输出状态  
  87.   pinMode(p_b_fx,OUTPUT); //B机方向
  88.   digitalWrite(p_b_fx, 0);
  89.   pinMode(p_b_dl,OUTPUT); //B机动力
  90.   digitalWrite(p_b_dl, 0);
  91.   
  92.   analogWriteRange(1023);    //PWM取值范围
  93.   
  94.   // 设置内网
  95.   IPAddress softLocal(192,168,128,1);
  96.   IPAddress softGateway(192,168,128,1);
  97.   IPAddress softSubnet(255,255,255,0);
  98.   WiFi.softAPConfig(softLocal, softGateway, softSubnet);
  99.   String apName = ("ESP8266_"+(String)ESP.getChipId());
  100.   const char *softAPName = apName.c_str();
  101.   WiFi.softAP(softAPName, "ap20171008");
  102.   IPAddress myIP = WiFi.softAPIP();


  103.   server.on ( "/inline", []() {server.send ( 200, "text/plain", "this works as well" );} );
  104.   server.on ( "/pe15a.html", ch_page );
  105.   server.on ( "/pwm15a.q", pwm2_page );
  106.   server.onNotFound ( handleNotFound );
  107.   server.begin();
  108. }

  109. void loop ( void ) {
  110.   server.handleClient();
  111. }

复制代码



控制页面也更新了

  1. <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>PE15A</title>
  2. <style type="text/css">
  3. input.vertical { -webkit-appearance: slider-vertical; writing-mode: bt-lr; width:200px; height:400px; }
  4. button.btn_stp {background-color: #4CAF50;border: none;color: white;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 24px;margin: 4px 2px;cursor: pointer;width: 350px;}
  5. </style>
  6. <script type="text/javascript">
  7. function roc(s)
  8. {
  9. var txt;
  10. var txt2;
  11. var diff;
  12. var diff_no;
  13. var url;
  14. url ="pwm15a.q?";

  15. if (s==1)
  16. {
  17.         url =url+"a=0&b=0";
  18. }
  19. else
  20. {
  21.         txt = document.getElementById("r_a").value;
  22.         txt2 = document.getElementById("r_b").value;
  23.         if (document.getElementById("cb_a").checked || document.getElementById("cb_b").checked)
  24.         {
  25.                 diff=document.getElementById("t_diff").value;
  26.                 diff_no=Number(diff);

  27.                 if (document.getElementById("cb_a").checked)
  28.                 {
  29.                         if ((txt<0 && txt2<0)||(txt>0 && txt2>0))
  30.                         {
  31.                                 txt2=txt;
  32.                         }
  33.                         else
  34.                         {
  35.                                 txt2=txt*-1;
  36.                         }
  37.                         if (txt2>0)
  38.                         {
  39.                                 txt2=txt2-(diff_no*-1);
  40.                         }
  41.                         else
  42.                         {
  43.                                 txt2=txt2-diff_no;
  44.                         }
  45.                 }
  46.                 else
  47.                 {
  48.                         if ((txt<0 && txt2<0)||(txt>0 && txt2>0))
  49.                         {
  50.                                 txt=txt2;
  51.                         }
  52.                         else
  53.                         {
  54.                                 txt=txt2*-1;       
  55.                         }       
  56.                         if (txt>0)
  57.                         {
  58.                                 txt=txt-(diff_no*-1);
  59.                         }
  60.                         else
  61.                         {
  62.                                 txt=txt-diff_no;
  63.                         }
  64.                 }
  65.         }
  66.         url =url+"a=" + escape(txt)+"&b=" + escape(txt2);
  67. }

  68. var xhr = new XMLHttpRequest();
  69. xhr.open("GET", url, true);
  70. xhr.onreadystatechange = function(e){
  71. if (xhr.readyState == 4) {
  72. var rtn = xhr.responseText;
  73.   document.getElementById("t_return").value = rtn;
  74.   }
  75. };
  76. xhr.send();}
  77. </script>
  78. </head><body><table><tbody><tr><td>
  79. <input type="range" min="-1000" max="1000" value="0" class="vertical" ontouchend="roc()" onmouseup="roc(0)" id="r_a" />
  80. </td><td>
  81. <table><tbody><tr><td><button id="btn_stp1" class="btn_stp" onClick="roc(1)" >STOP</button></td></tr>
  82. <tr><td><label for="cb_a">FollowA:</label><input type="checkbox" id="cb_a" defaultChecked=false /></td></tr>
  83. <tr><td><label for="t_return">Return:</label></td><td><input type="text" id="t_return" /></td></tr>
  84. <tr><td><label for="t_diff">Diff:</label></td><td><input type="text" id="t_diff" /></td></tr>
  85. <tr><td><label for="cb_b">FollowB:</label><input type="checkbox" id="cb_b" defaultChecked=false /></td></tr>
  86. <tr><td><button id="btn_stp2" class="btn_stp" onClick="roc(1)" >STOP</button></td></tr></tbody></table>
  87. </td><td>
  88. <input type="range" min="-1000" max="1000" value="0" class="vertical" ontouchend="roc()" onmouseup="roc(0)" id="r_b" />
  89. </td></tr></tbody></table></body></html>
复制代码


控制界面加了停止按钮,刹车更方便了
界面效果如下

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 15:54 , Processed in 0.054923 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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