.42 Lưu đồ giải thuật trên arduino

Một phần của tài liệu Thiết kế, mô phỏng và chế tạo mô hình xe điện sử dụng năng lượng mặt trời (Trang 80)

Trang 70

Ở phần xử lý của Arduino Uno, kiểm tra kết nối UART đến máy tính, nếu chưa kết nối thì ta kiểm tra lại phần cứng, cịn nếu đã kết nối thì Arduino kiểm tra máy tính có gửi u cầu đọc các cảm biến khơng? Nếu có thì sẽ đọc giá trị của cảm biến, gửi lại đến máy tính, và tiến hành kiểm tra tiếp bước tiếp theo, cịn nếu khơng gửi thì cũng chuyển qua bước tiếp theo là kiểm tra tay cầm ở chế độ nào. Nếu khơng ở chế độ nào thì kiểm tra lại phần cứng và tiếp tục đọc lại.

Nếu ở chế độ Auto thì sẽ kiểm tra có lệnh điều khiển góc rẽ từ máy tính hay khơng? Nếu khơng thì sẽ chuyển qua bước tiếp theo, cịn nếu có thì sẽ tách giá trị GĨC RẼ từ lệnh điều khiển góc rẽ, tiếp đến tạo xung điều khiển rẽ trái/phải theo giá trị góc rẽ và chuyển sang bước kiểm tra có lệnh điều khiển tiến lùi từ máy tính gửi hay khơng? Nếu khơng sẽ quay lại bước kiểm tra máy tính có gửi u cầu đọc cảm biến hay khơng? Cịn nếu có thì sẽ tách giá trị TỐC ĐỘ ĐẶT từ lệnh điều khiển tiến lùi.

Nếu ở chế độ Manual thì sẽ đọc giá trị GÓC RẼ từ tay gạt điều khiển rẽ trái/phải, tạo xung điều khiển rẽ trái/phải theo giá trị GÓC RẼ, tiếp theo đọc giá trị TỐC ĐỘ ĐẶT theo tay gạt điều khiển tiến/lùi.

Tiếp theo sẽ đọc cảm biến vật cản khi xe đang, nếu xe phát hiện vật cản thì TỐC ĐỘ ĐẶT sẽ được gán bằng 0, cịn nếu khơng có vật cản xe thì TỐC ĐỘ ĐẶT vẫn là 5 m/s và Arduino sẽ đọc tốc độ thực của xe từ encoder, tính tốn bộ điều khiển P.I, tạo xung PWM điều khiển động cơ sau theo P.I. Quá trình sẽ được lặp đi lặp lại để điều khiển tốc độ thực của xe theo tốc độ đặt từ máy tính.

Trang 71 CHƯƠNG V: THỰC NGHIỆM VÀ ĐÁNH GIÁ 5.1 Kết quả thực nghiệm: Hình 5.1 Mơ hình xe thực tế Hình 5.2 Mơ hình xe thực tế

Trang 72

- Xe đa số cần phải thiết kế các chi tiết hầu như khơng có sẵn trong thị trường, do đó vấn đề thi cơng gặp nhiều khó khăn và chi phí lớn.

- Cơ cấu dẫn động lái và cơ cấu dẫn động cầu sau hoạt động và ổn định, chính xác tốt, hoạt động tốt, ít có tiếng kêu va đập của các chi tiết cơ khí.

- Xe hoạt động ổn định, khơng có hiện tượng chập chờn, nhiễu giữa các động cơ và phần điện.

- Hệ thống treo hoạt động ổn định, xe di chuyển êm ái qua các ổ gà.

- Khi xe vào các cua gắt và bị tường che chắn mất tầm nhìn của camera nên xe vẫn còn bị lỗi tại khúc cua gắt,

- Hệ thống cảm biến hoạt động tốt trong mọi điều kiện thời tiết như nắng gắt và trời tối, khơng có hiện tượng nhiễu, chưa xảy ra tình trạng va chạm.

- Phần Camera thu thập hình ảnh ổn định, đôi khi bị nhiễu trong trường hợp mặt trời chiếu trực tiếp vào mắt camera.

- Xe chạy được ổn định với vận tốc 5Km/h đối với đường có line trắng rõ ràng, xe còn bị nhiễu khi các line trắng bị mờ hoặc line nét đứt, tuy nhiên xe vẫn tiếp tục di chuyển được với vận tốc thấp hơn.

- Phần vỏ xe chưa hoàn thiện tốt do ảnh hưởng của dịch Covid 19 không thể ra khỏi nhà để mua thêm các vật liệu cần thiết, do vậy xe chưa hoạt động được trong điều kiện thời tiết trời mưa.

Phần tấm pin năng lượng mặt trời nhóm chưa thể gắn được và chạy thử nghiệm do dịch bệnh covid 19. Và chưa thể tính tốn được thời gian hoạt động của xe dưới điều kiện thời tiết khác nhau và xem hiệu năng cũng như tính ổn định của hệ thống được

Đánh giá:

Với kết quả thử nghiệm ở trên nhóm đã thực hiện cơng đoạn đánh giá những tiêu chí đề ra đối với xe như sau:

Bảng 5.1 Bảng đánh giá tiêu chí

Tiêu chí Hồn thiện Trung Bình Chưa hồn thiện

Hoạt động ổn định. x

Trang 73 triển. Vận hành êm, rung động ít. x Ngoại hình, hình dáng. x Khả năng chuyển động Dễ sử dụng. x Dễ hiệu chỉnh. x

Hiệu quả kinh tế khi chế tạo. x Phần điện sử dụng đúng kỹ thuật, bố trí dây gọn gàng. x Phần lập trình ngắn gọn, dễ hiểu. x

- Sau khi trải qua các tiêu chí đánh giá nhận thấy xe hoạt động tốt đáp ứng các yêu cầu cơ bản đề ra.

- Nhưng bên cạnh đó xe gặp một vấn đề phát sinh đó là nhóm vẫn chưa thể lắp được pin năng lượng mặt trời và hồn thiện ngoại hình hơn

5.2 Hiệu chỉnh

Với vấn đề bị phát sinh như đã nêu ở trên thì nhóm đã thay đổi 1 số cơ cấu và phần lập trình như sau:

- Thay đổi vị trí Camera từ bên phần gương phải qua phần gương bên trái.

- Thay đổi kiểu bám line đường từ bên phải qua bám line giữa của đường, việc này giúp xe quan sát được nhiều line hơn, giảm hiện tượng bị khuất tầm nhìn của Camera.

Trang 74

CHƯƠNG VI:

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

6.1 Kết luận

Sau thời gian hơn 3 tháng rưỡi thực hiện đồ án, nhóm chúng tơi đã hồn thành được đồ án “thiết kế, mô phỏng và chế tạo xe chạy bằng năng lượng mặt trời”.

Trong suốt quá trình thực hiện đồ án đồ án, nhóm chúng tơi đã học hỏi thêm nhiều kiến thức bổ ích, như các kỹ năng gia cơng chế tạo xe, mô phỏng được các phần mềm như solidworks và mạch điện trên proteus và tìm hiểu thêm về phần xử lý ảnh. Được sự chỉ dạy tận tình của thầy Nguyễn Đỗ Minh Triết về lý thuyết cũng như thi cơng mơ hình đã giúp cho chúng tôi hiểu biết sâu sắc hơn những kiến thức chuyên ngành cũng các kiến thức khác liên quan đến đồ án này, từ đó nhóm chúng tơi đã hoàn thành được đồ án đúng tiến độ đặt ra với khối lượng công việc khơng hề nhỏ, đó là một thành cơng lớn của nhóm chúng tơi và cụ thể nhóm chúng tơi đã thực hiện được một số công việc như sau:

- Hiểu rõ hơn về hệ thống mặt trời. - Hiểu rõ hơn về công nghệ xử lý ảnh.

- Thiết kế và mô phỏng được xe thông phần mềm xử lý ảnh. - Thi cơng và chế tạo được mơ hình.

- Thiết kế được hệ thống mạch điện.

Tuy nhiên, trong quá trình thực hiện đề tài chúng em cũng gặp các trở ngại, đặc biệt nhất là do Covid 19 nên chúng em không thể ra khỏi nhà để mua thêm các vật liệu cần thiết, linh kiện điện tử cũng như là không thể gặp nhau để làm việc chung với nhau nên sản phẩm xe chưa đạt được độ thẩm mỹ cao nhất và chưa thể lắp được pin năng lượng mặt trời vào hệ thống được, về phần sản phẩm chúng tôi chỉ dừng lại ở việc tránh xe va chạm vào tường vì khơng được ra đường thử xe nhiều. Chúng tôi cũng chưa thể chạy thử nghiệm xe trong môi trường rộng hơn mà chỉ dừng lại tại chạy thử trên các đoạn đường ngắn gần nơi sinh hoạt

6.3 Những hạn chế:

Do cịn hạn chế về mặt kiến thức nên mơ hình chưa thể hồn thiện nhất mà cũng có những mặt hạn chế:

Trang 75

- Nhóm chưa thể lắp được hệ thống pin năng lượng mặt trời vào xe

- Xe chỉ có thể di chuyển khi có line đường, nếu ngồi line đường thì phải xử dụng tay cầm để điều khiển xe hoạt động và vẫn chưa tối ưu hóa được tay cầm.

- Xe chưa thể né vật cản được, chỉ có thể trách va trạm. - Chưa thể tối ưu hóa được máy tính trên xe.

- Phần vỏ chưa được hoàn thiện.

6.2 Hướng phát triển

Dựa vào nguồn kiến thức tham khảo và học hỏi. Nhóm chúng tơi nghĩ đề tài này có thể phát triển và mở rộng thêm một số khía cạnh sau:

- Hồn thiện phần vỏ có độ thẩm mỹ cao hơn.

- Lắp pin năng lượng mặt trời vào hệ thống và chạy thử nghiệm. - Tối ưu hóa các thuật tốn trên xe để xe có thể vận hành tốt hơn. - Có thể dùng xử lý ảnh để tránh vật cản.

TÀI LIỆU THAM KHẢO

[1] TS. Nguyễn Phụ Thượng Lưu, Vật liệu mới, Đại Học Công Nghệ TP.HCM. [2] ThS. Dương Kim Anh, Vẽ Autocad, Đại Học Công Nghê TP.HCM.

[3] ThS. Võ Minh Thiện, ThS. Trần Hữu Huy, Sức bền vật liệu 1, Đại Học Công Nghệ TP.HCM.

[4] ThS. Phạm Uyên Phương, Solid Works, Đại Học Công Nghệ Tp.HCM. [5] Đặng Vũ Ngoạn. Vật liệu kỹ thuật. NXB ĐHQG TPHCM, 2002.

[6] Nguyễn Xuân Phú. Vật liêu kỹ thuật điện. NXB KH&KT, 2001. [7] Ninh Đức Tốn. Dung sai và lắp ghép. NXB Giáo Dục, 2002. [8] Nguyễn Oanh. Khung gầm bệ ô tô. NXB Tổng hợp, 2007. [9] Nghiêm Hùng. Vật liệu học cô sở. NXB KH&KT, 2002.

[10] Nghiêm Hùng Kim loại học và nhiệt luyện. NXB Giáo Dục, 1993. [11] TS. Nguyễn Nước. Lý thuyết ô tô. NXB Giáo Dục, 2002.

[12] Hướng dẫn trình bày đồ án tốt nghiệp, http://www.ntu.edu.vn/Portals/7/ThongBao SinhVien/Mau%205%20-%20DATN.pdf

[13] Sơ đồ mạch điện xe chạy bằng năng lượng mặt trời, https://www.google.com/ sodomachdienxechaybangnangluongmattroi

[14] Mơ hình 3d xe, https://www.google.com/mohinh3Dchaythuxenangluongmattroi [15] Xử lý ảnh, https://viblo.asia/p/tuan-1-gioi-thieu-xu-ly-anh-yMnKMdEQ57P

PHỤ LỤC 1 Chương trình hệ thống Trên phần mềm Pycharm Chương trình main: 1. import time 2. import lanes 3. import UNO

4. from pid_controller import pid 5. pid = pid.PID(5, 10, 0)

6. if __name__ == "__main__":

7. if lanes.Select_camera() is None:

8. print("camera not found")

9. while lanes.Select_camera() is None:

10. pass

11. UNO.find_UNO_ComPort()

12. autoMode = UNO.getRunningMode()

13. while True:

14. if autoMode() == 1:

15. print("Chế độ Điều khiển tự động")

16. while autoMode() == 1:

17. sensor = UNO.sensorPacket()

18. if sensor.Front.any():

19. print("có vật cản phía trước")

20. UNO.setVet(0)

21. while sensor.Front.any():

22. pass

23. else:

24. lineOffset, StopPercent = lanes.find()

25. if lineOffset is None:

26. UNO.setVet(0)

27. while lanes.find()[0] is None:

28. pass 29. else: 30. UNO.setVet(50) 31. output = int(pid(feedback=lineOffset)) 32. if output > 30: 33. output = 30 34. if output < -30: 35. output = -30 36. UNO.setHor(output)

37. if StopPercent > 30: 38. UNO.setVet(0) 39. UNO.setHor(0) 40. time.sleep(10) 41. UNO.setVet(30) 42. while lanes.find()[1] != 0: 43. pass 44. else:

45. print("Chế độ Điều khiển bằng tay")

46. while autoMode() == 0:

47. pass

Code Xử lý ảnh xác dịnh vị trí lane đường:

1. import cv2 2. import numpy as np 3. cap = None 4. combo_image = None 5. 6. def Select_camera(): 7. global cap 8. cam_Index = 0 9. working_ports = [] 10. while True: 11. camera = cv2.VideoCapture(cam_Index) 12. if camera.isOpened():

13. is_reading, img = camera.read() 14. w = camera.get(3)

15. h = camera.get(4) 16. if is_reading:

17. print("Camera %s is working and reads images (%s x %s)" % (cam_Index,

h, w)) 18. working_ports.append(camera) 19. else: 20. break 21. cam_Index += 1 22. if cam_Index == 0: 23. return None 24. if cam_Index == 1: 25. cap = working_ports[0]

26. print("camera 0 has been selected")

27. return 0

29. while True:

30. camSelected = int(input("Select Camera ")) 31. if camSelected < cam_Index:

32. print("camera %s has been selected" % camSelected)

33. cap = working_ports[camSelected]

34. return camSelected

35. else:

36. print("camera %s is not available. Please select other one" % camSelected)

37. class rangeFilter:

38. def __init__(self, low=(0, 0, 0), up=(255, 255, 255)):

39. self.low = low

40. self.up = up

41. def setLow(self, low):

42. self.low = low

43. def setUp(self, up):

44. self.up = up

45. def canny(img):

46. gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

47. kernel = 5

48. blur = cv2.GaussianBlur(gray, (kernel, kernel), 0)

49. cannyImg = cv2.Canny(blur, 50, 100)

50. return cannyImg

51. def region_of_interest(img):

52. mask = np.zeros_like(img)

53. cv2.fillPoly(mask, interestZone, (255, 255, 255))

54. masked_image = cv2.bitwise_and(img, mask)

55. return mask, masked_image

56. def color_filter(img, color):

57. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 58. flt_mask = cv2.inRange(hsv, color.low, color.up)

59. res = cv2.bitwise_and(img, img, mask=flt_mask)

60. return res

61. def click_event(event, x, y, flags): 62. if flags == 1: 63. _y = y 64. if _y >= height: 65. _y = height - 1 66. if _y < 0: 67. _y = 0

68. blueLine[:] = [(0, _y), (width, _y)]

69. if event == cv2.EVENT_FLAG_RBUTTON:

70. greenLine[0] = (x, greenLine[0][1])

72. def crossPointCannyVsBlueLine(img, cannyImg, Blue): 73. y = Blue[0][1] 74. points = [] 75. for x in range(Blue[1][0]): 76. if cannyImg[y][x] == 255: 77. points.append((x, y))

78. for point in points:

79. img = cv2.line(img, point, point, (0, 0, 255), 2)

80. avrP = None 81. if len(points) != 0: 82. avrP = 0

83. for point in points:

84. avrP += point[0]/len(points) 85. avrP = int(avrP) 86. return avrP 87. def percentageOfStopLine(img, pt1, pt2): 88. pxCount = 0 89. for x in range(pt1[0], pt2[0]): 90. for y in range(pt1[1], pt2[1]): 91. try: 92. if (img[y][x] != (0, 0, 0)).all(): 93. pxCount += 1 94. except: 95. pass 96. pxArea = (pt2[0]-pt1[0])*(pt2[1]-pt1[1]) 97. percent = int(100*pxCount/pxArea) 98. return percent 99. def nothing(a): 100. pass 101. height = 300 102. width = 500 103. interestZone = np.array([[

104. (width*(0/3), height*(1/4)), (width*(3/3), height*(1/4)),

105. (width, height*(4/4)), (width*(0/4), height*(4/4))

]], np.int32)

106. blueLine = [(0, int(height*0.9)), (width, int(height*0.9))] 107. greenLine = [(width//2, 0), (width//2, height)]

108. x_pos = 0

109. white = rangeFilter(low=(0, 0, 200), up=(255, 14, 255)) 110. red = rangeFilter(low=(106, 21, 0), up=(188, 255, 255)) 111. avrPoint = 0

112. def find():

114. if cap is None:

115. print("cam not found")

116. return 0 117. elif(cap.isOpened()): 118. global greenLine 119. try: 120. _, frame = cap.read() 121. except: 122. exit()

123. frame = cv2.resize(frame, (width, height),

124. interpolation=cv2.INTER_AREA) 125. cv2.imshow('org', frame)

126. region_mask, cropped_Img = region_of_interest(frame)

127. filtered_img = color_filter(cropped_Img, white)

128. canny_image = canny(filtered_img)

129. clor_mask = cv2.cvtColor(canny_image, cv2.COLOR_GRAY2BGR)

130. combo_image = cv2.addWeighted(frame, 0.8, clor_mask, 0.25, 1)

131. combo_image = cv2.line(combo_image, tuple(blueLine[0]), 132. tuple(blueLine[1]), (250, 150, 0), 2)

133. combo_image = cv2.line(combo_image, greenLine[0], greenLine[1],

134. (110, 150, 0), 2)

135. setPoint = greenLine[0][0]

136. offset = None

137. re = crossPointCannyVsBlueLine(combo_image, cropped_Img, blueLine) 138. if re is not None:

139. avrPoint = re

140. offset = avrPoint - setPoint

141. redFiltered = color_filter(frame, red)

142. pt1 = (avrPoint-50, blueLine[0][1]-50) 143. pt2 = (avrPoint+50, blueLine[0][1])

144. combo_image = cv2.rectangle(combo_image, pt1, pt2, (0, 255, 0))

145. StopLineAppearedPercent = percentageOfStopLine(redFiltered, pt1, pt2)

146. cv2.imshow("cropped image", cropped_Img)

147. cv2.imshow("result", combo_image)

148. cv2.imshow('filtered', filtered_img)

149. cv2.imshow('canny', canny_image)

150. cv2.imshow('redFiltered:', redFiltered) 151. cv2.imshow('region mask', region_mask)

152. cv2.setMouseCallback('result', click_event) 153. cv2.waitKey(33)

154. return offset, StopLineAppearedPercent

1. import serial

2. import serial.tools.list_ports 3. Indentify_Request = 'IDT' 4. Indentify_pair = 'Autocar' 5. echoMode = True

6. def Send_Response(port, commmand): 7. if port is None:

8. print('Send_Response -> COMPORT not available')

9. return None 10. if not port.isOpen(): 11. port.open() 12. global echoMode 13. port.reset_input_buffer() 14. port.write((commmand+'\n').encode()) 15. echo = port.read_until(b'\r\n').decode() 16. response = port.read_until(b'\r\n').decode() 17. if len(echo) < 2:

18. print('Send_Response->echo error, echo = ', echo.encode())

19. return None 20. if len(echo) == 2: 21. echoMode = False 22. return response 23. if len(echo) > 2: 24. echoMode = True 25. if echo == (commmand+'\r\n'): 26. return response 27. else:

28. print('Send_Response->echo error, echo = ', echo.encode())

29. return None

30. class LMR:

31. def __init__(self, L, M, R):

32. self.L, self.M, self.R = L, M, R

33. def any(self):

34. return any((self.L, self.M, self.R))

35. def all(self):

36. return all((self.L, self.M, self.R))

37. class sensorPacket:

38. def __init__(self, bytePack=None):

39. if bytePack is None:

40. response = Send_Response(UNO_port, 'SSP')

41. self.sensorPack = int(response)

43. self.sensorPack = int(bytePack)

44. self.Front = LMR(self.sFL(), self.sFM(), self.sFR())

45. self.Back = LMR(self.sBL(), self.sBM(), self.sBL())

46. def sFL(self):

47. return not int((self.sensorPack >> 5) & 1)

48. def sFM(self):

49. return not int((self.sensorPack >> 4) & 1)

50.

51. def sFR(self):

52. return not int((self.sensorPack >> 3) & 1)

53. def sBL(self):

54. return not int((self.sensorPack >> 2) & 1)

55. def sBM(self):

56. return not int((self.sensorPack >> 1) & 1)

57. def sBR(self):

58. return not int((self.sensorPack >> 0) & 1)

59. UNO_port = None

60. def getElementFromStr(str=""): 61. data = []

62. lastComma = 0

63. while True:

64. nextComma = str.find(',', lastComma)

65. if nextComma == -1: 66. nextComma = len(str) 67. data.append(int(str[lastComma:nextComma])) 68. break 69. else: 70. data.append(int(str[lastComma:nextComma])) 71. lastComma = nextComma + 1 72. 73. if len(data) == 0:

74. print("no element found")

75. return data 76. def find_UNO_ComPort(): 77. global UNO_port 78. port = None 79. while True: 80. port_list = list(serial.tools.list_ports.comports()) 81. if len(port_list) == 0:

82. print("UNO not found!")

83. else:

84. for i in range(0, len(port_list)):

86. port = serial.Serial(port_list[i].name, baudrate=9600, timeout=1) 87. except:

88. print("port %s in used" % port_list[i].name)

89. continue 90. if not port.isOpen(): 91. port.open() 92. for a in range(0, 5): 93. if UNO_port is None: 94. rx = Send_Response(port, Indentify_Request) 95. if rx == Indentify_pair+'\r\n':

96. print("Arduino connected at " + port_list[i].name)

97. UNO_port = port 98. return UNO_port

99. if UNO_port is None:

100. print("UNO not found!")

101. port.close()

102. port.__del__() 103. return None

104. def getRunningMode():

105. response = Send_Response(UNO_port, 'MOD').strip()

106. return int(response)

107. def setEchoMode(val):

108. response = (Send_Response(UNO_port, 'ECH' + str(val))).strip() 109. if response != 'OK':

110. print("can't set Echo")

111. def setHor(val): 112. val += 95

113. response = (Send_Response(UNO_port, 'HOR'+str(val))).strip()

114. if response == 'OK':

115. return response

116. else:

117. print("can't set Hor")

118. def setVet(val):

119. response = Send_Response(UNO_port, 'VET'+str(val)).strip()

120. if response == 'OK':

121. return response

122. else:

123. print(response.encode())

124. print("can't set Ver")

125. def UNO_Init(): 126. global UNO_port

127. UNO_port = find_UNO_ComPort()

129. print("UNO COM port not found:")

130. return False

131. setEchoMode(0) 132. return True

Code điều khiển Arduino:

Giao tiếp qua Cổng COM với máy tính:

1. #ifndef _RC_RECEIVER_ 2. #define _RC_RECEIVER_ 3. #include <stdint.h> 4. #include <Arduino.h> 5. #include <TimerOne.h> 6. #include <SimpleKalmanFilter.h> 7. #define Horizontal 6 8. #define Vertical 5 9. #define SW_Gear 7 10. #define offsetH 0

Một phần của tài liệu Thiết kế, mô phỏng và chế tạo mô hình xe điện sử dụng năng lượng mặt trời (Trang 80)

Tải bản đầy đủ (PDF)

(141 trang)