Khối nguồn

Một phần của tài liệu ĐỀ TÀI THU THẬP DỮ LIỆU DÙNG RASPBERRY PI THÔNG QUA MẠNG INTERNET (Trang 46)

2. Nội dung thực hiện:

4.1.1. Khối nguồn

Hình 4.1: Sơ đồ nguyên lý khối nguồn

 Giới thiệu linh kiện được sử dụng:  IC 7805:

- Chức năng: ổn áp, tạo áp ra ổn định 5V cấp cho toàn mạch.

Hình 4.2: Hình ảnh thực tế IC 7805 - Các thông số kỹ thuật: + VI: 5 – 35 VDC + VO: Nhỏ nhất 4.8V; Lớn nhất 5.2V; Trung bình 5V + 5.0mA ≤ IO ≤ 1.0A + PO ≤ 15W

Đồ án tốt nghiệp

Hình 4.3: Hình ảnh thực tế của tụ điện, led đơn và điện trở

 Nguyên lý hoạt động:

Nguồn vào (J1) có giá trị từ 5VDC đến 35VDC, tụ C1 có tác dụng chống nhiễu ngõ vào làm ổn định nguồn vào. Ngõ ra có giá trị điện áp 5VDC và dòng

Đồ án tốt nghiệp

điện tối đa là 1A, tụ C2 cũng có tác dụng chống nhiễu nguồn ra giúp nguồn được ổn định, led đơn để báo có nguồn.

Dòng qua led là:

Với thiết kế nguồn này ta có thông số nguồn của mạch là: điện áp 5VDC, dòng tối đa 1A.

J2 dùng để lấy nguồn trực tiếp 5VDC, J3 dùng để cấp nguồn cho encoder.

4.1.2 Khối kết nối vi điều khiển với các cảm biến:

Hình 4.4: Sơ đồ nguyên lý khối kết nối vi điều khiển với các cảm biến

 Giới thiệu các linh kiện được sử dụng:  LM35:

Đồ án tốt nghiệp

Hình 4.5: Sơ đồ chân và hình dạng của LM35

- Các thông số cơ bản:

+ Đo nhiệt độ dạng Celsius (OC). + Độ phân giải 10.0mV/ OC.

+ Phạm vi nhiệt độ đo được: -55 OC – 150 OC + Điện áp cung cấp: 4 – 30VDC.

 HS 1101

- Chức năng: cảm biến đo độ ẩm.

Hình 4.6: Sơ đồ chân và hình dạng của HS 1101

- Các thông số cơ bản: + VI: 5 – 10V

+ Đo độ ẩm dạng phần trăm (%RH) + Phạm vi độ ẩm đo được: 0 – 100 %

+ Điện áp ra Vo theo độ ẩm tương ứng như bảng sau:

RH (%) 0 10 20 30 40 50 60 70 80 90 100 Điện áp (V) - 1.41 1.65 1.89 2.12 2.36 2.60 2.83 3.07 3.31 3.55

Đồ án tốt nghiệp

Hình 4.7: Sơ đồ kết nối HS1101 với IC 555

+ Công thức tính tần số xung ngõ ra mạch đo dùng IC 555: thigh = C@%RH × (R2 + R4) × ln2

tlow = C@%RH × R2 × ln2

F = 1 / (thigh + tlow) = 1 / (C@%RH × (R4 + 2 × R2) × ln2 Output duty cycle = thigh × F = R2 / (R4 + 2 × R2)

Với C@%RH là giá trị điện dung của HS 1101: 180 đến 183 pF + Bảng tần số xung tương ứng giá trị độ ẩm:

RH (%) 0 10 20 30 40 50 60 70 80 90 100 F (Hz) 7351 7224 7100 6976 6853 6728 6600 6468 6330 6186 6033

+ Công thức tính điện dung của HS 1101 theo độ ẩm:

C (pF) = C@55% × (1.2510-7 RH3 – 1.3610-5 RH2 + 2.1910-3 RH + 9.010-1)

Đồ án tốt nghiệp

 Encoder

- Điện áp hoạt động: 5V - Dòng tiêu thụ 20mA

- 12800 xung; với 2 kênh A, B lệch pha nhau góc 90o.

Điện áp (V) I (Không tải) Tốc độ I (Tải) 5V 35mA 60 rpm 0.4A 12V 42mA 190 rpm 1A

- Áp tối đa: 31V  Nguyên lý hoạt động:

Khi cấp nguồn, LM35 cập nhật nhiệt độ môi trường và đưa tín hiệu điện áp đến chân RA0 của PIC (tương ứng kênh analog AN0), vi điều khiển thực hiện chuyển đổi điện áp thành tín hiệu số qua bộ ADC 10 bit.

HS 1101 cập nhật độ ẩm môi trường và đưa ra xung điện áp thông qua mạch tạo xung IC555, tần số xung thay đổi theo độ ẩm và được đưa đến chân RA4/T0CKI (được định cấu hình hoạt động ở chế độ đếm xung ngoại counter0). Vi điều khiển xử lý và tính toán ra giá trị độ ẩm.

Tín hiệu ra dạng xung của encoder được đưa đến chân RC0/T1CKI (được định cấu hình hoạt động ở chế độ đếm xung ngoại counter1). Vi điều khiển xử lý và tính toán ra giá trị tốc độ quay của động cơ.

Đồ án tốt nghiệp

• Nhiệt độ:

Độ phân giải của ADC được tính theo công thức:

SS= 2 −1 − = + − N REF REF V V StepSize

Trong đó: N: số bit của ADC (=10 bit) VREF+ = 5V

VREF- = 0V  StepSize = 4.8875 mV

Theo thông số của cảm biến LM35 thì hệ số chuyển đổi nhiệt độ sang điện áp tương tự là 10mV/OC, tầm nhiệt đo được từ -55OC – 150OC.

Để đo và hiển thị đúng nhiệt độ đo thì độ phân giải của ADC phải trùng với độ phân giải của cảm biến LM35 là StepSize = 10mV

 Như vậy để đo được nhiệt độ thực tế của cảm biến LM35 thì cần phải lấy giá trị nhiệt độ đo được của PIC chia cho 2.046 lần.

 Nhiệt độ thực tế: • Tính tốc độ quay:

 Tính toán dòng điện tiêu thụ: ILM35 = 10 mA

IIC555 = 6 mA Iencoder = 20 mA

=> Dòng điện tiêu thụ của khối các cảm biến là ICB = 10 + 6 + 20 = 36 (mA)

Đồ án tốt nghiệp

Hình 4.8: Sơ đồ nguyên lý kết nối LCD với vi điều khiển

 Giới thiệu LCD 16x2

Hình 4.9: Hình ảnh thực tế và sơ đồ chân của LCD 16x2

- Số chân: 16

- Điện áp nguồn cấp: 4.5 – 5.5 VDC - Dòng điện tiêu hao: 1 – 1.5 mA - VLed: 1.5 – 5.5 VDC

Đồ án tốt nghiệp

- Chức năng các chân: + Số 1: Vss, nối GND + Số 2: VDD nối nguồn 5V

+ Số 3: VEE kết nối tới nguồn qua biến trở để chỉnh độ tương phản + Số 4: chân RS. + Số 5: chân R/W + Số 6: chân E + Số 7 – 14: các chân dữ liệu + Số 15: Anode + Số 16: Kathode  Nguyên lý hoạt động:

LCD nhận dữ liệu từ vi điều khiển hiển thị ra màn hình.  Dòng điện tiêu thụ: ILCD = 1.5 + 200 = 201.5 (mA)

4.1.4 Khối chuyển đổi điện áp:

Hình 4.10: Sơ đồ nguyên lý khối chuyển đổi điện áp 5V sang 3V3

 Giới thiệu linh kiện sử dụng: • Diode Zener 1N4728A:

Đồ án tốt nghiệp

Hình 4.11: Diode zener 1N4728A

Điện áp Vz = 3.3V • MOSFET IRF540N:

Hình 4.12: Sơ đồ chân và kí hiệu của IRF540N

Thông số kỹ thuật: o RDS(ON) = 0.04Ω o VGS = 10V  Nguyên lý hoạt động:

Nguồn 5V qua zener 3V3 thành điện áp 3V3 được nối với cực G của MOSFET IRF540N để luôn luôn kích MOSFET hoạt động, cực S nối tới nguồn 3V3 qua điện trở 1K. Khi có tín hiệu ra ở chân truyền RC6/TX của vi điều khiển đưa đến cực D của MOSFET thì cực S có điện áp 3V3 và đưa đến Jack cắm nối với chân RX của Raspberry Pi để truyền dữ liệu.

Đồ án tốt nghiệp

4.1.5 Sơ đồ nguyên lý toàn mạch:

Đồ án tốt nghiệp

Hình 4.14: Sơ đồ nối dây UART trên Raspberry Pi

 Nguyên lý hoạt động toàn mạch:

Nhiệt độ từ LM35 dưới dạng tín hiệu điện áp đưa đến chân RA0/AN0 (ADC kênh 0) của vi điều khiển, được bộ ADC chuyển thành tín hiệu số, vi điều khiển xử lý và đưa giá trị nhiệt độ ra hiển thị LCD theo công thức đã nêu ở phần nhiệt độ mục 4.1.2.

HS 1101 đo độ ẩm môi trường, thông qua mạch tạo xung dùng IC555, ngõ ra mạch tạo xung đưa tín hiệu đến chân RA4/T0CKI (ngõ vào bộ đếm xung ngoại counter 0) để đếm số xung trong 1 giây (được định thời bằng timer 2). Sau đó thực hiện tính toán theo công thức đã nêu ở phần cảm biến độ ẩm mục 4.1.2 rồi đưa giá trị độ ẩm ra hiển thị LCD.

Encoder đo tốc độ động cơ cho tín hiệu ra dạng xung được vi điều khiển nhận vào tại chân RC0/T1CKI (ngõ vào bộ đếm xung ngoại counter 1). Giá trị xung được tính trong 1 giây (được định thời bằng timer 2), vi điều khiển xử lý tính toán theo công thức đã nêu ở phần encoder mục 4.1.2 rồi đưa ra giá trị tốc độ động cơ hiển thị LCD.

Đồng thời các giá trị nhiệt độ, độ ẩm, tốc độ động cơ sẽ được vi điều khiển truyển từ chân RC6/TX (chân truyền dữ liệu nối tiếp UART) qua khối chuyển đổi điện áp đến chân RX của Raspberry Pi. Raspberry nhận và xử lý dữ liệu đưa vào web server liên tục sau mỗi 30 giây.

Begin TMR2=155 bdn = bdn+1, TMR2IF_bit=0 Bdn%100==0 xungda=xungda+TMR0 TMR0=0 Đ S Đồ án tốt nghiệp

Do chỉ sử dụng ngõ ra ở PORT C và PORT D nên IPIC = 200 mA Itong = Iled + ICB + ILCD + IPIC = 10.6 + 36 + 201.5 + 200 = 448.7 (mA)

4.2 Lưu đồ và giải thuật

4.2.1 Lưu đồ và giải thuật của chương trình trên PIC 16F887

Chương trình trên vi điều khiển PIC 16F887 được viết bằng ngôn ngữ C, và sử dụng các thư viện từ phần mềm mikroC Pro for Pic cho các chức năng LCD 4 đường dữ liệu, chuyển đổi tín hiệu tương tự sang tín hiệu số ADC_init() đọc dữ liệu từ kênh thứ 0 bằng lệnh ADC_get_sample(0), UART_init(9600) cho truyền dữ liệu nối tiếp tốc độ 9600kbps.

4.2.1.1 Chương trình con ngắt định thời timer2

Ngắt timer2 xảy ra khi thanh ghi TMR2 8 bit đếm tràn, xung đếm với tốc độ 1MHz được chia từ nguồn dao động nội. Giá trị thanh ghi TMR2 được đặt trước là 155, và khi thanh ghi TMR2 đếm được 100 xung thì xảy ra tràn bit TMR2IF_bit=1 ngắt xảy ra. Mỗi lần sự kiện ngắt diễn ra biến “bdn” tăng lên 1 giá trị, thanh ghi TMR2 được set lại giá trị 155, cờ tràn bit TMR2IF_bit được xóa về 0. Đồng thời trong chuơng trình ngắt cũng xữ lý việc đọc xung ngoại độ ẩm, từ thanh ghi TMR0 của timer0 lưu vào biến “xungda” mỗi khi giá trị của “bdn” chia hết cho 100 rồi xóa giá trị TMR0 về 0.

Begin

Cấu hình LCD và hiển thị các dòng text : “Toc do:”, “ND:”, “DA:”

Đồ án tốt nghiệp

Hình 4.15: Lưu đồ chương trình con ngắt định thời timer2

4.2.1.2 Chương trình con cấu hình LCD (cauhinh_LCD())

Chương trình thực hiện chức năng cài đặt cấu hình LCD 4 đường dữ liệu bằng lệnh lcd_init(), và bắt đầu thực hiện việc xóa màn hình với lệnh lcd_cmd(_lcd_clear), và con trỏ màn hình hoạt động chế độ tắt bằng lệnh lcd_cmd(_lcd_cursor_off). Đồng thời chương trình cũng xữ lý việc ghi dòng text1[]=”Toc do:” tại vị trí dòng 1 cột 1 bằng lệnh lcd_out(1,1,text1), dòng text2[]=”ND:” tại vị trí dòng 2 cột 1 với lệnh lcd_out(2,1,text2), dòng 2 cột 9 là vị trí hiển thị text3[]=”DA:” thông qua lệnh lcd_out(2,9,text3).

Begin

Cấu hình truyền UART 9600, khung truyền 9 bit.

End

Begin

Hiển thị dữ liệu lên LCD

Đồ án tốt nghiệp

Hình 4.16: Lưu đồ chương trình cấu hình LCD (cauhinh_LCD())

4.2.1.3 Chương trình con cấu hình truyền dữ liệu UART (cauhinh_UART)

Hình 4.17: Lưu đồ chương trình cấu hình truyền dữ liệu UART (cauhinh_UART)

Chương trình sử dụng thư viện hổ trợ từ chương trình mikroC Pro for Pic với lệnh UART1_init(9600) để định cấu hình truyền dữ liệu UART tốc độ 9600kbps. Và các lệnh thiết lập chế độ truyền nhận, RX9_bit=1 cho phép nhận dữ liệu với khung 9 bit, TX9_bit=1 truyền đi khung dữ liệu 9 bit, không sử dụng chức năng kiểm tra địa chỉ dữ liệu thông qua lệnh ADDEN_bit=0.

4.2.1.4 Chương trình con hiển thị giá trị lên LCD (hienthi())

Việc ghi giá trị nhiệt độ, độ ẩm và tốc độ quay động cơ ra hiển thị LCD được thực hiện thông qua các lệnh sau : giá trị dạng ACSII của tốc độ quay lưu trong biến “txttdq”, sẽ được đưa ra hiển thị tại vị trí dòng 1 cột 11 qua lệnh lcd_out (1,11,txttdq). Tương tự cho các giá trị nhiệt độ và độ ẩm.

Begin

Cấu hình timer2 định thời xung nội theo ngắt, timer0 và timer1 đếm xung ngoại. cho phép ngắt cờ tràn timer2

Đồ án tốt nghiệp

Hình 4.18: Lưu đồ chương trình con hiển thị LCD ( hienthi())

4.2.1.5 Chương trình con cấu hình timer-counter (cauhinh_timer_counter())

Timer2 được cấu hình hoạt động chế độ ngắt định thời xung nội qua lệnh INTCON=0XD0, bit TMR2ON_bit=1 cho phép timer2 đếm xung, khi giá trị đếm tại thanh ghi 8 bit TMR2 tràn thì cờ tràn TMR2IF_bit=1, ban đầu bit này được set về 0. Các bit TOUTPS0_BIT=1, TOUTPS3_BIT=0, TOUTPS1_BIT=0, TOUTPS2_BIT=0 tạo tỉ lệ chia 1:2 với nguồn xung vào timer0.

Timer1 được cấu hình hoạt động ở chế độ đếm xung ngoại từ chân RC0/T1CKI (chân số 15 vđk pic16f887) qua các lệnh sau : TMR1CS_BIT=1 cấu hình timer1 ở chế độ đếm xung ngoại, cho phép timer1 đếm bằng lệnh TMR1ON_BIT=1, T1CKPS0_BIT=0, T1CKPS1_BIT=0 là hai bit phục vụ việc chia giá trị xung đếm tỉ lệ 1/1. Giá trị đếm của timer1 sẽ lưu vào hai thanh ghi TMR1L và TMR1H với số xung tối đa là 65535.

Timer0 cũng được cấu hình hoạt động chế độ đếm xung ngoại từ chân RA4/T)CKI (chân số 6 của vđk pic16f887) qua việc cài đặt giá trị thanh ghi 8 bit OPTION_REG =0x20. Giá tri đếm sẽ được lưu trong thanh ghi 8 bit TMR0.

Byte địa chỉ Byte dữ liệu

Begin

Truyền dữ liệu nhiệt độ, đổ ẩm, tốc độ quay động cơ

End

dem>=3

tdqtong=tdqtong/3; ndtong=ndtong/3; xungdat=xungdat/3; giá trị nhiệt độ, độ ẩm, tốc độ quay được tính toán theo công thức. Begin

Cấu hình timer/counter; Cấu hình ADC kênh thứ 0; Cấu hình LCD; Cấu hình UART;

Bdn>=10000

Chuyển dữ liệu nd, da, tdq thành dạng mã ASCII để hiển thị LCD

bdn=bdn-1000; dem=dem+1; tdqt=xungtdq; xungdat=xungdat+xungda; ndt=adc_get_sample(0); tdqtong=tdqtong+tdqt; ndtong=ndtong+ndt; TMR1H=TMR1L=0; xungda=0;

Hiển thị LCD

xungtdq=0; xungda=0; xungdat=0; xungdatong=0; xungtdqtong=0; dem=0; TMR0=0; TMR1L=0; TMR1H=0, TMR2=155; xungtdq=(TMR1H<<8) + TMR1L;

dem=0; tdqtong=0; ndtong=0; xungdatong=0; Truyền dữ liệu UART

Đồ án tốt nghiệp

Hình 4.19: Lưu đồ chương trình con cấu hình timer-counter (cauhinh_timer_counter())

4.2.1.6 Chương trình con truyền dữ liệu UART (truyendulieu_UART())

Dữ liệu nhiệt độ, độ ẩm và tốc độ quay động cơ sẽ được truyền đến kit Raspberry pi thông qua lệnh truyền uart1_write(nd); uart1_write(da); uart1_write(tdq). Các dữ liệu sẽ được truyền liên tục và cách nhau bởi một byte địa chỉ, giúp xác phân biệt các dữ liệu tại Raspberry Pi khi nhận về.

Hình 4.20: Lưu đồ chương trình con truyền dữ liệu UART (truyendulieu_UART())

Đồ án tốt nghiệp

Hình 4.21: Lưu đồ chương trình chính trên vi điều khiển PIC 16F887

Bắt đầu chương trình là việc gọi các chương trình con cấu hình cauhinh_timer_counter(), cauhinh_LCD(), và các lệnh cấu hình ADC kênh thứ 0, cauhinh_UART() và các lệnh đặt giá trị ban đầu cho các biến.

Đồ án tốt nghiệp

Tiếp theo là lệnh gán giá trị biến xungtdq=(TMR1H<<8) + TMR1L để đưa giá trị hai thanh ghi vào biến “xungtdq” và thực hiện các lệnh chuyển đổi giá trị nhiệt độ “nd” độ ẩm “da” tốc độ quay “tdq” thành giá trị mã ACSII để có thể hiển thị lcd.

Kiểm tra giá trị của biến “bdn” nếu giá trị thỏa bdn>=10000 thì thực hiện các công việc sau: bdn=bdn-10000, tăng biến “dem” lên 1 đơn vị, lưu xung tốc độ quay vào biến “tdqt”, nhiệt độ đo cũng được gán vào biến “ndt”. Sau đó thực hiện cộng dồn giá trị của biến “tdqt” vào biến “tdqtong”, giá trị biến “ndt” cộng dồn vào biến “ndtong” xung độ ẩm được cộng dồn vào biến “xungdat”. Rồi xóa biến “xungda” về 0, hai thanh ghi TMR1L và TMR1H cũng được đặt về 0.

Nếu giá trị của biến “bdn” không thỏa điều kiện bdn>=10000 thì gọi chương trình con hienthi(), kết thúc chương trình.

Kiểm tra giá trị biến “dem” nếu thỏa dem>=3 thi thực hiện các lệnh sau : chia giá trị các biến “tdqtong”, “ndtong”, “xungdat” cho 3, rồi thực hiện tính toán cho ra giá trị nhiệt độ, độ ẩm và tốc độ quay theo các công thức nêu ở mục 4.1. rồi thực hiện gọi chương trình con truyền dữ liệu truyendulieu_UART() để gữi dữ liệu đến Raspberry pi, và xóa các biến “xungdatong”, “tdqtong”, “ndtong” về giá trị 0 rồi trở lại vòng lập tiếp theo tiếp tục chuyển dữ liệu nd, da, tdq đo được thành mã ASCII và thực hiện các lệnh tiếp sau đó. Nếu giá trị biến “dem” không thỏa dem>=3 thì quay trở lại bước trước đó.

4.2.2 Lưu đồ và giải thuật của chương trình trên Raspberry Pi

Trong đồ án này ngôn ngữ được sử dụng để lập trình trên Raspberry là Python. Sau đây là các chương trình được viết để nhận và xử lý dữ liệu từ PIC 16F887

4.2.2.1 Chương trình nhận dữ liệu UART:

Do PIC 16F887 truyền với tốc độ baud là 9600 baud nên chương trình trên Raspberry cũng phải cấu hình UART với tốc độ tương ứng là 9600 baud. Lệnh cấu hình như sau: serial = Serial (“ttyAMA0”, 9600).

Trước đó đầu chương trình phải khai báo sử dụng thư viện webiopi: import webiopi Dữ liệu được Raspberry nhận liên tục, các dữ liệu nhận được phân biệt bằng 1 byte địa chỉ nhận trước đó, thứ tự nhận dữ liệu như sau:

Byte địa chỉ

tocdo=serial.readByte() Begin serial.available()>0 tt = serial.readByte() tt == 1 tt == 2 tt == 3

Một phần của tài liệu ĐỀ TÀI THU THẬP DỮ LIỆU DÙNG RASPBERRY PI THÔNG QUA MẠNG INTERNET (Trang 46)

w