极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17763|回复: 8

无线wifi小车(1)--arduino+w5100+L298+w5100+无线路由器

[复制链接]
发表于 2013-10-24 23:34:46 | 显示全部楼层 |阅读模式
本帖最后由 yongyuan824 于 2013-12-15 22:24 编辑

本人是初学者,代码写的若有问题请多多指教,经过2个月的努力,本人第一个作品。pc控制端用的jqueryui+html写的在附件里。(后续会继续完善,实现远程时时视频传送,避障等功能)。控制端pc,手机移动设备等。。废话不说直接上代码---------------------------中间遇到点小问题,没查出原因,希望知道的多多赐教。问题如下:pwm调速口开始用的是10和11,10口get给w5100发送数据时网页一直处于发送状态且arduino主机无响应但w5100的指示灯闪烁也能ping通。11口的问题是设置0-255值对电机转速控制无效。代码如下,只是pwm口更换之后就正常了。开始以为代码问题反复修改代码花了几天时间才发现这两个口有这种状况,希望高人给出解释现在还一头雾水...
[pre lang="arduino" line="5" file="webcar"]
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 177 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;
/////////////////////////////////////////////////
int pinI1=2;//定义I1接口
int pinI2=3;//定义I2接口
int speedApin=6;//定义EA(PWM调速)接口
int pinI3=4;//定义I3接口
int pinI4=5;//定义I4接口
int speedBpin=9;//定义EB(PWM调速)接口
void setup()
{
    //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  //enable serial data print
  Serial.begin(9600);
  Serial.println("servertest1"); // so I can keep track of what is loaded
  
  pinMode(pinI1,OUTPUT);
  pinMode(pinI2,OUTPUT);
  pinMode(speedApin,OUTPUT);
  pinMode(pinI3,OUTPUT);
  pinMode(pinI4,OUTPUT);
  pinMode(speedBpin,OUTPUT);
}
void motorA(int sp,boolean tf){
   analogWrite(speedApin,sp);//输入模拟值进行设定速度
    if(tf){
      digitalWrite(pinI1,LOW);//使直流电机(左)顺时针转
      digitalWrite(pinI2,HIGH);
     }
     else
     {
      //analogWrite(speedApin,sp);//输入模拟值进行设定速度
      digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
      digitalWrite(pinI2,LOW);
     }
   if(sp<10){
     digitalWrite(pinI1,HIGH);//使直流电机(左)刹车
     digitalWrite(pinI2,HIGH);
    }
  }
  void motorB(int sp,boolean tf){
    analogWrite(speedBpin,sp);//输入模拟值进行设定速度
    if(tf){
     digitalWrite(pinI4,LOW);//使直流电机(右)逆时针转
     digitalWrite(pinI3,HIGH);
      }
     else
     {
      //analogWrite(speedBpin,sp);//输入模拟值进行设定速度
      digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
     digitalWrite(pinI3,LOW);
     }
     if(sp<=10){
      digitalWrite(pinI4,HIGH);//使直流电机(右)刹车
     digitalWrite(pinI3,HIGH);
     }
  }
void loop()
{
    // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {
          ///////////////
          Serial.println(readString);
         
          client.println("OK");
          delay(1);
          //stopping client
          client.stop();
          /////////////////////
         
       //readString= readString.substring(5,readString.length()-11);
       readString.replace("GET /","");
       readString.replace("HTTP/1.1","");
       readString.trim();//qu diao liang duan kong ge
        Serial.println(readString);
        boolean isforward=true;//shi fou qian jin

          if(readString.indexOf('-')>-1){
           isforward=false;
           //int sp=speedb.toInt();
          }     
          if(readString.indexOf("motora") >-1)//checks for on
           {
            int sp = abs(readString.substring(7).toInt());//abs qu jue dui zhi  wu lun zheng fu
            Serial.println(sp);
            motorA(sp,isforward);
          }
         if(readString.indexOf("motorb") >-1)//checks for on
          {
           int sp = abs(readString.substring(7).toInt());
            Serial.println(sp);
            motorB(sp,isforward);
          }
          //clearing string for next read
          readString="";
        }
      }
    }
  }
}[/code]

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-10-24 23:54:10 | 显示全部楼层
对了,高人有没有更好的办法来处理get传过来的数据啊?如有个现成的方法直接接收到如 ?id=100 这种web开放常用的传参数的方法。以上我用的replace 做的替换和substring做的截取。
回复 支持 反对

使用道具 举报

发表于 2013-10-25 11:43:14 | 显示全部楼层
yongyuan824 发表于 2013-10-24 23:54
对了,高人有没有更好的办法来处理get传过来的数据啊?如有个现成的方法直接接收到如 ?id=100 这种web开放常 ...

http消息可以通过参数传递?id=100&name=jack数据,通过解析http uri的param就可以得到
回复 支持 反对

使用道具 举报

发表于 2013-10-25 12:07:17 | 显示全部楼层
yongyuan824 发表于 2013-10-24 23:54
对了,高人有没有更好的办法来处理get传过来的数据啊?如有个现成的方法直接接收到如 ?id=100 这种web开放常 ...

?后面param解析的思路是
1、先定位到?,截取后面所有字串做为params,可以使用string的find
2、将params按 &分割成多个字串,每个都是一个param,c++没有现成的函数,需要自己稍微处理下,写个循环。类似:
  std::string::size_type found = str.find_first_of("&");
  while (found!=std::string::npos)
  {
    //伪代码
    param=str.substring(0,found);
    found=str.find_first_of("&",found+1);
  }
3、对2分割出来的每个param,定位到=字符(可以使用string的find),前面是key,后面是value(使用string substring)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-25 13:29:38 | 显示全部楼层
bubuxiu 发表于 2013-10-25 12:07
?后面param解析的思路是
1、先定位到?,截取后面所有字串做为params,可以使用string的find
2、将param ...

哦,大概明白思路了,我懂js脚本代码感觉代码的思路都是相通的吧,查查find的用法,晚上回去试试...
回复 支持 反对

使用道具 举报

发表于 2013-10-26 14:19:40 | 显示全部楼层
yongyuan824 发表于 2013-10-25 13:29
哦,大概明白思路了,我懂js脚本代码感觉代码的思路都是相通的吧,查查find的用法,晚上回去试试...

加油,有进展分享学习,哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-26 23:06:26 | 显示全部楼层
bubuxiu 发表于 2013-10-26 14:19
加油,有进展分享学习,哈哈

嗯嗯,会的,最近晚上一有时间就研究代码,业余爱好,平时工作其实就是敲代码但语言不同,得学。。thanks
回复 支持 反对

使用道具 举报

发表于 2014-4-18 16:41:10 | 显示全部楼层
楼主。你做的这个 arduino版是通过什么与路由器通信的
回复 支持 反对

使用道具 举报

发表于 2014-5-22 22:16:23 | 显示全部楼层
你是怎么样连接的可以说说吗?楼主
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 20:33 , Processed in 0.060823 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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