Hướng dẫn chế thêm "mắt" cho xe đồ chơi, tự né vật cản, không bao giờ tai nạn


SUBMITTED BY: tigercn

DATE: Jan. 19, 2017, 4:10 p.m.

FORMAT: Text only

SIZE: 8.1 kB

HITS: 661

  1. Bạn nghĩ sao về một chiếc xe có thể tự động tránh vật cản phía trước?
  2. Ở bài trước chúng tôi đã hướng dẫn các bạn chế tạo một chiếc xe điều khiển từ xa bằng Smartphone. Trong bài ngày hôm nay chúng tôi sẽ hướng dẫn các bạn làm một chiếc xe có khả năng tự động tránh vật cản. Nghe thôi đã thấy thú vị rồi phải không nào? Chúng ta cùng bắt tay vào việc ngay thôi.
  3. Clip hoạt động của robot
  4. Chuẩn bị:
  5. Một bộ khung xe robot 3 bánh ( giá khoảng 140.000 đồng)
  6. Một cảm biến siêu âm SRF 04 hoặc SRF05 ( Giá khoảng 50.000 đồng)
  7. Một Broad Arduini UNO R3 ( Giá khoảng 180.000 đồng)
  8. Một module điều khiển động cơ L293 ( Giá khoảng 119.000 đồng)
  9. Một Servo SG90 ( Giá khoảng 50.000 đồng)
  10. Khung đỡ cảm biến siêu âm (Giá khoảng 10.000 đồng)
  11. Khung đỡ Servo (Giá khoảng 10.000 đồng)
  12. Dây nối đực-cái, cái -cái, ( Giá khoảng 14.000 đồng)
  13. Bạn có thể tham khảo và đặt mua sản phẩm
  14. Các linh kiện cần chuẩn bị
  15. Các linh kiện cần chuẩn bị
  16. Bước 1
  17. Hàn dây cho mô tơ
  18. Hàn dây cho mô tơ
  19. Các bạn hàn dây cho mô tơ sau đó lắp ráp bộ khung xe lại, phần lắp ráp này khá đơn giản.
  20. Sau khi lắp ráp xong
  21. Sau khi lắp ráp xong
  22. Sau khi lắp ráp bộ khung và hàn dây cho mô tơ xong chúng ta sẽ được như thế này
  23. Bước 2
  24. Lắp servo SG90 vào khung robot
  25. Lắp servo SG90 vào khung robot
  26. Tiếp theo chúng ta sẽ lắp động cơ servo lên khung xe. Các bạn dùng bộ khung và ốc dành cho servo để cố định lên khung robot. Động cơ servo này có nhiệm vụ xoay cảm biến siêu âm để giúp robot phát hiện vật cản ở các hướng.
  27. Lăp giá đỡ cảm biến siêu âm vào servo
  28. Lăp giá đỡ cảm biến siêu âm vào servo
  29. Sau khi đã cố định Servo xong chúng ta lắp khung đỡ cảm biến siêu âm lên servo. Các bạn có thể dùng keo nến để dán phần khung đỡ cảm biến siêu âm này với servo.
  30. Bước 3
  31. Do phải đặt module L293 lên Broad Arduino như thế này nên chúng ta sẽ bị thiếu chân cắm vào Arduino. Vì vậy chúng ta phải hàn thêm chân kết nối ở trên L293
  32. Hàn thêm Jump
  33. Hàn thêm Jump
  34. Trên module L293 đã có lỗ chờ sẵn các bạn chỉ việc đặt jump vào và dùng mỏ hàn lại.
  35. Bước 4
  36. Dán Broad Arduino lên khung robot
  37. Dán Broad Arduino lên khung robot
  38. Các bạn dán Broad Arduno UNO R3 lên khung robot
  39. Sau đó đặt module L293 lên
  40. Sau đó đặt module L293 lên
  41. Sau đó đặt Module L293 lên trên.
  42. Bước 5
  43. Nối động cơ vào cọc M2
  44. Nối động cơ vào cọc M2
  45. Nối động cơ vào cọc M4
  46. Nối động cơ vào cọc M4
  47. Tiếp theo các bạn nối dây động cơ vào cọc M2 và M4
  48. Kết nối dây với cảm biến siêu âm SRF05
  49. Kết nối dây với cảm biến siêu âm SRF05
  50. Sau đó chúng ta sẽ nối dây cho cảm biến siêu âm và Arduino
  51. Sau đó kết nối dây với module L293
  52. Sau đó kết nối dây với module L293
  53. Dây GND nối với GND, VCC nối với 5V, Trig nối với A0, Echo nối với A1
  54. Nối dây của servo vào module L293
  55. Nối dây của servo vào module L293
  56. Và cuối cùng là nối dây cho Servo hoạt động. Các bạn cắm dây của servo vào chân Jump có ghi SER1. Trên mạch có ghi các kí hiệu (- + và S, S là dây tín hiệu của servo) các bạn nhớ cắm cho đúng, dây tín hiệu của servo thường có màu vàng cam.
  57. Bước 6
  58. Hàn dây vào công tắc
  59. Hàn dây vào công tắc
  60. Các bạn hàn dây cho công tắc.
  61. Lắp công tắc lên khung
  62. Lắp công tắc lên khung
  63. Sau đó đặt vào khe chờ sẵn trên khung.
  64. Bước 7
  65. Cố định pin lên khung
  66. Cố định pin lên khung
  67. Dán pin lên khung robot và tiến hành nối dây. Các bạn có thể dùng sẵn bộ khung 4 pin tiểu 1.5V được tặng kèm khi mua bộ khung hoặc mua 2 pin cell 18650 như thế này để có thể sạc lại pin sau khi pin hết.
  68. Nối dây nguồn vào Module L293
  69. Nối dây nguồn vào Module L293
  70. Giờ các bạn nối đầu dây âm của pin ( dây màu đen) vào chân GND trên module L293. Đầu dây dương còn lại của pin các bạn nối vào một đầu dây của công tắc. Đầu dây còn lại của công tắc các bạn nối với chân M+ trên Module L293
  71. Bước 8
  72. Do Arduino không có sẵn thư viện NewPing và thư viện AFMotor vậy nên chúng ta cần phải thêm vào Arduino. Cách thêm thư viện vào Arduino các bạn có thể tham khảo trong các bài hướng dẫn " Đừng chơi Asphalt 8 nữa, chúng tôi sẽ hướng dẫn bạn chế hẳn ô tô thật mà điều khiển như trong game!"
  73. Các bạn tải thư viện NewPing về tại đây và thư viện AFMotor tại đây
  74. Sau khi thêm thư viện xong các bạn copy đoạn code này vào Arduino trên máy tính.
  75. #include < AFMortor.h>
  76. #include < Servo.h>
  77. #include < NewPing.h>
  78. #define TRIG_PIN A0
  79. #define ECHO_PIN A1
  80. #define MAX_DISTANCE_POSSIBLE 1000
  81. #define MAX_SPEED 150
  82. #define MOTORS_CALIBRATION_OFFSET 3
  83. #define COLL_DIST 20
  84. #define TURN_DIST COLL_DIST 10
  85. NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE);
  86. AF_DCMotor leftMotor(4, MOTOR12_8KHZ);
  87. AF_DCMotor rightMotor(2, MOTOR12_8KHZ);
  88. Servo neckControllerServoMotor;
  89. int pos = 0;
  90. int maxDist = 0;
  91. int maxAngle = 0;
  92. int maxRight = 0;
  93. int maxLeft = 0;
  94. int maxFront = 0;
  95. int course = 0;
  96. int curDist = 0;
  97. String motorSet = "";
  98. int speedSet = 0;
  99. void setup() {
  100. neckControllerServoMotor.attach(10);
  101. neckControllerServoMotor.write(90);
  102. delay(2000);
  103. checkPath();
  104. motorSet = "FORWARD";
  105. neckControllerServoMotor.write(90);
  106. moveForward();
  107. }
  108. void loop() {
  109. checkForward();
  110. checkPath();
  111. }
  112. void checkPath() {
  113. int curLeft = 0;
  114. int curFront = 0;
  115. int curRight = 0;
  116. int curDist = 0;
  117. neckControllerServoMotor.write(144);
  118. delay(120);
  119. for(pos = 144; pos >= 36; pos-=18)
  120. {
  121. neckControllerServoMotor.write(pos);
  122. delay(90);
  123. checkForward();
  124. curDist = readPing();
  125. if (curDist < COLL_DIST) {
  126. checkCourse();
  127. break;
  128. }
  129. if (curDist < TURN_DIST) {
  130. changePath();
  131. }
  132. if (curDist > curDist) {maxAngle = pos;}
  133. if (pos > 90 && curDist > curLeft) { curLeft = curDist;}
  134. if (pos == 90 && curDist > curFront) {curFront = curDist;}
  135. if (pos < 90 && curDist > curRight) {curRight = curDist;}
  136. }
  137. maxLeft = curLeft;
  138. maxRight = curRight;
  139. maxFront = curFront;
  140. }
  141. void setCourse() {
  142. if (maxAngle < 90) {turnRight();}
  143. if (maxAngle > 90) {turnLeft();}
  144. maxLeft = 0;
  145. maxRight = 0;
  146. maxFront = 0;
  147. }
  148. void checkCourse() {
  149. moveBackward();
  150. delay(500);
  151. moveStop();
  152. setCourse();
  153. }
  154. void changePath() {
  155. if (pos < 90) {lookLeft();}
  156. if (pos > 90) {lookRight();}
  157. }
  158. int readPing() {
  159. delay(70);
  160. unsigned int uS = sonar.ping();
  161. int cm = uS/US_ROUNDTRIP_CM;
  162. return cm;
  163. }
  164. void checkForward() { if (motorSet=="FORWARD") {leftMotor.run(FORWARD); rightMotor.run(FORWARD); } }
  165. void checkBackward() { if (motorSet=="BACKWARD") {leftMotor.run(BACKWARD); rightMotor.run(BACKWARD); } }
  166. void moveStop() {leftMotor.run(RELEASE); rightMotor.run(RELEASE);}
  167. void moveForward() {
  168. motorSet = "FORWARD";
  169. leftMotor.run(FORWARD);
  170. rightMotor.run(FORWARD);
  171. for (speedSet = 0; speedSet < MAX_SPEED; speedSet =2)
  172. {
  173. leftMotor.setSpeed(speedSet MOTORS_CALIBRATION_OFFSET);
  174. rightMotor.setSpeed(speedSet);
  175. delay(5);
  176. }
  177. }
  178. void moveBackward() {
  179. motorSet = "BACKWARD";
  180. leftMotor.run(BACKWARD);
  181. rightMotor.run(BACKWARD);
  182. for (speedSet = 0; speedSet < MAX_SPEED; speedSet =2)
  183. {
  184. leftMotor.setSpeed(speedSet MOTORS_CALIBRATION_OFFSET);
  185. rightMotor.setSpeed(speedSet);
  186. delay(5);
  187. }
  188. }
  189. void turnRight() {
  190. motorSet = "RIGHT";
  191. leftMotor.run(FORWARD);
  192. rightMotor.run(BACKWARD);
  193. delay(400);
  194. motorSet = "FORWARD";
  195. leftMotor.run(FORWARD);
  196. rightMotor.run(FORWARD);
  197. }
  198. void turnLeft() {
  199. motorSet = "LEFT";
  200. leftMotor.run(BACKWARD);
  201. rightMotor.run(FORWARD);
  202. delay(400);
  203. motorSet = "FORWARD";
  204. leftMotor.run(FORWARD);
  205. rightMotor.run(FORWARD);
  206. }
  207. void lookRight() {rightMotor.run(BACKWARD); delay(400); rightMotor.run(FORWARD);}
  208. void lookLeft() {leftMotor.run(BACKWARD); delay(400); leftMotor.run(FORWARD);}
  209. Ấn vào biểu tượng V để dịch code
  210. Ấn vào biểu tượng V để dịch code
  211. Ấn vào biểu tượng mũi tên để nạp code
  212. Ấn vào biểu tượng mũi tên để nạp code
  213. Vậy là chúng ta đã hoàn thành rồi. Đây là thành quả của chúng ta.
  214. Thành quả sau khi lắp ráp hoàn chỉnh
  215. Thành quả sau khi lắp ráp hoàn chỉnh
  216. Xem thêm tại: http://adf.ly/1iM9Po

comments powered by Disqus