Giáo trình Lập trình vi điều khiển (Trình độ: Trung cấp) - Trường Cao đẳng Nghề Kỹ thuật Công nghệ Bà Rịa Vũng Tàu

* Giới thiệu: Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) được dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển được động cơ bước là ta đã có thể tự xây dựng được cho mình rất nhiều hệ thống tự động. *Mục tiêu: Sau khi học xong bài học này, người học có khả năng: - Trình bày được cấu tạo, chức năng và nguyên lý hoạt động của động cơ bước, mạch ULN 2003. - Vẽ được sơ đồ nguyên lý mạch điều khiển động cơ bước - Mô phỏng được chương trình mạch điều khiển động cơ bước bằng phần mềm mô phỏng - Kết nối được phần cứng mạch điều khiển động cơ bước đúng yêu cầu kỹ thuật. - Viết, nạp và chạy được chương trình điều khiển động cơ bước - Rèn luyện tính tư duy và tác phong công nghiệp , đảm bảo an toàn cho người và thiết bị *Nội dung:

pdf133 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 23/02/2024 | Lượt xem: 46 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình vi điều khiển (Trình độ: Trung cấp) - Trường Cao đẳng Nghề Kỹ thuật Công nghệ Bà Rịa Vũng Tàu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
l Mode: là chế độ vào ( INPUT), ra (OUTPUT). Lệnh tiếp theo. pinMode(ledPin, OUTPUT); Lệnh này thiết lập chân số 9 trên board là chân ngõ ra (OUTPUT). Nếu không khai báo “ int ledPin = 9; ” thì bạn có thể viết cách sau nhƣng ý nghĩa không thay đổi: pinMode(9, OUTPUT); Bắt buộc khai báo một hàm loop() trong Arduino IDE. Hàm này là vòng lặp vô hạn void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } Tiếp theo ta sẽ phân tích hàm digitalWrite( ledPin, HIGH); lệnh này có ý nghĩa là xuất ra chân digital có tên là ledPin ( chân 9) mức cao ( HIGH), mức cao tƣớng ứng là 5 volt. delay(1000); Lệnh này tạo một khoảng trễ với thời gian là 1 giây. Trong hàm delay() của IDE thì 1000 tƣơng ứng với 1 giây. digitalWrite(ledPin, LOW); Cũng giống nhƣ digitalWrite( ledPin, HIGH); lệnh này xuất ra chân ledPin mức thấp (LOW) tức là 0 volt. Và tiếp tục là một hàm delay(). Nhƣ vậy chúng ta có thể thấy chƣơng trình sẽ thực hiện tắt sáng led liên tục không ngừng trừ khi ta ngắt nguồn CÂU HỎI ÔN TẬP Câu 1: Thiết kế phần cứng và lập trình điều khiển 8 led đơn chạy từ trái sang phải? 88 BÀI 6: GIAO TIẾP VỚI LED 7 ĐOẠN *Giới thiệu Bài học này giới thiệu về cách thiết kế , gia công và lập trình điều khiển led 7 đoạn đƣợc ứng dụng rộng rãi trong thực tế *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo và nguyên lý hoạt động của led 7 đoạn - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LED 7 đoạn với Arduino - Mô phỏng đƣợc chƣơng trình mạch giao tiếp LED 7 đoạn với Arduino bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch giao tiếp LED 7 đoạn với Arduino đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình giao tiếp LED 7 đoạn với Arduino *Nội dung: 1. Cấu tạo led 7 đoạn Hình 6.1. Led 7 đoạn thực tế Thực ra cấu trúc của LED 7 đoạn gồm 8 LED đơn, nhìn lên hình trên chắc Chúng ta cũng thấy gồm có 7 đoạn và một dấu chấm nhỏ, mỗi đoạn và dấu chấm nhỏ đó là một LED đơn. Việc sử dụng LED 7 đoạn chúng ta có thể sử dụng để hiển thị các số, các chữ cái anphabet và nhiều kiểu ký tự khác nhau. Nhƣ trên hình Chúng ta đã thấy, một LED 7 đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và chân dấu chấm tròn (DP). LED 7 đoạn gồm 2 loại đó là dƣơng chung và âm chung. Trong bài học này chúng ta sẽ viết chƣơng trình và tải vào Arduino để hiển thị các số từ 0-9 ( Loại âm chung). 89 Hình 6.2. Vi trí chân Led 7 đoạn Để LED hiển thị chúng ta phải làm cho 8 LED đơn nhƣ ở trên hiển thị, ví dụ ở đây 8 LED ở đây là các led mang kí tự a, b, c, d, e, f, g và một dấu chấm ở chân cuối. Bây giờ chúng ta thử suy nghĩ nếu chúng ta muốn hiển thị số 0 chúng ta phải làm thế nào? Nhìn vào hình LED hiển thị ở đầu bài chúng ta thấy: Để hiển thị số 0 thì chúng ta phải làm cho các LED đơn a, b, c, d, e, f phải sáng lên, dấu chấm và g phải tắt đi. Nhƣ vậy để tạo số 0 chúng ta phải thể hiện mã code hệ nhị phân (binary) là B111111100. Tƣơng tự đối với số 1 thì có những cái LED nào sáng? Chúng ta có thể viết đƣợc mã làm xuất hiện số 1 đƣợc không? Đó là: B01100000. Tƣơng tự đối với các số 2. 3, 4, 5, 6, 7, 9. Để dễ hiểu hơn tôi xin đƣa ra một bảng sau để Chúng ta dò. Lƣu ý: sáng là 1, tắt là 0. Bảng 6.1. Giải mã Led 7 đoạn 90 2. Phần cứng chuẩn bị: Mạch Arduino (ở đây ta sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây test board. Điện trở 220 Ω. 1 led 7 đoạn đơn. Lắp mạch: CHÂN LED 7 ĐOẠN CHÂN ARDUINO a 2 b 3 c 4 d 5 e 6 f 7 g 8 DP 9 Hình 6.3. Giao tiếp Arduino với Led 7 đoạn 91 3. Lập trình và giải thích. // Khai báo chân const int G = 8; // G= Arduino chân 8 const int F = 7; // F= Arduino chân 7 const int A = 2; // A = Arduino chân 2 const int B = 3; // B = Arduino chân 3 const int E = 6; // E = Arduino chân 6 const int D = 5; // D = Arduino chân 5 const int C = 4; // C = Arduino chân 4 const int dp = 9; // dp = Arduino chân 9 const int second = 1000; // thiết lập với mili giây, 1000 milliseconds = 1 second const int digit = 10; // Số ký tự hiển thị10 digits (0 - 9) const int segment = 7; // Số thanh hiển thị trong LED (7) // Định nghĩa những thanh( led đơn) sáng byte digseg[digit][segment] = { { 1,1,1,1,1,1,0 }, // = 0 { 0,1,1,0,0,0,0 }, // = 1 { 1,1,0,1,1,0,1 }, // = 2 { 1,1,1,1,0,0,1 }, // = 3 { 0,1,1,0,0,1,1 }, // = 4 { 1,0,1,1,0,1,1 }, // = 5 { 1,0,1,1,1,1,1 }, // = 6 { 1,1,1,0,0,0,0 }, // = 7 { 1,1,1,1,1,1,1 }, // = 8 { 1,1,1,1,0,1,1 } // = 9 }; void setup() { // Định nghĩa chân xuất tín hiệu OUTPUT writeDigit(digit); delay(second); } delay(4*second); } CÂU HỎI ÔN TẬP Câu 1: Thiết kế phần cứng và lập trình điều khiển mạch đếm từ 1 đến 8 ? 92 BÀI 7: GIAO TIẾP VỚI LCD * Giới thiệu: LCD không chỉ hiển thị các chuỗi ký tự hay số đơn giản mà ta còn có thể thêm vào các hiệu ứng giúp cho giao diện thêm sinh động và thú vị hơn tùy theo ý muốn. *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo và nguyên lý hoạt động của LCD - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LCD với Arduino - Mô phỏng đƣợc chƣơng trình mạch giao tiếp LCD với Arduino bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch giao tiếp LCD với Arduino đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình giao tiếp LCD với Arduino. **Nội dung: 1. Cấu tạo LCD. * Giới thiệu module LCD 16X02: Trong bài này Chúng ta sẽ tìm cách điều khiển màn hình LCD bằng Arduino mà không sử dụng module I2C LCD. Chỉ cần Arduino bạn có thể điều khiển đƣợc LCD nhƣng lại tốn khá nhiều chân của arduino, Ở phần tiếp theo chúng ta sẽ sử dụng module I2C để giải quyết vấn đề đó. Hình 7.1. màn hình LCD16x2 2. Phần cứng - Chuẩn bị : 93 Mạch Arduino (ở đây ta sử dụng Arduino UNO). Breadboard còn gọi testboard 1 module LCD 16x02. Dây cắm test board. 1 biến trở 10K. - Lắp mạch: Hình 7.2. Giao tiếp Arduino với LCD 16x2 94 3. Lập trình và giải thích #include //Khai báo thư viện cho LCD ( Thư viện đã có sẵn) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //noi voi chan LCD LAN LUOT : Rs, E, D4, D5, D6, D7 void setup() { //Thông báo đây là LCD 1602 lcd.print("DIEN – DIEN TU!"); //In ra màn hình lcd dòng chữ DIEN – DIEN TU } void loop() { lcd.setCursor(0, 1); // đặt con trỏ vào cột 0, dòng 1 lcd.print(" truong cao đang KT"); // In ra dong chu } CÂU HỎI ÔN TẬP Câu 1: Viết chƣơng trình điều khiển chuỗi ký tự chạy từ trái qua phải ? 95 BÀI 8: ADC-ĐỌC TÍN HIỆU MỘT SỐ LOẠI CẢM BIẾN. *Giới thiệu Bài học này giới thiệu về cách thiết kế và lập trình cho một loại cảm biến đƣợc ứng dụng nhiều trong thực tế *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo và nguyên lý hoạt động của, cảm biến lm35, bộ ADC trong Arduino. - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp cảm biến với Arduino - Mô phỏng đƣợc chƣơng trình mạch giao tiếp cảm biến với Arduino bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch giao tiếp cảm biến với Arduino đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình giao tiếp cảm biến với Arduino. *Nội dung: 1. Giới thiệu ADC * Bộ chuyển đổi ADC: ADC (Analog Digital Converter) là bộ chuyển đổi tín hiệu tƣơng tự sang số dùng để chuyển đổi các tín hiệu tƣơng tự từ bên ngoài (nhiệt độ, độ ẩm, ) về dạng số để vi điều khiển có thể xử lý đƣợc. Không phải tất cả các chân của Arduino đều có khả năng ADC. Trên board Arduino, các chân đƣợc ký hiệu Ax (A0 đến A5 trên UNO) để cho biết các chân này có thể đọc đƣợc điện áp tƣơng tự. Bộ chuyển đổi ADC trên mỗi vi điều khiển là khác nhau. Trên Arduino là 10-bit, có nghĩa là nó có khả năng phát hiện 1024 (2^10) mức tín hiệu số rời rạc. * Điện áp tham chiếu Vref: Điện áp tham chiếu là giá trị điện áp lớn nhất mà ADC có thể chuyển đổi đƣợc. Mặc định khi đƣợc cấp nguồn điện áp tham chiếu của Arduino là 5V (có nghĩa là 5V ứng với giá trị ADC max là 1023, với board Arduino 3.3V thì 3.3V ứng với giá trị lớn nhất là 1023). Ngoài ra Arduino còn đƣợc tích hợp các bộ tham chiếu nội, và bộ tham chiếu ngoại tại chân AREF. * Mối quan hệ giữa giá trị ADC và điện áp: Với giá trị ADC lớn nhất là 2^n - 1 ↔ giá trị điện áp lớn nhất Vref .Với giá trị ADC bất kỳ (Gia_tri_ADC) ↔ giá trị điện áp Vđo bất kỳ → Giá trị điện áp ra Vđo tại một giá trị ADC đo đƣợc là (n là độ phân giải của bộ ADC): 96 Tính toán giá trị điện áp: Với điện áp tham chiếu mặc định của Arduino là và độ phân giải là 10-bit, ta có điện áp đo đƣợc tại chân A0 của triết áp là: 2. Phần cứng Chuẩn bị: Arduino UNO R3 Cảm biến nhiệt độ LM35 Lắp mạch : Hình 8.1.Giao tiếp Arduino với LM35 Tính toán giá trị nhiệt độ: Với cảm biến nhiệt độ LM35, chúng ta có cứ 10mV sự thay đổi của điện áp ứng với 1°C. Với điện áp đọc đƣợc, giá trị của nhiệt độ là: Chƣơng trình: void setup() { // Khởi tạo Serial tốc độ 9600bps Serial.begin(9600); } 97 void loop() { // Đọc giá trị ADC tại chân A0 int adcValue = analogRead(A0); // Tính toán giá trị nhiệt độ đo đƣợc float temp = (float)adcValue * 500 / 1023; // In ra Serial giá trị nhiệt độ với 2 chữ số sau dấu phẩy Serial.print("Nhiet do: "); Serial.println(temp, 2); // Trễ 500ms delay(500); } Kết quả: Bật màn hình Serial monitor với tốc độ 9600bps, mỗi khi tác động thay đổi nhiệt độ trên LM35, chúng ta sẽ nhận đƣợc giá trị hiển thị trên màn hình Serial monitor. CÂU HỎI ÔN TẬP Câu 1: Viết chƣơng trình điều khiển đọc giá trị cảm biến hiển thị thông số lên LCD ? 98 BÀI 9: NGẮT NGOÀI . * Giới thiệu: Là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chƣơng trình hiện tại, phục vụ ngay lập tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt (ISR: Interrupt Service Routine). *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc nguyên lý hoạt động của ngắt ngoài trong Arduino - Vẽ đƣợc sơ đồ nguyên lý mạch ngắt ngoài - Mô phỏng đƣợc chƣơng trình mạch ngắt ngoài Arduino bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch ngắt ngoài Arduino đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình ngắt ngoài Arduino - Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho ngƣời và thiết bị *Nội dung: 1. Giới thiệu ngắt ngoài Interrupts, thƣờng đƣợc gọi là ngắt, là một tín hiệu khẩn cấp gởi đến bộ xử lí, yêu cầu bộ xử lí tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơi khác thực hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ ngắt – isr (interrupt service routine ). Sau khi kết thúc nhiệm vụ trong isr, bộ đếm chƣơng trình sẽ đƣợc trả về giá trị trƣớc đó để bộ xử lí quay về thực hiện tiếp các nhiệm vụ còn dang dở. Nhƣ vậy, ngắt có mức độ ƣu tiên xử lí cao nhất, ngắt thƣờng đƣợc dùng để xử lí các sự kiện bất ngờ nhƣng không tốn quá nhiều thời gian. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên trong chip (ngắt báo bộ đếm timer/counter tràn, ngắt báo quá trình gởi dữ liệu bằng RS232 kết thúc) hay do các tác nhân bên ngoài (ngắt báo có 1 button đƣợc nhấn, ngắt báo có 1 gói dữ liệu đã đƣợc nhận). Ngắt là một trong 2 kỹ thuật “bắt” sự kiện cơ bản là hỏi vòng (Polling) và ngắt. Hãy tƣởng tƣợng bạn cần thiết kế một mạch điều khiển hoàn chỉnh thực hiện rất nhiều nhiệm vụ bao gồm nhận thông tin từ ngƣời dùng qua các button hay keypad (hoặc keyboard), nhận tín hiệu từ cảm biến, xử lí thông tin, xuất tín hiệu điều khiển, hiển thị thông tin trạng thái lên các LCD(bạn hoàn toàn có thể làm đƣợc với AVR), rõ ràng trong các nhiệm vụ này việc nhận thông tin ngƣời dùng (start, stop, setup, change,) rất hiếm xảy ra (so với các nhiệm vụ khác) nhƣng lại rất “khẩn cấp”, đƣợc ƣu tiên hàng đầu. Nếu dùng Polling nghĩa là bạn cần viết 1 đoạn chƣơng 99 trình chuyên thăm dò trạng thái của các button (tôi tạm gọi đoạn chƣơng trình đó là Input()) và bạn phải chèn đoạn chƣơng trình Input() này vào rất nhiều vị trí trong chƣơng trình chính để tránh trƣờng hợp bỏ sót lệnh từ ngƣời dùng, điều này thật lãng phí thời gian thực thi. Giải pháp cho vấn đề này là sử dụng ngắt, bằng cách kết nối các button với đƣờng ngắt của chip và sử dụng chƣơng trình Input() làm trình phục vụ ngắt - isr của ngắt đó, bạn không cần phải chèn Input() trong lúc đang thực thi và vì thế không tốn thời gian cho nó, Input() chỉ đƣợc gọi khi ngƣời dùng nhấn các button. Đó là ý tƣởng sử dụng ngắt. Hình 1 minh họa cách tổ chức ngắt thông thƣờng trong các chip AVR. Số lƣợng ngắt trên mỗi dòng chip là khác nhau, ứng với mỗi ngắt sẽ có vector ngắt, vector ngắt là các thanh ghi có địa chỉ cố định đƣợc định nghĩa trƣớc nằm trong phần đầu của bộ nhớ chƣơng trình. Ví dụ vector ngắt ngoài 0 (external interrupt 0) của chip atmega8 có địa chỉ là 0x001 (theo datasheet từ Atmel). Trong lúc chƣơng trình chính đang thực thi, nếu có một sự thay đổi dẫn đến ngắt xảy ra ở chân INT0 (chân 4), bộ đếm chƣơng trình (Program Counter) nhảy đến địa chỉ 0x001, giả sử ngay tại địa chỉ 0x001 chúng ta có đặt 1 lệnh RJMP đến một trình phục vụ ngắt (IRS1 chẳng hạn), một lần nữa bộ đếm chƣơng trình nhảy đến IRS1 để thực thi trình phục vụ ngắt, kết thúc ISR1, bộ đếm chƣơng trình lại quay về vị trí trƣớc đó trong chƣơng trình chính, quá trình ngắt kết thúc. Không mang tính bắt buộc nhƣng tôi khuyên bạn nên tổ chức chƣơng trình ngắt theo cách này để tránh những lỗi liên quan đến địa chỉ chƣơng trình. - Ngắt ngoài ( External Interrupt) Ngắt ngoài xảy ra khi có một sự kiện bất ngờ xảy ra trên một trong số chân ngắt. Sự kiện đó có thể là chân đó ở mức cao, hoặc ở mức thấp, hoặc đang đƣợc kéo lên hoặc đang đƣợc kéo xuống. Hầu hết các board Arduino có ít nhất là 2 chân ngắt - Ngắt trên arduino. Trình ngắt trên arduino là (interrupt service routine- ISR), có chức năng là tạo một một sự kiện cho mạch arduino. Hầu hết mạch arduino có 2 ngắt ngoài: ngắt 0 (chân số 2) ngắt 1 (chân số 3). Cụ thể nhƣ sau: Board int.0 int.1 int.2 int.3 int.4 int.5 Uno, Ethernet 2 3 Mega2560 2 3 21 20 19 18 Leonardo 3 2 0 1 7 Due (see below) 100 Đặc biệt đối với mạch Arduino Due thì tất cả chân đều có thể là chân ngắt hết. bạn có thể gán chân ngắt bằng hàm attachInterrupt(). Cấu trúc của hàm ngắt attachInterrupt(interrupt, ISR, mode) attachInterrupt(thứ tự ngắt, tên chương trình con thực hiện ngắt, chế độ ngắt) trong đó: thứ tự ngắt: có kiểu (int), ta điền số 0 đối với ngắt 0, số 1 đối với ngắt 1. tên chƣơng trình con thực hiện ngắt: khai báo một chƣơng trình con, để khi sự kiện ngắt xảy ra thì sẽ thực hiện chƣơng trình con đó. - Chế đó ngắt: khai báo kiểu ngắt, có 4 kiểu ngắt. LOW: ngăt mức thấp, thực hiện chƣơng trình ngắt khi chân ngắt ở mực thấp (0v) CHANGE: Ngắt khi có thay đổi, thực hiện chƣơng trình ngắt khi có thay đổi trên chân ngắt, từ thấp lên cao, từ cao xuống thấp (cạnh lên, cạnh xuống) RISING to: Ngắt cạnh lên, thực hiện chƣơng trình ngắt khi chân ngắt từ mức thấp lên mức cao. FALLING: Ngắt cạnh xuống, thực hiện chƣơng trình ngắt khi chân ngắt từ mức cao lên mức thấp. ( interrupt: số tứ thự của ngắt, từ 0-5, ví dụ bạn dùng ngắt tại pin 2 thì số thứ tự sẽ là 0 ISR : Hàm ngắt, đây là tiến trình sẽ thực hiện khi xảy ra ngắt, có thể đặt tên tùy ý, hàm này đƣợc khai báo nhƣ một hàm con bình thƣờng mode : chế độ ngắt, cố 5 chế độ nhƣ sau: LOW (ngắt khi ở mức thấp) HIGH (ngắt khi ở mức cao) FALLING ( ngắt khi cạnh xuống) RISING (ngắt khi cạnh lên) CHANGE (ngắt khi mức logic ở chân thay đổi) ) Chú ý: Hàm ngắt không có thông số trả về. 101 Khi sử dụng ngắt thì một số hàm nhƣ delay() có thể sẽ bị sai vài mili giây, vì trong quá trình thực hiện lệnh delay thì xảy ra ngắt. cũng có ảnh hƣởng tƣơng tự đối với các hàm truyền nhận UART. - Ứng dụng của ngắt. Ngắt thƣờng đƣợc sử dụng để giúp vi điều khiển thực hiện chƣơng trình chính xác và thông minh hơn, có thể giúp bạn giải một số khó khăn về thời gian. Một số chức năng thƣờng dùng ngắt nhƣ: Đếm encoder, quản lý các ngõ vào hiệu quả hơn. Dễ dàng nhận thấy đƣợc rằng để đọc xung của encoder, mà không mất xung nào thì chƣơng trình của bạn không thể làm gì khác vì phải kiểm tra liên tục. Nhƣng đối với ngắt thì khác, giúp bạn chủ động hơn trong việc bắt sự khi khi có cạnh lên hoặc cạnh xuống ở chân ngắt. 2. Phần cứng Hình 9.1. giao tiếp Arduino với nút nhấn 3. Lập trình và giải thích int led = 13; volatile int trangthai = LOW; // khai báo biến kiểu volatile, tránh sai số trong quá 102 trình thực hiện ngắt. void setup() // đoạn chƣơng trình cài đặt { pinMode(led, OUTPUT); // khai báo led là ngõ ra digitalWrite(2, HIGH); // Treo chân ngắt 0, chân số 2 lên mức cao. attachInterrupt(0, daoled, CHANGE); // khai báo ngắt 0, chƣơng trình con daoled, chế độ có sự // thay đổi là sinh ngắt } void loop() // đoạn chƣơng trình chính, vòng lặp vô tận. { digitalWrite(led, trangthai); // gán tráng thái cho chân led. } void daoled() // chƣơng trình con ngắt, khi có ngắt xảy ra sẽ thực hiện chƣơng trình này. { trangthai = !trangthai; // đảo trang thái. } CÂU HỎI ÔN TẬP Câu 1:Thế nào là ngắt ngoài? Câu 1: Viết chƣơng trình điều khiển ngắt ngoài hiển thị lên LCD ? 103 BÀI 10: TIMER-COUNTER . * Giới thiệu: Timer/Count có chức năng: Đếm sự kiện, Định thời và tạo xung PWM, để giữ mọi thứ đơn giản, trong bài này chỉ giới thiệu chức năng cơ bản của Timer/Counter khi lập trình trên Arduino là "Định thời" *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc chức năng,nguyên lý hoạt động của các thanh ghi timer – counter trong Arduino - Vẽ đƣợc sơ đồ nguyên lý mạch Led 7 đoạn sử sụng ngắt timer - Mô phỏng đƣợc chƣơng trình mạch Led 7 đoạn sử sụng ngắt timer bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch Led 7 đoạn sử sụng ngắt timer đúng yêu cầu kỹ thuật. -Viết, nạp và chạy đƣợc chƣơng trình Led 7 đoạn sử sụng ngắt timer Arduino *Nội dung: 1. Giới thiệu bộ timer- counter Trên chip Atmega328p của Arduino có 3 bộ Timer/Counter là: Timer/Counter0 (8bit), Timer/Counter1 (16 bit), Timer/Counter2 (8 bit). Để không làm ảnh hƣởng đến hàm delay() và millis() của Arduino, ta sẽ không đề cập đến Timer/Counter0. Nhƣ đã giới thiệu, Timer/Count có chức năng: Đếm sự kiện, Định thời và tạo xung PWM, để giữ mọi thứ đơn giản, trong bài này chỉ giới thiệu chức năng cơ bản của Timer/Counter khi lập trình trên Arduino là "Định thời" (Arduino đã hỗ trợ hàm built-in analogWrite để tạo xung PWM nên chúng ta cũng không đề cập đến nữa). Timer/Counter1: là 1 bộ Timer/Counter đa năng 16 bit, gồm 5 chế độ hoạt động. Timer/Counter2: là 1 bộ Timer/Counter 8 bit, gồm 4 chế độ. Trong pham vi bài viết ta sẽ giới thiệu Normal Mode và Clear Timer on Compare Match (CTC) mode trên Timer/Counter1 và Timer/Counter2.Để thuận tiện viết tắt Timer/Counter thành T/C. Trƣớc khi bắt đầu, có 1 số định nghĩa quan trong chúng ta cần rõ: BOTTOM: là giá trị thấp nhất mà 1 T/C đạt đƣợc, tất nhiên BOTTOM luôn bằng 0. 104 MAX: là giá trị lớn nhất mà 1 T/C có thể đạt đƣợc, ở thanh ghi 8 bit giá trị MAX = 2^8 -1 = 255, ở thanh ghi 16 bit giá trị MAX = 2^16 - 1 = 65535. Và tất nhiên giá trị MAX cũng là cố định với từng T/C. TOP: là giá trị đỉnh mà tại có T/C thay đổi trạng thái, giá trị TOP không nhất thiết phải bằng MAX mà có thể thay đổi bằng các thanh ghi. Chúng ta sẽ tìm hiểu sau. Interrupt: (còn gọi là Ngắt) là 1 chƣơng trình có độ ƣu tiên cao nhất, đƣợc thực hiện ngay lập tức khi có tín hiệu Interrupt. Bảng 10.1: Interrupt Vectors của Timer/Counter trên ATmega328 1.1. Timer/Counter 1 1.1.1 Giới thiệu các thanh ghi * Thanh ghi TCNT1 (Timer/Counter 1 Register) Là thanh ghi 16 bit, lƣu giữ giá trị của Timer/Counter1, cho phép đọc-ghi trực tiếp, do đó, chúng ta có thể thực hiện các phép gán hoặc thay đổi giá trị của TCNT1. * Thanh ghi TCCR1B (Timer/Counter 1 Control Register B) Là 1 trong 2 thanh ghi điều khiển hoạt đông của Timer/Counter1 (cùng với TCCR1A, nhƣng với những mục đích đơn giản, chúng ta chỉ cần thanh ghi TCCR1B). Bảng 10.2: Thanh ghi TCCR1B Trong thanh ghi TCCR1B chúng ta chỉ cần sử dụng 3 bit CS10, CS11, CS12 để lựa chọn xung nhịp cho T/C1. Chúng ta sẽ tham khảo bảng này: 105 Bảng10. 3: Mô tả Clock Select Bit trên thanh ghi TCCR1B Theo mặc định, chip Atmega328p trên Arduino chạy ở 16MHz, prescaler = 64. Điều này có nghĩa là: theo mặc định, các bộ T/C trên Arduino sẽ có tần số hoạt động là 16MHz/64 = 250kHz. * Thanh ghiTIMSK1 (Timer/Counter1 Interrupt Mask Register) Là thanh ghi lƣu giữ các Interrupt Mask của T/C1. Đây là thanh ghi giúp chúng ta thực hiện các Timer Interrupt. Trên thanh ghi TIMSK1 chúng ta cần chú ý các bit sau: Bảng 10.4: Thanh ghi TIMSK1 (Timer/Counter1) bit 5 - ICIE1: Input Capture Interrupt Enable - Cho phép ngắt khi dùng Input Capture. bit 2 - OCIE1B: Output Compare Interrupt Enable 1 channel B - Cho phép ngắt khi dùng Output Compare ở channel B. bit 1 - OCIE1A: Output Compare Interrupt Enable 1 channel A - Cho phép ngắt khi dùng Output Compare ở channel A. bit 0 - TOIE1: Overflow Interrupt Enable 1 - Cho phép ngắt khi xảy ra tràn trên T/C. (Chúng ta cứ bình tĩnh, những cái nhƣ Output Compare, Input Capture, Overflow ta sẽ giới thiệu ở bên dƣới). 106 * Thanh ghi OCR1A và OCR1B (Output Compare Register channel A và channel B) Lƣu giữ giá trị so sánh ở kênh A và kênh B: khi T/C1 hoạt động, giá trị TCNT1 đƣợc tăng dần, giá trị này liên tục đƣợc so sánh với các giá trị trong thanh ghi OCR1A và OCR1B, việc so sánh này chính là "Output Compare", khi giá trị của TCNT1 bằng giá trị của OCR1A (hoặc OCR1B) thì "Match" xảy ra, lúc này sẽ có 1 Interrupt đƣợc thực hiện ( nếu đã đƣợc Enable ở thanh ghi TIMSK1). * Thanh ghi ICR1 (Input Capture Register 1) Giá trị của thanh ghi ICR1 sẽ đƣợc cập nhật theo thanh ghi TCNT1 mỗi lần có sự kiện xảy ra trên chân ICP1 (tƣơng ứng là chân digital 8 của Arduino). Chức năng này ta sẽ giới thiệu trong 1 bài viết khác. 1.1.2 Các chế độ của Timer/Counter 1 Bảng 10.5: Waveform Generation Mode Bit (Timer/Counter1) ở đây sẽ giới thiệu 2 mode cơ bản nhất của T/C1 là: Normal Mode và CTC Mode. *Normal Mode Đây là chế độ hoạt động đơn giản nhất của T/C1 (mode 0), giá trị của thanh ghi TCNT1 sẽ tăng từ 0 (BOTTOM) đến 65535 (MAX) và quay về 0. Nếu chúng ta gán trƣớc cho TCNT1 một giá trị nào đó thì TCNT1 sẽ bắt đầu đếm từ giá trị này. Ví dụ: Bạn muốn viết 1 chƣơng trình để đọc dữ liệu từ cảm biến nhiệt mỗi 0.1s, nhƣng trong thân chƣơng trình lại có vài hàm delay(), do đó sẽ không đảm bảo là bạn cập nhật đƣợc giá trị nhiệt độ mỗi 0.1s nếu chỉ dùng hàm if và hàm millis(). Phƣơng án ở đây là chúng ta sẽ dùng Interrupt của Timer/Counter. 107 Theo mặc định, chip Atmega328p trên Arduino chạy ở 16MHz, prescaler = 64, vì vậy thời gian để TCNT1 tăng lên 1 đơn vị là 64/16MHz = 4us, thời gian để T/C1 đếm từ 0 đến 65535 là 4us*65536 = 0.262144s, mà thời gian chúng ta cần tạo là 0.1s (thỏa mãn vì 0.1 < 0.262144), do đó ta cần 0.1s/4us = 25000 lần đếm. Giá trị ban đầu của TCNT1 = 65536 - 25000 = 40536. Ví dụ ở chế độ Normal Mode: #include #define sensor A0 volatile int temp; void setup() { Serial.begin(9600) cli(); // tắt ngắt toàn cụ /* Reset Timer/Counter1 * TCCR1A = 0 TCCR1B = 0 TIMSK1 = 0 /* Setup Timer/Counter1 * TCCR1B |= (1 << CS11) | (1 << CS10); // prescale = 6 TCNT1 = 40536 TIMSK1 = (1 << TOIE1); // Overflow interrupt enable sei(); // cho phép ngắt toàn cụ } void loop() { /* add main program code here * } ISR (TIMER1_OVF_vect) { TCNT1 = 40536 temp = analogRead(sensor) Serial.print(F("Temp:")) Serial.println(temp) } Giải thích - #include là thƣ viện Interrupt của AVR. 108 - Biến temp cần đƣợc khai báo volatile vì nó đƣợc sử dụng cả ở chƣơng trình chính và ở chƣơng trình ngắt. - cli() dùng để tắt ngắt toàn cục. - Tham khảo bảng Waveform Generation Mode Bit, chúng ta thấy rằng để cài đặt T/C1 ở mode 0, các bit cần đƣợc set nhƣ sau: WGM13 = 0, WGM12 = 0, WGM11 = 0, WGM10 = 0, vì mặc định các bit này là 0 nên chúng ta không cần quan tâm đến nó ở thanh ghi TCCR1B nữa. - TCCR1B |= (1 << CS11) | (1 << CS10) đƣợc dùng để cài đặt prescaler = 64. (tham khảo bảng Clock Select Bit). - sei() dùng để bật ngắt toàn cục. các biểu thức nhƣ (1 << CS11) đƣợc dùng để set bit CS11 lên 1. - ISR (Vector_name) là các trình phục vụ ngắt, trong đó ISR là keyword, Vector_name ở chƣơng trình này là TIMER1_OVF_vect, có nghĩa là "Ngắt tràn trên Timer/Counter1". Ở trong trình phục vụ ngắt, chúng ta cần gán lại giá trị ban đầu cho TCNT1 = 40536 vì lúc này T/C1 đã đếm tràn qua 65535 và về lại 0. Nếu không gán lại TCNT1 = 40536, chúng ta sẽ không tạo đƣợc 0.1s nhƣ mong muốn. * Clear Timer on Compare Match (CTC) mode Có 2 CTC mode trên T/C1 là mode 4 và mode 12 - Đầu tiên ta sẽ giới thiệu mode 4 trƣớc. Để chọn mode 4, chúng ta cần set các bit nhƣ sau: WGM13 = 0, WGM12 = 1, WGM11 = 0, WGM10 = 0. - CTC mode hoạt động nhƣ sau: thanh ghi OCR1A lƣu giữ giá trị TOP, thanh ghi TCNT1 bắt đầu đếm từ 0, khi giá trị TCNT1 = OCR1A thì "Compare Match", lúc này ngắt Compare Match có thể xảy ra nếu bit OCIE1A đã đƣợc set ở thanh ghi TIMSK1. Chú ý: là chỉ có thanh ghi OCR1A được sử dụng để lưu giá trị COMPARE trong CTC mode Trở lại VD ở Normal Mode, ta sẽ thực hiện với CTC Mode nhƣ sau: - Vi dụ: #include #define sensor A0 volatile int temp; void setup() { Serial.begin(9600) cli(); // tắt ngắt toàn cục /* Reset Timer/Counter1 * 109 TCCR1A = 0 TCCR1B = 0 TIMSK1 = 0 /* Setup Timer/Counter1 * TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); // prescale = 64 and CTC mode OCR1A = 24999; // initialize OCR1 TIMSK1 = (1 << OCIE1A); // Output Compare Interrupt Enable Timer/Counter1 channel sei(); // cho phép ngắt toàn cục } void loop() { /* add main program code here * } ISR (TIMER1_COMPA_vect) { temp = analogRead(sensor) Serial.print(F("Temp:")) Serial.println(temp) } Giải thích Để chọn mode 4, trong phần cài đặt cho thanh ghi TCCR1B ta cần set bit WGM12 lên 1, tức là (1 << WMG12). Để tạo đƣợc 0.1s (ở 16MHz, prescaler = 64) ta cần T/C1 đếm 25000 lần, do đó giá trị TOP = OCR1A = 24999. Để enable Compare Match Interrupt Timer/Counter 1 channel A, chúng ta cần set bit OCIE1A của thanh ghi TIMSK1 lên 1. Ở phần hàm ngắt, ta thay đổi thành ISR (TIMER1_COMPA_vect) cho phù hợp với Compare Match Interrupt T/C1 1.2. Timer/Counter 2 1.2.1. Các thanh ghi Trên T/C2 cũng có những thanh ghi tƣơng tự T/C1 1.2.2. Thanh ghi TCNT2 (Timer/Counter 2 Register) Là thanh ghi 8 bit, lƣu giữ giá trị của Timer/Counter2. 110 1.2.3. Thanh ghi TCCR2A và TCCR2B (Timer/Counter 2 Control Register A và B) Là 2 thanh ghi điều khiển hoạt động của Timer/Counter2. Bảng 10.6: Thanh ghi TCCR2A và TCCR2B (Timer/Counter 2) Bảng 10.7: Mô tả Clock Select Bit 1.2.4. Thanh ghi TIMSK2 (Timer/Counter2 Interrupt Mask Register) Là thanh ghi lƣu giữ các Interrupt Mask của T/C2. Bảng 10.8: Thanh ghi TIMSK2 (Timer/Counter 2) 111 1.2.5 Thanh ghi OCR2A và OCR2B (Output Compare Register channel A và channel B) Lƣu giữ giá trị so sánh ở kênh A và kênh B khi T/C2 hoạt động. Bảng10. 9: Lưu giữ giá trị so sánh ở kênh A và kênh B khi T/C2 hoạt động. 1.2.6 Các chế độ hoạt động Theo bảng Waveform Generation Mode bit, T/C2 có Normal Mode 0 và CTC mode 2. Để không trùng lặp nội dụng với T/C1, ta chỉ giới thiệu cách set thanh ghi trong T/C2. Ở Normal Mode, Chúng ta chỉ cần set các bit CS20, CS21, CS22 trong thanh ghi TCCR2B để chọn prescaler. Ở CTC Mode: ngoài set các bit trong thanh ghi TCCR2B để chọn prescaler, Chúng ta cần set bit WGM21 lên 1 bằng dòng: TCCR2A |= (1 << WGM21); Cách set thanh ghi TIMSK2 tƣơng tự nhƣ TIMSK1: OCIE2A (Output Compare Interrupt Enable 2 Channel A), OCIE2B, TOIE2 (Timer Overflow Interrupt 2 Enable). 2.Phần cứng Muốn đặt ngắt, ta phải đặt lệnh trong hàm setup(){}. Thƣ viện đính kèm gồm có thƣ viện timer cho Timer 1, Timer 3. Ta copy vào thƣ mục thƣ viện của Arduino IDE. Gồm có các hàm: initialize(): // Khởi động ngắt Timer. start() : // Khởi động lại sau khi sửa đổi. 112 startBottom() : // Cho Timer bắt đầu đếm lại từ giá trị 0 (Chú ý đây là giá trị đếm của Timer chứ không phải giá trị bạn đặt). read() : // Đọc giá trị hiện tại của Timer stop(): //Dừng Timer. attachInterrupt(): // Thêm địa chỉ hàm để gọi khi xảy ra ngăt và bắt đầu đếm. detachInterrupt(): // Hủy địa chỉ ngắt pwm(char pin, int duty, long microseconds) : // Băm xung ra chân pin với số chu kỳ là duty. Xung có độ rộng là microseconds. disablePwm(char pin) : //Hủy băm xung. 3. Lập trình và giải thích Ví dụ: nháy LED 0.15s // Ví dụ này dùng ngắt Timer để nháy LED // và sử dụng biến chia sẻ giữa hàm ngắt và chƣơng trình chính const int led = LED_BUILTIN; // định nghĩa chân LED, Biến LED_BUILTIN dùng để chỉ LED đƣợc gắn trên Board mạch.Ví dụ với Arduino UNO thì LED_BUILTIN=13. void setup(void) { pinMode(led, OUTPUT); Timer1.initialize(150000); //Khởi động ngắt, thời gian đặt cho nó là 150000us=0.15s. Timer1.attachInterrupt(blinkLED); //Khi xảy ra ngắt chƣơng trình sẽ gọi hàm blinkLED(). Serial.begin(9600); } int ledState = LOW; volatile unsigned long blinkCount = 0; // Biến dùng chung giữa CT chính và CT ngắt. void blinkLED(void) { if (ledState == LOW) { ledState = HIGH; blinkCount = blinkCount + 1; // tăng lên 1 mỗi lần LED sáng } else { 113 ledState = LOW; } digitalWrite(led, ledState); } // Xuất số lần sáng ra Serial0. // to the Arduino Serial Monitor void loop(void) { unsigned long blinkCopy; noInterrupts(); //Hủy các ngắt trƣớc đó. blinkCopy = blinkCount; interrupts(); //Cho phép ngắt Serial.print(blinkCount = ); Serial.println(blinkCopy); delay(100); } CÂU HỎI ÔN TẬP Câu 1: trong Arduino UNO có mấy bộ timer-counter? Câu 2: Viết chƣơng chình dùng ngắt Timer để nháy LED trong 3 giây? 114 BÀI 11: ĐIỀU KHIỂN ĐỘNG CƠ DC *Giới thiệu Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc DC Motor là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động. *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của mạch L298. - Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ DC - Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ DC bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch điều khiển động cơ DC đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ DC - Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho ngƣời và thiết bị *Nội dung: 1. Giới thiệu động cơ DC Động cơ điện 1 chiều là thiết bị ngoại vi đƣợc sử dụng rất rộng rãi do điều khiển đơn giản, giá cả phải chăng. Hình 11.1. Động cơ DC 1.1. Định nghĩa Động cơ một chiều DC ( DC là từ viết tắt của "Direct Current Motors") là Động cơ điều khiển bằng dòng có hƣớng xác định hay nói dễ hiểu hơn thì đây là loại động cơ chạy bằng nguồn điện áp DC- điện áp 1 chiều(Khác với điện áp AC xoay chiều). Đầu dây ra của đông cơ thƣờng gồm hai dây (dây nguồn- VCC và dây tiếp đất- GND). DC motor là một động cơ một chiều với cơ năng quay liên tục. Khi ta cung cấp năng lƣợng, động cơ DC sẽ bắt đầu quay, chuyển điện năng thành cơ năng. Hầu hết các động cơ DC sẽ quay với cƣờng độ RPM rất cao ( số 115 vòng quay/ phút). Tốc độ không tải của động cơ DC nếu không giảm tốc có thể đạt từ 1000RPM tới 40.000RPM. Ví dụ: Một động cơ DC RS775-9009 có tốc độ quay 22.000RPM cùng với hộp giảm tốc Planet. Ứng dụng của động cơ DC cũng rất đa dạng và hầu hết trong mọi lĩnh vực của đời sống. Trong tivi, trong đài FM, ổ đĩa DC, máy in- photo, máy công nghiệp...v...v. Đối với động cơ điện 1 chiều có loại không chổi than (Brussless DC Motor- BLDC) và động cơ có chổi than (Brush DC Motor- DC Motor). Do động cơ BLDC thực chất là động cơ điện 3 pha không đồng bộ vì vậy mình chỉ xét động cơ điện 1 chiều có chổi than. 1.2. Phân loại động cơ điện một chiều (đây là cách phân loại theo cách kích từ) Động cơ điện 1 chiều phân loại theo kích từ thành những loại sau: -Kích từ độc lập. -Kích từ song song. -Kích từ nối tiếp. -Kích từ hỗn hợp. Với mỗi 1 loại động cơ điện 1 chiều nhƣ trên thì có các ứng dụng khác nhau. Nhƣng trên thực tế, ta chủ yếu tiếp xúc với loại động cơ DC công suất thấp có phần Stator sử dụng nam châm vĩnh cửu nên thông thƣờng là không cần đến phần kích từ cho động cơ. Ta nói đến và quan tâm tới kích từ cho động cơ DC khi nói đến các loại động cơ DC công suất lớn, Stator của động cơ không phải là nam châm vĩnh cửu mà là nam châm điện. Phần nam châm điện này cũng gồm lõi thép kỹ thuật và các bó dây. Để Stator biến thành nam châm điện ta cần phải cấp điện cho phần Startor của nó, khi đó ta gọi nó là kích từ. Nhƣ vậy với những loại động cơ DC chúng ta tiếp cận không cần phải quan tâm tới "kích từ" của nó. 1.3. Cấu tạo và nguyên tắc hoạt động - Cấu tạo: Gồm có 3 phần chính stator( phần cảm), rotor ( phần ứng), và phần cổ góp- chỉnh lƣu Hình 11.2. Cấu tạo Động cơ DC 116 Cấu tạo chi tiết động cơ DC với phần than lộ và phần rotor dây đồng - Stator của động cơ điện 1 chiều thƣờng là 1 hay nhiều cặp nam châm vĩnh cửu, hay nam châm điện. - Rotor có các cuộn dây quấn và đƣợc nối với nguồn điện một chiều. - Bộ phận chỉnh lƣu, nó có nhiệm vụ là đổi chiều dòng điện trong khi chuyển động quay của rotor là liên tục. Thông thƣờng bộ phận này gồm có một bộ cổ góp và một bộ chổi than tiếp xúc với cổ góp. - Nguyên lý hoạt động 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.4.Điều chỉnh tốc độ động cơ điện một chiều Các phƣơng trình điều chỉnh tốc độ. 117 -Thay đổi điện áp phần ứng. -Thay đổi điện trở mạch rotor. -Thay đổi từ thông. Trên thực tế phƣơng pháp đƣợc sử dụng nhiều nhất là thay đổi điện áp phần ứng. Trong đó điển hình là phƣơng pháp thay đổi độ rộng xung PWM. 2. Phần cứng * Chuẩn bị: - Động cơ DC 12 V - Board Arduino - Breadboard và dây nối - Bộ điều khiển L298N Hình 11.3. Bo mạch L298 - Thông số kỹ thuật: Driver: L298N tích hợp hai mạch cầu H. Điện áp điều khiển: +5 V ~ +12 V Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor) Điện áp của tín hiệu điều khiển: +5 V ~ +7 V Dòng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên khỏe re nhé các bạn) Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃) Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃ 118 - L298 chức năngcác chân: - 12V power, 5V power.: Đây là 2 chân cấp nguồn trực tiếp đến động cơ. Ta có thể cấp nguồn 9-12V ở 12V. - jumper 5V, nếu để nhƣ hình ở trên thì sẽ có nguồn 5V ra ở cổng 5V power, ngƣợc lại thì không. Ta để nhƣ hình thì ta chỉ cần cấp nguồn 12V vào ở 12V power là có 5V ở 5V power, từ đó cấp cho Arduino - Power GND chân này là GND của nguồn cấp cho Động cơ. Chú ý: Nếu dùng Arduino thì nối với GND của Arduino - 2 Jump A enable và B enable, để nhƣ hình - Gồm có 4 chân Input. IN1, IN2, IN3, IN4. - Output A: nối với động cơ A.tachú ý chân +, -. Nếu nối ngƣợc thì động cơ sẽ chạy ngƣợc. Và chú ý nếu ta nối động cơ bƣớc, ta phải đấu nối các pha cho phù hợp. Board này gồm 2 phần điều khiển động cơ. Và có thể điều khiển cho 1 động cơ bƣớc 6 dây hoặc 4 dây * Lắp mạch : Hình 11.4. Giao tiếp UNO với động cơ DC 3. Lập trình và giải thích const int motorA1=9; //Khai báo chân IN const int motorA2=10; void setup() { pinMode(motorA1,OUTPUT); //Khai báo dạng INPUT pinMode(motorA2,OUTPUT); 119 } void loop() { digitalWrite(motorA1,HIGH); //Quay tới digitalWrite(motorA2,LOW); delay(1000); //Dừng 1s digitalWrite(motorA1,LOW); //Quay lui digitalWrite(motorA2,HIGH); delay(1000); //Dừng 1s } CÂU HỎI VÀ BÀI TẬP Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ DC Câu 2: Viết chƣơng trình điều khiển động cơ DC ? 120 BÀI 12: ĐIỀU KHIỂN ĐỘNG CƠ SERVO * Giới thiệu: Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc DC servo motor là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động. Khái niệm Servo mà tôi dùng trong bài học này để chỉ một hệ thống hồi tiếp. DC servo motor là động cơ DC có bộ điều khiển hồi tiếp *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của động cơ servo - Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ servo - Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ servo bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch điều khiển động cơ servo đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ servo *Nội dung: 1. Giới thiệu động cơ servo 1.1. Động cơ Servo nghĩ là gì ? Hình 13.1 Động cơ Servo Động cơ Servo là một bộ phận của hệ thống điều khiển chuyển động của máy móc. Một trong các bộ phận không thể thiếu giúp Động cơ Servo có thể hoạt động đó chính là Driver servo. Tƣơng tự nhƣ driver của máy tính. Động cơ Servo cung cấp lực chuyển động cần thiết cho các thiết bị máy móc khi vận hành 1.2.Phân loại động cơ Servo. 121 Nhìn chung động cơ servo có 2 loại chính là: Động cơ DC Servo và động cơ AC Servo. - AC servo là loại động cơ cho phép xử lý các dòng điện cao nên thƣờng đƣợc sử dụng trong máy móc công nghiệp đặc biệt là các loại máy CNC. - DC servo không đƣợc thiết kế cho các dòng điện cao và thƣờng phù hợp hơn cho các ứng dụng nhỏ hơn. Động cơ DC còn đƣợc chia làm 2 loại động cơ 1 chiều có chổi than và động cơ 1 chiều không chổi than. Nhờ sự phát triển vƣợt bậc công nghệ điều khiển điện nên hiện nay hầu hết ngƣời ta đều sử dụng động cơ AC Servo. 1.3.Cấu tạo của động cơ Servo. * Động cơ DC Servo. -Động cơ DC có chổi than: gồm 4 cấu tạo chính stato, rotor, chổi than và cuộn cảm lõi. - Ưu điểm: của động cơ DC có chổi than là tƣơng đối dễ điều khiển, giá thành tƣơng đối rẻ. - Nhược điểm: Khi vận hành thƣơng gây ra tiếng ồn, nhiệt độ cao khi vậ hành và quán tính cao khi giảm tốc độ. Để khắc phục đƣợc vân đề này thì ngƣời ta hay dùng động cơ DC không chổi than. Hình 13.2 cấu tạo động cơ Servo Động cơ DC không chổi than: Cấu trúc của nó tƣơng đối giống với động cơ có chổi than. Điều khác biệt là các cuộn pha đƣợc lắp ở rotor là động cơ vĩnh cữu. * Động cơ AC Servo Động cơ AC Servo đƣợc sử dụng trong các ngành công nghiệp đa phần là động cơ một chiều không chổi than. Động cơ Servo có cấu tạo 2 phần chính giống với động cơ bƣớc là Rotor và Stator. Rotor là một nam châm vĩnh cửu có từ trƣờng mạnh. Stator là một cuộn dây đƣợc cuốn riên biệt, đƣợc cấp nguồn để làm quay Rotor. 122 - Ưu điểm: Điều khiển có tốc độ tốt, và trơn tru hầu nhƣ không giao động. Hiệu suất có thể đạt hơn 90%. Quá trình vận hành tạo ra ít nhiệt với tốc độ cao. Độ chính xác cao (tùy thuộc vào độ chính xác của bộ mã hóa). Mô-men xoắn, quán tính thấp, tiếng ồn thấp, không có bàn chải mặc. - Nhược điểm: Hệ điều chỉnh tốc độ động cơ tƣơng đối phức tạp. Giá thành lại khá cao. Nguyên lý hoạt động. Động cơ servo đƣợc hình thành bởi những hệ thống hồi tiếp vòng kín. Tín hiệu ra của động cơ đƣợc nối với một mạch điều khiển. Khi động cơ vận hành thì vận tốc và vị trí sẽ đƣợc hồi tiếp về mạch điều khiển này. Khi đó bầt kỳ lý do nào ngăn cản chuyển động quay của động cơ, cơ cấu hồi tiếp sẽ nhận thấy tín hiệu ra chƣa đạt đƣợc vị trí mong muốn. Mạch điều khiển tiếp tục chỉnh sai lệch cho động cơ đạt đƣợc điểm chính xác nhất. * Ứng dụng. - Ứng dụng trong ngành điện điện tử: Các máy móc lắp ráp tƣờng đòi hỏi tốc độ cao thì động cơ Servo đáp ứng đƣợc yêu cầu này. Đặc biệt là đối với AC Servo. - Ứng dụng trong ngành gia công cơ khí: Hiện nay ngành gia công cơ khí đặc biệt là đối với việc gia công các sản phẩm có độ chính xác cao ví dụ nhƣ máy cắt laser hay một số máy cắt khác thì ngƣời ta sẽ lựa chọn động cơ Servo thay vì động cơ bƣớc nhƣ trƣớc đây. Bên cạnh đó nó còn đƣợc ứng dụng rất nhiều trong các loại máy cắt CNC PLasma khác. 123 Ứng dụng trong ngành may mặc, ngành giấy, bao bì: Trong việc điều khiển các máy cuộn vải, giấy, bao bì để cắt hoặc in ấn 2. Phần cứng * Chuẩn bị : - Mạch Arduino UNO. - Breadboard còn gọi testboard. - Dây cắm test board. - 1 module servo SG90: Hình 13.3 Động cơ Servo MG90 Động cơ servo cũng đƣợc chia làm nhiều loại, phụ thuộc vào góc quay tối đa của chúng, 2 loại phổ biến hay sử dụng là: Động cơ servo quay 180°: Futaba S3003, MG90[S] ... Động cơ servo quay 360°: MG995, MG996R ... Nhƣ đã đề cập bên trên, động cơ servo là loại động cơ cho phép ta điều khiển một cách cực kì chính xác. Vì vậy, khác với động cơ thông thƣờng ta chỉ cần cấp nguồn cho động cơ là có thể vận hành đƣợc. Động cơ servo yêu cầu ta phải cấp nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thƣờng đƣợc đánh màu nhƣ sau: + Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau + Nâu: nối với cực âm của mạch + Vàng: nhận tín hiệu từ mạch điều khiển * Lắp mạch : 124 Hình 13.3 Giao tiếp bo arduino UNO với động cơ Servo MG90 3. Lập trình và giải thích #include #define SERVO_PIN 9 // chan tin hieu cua servo noi voi chan so 9 arduino Servo gServo; void setup() { gServo.attach(SERVO_PIN); } void loop() { gServo.write(0); // điều chỉnh góc xoay của servo. delay(1000); gServo.write(90); // điều chỉnh góc xoay của servo. delay(1000); gServo.write(180); // điều chỉnh góc xoay của servo. delay(1000); } CÂU HỎI VÀ BÀI TẬP Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ DC servo Câu 2: Viết chƣơng trình điều khiển động cơ DC servo ? 125 BÀI 13: ĐIỀU KHIỂN ĐỘNG CƠ BƢỚC * Giới thiệu: Điều khiển động cơ DC (DC Motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) đƣợc dùng nhiều nhất trong các hệ thống tự động (ví dụ robot). Điều khiển đƣợc động cơ bƣớc là ta đã có thể tự xây dựng đƣợc cho mình rất nhiều hệ thống tự động. *Mục tiêu: Sau khi học xong bài học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo, chức năng và nguyên lý hoạt động của động cơ bƣớc, mạch ULN 2003. - Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động cơ bƣớc - Mô phỏng đƣợc chƣơng trình mạch điều khiển động cơ bƣớc bằng phần mềm mô phỏng - Kết nối đƣợc phần cứng mạch điều khiển động cơ bƣớc đúng yêu cầu kỹ thuật. - Viết, nạp và chạy đƣợc chƣơng trình điều khiển động cơ bƣớc - Rèn luyện tính tƣ duy và tác phong công nghiệp , đảm bảo an toàn cho ngƣời và thiết bị *Nội dung: 1. Giới thiệu động cơ bƣớc 1.1. Động cơ bƣớc là gì? Động cơ bƣớc (stepper motor), thực chất là một động cơ đồng bộ dùng để biến đổi các tín hiệu điều khiển dƣới dạng các xung điện rời rạc kế tiếp nhau thành các chuyển động góc quay. Hình 13.1. Động cơ bước 1.2 Cấu tạo động cơ bƣớc Về cấu tạo động cơ bƣớc gồm có các bộ phận là stato, roto là nam châm vĩnh cửu hoặc trong trƣờng hợp của động cơ biến từ trở là những khối răng làm bằng vật liệu nhẹ có từ tính. Động cơ bƣớc đƣợc điều khiển bởi bộ điều khiển bên ngoài. Động cơ bƣớc và bộ điều khiển đƣợc thiết kế sao cho động cơ có thể giữ nguyên bất kỳ vị trí cố định nào cũng nhƣ quay đến một vị trí bất kỳ nào. 126 Động cơ bƣớc có thể sử dụng trong hệ thống điều khiển vòng hở đơn giản, hoặc vòng kín, tuy nhiên khi sử dụng động cơ bƣớc trong hệ điều khiển vòng hở khi quá tải, tất cá các giá trị của động cơ đều bị mất và hệ thống cần nhận diện lại. Hình 13.2. Cấu tạo động cơ bước 1.3. Đặc điểm của động cơ bƣớc Động cơ bƣớc hoạt động dƣới tác dụng của các xung rời rạc và kế tiếp nhau. Khi có dòng điện hay điện áp đặt vào cuộn dây phần ứng của động cơ bƣớc làm cho roto của động cơ quay một góc nhất định gọi là bƣớc của động cơ. Góc bƣớc là góc quay của trục động cơ tƣơng ứng với một xung điều khiển. Góc bƣớc đƣợc xác định dựa vào cấu trúc của động cơ bƣớc và phƣơng pháp điều khiển động cơ bƣớc. Tính năng mở máy của động cơ đƣợc đặc trƣng bởi tần số xung cực đại có thể mở máy mà không làm cho roto mất đồng bộ. Chiều quay động cơ bƣớc không phụ thuộc vào chiều dòng điện mà phụ thuộc vào thứ tự cấp xung cho các cuộn dây. 1.4 Phân loại động cơ bƣớc Động cơ bƣớc đƣợc chia thành 3 loại chính là: Động cơ bƣớc biến từ trở. Động cơ bƣớc nam châm vĩnh cửu Động cơ bƣớc hỗn hợp/lai. 1.5. Phƣơng pháp điều khiển động cơ bƣớc Hiện nay có 4 phƣơng pháp điều khiển động cơ bƣớc. 127 Hình 13.3. xung điều khiển động cơ bước * Phương pháp điều khiển động cơ bước - Điều khiển dạng sóng (Wave): là phƣơng pháp điều khiển cấp xung điều khiển lần lƣợt theo thứ tự chon từng cuộn dây pha. - Điều khiển bƣớc đủ (Full step): là phƣơng pháp điều khiển cấp xung đồng thời cho 2 cuộn dây pha kế tiếp nhau. - Điều khiển nửa bƣớc (Half step): là phƣơng pháp điều khiển kết hợp cả 2 phƣơng pháp đều khiển dạng sóng và điều khiển bƣớc đủ. Khi điều khiển theo phƣơng pháp này thì giá trị góc bƣớc nhỏ hơn hai lần và số bƣớc của động cơ bƣớc tăng lên 2 lần so với phƣơng pháp điều khiển bƣớc đủ tuy nhiên phƣơng pháp này có bộ phát xung điều khiển phức tạp. - Điều khiển vi bƣớc (Microstep): là phƣơng pháp mới đƣợc áp dụng trong việc điều khiển động cơ bƣớc cho phép động cơ bƣớc dừng và định vị tại vị trí nửa bƣớc giữa 2 bƣớc đủ. Ƣu điểm của phƣơng pháp này là động cơ có thể hoạt động với góc bƣớc nhỏ,độ chính xác cao. Do xung cấp có dạng sóng nên động cơ hoạt động êm hơn,hạn chế đƣợc vấn đề cộng hƣởng khi động cơ hoạt động. 2. Phần cứng *Chuẩn bị: - Mạch Arduino UNO - Breadboard còn gọi testboard. - Dây cắm test board. - 1 bộ nguồn ngoài (5V đến 12V) ( trong bài này chúng ta có thể sử dụng nguồn 5Vdc của arduino nhƣng khuyến cáo hạn chế sử dụng để tránh việc hư board arduino). - 1 module điều khiển động cơ bƣớc ULN2003. 128 Hình 13.4. module điều khiển động cơ bước + Thông số kỹ thuật: Điện áp cung cấp: 5 ~ 12VDC. Tín hiệu ngõ vào: 4 chân in1, in2, in3, in4. Tìn hiệu ngõ ra: Jack cắm động cơ bƣớc 28BYJ-48. 4 led hiển thị trạng thái hoạt động của động cơ. - 1 động cơ bƣớc stepper 28BYJ-48: 129 Thông số kỹ thuật: Điện thế hoạt động 5V Số pha 4 Tỉ lệ bánh răng *64 Một bƣớc tƣơng đƣơng 5.625° (64 bƣớc) Tần số 100Hz Điện trở trong 50Ω±7%(25℃) Động cơ bƣớc sử dụng trong phần này là động cơ bƣớc 4 pha (thực ra là 2 pha đƣợc chia ra làm 2 ở mỗi pha ngay tại vị trí giữa) (gồm 5 dây), 4 trong 5 dây này đƣợc kết nối với 2 cuộn dây trong động cơ và 1 dây là dây nguồn chung cho cả 2 cuộn dây. Mỗi bƣớc của động cơ quét 1 góc 5.625 độ, vậy để quay 1 vòng động cơ phải thực hiện 64 bƣớc. * Lắp mạch: Hình 13.5. Giao tiếp UNO với động cơ bước 3. Lập trình và giải thích #define IN1 8 // IN1 nối với chân D8 của arduino #define IN2 9 // IN2 nối với chân D9 của arduino #define IN3 10 // IN3 nối với chân D10 của arduino #define IN4 11 // IN4 nối với chân D11của arduino int Steps = 4096; int cstep = 0; void setup() { 130 Serial.begin(9600); pinMode(IN1, OUTPUT); // các chân IN quy định là các chân ra pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { for(int x=0;x<Steps;x++) { step1(); //delay(1); delayMicroseconds(2500); } delay(1000); } void step1() { //stepp switch(cstep) { case 0: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; case 1: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); break; case 2: digitalWrite(IN4, LOW); 131 break; } cstep=cstep+1; if(cstep==8) {cstep=0;} } CÂU HỎI VÀ BÀI TẬP Câu 1: Trình bày cấu tạo và nguyên lý hoạt động của động cơ bƣớc? Câu 2: Viết chƣơng trình điều khiển động cơ bƣớc? ĐÁNH GIÁ KẾT QUẢ: (tính theo thang điểm 10) Mục tiêu Nội dung Điểm chuẩn Kiến thức - Phân tích đƣợc hoat động của mạch 1 - Giải thích đƣợc các điều kiện cần và đủ cho mạch hoạt động . 1 - Khởi động, truy xuất, lập trình đƣợc hoạt động của mạch 1 Kỹ năng - Sử dụng thành thạo phần mềm lập trình cho vi điều khiển 2 - Kết nối thiết bị và nạp đƣợc dữ liệu cho vi điều khiển đảm bảo đúng yêu cầu 2 Thái độ - Đảm bảo an toàn cho ngƣời và thiết bị 3 132 Tài liệu tham khảo: [1]Dự án Giáo dục kỹ thuật và Dạy nghề (VTEP), Tổng cục Dạy Nghề, Hà Nội, 2003 [2]Walter H. Buchbaum. Sc.D, Microprocessor and IC families [3]HPI Fachbuchreihen Pflaum Verlag Munchen - Mikrocompute Lehrbuch [4] I. Scott Makenzie - The avr Atmega16 microcontroller [5] Ngô Diên tập - lập trinhc với vi điều khiển avr

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_vi_dieu_khien_trinh_do_trung_cap_truong.pdf