RC Wifi Car Robot Camera Using Arduino and OpenWRT

52K9816

Intro: RC Wifi Car Robot Camera Using Arduino and OpenWRT

A wifi car based on Arduino

by suing openWRT

Aim: DIY a wireless car based on Arduino. By controlling the car, we can see the other things in the remote location, or can monitor the security.

Effect by picture:

Principle:

l Brush openWRT into wireless router (like WR703N), and install mjpeg - the streamer and ser2net software.

l Mjpeg is used to deal with the video data from camera, and then send it via the Http protocol to the third party.

l The third party such as mobile phone through wifi access routers, send control instructions in the TCP connection

l After receiving instructions through ser2net, router would send instruction to the binding of a serial port, this is Arduino UNO.

l After receiving instructions, Arduino can control the expansion board (or shield), and then the shield would control motor, sensors, servos, and other electronic components. Finally, the motor and steering gear will execute instructions.

Connection:

Main accessories:

Camera: chassis: http://www.smartarduino.com/wifi-web-camera-car-t...

Car chassis:

http://www.smartarduino.com/car-chassis_d005005002...

Arduino: http://www.smartarduino.com/arduino-compatible_d0...

Arduino shield: http://www.smartarduino.com/arduino-shields_d0010...

Code:

1. #include

2. #include

3.

4. //UART PROTOCOL///////////////////////

5. #define UART_FLAG 0XFF

6. //Moto////////////////////////////////

7. //PROTO: FLAG DEV DIRECTION EMPTY FLAG

8. #define MOTO 0X00

9. #define FORWARD 0X01 //MOTO COMMAND

10. #define BACKWARD 0X02

11. #define TURNLEFT 0X03

12. #define TURNRIGHT 0X04

13. #define CARSTOP 0X00

14. //Servo///////////////////////////////

15. //PROTO: FLAG DEV SERVONUM POS FLAG

16. #define SERVO 0X01

17. //Moto Speed//////////////////////////

18. //PROTO: FLAG DEV MOTOSIDE SPEED FLAG

19. #define MOTOSPEED 0X02

20. //////////////////////////////////////

21. int n = 1;

22. int flagCount = 0;

23. int tempData = 0;

24. int UARTReveived = 0;

25. int rxData[5];

26. //-------------------define motor----------------------------------------------//

27. AF_DCMotor motorL(3,MOTOR12_8KHZ); //connect to M3

28. AF_DCMotor motorR(4,MOTOR12_8KHZ); //connect to M4

29. int motor_speed = 200; //[modifid]motor speed 150-200,---min:100;max:255

30. int motor_delay = 400; //[modifid]delay time in step

31.

32. //-------------------define servo----------------------------------------------//

33. Servo hand_t_servo; // create servo object to control a servo

34. Servo hand_d_servo; // create servo object to control a servo

35. int hand_t_pos = 90; //

36. int hand_d_pos = 90; //

37. int hand_delay = 1; //[modifid] speed of hand

38.

39. //------------------main program-----------------------------------------------//

40. void loop()

41. {

42. if(Serial.available())

43. {

44. tempData = Serial.read();

45. delay(3);

46. if(tempData == UART_FLAG && flagCount < 2)

47. {

48. rxData[0] = tempData;

49. flagCount++;

50. }

51. else

52. {

53. rxData[n] = tempData;

54. n++;

55. }

56. if(flagCount == 2)

57. {

58. rxData[4] == UART_FLAG;

59. UARTReveived = 1;

60. n = 1;

61. flagCount = 0;

62. tempData = 0;

63. Serial.flush();

64. }

65. }

66. if(UARTReveived == 1)

67. {

68. Serial.print("rxData:");

69. Serial.print(rxData[0]);

70. Serial.println(rxData[1]);

71. if(rxData[1] == MOTO)

72. {

73. switch(rxData[2])

74. {

75. case FORWARD:

76. carGoFwd();

77. break;

78. case BACKWARD:

79. carGoBwd();

80. break;

81. case TURNLEFT:

82. carTurnL();

83. break;

84. case TURNRIGHT:

85. carTurnR();

86. break;

87. case CARSTOP:

88. carStop();

89. break;

90. }

91. UARTReveived = 0;

92. }

93. else if(rxData[1] == SERVO)

94. {

95. servoSet(rxData[2], rxData[3]);

96. UARTReveived = 0;

97. }

98. else if(rxData[1] == MOTOSPEED)

99. {

100. CHNSpeed(rxData[2], rxData[3]);

101. UARTReveived = 0;

102. }

103. }

104. }

105.

106. //CAR MOVEMENTS

107. void carGoFwd()

108. {

109. motorL.setSpeed(motor_speed);

110. motorR.setSpeed(motor_speed);

111. motorL.run(FORWARD);

112. motorR.run(FORWARD);

113. Serial.print("forward");

114. delay(motor_delay);

115. }

116. void carGoBwd()

117. {

118. motorL.setSpeed(motor_speed);

119. motorR.setSpeed(motor_speed);

120. motorL.run(BACKWARD);

121. motorR.run(BACKWARD);

122. Serial.print("Backward");

123. delay(motor_delay);

124. }

125. void carTurnL()

126. {

127. motorL.setSpeed(motor_speed);

128. motorR.setSpeed(motor_speed);

129. motorL.run(BACKWARD);

130. motorR.run(FORWARD);

131. delay(motor_delay);

132. Serial.print("TurnL");

133. }

134. void carTurnR()

135. {

136. motorL.setSpeed(motor_speed);

137. motorR.setSpeed(motor_speed);

138. motorL.run(FORWARD);

139. motorR.run(BACKWARD);

140. delay(motor_delay);

141. Serial.print("TurnR");

142. }

143. void carStop()

144. {

145. b_motor_stop();

146. Serial.print("carStop");

147. delay(5);

148. }

149. //CAR SPEED

150. void CHNSpeed(int wheelDIR, int wheelSpeed)

151. {

152. if(wheelDIR == 0X01) //LEFT WHEEL

153. {

154. motorL.setSpeed(wheelSpeed);

155. }

156. else if(wheelDIR == 0X02) //RIGHT WHEEL

157. {

158. motorR.setSpeed(wheelSpeed);

159. }

160. }

161. //SERVO TURN

162. void servoSet(int servoNum, int pos)

163. {

164. if(pos > 180) pos = 160;

165. else if(pos < 0) pos = 0;

166. switch(servoNum)

167. {

168. case 0X07:

169. hand_t_servo.write(pos);

170. Serial.print("X");

171. Serial.print(pos);

172. break;

173. case 0X08:

174. hand_d_servo.write(pos);

175. Serial.print("Y");

176. Serial.print(pos);

177. break;

178. }

179. }

180. void setup()

181. {

182. Serial.begin(9600);

183. b_motor_stop();

184. b_servo_ini();

185. //delay(2000); //waiting time

186. Serial.println("Hello! Wifi Car");

187. }

188.

189. void b_motor_stop(){

190. motorL.run(RELEASE);

191. motorR.run(RELEASE);

192. }

193.

194. void b_servo_ini(){

195. hand_t_servo.attach(9); // attaches the servo on pin 9 to the servo object

196. hand_d_servo.attach(10); // attaches the servo on pin 10 to the servo object

197. hand_t_servo.write(hand_t_pos);

198. hand_d_servo.write(hand_d_pos);

199. }

STEP 1: The Overall Effect

Aim: DIY a wireless car based on Arduino. By controlling the car, we can

see the other things in the remote location, or can monitor the security.

STEP 2: Principle of the Intelligent Car

l Brush openWRT into wireless router (like WR703N), and install mjpeg

- the streamer and ser2net software.

l Mjpeg is used to deal with the video data from camera, and then send it via the Http protocol to the third party.

l The third party such as mobile phone through wifi access routers, send control instructions in the TCP connection

l After receiving instructions through ser2net, router would send instruction to the binding of a serial port, this is Arduino UNO.

l After receiving instructions, Arduino can control the expansion board (or shield), and then the shield would control motor, sensors, servos, and other electronic components. Finally, the motor and steering gear will execute instructions.

STEP 3: Connection

STEP 4: Code

1. #include

2. #include

3.

4. //UART PROTOCOL///////////////////////

5. #define UART_FLAG 0XFF

6. //Moto////////////////////////////////

7. //PROTO: FLAG DEV DIRECTION EMPTY FLAG

8. #define MOTO 0X00

9. #define FORWARD 0X01 //MOTO COMMAND

10. #define BACKWARD 0X02

11. #define TURNLEFT 0X03

12. #define TURNRIGHT 0X04

13. #define CARSTOP 0X00

14. //Servo///////////////////////////////

15. //PROTO: FLAG DEV SERVONUM POS FLAG

16. #define SERVO 0X01

17. //Moto Speed//////////////////////////

18. //PROTO: FLAG DEV MOTOSIDE SPEED FLAG

19. #define MOTOSPEED 0X02

20. //////////////////////////////////////

21. int n = 1;

22. int flagCount = 0;

23. int tempData = 0;

24. int UARTReveived = 0;

25. int rxData[5];

26. //-------------------define motor----------------------------------------------//

27. AF_DCMotor motorL(3,MOTOR12_8KHZ); //connect to M3

28. AF_DCMotor motorR(4,MOTOR12_8KHZ); //connect to M4

29. int motor_speed = 200; //[modifid]motor speed 150-200,---min:100;max:255

30. int motor_delay = 400; //[modifid]delay time in step

31.

32. //-------------------define servo----------------------------------------------//

33. Servo hand_t_servo; // create servo object to control a servo

34. Servo hand_d_servo; // create servo object to control a servo

35. int hand_t_pos = 90; //

36. int hand_d_pos = 90; //

37. int hand_delay = 1; //[modifid] speed of hand

38.

39. //------------------main program-----------------------------------------------//

40. void loop()

41. {

42. if(Serial.available())

43. {

44. tempData = Serial.read();

45. delay(3);

46. if(tempData == UART_FLAG && flagCount < 2)

47. {

48. rxData[0] = tempData;

49. flagCount++;

50. }

51. else

52. {

53. rxData[n] = tempData;

54. n++;

55. }

56. if(flagCount == 2)

57. {

58. rxData[4] == UART_FLAG;

59. UARTReveived = 1;

60. n = 1;

61. flagCount = 0;

62. tempData = 0;

63. Serial.flush();

64. }

65. }

66. if(UARTReveived == 1)

67. {

68. Serial.print("rxData:");

69. Serial.print(rxData[0]);

70. Serial.println(rxData[1]);

71. if(rxData[1] == MOTO)

72. {

73. switch(rxData[2])

74. {

75. case FORWARD:

76. carGoFwd();

77. break;

78. case BACKWARD:

79. carGoBwd();

80. break;

81. case TURNLEFT:

82. carTurnL();

83. break;

84. case TURNRIGHT:

85. carTurnR();

86. break;

87. case CARSTOP:

88. carStop();

89. break;

90. }

91. UARTReveived = 0;

92. }

93. else if(rxData[1] == SERVO)

94. {

95. servoSet(rxData[2], rxData[3]);

96. UARTReveived = 0;

97. }

98. else if(rxData[1] == MOTOSPEED)

99. {

100. CHNSpeed(rxData[2], rxData[3]);

101. UARTReveived = 0;

102. }

103. }

104. }

105.

106. //CAR MOVEMENTS

107. void carGoFwd()

108. {

109. motorL.setSpeed(motor_speed);

110. motorR.setSpeed(motor_speed);

111. motorL.run(FORWARD);

112. motorR.run(FORWARD);

113. Serial.print("forward");

114. delay(motor_delay);

115. }

116. void carGoBwd()

117. {

118. motorL.setSpeed(motor_speed);

119. motorR.setSpeed(motor_speed);

120. motorL.run(BACKWARD);

121. motorR.run(BACKWARD);

122. Serial.print("Backward");

123. delay(motor_delay);

124. }

125. void carTurnL()

126. {

127. motorL.setSpeed(motor_speed);

128. motorR.setSpeed(motor_speed);

129. motorL.run(BACKWARD);

130. motorR.run(FORWARD);

131. delay(motor_delay);

132. Serial.print("TurnL");

133. }

134. void carTurnR()

135. {

136. motorL.setSpeed(motor_speed);

137. motorR.setSpeed(motor_speed);

138. motorL.run(FORWARD);

139. motorR.run(BACKWARD);

140. delay(motor_delay);

141. Serial.print("TurnR");

142. }

143. void carStop()

144. {

145. b_motor_stop();

146. Serial.print("carStop");

147. delay(5);

148. }

149. //CAR SPEED

150. void CHNSpeed(int wheelDIR, int wheelSpeed)

151. {

152. if(wheelDIR == 0X01) //LEFT WHEEL

153. {

154. motorL.setSpeed(wheelSpeed);

155. }

156. else if(wheelDIR == 0X02) //RIGHT WHEEL

157. {

158. motorR.setSpeed(wheelSpeed);

159. }

160. }

161. //SERVO TURN

162. void servoSet(int servoNum, int pos)

163. {

164. if(pos > 180) pos = 160;

165. else if(pos < 0) pos = 0;

166. switch(servoNum)

167. {

168. case 0X07:

169. hand_t_servo.write(pos);

170. Serial.print("X");

171. Serial.print(pos);

172. break;

173. case 0X08:

174. hand_d_servo.write(pos);

175. Serial.print("Y");

176. Serial.print(pos);

177. break;

178. }

179. }

180. void setup()

181. {

182. Serial.begin(9600);

183. b_motor_stop();

184. b_servo_ini();

185. //delay(2000); //waiting time

186. Serial.println("Hello! Wifi Car");

187. }

188.

189. void b_motor_stop(){

190. motorL.run(RELEASE);

191. motorR.run(RELEASE);

192. }

193.

194. void b_servo_ini(){

195. hand_t_servo.attach(9); // attaches the servo on pin 9 to the servo object

196. hand_d_servo.attach(10); // attaches the servo on pin 10 to the servo object

197. hand_t_servo.write(hand_t_pos);

198. hand_d_servo.write(hand_d_pos);

199. }

11 Comments

hi guys, can u help me to connect the output of the camera to the internet ?
Please explain in detail to explain how to upload drivers for video streaming of tp link TL-WR703N . I'm very thankful if you do this for me soon. My email is wwimaladharma@gmail.com

Same question.

Also wondering if you can think of any way to pass audio?

Do you know drivers uploading (uvc drivers ser2net) to wr-703n wifi router for live video streaming with web camera.
Please is the coding ,arduino coding or c

nice ,thank u very much

hi, how did you wired the wifi router to arduino, can you explain that with a schema please?

The wifi part I wanted to make sure which one to get and the programming is there any errors and what program to use
The arduino sheld what that I didn't understand that ? The programming how long did it take? I'm thinking about making one for my project for school the car part I look on the website and they don't have the one u baught I wanted to go cheap but no to cheap wanted to go in between thank you
Or you could do what i did and go to a brookstone closing and get a spy vehicle normally priced at $200 for $75