`
yiqieanhao
  • 浏览: 65886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

制作基于arduino的Wifi小车

阅读更多
成品展示




原理:


  • 把无线路由器刷入openWRT,并安装mjpeg-streamer和ser2net软件。
  • mjpeg-streamer用来处理来自摄像头的视频数据,然后通过Http协议发送给第三方。
  • 第三方如手机通过wifi接入路由器,在TCP连接中发送控制指令
  • 路由器在收到指令后通过ser2net将指令发送给绑定的串口,这里是aruduino UNO。
  • Arduino在收到指令后控制电机扩展板,电机扩展板将执行指令发给电机和云台舵机,最后电机和舵机执行操作指令。


连线:



协议:
这里采用了wifi-robots的协议定义,详细请参考这里

下位机代码:
#include <AFMotor.h>
#include <Servo.h> 

//UART PROTOCOL///////////////////////
#define UART_FLAG 0XFF
//Moto////////////////////////////////
//PROTO: FLAG DEV DIRECTION EMPTY FLAG
#define MOTO 0X00
#define FORWARD 0X01 //MOTO COMMAND
#define BACKWARD 0X02
#define TURNLEFT 0X03
#define TURNRIGHT 0X04
#define CARSTOP 0X00
//Servo///////////////////////////////
//PROTO: FLAG DEV SERVONUM POS FLAG
#define SERVO 0X01
//Moto Speed//////////////////////////
//PROTO: FLAG DEV MOTOSIDE SPEED FLAG
#define MOTOSPEED 0X02
//////////////////////////////////////
int n = 1;
int flagCount = 0;
int tempData = 0;
int UARTReveived = 0;
int rxData[5];
//-------------------define motor----------------------------------------------//
AF_DCMotor motorL(3,MOTOR12_8KHZ);  //connect to M3
AF_DCMotor motorR(4,MOTOR12_8KHZ);  //connect to M4
int motor_speed = 200; //[modifid]motor speed 150-200,---min:100;max:255
int motor_delay = 400; //[modifid]delay time in step

//-------------------define servo----------------------------------------------//
Servo hand_t_servo;  // create servo object to control a servo 
Servo hand_d_servo;  // create servo object to control a servo
int hand_t_pos = 90; // 
int hand_d_pos = 90; //
int hand_delay = 1;  //[modifid] speed of hand

//------------------main program-----------------------------------------------//
void loop()
{
  if(Serial.available())
  {
    tempData = Serial.read();
    delay(3);
    if(tempData == UART_FLAG && flagCount < 2)
    {
      rxData[0] = tempData;
      flagCount++;
    }
    else
    {
      rxData[n] = tempData;
      n++;
    }
    if(flagCount == 2)
    {
      rxData[4] == UART_FLAG;
      UARTReveived = 1;
      n = 1;
      flagCount = 0;
      tempData = 0;
      Serial.flush();
    }
  }
  if(UARTReveived == 1)
  {
  Serial.print("rxData:");
  Serial.print(rxData[0]);
  Serial.println(rxData[1]);
    if(rxData[1] == MOTO)
    {
       switch(rxData[2])
       {
         case FORWARD:
         carGoFwd();
         break;
         case BACKWARD:
         carGoBwd();
         break;
         case TURNLEFT:
         carTurnL();
         break;
         case TURNRIGHT:
         carTurnR();
         break;
         case CARSTOP:
         carStop();
         break;
       }
       UARTReveived = 0; 
    }
    else if(rxData[1] == SERVO)
    {
      servoSet(rxData[2], rxData[3]);
      UARTReveived = 0;
    }
    else if(rxData[1] == MOTOSPEED)
    {
      CHNSpeed(rxData[2], rxData[3]);
      UARTReveived = 0;
    }
  }
}

//CAR MOVEMENTS
void carGoFwd()
{
    motorL.setSpeed(motor_speed);
    motorR.setSpeed(motor_speed);
    motorL.run(FORWARD);
    motorR.run(FORWARD);
    Serial.print("forward");
    delay(motor_delay); 
}
void carGoBwd()
{
    motorL.setSpeed(motor_speed);
    motorR.setSpeed(motor_speed);
    motorL.run(BACKWARD);
    motorR.run(BACKWARD);
    Serial.print("Backward");
    delay(motor_delay); 
}
void carTurnL()
{
    motorL.setSpeed(motor_speed);
    motorR.setSpeed(motor_speed);
    motorL.run(BACKWARD);
    motorR.run(FORWARD);
   delay(motor_delay); 
   Serial.print("TurnL");
}
void carTurnR()
{
    motorL.setSpeed(motor_speed);
    motorR.setSpeed(motor_speed);
    motorL.run(FORWARD);
    motorR.run(BACKWARD);
    delay(motor_delay);     
    Serial.print("TurnR");
}
void carStop()
{
  b_motor_stop();
  Serial.print("carStop");
  delay(5);
}
//CAR SPEED
void CHNSpeed(int wheelDIR, int wheelSpeed)
{
  if(wheelDIR == 0X01) //LEFT WHEEL
  {
     motorL.setSpeed(wheelSpeed);
  }
  else if(wheelDIR == 0X02) //RIGHT WHEEL
  {
    motorR.setSpeed(wheelSpeed);
  }
}
//SERVO TURN
void servoSet(int servoNum, int pos)
{
  if(pos > 180) pos = 160;
  else if(pos < 0) pos = 0;
  switch(servoNum)
  {
    case 0X07:
    hand_t_servo.write(pos);
    Serial.print("X");
    Serial.print(pos);
    break;
    case 0X08:
    hand_d_servo.write(pos);
    Serial.print("Y");
    Serial.print(pos);
    break;
  }
}
void setup()
{
  Serial.begin(9600);
  b_motor_stop();
  b_servo_ini();
  //delay(2000);  //waiting time
  Serial.println("Hello! Wifi Car");
}

void b_motor_stop(){
  motorL.run(RELEASE);
  motorR.run(RELEASE);
}

void b_servo_ini(){
  hand_t_servo.attach(9);  // attaches the servo on pin 9 to the servo object 
  hand_d_servo.attach(10);  // attaches the servo on pin 10 to the servo object 
  hand_t_servo.write(hand_t_pos); 
  hand_d_servo.write(hand_d_pos); 
}
  • 大小: 12.9 KB
  • 大小: 10.8 KB
  • 大小: 1.6 MB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics