Giáo trình Chuyên đề Arduino và truyền thông

pdf 151 trang Gia Huy 20/05/2022 2380
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Chuyên đề Arduino và truyền thông", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_chuyen_de_arduino_va_truyen_thong.pdf

Nội dung text: Giáo trình Chuyên đề Arduino và truyền thông

  1. ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH  GIÁO TRÌNH MÔN HỌC: CHUYÊN ĐỀ ARDUINO VÀ TRUYỀN THÔNG NGÀNH: CNKT ĐIỆN TỬ, TRUYỀN THÔNG TRÌNH ĐỘ: CAO ĐẲNG Thành phố Hồ Chí Minh, năm 2020
  2. ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG KINH TẾ KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH  GIÁO TRÌNH MÔN HỌC: CHUYÊN ĐỀ ARDUINO VÀ TRUYỀN THÔNG NGÀNH: CNKT ĐIỆN TỬ, TRUYỀN THÔNG TRÌNH ĐỘ: CAO ĐẲNG THÔNG TIN CHỦ NHIỆM ĐỀ TÀI Họ tên: Trần Vĩnh Thường Học vị: Thạc sĩ Kỹ thuật Điện tử Đơn vị: Khoa Điện – Tự động hóa Email: tranvinhthuong@hotec.edu.vn TRƯỞNG KHOA TỔ TRƯỞNG CHỦ NHIỆM BỘ MÔN ĐỀ TÀI HIỆU TRƯỞNG DUYỆT Thành phố Hồ Chí Minh, năm 2020
  3. TUYÊN BỐ BẢN QUYỀN Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm.
  4. LỜI GIỚI THIỆU Chuyên đề Arduino và truyền thông cũng như các môn học CNKT Điện tử -viễn thông là môn học chuyên ngành trong chuyên ngành đào tạo ngành nghề CNKT Điện tử, truyền thông và ngành CNKT Điện tử - viễn thông. Với những ưu điểm riêng của mình, Arduino đã nhanh chóng nổi tiếng toàn thế giới và được giới học sinh, sinh viên, giới nghiên cứu, những người yêu thích kỹ thuật, những người thích làm đồ tự chế sử dụng rộng rãi. Tại Việt Nam, số lượng người sử dụng mạch Arduino ngày càng tăng. Để đáp ứng nhu cầu tìm hiểu Arduino, tác giả đã thấy tầm quan trọng là phải có giáo trình môn Chuyên đề Arduino và truyền thông để phục vụ cho mục đích ứng nhu cầu học tập của sinh viên về môi trường nguồn mở. Ngoài ra giáo trình Chuyên đề Arduino và truyền thông theo đề cương chi tiết của môn học. Lời đầu tiên cho tôi gửi lời cảm ơn đến ban lãnh đạo Khoa Điện – Tự động hóa, quý thầy cô trong tổ viễn thông và khoa đã tạo mọi điều kiện tốt nhất để tôi hoàn thành giáo trình này. Do thời gian hạn chế nên giáo trình không thể tránh khỏi sai sót, rất mong nhận được sự đóng góp ý kiến của quý thầy cô để giáo trình ngày càng hoàn thiện hơn. Xin cảm ơn! Thành phố Hồ Chí Minh, ngày 01 tháng 08 năm 2020 Chủ biên: Trần Vĩnh Thường KHOA ĐIỆN – TỰ ĐỘNG HÓA 1
  5. MỤC LỤC TUYÊN BỐ BẢN QUYỀN 3 LỜI GIỚI THIỆU 1 MỤC LỤC 2 Chương 1: Tổng quan về Arduino 6 1.1. Tổng quan Arduino 6 Giới thiệu về Adruino 6 Phần cứng của Adruino Uno R3 6 1.2. Lịch sử phát triển của Arduino 11 Dòng Arduino USB 11 Arduino MEGA 21 1.3. Cài đặt IDE, driver cho Arduino 23 Vào trang chủ của Arduino 23 Tải chương trình cài đặt 24 Cài đặt trên máy tính 25 1.4. Giới thiệu các loại kit thực hành Arduino 29 1.5. Ngôn ngữ lập trình cho Arduino 29 Cấu trúc (Structure) 30 Biến số (variable) và Hằng số (Constant) 31 Hàm và Thủ tục (Function) 33 1.6. Nạp chương trình cho Arduino 36 1.7. Sử dụng thư viện lập trình Arduino 42 1.8. Khởi tạo Project, thêm thư viện lập trình 42 Chương 2: Lập trình - mô phỏng dùng vi điều khiển Arduino 46 2.1. Lập trình - mô phỏng ứng dụng I/O 46 Điều khiển LED đơn 46 Điều khiển LED 7 đoạn 48 Điều khiển Matrix LED 56 Giao tiếp LCD, phím nhấn và Matrix phím nhấn 63 KHOA ĐIỆN – TỰ ĐỘNG HÓA 2
  6. Giao tiếp ADC – DAC 69 Điều khiển PWM 73 Truyền dữ liệu giao thức UART 75 Truyền dữ liệu giao thức SPI 76 Truyền dữ liệu giao thức I2C 79 Truyền dữ liệu giao thức Bluetooth 82 Chương 3: Truyền thông vi điều khiển Arduino 85 3.1. Tổng quan về truyền thông dùng Arduino 85 3.2. Module ESP8266 85 Mã nguồn mở của module ESP8266 85 Lập trình code module ESP8266 88 Phần mềm mã nguồn mở Blynk 91 Điều khiển thiết bị qua Wifi 102 Điều khiển thiết bị qua Cloud Server với MQTT 111 Thu thập dữ liệu với ESP8266 và Webserver 120 3.3. Module Ethernet Shield 122 Điều khiển thiết bị điện dùng module Ethernet Shield 122 Chương 4: Thực hiện đề tài 130 4.1. Ứng dụng module ESP8266 130 Điều khiển thiết bị từ xa qua website (ESP8266 web server) 130 Cập nhật Firmware từ xa cho ESP8266 (OTA) 130 Điều khiển bằng giọng nói sử dụng ESP8266 131 Điều khiển xe từ xa qua ESP8266 132 Sử dụng ESP8266 hiển thị lên led ma trận 132 4.2. Ứng dụng module Ethernet Shield 132 4.3. Hướng dẫn kỹ năng tìm kiếm tài liệu nâng cao trên Google 133 Tìm kiếm Cụm từ chính xác 133 Loại trừ Từ 133 This OR That 133 Các từ trong văn bản 134 Các từ trong Text + Tiêu đề, URL 134 Tìm Các từ trong Title (Tiêu đề) 134 KHOA ĐIỆN – TỰ ĐỘNG HÓA 3
  7. Các từ trong Title + Text, URL 134 Tìm kiếm Các từ trong URL 134 Cách tìm kiếm trong một trang web 135 Tìm kiếm có liên quan 135 Một Trang Kết Nối tới Trang Khác (Page that links to another page) 135 Các từ và từ đồng nghĩa 136 Định nghĩa của từ 136 Thiếu Từ (Missing word) 136 Tin tức trong một Vị trí cụ thể 136 Tìm Loại file tài liệu cụ thể 137 4.4. Hướng dẫn kỹ năng viết một bài báo cáo khoa học 138 Lựa chọn đề tài 138 Nghiên cứu đề tài. 139 Trước khi viết báo cáo 140 Tiến hành viết báo cáo 142 Hoàn thành Báo cáo 143 Lời khuyên 144 4.5. Hướng dẫn kỹ năng soạn thảo Powerpoint và kỹ năng thuyết trình 145 Kỹ năng soạn thảo Powerpoint 145 Kỹ năng thuyết trình 145 4.6. Xây dựng đề cương đề tài 146 Đề cương nghiên cứu là gì? 146 Vì sao cần viết đề cương nghiên cứu? 146 Đề cương nghiên cứu dành cho ai và để làm gì? (Vai trò) 146 Nội dung của đề cương 147 4.7. Kế hoạch thực hiện 147 4.8. Hoàn chỉnh và báo cáo 148 KHOA ĐIỆN – TỰ ĐỘNG HÓA 4
  8. GIÁO TRÌNH MÔN HỌC Tên môn học: CHUYÊN ĐỀ ARDUINO VÀ TRUYỀN THÔNG Mã môn học: MH3102239 Vị trí, tính chất, ý nghĩa và vai trò của môn học: - Vị trí: Môn học chuyên ngành, Học kỳ 4 - Tính chất: Môn học tự chọn - Ý nghĩa và vai trò của môn học: có ý nghĩa quan trọng trong việc định hướng nghề nghiệp viễn thông trong tương lai, hình thành nên cơ sở yêu nghề và phấn đấu cho mục tiêu nghề nghiệp. Mục tiêu của môn học/mô đun: - Về kiến thức: + Trình bày được các kiến thức cơ bản về Arduino + Trình bày được các ứng dụng dùng Arduino cơ bản trong mạng viễn thông + Giải thích được các cơ chế truyền thông vi điều khiển Arduino + Phân biệt được các cơ chế truyền thông vi điều khiển Arduino - Về kỹ năng: + Soạn thảo và thuyết trình được một vấn đề khoa học + Mô phỏng được hệ thống mạng viễn thông dùng phần mềm Proteus + Thiết kế được hệ thống mạng viễn thông dùng vi điều khiển Arduino + Có kỹ năng trình bày một một vấn đề khoa học bằng văn bản và thuyết trình - Về năng lực tự chủ và trách nhiệm: + Tích cực trong việc tìm hiểu truyền thông dùng vi điều khiển Arduino + Khả năng tự tìm hiểu nghiên cứu một vấn đề khoa học + Xây dựng môi trường xanh KHOA ĐIỆN – TỰ ĐỘNG HÓA 5
  9. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.1. Tổng quan Arduino Giới thiệu về Adruino Arduino là một nền tảng nguyên mẫu (mã nguồn mở) dựa trên nền phần mềm và phần cứng dễ sử dụng. Nó bao gồm một bo mạch - thứ mà có thể được lập trình (đang đề cập đến vi điều khiển) và một phần mềm hỗ trợ gọi là Arduino IDE (Môi trường phát triển tích hợp cho Arduino), được sử dụng để viết và nạp từ mã máy tính sang bo mạch vật lý. Những tính năng chính như:  Các bo mạch Arduino có khả năng đọc các tín hiệu tương tự (analog) hoặc tín hiệu số (digital) làm đầu vào từ các cảm biến khác nhau và chuyển nó thành đầu ra như kích hoạt mô-tơ quay, bật/tắt đèn LED, kế nối mạng Internet hoặc nhiều hoạt động khác nữa.  Bạn có thể điều khiển các chức năng của bo mạch của mình bằng cách nạp các tập lệnh đến vi điều khiển trên bo mạch. Thông qua phần mềm hỗ trợ là Arduino IDE.  Không giống như bo mạch có khả năng lập trình trước kia, Arduino chỉ cần bạn sử dụng cáp USB để nạp mã vào trong bo mạch.  Hơn nữa, phần mềm Arduino IDE sử dụng phiên bản giản thể của C++, làm việc học lập trình nó trở nên dễ dàng hơn rất nhiều. Phần cứng của Adruino Uno R3 Phần này nói về phần cứng của Arduino Uno R3, một bo mạch thông dụng hiện nay. Tài liệu hướng dẫn này chỉ đưa ra những kiến thức cơ bản cần thiết cho việc sử dụng board mạch này. Nếu người học cần những kiến thức chuyên sâu hơn thì có thể tham khảo tại website chính thức của Arduino: “arduino.cc”. KHOA ĐIỆN – TỰ ĐỘNG HÓA 6
  10. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  1. Cáp USB: Đây là dây cáp thường được bán kèm theo bo, dây cáp dùng để cắm vào máy tính để nạp chương trình cho bo và dây đồng thời cũng lấy nguồn từ nguồn usb của máy tính để cho bo hoạt động. Ngoài ra cáp USB còn được dùng để truyền dữ liệu từ bo Arduino lên máy tính. Dây cáp có 2 đầu, đầu 1a được dùng để cắm vào cổng USB trên bo Arduino, đầu 1b dùng để cắm vào cổng USB trên máy tính.  2. IC Atmega 16U2: IC này được lập trình như một bộ chuyển đổi USB - to-Serial dùng để giao tiếp với máy tính thông qua giao thức Serial (dùng cổng COM).  3. Cổng nguồn ngoài: Cổng nguồn ngoài nhằm sử dụng nguồn điện bên ngoài như pin, bình acquy hay các adapter cho bo Arduino hoạt động. Nguồn điện cấp vào cổng này là nguồn DC có hiệu điện thế từ 6V đến 20V, tuy nhiên hiệu điện thế tốt nhất mà nhà sản xuất khuyên dùng là từ 7 đến 12V.  4. Cổng USB: Cổng USB trên bo Arduino dùng để kết nối với cáp USB.  5. Nút reset: Nút reset được sử dụng để reset lại chương trình đang chạy. Đôi khi chương trình chạy gặp lỗi, người dùng có thể reset lại chương trình. KHOA ĐIỆN – TỰ ĐỘNG HÓA 7
  11. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  6. ICSP của ATmega 16U2: ICSP là chữ viết tắt của In-Circuit Serial Programming. Đây là các chân giao tiếp SPI của chip Atmega 16U2. Các chân này thường ít được sử trong các dự án về Arduino.  7. Chân xuất tín hiệu ra: Có tất cả 14 chân xuất tín hiệu ra trong Arduino Uno, những chân có dấu ~ là những chân có thể băm xung (PWM), tức có thể điều khiển tốc độ động cơ hoặc độ sáng của đèn.  8. IC ATmega 328: IC Atmega 328 là linh hồn của bo mạch Arduino Uno, IC này được sử dụng trong việc thu thập dữ liệu từ cảm biến, xử lý dữ liệu, xuất tín hiệu ra,  9. Chân ICSP của ATmega 328: Các chân ICSP của ATmega 328 được sử dụng cho các giao tiếp SPI (Serial Peripheral Interface), một số ứng dụng của Arduino có sử dụng chân này, ví dụ như sử dụng module RFID RC522 với Arduino hay Ethernet Shield với Arduino.  10. Chân lấy tín hiệu Analog: Các chân này lấy tín hiệu Analog (tín hiệu tương tự) từ cảm biến để IC Atmega 328 xử lý. Có tất cả 6 chân lấy tín hiệu Analog, từ A0 đến A5.  11. Chân cấp nguồn cho cảm biến: Các chân này dùng để cấp nguồn cho các thiết bị bên ngoài như role, cảm biến, RC servo, .trên khu vực này có sẵn các chân GND (chân nối đất, chân âm), chân 5V, chân 3.3V như được thể hiện ở hình 2. Nhờ những chân này mà người sử dụng không cần thiết bị biến đổi điện khi cấp nguồn cho cảm biến, role, rc servo, .Ngoài ra trên khu vực này còn có chân Vin và chân reset, chân IOREF. Tuy nhiên các chân này thường ít được sử dụng nên trong tài liệu này xin không đi sâu về nó.  12. Các linh kiện khác trên board Arduino Uno: Ngoài các linh kiện đã liệt kê bên trên, Arduino Uno còn 1 số linh kiện đáng chú ý khác. Trên bo có tất cả 4 đèn led, bao gồm 1 led nguồn (led ON nhằm cho biết boa đã được cấp nguồn), 2 led Tx và Rx, 1 led L. Các led Tx và Rx sẽ nhấp nháy khi có dữ liệu truyền từ board lên máy tính hoặc ngược lại thông qua cổng USB. Led L được được kết nối với chân số 13. Led này được gọi là led on KHOA ĐIỆN – TỰ ĐỘNG HÓA 8
  12. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO board (tức led trên bo), led này giúp người dùng có thể thực hành các bài đơn giản mà không cần dùng thêm led ngoài. Trong 14 chân ra của bo còn có 2 chân 0 và 1 có thể truyền nhận dữ liệu nối tiếp TTL. Có một số ứng dụng cần dùng đến tính năng này, ví dụ như ứng dụng điều khiển mạch Arduino Uno qua điện thoại sử dụng bluetooth HC05. Thêm vào đó, chân 2 và chân 3 cũng được sử dụng cho lập trình ngắt (interrupt), đồng thời còn 1 vài chân khác có thể được sử dụng cho các chức năng khác, như được thể hiện ở hình 3. Bảng 1 thể hiện thêm các thông số cho bo Arduino Uno R3. Các chân vào ra của Arduino Uno Vi điều khiển ATmega328 (họ 8bit) Điện áp hoạt động 5V - DC (chỉ được cấp qua cổng USB) Tần số hoạt động 16 MHz Dòng tiêu thụ 30mA Điện áp vào khuyên dùng 7-12V - DC Điện áp vào giới hạn 6-20V - DC Số chân Digital I/O 14 (6 chân PWM) Số chân Analog 6 (độ phân giải 10bit) Dòng tối đa trên mỗi chân I/O 30 mA Dòng ra tối đa (5V) 500 mA Dòng ra tối đa (3.3V) 50 mA 32 KB (ATmega328) với 0.5KB dùng Bộ nhớ flash bởi bootloader Thông số của Arduino Uno R3 KHOA ĐIỆN – TỰ ĐỘNG HÓA 9
  13. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Một số chức năng của các chân trên Arduino (PinOut). KHOA ĐIỆN – TỰ ĐỘNG HÓA 10
  14. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2. Lịch sử phát triển của Arduino Arduino là một bo mạch vi điều khiển do một nhóm giáo sư và sinh viên Ý thiết kế và đưa ra đầu tiên vào năm 2005. Dòng Arduino USB 1.2.1.1. Mạch lập trình đầu tiên (2005)  Được đặt tên là Arduino Serial  Sử dụng cổng kết nối RS-232 (Serial) thay vì cổng USB (TTL) Qua thời gian, dòng mạch Arduino Serial đã được thiết kế đơn giản hơn, và chỉ cần dùng 1 mặt để mọi nhà phát triển có thể tự làm một cái cho bản thân mình bằng cách rửa mạch PCB. Nổi bật trong số đó là dòng mạch có tên Severino (Aka S3V3). Dòng sản phẩm này có tên là Arduino Signle-Sided Serial. Severino (Aka S3V3) KHOA ĐIỆN – TỰ ĐỘNG HÓA 11
  15. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2.1.2. Mạch Arduino đầu tiên - Arduino USB (2005) Dòng mạch Arduino USB được phát triển qua 2 phiên bản (Arduino USB và Arduino USB v2.0). Ở mỗi phiên bản cũng không có sự khác nhau lắm, chỉ khác nhau về địa chỉ trang web và sửa một lỗi nhỏ ở phần pinout chỗ đầu USB. Ở board mạch Arduino USB này, chúng ta đã thấy có sự xuất hiện của cồng USB Type B, như vậy, nguồn điện nuôi Arduino không phải lúc nào cũng là 12V (thường thường là 12V), vì khi gắn cổng USB Type B ta lại có thể 5V, như vậy nếu đi qua con LM7805 thì sẽ không đủ điện nuôi cho con ATmega328. Điều đó khiến những nhà phát triển phần cứng Arduino phải thích nghi với việc thay đổi header ext or usb mỗi khi thay đổi từ lúc nạp chương trình sang dùng nguồn ngoài. KHOA ĐIỆN – TỰ ĐỘNG HÓA 12
  16. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2.1.3. Arduino Extreme (2006) Ở phiên bản này, chúng ta đã có thêm đèn RX, TX ở 2 chân TX và RX của Arduino. Các linh kiện trên Arduino phần lớn được thay thế bằng linh kiện dán Ngoài ra, các chân header male đã được thay thế với chân header female. Arduino Extreme version 1 Cũng trong năm đó, trang arduino.cc cũng chính thức được ra đời. Arduino Extreme version 2 ra đời, các dây nối giữa các phần trong mạch cũng được làm "âm" đất. đã cho thay thế phần lớn điện trở, tụ điện trở thành những linh kiện dán, đẹp hơn, gọn hơn và hoạt động ổn định hơn nữa. Việc tích hợp bóng đèn LED vốn dùng để chiếu sáng và đặt vào mạch Arduino để giúp người dùng biết máy tính đã kết nối được với mạch Arduino và quá trình nạp chương trình có hoạt động được hay không. Arduino Extreme version 2 KHOA ĐIỆN – TỰ ĐỘNG HÓA 13
  17. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2.1.4. Arduino NG (Nuova Generazione) (2006) Arduino NG Ở phiên bàn này, Arduino NG đã thay thế chip FT232BM (chuẩn cũ USB to TTL) bằng chíp FT232RL - FTDI ( chuẩn mới USB to Serial), điều đó làm cho thiết kế giao diện phần cứng của Arduino trong thật sự rất tuyệt vời. Trong board này, họ đã gắn thêm con LED màu xanh tại chân số 13. Đèn LED này không những giúp ta debug được truyền dữ liệu SPI mà còn có "một công cụ" kiểm thử mạch (vì khi được xuất bán, Arduino NG đã được upload chương trình Blink). Ta chỉ cần gắn điện vào cổng USB hoặc nguồn ngoài là có thể kiểm thử được mạch NG. Arduino NG Rev.C KHOA ĐIỆN – TỰ ĐỘNG HÓA 14
  18. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Vi điều khiển ATmega168 kể từ phiên bản Arduino NG Rev.C đã được thay thế cho ATmega8 ở các phiên bản trước đó và có thể xem là phiên bản đệm tương tự Arduino USB v2. 1.2.1.5. Arduino Diecimila (Diecimila = 1 vạn) (2007) Arduino Diecimila Thay đổi chính trong phiên bản này đó là việc đưa vào chức năng "tự động reset" bằng máy tính khi upload chương trình, nghĩa là lúc bấy giờ chúng ta đã có thể lập trình Arduino như thời điểm hiện tại (gắn cáp USB vào máy tính, viết chương trình, sau đó tải chương trình lên và tận hưởng thành quả). Với việc cải tiến nút reset cũng đã khiến những nhà lập trình thiết kế lại các chân nguồn, và chân digital pin, cung cấp cho họ nhiều khả năng tùy biến hơn. Ví dụ: thêm chân AREF, VIN, RESET, Trong phiên bản này, Arduino đã sử dụng một mạch "dropout voltage regulator" (khi điện áp đổi thì điện áp so sánh ở Analog IN vẫn không bị nhiễu), đó là một dự kết hợp hoàn hảo chúng ta không cần phải sử dụng tụ 103, 104 để lọc nhiễu cho các chân Analog nữa. Các chân nguồn 3.3V, 5V, GND, Vin đã được điều chỉnh lại và thực sự nó rất ổn nên đến tận bây giờ chúng ta vẫn dùng thiết kế đó và thống nhất đến bây giờ (với các mạch phát triển khác từ bên thứ 3). Ngoài ra, về vấn đề nguồn, chúng ta đã có một cầu KHOA ĐIỆN – TỰ ĐỘNG HÓA 15
  19. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO chì dán (có thể sửa được). Nó giúp mạch được bảo vệ trước sự nguy hiểm của sự sơ xẩy đoản mạch, đó là một sự thích nghi trước những sự hỏng hóc qua cổng USB. 1.2.1.6. Arduino Duemilanove (Duemilanove = 2009) (2008 - 2009) Arduino Duemilanove Mạch Arduino Duemilanove đã có khả tự động nhận biết mỗi khi sử dụng nguồn tử cổng USB hay nguồn ngoài (không cần phải thay đổi jumper nữa). Ngoài ra, trong phiên bản này, còn bổ sung một đường chì nhỏ được nối tắt nhằm giúp cho có thể hủy chức năng auto-reset (tự động reset khi upload chương trình). 1.2.1.7. Arduino UNO (UNO = 1) 2010 - đến nay Cái tên UNO nghĩa là "một" trong tiếng Ý, nó được đặt tên như vậy thì lúc này Arduino IDE cũng đã gần chạm đến mốc 1.0. Nghĩa là, họ muốn nói rằng, UNO sẽ là mạch tham khảo chính được dùng trong việc hướng dẫn Arduino cho người mới học. Họ mất 5 năm để định hình một thứ mạch lập trình trở thành một thứ kỳ diệu trong giới DIY (Do it yourself – tự tay làm lấy) và hơn thế nữa, giới nghiên cứu khoa học. 5 năm đủ để biến một bản mạch thô sơ, trở thành một thứ mạch "tuyệt đẹp" và "đa năng" như hiện tại. KHOA ĐIỆN – TỰ ĐỘNG HÓA 16
  20. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Arduino UNO – chip chân cắm Ở mạch này, ngoài việc thay đổi và cách đặt tên cho dễ xác định các chân I/O, Arduino UNO còn thay con chip FT232RL - FTDI (chuẩn USB to Serial) bằng con chip ATMega8U2 (chuẩn Serial TTL Converter) nhưng vẫn giữ được pinout cũ của mạch trước đó. Điều đó làm cho những mạch kế thừa, các dòng phụ trợ cho Arduino USB không bị lỗi thời và dễ hòa nhập với nhau. Arduino UNO SMD – chip dán Từ phiên bản Arduino UNO này, Arduino USB đã chính thức phân nhánh ra thành 2 nhánh con, đó là Arduino Ethernet và Arduino Leonardo nhằm tối ưu hóa cho các dự án sử dụng Internet (Arduino Ethernet - cái này không phải là shield Ethernet cho Arduino mà là một board Arduino tích hợp Internet trong một luôn). KHOA ĐIỆN – TỰ ĐỘNG HÓA 17
  21. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Arduino Ethernet Ở các phiên bản Arduino Leonardo, chúng ta có thể được sử dụng như chuột và bàn phím. Arduino Leonardo Cũng từ phiên bản này, Arduino Leonardo lại phân nhánh ra 2 phiên bản nhỏ hơn là Arduino Micro và Arduino Yún. KHOA ĐIỆN – TỰ ĐỘNG HÓA 18
  22. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Arduino Micro Arduino Yún 1.2.1.8. Những dòng Arduino khác Ngoài dòng Arduino USB kinh điểm trên, chúng ta còn có những dòng Arduino khác có thể được liệt kê bằng hình ảnh bên dưới. Mỗi dòng lại có những điểm mạnh và điểm yếu riêng, tuy nhiên, đều là sự sáng tạo của những con người sáng tạo nên mạch Arduino. Nhờ những sáng tạo này, họ đã tạo nên một hệ sinh thái vô cùng lớn với Arduino. Chỉ cần một mạch Arduino Mega, bạn đã có thể tự xây dựng cho mình những cổ máy sáng tạo như máy in 3d, máy khắc laser, tất cả đều là nguồn mở “open source” và bạn có thể tự làm cho mình một cái ngay tại nhà. Hay là, với Arduino Pro mini, những dự án mạng cảm biến chưa bao giờ dễ như thế, hoặc là những dự án mini robot, KHOA ĐIỆN – TỰ ĐỘNG HÓA 19
  23. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO KHOA ĐIỆN – TỰ ĐỘNG HÓA 20
  24. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Arduino MEGA 1.2.2.1. Arduino Mega đầu tiên (2009 - 2010) Arduino MEGA có rất nhiều chân I/O so với dòng Arduino UNO (54 digital I/O và 16 analog I/O), đồng thời bộ nhớ flash của MEGA rất lớn, gấp 4 lần so với UNO (128kb) với vi điều khiển ATmega1280. Rõ ràng, những dự án cần điều khiển nhiều loại động cơ và xử lý nhiều luồng dữ liệu song song (3 timer), nhiều ngắt hơn (6 cổng interrupt), có thể được phát triển dễ dàng với Arduino MEGA, chẳng hạn như: máy in 3d, quadcopter, Các chân digital từ 0 -> 13, analog từ 0 -> 5 và các chân nguồn được thiết kế tương tự Arduino UNO. Để có thể thêm được nhiều vùng nhớ hơn, thêm được nhiều chân I/O hơn, nhà phát triển đã mạnh dạng thay đổi con vi điều khiển ATmega1280. Cách thiết kế Arduino MEGA tương tự như mạch Arduino UNO nối dài. Arduino MEGA 1280 Một năm sau đó, với những ý tưởng lớn hơn, hay hơn, nhưng cần phải có một dung lượng flash lớn hơn Vì vậy, họ đã thay con ATmega1280 (128kb) bằng con ATmega2560 (256kb) và Arduino MEGA 2560 ra đời Arduino MEGA 2560 KHOA ĐIỆN – TỰ ĐỘNG HÓA 21
  25. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2.2.2. Arduino MEGA ADK (Android compatible) (2011) Arduino MEGA ADK giúp bạn có thể giao tiếp với các thiết bị Android thông qua cổng sạc (USB micro) của các thiết bị Android. Ở phiên bản này, Arduino MEGA có thể giao tiếp được với điện thoại Android thông qua cổng micro usb (cổng sạc) của Android (>=4.0) Arduino MEGA ADK 1.2.2.3. Arduino DUE (2012) Arduino DUE Arduino DUE là phiên bản đầu tiên sử dụng một vi điều khiển 32 bit thay vì con vi điều khiển 8 bit ATmega2560 trước đây. Nó có thể tính toán nhanh hơn 4 lần (nếu so sánh với mạch 8 bit cùng xung nhịp). Xung nhịp của dòng sản phẩm này cũng cao hơn (84MHz). KHOA ĐIỆN – TỰ ĐỘNG HÓA 22
  26. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.2.2.4. Arduino Yún (Super mini computer) (2013) Arduino Yún Arduino Yún thực sự là một "super mini computer" vì nó cực kì nhỏ chạy hệ điều hành linux (bản mod openwrt) và nó có sẵn Wifi, và đó chính là vì sao Intel đầu tư mạnh vào Arduino và cho ra đời board mạch phát triển IoT Development Kit (códùng ngôn ngữ Arduino để lập trình). 1.3. Cài đặt IDE, driver cho Arduino Vào trang chủ của Arduino Vào trang chủ của Arduino: KHOA ĐIỆN – TỰ ĐỘNG HÓA 23
  27. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Tải chương trình cài đặt  Nhấn vào mục Software, chọn Download  Chọn phiên bản Hệ điều hành tùy thuộc vào máy tính cần cài đặt: Ví dụ hệ điều hành là Windows. Tại đây có 2 tùy chọn cho hệ điều hành Windows là Windows installer và Windows zip file for non admin install. Tùy chọn thứ nhất dùng cho người là admin của máy, tùy chọn thứ 2 cho người không phải admin của máy. Thông thường đa số chọn tùy chọn thứ nhất, tức Windows installer.  Download phần mềm: Arduino có đưa ra 2 lựa chọn, bao gồm chỉ download về (just download) và download về cùng quyên góp (contribute and download). Arduino mong muốn người dùng nếu có điều kiện hãy quyên góp ủng hộ hãng, mức quyên góp thấp nhất là 3USD. KHOA ĐIỆN – TỰ ĐỘNG HÓA 24
  28. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Cài đặt trên máy tính Phiên bản được viết trong giáo trình này là phiên bản IDE 1.8.1.3. Hiện tại, đây là phiên bản mới nhất của phần mềm IDE. Sau này có thể sẽ có những phiên bản kế tiếp, tuy nhiên về cơ bản thì cách cài đặt giống nhau.  Bấm vào file tải về để tiến hành cài đặt, chọn “I Agree” để tiếp tục cài đặt chương trình. KHOA ĐIỆN – TỰ ĐỘNG HÓA 25
  29. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Lựa chọn việc cài đặt các phần liên quan được hiện ra và chọn “Next” để tiếp tục quá trình cài đặt.  Phần mềm sẽ yêu cầu bạn chọn vị trí cài đặt và chọn “Install” để tiếp tục quá trình cài đặt. KHOA ĐIỆN – TỰ ĐỘNG HÓA 26
  30. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Quá trình cài đặt đang được thực hiện cài lên máy tính.  Trong quá trình cài đặt 1 số phiên bản sẽ hỏi có cài driver USB cho phần mềm IDE không? Tích chọn vào ô vuông “Always trust software from “Arduino LLC””, sau đó bấm “Install” để cái đặt driver USB. Cần phải cài driver này thì chương trình mới nhận cổng USB của mạch Arduino KHOA ĐIỆN – TỰ ĐỘNG HÓA 27
  31. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Hoàn tất cài đặt: bấm “Close” để hoàn tất cài đặt  Biểu tượng: tại màn hình chính “Desktop” sẽ xuất hiện icon Arduino  Khởi động chương trình: bấm chạy icon Arduino vừa cài đặt để khởi động chương trình KHOA ĐIỆN – TỰ ĐỘNG HÓA 28
  32. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.4. Giới thiệu các loại kit thực hành Arduino Hiện tại trên thị trường, có rất nhiều sản phẩm được đóng gói trọn bộ được trang bị sẵn mạch Arduino và các linh kiện, phụ kiện, cảm biến dùng dành cho người mới bắt đầu học Arduino từ cơ bản đến nâng cao. Một Bộ Arduino Advance Kit bao gồm board mạch chính Arduino Uno R3 và các thành phần Linh kiện điện tử, Module, Cảm biến nâng cao giúp bạn dễ dàng làm quen với các chuẩn giao tiếp: SPI (Mạch RFID RC522), I2C (Mạch thời gian thực DS1307), 1 Wire (Cảm biến độ ẩm nhiệt độ DHT11), bộ kit gồm các thành phần như hình sau: Bộ kit thực hành Arduino 1.5. Ngôn ngữ lập trình cho Arduino KHOA ĐIỆN – TỰ ĐỘNG HÓA 29
  33. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Chương trình Arduino có thể được chia làm 3 phần: cấu trúc (structure), biến số (variable) và hằng số (constant), hàm và thủ tục (function). Phần này sẽ giúp bạn tìm hiểu về 3 phần này qua sự diễn giải các khái niệm và mô tả các hàm thao tác/thủ tục. Cấu trúc (Structure)  setup()  loop() 1.5.1.1. Cấu trúc điều khiển  if  if else  switch / case  for  while  break  continue  return  goto 1.5.1.2. Cú pháp mở rộng  ; (dấu chấm phẩy)  {} (dấu ngoặc nhọn)  // (single line comment)  /* */ (multi-line comment)  #define  #include 1.5.1.3. Toán tử số học  = (phép gán)  + (phép cộng)  - (phép trừ)  * (phép nhân) KHOA ĐIỆN – TỰ ĐỘNG HÓA 30
  34. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  / (phép chia)  % (phép chia lấy dư) 1.5.1.4. Toán tử so sánh  == (so sánh bằng)  != (khác bằng)  > (lớn hơn)  = (lớn hơn hoặc bằng)  <= (bé hơn hoặc bằng) 1.5.1.5. Toán tử logic  && (và)  || (hoặc)  ! (phủ định)  ^ (loại trừ) 1.5.1.6. Phép toán hợp nhất  ++ (cộng thêm 1 đơn vị)  (trừ đi 1 đơn vị)  += (phép rút gọn của phép cộng)  -= (phép rút gọn của phép trừ)  *= (phép rút gọn của phép nhân)  /= (phép rút gọn của phép chia) Biến số (variable) và Hằng số (Constant) 1.5.2.1. Hằng số  HIGH | LOW  INPUT | INPUT_PULLUP | OUTPUT  LED_BUILTIN  true | false  Hằng số nguyên (integer constants) KHOA ĐIỆN – TỰ ĐỘNG HÓA 31
  35. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Hằng số thực (floating point constants) 1.5.2.2. Kiểu dữ liệu  void  boolean  char  unsigned char  byte  int  unsigned int  word  long  unsigned long  short  float  double  array  string (chuỗi kí tự biểu diễn bằng array)  String (object) 1.5.2.3. Chuyển đổi kiểu dữ liệu  char()  byte()  int()  word()  long()  float() 1.5.2.4. Phạm vi của biến và phân loại  static - biến tĩnh  const - biến hằng  volatile KHOA ĐIỆN – TỰ ĐỘNG HÓA 32
  36. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.5.2.5. Hàm hỗ trợ  sizeof() Hàm và Thủ tục (Function) 1.5.3.1. Nhập xuất Digital (Digital I/O)  pinMode()  digitalWrite()  digitalRead() 1.5.3.2. Nhập xuất Analog (Analog I/O)  analogReference()  analogRead()  analogWrite() - PWM - PPM 1.5.3.3. Hàm thời gian  millis()  micros()  delay()  delayMicroseconds() 1.5.3.4. Hàm toán học  min()  max()  abs()  map()  pow()  sqrt()  sq()  isnan()  constrain()  exp(x) KHOA ĐIỆN – TỰ ĐỘNG HÓA 33
  37. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  frexp(x, int *exp)  ldexp(x, int exp)  log(x)  log10(x)  modf(x, *i)  ceil(x)  floor(x)  atoi(a[]) 1.5.3.5. Hàm lượng giác  cos()  sin()  tan()  asin(x)  acos(x)  atan(x)  atan2(x, y)  cosh(x)  sinh(x)  tanh(x) 1.5.3.6. Sinh số ngẫu nhiên  randomSeed()  random() 1.5.3.7. Nhập xuất nâng cao (Advanced I/O)  tone()  noTone()  shiftOut()  shiftIn()  pulseIn() KHOA ĐIỆN – TỰ ĐỘNG HÓA 34
  38. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.5.3.8. Xử lý chuỗi  isAscii()  isWhitespace()  isAlpha()  isAlphaNumeric()  isControl()  isDigit()  isGraph()  isLowerCase()  isPrintable()  isPunct()  isSpace()  isUpperCase()  isHexadecimalDigit()  tolower()  toupper() 1.5.3.9. Bits và Bytes  lowByte()  highByte()  bitRead()  bitWrite()  bitSet()  bitClear()  bit() 1.5.3.10. Ngắt (interrupt)  attachInterrupt()  detachInterrupt()  interrupts()  noInterrupts() KHOA ĐIỆN – TỰ ĐỘNG HÓA 35
  39. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.5.3.11. Giao tiếp  Serial 1.6. Nạp chương trình cho Arduino Trong phần này, sẽ hướng dẫn nạp chương trình đơn giản (điều khiển đèn LED nhấp nháy theo chu kì 1 giây) cho Arduino Uno R3. Bước 1: Kết nối Arduino UNO R3 vào máy tính Bước 2: Xác định cổng kết nối của Arduino Uno R3 với máy tính Khi Arduino Uno R3 kết nối với máy tính, nó sẽ sử dụng một cổng COM (Communication port - cổng dữ liệu ảo) để máy tính và bo mạch có thể truyền tải dữ liệu qua lại thông qua cổng này. Để tìm được cổng COM đang được sử dụng để máy tính và mạch Arduino UNO R3 giao tiếp với nhau, bạn phải mở chức năng Device Manager của Windows. Bạn mở cửa sổ Run và gõ lệnh “mmc devmgmt.msc”. KHOA ĐIỆN – TỰ ĐỘNG HÓA 36
  40. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Sau đó bấm Enter, cửa sổ Device Manager sẽ hiện lên. KHOA ĐIỆN – TỰ ĐỘNG HÓA 37
  41. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Mở mục Ports (COM & LPT), bạn sẽ thấy cổng COM Arduino Uno R3 đang kết nối Cổng kết nối ở đây là COM3. Thông thường, trong những lần kết nối tiếp theo, Windows sẽ sử dụng lại cổng COM3 để kết nối nên bạn không cần thực hiện thêm thao tác tìm cổng COM này nữa. Bước 3: Khởi động Arduino IDE Bước 4: Cấu hình phiên làm việc cho Arduino IDE Khi Arduino Uno R3 kết nối với máy tính, nó sẽ sử dụng một cổng COM (Communication port - cổng dữ liệu ảo) để máy tính và bo mạch có thể truyền tải dữ liệu qua lại thông qua cổng này. Vào menu Tools -> Board -> chọn Arduino Uno KHOA ĐIỆN – TỰ ĐỘNG HÓA 38
  42. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Vào menu Tools -> Serial Port -> chọn cổng Arduino đang kết nối với máy tính. Ở máy của mình là COM3. Xác nhận cổng COM của Arduino IDE ở góc dưới cùng bên phải cửa sổ làm việc KHOA ĐIỆN – TỰ ĐỘNG HÓA 39
  43. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Vào menu Tools -> Programmer -> chọn AVR ISP Bước 5: Nạp mã nguồn chương trình mẫu Nạp một chương trình mẫu bằng cách vào menu File -> Examples -> 01.Basics - > chọn Blink. KHOA ĐIỆN – TỰ ĐỘNG HÓA 40
  44. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Bạn sẽ thấy Arduino IDE mở một cửa sổ mới chứa mã nguồn Blink. Mã này có chức năng là điều khiển đèn LED màu cam trên mạch Arduino Uno R3 nhấp nháy với chu kì 1 giây. Bấm tổ hợp phím Ctrl + U để tải chương trình lên mạch Arduino Uno R3. Bạn sẽ thấy IDE xác nhận đã lập trình thành công như hình dưới. KHOA ĐIỆN – TỰ ĐỘNG HÓA 41
  45. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO 1.7. Sử dụng thư viện lập trình Arduino Các thư viện Ardunio là những chương trình được sử dụng thường xuyên, có sẵn để giúp bạn tìm hiểu về số lượng các sketch có giới hạn của IDE. Những code add-on này có thể được cài đặt trong IDE hoặc tải xuống dưới dạng thư mục zip trên Arduino.cc hoặc trang web khác. Thế mạnh của Arduino nằm ở sự hỗ trợ mạnh mẽ của cộng đồng, đặc biệt là vô số các thư viện được viết ra để chạy trên Arduino. Trong quá trình làm việc với Arduino, bạn sẽ thường xuyên phải cài đặt thêm các thư viện để làm việc được với các phần cứng mà chưa được hỗ trợ sẵn bởi các thư viện mặc định có trong Arduino IDE. Thư viện cho Arduino thường chứa file nguồn là “.cpp” và file “.h”, và thư mục examples để chứa các đoạn code ví dụ mô tả cách sử dụng thư viện đó, thường có đuôi “.pde” hay “.ino”. Trong một số trường hợp có thể có các file khác. 1.8. Khởi tạo Project, thêm thư viện lập trình  Cách 1: Dùng Libraries Manager Đây là cách đơn giản và tiện dụng nhất. Bạn vào Sketch > Include Libraries > Manage Libraries để mở cửa sổ Library Manager. Bạn gõ tên thư viện muốn cài đặt và chọn Install. KHOA ĐIỆN – TỰ ĐỘNG HÓA 42
  46. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO Sau khi thư viện được cài đặt, bạn có thể thấy thư viện được xuất hiện trong danh sách các thư viện của Arduino. Bạn có thể mở file code mẫu của thư viện để tham khảo cách sử dụng từ menu FIle > Examples > Tên thư viện KHOA ĐIỆN – TỰ ĐỘNG HÓA 43
  47. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Cách 2: Cài đặt từ file .zip Rất nhiều thư viện cho Arduino được chia sẻ ở trang web “github.com”. Đây là trang web chứa các dự án mã nguồn mở cực kỳ phổ biến và bạn dễ dàng download toàn bộ file về dưới dạng “.zip”. Ví dụ thư viện làm việc với led 7 đoạn dùng IC TM1637 được chia sẻ ở link “ ”. Khi bạn vào trang này, bạn có thể click vào nút Clone or download và chọn Download ZIP như hình dưới: Sau khi tải file zip của thư viện về, bạn vào Sketch > Include Library > Add .ZIP Library sau đó chọn file vừa tải về để cài đặt. KHOA ĐIỆN – TỰ ĐỘNG HÓA 44
  48. CHƯƠNG 1: TỔNG QUAN VỀ ARDUINO  Cách 3: Cài đặt thủ công Từ file zip bạn download về, đầu tiên giải nén ra thành 1 folder, sau đó copy thư mục đó vào “My Documents\Arduino\libraries\”. Sau đó tắt và mở lại Arduino IDE để cập nhật thư viện. Trong một số trường hợp, trong My Documents không có thư mục Arduino, tại Arduino IDE, các bạn chọn File > Preferences > Settings tại mục Sketchbook location và copy thư mục đã giải nén vào đường dẫn đó. KHOA ĐIỆN – TỰ ĐỘNG HÓA 45
  49. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1. Lập trình - mô phỏng ứng dụng I/O Điều khiển LED đơn Chúng ta sẽ tìm hiểu cách để điều khiển một con đèn led nhấp nháy. 2.1.1.1. Chuẩn bị phần cứng Thiết bị, linh kiện Số lượng Board Arduino 01 Testboard 01 Dây cắm board 02 Led 5mm 01 Điện trở 220 Ohm 01 2.1.1.2. Lắp mạch 2.1.1.3. Mã lập trình Trước tiên, cứ mỗi khi dùng một con LED, chúng ta phải khai báo chân Digital mà ta sử dụng cho con đèn LED. KHOA ĐIỆN – TỰ ĐỘNG HÓA 46
  50. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Trong ví dụ ngày hôm nay, chúng ta sử dụng chân LED là chân digital 13. Nên đoạn code cần nằm trong void setup(): Vd: pinMode(13,OUTPUT); Để bật một con đèn LED, bạn phải digitalWrite HIGH cho chân số 13 (chân Digtal được kết nối với con LED). Đoạn code này nằm trong void loop() Vd: digitalWrite(13,HIGH); Dòng lệnh trên sẽ cấp một điện thế là 5V vào chân số Digital 13. Điện thế sẽ đi qua điện trở 220ohm rồi đến đèn LED (sẽ làm nó sáng mà không bị cháy, ngoài ra bạn có thể các loại điện trở khác đèn LED tắt. Và để thấy được trạng thái bật và tắt của đèn LED bạn phải dừng chương trình trong một khoảng thời gian đủ lâu để mắt cảm nhận được (chỉ cần dừng chương trình trong vài miligiây là thấy được rồi). Vì vậy, hàm delay được tạo ra để làm việc này (Dừng hẳn chương trình bao nhiêu mili giây). Đoạn code lập trình 1. /* 2. Blink - Nhấp nháy 3. Đoạn code làm nhấp nháy một đèn LED cho trước 4. * 5. // chân digital 13 cần được kết nối với đèn LED 6. // và chân digital 13 này sẽ được đặt tên là 'led'. Biến 'led' này có kiểu dữ liệu là int và có giá trị là 13 7. int led = 13; 8. // Hàm setup chạy một lần duy nhất khi khởi động chương trình 9. void setup() { 10. // đặt 'led' là OUTPUT 11. pinMode(led, OUTPUT); 12. } 13. // Hàm loop chạy mãi mãi sau khi kết thúc hàm setup() 14. void loop() { 15. digitalWrite(led, HIGH); // bật đèn led sáng 16. delay(1000); // dừng chương trình trong 1 giây => thấy đèn sáng 1 giây 17. digitalWrite(led, LOW); // tắt đèn led 18. delay(1000); // dừng chương trình trong 1 giây => thấy đèn tắt 1 giây 19. } 20. KHOA ĐIỆN – TỰ ĐỘNG HÓA 47
  51. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.1.4. Bài tập ứng dụng  Điều khiển Led chớp tắt:  Điều khiển 8 Led:  Điều khiển đèn Led bằng nút nhấn: Điều khiển LED 7 đoạn Để điều khiển nhiều hơn 1 con LED 7 đoạn thì ta không thể sử dụng trực tiếp trên 1 board Arduino vì không đủ chân cho các con LED 7 đoạn thứ 2, 3, Trong phạm vi bài viết này, tớ có tham khảo một số hình ảnh, thông tin từ 2 bài viết kia để các bạn dễ dàng nắm bắt. Đồng thời, trước khi bắt đầu, bạn bắt buộc phải biết về “shiftOut”. Phần này chúng ta sẽ tìm hiểu cách điều khiển 1 đèn LED 7 đoạn qua 1 IC HC595 được điều khiển bởi Arduino. Sau đó sẽ là 2 IC HC 595, và cứ như thế sẽ làm được nhiều LED 7 đoạn hơn. Nguyên lý căn bản của LED 7 đoạn đó là cấp nguồn là nó sáng. Để nó sáng theo ý mình thì bạn cần phải nói ngôn ngữ Arduino cho mạch Arduino Uno hiểu, từ đó Arduino Uno sẽ điều khiển IC HC 595 (chỉ tốn 3 chân điều khiển), từ đó IC HC595 sẽ cấp nguồn cho các chân LED 7 đoạn theo yêu cầu của mình! 2.1.2.1. Chuẩn bị phần cứng Thiết bị, linh kiện Số lượng Board Arduino 01 Testboard 01 Dây cắm board Led 7 đoạn (chung cực 02 dương) IC HC595 (dành cho việc 02 ShiftOut) Tụ điện 1uf (từ 6,3v trở lên) 01 Điện trở 560 Ohm (hoặc 220 01 ohm hoặc 1kohm) KHOA ĐIỆN – TỰ ĐỘNG HÓA 48
  52. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.2.2. Giới thiệu led 7 đoạn LED 7 đoạn có 2 loại:  Chung cực dương (Anode chung): Mỗi đèn LED có 2 chân (1 dương 1 âm). Ở loại LED 7 đoạn này tất cả cực dương sẽ được nối chung cực dương. Để làm các đèn LED trong LED 7 đoạn sáng thì bạn chỉ cần cấp cực âm vào các chân của đèn. Với loại LED 7 đoạn này bạn chỉ cần 1 điện trở là đủ.  Chung cực âm (Cathode chung): Tương tự nhưng ngược lại và bạn cần đến 8 điện trở cho các chân dương của LED. KHOA ĐIỆN – TỰ ĐỘNG HÓA 49
  53. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.2.3. Lắp mạch Sơ đồ lắp mạch KHOA ĐIỆN – TỰ ĐỘNG HÓA 50
  54. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Sơ đồ mô phỏng trên Protues KHOA ĐIỆN – TỰ ĐỘNG HÓA 51
  55. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.2.4. Mã lập trình Để điều khiển được LED 7 đoạn qua IC HC 595, chúng ta phải làm quen với một kỹ thuật, được gọi là shiftOut. ShiftOut là việc gửi tín hiệu cho 1 IC có hỗ trợ shiftOut (ví dụ IC HC595), cứ mỗi lần gửi nó gửi 1 byte (không hơn không kém), mỗi 1 bit (có tổng cộng 8 bit trong 1 byte) sẽ quản lý giá trị điện tại chân tín hiệu của HC 595 (các chân có tên là Q0-Q7). 1. /* 2. shiftOut ra 1 Module LED 7 đoạn đơn 3. */ 4. //chân ST_CP của 74HC595 5. int latchPin = 8; 6. //chân SH_CP của 74HC595 7. int clockPin = 12; 8. //Chân DS của 74HC595 9. int dataPin = 11; 10. // Ta sẽ xây dựng mảng hằng số với các giá trị cho trước 11. // Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP) 12. // Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0 13. // thì các đoạn của LED 7 đoạn sẽ sáng 14. // với các bit 1 thì đoạn ấy sẽ tắt 15. //mảng có 10 số (từ 0-9) và 16. const int Seg[10] = { 17. 0b11000000,//0 - các thanh từ a-f sáng 18. 0b11111001,//1 - chỉ có 2 thanh b,c sáng 19. 0b10100100,//2 20. 0b10110000,//3 21. 0b10011001,//4 22. 0b10010010,//5 23. 0b10000011,//6 24. 0b11111000,//7 25. 0b10000000,//8 26. 0b10010000,//9 27. }; 28. void setup() { 29. //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT 30. pinMode(latchPin, OUTPUT); 31. pinMode(clockPin, OUTPUT); 32. pinMode(dataPin, OUTPUT); 33. } 34. void loop() { 35. static int point = 0; 36. //shiftout - start 37. digitalWrite(latchPin, LOW); 38. //Xuất bảng ký tự ra cho Module LED 39. shiftOut(dataPin, clockPin, MSBFIRST, Seg[point]); 40. digitalWrite(latchPin, HIGH); 41. //shiftout - end 42. point = (point + 1) % 10; // Vòng tuần hoàn từ 0 9 43. delay(500);//Đợi 0.5 s cho mỗi lần tăng số 44. } 45. KHOA ĐIỆN – TỰ ĐỘNG HÓA 52
  56. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.2.5. Bài tập ứng dụng  2 Module LED 7 đoạn đơn và nhiều hơn. Kể từ con IC HC595 thứ 2 trở đi, bạn sẽ lắp như thế này. Con thứ 2 thì mắc vào con thứ 1, con thứ 3 thì mắc vào con thứ 2, Sau đó xem phần lập trình để xây dựng bảng số. Viết một hàm đơn giản để sau này bạn lắp bao nhiêu thì tùy ý. Con sau sẽ lắp trước con liền kề nó. Lắp LED 7 đoạn thứ 2 và IC HC595 như trên. Lắp mạch IC HC595 thứ 1 và thứ 2 theo sơ đồ sau (con thứ 3 trở đi thì đấu dây tương tự): Sơ đồ lắp mạch KHOA ĐIỆN – TỰ ĐỘNG HÓA 53
  57. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Sơ đồ mô phỏng trên Protues KHOA ĐIỆN – TỰ ĐỘNG HÓA 54
  58. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 1. /* 2. shiftOut ra 1 Module LED 7 đoạn đơn 3. */ 4. //chân ST_CP của 74HC595 5. int latchPin = 8; 6. //chân SH_CP của 74HC595 7. int clockPin = 12; 8. //Chân DS của 74HC595 9. int dataPin = 11; 10. 11. // Ta sẽ xây dựng mảng hằng số với các giá trị cho trước 12. // Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP) 13. // Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0 14. // thì các đoạn của LED 7 đoạn sẽ sáng 15. // với các bit 1 thì đoạn ấy sẽ tắt 16. 17. //mảng có 10 số (từ 0-9) và 18. const byte Seg[10] = { 19. 0b11000000,//0 - các thanh từ a-f sáng 20. 0b11111001,//1 - chỉ có 2 thanh b,c sáng 21. 0b10100100,//2 22. 0b10110000,//3 23. 0b10011001,//4 24. 0b10010010,//5 25. 0b10000010,//6 26. 0b11111000,//7 27. 0b10000000,//8 28. 0b10010000,//9 29. }; 30. 31. void setup() { 32. //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT 33. pinMode(latchPin, OUTPUT); 34. pinMode(clockPin, OUTPUT); 35. pinMode(dataPin, OUTPUT); 36. } 37. 38. void HienThiLED7doan(unsigned long Giatri, byte SoLed = 2) { 39. 40. byte *array= new byte[SoLed]; 41. for (byte i = 0; i = 0; i ) 48. shiftOut(dataPin, clockPin, MSBFIRST, Seg[array[i]]); 49. 50. digitalWrite(latchPin, HIGH); 51. free(array); 52. } 53. 54. 55. void loop() { 56. static unsigned long point = 0; 57. 58. HienThiLED7doan(point, 2); 59. 60. point = (point + 1) % 100UL; // Vòng tuần hoàn từ 0 99 61. delay(500);//Đợi 0.5 s cho mỗi lần tăng số 62. } 63. KHOA ĐIỆN – TỰ ĐỘNG HÓA 55
  59. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO  Điều khiển nhiều LED 7 đoạn:  Điều khiển Module 4 LED 7 đoạn  Đếm số lần nhấn nút với Led 7 Đoạn: Điều khiển Matrix LED 2.1.3.1. Chuẩn bị phần cứng Thiết bị, linh kiện Số lượng Board Arduino 01 Testboard 02 Dây cắm board Led ma trận 8x8 01 IC 74HC595 02 Điện trở 560 Ohm (hoặc 08 220 ohm hoặc 1kohm) 2.1.3.2. Giới thiệu LED MATRIX (Led ma trận) LED MATRIX 8x8 đơn giản chỉ là 64 con LED được sắp xếp với nhau theo dạng ma trận, thành 8 hàng và 8 cột, tức là 16 chân. Vì mỗi loại LED MATRIX có sơ đồ chân riêng nên các bạn hãy tra cứu datasheet của nó để có thể lắp mạch chính xác. Trong bài viết này sử dụng LED matrix "Row Anode", có nghĩa là các chân điều khiển hàng của ma trận chính là cực dương của LED. KHOA ĐIỆN – TỰ ĐỘNG HÓA 56
  60. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Để LED MATRIX hoạt động, chúng ta chỉ cần cấp dòng điện vào các chân ROWs và nối các chân COLUMNS với GND. 2.1.3.3. Lắp mạch Sơ đồ lắp mạch Để điều khiển LED matrix, mình sử dụng 2 con IC 74HC595, 1 để điều khiển 8 chân row, 1 để điều khiển 8 chân column. Trước mỗi chân row, mình có gắn thêm 1 con trở 560 ohm để hạn dòng cho LED. LED matrix gồm 8 chân row: từ row 0 > row 7; 8 chân column: từ column 0 > column 7. Trong sơ đồ mạch phía trên, 8 chân ở top của LED matrix (từ trái qua phải) gồm: column 0, column 1, row 1, column 7, row 3, column 2, column 4, row 0. 8 chân ở bottom của LED matrix (từ trái qua phải) gồm: row 4, row 6, column 6, column 5, row 7, column 3, row 5, row 2. Ở đây lắp IC 74HC595 control columns nối tiếp theo sau IC 74HC595 control rows, do đó, chân 14 của IC 74HC595 control columns sẽ nối với chân 9 của IC 74HC595 control rows. Chân 11 (CLOCK), 12 (LATCH) của 2 IC nối với nhau, và nối với pin 10,11 của Arduino. Chân 14 của IC 74HC595 control rows sẽ nối với pin 12 của Arduino. Chân số 10 và 16 của 2 IC sẽ nối VCC, chân số 8 và 13 sẽ nối GND. KHOA ĐIỆN – TỰ ĐỘNG HÓA 57
  61. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.3.4. Mã lập trình 1. const int DATA = 12;// pin 12 của Arduino nối với pin DATA của 74HC595 2. const int CLOCK = 10;//pin 10 của Arduino nối với pin CLOCK của 74HC595 3. const int LATCH = 11;//pin 11 của Arduino nối với pin LATCH của 74HC595 4. /* hàng và cột của LED matrix*/ 5. int row[] = {1, 2, 4, 8, 16, 32, 64, 128}; 6. int column[] = {128, 64, 32, 16, 8, 4, 2, 1}; 7. /*biểu diễn các ký tự chữ và số ở dạng HEX*/ 8. unsigned int characterHEX[][8] = { 9. {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x66},//A 10. {0x78,0x64,0x68,0x78,0x64,0x66,0x66,0x7C},//B 11. {0x3C,0x62,0x60,0x60,0x60,0x62,0x62,0x3C},//C 12. {0x78,0x64,0x66,0x66,0x66,0x66,0x64,0x78},//D 13. {0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x7E},//E 14. {0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x60},//F 15. {0x3C,0x62,0x60,0x60,0x66,0x62,0x62,0x3C},//G 16. {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x66},//H 17. {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E},//I 18. {0x7E,0x18,0x18,0x18,0x18,0x18,0x1A,0x0C},//J 19. {0x62,0x64,0x68,0x70,0x70,0x68,0x64,0x62},//K 20. {0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E},//L 21. {0xC3,0xE7,0xDB,0xDB,0xC3,0xC3,0xC3,0xC3},//M 22. {0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46},//N 23. {0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},//O 24. {0x7C,0x62,0x62,0x7C,0x60,0x60,0x60,0x60},//P 25. {0x38,0x64,0x64,0x64,0x64,0x6C,0x64,0x3A},//Q 26. {0x7C,0x62,0x62,0x7C,0x70,0x68,0x64,0x62},//R 27. {0x1C,0x22,0x30,0x18,0x0C,0x46,0x46,0x3C},//S 28. {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18},//T 29. {0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},//U 30. {0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x18},//V 31. {0x81,0x81,0x81,0x81,0x81,0x99,0x99,0x66},//W 32. {0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42},//X 33. {0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x18},//Y 34. {0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E},//Z 35. {0x3C,0x66,0x66,0x6E,0x76,0x66,0x66,0x3C},//0 36. {0x18,0x38,0x58,0x18,0x18,0x18,0x18,0x7E},//1 37. {0x3C,0x66,0x66,0x0C,0x18,0x30,0x7E,0x7E},//2 38. {0x7E,0x0C,0x18,0x3C,0x06,0x06,0x46,0x3C},//3 39. {0x0C,0x18,0x30,0x6C,0x6C,0x7E,0x0C,0x0C},//4 40. {0x7E,0x60,0x60,0x7C,0x06,0x06,0x46,0x3C},//5 41. {0x04,0x08,0x10,0x38,0x6C,0x66,0x66,0x3C},//6 42. {0x7E,0x46,0x0C,0x18,0x18,0x18,0x18,0x18},//7 43. {0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C},//8 44. {0x3C,0x66,0x66,0x36,0x1C,0x08,0x10,0x20},//9 45. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// khoảng trắng 46. {0x00,0x66,0xFF,0xFF,0x7E,0x3C,0x18,0x00}// hình trái tim, kí hiệu là '&' 47. }; 48. /* ký tự đại diện để biểu diễn chữ và số trên matrix*/ 49. char character[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S' ,'T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9',' ','&'}; 50. void setup() 51. { 52. Serial.begin(9600);// Serial với baudrate 9600 53. /* 3 pins DATA, CLOCK, LATCH cần phải để OUTPUT*/ 54. pinMode(DATA,OUTPUT); 55. pinMode(CLOCK,OUTPUT); 56. pinMode(LATCH,OUTPUT); 57. /* in ra cổng Serial "ENTER A STRING"*/ 58. Serial.println("ENTER A STRING"); 59. } 60. /* hàm nhấp nháy chữ*/ 61. /* image là ký tự cần hiển thị, 62. times là số lần nhấp nháy, KHOA ĐIỆN – TỰ ĐỘNG HÓA 58
  62. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 63. on, off là độ dài của hiệu ứng*/ 64. void blinkImage(unsigned int image[],int times,int on,int off) 65. { 66. for(int i=0;i<times;i++) 67. { 68. displayImage(image,on);// hiển thị 69. 70. clearImage(off);// xóa 71. } 72. } 73. /*hàm hiển thị chữ lên LED matrix*/ 74. /* image là ký tự cần hiển thị, 75. duration là độ dài của hiệu ứng*/ 76. void displayImage(unsigned int image[],int duration) 77. { 78. for(int hold=0;hold<duration;hold++) 79. { 80. for(int a=0;a<8;a++) 81. { 82. digitalWrite(LATCH, LOW); 83. shiftOut(DATA, CLOCK, MSBFIRST,~image[a]);//column 84. shiftOut(DATA, CLOCK, MSBFIRST,row[a]);//row 85. digitalWrite(LATCH, HIGH); 86. delay(1); 87. } 88. } 89. } 90. /* hàm clear LED matrix*/ 91. /* duration là độ dài của hiệu ứng clear*/ 92. void clearImage(int duration) 93. { 94. for(int hold=0;hold<duration;hold++) 95. { 96. for(int a=0;a<8;a++) 97. { 98. digitalWrite(LATCH, LOW); 99. shiftOut(DATA, CLOCK, MSBFIRST,B11111111);//column 100. shiftOut(DATA, CLOCK, MSBFIRST,row[a]);//row 101. digitalWrite(LATCH, HIGH); 102. delay(1); 103. } 104. } 105. } 106. /*hàm scroll image sang trái*/ 107. /* image là ký tự cần hiển thị*/ 108. void scrollImage(unsigned int image[]) 109. { 110. int shift, hold, a;//biến shift dùng để lưu số bit cần shiftOut 111. //biến hold dùng để điều chỉnh độ dài của hiệu ứng 112. //biến a dùng để lưu column và row hiện tại 113. for(shift = 0; shift < 9; shift++) 114. { 115. for(hold = 0; hold < 30; hold++) 116. { 117. for(a = 0; a < 8; a++) 118. { 119. digitalWrite(LATCH, 0); 120. /* dịch ký tự sang trái*/ 121. shiftOut(DATA,CLOCK,MSBFIRST,~(image[a]<<shift));//column 122. shiftOut(DATA,CLOCK,MSBFIRST,row[a]);//row 123. digitalWrite(LATCH, 1); 124. delay(1); 125. } 126. } 127. } 128. 129. } 130. void loop() KHOA ĐIỆN – TỰ ĐỘNG HÓA 59
  63. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 131. { 132. String string;// khai báo biến String object 133. /* đọc dữ liệu từ cổng Serial */ 134. while(Serial.available() > 0) 135. { 136. char ch = Serial.read(); 137. string += ch;// lưu ký tự vừa nhận được vào biến string 138. delay(5);// delay để đợi ký tự tiếp theo, KHÔNG THỂ THIẾU 139. } 140. Serial.println(string);// in string ra Serial monitor 141. /* hiển thị ra LED matrix */ 142. while(Serial.available() == 0) 143. { 144. /*so sánh từng phần tử của string với 145. các ký tự đã được lưu trong mảng character[]. 146. Nếu ký tự xuất hiện trong string tồn tại 147. trong mảng character[] thì hiển thị ra LED matrix, 148. nếu không tồn tại thì báo "invalid character"*/ 149. for(int k = 0;k 0) 169. break; 170. } 171. delay(300); 172. } 173. } 2.1.3.5. Giải thích mạch //hàng và cột của LED matrix int row[] = {1, 2, 4, 8, 16, 32, 64, 128}; int column[] = {128, 64, 32, 16, 8, 4, 2, 1}; => dùng để kiểm soát hàng và cột của matrix. 1 = B00000001 => hàng 0 2 = B00000010 => hàng 1 4 = B00000100 => hàng 2 128 = B10000000 => hàng 7 KHOA ĐIỆN – TỰ ĐỘNG HÓA 60
  64. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO tương tự đối với cột. - Tạo ký tự. Để biểu diễn chữ 'I' ra LED matrix, ta sẽ tạo 1 mảng sau: I[] = { B01111110, B00011000, B00011000, B00011000, B00011000, B00011000, B00011000, B01111110}; những vị trí có số 1 sẽ là những điểm sẽ sáng trên LED matrix. Để ngắn gọn, ta có thể chuyển mảng trên về dạng số HEX: B0111 1110 => 0111 = 7 (DEC) = 7 (HEX); 1110 = 14 (DEC) = E (HEX); ==> B01111110 = 0x7E; tương tự ta sẽ được: I[] = {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E}; ==> trong đoạn code trên chỉ mới tạo 26 chữ cái và 10 chữ số, các bạn có thể chỉnh sửa cho nó đẹp hơn và sáng tạo ra những hình ảnh khác nhé! - hàm displayImage() /*hàm hiển thị chữ lên LED matrix*/ /* image là ký tự cần hiển thị, duration là độ dài của hiệu ứng*/ void displayImage(unsigned int image[],int duration) { for(int hold=0;hold<duration;hold++) { for(int a=0;a<8;a++) { digitalWrite(LATCH, LOW); shiftOut(DATA, CLOCK, MSBFIRST,~image[a]);//column shiftOut(DATA, CLOCK, MSBFIRST,row[a]);//row digitalWrite(LATCH, HIGH); KHOA ĐIỆN – TỰ ĐỘNG HÓA 61
  65. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO delay(1); } } } => Tại 1 thời điểm, chúng ta chỉ có thể điều khiển các LEDs của 1 row, do đó, trong thực tế, hình ảnh ta thấy được trên LED matrix là do "hiện tượng lưu ảnh" của mắt, khi chúng ta quét các hàng của matrix với tốc độ rất nhanh. Để làm được việc này, sau mỗi lần shiftOut, ta chỉ delay 1/1000 giây, và lặp lại "duration" lần sau khi đã shiftOut hết 8 bit. Giá trị của biến duration càng lớn thì thời gian của hiệu ứng càng dài. ==> Ta sử dụng bitwise NOT (~) khi shiftOut columns, vì để bật 1 LED, row cần được nối VCC (set 1), column cần được nối GND (set 0). ==> Nếu sử dụng LSBFIRST, ta có thể lật ngược ký tự so với ban đầu. /*hàm scroll image sang trái*/ /* image là ký tự cần hiển thị*/ void scrollImage(unsigned int image[]) { int shift, hold, a;//biến shift dùng để lưu số bit cần shiftOut //biến hold dùng để điều chỉnh độ dài của hiệu ứng //biến a dùng để lưu column và row hiện tại for(shift = 0; shift < 9; shift++) { for(hold = 0; hold < 30; hold++) { for(a = 0; a < 8; a++) { digitalWrite(LATCH, 0); /* dịch ký tự sang trái*/ shiftOut(DATA,CLOCK,MSBFIRST,~(image[a]<<shift));//column shiftOut(DATA,CLOCK,MSBFIRST,row[a]);//row digitalWrite(LATCH, 1); delay(1); KHOA ĐIỆN – TỰ ĐỘNG HÓA 62
  66. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO } } } } ==> Chúng ta sử dụng " >" để dịch ký tự sang trái và phải. Khi dịch phải, cần đặt biến ở dạng unsigned để tránh tình trạng "sign extension". Các bạn có thể tham khảo thêm ở BIT MATH - Các phép toán thao tác trên bit. ==> Biến shift sẽ lưu giữ số bit cần dịch trái (phải). 2.1.3.6. Bài tập ứng dụng  Hiển thị hình ảnh với LED MATRIX 8x8:  Module LED L10 với Arduino Giao tiếp LCD, phím nhấn và Matrix phím nhấn 2.1.4.1. Chuẩn bị phần cứng Thiết bị, linh kiện Số lượng Board Arduino 01 Testboard 02 Dây cắm board Module LCD 16x02 01 Biến trở (1k, 4.7K, 10K ) 01 Module ma trận phím 4x4 01 2.1.4.2. Giao tiếp LCD 2.1.4.2.1. Sơ lược về LCD và thư viện điều khiển LCD của Arduino  Thư viện điều khiển LCD của Arduino Thư viện LiquidCrystal là thư viện điều khiển LCD trên Arduino, nó được xây dựng để cho các bạn có thể lập trình điều khiển các module LCD ô vuông một cách nhanh chóng mà không cần phải lập trình nhiều. Thư viện này được viết để phù hợp với KHOA ĐIỆN – TỰ ĐỘNG HÓA 63
  67. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO con IC HD44780 (con điều khiển module LCD), tuy nhiên, trên thị trường mình toàn thấy các con LCD của Trung Quốc và thư viện này vẫn hoạt động tốt. Nghĩa là, bạn chỉ cần mua module LCD về và gắn vào Arduino, nạp code là chạy được, không cần quan tâm đến IC điều khiển LCD.  LCD pinout - sơ đồ chân của LCD 1. VSS: tương đương với GND - cực âm 2. VDD: tương đương với VCC - cực dương (5V) 3. Constrast Voltage (Vo): điều khiển độ sáng màn hình 4. Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu 5. Read/Write (RW): Bạn sẽ đọc (read mode) hay ghi (write mode) dữ liệu? Nó sẽ phụ thuộc vào bạn gửi giá trị gì vào. 6. Enable pin: Cho phép ghi vào LCD 7. D0 - D7: 8 chân dư liệu, mỗi chân sẽ có giá trị HIGH hoặc LOW nếu bạn đang ở chế độ đọc (read mode) và nó sẽ nhận giá trị HIGH hoặc LOW nếu đang ở chế độ ghi (write mode) 8. Backlight (Backlight Anode (+) và Backlight Cathode (-)): Tắt bật đèn màn hình LCD. KHOA ĐIỆN – TỰ ĐỘNG HÓA 64
  68. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO  Cách dùng thư viện với LCD Module LCD có thể được điều khiển ở chế độ: 4-bit điều khiển và 8-bit điều khiển. Với cách dùng ở chế độ 4-bit, bạn cần 7 chân ở Arduino, và nếu muốn dùng hết khả năng của LCD thì bạn cần 7 + 4 = 11 chân ở Arduino (không nên tí nào). Ngoài ra, các hàm trong thư viện LiquidCrystal của Arudino ở chế độ 4-bit thì mọi thứ đều hoạt động tốt cả. Vì vậy, phần này sẽ mắc mạch ở chế độ 4-bit điều khiển và hướng dẫn theo hướng này. 2.1.4.2.2. Lắp mạch Sơ đồ lắp mạch KHOA ĐIỆN – TỰ ĐỘNG HÓA 65
  69. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.4.2.3. Mã lập trình 1. //Thêm thư viện LiquitCrystal - nó có sẵn vì vậy bạn không cần cài thêm gì cả 2. #include 3. 4. //Khởi tạo với các chân 5. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 6. 7. void setup() { 8. //Thông báo đây là LCD 1602 9. lcd.begin(16, 2); 10. //In ra màn hình lcd dòng chữ Toi yeu Arduino 11. lcd.print("Toi yeu Arduino!"); 12. } 13. 14. void loop() { 15. // đặt con trỏ vào cột 0, dòng 1 16. // Lưu ý: dòng 1 là dòng thứ 2, lòng 0 là dòng thứ 1. Nôm na, nó đếm từ 0 từ không phải từ 1 17. lcd.setCursor(0, 1); 18. // In ra dong chu 19. lcd.print(" Arduino.VN"); 20. } 21. 2.1.4.3. Giao tiếp Ma trận phím 4x4 2.1.4.3.1. Giới thiệu bàn phím ma trận 4x4 (matrix keypad 4x4) Dưới đây là hình ảnh sơ đồ nguyên lý của module bàn phím 4x4. Tuy có đến 16 nút nhấn, nghĩa là nếu làm một cách thông thường (dùng chân digital) thì chúng ta phải cần đến 16 chân Arduino để đọc. Nhưng với bàn phím này, chúng ta chỉ cần dùng 8 chân (4 chân hàng ngang (row) và 4 chân cột dọc (column)). Để kiểm tra một nút có được nhấn hay không? Họ sẽ sử dụng phương pháp quét được mô tả bằng đoạn mã giả như sau: Với mỗi hàng (R1 đến R4), Chọn ra hàng Ri Cấp cực âm (0v) cho hàng Ri KHOA ĐIỆN – TỰ ĐỘNG HÓA 66
  70. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Nếu điện áp ở chân Cj bất kì là dương (INPUT PULLUP) => chưa nhấn Nếu điện áp ở chân Cj bất kì là âm (INPUT PULLUP) => đang nhấn 2.1.4.3.2. Hướng dẫn sử dụng module này với board Arduino Hoàn toàn có thể tự làm một chương trình để sử dụng theo thuật toán trên. Tuy nhiên, sẽ rất khó cho một newbie để làm các hiệu ứng trên nút nhấn khác như: nhấn giữ, nhấn double click, Nên phần này hướng dẫn các bạn sử dụng một thư viện khá phổ biến trong Arduino, đó là thư viện Keypad. Link tải thư viện: “ A/Keypad/archive/master.zip” Bảng nối dây giữ Arduino và Keypad Arduino Keypad 2 R1 3 R2 4 R3 5 R4 6 C1 7 C2 8 C3 9 C4 KHOA ĐIỆN – TỰ ĐỘNG HÓA 67
  71. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.4.3.3. Mã lập trình 1. #include Keypad.h 2. 3. //Bạn có thể tham khảo thêm tại: A/Keypad/blob/master/examples/HelloKeypad/HelloKeypad.ino 4. 5. const byte rows = 4; //số hàng 6. const byte columns = 4; //số cột 7. 8. int holdDelay = 700; //Thời gian trễ để xem là nhấn 1 nút nhằm tránh nhiễu 9. int n = 3; // 10. int state = 0; //nếu state =0 ko nhấn,state =1 nhấn thời gian nhỏ , state = 2 nhấn giữ lâu 11. char key = 0; 12. 13. //Định nghĩa các giá trị trả về 14. char keys[rows][columns] = 15. { 16. {'1', '2', '3', 'A'}, 17. {'4', '5', '6', 'B'}, 18. {'7', '8', '9', 'C'}, 19. {'*', '0', '#', 'D'}, 20. }; 21. 22. byte rowPins[rows] = {2, 3, 4, 5}; //Cách nối chân với Arduino 23. byte columnPins[columns] = {6, 7, 8, 9}; 24. 25. //cài đặt thư viện keypad 26. Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows, columns); 27. void setup() { 28. Serial.begin(9600);//bật serial, baudrate 9600 29. 30. } 31. void loop() { 32. char temp = keypad.getKey(); 33. 34. if ((int)keypad.getState() == PRESSED) { 35. if (temp != 0) { 36. key = temp; 37. } 38. } 39. if ((int)keypad.getState() == HOLD) { 40. state++; 41. state = constrain(state, 1, n-1); 42. delay(holdDelay); 43. } 44. 45. if ((int)keypad.getState() == RELEASED) { 46. key += state; 47. state = 0; 48. //Xuất lên Máy tính để xem kết quả 49. Serial.println(key); 50. 51. } 52. delay(100); 53. } 54. 2.1.4.4. Bài tập ứng dụng  Điều khiển LCD1602 bằng Arduino UNO KHOA ĐIỆN – TỰ ĐỘNG HÓA 68
  72. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO  Lập trình LCD 1602 với chip 74HC595  Giao tiếp I2C LCD  Giao tiếp ma trận phím 4x4 arduino Giao tiếp ADC – DAC 2.1.5.1. ADC (Chuyển đổi tín hiệu tương tự sang tín hiệu số) 2.1.5.1.1. analogRead() Nhiệm vụ của analogRead() là đọc giá trị điện áp từ một chân Analog (ADC). Trên mạch Arduino UNO có 6 chân Analog In, được kí hiệu từ A0 đến A5. Trên các mạch khác cũng có những chân tương tự như vậy với tiền tố "A" đứng đầu, sau đó là số hiệu của chân. analogRead() luôn trả về 1 số nguyên nằm trong khoảng từ 0 đến 1023 tương ứng với thang điện áp (mặc định) từ 0 đến 5V. Bạn có thể điều chỉnh thang điện áp này bằng hàm analogReference(). Hàm analogRead() cần 100 micro giây để thực hiện. 2.1.5.1.2. Cú pháp analogRead([chân đọc điện áp]); vd: int voltage = analogRead(A0); Trong đó A0 là chân dùng để đọc điện áp. Nếu bạn chưa kết nối chân đọc điện áp, hàm analogRead() sẽ trả về một giá trị ngẫu nhiên trong khoảng từ 0 đến 1023. Để khắc phục điều này, bạn phải mắc thêm một điện trở có trị số lớn (khoảng 10k ohm trở lên) hoặc một tụ điện 104 từ chân đọc điện áp xuống GND. Khi người ta nói "đọc tín hiệu analog", bạn có thể hiểu đó chính là việc đọc giá trị điện áp. KHOA ĐIỆN – TỰ ĐỘNG HÓA 69
  73. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.5.2. DAC (chuyển đổi tín hiệu số sang tín hiệu tương tự) 2.1.5.2.1. MCP4725 DAC MCP4725 là bộ chuyển đổi kỹ thuật số sang tương tự 12 bit với bộ nhớ EEPROM, vi mạch này sử dụng công suất thấp và cho đầu ra có độ chính xác cao. Chúng có thể nhận được điện áp Analog từ bảng Arduino phụ thuộc vào đầu vào kỹ thuật số qua giao tiếp I2C. IC này có độ phân giải 12 bit và trên bo mạch Bộ nhớ EEPROM. Nó có thể được định địa chỉ bằng chân địa chỉ A0 bên ngoài và hoạt động ở Chế độ Bình thường hoặc Tắt nguồn. Nó có nhiều loại điện áp cung cấp đầu vào như 2,7V đến 5,5V từ nguồn cung cấp duy nhất. IC này cung cấp tám địa chỉ thông qua I2C và có Dải nhiệt độ mở rộng: -40 ° C đến + 125 ° C. Các ứng dụng: Hiệu chuẩn cảm biến, Thiết bị ngoại vi PC, Hệ thống thu thập dữ liệu, Thiết bị đo di động công suất thấp Link tải thư viện: “ ” KHOA ĐIỆN – TỰ ĐỘNG HÓA 70
  74. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.5.2.2. Lắp mạch Sơ đồ lắp mạch KHOA ĐIỆN – TỰ ĐỘNG HÓA 71
  75. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.5.2.3. Mã lập trình 1. /* 2. * Arduino Digital to Analog Coverter MCP4725 Interface code 3. * Library from Adafruit-MCP4725 4. * see text at www.theorycircuit.com 5. */ 6. #include //wire library 7. #include // MCP4725 library from adafruit 8. #define analogVin A0 // Analog voltage input to A0 9. 10. Adafruit_MCP4725 MCP4725; 11. 12. void setup(void) { 13. Serial.begin(9600); 14. MCP4725.begin(0x60); // Default I2C Address of MCP4725 breakout board (sparkfun) 15. 16. } 17. 18. void loop(void) { 19. 20. uint32_t MCP4725_value; 21. int adcValueRead = 0; 22. float voltageRead = 0; 23. 24. float MCP4725_expected_output; 25. 26. 27. for (MCP4725_value = 0; MCP4725_value < 4096; MCP4725_value = MCP4725_value + 15) 28. { 29. MCP4725_expected_output = (5.0/4096.0) * MCP4725_value; 30. MCP4725.setVoltage(MCP4725_value, false); 31. delay(250); 32. adcValueRead = analogRead(analogVin); 33. voltageRead = (adcValueRead * 5.0 )/ 1024.0; 34. 35. Serial.print("MCP4725 Value: "); 36. Serial.print(MCP4725_value); 37. 38. Serial.print("\tExpected Voltage: "); 39. Serial.print(MCP4725_expected_output,3); 40. 41. Serial.print("\tArduino ADC Value: "); 42. Serial.print(adcValueRead); 43. 44. Serial.print("\tArduino Voltage: "); 45. Serial.println(voltageRead,3); 46. } 47. } 2.1.5.3. Bài tập ứng dụng  Giao tiếp ADC %C4%91%E1%BB%95i-adc.42/  Giao tiếp DAC  Nhấn giữ nút nhấn để hoán vị trạng thái: KHOA ĐIỆN – TỰ ĐỘNG HÓA 72
  76. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Điều khiển PWM 2.1.6.1. Kiến thức cơ bản về xung PWM Xung là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và chu kì xung (duty cycle). Tần số là gì? Tần số là số lần lặp lại trong 1 đơn vị thời gian. Đơn vị tần số là Hz, tức là số lần lặp lại dao động trong 1 giây. Lấy ví dụ, 1Hz = 1 dao động trong 1 giây. 2Hz = 2 dao động trong 1 giây. 16MHz = 16 triệu dao động trong 1 giây. Như vậy theo quy tắc tam suất: 16 triệu dao động - 1 giây > 1 dao động tốn 1/16.000.000 (giây) = 0,0625 (micro giây) Cách xác định 1 dao động như thế nào? Đa phần các bạn mới nghiên cứu điện tử thường mắc sai lầm ở việc xác định 1 dao động. Dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại. Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tỉ lệ phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung. Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp (khái niệm xung nên hiểu mở rộng) Với x/y = 50% thì 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 toàn bộ điện áp cao. Tóm lại, với 1 xung ta có:  Tần số: để tính toán ra được thời gian của 1 xung KHOA ĐIỆN – TỰ ĐỘNG HÓA 73
  77. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO  Chu kì xung: bao nhiêu thời gian xung có mức áp cao, bao nhiêu thời gian xung có mức áp thấp. 2.1.6.2. Liên hệ với Arduino Với kiến thức cơ bản về xung, sẽ hiểu rõ hơn về xung trong thực tế như thế nào. Giữa 2 vạch là 1 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() trong Arduino giúp việc tạo 1 xung dễ dàng hơn. Hàm này truyền vào tham số cho phép thay đổi chu kì xung, bạn có thể tính toán ra được chu kì xung như ở bảng trên. Tần số xung được Arduino thiết lập mặc định. Đối với board Arduino Uno, xung trên các chân 3,9,10,11 có tần số là 490Hz, xung trên chân 5,6 có tần số 980Hz. 2.1.6.3. Bài tập ứng dụng  Điều chỉnh độ sáng của LED bằng độ rộng xung  Tìm hiểu về xung PWM KHOA ĐIỆN – TỰ ĐỘNG HÓA 74
  78. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO 2.1.6.3.1. Lập trình - mô phỏng ứng dụng truyền dữ liệu Truyền dữ liệu giao thức UART 2.1.7.1. Giao diện Serial Monitor Thư viện Serial được dùng trong việc giao tiếp giữa các board mạch với nhau (hoặc board mạch với máy tính hoặc với các thiết bị khác). Tất cả các mạch Arduino đều có ít nhất 1 cổng Serial (hay còn được gọi là UART hoặc USART). Giao tiếp Serial được thực hiện qua 2 cổng digital 0 (RX) và 1 (TX) hoặc qua cổng USB tới máy tính. Vì vậy, nếu bạn đang sử dụng các hàm của thư viện Serial này, bạn không thể sử dụng các chân digital 0 và digital 1 để làm việc khác được. Bạn có thể sử dụng bảng “Serial monitor” có sẵn trong Arduino IDE để giao tiếp với Arduino qua giao thức Serial hoặc bấm vào biểu tượng “Serial Monitor ” hoặc nhấn tổ hợp phím “Ctrl+Shift+M” để mở bảng Serial Monitor, sau đó bạn 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 trong quá trình lập trình của bạn. Mặc định là 9600. Giao diện Serial Monitor 2.1.7.2. Sơ đồ giao tiếp Serial (UART) KHOA ĐIỆN – TỰ ĐỘNG HÓA 75
  79. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Giao tiếp PC và Arduino Giao tiếp 2 mạch Arduino 2.1.7.3. Bài tập ứng dụng  Đọc giá trị điện áp qua Serial Monitor  Truyền nhận Serial (UART)  Giao tiếp giữa máy tính và Arduino qua  Truyền nhận dữ liệu với giao tiếp Serial (UART) trên Arduino Truyền dữ liệu giao thức SPI 2.1.8.1. Giao tiếp SPI là gì? SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao do hãng Motorola đề xuất. Đây là kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong KHOA ĐIỆN – TỰ ĐỘNG HÓA 76
  80. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Sơ đồ chân giao tiếp SPI  SCK (dòng đồng bộ): Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ nên cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi. Đây là điểm khác biệt với truyền thông không đồng bộ mà chúng ta đã biết trong chuẩn UART. Sự tồn tại của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể đạt rất cao. Xung nhịp chỉ được tạo ra bởi chip Master.  MISO– Master Input / Slave Output (Mang các dữ liệu từ các thiết bị SPI về arduino): nếu là chip Master thì đây là đường Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves được nối trực tiếp với nhau  MOSI – Master Output / Slave Input (Mang các dữ liệu từ Arduino đến các thiết bị SPI): nếu là chip Master thì đây là đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau.  SS – Slave Select (Chọn thiết bị SPI cần làm việc): SS là đường chọn Slave cần giap tiếp, trên các chip Slave đường SS sẽ ở mức cao khi không KHOA ĐIỆN – TỰ ĐỘNG HÓA 77
  81. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO làm việc. Nếu chip Master kéo đường SS của một Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master và Slave đó. Chỉ có 1 đường SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên Master, tùy thuộc vào thiết kế của người dùng. 2.1.8.2. Sơ đồ giao tiếp SPI có thể kiểm soát 1 hoặc nhiều thiết bị sử dụng SPI. Giao tiếp SPI - Module SD Card với Arduino Ví dụ 1: dưới đây là 1 thiết bị Giao tiếp SPI với 1 thiết bị Dữ liệu được truyền qua lại dữa 2 đường MISO và MOSI. Để giao tiếp với một thiết bị SPI chúng ta cần thiết lập các dòng SS với thiết bị ở mức thấp LOW, sau đó giao tiếp với nó, sau đó thiết lập các dòng SS trở lại mức cao HIGH. KHOA ĐIỆN – TỰ ĐỘNG HÓA 78
  82. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Ví dụ 2: có hai hoặc nhiều thiết bị SPI trên cùng 1 bus, chúng sẽ được kết nối như sau: Giao tiếp SPI với nhiều thiết bị Ở đây có hai dòng SS - với mỗi 1 thiết bị chỉ sử dụng 1 dòng SS. Bạn có thể sử dụng bất kỳ chân digital nào trên Arduino của bạn cho dòng SS. Chỉ cần nhớ là để tất cả các dòng SS ở mức cao HIGH , "ngoại trừ" dòng SS mà bạn muốn kết nối với các thiết bị SPI vào thời điểm đó. Điều này tương tự như việc rất nhiều cánh cổng trước mặt nhưng chỉ cho phép 1 người đi vào. Ta mở 1 cổng và cho 1 người duy nhất vào, rồi sau đó đóng cánh cổng đó và mở cánh cổng khác và lựa chọn người khác. 2.1.8.3. Bài tập ứng dụng  Arduino và giao tiếp SPI  Kết nối Module SD Card với Arduino giao tiếp qua SPI Truyền dữ liệu giao thức I2C 2.1.9.1. Giao tiếp I2C là gì? Đầu năm 1980 Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là I2C. I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường Bus giao tiếp giữa các IC với nhau. I2C mặc dù được phát triển bới Philips, nhưng nó đã được KHOA ĐIỆN – TỰ ĐỘNG HÓA 79
  83. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO rất nhiều nhà sản xuất IC trên thế giới sử dụng. I2C trở thành một chuẩn công nghiệp cho các giao tiếp điều khiển, có thể kể ra đây một vài tên tuổi ngoà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 rất nhiều loại IC khác nhau như các loại Vi điều khiển 8051, PIC, AVR, ARM chip nhớ như: RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tự (DAC), IC điểu khiển LCD, LED 2.1.9.2. Cấu tạo và nguyên lý hoạt động I2C sử dụng hai đường truyền tín hiệu:  Một đường xung nhịp đồng hồ (SCL) chỉ do Master phát đi (thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).  Một đường dữ liệu (SDA) theo 2 hướng. Có rất nhiều thiết bị có thể cùng được kết nối vào một bus I2C, tuy nhiên sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi mỗi thiết bị sẽ được nhận ra bởỉ một địa chỉ duy nhất với một quan hệ chủ/tớ tồn tại trong suốt thời gian kết nối. Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyền dữ liệu hay có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc vào việc thiết bị đó là chủ (master) hay tớ (slave). Một thiết bị hay một IC khi kết nối với bus I2C, ngoài một địa chỉ (duy nhất) để phân biệt, nó còn được cấu hình là thiết bị chủ hay tớ. Tại sao lại có sự phân biệt này? Đó là vì trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ. Thiết bị chủ nắm vai trò tạo xung đồng hồ cho toàn hệ thống, khi giữa hai thiết bị chủ/tớ giao tiếp thì thiết bị chủ có nhiệm vụ tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trò chủ động, còn thiết bị tớ giữ vai trò bị động trong việc giao tiếp. Về lý thuyết lẫn thực tế I2C sử dụng 7 bit để định địa chỉ, do đó trên một bus có thể có tới 27 địa chỉ tương ứng với 128 thiết bị có thể kết nối, nhưng chỉ có 112, 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn lại quy định việc đọc hay ghi dữ liệu (1 là write, 0 là read) Điểm mạnh của I2C chính là hiệu suất và sự đơn giản của nó: một khối điều khiển trung tâm có thể điều khiển cả một mạng thiết bị mà chỉ cần hai lối ra điều khiển. KHOA ĐIỆN – TỰ ĐỘNG HÓA 80
  84. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Ngoài ra I2C còn có chế độ 10bit địa chỉ tương đương với 1024 địa chỉ, tương tự như 7 bit, chỉ có 1008 thiết bị có thể kết nối, còn lại 16 địa chỉ sẽ dùng để sử dụng mục đích riêng. 2.1.9.3. Sơ đồ giao tiếp I2C Sơ đồ giao tiếp I2C của các thiết bị Giao tiếp I2C giữ Arduino với các Module cảm biến khác 2.1.9.4. Bài tập ứng dụng  Giao tiếp I2C với nhiều Module  Giao tiếp I2C với Module LCD KHOA ĐIỆN – TỰ ĐỘNG HÓA 81
  85. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO  Giao tiếp I2C với Module Realtime Clock Truyền dữ liệu giao thức Bluetooth 2.1.10.1. Nguồn gốc Bluetooth Bluetooth ra đời vào năm 1989 tại công ty Ericsson ở Lund, Thụy Điển. Tên "bluetooth" là phiên bản ăng-lô hóa của vị vua Harald Bluetooth, người thống nhất các bộ tộc Đan Mạch thành một vương quốc vùng Scandinavia. Ký hiệu bluetooth mà các bạn thấy là tên viết tắt (Harald Bluetooth) của vị vua này theo cổ ngữ Rune: Bluetooth ra đời với mục đích "không dây hóa" chuẩn serial RS-232 thịnh hành vào những năm 80-90 của thế kỷ trước và chuẩn hóa các giao tiếp serial. Chuẩn serial RS-232 Bluetooth về cơ bản là một giao tiếp bằng sóng radio ở băng tần 2.4 đến 2.480 GHz, rất gần với chuẩn Wifi 2.4GHz hiện nay. Tuy nhiên, khác với Wifi hay các sóng radio khác hoạt động ở 1 băng tầng cố định, Bluetooth triển khai theo khái niệm "nhảy tần trải phổ" (Frequency Hopping Spread Spectrum), có nghĩa là băng tần hoạt động của Bluetooth thay đổi liên tục với 79 kênh (từ 2.400 GHz đên 2.480 GHz). Điều này, về mặt lý thuyết, đảm bảo bluetooth chống lại việc nghe lén rất hiệu quả vì hacker phải KHOA ĐIỆN – TỰ ĐỘNG HÓA 82
  86. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO biết chính xác được kênh nào để nghe, mà kênh này lại thay đổi liên tục (khoảng 800 lần mỗi giây) tùy vào sự đồng ý giữa 2 thiết bị đang giao tiếp với nhau. Bước sóng của bluetooth là khoảng 12cm. Đây cũng là chiều dài thường thấy của ăn-ten mà các bạn thấy trên các module: Bluetooth thực hiện giao tiếp với nhau theo kiểu chủ-tớ (Master-Slave), và thông thường 1 chủ có thể nối với 7 thiết bị tớ cùng 1 lúc thành một hệ thống mạng mini. Dĩ nhiên các thiết bị có thể đổi vai trò, tùy vào điều kiện tiếp nối. Ví dụ: 1 cái tai nghe khởi đầu kết nối với điện thoại bắt buộc phải đóng vai chủ Master, nhưng sau đó sẽ hoạt động như là 1 tớ Slave sau khi kết nối hoàn tất. Sau đó thông tin được truyền đi theo phương thức giao chuyển gói (Packet Switching). 2.1.10.2. Sơ đồ kết nối Arduino và Bluetooth Kết nối Arduino với các thiết bị module Bluetooth và điều khiển nó thông qua điện thoại Android. Các bạn có thể ứng dụng để điều khiển các thiết bị điện trong nhà như bật tắt đèn, quạt, bật tắt bình nóng lạnh, hoặc tự làm một chiếc ô tô điều khiển từ xa bằng Bluetooth Sơ đồ kết nối Arduino với Module Bluetooth KHOA ĐIỆN – TỰ ĐỘNG HÓA 83
  87. CHƯƠNG 2: LẬP TRÌNH - MÔ PHỎNG DÙNG VI ĐIỀU KHIỂN ARDUINO Mô hình điều khiển thiết bị qua điện thoại 2.1.10.3. Bài tập ứng dụng  Điều khiển Arduino qua giao tiếp Bluetooth  Giao tiếp 2 Board Arduino bằng Module Bluetooth  Điều khiển LED bằng Bluetooth Phần 1: Phần 2: KHOA ĐIỆN – TỰ ĐỘNG HÓA 84
  88. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 3.1. Tổng quan về truyền thông dùng Arduino Internet Of Things (IoT) – Internet vạn vật dường như đang đứng trước một bước ngoặt để đi đến giai đoạn tiếp theo cho một thế giới hiện đại, văn minh. Đó là viễn cảnh mà mọi vật đều có thể kết nối với nhau thông qua Internet không dây. Lập trình ứng dụng IoT sử dụng Chip WiFi phổ biến hiện này là ESP8266 để kết nối với Server, gởi, nhận dữ liệu và thực thi các lệnh từ Server. Internet Of Things dựa và các kết nối Internet khá nhiều, do vậy các nội dung cũng tập trung nhiều vào các giao thức (prototcol), các phương pháp quản lý cũng như cấu hình kết nối. Phần cứng sử dụng chính là System On Chip (SoC) ESP8266 - có khả năng kết nối WiFi và lập trình được với giá thành rẻ và phổ biến trên thế giới. Board mạch sử dụng là board phần cứng mở. IoT WiFi Uno có sơ đồ chân tương thích với các board Arduino Uno. Phần mềm sử dụng lập trên máy tính cho Chip ESP8266 là Arduino, ngôn ngữ lập trình C/C++. Các phần liên quan đến Server chạy trên máy tính sử dụng NodeJS với ngôn ngữ lập trình Javascript. 3.2. Module ESP8266 Mã nguồn mở của module ESP8266 KHOA ĐIỆN – TỰ ĐỘNG HÓA 85
  89. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO ESP8266 là dòng chip tích hợp Wi-Fi 2.4Ghz có thể lập trình được, rẻ tiền được sản xuất bởi một công ty bán dẫn Trung Quốc: Espressif Systems. Được phát hành đầu tiên vào tháng 8 năm 2014, đóng gói đưa ra thị trường dạng Module ESP-01, được sản xuất bởi bên thứ 3: AI-Thinker. Có khả năng kết nối Internet qua mạng Wi-Fi một cách nhanh chóng và sử dụng rất ít linh kiện đi kèm. Với giá cả có thể nói là rất rẻ so với tính năng và khả năng ESP8266 có thể làm được. ESP8266 có một cộng đồng các nhà phát triển trên thế giới rất lớn, cung cấp nhiều Module lập trình mã mở giúp nhiều người có thể tiếp cận và xây dựng ứng dụng rất nhanh. Hiện nay tất cả các dòng chip ESP8266 trên thị trường đều mang nhãn ESP8266EX, là phiên bản nâng cấp của ESP8266 KHOA ĐIỆN – TỰ ĐỘNG HÓA 86
  90. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Sơ đồ chân và sơ đồ khối ESP8266 Thông số phần cứng:  32-bit RISC CPU : Tensilica Xtensa LX106 running at 80 MHz  Hổ trợ Flash ngoài từ 512KiB đến 4MiB  64KBytes RAM thực thi lệnh  96KBytes RAM dữ liệu  64KBytes boot ROM  Chuẩn wifi EEE 802.11 b/g/n, Wi-Fi 2.4 GHz Tích hợp TR switch, balun, LNA, khuếch đại công suất và matching network Hổ trợ WEP, WPA/WPA2, Open network  Tích hợp giao thức TCP/IP  Hổ trợ nhiều loại anten  16 chân GPIO  Hổ trợ SDIO 2.0, UART, SPI, I²C, PWM,I²S với DMA KHOA ĐIỆN – TỰ ĐỘNG HÓA 87
  91. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO  1 ADC 10-bit  Dải nhiệt độ hoạt động rộng : -40C ~ 125C Lập trình code module ESP8266 Để bắt đầu với những dự án Wifi với Arduino các bạn cần ESP8266 với giá thành rẻ, và dễ dàng sử dụng. Đặc biệt, ESP8266 có thể được lập trình bằng Arduino IDE. Trước khi bắt đầu những chuỗi dự án với ESP8266, ở phần này, sẽ hướng dẫn cách cài đặt thư viện và chức năng nạp code cho IDEArduino IDE để nạp code cho ESP8266. Sau khi down bản mới nhất của Arduino IDE, các bạn tiến hành cài đặt như bình thường và mở chương trình Để tiến hành cài đặt thư viện và chức năng nạp code cho IDE các bạn làm như sau: Vào File→ Preferences, vào textbox Additional Board Manager URLs thêm đường link sau vào xong Click OK để chấp nhận. KHOA ĐIỆN – TỰ ĐỘNG HÓA 88
  92. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Tiếp theo vào Tool→Board→Boards Manager Đợi một lát để chương trình tìm kiếm. Ta kéo xuống và click vào ESP8266 by ESP8266 Community, click vào Install. Chờ phần mềm tự động download và cài đặt. KHOA ĐIỆN – TỰ ĐỘNG HÓA 89
  93. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Chọn Board để lập trình cho ESP8266 Kết nối mudule USB-to-UART vào máy tính. Vào Tool→Board→Generic ESP8266 Module, chọn cổng COM tương ứng với module USB-to-UART tương ứng. Chọn chế độ nạp Arduino as ISP. Vậy là ta đã có môi trường lập trình cho esp8266 rất thân thiện. KHOA ĐIỆN – TỰ ĐỘNG HÓA 90
  94. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Sau khi kết nối UART vs ESP8266. các bạn có thể test code ESP8266 ở đây: 1. int pin = 2; 2. 3. void setup() { 4. 5. pinMode(pin, OUTPUT) 6. } 7. 8. 9. void loop() { 10. digitalWrite(pin, HIGH); //bật le 11. delay(1000); //dừng 1 12. digitalWrite(pin, LOW); //tắt le 13. delay(1000); //dừng 1 14. } Link tham khảo: Phần mềm mã nguồn mở Blynk Blynk là một phần mềm mã nguồn mở được thiết kế cho các ứng dụng IoT (Internet of Things). Ứng dụng giúp người dùng điều khiển phần cứng từ xa, có thể hiển thị dữ liệu cảm biến, lưu trữ dữ liệu, biến đổi dữ liệu hoặc làm nhiều việc khác. Bạn hãy thử tưởng tượng khi bạn ấn vào một nút nhấn trên phần mềm lập tức bóng đèn sáng lên và ngược lại ! KHOA ĐIỆN – TỰ ĐỘNG HÓA 91
  95. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Nền tảng Blynk có ba phần chính:  Blynk App – Ứng dụng Blynk cho phép khởi tạo giao diện cho các dự án của mình  Blynk Server – Chịu trách nhiệm giao tiếp qua lại hai chiều giữa điện thoại và phần cứng. Bạn có thể sử dụng server của Blynk nhưng sẽ bị giới hạn điểm Enegry.  Blynk Library – Thư viện chứa các nền tảng phổ biến , giúp việc giao tiếp phần cứng với Server dễ dàng hơn Một chiếc điện thoại thông minh IOS hay Android đều được. Bạn hãy tải về ứng dụng Blynk. 3.2.3.1. Cài đặt và cấu hình Blynk App Để có thể sử dụng App Blynk chúng ta cần phải đăng ký một tài khoản mới. Ở đây có 2 cách đăng ký bằng Facebook hoặc tạo một tài khoản mới (Create New Account). Mình sẽ hướng dẫn bằng cách đăng ký bằng Account. KHOA ĐIỆN – TỰ ĐỘNG HÓA 92
  96. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Nhập thông tin tài khoản Gmail của các bạn. Rồi nhấn Sign Up để tiến hành đăng ký. KHOA ĐIỆN – TỰ ĐỘNG HÓA 93
  97. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Sau khi đăng ký hoàn thành, chúng ta sẽ tiến hành tạo một Project mới. Mình sẽ hướng dẫn các bạn tạo một dự án Bật/Tắt LED trên Blynk. Các bạn Click vào dấu cộng (+) trên thanh công cụ để tiến hành tạo Project mới. Click vào Create để hoàn tất việc tạo mới. KHOA ĐIỆN – TỰ ĐỘNG HÓA 94
  98. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Blynk sẽ cấp cho các bạn một mã Token, mã này sẽ gửi trực tiếp vào Gmail mà lúc nãy bạn đăng ký. Mã Token này dùng để chèn vào code Example của Blynk. KHOA ĐIỆN – TỰ ĐỘNG HÓA 95
  99. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Để Bật/Tắt Led chúng ta cần có một nút bấm để điều khiển. Vào Widget Box (+) > Click vào Button để lấy nút nhấn ra. KHOA ĐIỆN – TỰ ĐỘNG HÓA 96
  100. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Click vào Button để tiến hành cài đặt thông số.  Ở mục Button: Đặt tên cho nút nhấn.  OUTPUT: Cấu hình cho PIN cần kết nối, ở đây mình chọn Digital > gp16 (chân này có LED được tích hợp trên board mạch sẵn).  MODE: có 2 chế độ PUSH (nhấn thả) và SWITCH (nhấn giữ). KHOA ĐIỆN – TỰ ĐỘNG HÓA 97
  101. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO  ON/OFF LABELS: Thay đổi chế đọ hiển thị cho nút nhấn (Vd: Các bạn không thích để ON/OFF có thể thay bằng BẬT/TẮT hoặc một cái tên nào mà bạn muốn).  DESIGN: Ở phần này các bạn có thể điều chỉnh màu sắc của nút nhấn. KHOA ĐIỆN – TỰ ĐỘNG HÓA 98
  102. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO KHOA ĐIỆN – TỰ ĐỘNG HÓA 99
  103. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 3.2.3.2. Nạp code vào NodeMCU ESP8266 Nhấn vào đường Link để Copy ví dụ nhé: “ mple=GettingStarted%2FBlynkBlink&auth=c2a162bafaf744009a19df8063a2abee” Ở phía tay trái vùng mình đã khoanh đỏ các bạn chọn đúng các thông số như trên màn hình nhé. Các bạn lấy mã Token lúc nãy gửi về Gmail paste vào mục Auth Token nhé. Sau khi đã cấu hình xong các thông số các bạn nhấn vào Copy example bên phía tay phải để bỏ vào Arduino IDE. Tiếp hành nạp code: Khởi động Arduino IDE lên và paste ví dụ vừa rồi vào trong shetch trong Arduino. Ở vùng mình khoanh đỏ các bạn thêm thông tin WIFI của mình vào nhé. ssid: Tên WIFI. pass: Mật khẩu WIFI nhé. KHOA ĐIỆN – TỰ ĐỘNG HÓA 100
  104. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Các bạn chọn tên cho Board NodeMCU 1.0 (ESP-12E Module). Các bạn nhớ chọn cổng COM nhé. Upload chương trình và chờ đợi kiểm tra kết quả. Lưu ý: Trong quá trình Upload mà bị báo lỗi #include thì các bạn làm như sau: Các bạn vào đường dẫn. C:\Users\Administrator\Documents\Arduino\libraries\Blynk_Release_v0.6.1\libr aries Sau đó các bạn Copy toàn bộ thư viện ra bỏ vào mục này nhé: C:\Users\Administrator\Documents\Arduino\libraries Vì qua nhiều lớp nên Arduino IDE không nhận được thư viện các bạn cài vào lúc trước. Link tham khảo: KHOA ĐIỆN – TỰ ĐỘNG HÓA 101
  105. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Điều khiển thiết bị qua Wifi  Cài đặt board ESP8266: Tools / Board / Board Manager  Cài đặt Board Blynk: Tools / Board / Board Manager  Tools / Board / Generic ESP8266 Module KHOA ĐIỆN – TỰ ĐỘNG HÓA 102
  106. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Mã lập trình: 1. #include 2. #include 3. #include "EEPROM.h" 4. #define BLYNK_PRINT Serial // Comment this out to disable prints and save space 5. #include 6. //12: Green 7. //13: Blue 8. //15: Red 9. 10. ESP8266WebServer server(80); 11. 12. const char* ssid = "XSwitch"; 13. const char* passphrase = "000000000"; 14. String blynk = "a4c47feas2e542f7ad7d5b2d5a4300a5"; 15. int inRelay1 = 14; //Chan GPIO14 gắn vào relay 16. String st; 17. String content; 18. int statusCode; 19. 20. 21. void setup() 22. { 23. Serial.begin(115200); KHOA ĐIỆN – TỰ ĐỘNG HÓA 103
  107. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 24. pinMode(inRelay1, OUTPUT); 25. //Delay 5m, Red blink 26. pinMode(13, OUTPUT); 27. pinMode(15, OUTPUT); 28. for (int i = 1; i 1 ) 71. { 72. WiFi.begin(esid.c_str(), epass.c_str()); 73. if (testWifi()) 74. { 75. launchWeb(0); 76. WiFi.disconnect(); 77. 78. char * auth_ = new char[eblynk.length() + 1]; 79. eblynk.toCharArray(auth_, eblynk.length() + 1); 80. Blynk.begin(auth_, esid.c_str(), epass.c_str()); 81. EEPROM.end(); KHOA ĐIỆN – TỰ ĐỘNG HÓA 104
  108. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 82. return; 83. } 84. } 85. setupAP(); 86. EEPROM.end(); 87. } 88. 89. bool testWifi(void) 90. { 91. int c = 0; 92. Serial.println("Xin vui long doi ket noi WIFI"); 93. while ( c < 20 ) 94. { 95. if (WiFi.status() == WL_CONNECTED) 96. { 97. return true; 98. } 99. delay(1000); 100. Serial.print(WiFi.status()); 101. c++; 102. } 103. Serial.println(""); 104. Serial.println("Thoi gian ket noi cham, Mo AP"); 105. return false; 106. } 107. 108. void launchWeb(int webtype) 109. { 110. Serial.println(""); 111. Serial.println("WiFi ket noi"); 112. Serial.print("Dia chi IP: "); 113. Serial.println(WiFi.localIP()); 114. Serial.print("SoftAP IP: "); 115. Serial.println(WiFi.softAPIP()); 116. createWebServer(webtype); 117. // Start the server 118. server.begin(); 119. Serial.println("May chu bat dau"); 120. } 121. 122. void setupAP(void) 123. { 124. WiFi.mode(WIFI_STA); 125. WiFi.disconnect(); 126. delay(100); 127. int n = WiFi.scanNetworks(); 128. Serial.println("Tim hoan tat"); 129. if (n == 0) 130. { 131. Serial.println("no networks found"); 132. } 133. else 134. { 135. Serial.print(n); 136. Serial.println(" networks found"); 137. for (int i = 0; i < n; ++i) 138. { 139. // Print SSID and RSSI for each network found KHOA ĐIỆN – TỰ ĐỘNG HÓA 105
  109. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 140. Serial.print(i + 1); 141. Serial.print(": "); 142. Serial.print(WiFi.SSID(i)); 143. Serial.print(" ("); 144. Serial.print(WiFi.RSSI(i)); 145. Serial.print(")"); 146. Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*"); 147. delay(10); 148. } 149. } 150. Serial.println(""); 151. st = " "; 152. for (int i = 0; i "; 156. st += WiFi.SSID(i); 157. st += " ("; 158. st += WiFi.RSSI(i); 159. st += ")"; 160. st += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*"; 161. st += " "; 162. } 163. st += " "; 164. delay(100); 165. Serial.println("softap"); 166. Serial.println(ssid); 167. Serial.println(passphrase); 168. WiFi.softAP(ssid, passphrase, 6); 169. 170. launchWeb(1); 171. Serial.println("over"); 172. } 173. 174. void createWebServer(int webtype) 175. { 176. if ( webtype == 1 ) 177. { 178. server.on("/", []() 179. { 180. IPAddress ip = WiFi.softAPIP(); 181. String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]); 182. content = " \r\n XSwitch "; 183. //content += ipStr; 184. //content += " Wifi Password Blynk "; 185. content += " "; 186. content += " Wifi "; KHOA ĐIỆN – TỰ ĐỘNG HÓA 106
  110. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 187. content += " "; 188. content += " Mat Khau "; 189. content += " "; 190. content += " Blynk "; 191. content += " "; 192. content += " "; 193. 194. content += " "; 195. content += st; 196. content += " "; 197. content += " "; 198. server.send(200, "text/html", content); 199. }); 200. server.on("/setting", []() 201. { 202. String qsid = server.arg("ssid"); 203. String qpass = server.arg("pass"); 204. String qblynk = server.arg("blynk"); 205. if (qsid.length() > 0 && qpass.length() > 0) 206. { 207. EEPROM.begin(512); 208. Serial.println("clearing eeprom"); 209. for (int i = 0; i < 128; ++i) 210. { 211. EEPROM.write(i, 0); 212. } 213. EEPROM.commit(); 214. Serial.println(qsid); 215. Serial.println(""); 216. Serial.println(qpass); 217. Serial.println(""); 218. Serial.println(qblynk); 219. Serial.println(""); 220. 221. Serial.println("writing eeprom ssid:"); 222. for (int i = 0; i < qsid.length(); ++i) 223. { 224. EEPROM.write(i, qsid[i]); 225. Serial.print("Wrote: "); 226. Serial.println(qsid[i]); 227. } 228. 229. Serial.println("writing eeprom pass:"); 230. for (int i = 0; i < qpass.length(); ++i) 231. { 232. EEPROM.write(32 + i, qpass[i]); 233. Serial.print("Wrote: "); 234. Serial.println(qpass[i]); 235. } 236. 237. Serial.println("writing eeprom blynk:"); 238. for (int i = 0; i < qblynk.length(); ++i) 239. { 240. EEPROM.write(96 + i, qblynk[i]); 241. Serial.print("Wrote: "); 242. Serial.println(qblynk[i]); 243. } 244. EEPROM.commit(); KHOA ĐIỆN – TỰ ĐỘNG HÓA 107
  111. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO 245. EEPROM.end(); 246. //Chop den xanh sau khu lam xong 247. pinMode(13, OUTPUT); 248. digitalWrite(13, LOW); 249. digitalWrite(13, HIGH); 250. delay(500); 251. digitalWrite(13, LOW); 252. content = "{\"Success\":\"Luu vao he thong. Khoi dong lai ten wifi moi\"}"; 253. statusCode = 200; 254. } 255. else 256. { 257. content = "{\"Error\":\"404 not found\"}"; 258. statusCode = 404; 259. Serial.println("Sending 404"); 260. } 261. server.send(statusCode, "application/json", content); 262. }); 263. } 264. else if (webtype == 0) 265. { 266. server.on("/", []() 267. { 268. IPAddress ip = WiFi.localIP(); 269. String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]); 270. server.send(200, "application/json", "{\"IP\":\"" + ipStr + "\"}"); 271. }); 272. server.on("/cleareeprom", []() 273. { 274. content = " \r\n "; 275. content += " XSwitch Clearing the EEPROM "; 276. server.send(200, "text/html", content); 277. Serial.println("clearing eeprom"); 278. for (int i = 0; i < 128; ++i) 279. { 280. EEPROM.write(i, 0); 281. } 282. //Chop den xanh sau khu lam xong 283. pinMode(13, OUTPUT); 284. digitalWrite(13, LOW); 285. digitalWrite(13, HIGH); 286. delay(500); 287. digitalWrite(13, LOW); 288. EEPROM.commit(); 289. }); 290. } 291. } 292. void loop() 293. { 294. server.handleClient(); 295. Blynk.run(); 296. } KHOA ĐIỆN – TỰ ĐỘNG HÓA 108
  112. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO  Thiết kế Blynk để giao tiếp: Trên mobile, Tải và mở ứng dụng Blynk ra và tạo một nút nhấn nhớ chọn là:  Cấu hình hệ thống: Ở chế độ này, xSwitch trở thành 1 webserver có: Bạn vào cài đặt wifi trên điện thoại chọn wifi XSWITCH Mật khẩu: 000000000 (9 số 0) IP: 192.168.4.1 KHOA ĐIỆN – TỰ ĐỘNG HÓA 109
  113. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Dùng thiết bị di động hay máy tính, kết nối vào access point này và mở trang web sau đó điền thông tin mạng WIFI chính nhà bạn và mật khẩu vào. Wifi: nhập tên access point mà xSwitch sẽ kết nối Password: nhập mật khẩu của wifi Blynk: nhập vào mã xác thực của Bkynk Nhớ nhấn submit để lưu lại. Và khởi động lại xSwitch. KHOA ĐIỆN – TỰ ĐỘNG HÓA 110
  114. CHƯƠNG 3: TRUYỀN THÔNG VI ĐIỀU KHIỂN ARDUINO Điều khiển thiết bị qua Cloud Server với MQTT Trong phần này sẽ trình bày một số khái niệm và các bước thực hiện MQTT với ví dụ minh họa cơ bản trên ESP8266. Với hình ảnh trên thì ta có thể thấy MQTT Broker là một trạm trung chuyển, nói đơn giản dễ hiểu thì coi như nó là một trung tâm thông tin, có nhiệm vụ nhận thông tin từ rất nhiều các thiết bị khác nhau và chuyển các thông tin này tới từng thiết bị riêng biệt. Broker MQTT này sẽ lấy ở đâu ra? Chúng ta sẽ có 2 cách:  Tự tạo Broker MQTT trên máy tính, raspberry, server, tùy vào điều kiện hiện có: cách này tốn kém thêm chi phí, phức tạp, không dành cho người mới bắt đầu.  Sử dụng các dịch vụ MQTT broker có sẵn: cách này dễ thở hơn chút, sử dụng cái sẵn có, thao tác cấu hình lấy thông tin để sử dụng, phù hợp với những người muốn thử nghiệm, tham khảo, tận dụng cái có sẵn. Trong bài viết này mình sẽ sử dụng cách này. Để hiểu hơn một chút về cách thức hoạt động của MQTT Broker và ESP8266 ta sẽ đi vào ví dụ cụ thể: Chuẩn bị:  Phần cứng: ESP8266 (NodeMCU) KHOA ĐIỆN – TỰ ĐỘNG HÓA 111