TỔNG QUAN VỀ HỆ THỐNG
Lịch sử nghiên cứu
Thế giới hiện đang đối mặt với nhiều thách thức lớn về kinh tế xã hội, tiến bộ khoa học công nghệ và biến đổi khí hậu Trong bối cảnh công nghệ 4.0, độ chính xác trở thành tiêu chí hàng đầu, đặc biệt tại Việt Nam, nơi an toàn và chính xác ngày càng được chú trọng, nhất là ở các thành phố lớn và các dự án quy mô lớn Do đó, nghiên cứu và phát triển các máy móc, hệ thống có độ chính xác và an toàn cao đang diễn ra mạnh mẽ, thu hút sự quan tâm từ cả các quốc gia phát triển và đang phát triển trên toàn cầu.
Theo sự tiến bộ của công nghệ, thiết bị đo tốc độ đã trải qua nhiều cải tiến đáng kể Từ những thước đo tốc thô sơ cách đây năm trăm năm, giờ đây chúng ta đã phát triển các thiết bị hiện đại sử dụng điện, cho phép đo tốc độ với độ chính xác cao Những thiết bị này có ứng dụng rộng rãi trong nhiều loại máy móc công nghiệp hiện đại.
Ngày nay, nhiều quy trình công nghiệp sử dụng thiết bị máy móc công nghệ cao, trong đó cảm biến đo tốc độ đóng vai trò quan trọng Không chỉ giúp đo tốc độ, cảm biến này còn có ứng dụng như cảnh báo tốc độ giới hạn Trong ngành công nghiệp, việc theo dõi tốc độ máy móc là cần thiết để đảm bảo an toàn và kiểm soát các điều kiện hoạt động của thiết bị.
Sơ lược về hệ thống đo tốc độ
Hệ thống đo tốc độ thiết bị bao gồm các bộ phận có chức năng đo tốc độ và cảnh báo khi vượt quá giới hạn quy định Hiện nay, hầu hết các hệ thống máy móc công nghiệp đều sử dụng thiết bị này để đảm bảo an toàn và hiệu suất hoạt động.
Mục tiêu đề tài
- Điều khiển tốc độ động cơ điện 1 chiều bằng núm xoay, Winform PC
- Đo tốc độ động cơ
- Hiển thị tốc độ theo thời gian thực trên màn hình LCD
- Có chức năng lựa chọn giới hạn mức tốc độ trên và dưới để đưa ra cảnh báo khi giá trị mức vượt ngoài khoảng cho phép.
Phương pháp nghiên cứu
Phương pháp nghiên cứu lý thuyết
- Dựa vào kiến thức đã được học, tìm hiểu qua internet, sách vở và tham khảo ý kiến bạn bè, thầy cô
- Tìm hiểu những hệ thống đo tốc độ trên thực tế phổ biến để học hỏi cách thiết kế chi tiết, cấu tạo tối ưu nhất có thể
- Tìm hiểu phương pháp xây dựng hệ thống điều khiển và chương trình điều khiển
- Tìm hiểu các phần mền lập trình để hỗ trợ như:Visual Studio, STM, Altium desginer, Keil uVision5
Phương pháp nghiên cứu và thực nghiệm
Để hoàn thiện hệ thống, cần chú trọng vào từng thành phần như bộ phận cảm biến, hiển thị số liệu tốc độ, đèn cảnh báo quá giới hạn, bộ phận nhập tốc độ giới hạn và vi điều khiển.
Mô hình hóa và tính toán thiết kế mô hình cơ khí là quá trình quan trọng nhằm đảm bảo độ chính xác và độ bền cần thiết cho hệ thống, đáp ứng tốt nhất các yêu cầu của người sử dụng.
-Sử dụng phần mềm STM thiết lập chương trình điều khiển
- Kiểm tra chương trình code cho hệ cho hệ thống điều khiển
Để đảm bảo độ an toàn và độ chính xác của hệ thống, việc tính toán và thiết kế là rất quan trọng, từ đó giúp lựa chọn các thiết bị phù hợp như động cơ điện 1 chiều.
- Cho hệ thống hoạt động và chỉnh sửa những chi tiết chưa phù hợp.
Dự kiến kết quả
Nghiên cứu về động cơ có gắn sẵn encoder và động cơ không gắn encoder sử dụng Arduino Uno R3 với chip dán, cùng bộ điều chỉnh tốc độ L298, giúp tối ưu hóa việc điều khiển tốc độ thông qua tín hiệu PWM Các kiến thức này được tổng hợp từ tài liệu trong thư viện và các nguồn thông tin trên internet.
Cơ sở tính toán và liên kết các mô hình mô phỏng một cách linh hoạt, sáng tạo và khoa học là yếu tố quan trọng để xây dựng một hệ thống hoàn chỉnh Điều này không chỉ tạo tiền đề cho việc chế tạo mô hình của hệ thống mà còn nâng cao hiệu quả và độ chính xác trong quá trình phát triển.
-Kích thước đưới dạng mô hình thực nghiệm
-Tốc độ động cơ từ 0 đến 1500v/p
- Công suất động cơ 10W và có điện áp động cơ 12VDC
-Encoder tương đối có độ phân giải lớn hơn 100 xung/vòng
-Bộ điều khiển vi xử lý Arduino Uno R3 chíp dán Ý nghĩa thực tiễn
Hệ thống đo tốc độ bằng cảm biến encoder và điều khiển tốc độ bằng PWM đóng vai trò quan trọng trong sự phát triển của khoa học và công nghệ Việc ứng dụng hệ thống này vào máy móc công nghiệp và thiết bị công nghệ trong đời sống không chỉ nâng cao hiệu quả làm việc mà còn đảm bảo an toàn cho người lao động Điều này đã thúc đẩy nhóm nghiên cứu tìm hiểu sâu hơn về cách thiết kế, chế tạo và tối ưu hóa hệ thống để đáp ứng đầy đủ các yêu cầu đề ra.
Hệ thống đo và điều chỉnh tốc độ sử dụng cảm biến encoder tương đối đóng vai trò quan trọng trong đời sống, phản ánh sự phát triển và ứng dụng của công nghệ trong thiết kế, chế tạo và thử nghiệm hệ thống điều khiển Nghiên cứu này không chỉ giúp hiểu rõ hơn về quy trình phát triển mà còn chỉ ra phạm vi và giới hạn của hệ thống, từ đó cung cấp giải pháp cho các vấn đề thực tiễn và ứng dụng trong các đồ án sau này.
XÂY DỰNG MÔ HÌNH HỆ THỐNG
Cấu tạo mô hình
Thiết bị Loại sử dụng
Encoder tương đối 600 xung/vòng Động cơ DC Motor 775
Bộ điều khiển Arduino Uno R3 chíp dán
Hiển thị thông tin Ứng dụng Winform PC
Phím chức năng nhập dữ liệu Ứng dụng Winform PC
Mạch điều khiển động cơ Mạch cầu H-43A BTS7960
Tín hiệu cảnh báo Đèn, Ứng dụng Winform PC
Nguồn Nguồn tổ ong 12v 15A Đặc tính kỹ thuật
Bảng 2- Thông số kỹ thuật
Thông số Giá trị Điện áp hoạt động Max 12VDC
Dòng điện tiêu thụ Max 10A
Nguồn tổ ong biến đổi điện áp từ 220V AC về 12V DC
Mạch cầu H-43A BTS7960 biến đổi nguồn 12V về 3-4.5V
Màn hình Winform PC giúp hiện thị tốc độ đọng cơ và giới hạn của nó
Led/ứng dụng Winform PC giúp cảnh báo khi tốc độ nằm ngoài khoảng giá trị Khối điều khiển
Arduino Uno R3 là một chip MCU điều khiển hệ thống, nhận tín hiệu từ encoder và động cơ, hiển thị dữ liệu trên LCD hoặc PC, đồng thời tạo xung PWM cho driver động cơ.
Mạch cầu H-43ABTS1960 tạo dead time, chống quá nhiệt, quá áp, quá dòng, sụt áp và ngắn mạch
Winform PC để nhập giá trị các giới hạn của tốc độ động cơ
Encoder tương đối dùng để đo tốc độ động cơ
Khối cơ cấu chấp hành: Động cơ tạo chuyển động quay để đo tốc độ
Nguyên lý hoạt động
Nguồn tổ ong biến đổi điện áp từ 220V xoay chiều về 12V một chiều rồi cung cấp cho Mạch cầu H-43ABTS1960
Mạch cầu H-43ABTS1960 nhận điện áp 12V từ nguồn tổ ong sau đó chuyển đổi điện áp từ 12V về 4,8V để cấp nguồn cho Arduino Uno R3 chíp dán
Mạch cầu H-43ABTS1960 nhận và truyền thông tin để điều khiển hệ thống, cấp nguồn cho LCD, ENCODER, VR
7 Ở mô hình này , nhóm có tích hợp chương trinh điều khiển thành một bảng Điều khiển Control Panel để điều khiển mô hình một cách dễ dàng
Hình 1- Giao diện điều khiển Control Ardunio App
Hình 2- Sơ đồ khối mô hình
Phân tích lựa chọn thiết bị
3.1 Động cơ Động cơ được chia làm hai loại: Động cơ có gắn sẵn Encoder và động cơ thường không gắn Encoder Động cơ có gắn sẵn encoder
Sử dụng động cơ có gắn sẵn enconder để thuận tiện trong việc thực hiện và có tính đồng bộ cao
Hình 3 Động cơ tích hợp encoder
Stato của động cơ điện 1 chiều bao gồm một hoặc nhiều cặp nam châm vĩnh cửu hoặc nam châm điện Rotor được trang bị các cuộn dây quấn và kết nối với nguồn điện một chiều Một phần quan trọng khác của động cơ điện 1 chiều là bộ phận chỉnh lưu, có nhiệm vụ đổi chiều dòng điện trong quá trình rotor quay liên tục Bộ phận này thường bao gồm một bộ cổ góp và một bộ chổi than tiếp xúc với cổ góp.
Pha 1: Từ trường của rotor cùng cực với stator, sẽ đẩy nhau tạo ra chuyển động quay của rotor
Pha 2: Rotor tiếp tục quay
Pha 3: Bộ phận chỉnh điện sẽ đổi cực sao cho từ trường giữa stator và rotor cùng dấu, trở lại pha 1
Hình 7 Chuyển động của động cơ
Khi trục của một động cơ điện một chiều bị kéo bằng lực ngoài, động cơ sẽ hoạt động như một máy phát điện một chiều, tạo ra sức điện động cảm ứng (EMF) Trong quá trình vận hành bình thường, rotor quay sẽ phát ra điện áp gọi là sức phản điện động (CEMF), đối kháng lại điện áp bên ngoài Sức điện động này tương tự như khi động cơ hoạt động như một máy phát điện, ví dụ khi nối điện trở tải vào đầu ra và kéo trục động cơ bằng ngẫu lực bên ngoài Do đó, điện áp đặt lên động cơ bao gồm hai thành phần: sức phản điện động và điện áp giáng do điện trở nội của cuộn dây phần ứng tạo ra.
Các thông số của động cơ
Trục động cơ: trục 8mm Điện áp: 12V – 24V
Tốc độ vòng tua: 11300-22600RPM
Encoder phân giải: 200 xung áp 5v
Thứ tự từ trái qua phải: B-VCC-A-GND
Một số cách đo tốc độ động cơ
Tốc độ kế điện từ đo vận tốc góc
Tốc độ kế dòng xoay chiều
Tốc độ kế từ trở biến thiên
Tốc độ kế quang ( encoder) Động cơ thường Motor 775
Motor 775 là loại động cơ cỡ nhỏ sử dụng nguồn điện một chiều DC từ 12V-36V Chủ yếu được sản xuất từ Trung Quốc
Motor 775 được đặt tên dựa trên kích thước của nó, với đường kính trục là 5mm Dòng motor này có nhiều loại với công suất và kích thước khác nhau, phù hợp với nhiều nhu cầu sử dụng.
Chiều dài motor: 66.7mm Đường kính mặt tròn trước trục: 17.5mm Độ cao của mặt tròn trước trục: 4mm Đường kính motor: 42mm
Chiều dài tổng thể của động cơ: 98mm
Hình 8 Sơ đồ động cơ và encoder
Kích thước vít cố định motor: M4
Mô men xoắn: 2kg.cm hoặc 0.2N.M
Motor 775 có một phần lõi là Roto được ghép bởi 5 miếng kim loại và có dây đồng quấn xung quanh thành các vòng tròn
Phần vỏ có 2 cục nam châm to (là phần Stato), phần này không quay
Hiểu đơn giản là khi có dòng điện chạy qua thì roto sẽ tạo ra từ trường với stato và làm quay trục động cơ
Khi chọn nguồn cho dòng motor này, cần lưu ý sử dụng nguồn có điện áp từ 12V đến 24V Để motor hoạt động hiệu quả, dòng điện tối thiểu cần cung cấp là 5mAh.
Hình 9- Động cơ không tích hợp Encoder
Encoder là một bộ phận rất quan trọng trong sơ đồ cấu tạo của máy CNC
Bộ phận này tương tự như công tơ mét trên xe máy hoặc ô tô, có chức năng đo lường và hiển thị các thông số về tốc độ của máy, giúp người sử dụng nắm bắt thông tin thông qua hệ thống giám sát của máy tính điều khiển.
Encoder trong các hệ thống điều khiển tự động là thiết bị đo lường dịch chuyển thẳng hoặc góc, chuyển đổi vị trí góc và vị trí thẳng thành tín hiệu nhị phân.
Encoder có nhiều xuất xứ và chủng loại khác nhau, nhóm sẽ phân loại chúng theo
Encoder tuyệt đối (adsolute encoder): sử dụng đĩa theo mã nhị phân hoặc mã Gray
Encoder tương đối (encremental encoder): có tín hiệu tăng dần hoặc theo chu kỳ
Trong nghiên cứu, nhóm đã quyết định sử dụng encoder tương đối để đo tốc độ động cơ, phù hợp với yêu cầu của đề tài và tính phổ biến của nó trong đời sống Encoder tương đối có nhiều ưu điểm như giá thành rẻ, dễ chế tạo và thuận tiện trong việc xử lý tín hiệu trả về.
Nhược điểm: dễ bị sai lệch về xung khi trả về Sẽ tích lũy sai số khi hoạt động lâu dài
Bộ mã hóa, hay còn gọi là encoder, là thiết bị cơ điện có chức năng chuyển đổi vị trí góc hoặc chuyển động của trục thành tín hiệu đầu ra analog hoặc kỹ thuật số Nó được sử dụng để phát hiện vị trí, hướng di chuyển và tốc độ của động cơ thông qua việc đếm số vòng quay của trục.
Trong máy CNC, encoder đóng vai trò quan trọng trong gia công cơ khí chính xác tự động Thiết bị này giúp điều khiển và xác định các góc quay của dao hoặc bàn gá, đồng thời hiển thị thông tin trên máy tính về độ dài đường thẳng hoặc góc quay cụ thể.
Trong robot tự động, encoder đóng vai trò quan trọng trong việc xác định tọa độ cánh tay robot Ngoài ra, encoder còn được ứng dụng rộng rãi trong các thiết bị như thang máy, máy cán tôn, máy cắt thép, máy dán tem sản phẩm và băng tải băng chuyền.
Encoder được cấu tạo chủ yếu từ một đĩa quang tròn có rãnh nhỏ quay quanh trục Đĩa này có các lỗ (rãnh) được đục sẵn, và khi đĩa quay kết hợp với ánh sáng từ đèn LED chiếu lên, sẽ xảy ra hiện tượng ngắt quãng Các rãnh trên đĩa giúp chia vòng tròn 360 độ thành các góc đều nhau, và một đĩa có thể chứa nhiều dãy rãnh tính từ tâm.
Bộ cảm biến thu (photosensor)
Khi đĩa quay quanh trục, các rãnh trên đĩa cho phép ánh sáng từ đèn LED chiếu qua Những rãnh này tạo ra tín hiệu quang, nơi ánh sáng có thể xuyên qua, trong khi các khu vực không có rãnh ngăn cản ánh sáng Tín hiệu có hoặc không được ghi nhận dựa trên việc ánh sáng từ đèn LED có chiếu qua hay không.
Số xung của Encoder được xác định bởi số lần ánh sáng đi qua các khe trên đĩa Chẳng hạn, nếu đĩa có 100 khe, thì mỗi vòng quay, encoder sẽ ghi nhận 100 tín hiệu Nguyên lý này áp dụng cho loại Encoder cơ bản, trong khi các loại Encoder khác có thể có đĩa với nhiều lỗ hơn, dẫn đến tín hiệu thu nhận cũng sẽ khác biệt.
Hình 11 Hình minh họa encoder
Cảm biến thu ánh sáng sẽ bật tắt liên tục, từ đó:
Tạo ra các tín hiệu dạng xung vuông
Tín hiệu dạng xung được gửi đến bộ xử lý trung tâm để thực hiện việc đo đạc và xác định vị trí cũng như tốc độ của động cơ Ứng dụng này đặc biệt quan trọng trong việc biểu thị tốc độ của động cơ.
Khi máy bơm kết nối với biến tần để bơm chất lỏng vào bồn chứa, tốc độ dòng chảy của chất lỏng cần phải đạt một mức nhất định Encoder gắn liền với biến tần sẽ cung cấp phản hồi về tốc độ thực tế của dòng chảy, từ đó giúp cải thiện hiệu quả trong việc đo lường và kiểm soát quá trình bơm.
Phân tích và lựa chọn bộ điều khiển
Arduino đang trở thành một công cụ phổ biến trên toàn cầu, với nhiều ứng dụng sáng tạo trong cộng đồng mã nguồn mở Tuy nhiên, tại Việt Nam, Arduino vẫn chưa được nhiều người biết đến Bài viết này nhằm mục đích giới thiệu và nâng cao nhận thức về Arduino trong cộng đồng Việt Nam.
Arduino là một nền tảng mạnh mẽ dành cho những người đam mê DIY, cung cấp nhiều cơ hội để thực hiện các dự án sáng tạo Với khả năng lập trình linh hoạt và các linh kiện phong phú, Arduino giúp người dùng dễ dàng thiết kế và phát triển các sản phẩm điện tử độc đáo Thông qua việc tìm hiểu và sử dụng Arduino, người dùng có thể mở rộng kiến thức và kỹ năng trong lĩnh vực công nghệ, từ đó hiện thực hóa những ý tưởng sáng tạo của mình.
Arduino đã tạo ra một cú sốc lớn trong thị trường DIY toàn cầu, tương tự như thành công của Apple trong lĩnh vực thiết bị di động Sự phổ biến của Arduino đã thu hút một lượng người dùng đông đảo, từ học sinh phổ thông đến sinh viên đại học, khiến ngay cả những người sáng lập cũng phải ngạc nhiên về mức độ lan tỏa của nó.
Arduino là một bo mạch vi xử lý cho phép lập trình tương tác với các thiết bị khác Điểm nổi bật của Arduino là môi trường phát triển ứng dụng dễ sử dụng, với ngôn ngữ lập trình thân thiện, giúp người mới bắt đầu dễ dàng tiếp cận Giá thành thấp và tính chất nguồn mở cũng là những yếu tố quan trọng góp phần vào sự phổ biến của Arduino.
20 cứng tới phần mềm Chỉ khoảng $30, người dùng đã có thể sở hữu một bo Arduino có 20 ngõ I/O có thể tương tác và điều khiển chừng ấy thiết bị
Arduino được ra đời tại thị trấn Ivrea, Ý, và được đặt theo tên vua Arduin từ thế kỷ 9 Được giới thiệu vào năm 2005 như một công cụ dành cho sinh viên của giáo sư Massimo Banzi tại trường Interaction Design Institute Ivrea, Arduino nhanh chóng thu hút sự chú ý mặc dù không được tiếp thị nhiều Tin tức về Arduino lan truyền mạnh mẽ nhờ sự truyền miệng tích cực từ những người dùng đầu tiên Hiện nay, Arduino đã trở nên nổi tiếng đến mức nhiều người tìm đến Ivrea để tham quan nơi sản sinh ra sản phẩm này.
Khả năng của bo mạch Arduino:
Bo mạch Arduino sử dụng vi xử lý 8-bit megaAVR của Atmel, chủ yếu là ATmega328 và ATmega2560 Những vi xử lý này cho phép lập trình các ứng dụng điều khiển phức tạp nhờ vào cấu hình mạch với các loại bộ nhớ như ROM, RAM và Flash Bo mạch còn được trang bị nhiều ngõ vào ra digital I/O, trong đó có các ngõ có khả năng xuất tín hiệu PWM, cùng với khả năng đọc tín hiệu Analog và hỗ trợ nhiều chuẩn giao tiếp như UART, SPI và TWI (I2C).
EEPROM:1KB(ATmega328) và 4KB (ATmega2560)
SRAM:2KB(ATmega328) và 8KB (ATmega2560)
Flash:32KB (ATmega328) và 256KB(ATmega2560) Đọc tín hiệu cảm biến ngõ vào:
Các bo mạch Arduino trang bị cổng digital có khả năng cấu hình linh hoạt thành ngõ vào hoặc ngõ ra thông qua phần mềm Điều này cho phép người dùng tùy chỉnh số lượng ngõ vào và ngõ ra theo nhu cầu Đặc biệt, các mạch sử dụng vi điều khiển Atmega328 có tổng số lượng cổng digital nhất định.
Các bo mạch Arduino được trang bị các ngõ vào analog với độ phân giải 10-bit, cho phép chia nhỏ tín hiệu thành 1024 mức khác nhau, tương đương với độ phân giải khoảng 0.5mV khi sử dụng điện áp chuẩn 5V Bo mạch Atmega328 có 6 cổng vào analog, trong khi Atmega2560 có tới 16 cổng Tính năng đọc analog này giúp người dùng có thể kết nối và thu thập dữ liệu từ nhiều loại cảm biến khác nhau như cảm biến nhiệt độ, độ ẩm, áp suất, ánh sáng, gyro và accelerometer.
Xuất tín hiệu điều khiển ngõ ra:
Người dùng có thể cấu hình phần mềm để chọn ngõ digital nào làm ngõ ra, tương tự như các cổng vào digital Trên mạch sử dụng Atmega328, tổng số cổng digital là 14, trong khi đó Atmega 2560 có tới 54 cổng digital.
Trong các cổng digital, người dùng có thể chọn cổng xuất tín hiệu PWM với độ phân giải 8bit Bo mạch ATmega328 có 6 cổng PWM, trong khi ATmega2560 có 14 cổng PWM được ứng dụng rộng rãi trong viễn thông, xử lý âm thanh và điều khiển động cơ, đặc biệt là động cơ servos trong máy bay mô hình Các bo Arduino trang bị nhiều cổng Serial cứng, với ATmega328 có 1 cổng và ATmega2560 có 4 cổng Tất cả cổng digital còn lại hỗ trợ giao tiếp nối tiếp bằng phần mềm, với mức tín hiệu TTL 5V, trong khi cổng RS-232 trên thiết bị hoặc PC sử dụng mức tín hiệu UART 12V, yêu cầu bộ chuyển đổi như chip MAX232 để giao tiếp giữa hai mức tín hiệu Nhờ tính năng giao tiếp nối tiếp, các bo Arduino có khả năng kết nối với nhiều thiết bị như PC, màn hình cảm ứng và các game console.
Các bo Arduino tiêu chuẩn đều có các trang bị một cổng USB để thực hiện kết nối với máy tính dùng cho việc tải chương trình
Các chip AVR không tích hợp cổng USB, vì vậy các bo mạch Arduino cần có bộ chuyển đổi từ USB sang tín hiệu USART Do đó, máy tính nhận diện cổng USB này như một cổng COM thay vì cổng USB tiêu chuẩn.
SPI là chuẩn giao tiếp nối tiếp đồng bộ với bus 4 dây, cho phép các bo Arduino kết nối dễ dàng với nhiều thiết bị như màn hình LCD, bộ điều khiển video game, cảm biến và đọc thẻ nhớ SD, MMC.
Giao tiếp TWI (I2C) là một chuẩn đồng bộ với chỉ hai dây, cho phép các bo Arduino kết nối với nhiều loại cảm biến như thermostat CPU, tốc độ quạt, màn hình OLED/LCD, đọc đồng hồ thời gian thực và điều chỉnh âm lượng cho một số loa.
Môi trường lập trình Arduino nổi bật với thiết kế bo mạch gọn gàng và tích hợp nhiều tính năng hữu ích, mang lại nhiều lợi thế cho người dùng Tuy nhiên, sức mạnh thực sự của Arduino nằm ở phần mềm, với môi trường lập trình đơn giản và dễ sử dụng Ngôn ngữ lập trình Wiring, dựa trên C/C++, rất quen thuộc với kỹ sư, giúp người dùng nhanh chóng làm quen và phát triển dự án Đặc biệt, số lượng thư viện code được viết sẵn và chia sẻ bởi cộng đồng mã nguồn mở rất phong phú, hỗ trợ tối đa cho việc lập trình và phát triển ứng dụng.
Môi trường lập trình Arduino IDE hỗ trợ ba nền tảng phổ biến: Windows, Macintosh OSX và Linux Là một phần mềm mã nguồn mở, Arduino IDE hoàn toàn miễn phí và cho phép người dùng có kinh nghiệm mở rộng thêm tính năng Ngôn ngữ lập trình trong Arduino IDE có thể được mở rộng thông qua các thư viện C++, và do dựa trên ngôn ngữ C của AVR, người dùng có thể dễ dàng nhúng mã viết bằng AVR C vào chương trình của mình.
Các loại bo mạch Arduino:
CHẾ TẠO VÀ THỬ NGHIỆM HỆ THỐNG 31 1 Tổng quan mô hình
Chế tạo các bộ phận cơ khí
Thiết kế giá đỡ cho động cơ và encoder
1 tấm nhựa hình chữ nhật 30x30x1 cm
Tấm thép hình chữ nhật được uốn thành
2 mặt vuông góc với nhau như hình vẽ
Hình 22 Giá đỡ encoder và động cơ
Lưu đồ thuật toán
Hình 23 Lưu đồ thuật toán điều khiển
Chương trình điều khiển
Chương trình điều khiển được xây dựng trên 2 phầm mềm và tích hợp một Control Panel để thuận tiện cho việc điểu khiển mô hình
Hình 24 Cấu hình vi điều khiển trên phầm mềm Visual Studio
Trong mô hình này, nhóm đã tích hợp chương trình điều khiển vào một bảng Điều khiển (Control Panel), giúp người dùng dễ dàng điều khiển mô hình Arduino.
Thử nghiệm và đánh giá hệ thống
Thử nghiệm, lỗi và khắc phục
Sai chân nối vào keypad Đã sửa nối lại đúng
Tốc độ động cơ chậm hơn so với bình thường Đã sửa lại code
Lỗi chương trình kết nối với Control Arduino App Đã sửa lại
Lỗi trong việc tính toán tốc độ vòng quay đã được khắc phục bằng cách bổ sung tính năng tính tốc độ vòng quay trung bình mỗi phút để so sánh Ngoài ra, khớp nối lò xo (Coupling) cũng cần được cố định chắc chắn hơn để đảm bảo hiệu suất của hệ thống.
Về tốc độ khá ổn định với sai số: ±10 v/p (< 5%)
Động cơ có tốc độ tối đa lên đến 2000 rpm và được trang bị hệ thống cảnh báo bằng đèn LED khi tốc độ vượt quá giới hạn cho phép Ngoài ra, động cơ còn tính toán được tốc độ trung bình mỗi phút để so sánh với tốc độ thực tế.
Sau khi hoàn thành thiết kế và chế tạo mô hình, hệ thống đo và điều khiển tốc độ động cơ sử dụng encoder tương đối đã được phát triển Mô hình này hiển thị tốc độ động cơ trên màn hình LCD và giao diện Winform trên máy tính Ngoài ra, hệ thống còn tích hợp tính năng cảnh báo bằng đèn LED khi tốc độ động cơ vượt quá giới hạn đã được cài đặt.
Mô hình của nhóm vẫn còn một yêu cầu chưa đáp ứng được
Tốc độ tối đa mà động cơ có thể đạt được là 6000 vòng/phút, tuy nhiên, do hạn chế về kết cấu cơ khí và linh kiện kết nối, nhóm đã quyết định giới hạn đo trong khoảng 0-3000 vòng/phút.
Còn những yêu cầu khác: đo, điều khiển tốc độ động cơ, hiển thị lên LCD,Winform
Nhóm đã phát triển thành công hệ thống cảnh báo bằng đèn khi tốc độ vượt quá giới hạn cho phép Qua quá trình nghiên cứu, nhóm đã nắm vững nguyên lý hoạt động của encoder, động cơ điện một chiều, và LCD, cũng như cách đo tốc độ động cơ thông qua encoder Đồng thời, nhóm cũng đã tìm hiểu về Arduino Uno R3 để áp dụng vào dự án.
1 https://tapit.vn/tong-hop-cac-bai-huong-dan-lap-trinh-vi-dieu-khien-s http://arduino.vn/reference/howto
2 Lê Ngọc Duy, Bùi Thanh Lâm & Nhữ Quý Thơ Giáo trình cảm biến và hệ thống đo Hà Nội: Trường DHCN Hà Nội, 2019
PHỤ LỤC Chương trình điều khiển
The article discusses the use of the standard library in C#, highlighting essential namespaces such as System, System.Collections.Generic, System.ComponentModel, System.Data, System.Drawing, System.Linq, System.Text, System.Windows.Forms, System.Threading, and System.Threading.Tasks These namespaces provide a wide range of functionalities for developing robust applications, including data manipulation, user interface design, and asynchronous programming Understanding and utilizing these libraries is crucial for effective software development in C#.
//Add SerialPort library using System.IO; using System.IO.Ports; using System.Xml; namespace ControlArduino
{ public partial class ControlPanel : Form
3 string[] strBaudRate = { "9600" }; string[] strGate = { "COM1", "COM2", "COM3", "COM4",
"COM5","COM6", "COM7", "COM8", "COM9", "COM10" }; string[] strChar = { "U", "D", "N", "R", "S", "L" }; string[] strArrList = { "", "" ,""}; string strRecived = ""; string strCurPos = ""; string strCurRpm = ""; string strCur_Revolution_Cnt = "";
// ******************************************************* int intRPM_Limit = 0; int intRpm_Compare = 0; int intRPM_Old = 0; int intRPM_New = 0; int intRPM_Out = 0; int intMinute = 0;
// ******************************************************* bool bNormal_Click = false; bool bReverse_Click = false;
// ******************************************************* // The function checks whether the string is numeric or not public bool IsNumeric(string strText)
4 char[] chars = strText.ToCharArray(); foreach (char Symbol in chars)
{ if (!char.IsNumber(Symbol)) return false;
// ******************************************************* // Initialize cb_Gate.Items.AddRange(strGate); cb_Baurate.Items.AddRange(strBaudRate);
// ******************************************************* cb_Gate.Text = "Chose here"; cb_Baurate.Text = "Chose here"; txt_RpmLimit.Text = "0"; lb_ConnectionStatus.Text = ("DisConnected!"); lb_ConnectionStatus.ForeColor = Color.Red;
// ******************************************************* strRecived = ""; intRPM_Limit = 0; intRpm_Compare = 0; bNormal_Click = false; bReverse_Click = false;
// ******************************************************* //Recived from Arduino private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ strRecived = ""; intRpm_Compare = 0; strRecived = serialPort.ReadLine(); strRecived = strRecived.Replace("\r", string.Empty); strArrList = strRecived.Split(new char[] { ',' }); strCurPos = strArrList[0]; strCurRpm = strArrList[1]; strCur_Revolution_Cnt = strArrList[2]; intRpm_Compare = int.Parse(strCurRpm);
//Caculate Angle float fltCurPos = float.Parse(strCurPos); float Result = fltCurPos * 360 / 600; string strCurAngle = Result.ToString("0.00");
//******************************************************* txt_CurRpm.Text = strCurRpm; txt_CurPositon.Text = strCurPos; txt_CurDegree.Text = strCurAngle; txt_CurRevolutionCnt.Text = strCur_Revolution_Cnt;
// ******************************************************* //Send to Arduino public void SendtoArduino(string text)
// ******************************************************* // Send to Arduino if (serialPort.IsOpen)
// ******************************************************* public void CompareRPM(int intInput)
// ******************************************************* // Compare Rpm if (intInput >= intRPM_Limit)
{ txt_CurRpm.BackColor =Color.Red; lb_PopUp.Text = "Over speed limit!"; lb_PopUp.ForeColor = Color.Red;
{ txt_CurRpm.BackColor = Color.White; lb_PopUp.Text = "";
// ******************************************************* // Counter round timer private void StopWatch_Tick(object sender, EventArgs e)
{ txt_StopWatch.Text = intMinute.ToString(); if (intMinute == 0)
StopWatch.Stop(); txt_StopWatch.Text = "59"; intRPM_New = int.Parse(txt_CurRevolutionCnt.Text); intRPM_Out = intRPM_New - intRPM_Old; txt_RPMOut.Text = intRPM_Out.ToString();
} private void btn_Connect_Click(object sender, EventArgs e)
// ******************************************************* // Check Port's parameter if (cb_Gate.Text == "Chose here" && cb_Baurate.Text == "Chose here") {
MessageBox.Show("Please! choose Gate and BaudRate\n then click Apply again", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
} else if (cb_Gate.Text == "Chose here" || cb_Baurate.Text == "Chose here")
{ if (cb_Gate.Text == "Chose here")
MessageBox.Show("Please! choose Gate\n then click Apply again",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
} if (cb_Baurate.Text == "Chose here")
MessageBox.Show("Please! choose BaudRate\n then click Apply again", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Open the Port if (!serialPort.IsOpen)
// Setting Port's parameter serialPort.PortName = cb_Gate.Text; serialPort.BaudRate = int.Parse(cb_Baurate.Text);
MessageBox.Show("Please! Connect the caple", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
{ btn_Connect.BackColor = Color.Orange;
11 btn_Connect.Text = ("Disconnect!"); lb_ConnectionStatus.Text = ("Connected!"); lb_ConnectionStatus.ForeColor = Color.Black;
// Close the Port else if (serialPort.IsOpen)
// Popup Status Disconnect if (!serialPort.IsOpen)
{ btn_Connect.BackColor = Color.Green; btn_Connect.Text = ("Connect!"); lb_ConnectionStatus.Text = ("DisConnected!"); lb_ConnectionStatus.ForeColor = Color.Black;
// reset data txt_CurRpm.Text = ""; txt_CurPositon.Text = ""; txt_CurDegree.Text = ""; txt_CurDirection.Text = ""; txt_CurRevolutionCnt.Text = "";
} private void btn_Apply_Click(object sender, EventArgs e)
// ******************************************************* // Handling RPM limit if (txt_RpmLimit.Text != "")
{ if (IsNumeric(txt_RpmLimit.Text) == true)
// Get value intRPM_Limit = int.Parse(txt_RpmLimit.Text); if ((intRPM_Limit < 0))
MessageBox.Show("RpmLimit isn't suitable'", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
MessageBox.Show("Please! Input number'", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// ******************************************************* //Control Button private void btn_SpeedUp_Click(object sender, EventArgs e)
} private void btn_SpeedDown_Click(object sender, EventArgs e)
} private void btn_Normal_Click(object sender, EventArgs e)
{ if (bReverse_Click == false || intRpm_Compare ==0 )
SendtoArduino(strChar[2]); bNormal_Click = true;
MessageBox.Show("Please! Stop motor before changing direction",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
} private void btn_Reverse_Click(object sender, EventArgs e)
{ if (bNormal_Click == false || intRpm_Compare == 0)
SendtoArduino(strChar[3]); bReverse_Click = true;
MessageBox.Show("Please! Stop motor before changing direction",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
} private void btn_Stop_Click(object sender, EventArgs e)
SendtoArduino(strChar[4]); bNormal_Click = false; bReverse_Click = false;
// ******************************************************* // Start StopWatch 60 seconds private void btn_StopWatchStart_Click(object sender, EventArgs e)
{ intMinute = int.Parse(txt_StopWatch.Text);
StopWatch.Start(); intRPM_Old = int.Parse(txt_CurRevolutionCnt.Text);
//Int int intCurPosition = 0; int intEncPos = 0; int intNewpos = 0; int intOldpos = 0; int intCurRpm = 0; int intSpeedtomotor = 0;
16 int intCurSpeedtomotor = 0; int intRound_count = 0; int intNewTime = 0; int intOldTime = 0;
// initialize digital pinMode(AnalogOut1, OUTPUT); pinMode(AnalogOut2, OUTPUT); pinMode(LEDOUT, OUTPUT); pinMode(encoderPinA, INPUT_PULLUP); pinMode(encoderPinB, INPUT_PULLUP);
//Value Interrupt(Pin) attachInterrupt(0, doEncoderA, FALLING);
Data_Motor(); delay (200); if (Serial.available() > 0)
{ strRecived = String((char)Serial.read());
} analogWrite(AnalogOut2, 0); analogWrite(AnalogOut1, intSpeedtomotor);
} analogWrite(AnalogOut1, 0); analogWrite(AnalogOut2, intSpeedtomotor);
{ strRecived = String((char)Serial.read());
{ intNewpos = intEncPos; detachInterrupt(0); intCurRpm = (intNewpos-intOldpos)*0.5;
Serial.println(intCurPosition+String(",")+abs(intCurRpm)+String(",")+intRou nd_count); intOldpos=intNewpos; attachInterrupt(0, doEncoderA, FALLING);