Lợi dụng điểm này có thể sử dụng 2 chân GPIO để làm chân giao tiếp I2C mềm mà không nhất thiết cần một chân CLK tạo xung với tốc độ chính xác (có thể chỉ cần dùng delay và bật tắt mức [r]
(1)1
ỦY BAN NHÂN DÂN TỈNH BR – VT
TRƢỜNG CAO ĐẲNG KỸ THUẬT CƠNG NGHỆ
GIÁO TRÌNH MƠ ĐUN: VI ĐIỀU KHIỂN NGHỀ: ĐIỆN TỬ CÔNG NGHIỆP
TRÌNH ĐỘ: TRUNG CẤP
Ban hành kèm theo Quyết định số: /QĐ-CĐKTCN ngày…….tháng….năm 2020 của Hiệu trưởng trường Cao đẳng KTCN BR – VT
Bà Rịa – Vũng Tàu, năm 2020
(2)2
TUYÊN BỐ BẢN QUYỀN
Nhằm đáp ứng nhu cầu học tập nghiên cứu cho giảng viên sinh viên nghề điện tử công nghiệp trƣờng Cao đẳng Kỹ thuật Công nghệ Bà Rịa – Vũng Tàu Chúng thực biên soạn tài liệu Vi điều khiển
Tài liệu đƣợc biên soạn thuộc loại giáo trình phục vụ giảng dạy học tập, lƣu hành nội nhà trƣờng nên nguồn thơng tin đƣợc phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo
(3)(4)1
LỜI GIỚI THIỆU
Trong chƣơng trình đào tạo nghề điện tử cơng nghiệp trƣờng cao đẳng Kỹ Thuật Công Nghệ Bà Rịa Vũng Tàu mô đun môn học Vi điều khiển mơ đun giữ vị trí quan trọng: rèn luyện kỹ lập trình điều khiển thiết bị cho học sinh Việc dạy thực hành đòi hỏi nhiều yếu tố: vật tƣ thiết bị đầy đủ đồng thời cần giáo trình nội bộ, mang tính khoa học đáp ứng với yêu cầu thực tế
Nội dung giáo trình “Vi điều khiển” bao gồm 17 : Bài 1:Tổng quan arduino uno r3
Bài 2: Cài đặt chƣơng trình arduino ide driver cho arduino Bài 3: Ngơn ngữ lập trình cho arduino
Bài 4: Cài đặt sử dụng phần mềm protues Bài 5: Giao tiếp với led đơn
Bài 6: Giao tiếp với nút nhấn Bài 7: Giao tiếp với led đoạn Bài 8: Giao tiếp với lcd
Bài 9: Adc-đọc tín hiệu số loại cảm biến Bài 10: Ngắt
Bài 11: Timer-counter
Bài 12 PWM -điều chỉnh độ sáng bóng đèn Bài 13: Giao tiếp I2C -đọc thời gian thực Bài 14: Điều khiển động dc
Bài 15: Điều khiển động servo Bài 16: Điều khiển động bƣớc
Bài 17: UART-giao tiếp arduino
Đã đƣợc xây dựng sở kế thừa nội dung giảng dạy trƣờng, kết hợp với nội dung nhằm đáp ứng yêu cầu nâng cao chất lƣợng đào tạo phục vụ nghiệp cơng nghiệp hóa, đại hóa đất nƣớc,
Giáo trình đƣợc biên soạn ngắn gọn, dễ hiểu, bổ sung nhiều kiến thức biên soạn theo quan điểm mở, nghĩa là, đề cập nội dung bản, cốt yếu để tùy theo tính chất ngành nghề đào tạo mà giảng viên tự điều chỉnh ,bổ xung cho thích hợp khơng trái với quy định chƣơng trình đào tạo trung cấp,cao đẳng
Tuy tác giả có nhiều cố gắng biên soạn, nhƣng giáo trình chắn khơng tránh khỏi thiếu sót, mong nhận đƣợc tham gia đóng góp ý kiến ta đồng nghiệp chuyên gia kỹ thuật đầu ngành
(5)2
Bà Rịa , ngày….tháng năm 2020
(6)3 MỤC LỤC
LỜI GIỚI THIỆU
MỤC LỤC
BÀI 1: TỔNG QUAN VỀ ARDUINO UNO R3
1 Tổng quan
2 Sơ đồ chân Arduino
BÀI 2: CÀI ĐẶT CHƢƠNG TRÌNH ARDUINO IDE VÀ DRIVER CHO ARDUINO 11
1.Cài đặt chƣơng trình Arduino IDE 11
1.1 Cài Java Runtime Environment (JRE) 11
1.2 Cài đặt Arduino IDE: 12
2 Cài đặt Driver Arduino Uno, mê ga,…: 14
2.1.Cài đặt Driver: 14
2.2 Nạp chƣơng trình cho Arduino Uno (mega tƣơng tự): 17
2.3.Cài đặt Driver Nano: 18
BÀI 3: NGƠN NGỮ LẬP TRÌNH CHO ARDUINO 27
1 Cấu trúc (structure) : 27
1.1 Cấu trúc tổng thể: 27
1.2 Cấu trúc điều khiển: 29
1.3 Cú pháp mở rộng 35
1.4 Comments - Viết ghi viết code Arduino 36
1.5 #define 37
1.6 #include 37
2 Biến số (variable) số (constant) 39
2.1 số (constant) 39
2.2 Biến số (variable): 45
3 Hàm thủ tục (function) 46
3.1.Hàm nhập xuất Digital I/O: 46
3.2 Hàm nhập xuất Analog I/O: 49
(7)4
3.4 Hàm thời gian: 53
3.5 Hàm Ngắt (interrupt) 56
3.6 Hàm Ngắt Ngoài: 57
3.7 Hàm Giao tiếp 60
BÀI 4: CÀI ĐẶT VÀ SỬ DỤNG PHẦN MỀM PROTUES 68
2.Sử dụng phần mềm mô protues 77
2.1 Hƣớng dẫn add thƣ viện cho Arduino IDE: 77
2.2 Vẽ mạch mô Arduino Proteus 80
BÀI 5: GIAO TIẾP VỚI LED ĐƠN 84
1 Giới thiệu 84
2 Phần cứng 85
3 Lập trình giải thích 85
BÀI 6: GIAO TIẾP VỚI NÚT NHẤN 90
1 Cấu tạo nút nhấn 90
2 Phần cứng 91
3 Lập trình giải thích 91
BÀI 7: GIAO TIẾP VỚI LED ĐOẠN 93
1 Cấu tạo led đoạn 93
2 Phần cứng 94
3 Lập trình giải thích 95
BÀI 8: GIAO TIẾP VỚI LCD 97
1 Cấu tạo LCD 97
2 Phần cứng 97
3 Lập trình giải thích 98
BÀI 9: ADC-ĐỌC TÍN HIỆU MỘT SỐ LOẠI CẢM BIẾN 100
1 Giới thiệu ADC 100
2 Phần cứng 101
3 Lập trình giải thích 101
BÀI 10: NGẮT NGỒI 103
1 Giới thiệu ngắt 103
3 Lập trình giải thích 105
(8)5
1 Giới thiệu timer- counter 106
1.1 Timer/Counter 107
1.2 Timer/Counter 113
2.Phần cứng 115
3 Lập trình giải thích 115
BÀI 12: PWM -ĐIỀU CHỈNH ĐỘ SÁNG CỦA BÓNG ĐÈN 117
1 Giới thiệu PWM 117
1.1 Kiến thức 117
1.2.Liên hệ với Arduino: 118
2 Phần cứng 120
3 Lập trình giải thích 121
BÀI 13: GIAO TIẾP I2C -ĐỌC THỜI GIAN THỰC 122
1 Giới thiệu I2C 122
1.1.Khái niệm: 122
1.2 Cấu tạo nguyên lý hoạt động: 122
2 Phần cứng 123
3 Lập trình giải thích 124
BÀI 14: ĐIỀU KHIỂN ĐỘNG CƠ DC 128
1 Giới thiệu động DC 128
1.1 Định nghĩa 128
1.2 Phân loại động điện chiều 129
1.3 Cấu tạo nguyên tắc hoạt động 129
1.4.Điều chỉnh tốc độ động điện chiều 130
2 Phần cứng 131
3 Lập trình giải thích 132
BÀI 15: ĐIỀU KHIỂN ĐỘNG CƠ SERVO 134
1 Giới thiệu động servo 134
1.1 Động Servo nghĩ ? 134
1.2.Phân loại động Servo 134
1.3.Cấu tạo động Servo 135
2 Phần cứng 137
(9)6
BÀI 16: ĐIỀU KHIỂN ĐỘNG CƠ BƢỚC 139
1 Giới thiệu động bƣớc 139
1.1 Động bƣớc gì? 139
1.2 Cấu tạo động bƣớc 139
1.3 Đặc điểm động bƣớc 140
1.4 Phân loại động bƣớc 140
1.5 Phƣơng pháp điều khiển động bƣớc 140
2 Phần cứng 141
3 Lập trình giải thích 143
BÀI 17: UART-GIAO TIẾP GIỮA ARDUINO 146
1 Giới thiệu UART 146
2 Phần cứng 149
3 Lập trình giải thích 150
(10)7
GIÁO TRÌNH MƠ ĐUN Tên mơ đun: Vi điều khiển
Mã mô đun:MĐ 18
*Vị trí, tính chất,ý nghĩa vai trị mơ đun:
- Vị trí mơ đun : Mơ đun đƣợc bố trí sau học sinh học xong môn học chung,mô đun đo lƣờng điện , kỹ thuật điện tử , kỹ thuật xung số , điện tử cơng suất - Tính chất mơ đun : Là môn học chuyên ngành
- Ý nghĩa vai trị mơ đun: Giúp cho ngƣời học có khả lập trình điều khiển thiết bị ngoại vi hệ thống vi điều khiển
* Mục tiêu mô đun: - Về kiến thức:
+ Cài đặt sử dụng đƣợc phần mềm Arduino IDE Driver cho Arduino, Protues …
+ Phân tích cấu trúc, ứng dụng vi điều khiển công nghiệp + Kiểm tra viết đƣợc số chƣơng trình điều kiển thiết bị ngoại vi - Về kỹ năng:
+ Mô đƣợc mạch giao tiếp Arduino với thiết bị ngoại vi + Lắp ráp kết nôi đƣợc phần cứng Arduino với thiết bị ngoại vi
+ Thực lập trình điều khiển đƣợc thiết bị ngoại vi yêu cầu kỹ thuật;
- Về lực tự chủ trách nhiệm:
Ngƣời học có khả làm việc độc lập làm nhóm, có tinh thần hợp tác, giúp đỡ lẫn học tập rèn luyện, có ý thức tự giác, tính kỷ luật cao, tinh thần trách nhiệm cơng việc
(11)8
BÀI 1: TỔNG QUAN VỀ ARDUINO UNO R3 *Giới thiệu
Bài học giới thiệu bo mạch ARDUINO UNO R3 điện áp vào, *Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Hiểu đƣợc cấu tạo, thông số kỹ thuật Arduino Uno R3 - Trình bày đƣợc chức năng,nhiệm vụ chân Arduino - Áp dụng đƣợc Arduino Uno R3 vào thực tiễn
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung: 1 Tổng quan
Arduino thật bo mạch vi xử lý đƣợc dùng để lập trình tƣơng tác với thiết bị phần cứng nhƣ 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 Và điều làm nên tƣợng Arduino mức giá thấp tính chất nguồn mở từ phần cứng tới phần mềm
Arduino Uno sử dụng chip Atmega328 Nó có 14 chân digital I/O, chân đầu vào (input) analog, thạch anh dao động 16Mhz Một số thông số kỹ thuật nhƣ sau :
Chip ATmega328
Điện áp cấp nguồn 5V
Điện áp đầu vào (input) (kiến nghị )
7-12V
Điện áp đầu vào(giới hạn) 6-20V
Số chân Digital I/O 14 (có chân điều chế độ rộng xung PWM) Số chân Analog (Input )
DC Current per I/O Pin 40 mA DC Current for 3.3V Pin 50 mA
Flash Memory 32KB (ATmega328) với 0.5KB sử dụng
bootloader
(12)9
EEPROM KB (ATmega328)
Xung nhịp 16 MHz
2 Sơ đồ chân Arduino
Hình 1.1: Arduino UnO r3 * USB (1)
Arduino sử dụng cáp USB để giao tiếp với máy tính Thơng qua cáp USB Upload chƣơng trình cho Arduino hoạt động, ngồi USB nguồn cho Arduino
* Nguồn ( )
Khi không sử dụng USB làm nguồn sử dụng nguồn ngồi thông qua jack cắm 2.1mm ( cực dƣơng giửa ) sử dụng chân Vin GND để cấp nguồn cho Arduino
Bo mạch hoạt động với nguồn điện áp từ – 20 volt Chúng ta cấp áp lớn nhiên chân 5V có mực điện áp lớn volt Và sử dụng nguồn lớn 12 volt có tƣợng nóng làm hỏng bo mạch Khuyết cáo ta nên dùng nguồn ổn định đến dƣới 12 volt
(13)10 vào chân làm hỏng Arduino
GND: chân mass * Chip Atmega328
Chip Atmega328 Có 32K nhớ flash 0.5k sử dụng cho bootloader Ngồi cịn có 2K SRAM, 1K EEPROM
* Input Output ( 4, 6)
Arduino Uno có 14 chân digital với chức input output sử dụng hàm pinMode(), digitalWrite() digitalRead() để điều khiển chân đề cập chúng phần sau
Cũng 14 chân digital số chân chức là: Serial : chân (Rx ), chân ( Tx) Hai chân dùng để truyền (Tx) nhận (Rx) liêu nối tiếp TTL Chúng ta sử dụng để giao tiếp với cổng COM số thiết bị linh kiện có chuẩn giao tiếp nối tiếp
PWM (pulse width modulation): chân 3, 5, 6, 9, 10, 11 bo mạch có dấu “~” chân PWM sử dụng để điều khiển tốc độ động cơ, độ sáng đèn…
SPI : 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK), chân hỗ trợ giao chuẩn SPI
I2C: Arduino hỗ trợ giao chuẩn I2C Các chân A4 (SDA) A5 (SCL) cho phép chúng tao giao tiếp giửa Arduino với linh kiện có chuẩn giao tiếp I2C
* Reset (7): dùng để reset Arduino
Câu hỏi ôn tập Câu1 Trình bày tổng quan vi điều khiển ?
(14)11
BÀI 2: CÀI ĐẶT CHƢƠNG TRÌNH ARDUINO IDE VÀ DRIVER CHO ARDUINO
*Giới thiệu
Bài học giới thiệu cách cài đặt Cài đặt nâng cấp,khởi động chƣơng trình,cài đặt thơng số ban đầu,Update linh kiên phần mềm chuyên ngành đƣợc ứng dụng rộng rãi
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Phân tích đƣợc bƣớc cài đặt phần mềm Arduino IDE - Cài đặt nâng cấp đƣợc phần mềm Arduino IDE
- Sử dụng thành thạo phần mềm Arduino IDE - Nạp đƣợc chƣơng trình mẫu vào arduino
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an toàn cho ngƣời thiết bị
*Nội dung:
1.Cài đặt chƣơng trình Arduino IDE
1.1 Cài Java Runtime Environment (JRE)
Vì Arduino IDE đƣợc viết Java nên ta cần phải cài đặt JRE trƣớc Arduino IDE Link:
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
(15)12
Việc cài đặt diễn đơn giản nhanh chóng 1.2 Cài đặt Arduino IDE:
Bƣớc 1: Truy cập địa chỉ:
https://www.arduino.cc/en/Main/Software
và tải chƣơng trình Arduino IDE phù hợp với hệ điều hành máy bao gồm Windown, Mac OS hay Linux Đối với Windown có cài đặt (.exe) Zip, Zip cần giải nén chạy chƣơng trình khơng cần cài đặt
- Click vào
(16)13
Sau download xong, ta bấm vào file vừa download arduino-1.8.13-windows.zip ta chọn “Extract here” để giải nén
(17)14 Sau chạy
file arduino.exe ta có giao diên Arduino IDE:
2 Cài đặt Driver Arduino Uno, mê ga,…: 2.1.Cài đặt Driver:
(18)15
(19)16
Khi có yêu cầu xác nhận cài đặt driver, chọn “Install”
(20)17
2.2 Nạp chƣơng trình cho Arduino Uno (mega tƣơng tự): Bƣớc 1: Khởi động Arduino IDE:
(21)18
Bƣớc 3:Vào Tools ta chọn quan trọng
Kết ta thấy Led chân số 13 (tích hợp board, led màu cam) Arduino Uno sáng giây tắt giây
2.3.Cài đặt Driver Nano:
2.3.1 Giới thiệu board arduino Nano
(22)19 2.3.2 Cài đặt driver cho Arduino Nano
Arduino Nano đƣợc kết nối với máy tính qua cổng Mini - B USB sử dụng chip CH340 để chuyển đổi USB sang UART thay dùng chip ATmega16U2 để giả lập cổng COM nhƣ Arduino Uno hay Arduino Mega, nhờ giá thành sản phẩm đƣợc giảm mà giữ nguyên đƣợc tính năng, giúp Arduino giao tiếp đƣợc với máy tính, từ thực việc lập trình
Trƣớc hết phải tải driver CH340 cho arduino nano: đƣờng linhk sau : https://sparks.gogo.co.nz/assets/_site_/downloads/CH34x_Install_Windows_v3
_4.zip
- Bƣớc 1: Giải nén thƣ mục vừa tải ⇒ mở thƣ CH341SER ⇒khởi động file SETUP.EXE
- Bƣớc 2: Nhấn chọn INSTALL
(23)20 2.3.3.Thông số kỹ thuật Arduino Nano:
IC ATmega328P
IC nạp giao tiếp UART CH340
Điện áp hoạt động 5V - DC
Điện áp đầu vào khuyên dùng 7-12V - DC Điện áp đầu vào giới hạn 6-20V - DC
Số chân Digital I/O 14 (trong có chân PWM)
Số chân Analog (độ phân giải 10bit, nhiều Arduino Uno chân)
Dòng tối đa chân I/O 40mA
Bộ nhớ flash 32KB với 2KB dùng bootloader
SRAM 2KB
EEPROM 1KB
Xung nhịp 16MHz
Kích thƣớc 0.73" x 1.70"
Chiều dài 45mm
2.3.4.Nạp chƣơng trình cho Arduino Nano: Bƣớc 1: Khởi động Arduino IDE
(24)21 Bƣớc 3:Vào Tools ta chọn nhƣ hình bên dƣới
(25)22 3.Arduino IDE
Arduino IDE nơi để soạn thảo code, kiểm tra lỗi upload code cho arduino
Hình 2.1: Arduino IDE
3.1 Arduino Toolbar: có số button chức chúng nhƣ sau :
Hình 2.2: Arduino Toolbar
- Verify: kiểm tra code có lỗi hay không
- Upload: nạp code soạn thảo vào Arduino
- New, Open, Save: Tạo mới, mở Save sketch
(26)23 Hình 2.3: IDE Menu * File menu:
Hình 2.4 File menu
Trong file menu quan tâm tới mục Examples nơi chứa code mẫu Ví dụ: Nhƣ cách sử dụng chân digital, analog, sensor …
(27)24 * Edit menu:
Hình 2.6: Edit menu * Sketch menu:
Hình 2.7: Sketch menu Trong Sketch menu :
- Verify/ Compile : chức kiểm tra lỗi code - Show Sketch Folder : hiển thị nơi code đƣợc lƣu - Add File : thêm vào Tap code
(28)25 * Tool memu:
Hình 2.8: Tool menu
Trong Tool menu ta quan tâm mục Board Serial Port
Mục Board : Chúng ta cần phải lựa chọn bo mạch cho phù hợp với loại bo mà bạn sử dụng Arduino Uno phải chọn nhƣ hình:
(29)26
Nếu ta sử dụng loại bo khác phải chọn loại bo mà có sai code Upload vào chip bị lỗi
Serial Port: nơi lựa chọn cổng Com Arduino Khi cài đặt driver máy tính thơng báo tên cổng Com Arduino bao nhiêu, ta việc vào Serial Port chọn cổng Com để nạp code, chọn sai khơng thể nạp code cho Arduino đƣợc
Câu hỏi ôn tập: Câu 1: Nêu bƣớc cài đặt Arduino IDE?
(30)27
BÀI 3: NGÔN NGỮ LẬP TRÌNH CHO ARDUINO * Giới thiệu:
Bài học giới thiệu cấu trúc, ngôn ngữ để viết chƣơng phần mềm Arduino ứng dụng thực tế
*Mục tiêu: Sau học xong học này, ngƣời học có khả - Sử dụng đƣợc cấu trúc điều khiển để viết chƣơng trình - Viết đƣợc chƣơng trình theo cấu trúc hàm
- Vận dụng kết hợp đƣợc cấu trúc điều khiển để giải tốn
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung:
1 Cấu trúc (structure) : 1.1 Cấu trúc tổng thể: 1.1.1 setup() loop() Giới thiệu
Những lệnh setup() đƣợc chạy chƣơng trình ta khởi động Ta sử dụng để khai báo giá trị biến, khai báo thƣ viện, thiết lập thông số,…
Sau setup() chạy xong, lệnh loop() đƣợc chạy Chúng lặp lặp lại liên tục ta ngắt nguồn board Arduino
Ví dụ
int led = 10; void setup() {
pinMode(led, OUTPUT); }
void loop() {
digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } Giải thích
(31)28
Sau chạy xong lệnh setup(), lệnh loop() đƣợc chạy đƣợc lặp lặp lại liên tục, tạo thành chuỗi:
digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); digitalWrite(led, HIGH); delay(1000);
1.1.2 Toán tử logic:
Tốn tử Ý nghĩa Ví dụ
and (&&) Và (a && b) trả TRUE a b mang giá trị TRUE Nếu a b FALSE (a && b) trả FALSE
or ( || ) Hoặc (a || b) trả TRUE có giá trị a b TRUE, trả FALSE a b FALSE
not ( ! ) Phủ định a mang giá trị TRUE (!a) FALSE ngƣợc lại
xor (^) Loại trừ (a ^ b) trả TRUE a b mang hai giá trị TRUE/FALSE khác nhau, trƣờng hợp cịn lại trả FALSE
1.1.3.Tốn tử so sánh :
Tốn tử Ý nghĩa Ví dụ
== So sánh (a == b) trả TRUE a b ngƣợc lại
!= So sánh không
bằng (a != b) trả TRUE a khác b ngƣợc lại > So sánh lớn (a > b) trả TRUE a lớn b FALSE
nếu a bé b
< So sánh bé (a < b) trả TRUE a bé b FALSE ngƣợc lại
<= Bé (a <= b) tƣơng đƣơng với ((a < b) or (a = b)) >= Lớn (a >= b) tƣơng đƣơng với ((a > b) or (a = b)) 1.1.4 Phép chia lấy dư%
Giới thiệu
(32)29 Cú pháp
<phần dƣ> = <số bị chia> / <số chia>; Ví dụ
x = % 5; // x x = % 5; // x x = % 5; // x x = % 5; // x Tham khảo
/* cập nhập lại giá trị hàm loop */ int values[10];
int i = 0; void setup() {} void loop() {
values[i] = analogRead(0);
i = (i + 1) % 10; // giá trị biến i không vƣợt }
Lưu ý
Phép chia lấy dƣ không khả dụng với kiểu liệu float 1.2 Cấu trúc điều khiển:
1.2.1 Câu lệnh if… else Cú pháp:
if ([biểu thức 1] [toán tử so sánh] [biểu thức 2]) { //biểu thức điều kiện [câu lệnh 1]
} else { [câu lệnh 2] }
Nếu biểu thức điều kiện trả giá trị TRUE, [câu lệnh 1] đƣợc thực hiện, ngƣợc lại, [câu lệnh 2] đƣợc thực
(33)30 // a = 10
Lệnh if khơng bắt buộc phải có nhóm lệnh nằm sau từ khóa else int a = 0;
if (a == 0) { a = 10; }
// a = 10
1.2.2 switch / case Mô tả
Giống nhƣ if, switch / case dạng lệnh thì, nhƣng đƣợc thiết kế chuyên biệt để ta xử ý giá trị biến chun biệt
Ví dụ, ta có biến action nhận trị từ module khác qua serial Nhƣng action nằm giá trị lúc ta sử dụng switch / case Ví dụ
switch (action) { case "0": //bat led break;
case "1": //bat led break;
default:
// mặc định khơng làm // ta có default: không }
Cú pháp switch (var) {
case label: //đoạn lệnh break;
case label: // Đoạn lệnh break;
/*
case more and more */
default: // statements }
Tham số
(34)31
label: đem giá trị biến SO SÁNH BẰNG với nhãn 1.2.3 for :
Giới thiệu
Hàm for có chức làm vịng lặp Bây lấy ví dụ đơn giản nhƣ sau: Tôi muốn xuất 10 chữ số (từ - 10) Serial
* “Nếu chưa đọc chưa biết kiến thức for, ta lập trình sau: ”
void setup() { Serial.begin(9600); Serial.println(1); println(2);
Serial.println(3); Serial.println(4); Serial.println(5); Serial.println(6); Serial.println(7); Serial.println(8); Serial.println(9); Serial.println(10); }
void loop() {
// khơng làm cả; }
Đoạn code dài lặp lặp lại câu lệnh Serial.println
* Nhưng sau biết hàm for ta cần đoạn code ngắn sau: void setup(){
Serial.begin(9600); int i;
for (i = 1;i<=10;i=i+1) { Serial.println(i);
} }
(35)32 }
Cấu trúc
Nếu ta chƣa biết vòng lặp hàm for, để hiểu đƣợc hàm for, ta cần nắm đƣợc phần:
- Hàm for vịng lặp có giới hạn - nghĩa chắn kết thúc (khơng sớm thi muộn)
- Nó vị trí xác định đến vị trí kết thúc - Cứ bƣớc xong, lại thực đoạn lệnh
- Sau đó, lại bƣớc tiếp, bƣớc bƣớc nhiều bƣớc, nhƣng không đƣợc thay đổi theo thời gian
Bây nói theo cách khoa học qua cú pháp hàm for (ta chia làm loại để dễ dàng ứng dụng vào code mình)
- For tiến (xuất phát từ vị trí nhỏ chạy đến vị trí lớn hơn) <vị trí kết xuất phát > bé <vị trí kết thúc>
for (<kiểu liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> += <mỗi lần bƣớc bƣớc>) {
<đoạn câu lệnh>; }
- For lùi (xuất phát từ vị trí lớn chạy vị trí nhỏ hơn) <vị trí xuất phát> lớn <vị trí kết thúc>
for (<kiểu liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> -= <mỗi lần lùi bƣớc>) {
<đoạn câu lệnh>; }
Và hiểu đƣợc cách sâu sắc cú pháp hàm For: for (<biến chạy> = <start>;<điều kiện>;<bƣớc>) {
//lệnh }
1.2.4 while Giới thiệu
(36)33 Cú pháp
while (<điều kiện>) { //các đoạn lệnh; }
Ví dụ
int giay = 1; int phut = 1;
while (giay < 60) { //Chừng day < 60 cịn chạy (<=60) Khi day == 60 đƣợc phút
giay += 1; }
phut+= 1; 1.2.5 break: Giới thiệu
break lệnh có chức dừng vòng lặp (do, for, while) chứa Khi dừng vịng lặp, tất lệnh phía sau break vịng lặp chịu ảnh hƣởng bị bỏ qua
Ví dụ int a = 0; while (true) { if (a == 5) break; a = a + 1;
} //a =
while (true) { while (true) { a++;
if (a > 5) break; }
a++;
if (a > 100) break; }
(37)34
continue lệnh có chức bỏ qua chu kì lặp vịng lặp (for, do, while) chứa Khi gọi lệnh continue, lệnh sau vịng lặp với bị bỏ qua để thực chu kì lặp Ví dụ
int a = 0; int i = 0;
while (i < 10) { i = i + 1;
continue; a = 1; }
//a 1.2.7 return : Giới thiệu
return có nhiệm vụ trả giá trị (cùng kiểu liệu với hàm) mà đƣợc gọi! Cú pháp
return;
return value; // Thông số
value: giá trị đối tƣợng Ví dụ
//Hàm kiểm tra giá trị cảm biến có ngƣỡng hay khơng int checkSensor(){
if (analogRead(0) > 400) { return 1; else{ return 0; } 1.2.8.goto : Giới thiệu
Nó có nhiệm vụ tạm dừng chƣơng trình chuyển đến nhãn đƣợc định trƣớc, sau lại chạy tiếp chƣơng trình!
Cú pháp
label: //Khai báo nhãn có tên label
(38)35 Thủ thuật
Không nên dùng lệnh goto chƣơng trình Program hay chƣơng trình sử dụng ngơn ngữ C Nhƣng sử dụng cách khôn ngoan ta tối ƣu hóa đƣợc nhiều điều chƣơng trình!
Vậy hữu ích nào, lúc dùng nhiều vịng lặp q muốn khỏi cách nhanh chóng!
Ví dụ
for(byte r = 0; r < 255; r++){ for(byte g = 255; g > -1; g ){ for(byte b = 0; b < 255; b++){
if (analogRead(0) > 250){ goto bailout;} //thêm nhiều câu lệnh
} } }
1.3 Cú pháp mở rộng 1.3.1 dấu chấm phẩy ( ; ) Giới thiệu
Dùng để kết thúc dịng lệnh Ví dụ
int ledPin = 13; Thủ thuật
Giả sử ta có qn dấu ";" khơng có vấn đề to tát lắm, chƣơng trình dịch Arduino tự động dị tìm lỗi thơng báo xác dịng bị lỗi!
1.3.2 {} dấu ngoặc nhọn Giới thiệu
Rất đơn giản, {} cặp dấu ngoặc nhọn, nên ta mở ngoặc phải đóng ngoặc lại cho nó!
Nhiệm vụ cung cấp cú pháp để gọi lệnh cho cấu trúc đặc biệt nhƣ (if, while, for, )
Cách sử dụng
Trong hàm thủ tục
void myfunction(<kiểu liệu> <tham số>){ <lệnh>;
(39)36 Vòng lặp
while (<điều kiện>) { <câu lệnh> } { <câu lệnh> }
while (<điều kiện>);
for (<khởi tạo>; <điều kiện>; <bƣớc>) {
<câu lệnh> }
Lệnh rẻ nhánh if (<điều kiện 1>) {
<lệnh 1> }
else if (<điều kiện 2>) {
<lệnh 2> }
1.4 Comments - Viết ghi viết code Arduino Giới thiệu
Ta khó ghi nhớ dịng code chƣơng trình thật dài, với thuật tốn phức tạp, Arduino làm cho ta cú pháp để giải vấn đề này, Comments
Comments giúp ta ghi cho dòng code trình bày nhiệm vụ để ta ngƣời khác hiểu đƣợc chƣơng trình làm đƣợc Và comments khơng đƣợc Arduino biên dịch nên cho dù ta viết dài đến đâu khơng ảnh hƣởng đến nhớ flash vi điều khiển Để comments Arduino, ta có cách:
(40)37 /* chƣơng trình đƣợc viết… */
void setup() {
pinMode(13, OUTPUT); // chân số 13 chân OUTPUT }
void loop() {
digitalWrite(13, HIGH); // bật led vòng giây delay(3000);
digitalWrite(13, LOW); // tắt led vòng giây delay(1000);
}
1.5 #define Giới thiệu
#define: đối tƣợng ngôn ngữ C/C++ cho phép ta đặt tên cho số nguyên hay số thực Trƣớc biên dịch, trình biên dịch thay tên ta sử dụng giá trị chúng Quá trình thay đƣợc gọi trình tiền biên dịch (pre-compile)
Cú pháp
#define [tên hằng] [giá trị hằng] Ví dụ
#define pi 3.14
Nếu ta viết code #define pi 3.14
float a = pi * 2.0; // pi = 6.28
thì sau pre-compile trƣớc biên dịch, chƣơng trình ta nhƣ này: #define pi 3.14
float a = 3.14 * 2.0; // a = 6.28 1.6 #include
Giới thiệu
#include : cho phép chƣơng trình ta tải thƣ viện đƣợc viết sẵn Tức ta truy xuất đƣợc tài nguyên thƣ viện từ chƣơng trình Nếu ta có đoạn code cần sử dụng nhiều chƣơng trình, ta dùng #include để nạp đoạn code vào chƣơng trình mình, thay phải chép chép lại đoạn code
Cú pháp
(41)38
Giả sử ta có thƣ mục cài đặt Arduino IDE tên ArduinoIDE, thƣ viện ta có tên EEPROM (đƣợc lƣu \ArduinoIDE\libraries\EEPROM\)
Một đoạn code lƣu file code.h nằm thƣ mục function thƣ viện EEPROM đƣợc khai báo nhƣ sau:
*Cấu trúc chƣơng trình Arduino:
Trong chƣơng trình Arduino, ta cần có tối thiểu hàm hệ thống chính, bắt buộc phải có Đó setup() loop()
* Hàm setup() loop() hoạt động sau:
Những lệnh setup() đƣợc chạy chƣơng trình ta khởi động Ta sử dụng để khai báo giá trị biến, khai báo thƣ viện, thiết lập thông số,…
(42)39
Ví dụ chương trình điều khiển led bản:
int led = 13; // khai báo chân điều khiển led chân số 13 arduino
void setup() { //toàn đoạn code nằm hàm chạy lần chạy chương trình
pinMode(led, OUTPUT); //sẽ chạy lần để khai báo chân arduino }
void loop() { // lặp lại mãi sau chạy xong setup() digitalWrite(led, HIGH); //bật led
delay(1000); // bật led vòng giây digitalWrite(led, LOW); // tắt led
delay(1000); // tắt led vịng giây sau bật led lặp lại trình }
2 Biến số (variable) số (constant) 2.1 số (constant)
- HIGH số có giá trị nguyên Trong điện tử, HIGH mức điện áp lớn 0V Giá trị HIGH định nghĩa khác mạch điện khác nhau, thường quy ước mức 1.8V, 2.7V, 3.3V 5V, 12V,
HIGH số có giá trị nguyên Xét đoạn code ví dụ sau:
(43)40 void setup() {
pinMode(led, OUTPUT); digitalWrite(led, HIGH); }
void loop() { }
Đoạn code có chức bật sáng đèn led nối với chân số 13 mạch Arduino (Arduino Nano, Arduino Uno R3, Arduino Mega 2560, ) Ta tải đoạn chƣơng trình lên mạch Arduino để kiểm chứng Sau đó, thử tải đoạn chƣơng trình lên:
int led = 13; void setup() {
pinMode(led, OUTPUT); digitalWrite(led, 1); }
void loop() { }
Sẽ xuất vấn đề:
Trong đoạn code thứ 2, "HIGH" đƣợc sửa thành "1"
Đèn led mạch Arduino sáng bình thƣờng với chƣơng trình khác Điều khẳng định "HIGH số có giá trị nguyên 1" nêu HIGH điện áp lớn 0V
Điện áp (điện thế) điểm trị số hiệu điện điểm cực âm nguồn điện (0V) Giả sử ta có viên pin vng 9V ta nói điện áp cực dƣơng cục pin 9V, hiệu điện cực cục pin 9V
Điện áp mức HIGH khơng có giá trị cụ thể nhƣ 3.3V, 5V, 9V, mà loại mạch điện, có trị số khác đƣợc quy ƣớc trƣớc Trong mạch Arduino, HIGH đƣợc quy ƣớc mức 5V 4V đƣợc xem là HIGH Ví dụ nhƣ mạch Arduino Uno R3, theo nhà sản xuất, điện áp đƣợc xem mức HIGH nằm khoảng từ 3V đến 5V
(44)41
- LOW: số có giá trị nguyên Trong điện tử, LOW mức điện áp 0V gần 0V, giá trị đƣợc định nghĩa khác mạch điện khác nhau, nhƣng thƣờng 0V chút xíu
LOW số có giá trị nguyên Xét đoạn code ví dụ sau:
int led = 13; void setup() {
pinMode(led, OUTPUT); }
void loop() {
digitalWrite(led, HIGH); delay(1000);
digitalWrite(led, LOW); delay(1000);
}
Đoạn code có chức bật sáng đèn led nối với chân số 13 mạch Arduino (Arduino Nano, Arduino Uno R3, Arduino Mega 2560, ) Ta tải đoạn chƣơng trình lên mạch Arduino để kiểm chứng Sau đó, thử tải đoạn chƣơng trình lên:
int led = 13; void setup() {
pinMode(led, OUTPUT); }
void loop() {
digitalWrite(led, HIGH); delay(1000);
digitalWrite(led, 0); delay(1000);
}
Sẽ xuất vấn đề:
Trong đoạn code thứ 2, "LOW" đƣợc sửa thành "0"
(45)42
Điện áp (điện thế) điểm trị số hiệu điện điểm cực âm nguồn điện (0V) Giả sử ta có viên pin vng 9V ta nói điện áp cực dƣơng cục pin 9V, cực âm 0V, hiệu điện cực cục pin 9V
Điện áp mức LOW khơng có giá trị cụ thể nhƣ 3.3V, 5V, 9V, mà loại mạch điện, có trị số khác nhƣng thƣờng 0V gần 0V Trong mạch Arduino, LOW đƣợc quy ƣớc mức 0V 0.5V có thể đƣợc xem LOW Ví dụ nhƣ mạch Arduino Uno R3, theo nhà sản xuất, điện áp đƣợc xem mức LOW nằm khoảng từ 0V đến 1.5V chân I/O
- Thiết đặt Digital Pins nhƣ INPUT, INPUT_PULLUP, OUTPUT
Chân kỹ thuật số đƣợc sử dụng nhƣ INPUT, INPUT_PULLUP , OUTPUT Để thay đổi cách sử dụng pin, sử dụng hàm pinMode()
- Cấu hình pin INPUT
Các pin Arduino ( Atmega ) đƣợc cấu hình INPUT với pinMode ( ) có nghĩa làm cho pin có trở kháng cao (khơng cho dịng điện ra) Pin đƣợc cấu hình INPUT làm việc tiêu thụ lƣợng điện mạch nhỏ, tƣơng đƣơng với loạt điện trở 100 Mega-ơm phía trƣớc pin Điều làm cho chúng hữu ích cho việc đọc cảm biến, nhƣng không cung cấp lƣợng đèn LED
Nói cách nơm na, dân dã, pin đƣợc cấu hình INPUT ta dễ dàng đọc đƣợc tín hiệu điện đọc đƣợc từ thứ (Có điện <= 5V)!
Nếu ta cấu hình pin INPUT, ta muốn pin có tham chiếu đến mặt đất (GND, cực âm), thƣờng đƣợc thực với điện trở kéo xuống ( điện trở xuống mặt đất ) nhƣ mô tả kỹ thuật số đọc nối tiếp
Cấu hình pin INPUT_PULLUP
Chip Atmega Arduino có nội kéo lên điện trở (điện trở kết nối với hệ thống điện nội bộ) mà ta truy cập Nếu ta khơng thích mắc thêm điện trở mạch ngồi, ta dùng tham số INPUT_PULLUP pinMode() Mặc định khơng đƣợc kết nối với mạch ngồi đƣợc kết nối với cực dƣơng pin nhận giá trị HIGH, pin đƣợc thông tới cực âm xuống đất nhận giá trị LOW
(46)43
Để thiết đặt pin OUTPUT, dùng pinMode ( ), điều có nghĩa làm cho pin có trở kháng thấp (cho dòng điện ra) Điều có nghĩa, pin cung cấp lƣợng điện đáng kể cho mạch khác Pin vi điều khiển Atmega cung cấp nguồn điện liên tục 5V thả chìm ( cho điện bên chạy vào ) lên đến 40 mA ( milliamps ) Điều làm cho chúng hữu ích để tạo lƣợng đèn LED nhƣng vô dụng cảm biến đọc!
Lúc giờ, ta làm làm ngắn mạch (digitalWrite pin HIGH nối trực tiếp đến cực âm digitalWrite pin LOW mắc trực tiếp đến cực dƣơng, việc làm tƣơng tự) mạch bị hỏng! Ngồi ra, với dịng điện 40mA số trƣờng hợp làm cho mô tơ relay hoạt động đƣợc Để làm chúng hoạt động cần chuẩn bị cho số mạch sử dụng IC khuếch đại chuyên dụng (gọi mạch giao tiếp)
- true Giới thiệu
true : logic Ta hiểu true số nguyên mang giá trị Trong biểu thức logic, số hay giá trị một biểu thức khác đƣợc xem nhƣ mang giá trị true
Lƣu ý
Không đƣợc viết "true" thành TRUE hay dạng khác Các giá trị sau tƣơng đƣơng nhau: true, HIGH,
- false Giới thiệu
Trái lại với true, false logic có giá trị phủ định true (và ngƣợc lại), tức (!true) = false Ta hiểu false số nguyên mang giá trị Trong biểu thức logic, số hay giá trị biểu thức đƣợc xem nhƣ false
Lƣu ý
Khơng đƣợc viết "false" thành FALSEhay dạng khác Các giá trị sau tƣơng đƣơng nhau: false, LOW,
- Hằng số nguyên Giới thiệu
Hằng số nguyên số đƣợc sử dụng trực tiếp chƣơng trình Theo mặc định, số có kiểu int (trong pascal kiểu int giống nhƣ kiểu integer)
Ví dụ
(47)44 a = 0;
}
Ở 10 đƣợc gọi nguyên
Thông thƣờng, số nguyên đƣợc biểu thị dƣới dạng thập phân, nhƣng ta biểu thị chúng hệ số khác nhƣ sau:
Hệ số Ví dụ Định dạng Ghi
10 (thập phân) 159 biểu thị chữ số từ
đến (nhị phân) B1111011 bắt đầu 'B'
(hoặc '0B') biểu thị chữ số (bát phân) 0173 bắt đầu '0' biểu thị chữ số từ
0-7 16 (thập lục
phân) 0x7B bắt đầu '0x'
biểu thị chữ số từ 0-9 kí tự từ A-F (hoặc a-f) Hậu tố U L
Theo mặc định, số nguyên đƣợc coi số nguyên kiểu int với hạn chế giao tiếp giá trị Để xác định số nguyên với kiểu liệu khác, ta phải tuân theo quy tắc sau:
Dùng 'u' 'U' để biểu thị kiểu liệu unsigned (không âm) Ví dụ: 33u Dùng 'l' 'L' để biểu thị kiểu liệu long Ví dụ: 100000L
Dùng 'ul' 'UL' để biểu thị kiểu liệu unsigned long Ví dụ: 32767ul - Hằng số thực
Giới thiệu
Tƣơng tự nhƣ số nguyên, số thực (floating point constants) có cách làm việc sử dụng tƣơng tự Khi ta viết biểu thức tính tốn, giá trị biểu thức đƣợc tính trình biên dịch thay biểu thức số thực tính đƣợc Điều gợi ý chƣơng trình lớn, để giảm thời gian biên dịch, ta nên tính trƣớc giá trị biểu thức thay bắt trình biên dịch tính tốn
Ví dụ
float a = 159;
float b = 0.159; // a = b
Để biểu thị số thực có giá trị cực lớn cực nhỏ, ta phải sử dụng kí hiệu khoa học "E" "e"
(48)45
10.0 10
2.34E5 2.34 * 105 234000
67e-12 67.0 * 10-12 0.000000000067
2.2 Biến số (variable): - Biến
Giới thiệu
Với từ khóa "const" nằm trƣớc khai báo biến, ta làm cho biến thành biến đọc "read-only"
Ví dụ
const float pi = 3.14; float x;
//
x = pi * 2; // ta dụng số pi tính tốn - đơn giản ta đọc pi = 7; // lỗi ! ta thay đổi giá trị số
Dùng const hay dùng #define ?
Để khai báo biến số (nguyên / thực) chuỗi ta dùng cách đƣợc Tuy nhiên, để khai báo biến mảng (array) số ta sử dụng từ khóa const Và lý khiến const đƣợc dùng nhiều đƣợc ƣa chuộng #define!
- static - biến tĩnh
Giới thiệu
Biến tĩnh biến đƣợc tạo lần gọi hàm lần khơng bị xóa để tạo lại gọi lại hàm Đây khác biệt biến tĩnh biến cục
Biến tĩnh loại biến lƣỡng tính, vừa có tính chất biến tồn cục, vừa mang tính chất biến cục bộ:
+ Tính chất biến tồn cục: biến khơng chƣơng trình kết thúc, nằm nhớ chƣơng trình đƣợc tự động cập nhật chƣơng trình đƣợc gọi lại Giống nhƣ biến toàn cục
+Tính chất biến cục bộ: biến đƣợc sử dụng chƣơng trình mà đƣợc khai báo
(49)46 Ví dụ
void setup(){
Serial.begin(9600); // Khởi tạo cổng Serial baudrate 9600 }
void loop() {
testStatus();// Chạy hàm testStatus
delay(500); // dừng 500 giây để ta thấy đƣợc thay đổi }
void testStatus() {
static int a = 0;// Khi khai báo biến "a" biến tĩnh
// có lần gọi hàm testStatus // biến "a" tạo lúc ta gán "a" có giá trị a++; Serial.println(a);
// Biến a không bị chạy xog hàm testStatus // Đó khác biệt biến tĩnh biến cục bộ! }
3 Hàm thủ tục (function) 3.1.Hàm nhập xuất Digital I/O: a digitalWrite():
Miêu tả:
Viết giá trị HIGH LOW cho chân số arduino
Nếu chân đƣợc cấu hình nhƣ OUTPUT với pinMode(), điện áp đƣợc thiết lập với giá trị tƣơng ứng: 5V (hoặc 3.3V 3.3V) cho HIGH, 0V cho LOW
Nếu chân đƣợc cấu hình nhƣ INPUT, digitalWrite()sẽ cho phép ( HIGH) hoặc vô hiệu hóa ( LOW) pullup nội chân đầu vào Nên thiết lập pinMode() để INPUT_PULLUP cho phép điện trở kéo lên bên
Cú pháp:
digitalWrite(pin, value); Thông số:
pin: Số chân digital mà ta muốn thiết đặt value: HIGH LOW
(50)47
Mã làm cho pin kỹ thuật số 13 OUTPUTvà chuyển đổi cách luân phiên HIGHvà LOWở tốc độ giây
int led =13; void setup() {
pinMode(led, OUTPUT); // led nối với chân số 13 }
void loop() {
digitalWrite(led, HIGH); // bật led
delay(1000); // dừng chương trình giây digitalWrite(led, LOW); // tắt led
delay(1000); // dừng chương trình giây }
Ghi chú:
Các chân đầu vào tƣơng tự đƣợc sử dụng nhƣ chân kỹ thuật số, đƣợc gọi A0, A1, v.v
b digitalRead(): Miêu tả:
Đọc giá trị từ Chân số đƣợc định, HIGH LOW Cú pháp
digitalRead(pin) Thông số
pin: số chân digital ta muốn đọc Trả
HIGH LOW Ví dụ:
int led = 12; // LED kết nối với chân số 12 int nutnhan = 7; // nút nhấn kết nối với chân số int val = 0; // biến để lƣu trữ giá trị đọc void setup ()
{
pinMode (led, OUTPUT); // chân số 12 đầu
pinMode (nutnhan, INPUT); // thiết lập chân số nhƣ đầu vào }
(51)48 {
val = digitalRead (nutnhan); // đọc pin đầu vào
digitalWrite (led, val); // thiết lập giá trị LED giá trị nút nhấn }
Ghi chú:
Nếu chân không đƣợc kết nối với thứ gì, digitalRead () trở lại HIGH LOW (và điều thay đổi ngẫu nhiên)
Các chân đầu vào tƣơng tự đƣợc sử dụng nhƣ chân kỹ thuật số, đƣợc gọi A0, A1, v.v
c pinMode(): Miêu tả:
Cấu hình pin quy định hoạt động nhƣ đầu vào (INPUT) đầu (OUTPUT)
Cú pháp:
pinMode(pin, mode) Thơng số:
pin: số chân có chế độ ta muốn thiết lập
mode: INPUT, OUTPUT, Hoặc INPUT_PULLUP Trả về:
Khơng có Ví dụ: void setup() {
pinMode (12, OUTPUT); // chân số 12 đầu }
(52)49 {
digitalWrite (12, HIGH); delay(1000);
digitalWrite (12, LOW); delay(1000);
}
3.2 Hàm nhập xuất Analog I/O: a analogRead()
Giới thiệu
Nhiệm vụ analogRead() đọc giá trị điện áp từ chân Analog (ADC) Board Arduino Uno có pin từ A0 đến A5 (8 pin Mini Nano, 16 pin Mega), chuyển đổi tƣơng tự 10-bit sang số
Điều có nghĩa lập đồ điện áp đầu vào từ đến volts thành số nguyên từ đến 1023 Điều tạo độ phân giải lần đọc: volts / 1024 đơn vị hoặc, 0,0049 volt (4,9 mV) đơn vị Dải đầu vào độ phân giải đƣợc thay đổi cách sử dụng
Hàm analogRead() cần 100 micro giây để thực
Khi ngƣời ta nói "đọc tín hiệu analog", ta hiểu việc đọc giá trị điện áp
Cú pháp
analogRead (pin) ; Thông số
pin: Số chân đầu vào tƣơng tự để đọc từ (0 đến hầu hết bo Arduino, đến Mini Nano, đến 15 Mega)
Trả
int (0 đến 1023) Ví dụ
Ví dụ đọc giá trị điện áp analogPin hiển thị int analogPin = 4; // chân đọc giá trị analog A4
int val = 0; // lưu giá trị analog đọc void setup()
{
Serial.begin(9600); // giao tiếp serial }
(53)50
val = analogRead(analogPin); // đọc giá trị analog chân A4 Serial.println(val); // hiển thị cửa sổ serial
}
Ghi chú:
Nếu pin đầu vào tƣơng tự không kết nối với thứ gì, giá trị trả analogRead () dao động dựa số yếu tố (ví dụ: giá trị đầu vào analog khác )
b analogReference () Miêu tả:
Cấu hình điện áp tham chiếu đƣợc sử dụng cho đầu vào analog (tức giá trị đƣợc sử dụng làm đầu vào) Các lựa chọn là:
Board Arduino (Uno, Mega, v.v.)
- DEFAULT: tham chiếu tƣơng tự mặc định volts or 3.3 volts
- INTERNAL: đặt mức điện áp với 1,1 volts ATmega168 ATmega328P 2,56 volts ATmega8 (không dùng Arduino Mega)
- INTERNAL1V1: đặt mức điện áp tối đa 1.1V (chỉ dành cho Arduino Mega) - INTERNAL2V56: đặt mức điện áp tối đa 2.56V (Arduino Mega)
- EXTERNAL: điện áp đƣợc áp dụng cho chân AREF (chỉ từ đến 5V) đƣợc sử dụng làm tham chiếu
Board SAMD Arduino (Zero, v.v )
(54)51
- AR_INTERNAL1V0: Đặt lại mức điện áp tối đa 1.0V - AR_INTERNAL1V65: Đặt lại mức điện áp tối đa 1.65V - AR_INTERNAL2V23: Đặt lại mức điện áp tối đa 2.23V
- AR_EXTERNAL: điện áp đƣợc áp dụng cho chân AREF đƣợc sử dụng làm tham chiếu
Board Arduino SAM (Do)
- AR_DEFAULT: tham chiếu analog mặc định 3.3V Đây tùy chọn đƣợc hỗ trợ cho Due
Cú pháp
analogReference(type); Thông số
type: kiểu giá trị sau: DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL (xem danh sách tùy chọn nhƣ mô tả)
Trả Khơng có Ghi
Nếu ta sử dụng kiểu EXTERNAL cho hàm analogReference ta phải cấp nguồn nằm khoảng từ 0-5V, ta cấp nguồn điện thỏa mãn điều kiện vào chân AREF ta phải gọi dòng lệnh
analogReference(EXTERNAL) trƣớc sử dụng analogRead() c analogWrite()
Miêu tả
analogWrite() lệnh xuất từ chân mạch Arduino mức tín hiệu analog (phát xung PWM) Ngƣời ta thƣờng điều khiển mức sáng tối đèn LED hay điều chỉnh tốc độ động
Tần số tín hiệu PWM hầu hết chân khoảng 490 Hz Trên board Uno board tƣơng tự, chân có tần số khoảng 980 Hz
Ta không cần gọi hàm pinMode() để đặt chế độ OUTPUT cho chân dùng để phát xung PWM mạch Arduino
Cú pháp:
analogWrite([chân phát xung PWM], [giá trị xung PWM]);
Giá trị mức xung PWM nằm khoảng từ đến 255, tƣơng ứng với mức duty cycle từ 0% đến 100%
(55)52 Khơng có
Ví dụ:
Đoạn code dƣới có chức làm sáng dần đèn LED đƣợc kết nối vào chân số mạch Arduino
int led = 2; void setup() { }
void loop() {
for (int i = 0; i <= 255; i++) { analogWrite(led,i);
delay(20); }
}
Đoạn code có chức làm sáng dần đèn LED đƣợc kết nối vào chân số 11 mạch Arduino
3.3 Hàm nhập xuất nâng cao I/O: a noTone();
Miêu tả
Ngừng tạo sóng vng kích hoạt tone() Khơng có hiệu lực khơng có tone đƣợc tạo
Cú pháp noTone(pin) Thông số
pin: chân để dừng tone Trả
Khơng có b pulseIn () Miêu tả:
Đọc thời gian xung (HIGH LOW) pin Ví dụ: giá trị CAO , pulseIn()đợi cho pin CAO , bắt đầu tính thời gian, sau đợi cho pin để LOW dừng thời gian Trả thời gian xung mili giây Cung cấp trả khơng có xung bắt đầu khoảng thời gian xác định
Hoạt động xung từ 10 microseconds đến phút chiều dài Cú pháp
pulseIn(pin, value)
(56)53 Thông số
pin: số pin mà ta muốn đọc xung (int)
value: loại xung để đọc: HIGH LOW (int)
timeout(tùy chọn): số microsecond chờ xung bắt đầu; mặc định giây (unsigned long)
3.4 Hàm thời gian: a delay()
Sự miêu tả
Tạm dừng chƣơng trình cho khoảng thời gian (tính mili giây) đƣợc định tham số (Có 1000 mili giây = giây.)
Cú pháp delay(ms) Thông số
ms: số mili giây để tạm dừng ( unsigned long) Trả
Khơng có Ví dụ
int ledPin = 13; // LED pin 13 void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
b delayMicroseconds () Miêu tả
Tạm dừng chƣơng trình cho khoảng thời gian (tính mili giây) đƣợc định tham số Và 1000000 micro giây = giây
Cú pháp
(57)54 us: số microseconds để tạm dừng ( unsigned int) Trả
Khơng có Ví dụ
int outPin = 7; // chan so void setup() { pinMode(outPin, OUTPUT); } void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50); digitalWrite(outPin, LOW); delayMicroseconds(50); } Ghi chú:
Chức hoạt động xác phạm vi micro giây Và đảm bảo delayMicroseconds thực xác cho thời gian trễ nhỏ c micros()
Miêu tả:
micros() có nhiệm vụ trả số - thời gian (tính theo micro giây) kể từ lúc mạch Arduino bắt đầu chƣơng trình ta Nó tràn số quay số (sau tiếp tục tăng) sau 70 phút Tuy nhiên, mạch Arduino 16MHz (ví dụ Duemilanove Nano) giá trị hàm tƣơng đƣơng đơn vị micro giây
Lƣu ý: 106 micro giây = giây Tham số
Không có Trả
Một số nguyên kiểu unsigned long thời gian kể từ lúc thƣơng trình Arduino đƣợc khởi động
Ví dụ
unsigned long time; void setup(){
(58)55 void loop(){
Serial.print("Time: "); time = micros();
// in thời gian kể từ lúc chƣơng trình đƣợc bắt đầu Serial.println(time);
// đợi giây trƣớc tiếp tục in delay(1000);
}
millis(); Giới thiệu
millis() có nhiệm vụ trả số - thời gian (tính theo mili giây) kể từ lúc mạch Arduino bắt đầu chƣơng trình ta Nó tràn số quay số (sau tiếp tục tăng) sau 50 ngày
Thơng số Khơng có Trả
Một số nguyên kiểu unsigned long thời gian kể từ lúc thƣơng trình Arduino đƣợc khởi động
Ví dụ
unsigned long time; void setup(){
Serial.begin(9600); }
void loop(){
Serial.print("Time: "); time = millis();
// in thời gian kể từ lúc chƣơng trình đƣợc bắt đầu Serial.println(time);
// đợi giây trƣớc tiếp tục in delay(1000);
}
Lưu ý :
(59)56 3.5 Hàm Ngắt (interrupt)
a interrupts() Giới thiệu
Mặc định, Arduino bật ngắt nên phần setup(), ta không cần gọi hàm để bật ngắt Hàm interrupts() bật toàn ngắt đƣợc cài đặt Nếu vì lý ta tắt ngắt hàm noInterrupts(), ta sử dụng hàm để bật lại ngắt
Cú pháp interrupts(); Thơng số Khơng có Trả Khơng có Ví dụ
void setup() {} void loop() {
noInterrupts();
// tắt ngắt để chạy
// đoạn chƣơng trình yêu cầu cao thời gian interrupts();
// bật lại ngắt, ngắt hoạt động // bình thƣờng trở lại
}
b noInterrupts() Giới thiệu
(60)57 void setup() {}
void loop() {
noInterrupts();
// tắt ngắt để chạy
// đoạn chƣơng trình yêu cầu cao thời gian interrupts();
// bật lại ngắt, ngắt hoạt động // bình thƣờng trở lại
}
3.6 Hàm Ngắt Ngoài: a attachInterrupt() Giới thiệu
Ngắt (interrupt) lời gọi hàm tự động hệ thống sinh kiện Những kiện đƣợc nhà sản xuất vi điều khiển thiết lập phần cứng đƣợc cấu hình phần mềm tên gọi cố định
Vì ngắt hoạt động độc lập tự sinh đƣợc cấu hình nên chƣơng trình đơn giản Một ví dụ điển hình ngắt hàm millis() Hàm tự động chạy với chƣơng trình trả số tăng dần theo thời gian chúng ta không cài đặt Việc cài đặt hàm millis() sử dụng đến ngắt đƣợc cấu hình tự động bên mã chƣơng trình Arduino
Vì cần phải dùng đến ngắt?
Ngắt giúp chƣơng trình gọn nhẹ xử lý nhanh Chẳng hạn, kiểm tra nút nhấn có đƣợc nhấn hay khơng, thơng thƣờng ta cần kiểm tra trạng thái nút nhấn hàm digitalRead() đoạn chƣơng trình loop() Với việc sử dụng ngắt, ta cần nối nút nhấn đến chân có hỗ trợ ngắt, sau cài đặt ngắt sinh trạng thái nút chuyển từ HIGH->LOW Thêm tên hàm gọi ngắt sinh Vậy xong, biến đoạn chƣơng trình ngắt cho ta biết trạng thái nút nhấn Số lƣợng ngắt phụ thuộc vào dòng vi điều khiển Với Arduino Uno ta có ngắt, Mega 2560 có ngắt Leonardo có ngắt
Cú pháp
attachInterrupt(interrupt, ISR, mode); Thông số
(61)58
ra kiện ngắt Nếu dùng ngắt số mà gắn nút nhấn chân digital khơng chạy đƣợc
ISR: tên hàm gọi có kiện ngắt đƣợc sinh mode: kiểu kích hoạt ngắt, bao gồm
LOW: kích hoạt liên tục trạng thái chân digital có mức thấp - HIGH: kích hoạt liên tục trạng thái chân digital có mức cao
- RISING: kích hoạt trạng thái chân digital chuyển từ mức điện áp thấp sang mức điện áp cao
- FALLING: kích hoạt trạng thái chân digital chuyển từ mức điện áp cao sang mức điện áp thấp
Lƣu ý: với mode LOW HIGH, chƣơng trình ngắt đƣợc gọi liên tục chân digital giữ mức điện áp tƣơng ứng
Trả Khơng Ví dụ:
int ledPin = 12; void tatled() {
// tắt đèn led nhấn nút, nhả led nhấp nháy trở lại digitalWrite(ledPin, LOW);
}
void setup() {
pinMode(ledPin, OUTPUT);
(62)59 attachInterrupt(0, tatled, LOW);
}
void loop() {
// đoạn chƣơng trình nhấp nháy led sau 500ms digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW); delay(500);
}
b detachInterrupt() Giới thiệu
Hàm detachInterrupt() tắt ngắt đƣợc kích hoạt tƣơng ứng với thơng số truyển vào Giả sử sau nhấn nút bấm lần đèn led tắt nhƣng nhấn lần thứ đèn không tắt Lúc cần dùng đến detachInterrupt() để tắt ngắt tạo
Cú pháp
detachInterrupt(interrupt); Thông số
interrupt: số thứ tự ngắt (xem thêm attachInterrupt() ) Trả
khơng Ví dụ
Đoạn chƣơng trình dƣới bật sáng đèn led tắt nhấn lần đầu tiên, thả đèn sáng lại Nếu tiếp tục nhấn đèn sáng mà khơng bị tắt int ledPin = 12; // đèn LED kết nối với chân digital 12
(63)60 void tatled()
{
digitalWrite(ledPin, LOW); // tắt đèn led nhấn nút daNhan = true; // lúc nhấn nút
}
void setup() {
pinMode(ledPin, OUTPUT); // thiết đặt chân ledPin OUTPUT
pinMode(2, INPUT_PULLUP); // sử dụng điện trở kéo lên cho chân số 2, ngắt attachInterrupt(0, tatled, LOW); // cài đặt ngắt gọi hàm tatled
}
void loop() {
digitalWrite(ledPin, HIGH); // bật đèn led if (daNhan == true)
{
// Nếu nhấn nút tắt ngắt detachInterrupt(0);
} }
3.7 Hàm Giao tiếp 3.7.1 Serial()
(64)61
Ta sử dụng bảng Serial monitor có sẵn Arduino IDE để giao tiếp với Arduino qua giao thức Serial Kích vào biểu tƣợng Serial Monitor () nhấn tổ hợp phím Ctrl+Shift+M để mở bảng Serial Monitor, sau ta kích chuột vào bảng chọn nhƣ hình dƣới để chọn baudrate giống với baudrate đƣợc dùng trình lập trình Mặc định 9600
3.7.2 Kiểu liệu: - void
Miêu tả
"void" từ khóa dùng việc khai báo function Những function đƣợc khai báo với "void" khơng trả liệu đƣợc gọi
Ví dụ led = 10; void setup() {
(65)62 }
void loop() { blink(); }
void blink() {
digitalWrite(led, LOW); delay(3000);
digitalWrite(led, HIGH); delay(1000);
}
Giải thích
"blink" function đƣợc định nghĩa với từ khóa "void", khơng trả giá trị Nhiệm vụ "blink" làm nhấp nháy đèn LED chân số 13 mạch Arduino
f Ta thấy function kiểu khơng dùng lệnh "return" để trả giá trị function
- boolean Giới thiệu
Một biến đƣợc khai báo kiểu boolean nhận hai giá trị: true false Và ta byte nhớ cho điều
Lưu ý
Những cặp giá trị sau tƣơng đƣơng Về chất, chúng số nguyên với giá trị 1:
true - false - HIGH - LOW - -
Ví dụ:
int led = 10;
boolean led_status; void setup() {
pinMode(led, OUTPUT);
led_status = true; // led trạng thái bật }
(66)63
digitalWrite(led, led_status); // bật đèn, led_status = delay(1000);
digitalWrite(led, !led_status); // tắt đèn, !led_status = delay(1000);
} - int: Giới thiệu
Kiểu int kiểu số nguyên đƣợc dùng chƣơng trình Arduino Kiểu int chiếm byte nhớ !
Trên mạch Arduino Uno, có đoạn giá trị từ -32,768 đến 32,767 (-215 đến 215-1) (16 bit)
Trên mạch Arduino Due, có đoạn giá trị từ -2,147,483,648 đến 2,147,483,647 (-231 đến (-231-1) (32 bit) (lúc chiếm byte nhớ)
Ví dụ
int ledPin = 10; Cú pháp
int var = val; var: tên biến val: giá trị - unsigned int Giới thiệu
Kiểu unsigned int kiểu số nguyên nằm khoảng từ đến 65535 (0 đến 216 - 1) Mỗi biến mang kiểu liệu chiếm byte nhớ
Lưu ý
Trên Arduino Due, unsigned int có khoảng giá trị từ đến 4,294,967,295 (232 - 1) (lúc chiếm byte nhớ)
Ta dễ dàng nhận kiểu liệu không chứa giá trị âm so với kiểu int
Cú pháp
unsigned int [tên biến] = [giá trị]; Ví dụ
unsigned int ledPin = 10;
Khi biến kiểu unsigned int đƣợc gán trị vƣợt phạm vi giá trị (bé lớn 65525), giá trị biến tự động đƣợc đẩy lên giới hạn giới hạn dƣới khoảng giá trị
(67)64 x = x - // x = - = 65535 (giới hạn x) x = x + // x = 65535 + = (giới hạn dƣới x) - char
Giới thiệu
Kiểu liệu kiểu liệu biểu diễn cho KÝ TỰ (nếu ta cần biểu diễn chuỗi chƣơng trình Arduino - ta cần sử dụng kiểu liệu String) Kiểu liệu chiếm byte nhớ!
Kiểu char nhận giá trị bảng mã ASCII
Kiểu char đƣợc lƣu dƣới dạng số nguyên byte có số âm (có giá trị từ -127 - 128), thay thiết đặt biến kiểu char có giá trị 'A', ta đặt 65 Để hiểu rõ ta xem ví dụ dƣới
Ví dụ
char myChar = 'A';
char myChar = 65; // cách khai báo hợp lệ - unsigned char
Giới thiệu
Giống hệt giới thiệu kiểu char Tuy nhiên kiểu unsigned char lại biểu hiệu số nguyên byte không âm (giá trị từ - 255)
Ví dụ
unsigned char myChar = 240; - byte
Giới thiệu
Là kiểu liệu biểu diễn số nguyên nằm khoảng từ đến 255 Ta 1 byte nhớ cho biến mang kiểu byte
Ví dụ
byte a = 123; //khai báo biến a mang kiểu byte, có giá trị 123 - word
Giới thiệu
Giống nhƣ kiểu unsigned int, kiểu liệu kiểu số nguyên 16 bit không âm (chứa giá trị từ đến 65535), chiếm byte nhớ!
Ví dụ
word a = 2000; - long
(68)65
long kiểu liệu mở rộng int Những biến có kiểu long mang giá trị 32bit từ -2,147,483,648 đến -2,147,483,647 Ta byte nhớ cho biến kiểu long
Khi tính tốn với số nguyên (biến kiểu int), ta phải thêm hậu tố "L" phía sau số nguyên kiểu int để chuyển chúng sang kiểu long Việc tính tốn (cộng, trừ, nhân, ) số thuộc kiểu liệu khác khơng đƣợc phép
Ví dụ
long a = 10;
long b = a + 10L // b = 20 - unsigned long
Giới thiệu
Kiểu unsigned long kiểu số nguyên nằm khoảng từ đến 4,294,967,295 (0 đến 232 - 1) Mỗi biến mang kiểu liệu chiếm byte nhớ
Ví dụ
unsigned long time; void setup() { Serial.begin(9600); } void loop() { Serial.print("Time: "); time = millis();
Serial.println(time);//Xuất thời gian lúc chạy hết đoạn lệnh delay(1000);
}
- short Giới thiệu
Giống hệt kiể int, nhiên có điều mạch Arduino chiếm byte nhớ biểu thị giá trị khoảnf -32,768 đến 32,767 (-215 đến 215-1) (16 bit) Ví dụ
short ledPin = 13; Cú pháp
(69)66 - float
Giới thiệu
Để định nghĩa kiểu số thực, ta sử dụng kiểu liệu float Một biến dùng kiểu liệu đặt giá trị nằm khoảng -3.4028235E+38 đến 3.4028235E+38 Nó chiếm byte nhớ
Với kiểu liệu float ta có từ 6-7 chữ số có nghĩa nằm bên bên dấu "." Điều có nghĩa ta đặt số thực dài đến 15 ký tự (bao gồm dấu ) Lưu ý
Để biểu diễn giá trị thực phép chia ta phải số thực chia cho lẫn Ví dụ: ta xử lý phép tính 5.0 / 2.0 kết trả 2.5 Nhƣng mà ta xử lý phép tính / kết (vì hai số nguyên chia số nguyên) - string
Giới thiệu
string tiếng Anh nghĩa chuỗi Cách khai báo
char Str1[15]; // khai bảo chuỗi có độ dài 15 ký tự
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //khai báo chuỗi có độ dài tối đa ký tự đặt giá trị ban đầu arduino (7 ký tự) Buộc phải khai báo chuỗi nằm hai dấu nháy đơn nhé!
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};//khai báo chuỗi có độ dài tối đa ký tự đặt giá trị ban đầu arduino<ký tự null> (8 ký tự)
char Str4[ ] = "arduino";// Chƣơng trình dịch tự động điều chỉnh kích thƣớc cho chuỗi Str4 ta phải đặt chuối dấu ngoặc kép
char Str5[8] = "arduino";// Một cách khai báo nhƣ Str3
char Str6[15] = "arduino"; // Một cách khai báo khác với độ dài tối đa lớn CHÚ Ý: chuỗi cần có ký tự NULL, ta không khai báo ký tự NULL (\0) cuối trình biên dịch tự động thêm vào Đó lý Str2, Str4 lại có độ dài nhƣng chứa chuỗi ký tự Ký tự NULL để làm gì? Nó dùng để trình biên dịch biết điểm dừng chuỗi! Nếu khơng đọc tiếp phần nhớ khác (mà phần không lƣu chuỗi)
Mảng chuỗi
Khi cần phải thao tác với lƣợng lớn chuỗi (ví dụ nhƣ ứng dụng trả lời ngƣời dùng LCD) ta cần sử dụng mảng chuỗi Mà chất chuỗi mảng ký tự Vì để khai báo mảng chuỗi ta cần sử dụng mảng chiều!
(70)67
char* myStrings[] = {"I'm number 1", "I'm number 2"};
Chỉ cần thêm dấu * sau chữ char dấu ngoặc vng phía sau myStrings ta thiết đặt số lƣợng phần tử tối đa mảng chuỗi!
Câu hỏi ôn tập
Câu 1: trình bày cấu trúc chƣơng trình điều khiển = arduino? Câu 2: trình bày cấu trúc câu lệnh for ?
Câu 3: trình bày cấu trúc câu lệnh While ?
(71)68
BÀI 4: CÀI ĐẶT VÀ SỬ DỤNG PHẦN MỀM PROTUES *Giới thiệu
Bài học giới thiệu cách cài đặt Cài đặt nâng cấp,khởi động chƣơng trình,cài đặt thơng số ban đầu,Update linh kiên phần mềm chuyên ngành đƣợc ứng dụng rộng rãi
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Trình bày đƣợc bƣớc cài đặt phần mềm protues
- Cài đặt nâng cấp đƣợc phần mềm protues
- Sử dụng thành thạo phần mềm protues để mô tập Arduino giao tiếp với thiết bị ngoại vi
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung:
1.Cài đặt phần mềm Bƣớc 1: Nhấn chọn Next
(72)69
(73)70 Bƣớc 4: Nhấn chọn Next
(74)71 Bƣớc 6: Nhấn chọn Yes > Install
(75)72 Bƣớc 8: Để mặc định > Next
(76)73
Bƣớc 10: Chọn đƣờng dẫn cài đặt lƣu trữ > Next
(77)74 Bƣớc 12: Để mặc định > Next
(78)75 Quá trình cài đặt diễn ra, chờ vài phút…
(79)76
Hƣớng dẫn Cr@ck Proteus 8.9 Pro
Bƣớc 1: Copy file file thƣ mục Cr@ck vào nơi vừa cài đặt phần mềm đƣờng dẫn “C:\Program Files (x86)\Labcenter Electronics\Proteus Professional” chạy phần mềm với Run as Administrator
(80)77 2.Sử dụng phần mềm mô protues
2.1 Hƣớng dẫn add thƣ viện cho Arduino IDE:
Thƣ viện đóng vai trị vơ quan trọng việc lập trình điều khiển Ardunio
(81)78
Một số thƣ viện có sẵn chƣơng trình Arduino IDE nhƣ: Sevor, Stepper, EEPROM, Ethernet, SPI
Nhằm giúp ngƣời sử dụng giải đƣợc vấn đề nhanh chóng, viết tơi cài thƣ viện I2C làm ví dụ để cài vào thƣ viện cho Arduino IDE
(82)79
Sau tải lƣu vào đƣờng dẫn trên, Ta vào Sketch Include Library Add sau chọn file I2C vừa tải về:
Chọn Open để bắt đầu add thƣ viện I2C vào Arduino IDE:
(83)80
Sau ài xong ta reset lại Arduino IDE xem lại thƣ viện I2C có IDE chƣa Vậy OK
2.2 Vẽ mạch mô Arduino Proteus
Sau cài đặt phần mềm Proteus add thƣ viện mô Arduino thành công, ta mở ISIS Profesional
(84)81
Tới chƣa thể nhấn nút RUN (là nút tam giác góc trái phía dƣới hình) để mô đƣợc đâu, phần mềm báo lỗi board Arduino UNO chƣa cócode nạp vào mà Lúc ta cần phải đƣa file hex vào để mô Bằng cách mời ta tiếp tục đọc phần sau nhé!
Tạo File Hex
Chúng ta cần phải có file Hex để cung cấp cho Proteus bấm nút Run chƣơng trình tiến hành mô đƣợc Cách tạo file Hex Arduino IDE nhƣ sau:
Đầu tiên, ta mở phần mềm Arduino IDE lên
(85)82
Khi hộp thoại Preferences xuất hiện, ta đánh dấu check vào compilation sau chọn OK
Bởi ta muốn mơ LED nhấp nháy nên vào File – Examples – 01 Basics – Blink (quá quen thuộc phải không nào) để mở đoạn code LED nhấp nháy Do không muốn phải chỉnh sửa code nên mắc sẵn LED vào chân 13 nhƣ ta thấy sơ đồ mạch
(86)83
Ta chép file hex từ đƣờng dẫn sang thƣ mục để thuận lợi cho việc quản lý file
Ta cần ý chọn board khớp với board mơ nhé, mơ Arduino Uno
Nạp file hex mô
Các ta chép file hex thƣ mục sau mở Proteus lên double click vào Aruino Uno Hộp thoại Edit Component xuất Tại khung Program File ta tìm đến mục chứa file hex lúc ta lƣu chọn Open, sau ấn OK
Để mô mạch ta nhấp chuột vào nút PLAY Để dừng mô ta ấn STOP
(87)84
BÀI 5: GIAO TIẾP VỚI LED ĐƠN *Giới thiệu
Bài học giới thiệu cách thiết kế ,lập trình cho mạch điện tử đƣợc ứng dụng nhiều thực tế nhƣ mạch quảng
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo nguyên lý hoạt động led đơn - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LED đơn với Arduino
- Mơ đƣợc chƣơng trình mạch giao tiếp LED đơn với Arduino phần mềm mô
+ Kết nối đƣợc phần cứng mạch giao tiếp LED đơn với Arduino yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình giao tiếp LED đơn với Arduino *Nội dung:
1 Giới thiệu a Hàm pinMod()
Cơng dụng: Cấu hình pin quy định hoạt động nhƣ đầu vào (INPUT) đầu (OUTPUT)
Cú pháp: pinMode(pin, mode) Giải thích ý nghĩa:
· pin: Số chân digital màtamuốn thiết đặt · mode: INPUT OUTPUT
Kết trả về: khơng có b Hàm digitalWrite() Cơng dụng:
· Xuất tín hiệu chân digital, có giá trị HIGH LOW
· Nếu pin đƣợc thiết đặt OUTPUT pinMode() Vàtadùng digitalWrite để xuất tín hiệu điện chân 5V (hoặc 3,3 V mạch 3,3 V) đƣợc xuất tín hiệu HIGH, 0V đƣợc xuất tín hiệu LOW
· Nếu pin đƣợc thiết đặt INPUT pinMode() Lúc digitalWrite bật (HIGH) tắt (LOW) hệ thống điện trở pullup nội Chúng khuyêntanên dùng INPUT_PULLUP muốn bật hệ thống điện trở pullup nội Cú pháp: digitalWrite(pin, value)
Giải thích ý nghĩa:
(88)85 Kết trả về: khơng có
2 Phần cứng * Linh kiện:
Các linh kiện cần có bao gồm: x Arduino Uno R3 x LED siêu sáng x Điện trở 560 Ω x Breadboard Dây cắm loại * Hướng dẫn kết nối
- Chân âm đèn Led cắm vào chân GND board Arduino
- Chân dƣơng đèn Led cắm vào chân số board Arduino (nên kết với chân điện trở chân điện trở lại cắm vào chân số board Arduino)
Hình 5.1: giao tiếp arduino với led đơn 3 Lập trình giải thích
Code chƣơng trình int
(89)86 pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000); }
Sau gõ code vào chƣơng trình soạn thảotacần click vào để kiểm tra lổi Tạo File Hex
Chúng ta cần phải có file Hex để cung cấp cho proteus bấm play chƣơng trình hoạt động đƣợc Cách tạo file Hex Arduino IDE nhƣ sau:
Click vào File chọn Preferences
(90)87
Hình 5.3: Check compilation Sau tiếp tục bấm
Chƣơng trình tự động built file hex đƣợc lƣu đƣờng dẫn nhƣ hình dƣới
Hình 5.4: Đường dẫn chứa file hex
(91)88
Hình 5.5: Add file Hex cho Proteus
Bấm vào vị trí số chọn nơi lƣu file hex chọn tiếp Open, OK Play Cáctasẽ thấy led nhấp nháy tắt sáng thời gian delay 1s
Giải thích chƣơng trình int ledPin = 9;
Khai báo giá trị biến integer ledPin = void setup() {
pinMode(ledPin, OUTPUT); }
Trong Arduino sketch cần phải có hàm setup() loop() khơng có chƣơng trình báo lỗi Hàm Setup() chạy lần kể từ bắt đầu chƣơng trình Hàm có chức thiết lập chế độ vào, cho chân digital hay tốc độ baud cho giao tiếp Serial
(92)89 pin : vị trí chân digital
Mode: chế độ vào ( INPUT), (OUTPUT) Lệnh
pinMode(ledPin, OUTPUT);
Lệnh thiết lập chân số board chân ngõ (OUTPUT) Nếu không khai báo “ int ledPin = 9; ” thìtacó thể viết cách sau nhƣng ý nghĩa không thay đổi:
pinMode(9, OUTPUT);
Bắt buộc khai báo hàm loop() Arduino IDE Hàm vòng lặp vô hạn
void loop() {
digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW);
delay(1000); }
Tiếp theo ta phân tích hàm digitalWrite( ledPin, HIGH); lệnh có ý nghĩa xuất chân digital có tên ledPin ( chân 9) mức cao ( HIGH), mức cao tƣớng ứng volt
delay(1000);
Lệnh tạo khoảng trễ với thời gian giây Trong hàm delay() IDE 1000 tƣơng ứng với giây
digitalWrite(ledPin, LOW);
Cũng giống nhƣ digitalWrite( ledPin, HIGH); lệnh xuất chân ledPin mức thấp (LOW) tức volt
Và tiếp tục hàm delay()
Nhƣ thấy chƣơng trình thực tắt sáng led liên tục không ngừng trừ ta ngắt nguồn
Câu hỏi ôn tập
(93)90
BÀI 6: GIAO TIẾP VỚI NÚT NHẤN
* Giới thiệu: Nút ấn loại công tắc đơn giản điều khiển hoạt động máy số loại trình Hầu hết, nút nhấn nhựa kim loại Hình dạng nút ấn phù hợp với ngón tay bàn tay để sử dụng dễ dàng Tất phụ thuộc vào thiết kế cá nhân
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo nguyên lý hoạt động nút nhấn - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp nút nhấn với Arduino
- Mô đƣợc chƣơng trình mạch giao tiếp nút nhấn với Arduino phần mềm mô
- Kết nối đƣợc phần cứng mạch giao tiếp nút nhấn với Arduino yêu cầu kỹ thuật
-Viết, nạp chạy đƣợc chƣơng trình giao tiếp nút nhấn với Arduino *Nội dung:
1 Cấu tạo nút nhấn
Hình 6.1 Công tắc nút nhấn ký hiệu
Nút nhấn gồm hệ thống lò xo, hệ thống tiếp điểm thƣờng hở, đóng vỏ bảo vệ
-Phân Loại:
+ Theo chức trạng thái hoạt động nút nhấn: nút nhấn đơn, nút nhấn kép
+ Theo hình dạng: loại hở, bảo vệ, loại bảo vệ chống nƣớc chống bụi, loại bảo vệ khỏi nổ
(94)91
Nút nhấn có ba phần: Bộ truyền động, tiếp điểm cố định rãnh Bộ truyền động qua tồn cơng tắc vào xy lanh mỏng phía dƣới Bên tiếp điểm động lị xo Khi nhấn nút, chạm vào tiếp điểm tĩnh làm thay đổi trạng thái tiếp điểm Trong số trƣờng hợp, ngƣời dùng cần giữ nút nhấn liên tục để thiết bị hoạt động Với nút nhấn khác, chốt giữ nút bật ngƣời dùng nhấn nút lần
2 Phần cứng * Chuẩn bị:
- Mạch Arduino (ở sử dụng Arduino UNO) - Breadboard gọi testboard
- Điện trở 10 kΩ
- Nút nhấn chân chân (hoặc công tắc tƣơng đƣơng) - trở 220 Ohm 470 Ohm
- led đơn * Lắp mạch:
Hình 6.2: Giao tiếp bo Arduino với nút nhấn 3 Lập trình giải thích
int nutnhan = 8; // định nghĩa chân số button int led = 9, t=0; // khai báo led biến
int status1; // biến lưu trạng thái nút nhấn // viết hàm chống dội
boolean chong_doi() {
(95)92 // khởi tạo
void setup() {
Serial.begin(9600);
pinMode(nutnhan,INPUT); pinMode(led,OUTPUT); }
void loop() // vong lap {
int buttonState = digitalRead(nutnhan); Serial.println(buttonState);
status1 = chong_doi(); if(status1==true) {
{
t=!t; // đảo trạng thái }
while(status1==true){status1=chong_doi();} }
if(t==1) {
digitalWrite(led,HIGH); }
else {
digitalWrite(led,LOW); }
}
Câu hỏi ôn tập
Câu 1: trình bày nguyên lý hoạt động nút nhấn?
Câu 2:Thiết kế phần cứng lập trình điều khiển theo yêu cầu sau: - Nhấn nút nhấn 1: led đơn chạy từ trái sang phải?
(96)93
BÀI 7: GIAO TIẾP VỚI LED ĐOẠN *Giới thiệu
Bài học giới thiệu cách thiết kế , gia cơng lập trình điều khiển led đoạn đƣợc ứng dụng rộng rãi thực tế
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo nguyên lý hoạt động led đoạn - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LED đoạn với Arduino
- Mô đƣợc chƣơng trình mạch giao tiếp LED đoạn với Arduino phần mềm mô
- Kết nối đƣợc phần cứng mạch giao tiếp LED đoạn với Arduino yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình giao tiếp LED đoạn với Arduino *Nội dung:
1 Cấu tạo led đoạn
Hình 7.1 Hình dáng thực tế led đoạn
Thực cấu trúc LED đoạn gồm LED đơn, nhìn lên hình cáctacũng thấy gồm có đoạn dấu chấm nhỏ, đoạn dấu chấm nhỏ LED đơn
Việc sử dụng LED đoạn sử dụng để hiển thị số, chữ anphabet nhiều kiểu ký tự khác Nhƣ hình cáctađã thấy, LED đoạn đơn gồm 10 chân chân: a, b, c, d, e, f, g, chân chung chân dấu chấm tròn (DP)
(97)94
Hình 7.2 cấu trúc led đoạn
Để LED hiển thị phải làm cho LED đơn nhƣ hiển thị, ví dụ LED led mang kí tự a, b, c, d, e, f, g dấu chấm chân cuối Bây thử suy nghĩ muốn hiển thị số phải làm nào? Nhìn vào hình LED hiển thị đầu thấy: Để hiển thị số phải làm cho LED đơn a, b, c, d, e, f phải sáng lên, dấu chấm g phải tắt Nhƣ để tạo số phải thể mã code hệ nhị phân (binary) B111111100 Tƣơng tự số có LED sáng? Cáctacó thể viết đƣợc mã làm xuất số đƣợc không? Đó là: B01100000 Tƣơng tự số 3, 4, 5, 6, 7, Để dễ hiểu tơi xin đƣa bảng sau để cáctadị Lƣu ý: sáng 1, tắt
2 Phần cứng chuẩn bị:
Mạch Arduino (ở sử dụng Arduino UNO) Breadboard cịn gọi testboard
(98)95 Lắp mạch:
CHÂN LED ĐOẠN CHÂN ARDUINO
a
b
c
d
e
f
g
DP
Hình 7.3 Sơ đồ kết nối led đoạn 3 Lập trình giải thích
// Khai báo chân
const int G = 8; // G= Arduino chân const int F = 7; // F= Arduino chân const int A = 2; // A = Arduino chân const int B = 3; // B = Arduino chân const int E = 6; // E = Arduino chân const int D = 5; // D = Arduino chân const int C = 4; // C = Arduino chân const int dp = 9; // dp = Arduino chân
const int second = 1000; // thiết lập với mili giây, 1000 milliseconds = second const int digit = 10; // Số ký tự hiển thị10 digits (0 - 9)
(99)96 byte digseg[digit][segment] = {
{ 1,1,1,1,1,1,0 }, // = { 0,1,1,0,0,0,0 }, // = { 1,1,0,1,1,0,1 }, // = { 1,1,1,1,0,0,1 }, // = { 0,1,1,0,0,1,1 }, // = { 1,0,1,1,0,1,1 }, // = { 1,0,1,1,1,1,1 }, // = { 1,1,1,0,0,0,0 }, // = { 1,1,1,1,1,1,1 }, // = { 1,1,1,1,0,1,1 } // = };
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
(100)97
BÀI 8: GIAO TIẾP VỚI LCD
* Giới thiệu: LCD không hiển thị chuỗi ký tự hay số đơn giản mà ta cịn thêm vào hiệu ứng giúp cho giao diện thêm sinh động thú vị tùy theo ý muốn
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng: - Trình bày đƣợc cấu tạo nguyên lý hoạt động LCD - Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp LCD với Arduino
- Mơ đƣợc chƣơng trình mạch giao tiếp LCD với Arduino phần mềm mô
- Kết nối đƣợc phần cứng mạch giao tiếp LCD với Arduino yêu cầu kỹ thuật
- Viết, nạp 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 cáctasẽ tìm cách điều khiển hình LCD Arduino mà khơng sử dụng module I2C LCD Chỉ cần Arduinotacó thể điều khiển đƣợc LCD nhƣng lại tốn nhiều chân arduino, Ở phần sử dụng module I2C để giải vấn đề
Hình 8.1: Sơ đồ chân LCD 16x2 2 Phần cứng
- Chuẩn bị :
Mạch Arduino (ở sử dụng Arduino UNO) Breadboard gọi testboard
(101)98 Dây cắm test board
1 biến trở 10K - Lắp mạch:
Hình 8.2: Sơ đồ phần cứng Arduino với LCD
Hình 8.3: Sơ đồ kết nối chân LCD 16x2 với Arduino 3 Lập trình giải thích
#include <LiquidCrystal.h> //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 LCD 1602
lcd.print("DIEN – DIEN TU!"); //In hình lcd dịng chữ DIEN – DIEN TU }
(102)99 lcd.setCursor(0, 1); // đặt trỏ vào cột 0, dòng lcd.print(" truong cao KT"); // In dong chu }
Câu hỏi ôn tập
Câu 1: Trình bày chức chân nguyên lý hoạt động LCD? Câu 2:Thiết kế phần cứng lập trình điều khiển theo yêu cầu sau:
(103)100
BÀI 9: ADC-ĐỌC TÍN HIỆU MỘT SỐ LOẠI CẢM BIẾN *Giới thiệu
Bài học giới thiệu cách thiết kế lập trình cho loại cảm biến đƣợc ứng dụng nhiều thực tế
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo nguyên lý hoạt động của, cảm biến lm35, ADC Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp cảm biến với Arduino
- Mơ đƣợc chƣơng trình mạch giao tiếp cảm biến với Arduino phần mềm mô
- Kết nối đƣợc phần cứng mạch giao tiếp cảm biến với Arduino yêu cầu kỹ thuật
- Viết, nạp 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) chuyển đổi tín hiệu tƣơng tự sang số dùng để chuyển đổi tín hiệu tƣơng tự từ bên ngồi (nhiệt độ, độ ẩm, …) dạng số để vi điều khiển xử lý đƣợc Khơng phải tất chân Arduino có khả ADC Trên board Arduino, chân đƣợc ký hiệu Ax (A0 đến A5 UNO) biết chân đọc đƣợc điện áp tƣơng tự
Bộ chuyển đổi ADC vi điều khiển khác Trên Arduino 10-bit, có nghĩa có khả phát 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 giá trị điện áp lớn mà ADC chuyển đổi đƣợc Mặc định đƣợc cấp nguồn điện áp tham chiếu Arduino 5V (có nghĩa 5V ứng với giá trị ADC max 1023, với board Arduino 3.3V 3.3V ứng với giá trị lớn 1023) Ngoài Arduino cịn đƣợc tích hợp tham chiếu nội, tham chiếu ngoại chân AREF
Mối quan hệ giá trị ADC điện áp:
(104)101 Tính tốn giá trị điện áp:
Với điện áp tham chiếu mặc định Arduino độ phân giải 10-bit, ta có điện áp đo đƣợc chân A0 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 9.1.sơ đị kết nối UNO với LM35 3 Lập trình giải thích
Tính tốn giá trị nhiệt độ:
Với cảm biến nhiệt độ LM35, có 10mV thay đổi điện áp ứng với 1°C Với điện áp đọc đƣợc, giá trị nhiệt độ là:
Chƣơng trình: void setup() {
(105)102 }
void loop() {
// Đọc giá trị ADC chân A0 int adcValue = analogRead(A0); // Tính toán giá trị nhiệt độ đo đƣợc
float temp = (float)adcValue * 500 / 1023;
// In Serial giá trị nhiệt độ với chữ số sau dấu phẩy Serial.print("Nhiet do: ");
Serial.println(temp, 2); // Trễ 500ms
delay(500); }
Kết quả:
Bật hình Serial monitor với tốc độ 9600bps, tác động thay đổi nhiệt độ LM35, nhận đƣợc giá trị hiển thị hình Serial monitor - Điều khiển chuỗi ký tự chạy từ trái qua phải ?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 ?
Câu hỏi ôn tập Câu 1: Thế điện áp tham chiếu?
Câu 1: Trình bày mối quan hệ giá trị ADC điện áp?
(106)103
BÀI 10: NGẮT NGOÀI
* Giới thiệu: số kiện khẩn cấp bên bên vi điều khiển xảy ra, buộc vi điều khiển tạm dừng thực chƣơng trình tại, phục vụ nhiệm vụ mà ngắt yêu cầu – nhiệm vụ gọi trình phục vụ ngắt (ISR: Interrupt Service Routine)
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc nguyên lý hoạt động ngắt Arduino - Vẽ đƣợc sơ đồ nguyên lý mạch ngắt ngồi
- Mơ đƣợc chƣơng trình mạch ngắt ngồi Arduino phần mềm mơ
- Kết nối đƣợc phần cứng mạch ngắt Arduino yêu cầu kỹ thuật - Viết, nạp chạy đƣợc chƣơng trình ngắt ngồi Arduino
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an toàn cho ngƣời thiết bị
*Nội dung:
1 Giới thiệu ngắt ngồi 1.1 Ngắt arduino
Trình ngắt arduino (interrupt service routine- ISR), có chức tạo một kiện cho mạch arduino Hầu hết mạch arduino có ngắt ngồi: ngắt (chân số 2) ngắt (chân số 3) Cụ thể nhƣ sau:
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet
Mega2560 21 20 19 18
Leonardo
Due (see below)
Đặc biệt mạch Arduino Due tất chân chân ngắt hết.tacó thể gán chân ngắt hàm attachInterrupt()
1.2 Cấu trúc hàm ngắt
attachInterrupt(interrupt, ISR, mode)
attachInterrupt(thứ tự ngắt, tên chương trình thực ngắt, chế độ ngắt) trong đó:
thứ tự ngắt: có kiểu (int), ta điền số ngắt 0, số ngắt tên chƣơng trình thực ngắt: khai báo chƣơng trình con, để kiện ngắt xảy thực chƣơng trình
(107)104
LOW: ngăt mức thấp, thực chƣơng trình ngắt chân ngắt mực thấp (0v)
CHANGE: Ngắt có thay đổi, thực chƣơng trình ngắt có thay đổi 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 chƣơng trình ngắt chân ngắt từ mức thấp lên mức cao
FALLING: Ngắt cạnh xuống, thực chƣơng trình ngắt chân ngắt từ mức cao lên mức thấp
Chú ý:
Hàm ngắt khơng có thơng số trả
Khi sử dụng ngắt số hàm nhƣ delay() bị sai vài mili giây, trình thực lệnh delay xảy ngắt có ảnh hƣởng tƣơng tự hàm truyền nhận UART
1.3 Ứng dụng ngắt
- Ngắt thƣờng đƣợc sử dụng để giúp vi điều khiển thực chƣơng trình xác thơng minh hơn, giúptagiải số khó khăn thời gian
- Một số chức thƣờng dùng ngắt nhƣ: Đếm encoder, quản lý ngõ vào hiệu Dễ dàng nhận thấy đƣợc để đọc xung encoder, mà khơng xung chƣơng trình ta khơng thể làm khác phải kiểm tra liên tục Nhƣng ngắt khác, giúp ta chủ động việc bắt khi có cạnh lên cạnh xuống chân ngắt
2 Phần cứng
(108)105 3 Lập trình giải thích
int led = 13;
volatile int trangthai = LOW; // khai báo biến kiểu volatile, tránh sai số trình thực ngắt
void setup() // đoạn chƣơng trình cài đặt {
pinMode(led, OUTPUT); // khai báo led ngõ
digitalWrite(2, HIGH); // Treo chân ngắt 0, chân số lên mức cao attachInterrupt(0, daoled, CHANGE); // khai báo ngắt 0, chƣơng trình daoled, chế độ có
// thay đổi 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 ngắt, có ngắt xảy thực chƣơng trình
{
trangthai = !trangthai; // đảo trang thái }
Câu hỏi ôn tập Câu 1: Thế ngắt ngoài?
Câu 1: Trình bày cấu trúc hàm ngắt?
(109)106 BÀI 11: TIMER-COUNTER
* Giới thiệu: Timer đếm thời gian vi điều khiển Arduino Nó bắt đầu đếm chƣơng trình bắt đầu chạy dừng lại ta dừng chạy chƣơng trình Ta tìm hiểu timer qua từ khóa mục tìm kiếm Vậy ứng dụng gì? Đa số đƣợc ứng dụng để chạy hàm, lệnh song song *Mục tiêu: Sau học xong 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 ghi timer – counter Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch Led đoạn sử sụng ngắt timer
- Mơ đƣợc chƣơng trình mạch Led đoạn sử sụng ngắt timer phần mềm mô
- Kết nối đƣợc phần cứng mạch Led đoạn sử sụng ngắt timer yêu cầu kỹ thuật
-Viết, nạp chạy đƣợc chƣơng trình Led đoạn sử sụng ngắt timer Arduino
*Nội dung:
1 Giới thiệu timer- counter
Trên chip Atmega328p Arduino có 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() millis() Arduino, khơng đề cập đến Timer/Counter0
Nhƣ giới thiệu, Timer/Count có chức năng: Đếm kiện, Định thời tạo xung PWM, để giữ thứ đơn giản, giới thiệu chức Timer/Counter lập trình Arduino "Định thời" (Arduino hỗ trợ hàm built-in analogWrite để tạo xung PWM nên không đề cập đến nữa)
Timer/Counter1: Timer/Counter đa 16 bit, gồm chế độ hoạt động
Timer/Counter2: Timer/Counter bit, gồm chế độ
Trong pham vi viết giới thiệu Normal Mode Clear Timer on Compare Match (CTC) mode Timer/Counter1 Timer/Counter2.Để thuận tiện viết tắt Timer/Counter thành T/C
Trƣớc bắt đầu, có số định nghĩa quan cần rõ:
(110)107
MAX: giá trị lớn mà T/C đạt đƣợc, ghi bit giá trị MAX = 2^8 -1 = 255, ghi 16 bit giá trị MAX = 2^16 - = 65535 Và tất nhiên giá trị MAX cố định với T/C
TOP: giá trị đỉnh mà có T/C thay đổi trạng thái, giá trị TOP khơng thiết phải MAX mà thay đổi ghi Chúng ta tìm hiểu sau Interrupt: (còn gọi Ngắt) chƣơng trình có độ ƣu tiên cao nhất, đƣợc thực có tín hiệu Interrupt
Bảng 10.1: Interrupt Vectors Timer/Counter ATmega328 1.1 Timer/Counter
1.1.1 Giới thiệu ghi
* Thanh ghi TCNT1 (Timer/Counter Register)
Là ghi 16 bit, lƣu giữ giá trị Timer/Counter1, cho phép đọc-ghi trực tiếp, do đó, thực phép gán thay đổi giá trị TCNT1 * Thanh ghi TCCR1B (Timer/Counter Control Register B)
(111)108
Bảng 10.2: Thanh ghi TCCR1B
Trong ghi TCCR1B cần sử dụng bit CS10, CS11, CS12 để lựa chọn xung nhịp cho T/C1 Chúng ta tham khảo bảng này:
Bảng10 3: Mô tả Clock Select Bit ghi TCCR1B
Theo mặc định, chip Atmega328p Arduino chạy 16MHz, prescaler = 64 Điều có nghĩa là: theo mặc định, T/C Arduino có tần số hoạt động 16MHz/64 = 250kHz
* Thanh ghiTIMSK1 (Timer/Counter1 Interrupt Mask Register)
(112)109
Bảng10 4: Thanh ghi TIMSK1 (Timer/Counter1)
bit - ICIE1: Input Capture Interrupt Enable - Cho phép ngắt dùng Input Capture
bit - OCIE1B: Output Compare Interrupt Enable channel B - Cho phép ngắt dùng Output Compare channel B
bit - OCIE1A: Output Compare Interrupt Enable channel A - Cho phép ngắt dùng Output Compare channel A
bit - TOIE1: Overflow Interrupt Enable - Cho phép ngắt xảy tràn T/C
(Cáctacứ bình tĩnh, nhƣ Output Compare, Input Capture, Overflow giới thiệu bên dƣới)
* Thanh ghi OCR1A OCR1B (Output Compare Register channel A channel B)
Lƣu giữ giá trị so sánh kênh A kênh B: T/C1 hoạt động, giá trị TCNT1 đƣợc tăng dần, giá trị liên tục đƣợc so sánh với giá trị ghi OCR1A OCR1B, việc so sánh "Output Compare", giá trị TCNT1 giá trị OCR1A (hoặc OCR1B) "Match" xảy ra, lúc có Interrupt đƣợc thực ( đƣợc Enable ghi TIMSK1)
* Thanh ghi ICR1 (Input Capture Register 1)
Giá trị ghi ICR1 đƣợc cập nhật theo ghi TCNT1 lần có kiện xảy chân ICP1 (tƣơng ứng chân digital Arduino) Chức giới thiệu viết khác
(113)110
Bảng 10.5: Waveform Generation Mode Bit (Timer/Counter1)
ở giới thiệu mode T/C1 là: Normal Mode CTC Mode *Normal Mode
Đây chế độ hoạt động đơn giản T/C1 (mode 0), giá trị ghi TCNT1 tăng từ (BOTTOM) đến 65535 (MAX) quay Nếu gán trƣớc cho TCNT1 giá trị TCNT1 bắt đầu đếm từ giá trị Ví dụ:tamuốn viết chƣơng trình để đọc liệu từ cảm biến nhiệt 0.1s, nhƣng thân chƣơng trình lại có vài hàm delay(), không đảm bảo làtacập nhật đƣợc giá trị nhiệt độ 0.1s dùng hàm if hàm millis() Phƣơng án dùng Interrupt Timer/Counter
Theo mặc định, chip Atmega328p Arduino chạy 16MHz, prescaler = 64, thời gian để TCNT1 tăng lên đơn vị 64/16MHz = 4us, thời gian để T/C1 đếm từ đến 65535 4us*65536 = 0.262144s, mà thời gian cần tạo 0.1s (thỏa mãn 0.1 < 0.262144), ta cần 0.1s/4us = 25000 lần đếm Giá trị ban đầu TCNT1 = 65536 - 25000 = 40536
Ví dụ chế độ Normal Mode: #include <avr/interrupt.h> #define sensor A0
volatile int temp; void setup() {
(114)111 /* Reset Timer/Counter1 *
TCCR1A = TCCR1B = TIMSK1 =
/* Setup Timer/Counter1 *
TCCR1B |= (1 << CS11) | (1 << CS10); // prescale = 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 <avr/interrupt.h> thƣ viện Interrupt AVR
- Biến temp cần đƣợc khai báo volatile đƣợc sử dụng chƣơng trình 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, thấy để cài đặt T/C1 mode 0, bit cần đƣợc set nhƣ sau: WGM13 = 0, WGM12 = 0, WGM11 = 0, WGM10 = 0, mặc định bit nên không cần quan tâm đến ghi TCCR1B
- 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
(115)112
- ISR (Vector_name) trình phục vụ ngắt, ISR keyword,
Vector_name chƣơng trình TIMER1_OVF_vect, có nghĩa "Ngắt tràn Timer/Counter1"
Ở trình phục vụ ngắt, cần gán lại giá trị ban đầu cho TCNT1 = 40536 lúc T/C1 đếm tràn qua 65535 lại Nếu không gán lại TCNT1 = 40536, không tạo đƣợc 0.1s nhƣ mong muốn
* Clear Timer on Compare Match (CTC) mode Có CTC mode T/C1 mode mode 12
- Đầu tiên ta giới thiệu mode trƣớc Để chọn mode 4, cần set bit nhƣ sau: WGM13 = 0, WGM12 = 1, WGM11 = 0, WGM10 =
- CTC mode hoạt động nhƣ sau: ghi OCR1A lƣu giữ giá trị TOP, ghi TCNT1 bắt đầu đếm từ 0, giá trị TCNT1 = OCR1A "Compare Match", lúc ngắt Compare Match xảy bit OCIE1A đƣợc set ghi TIMSK1
Chú ý: có ghi OCR1A sử dụng để lưu giá trị COMPARE CTC mode Trở lại VD Normal Mode, thực với CTC Mode nhƣ sau: - Vi dụ:
#include <avr/interrupt.h> #define sensor A0
volatile int temp; void setup() {
Serial.begin(9600)
cli(); // tắt ngắt toàn cục /* Reset Timer/Counter1 * TCCR1A =
TCCR1B = TIMSK1 =
/* 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
(116)113 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, phần cài đặt cho ghi TCCR1B ta cần set bit WGM12 lên 1, tức (1 << WMG12)
Để tạo đƣợc 0.1s (ở 16MHz, prescaler = 64) ta cần T/C1 đếm 25000 lần, giá trị TOP = OCR1A = 24999
Để enable Compare Match Interrupt Timer/Counter channel A, cần set bit OCIE1A ghi TIMSK1 lên
Ở 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 1.2.1 Các ghi
Trên T/C2 có ghi tƣơng tự T/C1 1.2.2 Thanh ghi TCNT2 (Timer/Counter Register) Là ghi bit, lƣu giữ giá trị Timer/Counter2
1.2.3 Thanh ghi TCCR2A TCCR2B (Timer/Counter Control Register A B) Là ghi điều khiển hoạt động Timer/Counter2
(117)114
Bảng10.7: Mô tả Clock Select Bit
1.2.4 Thanh ghi TIMSK2 (Timer/Counter2 Interrupt Mask Register) Là ghi lƣu giữ Interrupt Mask T/C2
Bảng 10.8: Thanh ghi TIMSK2 (Timer/Counter 2)
1.2.5 Thanh ghi OCR2A OCR2B (Output Compare Register channel A channel B)
Lƣu giữ giá trị so sánh kênh A kênh B T/C2 hoạt động
(118)115
Theo bảng Waveform Generation Mode bit, T/C2 có Normal Mode 0 CTC mode
Để không trùng lặp nội dụng với T/C1, giới thiệu cách set ghi T/C2
Ở Normal Mode, cáctachỉ cần set bit CS20, CS21, CS22 ghi TCCR2B để chọn prescaler
Ở CTC Mode: set bit ghi TCCR2B để chọn prescaler, cáctacần set bit WGM21 lên dòng: TCCR2A |= (1 << WGM21);
Cách set ghi TIMSK2 tƣơng tự nhƣ TIMSK1: OCIE2A (Output Compare Interrupt Enable Channel A), OCIE2B, TOIE2 (Timer Overflow Interrupt Enable)
2.Phần cứng
Muốn đặt ngắt, ta phải đặt lệnh hàm setup(){}
Thƣ viện đính kèm gồm có thƣ viện timer cho Timer 1, Timer Ta copy vào thƣ mục thƣ viện Arduino IDE
Gồm có hàm:
initialize(): // Khởi động ngắt Timer
start() : // Khởi động lại sau sửa đổi
startBottom() : // Cho Timer bắt đầu đếm lại từ giá trị (Chú ý giá trị đếm Timer giá trịtađặt)
read() : // Đọc giá trị Timer
stop(): //Dừng Timer
attachInterrupt(): // Thêm địa hàm để gọi xảy ngăt bắt đầu đếm
detachInterrupt(): // Hủy địa ngắt
pwm(char pin, int duty, long microseconds) : // Băm xung chân pin với số chu kỳ duty Xung có độ rộng microseconds
disablePwm(char pin) : //Hủy băm xung 3 Lập trình giải thích
Ví dụ: nháy LED 0.15s
// Ví dụ dùng ngắt Timer để nháy LED
// sử dụng biến chia sẻ hàm ngắt chƣơng trình
const int led = LED_BUILTIN; // định nghĩa chân LED, Biến LED_BUILTIN dùng để LED đƣợc gắn Board mạch.Ví dụ với Arduino UNO
(119)116 void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(150000); //Khởi động ngắt, thời gian đặt cho 150000us=0.15s
Timer1.attachInterrupt(blinkLED); //Khi xảy ngắt chƣơng trình gọi hàm blinkLED()
Serial.begin(9600); }
int ledState = LOW;
volatile unsigned long blinkCount = 0; // Biến dùng chung CT CT ngắt
void blinkLED(void) {
if (ledState == LOW) { ledState = HIGH;
blinkCount = blinkCount + 1; // tăng lên lần LED sáng } else {
ledState = LOW; }
digitalWrite(led, ledState); }
// Xuất số lần sáng Serial0 // to the Arduino Serial Monitor void loop(void)
{
unsigned long blinkCopy;
noInterrupts(); //Hủy 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: Thế timer – counter?
(120)117
BÀI 12: PWM -ĐIỀU CHỈNH ĐỘ SÁNG CỦA BÓNG ĐÈN
* Giới thiệu: Điều chỉnh độ rộng xung điều chế / thay đổi chiều rộng xung (Không phải tần số) Để hiểu rõ PWM gì, xem số thuật ngữ
Vi điều khiển thành phần kỹ thuật số thông minh hoạt động tín hiệu nhị phân Biểu diễn tín hiệu nhị phân dải sóng vng Sơ đồ dƣới giải thích thuật ngữ liên quan đến tín hiệu sóng vng
Nhƣ trình bày sơ đồ trên, điều quan trọng cần lƣu ý tín hiệu PWM thời gian, tần số ln ln cố định Chỉ có thời gian ON OFF xung (chu kỳ làm việc) thay đổi Bằng kỹ thuật này, điều chỉnh điện áp cho trƣớc Sự khác biệt tín hiệu sóng vng tín hiệu PWM tín hiệu sóng vng có thời gian ON OFF (chu kỳ làm việc 50%), tín hiệu PWM có chu kỳ biến đổi Các sóng vng đƣợc xem trƣờng hợp đặc biệt tín hiệu PWM có chu kỳ làm việc 50% (ON = OFF)
*Mục tiêu: Sau học xong 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 điều chế xung PWM trong Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch điều chỉnh độ sáng bóng đèn
- Mơ đƣợc chƣơng trình mạch điều chỉnh độ sáng bóng đèn phần mềm mô
- Kết nối đƣợc phần cứng mạch điều chỉnh độ sáng bóng đèn yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình điều chỉnh độ sáng bóng đèn *Nội dung:
(121)118
- Xung trạng thái cao / thấp (HIGH/LOW) mức điện áp đƣợc lặp lặp lại Đại lƣợng đặc trƣng cho xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) chu kì xung (duty cycle)
- Tần số gì?
Tần số số lần lặp lại đơn vị thời gian Đơn vị tần số Hz, tức số lần lặp lại dao động giây
Lấy ví dụ, 1Hz = dao động giây 2Hz = dao động giây 16MHz = 16 triệu dao động giây
- Nhƣ theo quy tắc tam suất: 16 triệu dao động - giây > dao động tốn 1/16.000.000 (giây) = 0,0625 (micro giây)
- Cách xác định dao động nhƣ nào? Đa phần nghiên cứu điện tử thƣờng mắc sai lầm việc xác định dao động Dao động đƣợc xác định từ trạng thái bắt đầu kết thúc trƣớc trạng thái bắt đầu đƣợc lặp lại
Hình 12.1 Xung Vng
* Cách xác định dao động
Nhƣ thông thƣờng, dao động bao gồm trạng thái điện: mức cao (x giây) mức thấp (y giây) Tỉ lệ phần trăm thời gian trạng thái điện chu kì xung
Với x/y = 0% ta có xung chứa tồn điện áp thấp (khái niệm xung nên hiểu mở rộng)
Với x/y = 50% 50% thời gian đầu, xung có điện áp cao, 50% sau xung có điện áp thấp
Với x/y=100% ta có xung chứa tồn điện áp cao - Tóm lại, với xung ta có:
Tần số: để tính tốn đƣợc thời gian xung
Chu kì xung: thời gian xung có mức áp cao, thời gian xung có mức áp thấp
1.2.Liên hệ với Arduino:
(122)119
Hình 12.2 Đồ thị dạng xung điều chế PWM (Pulse Width Modulation) Xung sử dụng với hàm analogWrite Arduino
Giữa vạch màu xanh xung
analogWrite tỉ lệ chu kì xung
analogWrite(0) 0/255 0%
analogWrite(64) 64/255 25%
analogWrite(127) 127/255 50%
analogWrite(191) 191/255 75%
analogWrite(255) 255/255 100%
Hàm analogWrite() Arduino giúp việc tạo xung dễ dàng Hàm truyền vào tham số cho phép thay đổi chu kì xung, ta tính tốn đƣợc chu kì xung nhƣ bảng Tần số xung đƣợc Arduino thiết lập mặc định
Đối với board Arduino Uno, xung chân 3,9,10,11 có tần số 490Hz, xung chân 5,6 có tần số 980Hz
Làm để tạo xung có tần số nhanh hơn? ta tham khảo thêm thƣ viện riêng hỗ trợ việc Trong mã nguồn Arduino gốc không hỗ trợ phần
(123)120
Phương pháp để chuyển đổi thông tin thành xung để truyền dẫn - PWM (Pulse Width Modulation): Độ rộng xung tỷ lệ với biên độ tín hiệu tƣơng tự
- PPM (Pulse Position Modulation): Vị trí xung thay đổi theo biên độ tín hiệu tƣơng tự khe thời gian
- PAM (Pulse Amplitude Modulation): Biên độ xung thay đổi theo biên độ tín hiệu tƣơng tự
- PCM (Pulse Code Modulation): chuyển đổi chuỗi xung điều chế biên độ thành dạng tín hiệu nhị phân PCM phƣơng pháp phổ biến hệ thống viễn thông, chủ yếu mạng PSTN
2 Phần cứng - Chuẩn bị:
+ Arduino Uno r3 + Breadboard
+ Dây cắm breadboard
+ điện trở 560 Ohm (hoặc 220 Ohm 1kOhm) + đèn LED siêu sáng
- Lắp mạch:
(124)121 3 Lập trình giải thích
int led = 9; // khai báo chân sử dụng int brightness = 0; // khai báo độ sáng
int fadeAmount = 5; // khai báo mức thay đổi độ sáng // sau cấp nguồn hàm setup() chạy lần nhất: void setup() {
// khai báo chân lối pinMode(led, OUTPUT); }
// vòng lặp thực đoạn mã lặp lại: void loop() {
// đặt độ sáng ban đầu:
analogWrite(led, brightness);
// thay đổi độ sáng sau vòng lặp: brightness = brightness + fadeAmount;
// đảo chiều độ sáng hết vòng tối > sáng sáng > tối if (brightness <= || brightness >= 255) {
fadeAmount = -fadeAmount; }
//chờ 30 milliseconds để quan sát delay(30);
}
Câu hỏi ôn tập Câu 1: Thế điều chế PWM ?
(125)122
BÀI 13: GIAO TIẾP I2C -ĐỌC THỜI GIAN THỰC
* Giới thiệu: Đầu năm 1980 Phillips phát triển chuẩn giao tiếp nối tiếp dây đƣợc gọi I2C I2C tên viết tắt cụm từ Inter-Intergrated Circuit Đây đƣờng Bus giao tiếp IC với I2C đƣợc phát triển bới Philips, nhƣng đƣợc nhiều nhà sản xuất IC giới sử dụng I2C trở thành chuẩn công nghiệp cho giao tiếp điều khiển, kể vài tên tuổi Philips nhƣ: Texas Intrument(TI), MaximDallas, analog Device, National Semiconductor Bus I2C đƣợc sử dụng làm bus giao tiếp ngoại vi cho nhiều loại IC khác nhƣ loại Vi điều khiển 8051, PIC, AVR, ARM chip nhớ nhƣ: RAM tĩnh (Static Ram), EEPROM, chuyển đổi tƣơng tự số (ADC), số tƣơng tự(DAC), IC điểu khiển LCD, LED
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức nguyên lý hoạt động I2C Arduino
- Vẽ đƣợc sơ đồ nguyên lý mạch I2C
- Mô đƣợc chƣơng trình mạch I2C phần mềm mơ - Kết nối đƣợc phần cứng mạch I2C yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình I2C *Nội dung:
1 Giới thiệu I2C 1.1.Khái niệm:
I²C, viết tắt từ tiếng Anh “Inter-Integrated Circuit”, loại bus nối tiếp đƣợc phát triển hãng sản xuất linh kiện điện tử Philips Ban đầu, loại bus đƣợc dùng linh kiện điện tử Philips Sau đó, tính ƣu việt đơn giản nó, I²C đƣợc chuẩn hóa đƣợc dùng rộng rãi mô đun truyền thông nối tiếp vi mạch tích hợp ngày
1.2 Cấu tạo nguyên lý hoạt động:
I²C sử dụng hai đƣờng truyền tín hiệu:
Một đƣờng xung nhịp đồng hồ(SCL) Master phát ( thông thƣờng 100kHz 400kHz Mức cao 1Mhz 3.4MHz)
(126)123
Hình 13.1 Đường liệu(SDA) theo hướng
lƣu ý: xung clock Bản chất I2C liệu đƣờng SDA đƣợc ghi nhận sƣờn lên chân CLK Do xung clock khơng cần xác tốc độ 1MHz hay 3.4Mhz Lợi dụng điểm sử dụng chân GPIO để làm chân giao tiếp I2C mềm mà không thiết cần chân CLK tạo xung với tốc độ xác (có thể cần dùng delay bật tắt mức logic) SCL SDA đƣợc kéo lên nguồn điện trở kéo lên có giá trị xấp xỉ 4,7 KOhm (tùy vào thiết bị chuẩn giao tiếp, dao động khoảng 1KOhm đến 4.7 Kohm
Chú ý: theo cấu hình này, thiết bị mức logic LOW hay cao trở nhƣng ko thể dạng HIGH => Chính trở pull up tạo mức logic HIGH)
2 Phần cứng - Chuẩn bị:
Arduino UNO
Module RTC DS1307 - Lắp mạch :
Sơ đồ đấu nối
Arduino UNO Module RTC DS1307
GND GND
5V GND
A4 SDA
(127)124
Hình 13.2 Giao tiếp bo Arduino UNO với Module RTC DS1307 3 Lập trình giải thích
- Code:
#include <LiquidCrystal_I2C.h> #include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup () {
Serial.begin(9600); if (! rtc.begin()) {
Serial.print("Couldn't find RTC"); while (1);
}
if (! rtc.isrunning()) {
Serial.print("RTC is NOT running!"); Serial.println();
(128)125
rtc.adjust(DateTime(F( DATE ), F( TIME ))); //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
void loop () {
(129)126 if(now.day()<=9) { Serial.print("0"); Serial.print(now.day()); } else { Serial.print(now.day()); } Serial.print('/'); if(now.month()<=9) { Serial.print("0"); Serial.print(now.month()); } else { Serial.print(now.month()); } Serial.print('/'); if(now.year()<=9) { Serial.print("0"); Serial.print(now.year()); } else { Serial.print(now.year()); } Serial.println(); delay(1000); }
- Giải thích code
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
Ban đầu tạo đối tƣợng thƣ viện RTClib rtc xác định mảng ký tự daysOfTheWeek để lƣu trữ thông tin ngày tuần
(130)127
Hàm rtc.begin() hàm khởi tạo để đảm bảo module RTC đƣợc kết nối Hàm rtc.isrunning() hàm đọc ghi bên I2C DS1307 để kiểm tra xem chip có trả thời gian hay khơng Nếu hàm trả giá trị False đặt lại thời gian
- Hàm rtc.adjust()
Hàm rtc.adjust() hàm đặt ngày Chúng ta có cách đặt ngày giờ:
DateTime(F( DATE ), F( TIME )) cách cập nhật thời gian tự động từ máy tính
DateTime(YYY, M, D, H, M, s) cách thiết lập thủ cơng Ví dụ: Đặt ngày 12 tháng năm 2019 vào lúc 14:07 gọi hàm DateTime(2019, 5, 12, 14, 07, 00)
Một số hàm khác:
Hàm rtc.now() Trả ngày & Giá trị trả thƣờng đƣợc lƣu trữ biến kiểu liệu DateTime
Hàm year() Trả năm
Hàm month() Trả tháng
Hàm day() Trả ngày
Hàm daysOfTheWeek() Trả ngày tuần
Hàm hour() Trả
Hàm minute() Trả phút
Hàm second() Trả giây
Câu hỏi ôn tập:
Câu 1:Trình bày nguyên lý hoạt động I2C?
Câu 2: Kết nối phần cứng viết chƣơng trình điều khiển Đọc nhiệt độ - độ ẩm xuất hình LCD?
(131)128
BÀI 14: ĐIỀU KHIỂN ĐỘNG CƠ DC *Giới thiệu
Điều khiển động DC (DC Motor) ứng dụng thuộc dạng điều khiển tự động DC Motor cấu chấp hành (actuator) đƣợc dùng nhiều hệ thống tự động (ví dụ robot) Điều khiển đƣợc DC Motor ta tự xây dựng đƣợc cho nhiều hệ thống tự động
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức nguyên lý hoạt động mạch L298 - Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động DC
- Mơ đƣợc chƣơng trình mạch điều khiển động DC phần mềm mô
- Kết nối đƣợc phần cứng mạch điều khiển động DC yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình điều khiển động DC
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung:
1 Giới thiệu động DC
Động điện chiều thiết bị ngoại vi đƣợc sử dụng rộng rãi điều khiển đơn giản, giá phải
Hình 14.1 Động DC 1.1 Định nghĩa
(132)129
vịng quay/ phút) Tốc độ khơng tải động DC khơng giảm tốc đạt từ 1000RPM tới 40.000RPM
Ví dụ: Một động DC RS775-9009 có tốc độ quay 22.000RPM với hộp giảm tốc Planet
Ứng dụng động DC đa dạng hầu hết lĩnh vực đời sống Trong tivi, đài FM, ổ đĩa DC, máy in- photo, máy công nghiệp v v Đối với động điện chiều có loại khơng chổi than (Brussless DC Motor- BLDC) động có chổi than (Brush DC Motor- DC Motor) Do động BLDC thực chất động điện pha khơng đồng xét động điện chiều có chổi than
1.2 Phân loại động điện chiều (đây cách phân loại theo cách kích từ) Động điện chiều phân loại theo kích từ thành 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 loại động điện chiều nhƣ có ứng dụng khác Nhƣng thực tế, ta chủ yếu tiếp xúc với loại động 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 không cần đến phần kích từ cho động Ta nói đến quan tâm tới kích từ cho động DC nói đến loại động DC cơng suất lớn, Stator động nam châm vĩnh cửu mà nam châm điện Phần nam châm điện gồm lõi thép kỹ thuật 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 nó, ta gọi kích từ Nhƣ với loại động DC tiếp cận khơng cần phải quan tâm tới "kích từ"
1.3 Cấu tạo nguyên tắc hoạt động - Cấu tạo:
Gồm có phần stator( phần cảm), rotor ( phần ứng), phần cổ góp- chỉnh lƣu
(133)130
Cấu tạo chi tiết động DC với phần than lộ phần rotor dây đồng
- Stator động điện chiều thƣờng hay nhiều cặp nam châm vĩnh cửu, hay nam châm điện
- Rotor có cuộn dây quấn đƣợc nối với nguồn điện chiều
- Bộ phận chỉnh lƣu, có nhiệm vụ đổi chiều dòng điện chuyển động quay rotor liên tục Thơng thƣờng phận gồm có cổ góp chổi than tiếp xúc với cổ góp
- Nguyên lý hoạt động
Pha 1: Từ trƣờng rotor cực với stator, đẩy tạo chuyển động quay rotor
Pha 2: Rotor tiếp tục quay
Pha 3: Bộ phận chỉnh điện đổi cực cho từ trƣờng stator rotor dấu, trở lại pha
(134)131 -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 thay đổi điện áp phần ứng Trong điển hình phƣơng pháp thay đổi độ rộng xung PWM
2 Phần cứng * Chuẩn bị:
- Động DC 12 V - Board Arduino
- Breadboard dây nối - Bộ điều khiển L298N
Hình 14.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 cầu H là: 2A (=>2A cho motor) Điện áp tín hiệu điều khiển: +5 V ~ +7 V
Dòng tín hiệu điều khiển: ~ 36mA (Arduino chơi đến 40mA nên khỏe re bạn)
(135)132 - L298 chức năngcác chân:
- 12V power, 5V power.: Đây chân cấp nguồn trực tiếp đến động Ta cấp nguồn 9-12V 12V
- jumper 5V, để nhƣ hình có nguồn 5V cổng 5V power, ngƣợc lại khơng Ta để nhƣ hình ta cần cấp nguồn 12V vào 12V power có 5V 5V power, từ cấp cho Arduino
- Power GND chân GND nguồn cấp cho Động Chú ý: Nếu dùng Arduino nối với GND Arduino
- Jump A enable B enable, để nhƣ hình - Gồm có chân Input IN1, IN2, IN3, IN4
- Output A: nối với động A.tachú ý chân +, - Nếu nối ngƣợc động chạy ngƣợc Và ý ta nối động bƣớc, ta phải đấu nối pha cho phù hợp
Board gồm phần điều khiển động Và điều khiển cho động bƣớc dây dây
* Lắp mạch :
Hình 14.4 Giao tiếp UNO với động DC 3 Lập trình giải thích
const int motorA1=9; //Khai báo chân IN const int motorA2=10;
void setup() {
(136)133 }
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
(137)134
BÀI 15: ĐIỀU KHIỂN ĐỘNG CƠ SERVO * Giới thiệu:
Điều khiển động DC (DC Motor) ứng dụng thuộc dạng điều khiển tự động DC Motor cấu chấp hành (actuator) đƣợc dùng nhiều hệ thống tự động (ví dụ robot) Điều khiển đƣợc DC servo motor ta tự xây dựng đƣợc cho nhiều hệ thống tự động Khái niệm Servo mà dùng học để hệ thống hồi tiếp DC servo motor động DC có điều khiển hồi tiếp
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức nguyên lý hoạt động động servo
- Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động servo
- Mơ đƣợc chƣơng trình mạch điều khiển động servo phần mềm mô
- Kết nối đƣợc phần cứng mạch điều khiển động servo yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình điều khiển động servo *Nội dung:
1 Giới thiệu động servo 1.1 Động Servo nghĩ ?
Hình 15.1 Động Servo
Động Servo phận hệ thống điều khiển chuyển động máy móc Một phận khơng thể thiếu giúp Động Servo hoạt động Driver servo Tƣơng tự nhƣ driver máy tính Động Servo cung cấp lực chuyển động cần thiết cho thiết bị máy móc vận hành
(138)135
Nhìn chung động servo có loại là: Động DC Servo động AC Servo
- AC servo loại động cho phép xử lý dòng điện cao nên thƣờng đƣợc sử dụng máy móc cơng nghiệp đặc biệt loại máy CNC
- DC servo không đƣợc thiết kế cho dòng điện cao thƣờng phù hợp cho ứng dụng nhỏ Động DC đƣợc chia làm loại động chiều có chổi than động chiều không chổi than
Nhờ phát triển vƣợt bậc công nghệ điều khiển điện nên hầu hết ngƣời ta sử dụng động AC Servo
1.3.Cấu tạo động Servo * Động DC Servo
-Động DC có chổi than: gồm cấu tạo stato, rotor, chổi than cuộn cảm lõi
- Ưu điểm: động DC có chổi than 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 tiếng ồn, nhiệt độ cao vậ hành quán tính cao giảm tốc độ Để khắc phục đƣợc vân đề ngƣời ta hay dùng động DC không chổi than
Hình 15.2 cấu tạo động Servo
Động DC khơng chổi than: Cấu trúc tƣơng đối giống với động có chổi than Điều khác biệt cuộn pha đƣợc lắp rotor động vĩnh cữu * Động AC Servo
Động AC Servo đƣợc sử dụng ngành công nghiệp đa phần động chiều khơng chổi than Động Servo có cấu tạo phần giống với động bƣớc Rotor Stator
Rotor nam châm vĩnh cửu có từ trƣờng mạnh
(139)136
- Ưu điểm: Điều khiển có tốc độ tốt, trơn tru hầu nhƣ không giao động Hiệu suất đạt 90%
Q trình vận hành tạo nhiệt với tốc độ cao Độ xác cao (tùy thuộc vào độ xác mã hóa)
Mơ-men xoắn, qn 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 tƣơng đối phức tạp Giá thành lại cao
Nguyên lý hoạt động
Động servo đƣợc hình thành hệ thống hồi tiếp vịng kín Tín hiệu động đƣợc nối với mạch điều khiển Khi động vận hành vận tốc vị trí đƣợc hồi tiếp mạch điều khiển Khi bầt kỳ lý ngăn cản chuyển động quay động cơ, cấu hồi tiếp nhận thấy tín hiệu 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 đạt đƣợc điểm xác
* Ứng dụng
- Ứng dụng 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 động Servo đáp ứng đƣợc yêu cầu Đặc biệt AC Servo
- Ứng dụng ngành gia cơng khí:
(140)137
Ứng dụng ngành may mặc, ngành giấy, bao bì: Trong việc điều khiển máy cuộn vải, giấy, bao bì để cắt in ấn…
2 Phần cứng * Chuẩn bị :
- Mạch Arduino UNO
- Breadboard gọi testboard - Dây cắm test board
- module servo SG90:
Hình 15.3 Động Servo MG90
Động servo đƣợc chia làm nhiều loại, phụ thuộc vào góc quay tối đa chúng, loại phổ biến hay sử dụng là:
Động servo quay 180°: Futaba S3003, MG90[S] Động servo quay 360°: MG995, MG996R
Nhƣ đề cập bên trên, động servo loại động cho phép ta điều khiển cách xác Vì vậy, khác với động thơng thƣờng ta cần cấp nguồn cho động vận hành đƣợc Động servo yêu cầu ta phải cấp nguồn (2 dây) nhận điều khiển từ mạch (1 dây), dây thƣờng đƣợc đánh màu nhƣ sau:
+ Đỏ: nhận điện nguồn, tuỳ vào loại động mà giá trị khác + Nâu: nối với cực âm mạch
(141)138
Hình 15.3 Giao tiếp bo arduino UNO với động Servo MG90 3 Lập trình giải thích
#include <Servo.h>
#define SERVO_PIN // chan tin hieu cua servo noi voi chan so arduino Servo gServo;
void setup() {
gServo.attach(SERVO_PIN); }
void loop() {
gServo.write(0); // điều chỉnh góc xoay servo delay(1000);
gServo.write(90); // điều chỉnh góc xoay servo delay(1000);
gServo.write(180); // điều chỉnh góc xoay servo delay(1000);
}
CÂU HỎI VÀ BÀI TẬP
(142)139
BÀI 16: ĐIỀU KHIỂN ĐỘNG CƠ BƢỚC * Giới thiệu:
Điều khiển động DC (DC Motor) ứng dụng thuộc dạng điều khiển tự động DC Motor cấu chấp hành (actuator) đƣợc dùng nhiều hệ thống tự động (ví dụ robot) Điều khiển đƣợc động bƣớc là ta tự xây dựng đƣợc cho nhiều hệ thống tự động
*Mục tiêu: Sau học xong học này, ngƣời học có khả năng:
- Trình bày đƣợc cấu tạo, chức nguyên lý hoạt động động bƣớc, mạch ULN 2003
- Vẽ đƣợc sơ đồ nguyên lý mạch điều khiển động bƣớc
- Mơ đƣợc chƣơng trình mạch điều khiển động bƣớc phần mềm mô
- Kết nối đƣợc phần cứng mạch điều khiển động bƣớc yêu cầu kỹ thuật
- Viết, nạp chạy đƣợc chƣơng trình điều khiển động bƣớc
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung:
1 Giới thiệu động bƣớc 1.1 Động bƣớc gì?
Động bƣớc (stepper motor), thực chất động đồng dùng để biến đổi tín hiệu điều khiển dƣới dạng xung điện rời rạc thành chuyển động góc quay
Hình 16.1 Động bước 1.2 Cấu tạo động bƣớc
(143)140
Động bƣớc sử dụng hệ thống điều khiển vịng hở đơn giản, vịng kín, nhiên sử dụng động bƣớc hệ điều khiển vòng hở tải, tất cá giá trị động bị hệ thống cần nhận diện lại
Hình 16.2 Cấu tạo động bước 1.3 Đặc điểm động bƣớc
Động bƣớc hoạt động dƣới tác dụng xung rời rạc Khi có dịng điện hay điện áp đặt vào cuộn dây phần ứng động bƣớc làm cho roto động quay góc định gọi bƣớc động
Góc bƣớc góc quay trục động tƣơng ứng với xung điều khiển Góc bƣớc đƣợc xác định dựa vào cấu trúc động bƣớc phƣơng pháp điều khiển động bƣớc
Tính mở máy động đƣợc đặc trƣng tần số xung cực đại mở máy mà không làm cho roto đồng
Chiều quay động 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 cuộn dây
1.4 Phân loại động bƣớc
Động bƣớc đƣợc chia thành loại là: Động bƣớc biến từ trở
Động bƣớc nam châm vĩnh cửu Động bƣớc hỗn hợp/lai
1.5 Phƣơng pháp điều khiển động bƣớc
(144)141
Hình 16.3 xung điều khiển động bước * Phương pháp điều khiển động bước
- Điều khiển dạng sóng (Wave): phƣơng pháp điều khiển cấp xung điều khiển lần lƣợt theo thứ tự chon cuộn dây pha
- Điều khiển bƣớc đủ (Full step): phƣơng pháp điều khiển cấp xung đồng thời cho cuộn dây pha
- Điều khiển nửa bƣớc (Half step): phƣơng pháp điều khiển kết hợp phƣơng pháp khiển dạng sóng điều khiển bƣớc đủ Khi điều khiển theo phƣơng pháp giá trị góc bƣớc nhỏ hai lần số bƣớc động bƣớc tăng lên lần so với phƣơng pháp điều khiển bƣớc đủ nhiên phƣơng pháp có phát xung điều khiển phức tạp
- Điều khiển vi bƣớc (Microstep): phƣơng pháp đƣợc áp dụng việc điều khiển động bƣớc cho phép động bƣớc dừng định vị vị trí nửa bƣớc bƣớc đủ
Ƣu điểm phƣơng pháp động hoạt động với góc bƣớc nhỏ,độ xác cao Do xung cấp có dạng sóng nên động hoạt động êm hơn,hạn chế đƣợc vấn đề cộng hƣởng động hoạt động
2 Phần cứng *Chuẩn bị:
- Mạch Arduino UNO
- Breadboard gọi testboard - Dây cắm test board
- nguồn (5V đến 12V) ( sử dụng nguồn 5Vdc arduino nhƣng khuyến cáo hạn chế sử dụng để tránh việc hư board arduino)
(145)142
Hình 16.4 module điều khiển động bước + Thông số kỹ thuật:
Điện áp cung cấp: ~ 12VDC
Tín hiệu ngõ vào: chân in1, in2, in3, in4
(146)143 Thông số kỹ thuật:
Điện hoạt động 5V
Số pha
Tỉ lệ bánh *64
Một bƣớc tƣơng đƣơng 5.625° (64 bƣớc)
Tần số 100Hz
Điện trở 50Ω±7%(25℃)
Động bƣớc sử dụng phần động bƣớc pha (thực pha đƣợc chia làm pha vị trí giữa) (gồm dây), dây đƣợc kết nối với cuộn dây động dây dây nguồn chung cho cuộn dây Mỗi bƣớc động quét góc 5.625 độ, để quay vòng động phải thực 64 bƣớc
* Lắp mạch:
Hình 16.5 Giao tiếp UNO với động bước 3 Lập trình giải thích
#define IN1 // IN1 nối với chân D8 arduino #define IN2 // IN2 nối với chân D9 arduino #define IN3 10 // IN3 nối với chân D10 arduino #define IN4 11 // IN4 nối với chân D11của arduino int Steps = 4096;
(147)144 Serial.begin(9600);
(148)145 break;
}
cstep=cstep+1; if(cstep==8) {cstep=0;} }
CÂU HỎI VÀ BÀI TẬP
(149)146
BÀI 17: UART-GIAO TIẾP GIỮA ARDUINO
* Giới thiệu: Chuẩn giao tiếp truyền thông nối tiếp UART Arduino (hay
đƣợc biết đến với tên gọi Serial) chuẩn giao tiếp đƣợc sử dụng nhiều ứng dụng hệ thống nhúng Trong viết hƣớng dẫn tiếp cận lập trình với giao tiếp UART cách đơn giản
*Mục tiêu: Sau học xong 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 giao tiếp UART trong Arduino
-Vẽ đƣợc sơ đồ nguyên lý mạch giao tiếp UART
- Mô đƣợc chƣơng trình mạch giao tiếp UART phần mềm mơ
- Kết nối đƣợc phần cứng mạch giao tiếp UART yêu cầu kỹ thuật - Viết, nạp chạy đƣợc chƣơng trình giao tiếp UART
- Rèn luyện tính tƣ tác phong cơng nghiệp , đảm bảo an tồn cho ngƣời thiết bị
*Nội dung:
1 Giới thiệu UART
Hình 17.1 Chân giao tiếp Uart Arduino UNO * Khai báo UART:
(150)147
nhận liệu bên vi điều khiển chân digiatal đƣợc nối với truyền liệu bên vi điều khiển
Example Code Void setup()
{
Serial.begin(9600);// mở cổng giao tiếp cài đặt liệu }
Void loop() { }
* Nối dây thiết bị:
Nếu ta sử dụng Board Arduino để giao tiếp với máy tính (sử dụng cửa sổ Serial monitor ARDUINO IDE) khơng cần phải nối thêm board Arduino thực sẵn việc đó, cần cắm cab USB vào đƣợc Nếu ta sử dụng Arduino để giao tiếp với thiết bị, module khác tanối chéo, TX – RX RX – TX đừng quên điều kiểm tra xem thiết bị chung GND chƣa, chƣa chúng không hiểu mức logic ==> không giao tiếp đƣợc
Phức tạp nhƣ thiết bị khác mức logic, ví dụ nhƣ thiết bị 5v giao tiếp với thiết bị 3.3V ta cần thêm mạch để chuyển đổi điện áp cho phù hợp
Hình 17.1 giao tiêp thiết bị * Truyền liệu:
(151)148
thêm ký tự kết thúc câu (\r) ký tự xuống dịng (\n) sử dụng Serial.println(x) đƣợc
* Nhận liệu:
Nền tảng Arduino hỗ trợ ngƣời dùng nhiều xây dựng sẵn đệm UART (buffer) có kích cỡ 64byte(Arduino Uno) Mỗi lần nhận ký tự ký tự đƣợc tự động chuyển vào đệm Ngƣời dùng muốn đọc liệu cần làm việc với đệm đƣợc
+ Kiểm tra đệm: Trƣớc thực thao tác đọc xử lý liệu thiết bị khác gửi đến nên kiểm tra đệm trƣớc Câu lệnh Serial.available() trả cho tasố kí tự (byte) có đệm ==>Ta sử dụng lệnh:
if(Serial.available())
{đọc xử lý liệu có liệu}
+ Đọc liệu: Để đọc 1byte từ đệm tasử dụng lệnh Serial.read(); Tuy nhiên thực tế hầu hết cần đọc chuỗi ký tự Tacó thể đọc ký tự, sau ghép chúng lại thành chuỗi sử dụng kiểu liệu String mà Arduino hỗ trợ (lƣu ý String chữ S viết hoa) Lệnh Serial.readString() giúp tađọc đƣợc tất kí tự có đệm
+ Lƣu ý: Bộ đệm UART liệu sau tađọc Vì ta nên đọc lƣu biến làm việc với biến
- Kiểu String:
Kiểu String Arduino giúp cho ngƣời dùng thao tác với chuỗi đơn giản với nhiều hàm hỗ trợ
- myString.indexOf(val):
Hàm giúp ta tìm đƣợc vị trí ký tự chuỗi (val) chuỗi khác (myString)
- myString.toInt():
Từ hình Serial Monitor ta bấm 168 để gửi Arduino nhận đƣợc chuỗi “168”, để khôi phục lại thành số 168 tasử dụng hàm toInt()
- substring(): Trong chuỗi liệu lớn nhận đƣợc có phần liệu nằm chuỗi mà tacần tách để sử dụng Lúc hàm substring trợ thủ đắc lực cho ta
- myString.toCharArray():
(152)149
thành mảng tacó thể sử dụng thêm hàm length() để xác định đƣợc số lƣợng phần tử mảng (sau nhớ cộng thêm sử dụng mảng kiểu char để lƣu chuỗi cần có ký tự Null sau cùng)
2 Phần cứng *Chuẩn bị:
- Mạch Arduino (ở sử dụng Arduino UNO) (Truyền liệu) - Mạch Arduino Nano,… (ở sử dụng Arduino UNO) (Nhận liệu)
- Breadboard gọi testboard - Dây cắm test board
- led đơn - trở 220Ohm *Lắp mạch:
(153)150 3 Lập trình giải thích
* Chương trình ( code) upload cho Arduino Truyền lệnh:
void setup() {
Serial.begin(9600); // Bạn khởi tạo cổng Serial baudrate 9600 }
int Step = 0; void loop() { if (Step == 0) {
Serial.println("LED_RED 1"); // Đèn đỏ sáng == HIGH }
else if (Step == 1) {
Serial.println("LED_RED 0"); // Đèn đỏ tắt == LOW }
Step = (Step + 1) % 2; //Step tuần hoàn giá trị khoảng từ >
delay(500); // Dừng 1/2 giây lần gửi }
* Chương trình ( code) upload cho Arduino nhận lệnh:
#include <SoftwareSerial.h>
#include <SerialCommand.h> // Khai báo biến sử dụng thƣ viện Serial Command SerialCommand sCmd;
int red = 8; void setup() {
Serial.begin(9600); / /Khởi tạo Serial baudrate 9600 pinMode(red,OUTPUT);
// Một số hàm thƣ viện Serial Command
sCmd.addCommand("LED_RED",led_red); // Khi có câu lệnh tên LED_RED chạy hàm led_red
}
void loop() { sCmd.readSerial();
//Ta không cần phải thêm dòng code hàm loop }
// hàm led_red đƣợc thực thi gửi hàm LED_RED void led_red() {
(154)151 char *arg;
arg = sCmd.next();
int value = atoi(arg); // Chuyển chuỗi thành số digitalWrite(red,value);
}
Câu hỏi ôn tập Câu 1: Nêu công dụng UART ?
Câu 2: Kết nối phần cứng viết chƣơng trình điều khiển led đơn qua giao tiếp serial Arduino PC?
Tài liệu tham khảo:
[1]Dự án Giáo dục kỹ thuật 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
D 1 r) " Arduino Uno r3 đây. Kết nối phần cứng viết chƣơng trình điều khiển led đơn qua giao tiếp serial Arduino PC?