Đây là bài giảng về đo lường và điều khiển thiết bị dùng arduino dùng cho các bạn mới bắt đầu làm quen với lĩnh vực này. Bài 1 gồm các nội dung chủ yếu là giới thiệu về bản mạch arduino, các chức năng của các chân, cách tiếp cận với việc lập trình. Từ đây người học sẽ có cái nhìn tổng quát về arduino và cách sử dụng chúng.
5. Arduino dùng để làm gì?
5
1. Nhà thông minh
2. Quân sự
3. Hàng không vũ trụ
4. Điều khiển tự động
5. Điều khiển giao thông
6 Y học
7 Khai thác dữ liệu
8 Quan trắc môi trường
9 Đo lường
8. 8
1.CHUẨN BỊ PHẦN CỨNG
- 1 board Arduino nano hoặc uno
- 1 cáp USB mini
- 1 bản mạch cắm dây PCB (không hàn)
- Một số dây nối, bóng led và một số linh kiện khác
2. Phần mềm: Arduino IDE 1.8.2
11.
ĐẠI LƯỢNG SỐ VÀ ĐẠI LƯỢNG TƯƠNG TỰ
Đại lượng tương tự: đại
lượng có những giá trị liên
tục
Đại lượng số: đại lượng có giá
trị rời rạc, mỗi điểm rời rạc
được mã hóa dưới dạng một
giá trị số
ADC
DAC
12. 12
- Điện áp toàn thang: Thang giá trị lớn nhất mà
phép đo có thể thực hiện được
- Độ phân giải
+ Đơn vị: bit
+ Cho biết giá trị nhỏ nhất mà phép đo có thể
thực hiện được.
Giá trị nhỏ nhất của phép đo =
(điện áp toàn thang)/(2m)
- Tốc độ lấy mẫu (tần số lấy mẫu)
+ Cho biết có bao nhiêu phép đo có thể thực
hiện trong một giây
13.
MỨC LOGIC
- Giá trị điện áp dùng để biểu
diễn giá trị 0 và 1 gọi là mức
logic
- thực tế: mức logic cao - thấp là
một dải điện áp cao và dải điện
áp thấp
2V
5V
0.8V
0V
14. Biểu diễn số nhị phân thông qua mức logic
- Số nhị phân được biểu diễn
bằng một chuỗi các mức
logic
- Mỗi một mức logic tương
ứng với một bit số
- Chuỗi xung nối tiếp tạo
thành một số: Một chuỗi
xác định các xung trong đó
mỗi bit được qui định bởi
một trạng thái trong khoảng
thời gian 1 xung nhịp
- Biểu diễn bởi một nhóm các mức trạng thái cùng tồn tại song song:
(Xung nhịp là dạng sóng tuần hoàn trong đó khoảng thời gian giữa
các xung (chu kì) bằng thời gian của một bit).
15. Truyền dữ liệu
Dữ liệu là một nhóm các bit vận chuyển thông tin.
Truyền nối tiếp: Các bít được lần lượt truyền nối
tiếp nhau trên 1 đường truyền dưới sự điều khiển
của xung nhịp.
Truyền song song: Tất cả các bit được gửi đồng
thời ra ngoài trên các đường truyền riêng biệt. Có
một bit có một đường truyền.
19. Baudrate: Số bit truyền được trong 1s
(600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200)
Frame: quy định số bit trong mỗi lần truyền
Start bit: Bit đầu tiên được truyền trong một frame
Data: thông tin mà nhận được trong quá trình truyền nhận.
Trong STM32 khung truyền là 8bit hoặc 9bit.
Parity bit: kiểm tra dữ liệu truyền có đúng hay không
Stop bits: bit báo cáo để cho bộ truyền/nhận biết gói dữ
liệu đã được gửi xong
22. SCK: Xung giữ nhịp cho giao tiếp, mỗi nhịp trên chân SCK
=> 1 bit dữ liệu đến hoặc đi
MISO (Master Input / Slave Output): Ở master => in; Ở Slave => out
MOSI (Master Output / Slave Input): Ở master => out; Ở Slave => in
SS (Slave Select): chọn Slave cần giap tiếp, ở Slave SS ở mức
cao khi không làm việc. Master kéo đường SS của một
Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra
giữa Master và Slave đó. Chỉ có 1 đường SS trên mỗi Slave
nhưng có thể có nhiều đường điều khiển SS trên Master
23. - Cực của xung giữ nhịp (Clock Polarity- CPOL): trạng
thái của chân SCK ở trạng thái nghỉ (Idle). Có thể lấy
SCK mức cao (CPOL=1) hoặc thấp (CPOL=0) làm
trạng thái nghỉ.
- Phase (CPHA): cách mà dữ liệu được lấy mẫu (sample)
theo xung giữ nhịp. Dữ liệu có thể được lấy mẫu ở cạnh
lên của SCK (CPHA=0) hoặc cạnh xuống (CPHA=1).
=> 4 chế độ hoạt động của SPI, chọn chế độ nào tùy thuộc
vào nhà sản xuất chip slave
24.
25.
26. Chế độ chuẩn (standard mode) : 100 Kbit/s.
Chế độ tốc độ thấp (low-speed mode): 10 Kbit/s.
27. Có 2 đường truyền tín hiệu SDA và SCL
Master: điều khiển đường tín hiệu đồng hồ SCL và quyết
định hoạt động nào sẽ được thực hiện
Slave: Mỗi slave được gán địa chỉ vật lí cố định 7 bit
29. Khối địa chỉ: Gồm 7 bit truyền từ master xuống. Slave so
sánh với địa chỉ của nó. Nếu trùng địa chỉ thì tiến hành kết nối
giao tiếp
30. Bit Read / Write: xác định hướng truyền dữ liệu.
Master gửi dữ liệu tới Slave => đặt R/W=‘0’.
Master cần nhận dữ liệu từ Slave => đặt R/W= ‘1’.
31. Bit ACK / NACK: mặc định = 1; nếu địa chỉ của slave
trùng với địa chỉ mà master gửi tới thì slave đặt nó về 0
32. Khối dữ liệu: là dữ liệu cần truyền đi, nó nằm trước 1
bit ACK / NACK;. Khi nhận thành công thì slave sẽ đặt
bit ACK / NACK này thành 0
33. Điều kiện kết thúc: dữ liệu truyền trên
SDA kết thúc, master chuyển đường SDA
từ thấp sang mức cao sau đó SCL chuyển
từ cao xuống thấp.
34.
35. 1. Download Arduino IDE Software
2. Cài đặt
3. Chạy phần mềm, viết code
4. Chạy thử code, kiểm tra lỗi
5. Nạp code
6. Kiểm tra hoạt động phần cứng
7. Kiểm tra dữ liệu gửi lên máy tính
8. Quan sát đồ thị dữ liệu theo thời gian trên máy tính
35
37. 1. Giới thiệu ADS1115
2. Ghép nối ADS1115 với arduino
3. Lập trình đo điện áp visai
4. Chương trình mẫu
5. Ứng dụng khảo sát đặc trưng I-V của diode bán dẫn
37
38. 1. Giới thiệu ADS1115
38
- Độ phân giải: 16 bit
- Số kênh analog: 4 (đo đơn kênh hoặc visai)
- Chuẩn giao tiếp I2C
- Điện áp nguồn: 2-5V
- Tần số lấy mẫu: 8SPS~860SPS
- Điện áp toàn thang: +/- 6.144V; +/-4.096V; +/-2.048V; +/-
1.024V; +/- 0.512V; +/- 0.256V
39. 2. Ghép nối ADS1115 với arduino
39
Sơ đồ mạch điện ghép nối ADC với tín hiệu cần đo
Sơ đồ mạch điện ghép nối ADC với Arduino
40. 3. Lập trình đo điện áp visai
40
3.1. Thư viện “Adafruit_ADS1015.h” mã nguồn mở cho ADS1115
41. 3. Lập trình đo điện áp vi sai
41
- Khai báo sử dụng thư viện
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1015 ads;
Serial.begin(9600); // Khởi tạo cổng RS232
ads.begin(); // khởi tạo ADC
- Khởi tạo thư viện
ads.readADC_Differential_0_1(); // trả về giá trị điện áp 2 chân A0 và A1
- Đo điện áp visai
ads.readADC_Differential_2_3(); // trả về giá trị điện áp 2 chân A2 và A3
43. 5. Ứng dụng khảo sát đặc trưng I-V của diode bán dẫn
43
5.1 Thiết kế phần cứng
A0 A1 A2 A3
ADS1115
44. 5. Ứng dụng khảo sát đặc trưng I-V của diode bán dẫn
44
5.2 Viết code cho arduino
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads; // Declare an instance of the ADS1115
int16_t VrawADCvalue;
int16_t ArawADCvalue;
float scalefactor = 0.1875F;
float V = 0.0; // The result of applying the scale factor to the raw value
float A = 0.0; // The result of applying the scale factor to the raw value
byte i;
void setup()
{
Serial.begin(9600);
ads.begin();
}
45. 45
void loop()
{
while(Serial.read()==63){// nếu có ký tự có mã ASCII=63 gửi xuống thì...
for (i=0;i<10;i++) {
VrawADCvalue = ads.readADC_Differential_0_1(); // Chọn chân A0 và A1 in CH1
ArawADCvalue = ads.readADC_Differential_2_3(); //// Chọn chân A2 và A3 in CH2
V = V+(VrawADCvalue * scalefactor)/1000.0;// điện thế
A = A+(ArawADCvalue * scalefactor)/1000.0;//dòng điện
}
V=V/10;
A=A/10;
Serial.print(V,5); Serial.print(" "); Serial.println(A,5);
delay(10);
}
}