arduino wifi无线小车原型测试代码

这几天倒腾手机app控制arduino wifi小车,测试代码写完了,做个记录防止忘记。

/****wifi无线遥控车测试代码
基本实现
1 基于ESP8266的uno与esp8266以及手机的通信(信号传递)

2 舵机控制对舵机的控制

3 对LN2003步进驱动的控制(有问题需要调试)

4手机与esp8266采用的tcp协议通信,可使用java 实现桌面以及android客户端,也可网上下载tcp网络调试app



****/

#include <Servo.h>        //舵机控制
#include <Stepper.h>         //步进电机控制
#include <SoftwareSerial.h>  //软串口   因为 uno实际 tx(0脚)  Rx(1脚)就各一个,为了不在调试的时候出现冲突,就使用软串口
#define DEBUG true              //boolean变量
#define STEPS 64                //电机一圈所规定得步数,自己去取摸索
Stepper stepper(STEPS, 2, 3, 4, 5);    //给ln2003驱动指定四个输入引脚
SoftwareSerial mySerial(13, 12); // RX, TX    //软串口 13 12相当于功能转移
String data = "";                    //接收到手机发过来的数据
int flag = 0;                        //接受完毕的信号
int LED = 9;                         //9引脚接led灯的正极
void inits();                        //函数使用前的申明
Servo myservo; //duoji               //定义舵机
void servoSport(Servo myservo, char deg);    //函数使用前的申明
void motorSport(char dir);             //函数使用前的申明
void setup() {
  
  Serial.begin(115200);                 //开始,设置波特率 115200  esp8266 默认的波特率
  Serial.println("Hello,serial!");
  mySerial.begin(115200);                  //设置波特率
  mySerial.println("AT");
  pinMode(LED, OUTPUT);                   //点亮led灯前的申明
  inits();                                //esp8266的初始化操作,为了防止断电后无法自动开启tcp服务
  myservo.attach(7);//7controller servo    //设置引脚7为了控制舵机
  stepper.setSpeed(290);//motor                //电机一圈所规定得步数,自己去取摸索
}

void loop() {

  while (mySerial.available() > 0)                       //判断串口中有无数据
  {
    data += char(mySerial.read());                       //将接收到的int数据转换为char 然后追加到字符串中
    delay(5);                                            //延时 防止数据太多没有接受完毕
    flag = 1;                                            //接受完毕标志
  }

  if (flag == 1) {
    Serial.println(data);
    Serial.println("----------start----------");
    Serial.println(data[data.length() - 1]);
    if (data[data.length() - 1] == '1') {                  //判断手机发送给esp8266的tcp数据最后一位是什么  相当于控制信号,当然此处也可以做字符串截取处理,来完成更复杂的控制任务
      digitalWrite(LED, HIGH);                            //信号为1的时候 点亮灯
      servoSport(myservo, '1');                               //控制舵机旋转
    } else if (data[data.length() - 1] == '0') {
      digitalWrite(LED, LOW);
      servoSport(myservo, '0');
    } else if (data[data.length() - 1] == '2') {
      motorSport('1');                                     //控制电机旋转
    } else if (data[data.length() - 1] == '3') {
      motorSport('0');
    }


    Serial.println("--------end------------");
    data = "";
    flag = 0;                                          //将接受标志变为0 
  }

  if (Serial.available()) {
    mySerial.write(Serial.read());
  }


}


/*
初始化esp8266

*/
void inits() {
  sendCommand(mySerial, "AT+RST\r\n", 1000, DEBUG);
  sendCommand(mySerial, "AT+CIPMUX=1\r\n", 1000, DEBUG); // configure for multiple connections
  sendCommand(mySerial, "AT+CIPSERVER=1,8080\r\n", 1000, DEBUG); // turn on TCP server on port 8080
}

/*
uno 向 8266发送数据
参考官网写法

*/

String sendData(SoftwareSerial esp8266, String command, const int timeout, boolean debug)
{
  String response = "";
  int dataSize = command.length();
  char data[dataSize];
  command.toCharArray(data, dataSize);
  esp8266.write(data, dataSize); // send the read character to the esp8266
  if (debug)
  {
    Serial.write(data, dataSize);
  }

  long int time = millis();

  while ( (time + timeout) > millis())
  {
    while (esp8266.available())
    {
      char c = esp8266.read(); // read the next character.
      response += c;
    }
  }

  if (debug)
  {
    Serial.print(response);
  }

  return response;
}


/*
uno 向 8266发送数据
参考官网写法

*/
String sendCommand(SoftwareSerial esp8266, String command, const int timeout, boolean debug)
{
  String response = "";

  esp8266.print(command); // send the read character to the esp8266

  long int time = millis();

  while ( (time + timeout) > millis())
  {
    while (esp8266.available())
    {

      // The esp has data so display its output to the serial window
      char c = esp8266.read(); // read the next character.
      response += c;
    }
  }

  if (debug)
  {
    Serial.print(response);
  }

  return response;
}



///控制舵机转动

void servoSport(Servo myservo, char deg) {
  if (deg == '1') {

    myservo.write(90);
    delay(15);
  } else if (deg == '0') {
    myservo.write(0);
    delay(15);

  }
}
//控制电机转动

void motorSport(char dir) {
  if (dir == '1') {
    stepper.step(2048); //4步模式下旋转一周用2048 步。
    delay(500);
  } else if (dir == '0') {

    stepper.step(-2048); //4步模式下旋转一周用2048 步。
    delay(500);


  }

}









 

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值