Chế tạo và điều khiển ổn định nhiệt độ một mô hình lò nhiệt đơn giản thông qua điều khiển một bóng đèn sợi đốt để tạo nhiệt độ, sử dụng cảm biến LM35 đo nhiệt độ và ứng dụng bo mạch Arduino để điều khiển
MỤC LỤC MỤC LỤC MỞ ĐẦU I MƠ HÌNH LỊ NHIỆT Cấu trúc mơ hình Xây dựng mơ hình II TỔNG QUAN VỀ BO MẠCH ARDUINO Bo mạch Arduino Phần mềm lập trình 13 Lập trình Arduino 15 Bo mạch Arduino ATmega 2560 19 III LẬP TRÌNH ĐIỀU KHIỂN ỔN ĐỊNH NHIỆT ĐỘ 22 Trình tự lập trình 22 Lập trình điều khiển ổn định nhiệt độ 23 KẾT LUẬN 28 MỞ ĐẦU Trong thực tế công nghiệp sinh hoạt hàng ngày, lượng nhiệt đóng vai trò quan trọng Năng lượng nhiệt dùng q trình cơng nghệ khác nung nấu vật liệu: nấu gang thép, khn đúc Vì việc sử dụng nguồn lượng cách hợp lý hiệu cần thiết Lò nhiệt ứng dụng rộng rãi cơng nghiệp đáp ứng nhiều yêu cầu thực tiễn đặt Ở lò nhiệt, yêu cầu kỹ thuật quan trọng phải điều chỉnh khống chế nhiệt độ lò Bài tốn điều khiển ổn định nhiệt độ u cầu phải có thuật tốn điều khiển phù hợp bên cạnh phải nắm bắt kiến thức vi điều khiển, lập trình vi điều khiển (Cấu trúc chức vi điều khiển, ngôn ngữ lập trình, khả giao tiếp vi điều khiển….) Với mục tiêu vận dụng kiến thức trang bị mơn học: Lập trình vi điều khiển nâng cao nhóm đề tài chọn đề tài: “Điều khiển ổn định nhiệt độ” Với mục tiêu đó, nhóm đề tài chế tạo điều khiển ổn định nhiệt độ mơ hình lò nhiệt đơn giản thơng qua điều khiển bóng đèn sợi đốt để tạo nhiệt độ, sử dụng cảm biến LM35 đo nhiệt độ ứng dụng bo mạch Arduino để điều khiển Nhóm đề tài không sâu vào phần lý thuyết điều khiển tự động mà tập trung vào cấu trúc bo mạch Arduino, ngơn ngữ, cách thức lập trình, xây dựng chương trình điều khiển ổn định nhiệt độ cho mơ hình theo điều khiển PID I MƠ HÌNH LỊ NHIỆT Cấu trúc mơ hình Nhóm đề tài xây dựng mơ hình lò nhiệt đơn giản có cấu trúc sau: Hình 1.1 Sơ đồ cấu trúc mơ hình ổn định nhiệt độ Các khối sơ đồ: CPU (Arduino Atmega2560): Bộ xử lý trung tâm, thực thu nhận tín hiệu từ cảm biến, giao tiếp với máy tính, tính tốn đưa tín hiệu điều khiển Trong đề tài sử dụng bo mạch Arduino Atmega2560 LCD: Sử dụng LCD 16x2 để hiển thị giá trị đặt nhiệt độ đọc từ cảm biến - Hình 1.2 Hình 1.2: LCD 16 x2 Máy tính: Giao tiếp với Arduino Atmega2560, đưa giá trị đặt, tham số PID xuống Arduino, nhận giá trị nhiệt độ tức thời, tính sai số, hiển thị đồ thị Hình 1.3 Giao diện điều khiển giám sát nhiệt độ máy tính Giao diện điều khiển xây dựng phần mềm Labview Mạch cơng suất Sơ đồ ngun lý mạch Hình 1.4 Sơ đồ nguyên lý Khối đo lường: Cảm biến nhiệt độ LM35 loại cảm biến tương tự, ứng dụng ứng dụng đo nhiệt độ thời gian thực LM35 hoạt động xác với sai số nhỏ, đồng thời với kích thước nhỏ giá thành rẻ ưu điểm Nhiệt độ xác định cách đo hiệu điện Hình 1.5 Cảm biến LM35 ngõ LM35 → Đơn vị nhiệt độ: °C → Nhiệt độ thay đổi tuyến tính: 10mV/°C Cảm biến LM35 hoạt động cách cho giá trị hiệu điện định chân Vout (chân giữa) ứng với mức nhiệt độ Như vậy, cách đưa vào chân bên trái cảm biến LM35 hiệu điện 5V, chân phải nối đất, đo hiệu điện chân chân analog arduino ta có nhiệt độ (0-100ºC) cơng thức: Nhiệt độ= 5.analogRead(chân Output).100/1024 (Chân Output cảm biến nối với chân analog arduino) Đối tượng điều khiển Bóng đèn sợi đốt 220v -25W Hình Bóng đèn sợi đốt 220V – 25W Sơ đồ nguyên lý hệ thống Hình 1.7 Sơ đồ nguyên lý hệ thống Xây dựng mơ hình Hình 1.8 Mơ hình thực tế II TỔNG QUAN VỀ BO MẠCH ARDUINO Bo mạch Arduino Arduino bo mạch vi xử lý dùng để lập trình tương tác với thiết bị phần cứng cảm biến, động cơ, đèn thiết bị khác Đặc điểm bật Arduino môi trường phát triển ứng dụng dễ sử dụng, với ngôn ngữ lập trình học cách nhanh chóng với người am hiểu điện tử lập trình Arduino chọn làm não xử lý nhiều thiết bị từ đơn giản đến phức tạp Trong số có vài ứng dụng thực chứng tỏ khả vượt trội Arduino chúng có khả thực nhiều nhiệm vụ phức tạp Bo mạch Arduino sử dụng dòng vi xử lý 8-bit megaAVR Atmel với hai chip phổ biến ATmega328 ATmega2560 Các dòng vi xử lý cho phép lập trình ứng dụng điều khiển phức tạp trang bị cấu hình mạnh với loại nhớ ROM, RAM Flash, ngõ vào digital I/O có nhiều ngõ có khả xuất tín hiệu PWM, ngõ đọc tín hiệu analog chuẩn giao tiếp đa dạng UART, SPI, TWI (I2C) Sức mạnh xử lý Xung nhịp: 16MHz EEPROM: 1KB (ATmega328) 4KB (ATmega2560) SRAM: 2KB (Atmega328) 8KB (Atmega2560) Flash: 32KB (Atmega328) 256KB (Atmega2560) Đọc tín hiệu cảm biến ngõ vào: - Digital: Các bo mạch Arduino có cổng digital cấu hình làm ngõ vào ngõ phần mềm Do người dùng linh hoạt định số lượng ngõ vào ngõ Tổng số lượng cổng digital mạch dùng Atmega328 14, Atmega2560 54 - Analog: Các bo mạch Arduino có trang bị ngõ vào analog với độ phân giải 10 bit Số lượng cổng vào analog Atmega328, 16 Atmega2560 Với tính đọc analog, người dùng đọc nhiều loại cảm biến nhiệt độ, áp suất, độ ẩm, ánh sáng, gyro, accelerometer… Xuất tín hiệu điều khiển ngõ ra: - Digital output: Tương tự cổng vào digital, người dùng cấu hình phần mềm để định dùng ngõ digital ngõ Tổng số lượng cổng digital mạch dùng Atmega328 14, Atmega2560 54 - PWM output: Trong số cổng digital, người dùng chọn số cổng dùng để xuất tín hiệu điều chế xung PWM Độ phân giải tín hiệu PWM 8bit Số lượng cổng PWM bo dùng Atmega328 6, bo dùng Atmega2560 14 Chuẩn Giao tiếp - Serial: Đây chuẩn giao tiếp nối tiếp dùng phổ biến bo mạch Arduino Mỗi bo có trang bị số cổng Serial cứng (việc giao tiếp phần cứng chip thực hiện) Bên cạnh đó, tất cổng digital lại thực giao tiếp nối tiếp phần mềm (có thư viện chuẩn, người dùng khơng cần phải viết code) Mức tín hiệu cổng TTL 5V Số lượng cổng Serial cứng Atmega328 Atmega2560 Với tính giao tiếp nối tiếp, bo Arduino giao tiếp với nhiều thiết bị PC, touchscreen, … - USB: Các bo Arduino tiêu chuẩn có trang bị cổng USB để thực kết nối với máy tính dùng cho việc tải chương trình Tuy nhiên chip AVR khơng có cổng USB, bo Ardunino phải trang bị thêm phần chuyển đổi 10 từ USB thành tín hiệu UART Do máy tính nhận diện cổng USB cổng COM cổng USB tiêu chuẩn - SPI: Đây chuẩn giao tiếp nối tiếp đồng có bus gồm có dây Với tính bo Arduino kết nối với thiết bị LCD, điều khiển video game, điều khiển cảm biến loại, đọc thẻ nhớ SD MMC… - I2C: Đây chuẩn giao tiếp đồng khác bus có hai dây Với tính này, bo Arduino giao tiếp với số loại cảm biến thermostat CPU, tốc độ quạt, số hình OLED/LCD, đọc real-time clock, chỉnh âm lượng cho số loại loa… Về mặt chức năng, bo mạch Arduino chia thành hai loại: loại bo mạch có chip Atmega loại mở rộng thêm chức cho bo mạch (thường gọi shield) Các bo mạch giống chức năng, nhiên mặt cấu số lượng I/O, dung lượng nhớ, hay kích thước có khác Một số bo có trang bị thêm tính kết nối Ethernet Bluetooth Các bo mở rộng chủ yếu mở rộng thêm số tính cho bo mạch ví dụ tính kết nối Ethernet, Wireless, điều khiển động v.v… Hình 2.1 Các bo mở rộng cho Arduino 11 12 Hình 2.2: Một số bo mạch Arduino 2.1 Giao diện chương trình Vùng lệnh Vùng viết chương trình Vùng thơng báo Hình 2.4: Giao diện chương trình Vùng lệnh: Bao gồm nút lệnh menu (File, Edit, Sketch, Tools, Help) Bên icon chức cho phép truy cập nhanh chức thường dùng IDE Vùng viết chương trình: Vùng người lập trình viết đoạn mã chương trình Vùng thơng báo: Vùng hiển thị số thơng tin chương trình: Dung lượng nhớ sử dụng, lỗi lập trình… 14 Lập trình Arduino 3.1 Cấu trúc chương trình Cấu trúc chương trình lập trình cho Arduino đơn giản - Setup() vùng dành cho khởi tạo, thiết lập biến, chế độ chân gọi lần chương trình bắt đầu chạy - Loop() phần chương trình chạy liên tục, lặp lặp lại Hai hàm bắt buộc chương trình, kể khơng có câu lệnh hàm - Ngồi hàm trên, người sử dụng tạo thêm chương trình phục vụ cho mục đích 3.2 Một số hàm lập trình Arduino - pinMode(pin, mode) : Thiết lập chân chế độ Output Input (pin: Chân bo mạch, mode : Chế độ yêu cầu (OUTPUT, INPUT, INPUT_PULLUP)) - digitalWrite(pin, value): Thiết lập mức điện áp cho chân pin, value: HIGH (5v) LOW (0v) - digitalRead(pin): Đọc trạng thái chân pin - analogRead(pin): Đọc giá trị chân analog Trả số nguyên khoảng đến 1023 (Các chân analog arduino 10bit) - analogWrite(pin, value): Tạo xung chân pin, độ rộng xung xác định thông qua biến value (0 - 255) - delay(ms): Dừng chương trình khoảng ms (mili giây) - Từ giao diện chương trình ta vào: Help- Reference để xem tất hàm, kiểu liệu, cấu trúc lập trình mà Arduino hỗ trợ 15 \ 16 17 Bên cạnh đó, với cộng đồng rộng lớn tạo số lượng lớn thư viện hỗ trợ cho Arduino, giúp cho việc lập trình đơn giản ngắn gọn Để thêm thư viện, vào Sketch – Include Library – Add.ZIP Library… Hình 2.5: Thêm thư viện cho lập trình 18 Bo mạch Arduino ATmega 2560 Arduino ATmega 2560 bo mạch vi điều khiển tảng vi điều khiển Atmega2560; Nó có 54 chân vào/ra (14 số 54 chân sử dụng chân PMW) 16 chân analog, cổng UART, tạo dao động 16Mhz, cổng USB, giắc nguồn, đầu ICSP, nút reset Hình 2.5: Bo mạch Arduino ATmega 2560 Thơng số Arduino Atmega2560 19 Hình 2.6: Phân bố chân Arduino ATmega 2560 Atmega2560 có 256 KB nhớ cho phép lưu trữ code chương trình (8 số 256KB sử dụng cho bootloader); KB SRAM KB EEPROM (Có thể đọc ghi với thư viện EEPROM) - 54 chân vào board sử dụng chân input ouput cách sử dụng hàm có sẵn phần mềm lập trình liền với board Arduino (pinMode(), digitalWrite(), digitalRead()….) chân hoạt động điện áp 5V Mỗi chân cung cấp nhận dòng tối đa 40mA có điển trở kéo bên khoảng 20-50K (Ở chế độ mặc định điện trở kéo không nối) Bên cạnh đó, số chân có thêm chức đặc biệt: • Serial: (RX) (TX); Serial1: 19 (RX) 18 (TX); Serial2: 17(RX) 16(TX); Serial 3: 15 (RX) 14 (TX) • chân ngắt ngoài: (interrupt 0), (interrupt 1), 18(interrupt 5), 19 (interrupt 4), 20 (interrupt 3) 21 (interrupt 2) • PMW: đến 13 (8 bit) • I2C: 20 (SDA) 21 (SCL) • Atmega2560 có 16 chân analog (10bit) 20 Kích thước bo mạch Arduino Atmega 2560 (mm) Hình 2.7: Kích thước board Arduino ATmega2560 21 III LẬP TRÌNH ĐIỀU KHIỂN ỔN ĐỊNH NHIỆT ĐỘ Trình tự lập trình - Khai báo thư viện sử dụng - Đặt tên chân sử dụng - Định nghĩa thiết lập trạng thái chân - Thiết lập ngắt (INT0, INT1) (Tăng, giảm nhiệt độ) - Thiết lập truyền thông - Thiết lập LCD - Thiết lập Timer - Khởi tạo giá trị ban đầu cho biến - Đọc cảm biến LM35 - Đọc giá trị đặt (Từ nút nhấn, Từ máy tính) - Gửi LCD máy tính Setup() Loop() Tính sai số nhiệt độ PID số Hàm ngắt timer Tín hiệu điều khiển Các chương trình phục vụ cho chương trình - Ngắt INT0 (Giảm nhiệt độ) - Ngắt INT1 (Tăng nhiệt độ) - Hàm ngắt truyền thông - Hàm hiển thị LCD Hình 3.1: Trình tự lập trình 22 Các chương trình Lập trình điều khiển ổn định nhiệt độ /* Chuong trinh dieu khien nhiet su dung PID Dieu khien nhiet thong qua dieu khien sang cua bong den 220VAC 25w Su dung cam bien nhiet LM35, Bong den 220 25W Chan analog cam bien LM35 noi voi chan A13 chan ngat INT0, INT1 duoc su dung de tang giam nhiet dat thong qua nut nhan Chan cap xung dieu khien sang bong den : Chan so 13 */ // -Khai bao cac thu vien can thiet -#include // Bo dinh thoi timer #include // Thu vien LCD giao tiep I2C #include // Thu vien bo loc Kalman SimpleKalmanFilter simpleKalmanFilter(2, 2, 0.015); LiquidCrystal_I2C lcd(0x3F, 16, 2); // - Dinh nghia cac chan #define Light 13 // Chan cap xung dieu khien den #define pin_LM35 A13 // Chan doc cam bien LM35 // - Khai bao bien float LM35_Read; // Doc analog tu LM35 int set_temp ; // Nhiet dat float read_temp, giatridoc, giatrido; // Nhiet doc tu LM35 float T, anpha, beta, gama; // Chu ki lay mau PID va cac he so trung gian float Output, LastOutput, Kp, Ki, Kd, E, E1, E2 ; String a, strKp, strKi, strKd, datasend; // Cho nhan du lieu tu May tinh int i=0; // - Khoi tao cac gia tri ban dau -void setup() { // put your setup code here, to run once: pinMode(pin_LM35,INPUT); // Chan analog doc LM35 pinMode(Light, OUTPUT); // Chan cap xung dieu khien den // Khoi tao ngat Int0 Int1 pinMode(2, INPUT); pinMode(3, INPUT); attachInterrupt(digitalPinToInterrupt(2), Tangnhietdo, RISING ); // Ngat INT0, nhan suon len attachInterrupt(digitalPinToInterrupt(3), Giamnhietdo, RISING ); // Ngat INT1, nhan suon len 23 // Khoi tao truyen thong Serial.begin(9600); // Hien thi LCD luc khoi dong lcd.begin(); lcd.backlight(); // In man hinh LCD lcd.print(" WELCOME "); lcd.setCursor(0, 1); lcd.print("ON DINH NHIET DO"); delay(5000); lcd.clear(); // Xoa man hinh LCD lcd.setCursor(0, 0); lcd.print("T DAT: oC"); lcd.setCursor(0, 1); lcd.print("T DO : oC"); // Thiet lap timer Timer1.initialize(200000); // Khoi tao chu ki timer la 200ms Timer1.attachInterrupt( PID ); // Khi co ngat Timer goi ham PID // Khoi tao gia tri ban dau cho cac bien Kp = 95; Ki = 2.05; Kd = 10; E = 0; E1 = 0; E2 = 0; T = 0.2, anpha = 0; beta = 0; gama = 0; Output = 0; LastOutput = 0; set_temp=25; // Nhiet dat, mac dinh ban dau=30 read_temp=0; giatridoc=0; giatrido=0; datasend = String(' '); // Khoi tao lai datasend de bat dau qua trinh tiep theo } // -Void loop void loop() { giatridoc = analogRead(pin_LM35); giatrido = giatridoc * 5.0 / 1024.0; //float dienap=map(LM35_Read, 0, 1024, 0, 5); // Co the su dung ham de tinh read_temp = giatrido * 100.0; read_temp = simpleKalmanFilter.updateEstimate(read_temp); for(i=0;i