原理:
- 把无线路由器刷入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); }