Arduino cho người mới bắt đầu (Phần 1)

Nội dung quyển sách này bao gồm các hướng dẫn chi tiết cho người đọc về cách sử dụng và

những tính năng của nền tảng phát triển Arduino thông qua board mạch IoT Maker UnoX, hiểu

được các chức năng và chuẩn giao tiếp thông dụng trong truyền nhận dữ liệu, đồng thời bám

sát nội dung đã học bằng các bài thực hành.

• Phần cứng sử dụng là board mạch phần cứng mở IoT Maker UnoX do IoT Maker VietNam thiết kế,

hoàn toàn tương thích với chuẩn Arduino Uno trên thị trường. Đây là 1 dự án open source

hardware nên chúng tôi rất hoan nghênh nếu có những nhận xét hoặc đóng góp nhằm cải thiện

các tính năng cho board mạch.

• Phần mềm sử dụng lập trình trên máy tính là Arduino, ngôn ngữ lập trình C/C++.

goài ra, bạn sẽ cần tìm hiểu một số công cụ và khái niệm thường xuyên được sử dụng trong quyển

ch này như sau:

• Git - Trình quản lý phiên bản sử dụng rất rộng rãi trên thế giới. Git giúp bạn quản lý được mã

nguồn, làm việc nhóm, xử lý các thao tác hợp nhất, lịch sử mã nguồn, Có thể trong quá trình

làm việc với quyển sách này, bạn sẽ cần sử dụng các thư viện mã nguồn mở cho Arduino từ

Github, nên việc cài đặt và sử dụng công cụ khá cần thiết cho việc đó. Chưa kể, nó sẽ giúp bạn

quản lý mã nguồn và dự án ngày càng chuyên nghiệp hơn.

• Github - Là một mạng xã hội cho lập trình viên dựa trên Git.

• Firmware - là 1 phần mềm (software) được nhúng (embedded) vào phần cứng (hardware) của

thiết bị, giúp điều khiển, cập nhật các tính năng mới cho phần cứng.

Tuy phần cứng chính thức sử dụng là board mạch phần cứng mở IoT Maker

UnoX, nhưng bạn hoàn toàn có thể sử dụng bất kỳ board Arduino Uno nào khác

trên thị trường cho cuốn sách này, ví dụ như: Arduino Uno R3, Arduno-nano-3.0,

 T thay vào ất cả các mã ngu đó được cung c ồn đều h ấp t ạn ch ại phếụgi lụảc Cheat Sheet (Arduino). i thích rõ chi tiết API cho mỗi tính năng,

pdf 109 trang yennguyen 7380
Bạn đang xem 20 trang mẫu của tài liệu "Arduino cho người mới bắt đầu (Phần 1)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Arduino cho người mới bắt đầu (Phần 1)

Arduino cho người mới bắt đầu (Phần 1)
Arduino
cho người mới bắt đầu
IoT Maker Viet Nam
Mục lục
Lời mở đầu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  1
Đôi lời về tác giả . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  1
Thuật ngữ hay sử dụng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  1
Giải thích code trong bài . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  1
Giới thiệu nội dung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  3
Ai có thể sử dụng? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  3
Mục tiêu mang lại cho người đọc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  4
Chuẩn bị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  4
Kiến thức cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  5
Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  6
Arduino là gì ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  6
Những board mạch Arduino trên thị trường . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  9
Giới thiệu board IoT Maker UnoX và IoT Arduino STEM Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  13
Arduino IDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  18
Khái niệm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  18
Cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  18
Ứng dụng mang lại . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  29
Arduino và C/C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  32
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34
Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  35
Giới thiệu một số khái niệm và linh kiện điện tử cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  36
Điện áp, dòng điện và điện trở . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  36
Tụ điện . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  39
Cuộn cảm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  40
Breadboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  41
Chớp tắt bóng LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  43
Kiến thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  43
Đấu nối . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  43
Mã nguồn chớp tắt dùng Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  45
Mã nguồn chớp tắt dùng định thời . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  45
Kiến thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46
Analog và Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  54
PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  55
Fade LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  56
Điều khiển LED RGB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  57
Giới thiệu module cảm biến ánh sáng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  61
Điều khiển LED RGB theo cường độ ánh sáng của môi trường . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  63
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  67
Truyền thông nối tiếp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  68
Giao tiếp Serial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  70
Những khái niệm cơ bản. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  70
Sử dụng chuẩn giao tiếp Serial với boad IoT Maker UnoX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  72
Ứng dụng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  73
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  86
Giao tiếp I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  87
Mô hình Master/slave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  88
Giao tiếp I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  89
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  89
Hoạt động . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  89
Truyền nhận bit trong I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  89
Sử dụng giao thức I2C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  90
Viết chương trình cho I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  91
Xác định địa chỉ của thiết bị trong giao tiếp I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  91
Giới thiệu về LCD và OLED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  95
Giao tiếp giữa 2 board IoT Maker UnoX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  100
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  104
Chuẩn giao tiếp truyền nhận dữ liệu SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  105
Giao thức SPI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  106
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  106
SPI, ưu và nhược điểm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  107
Nguyên lý hoạt động. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  108
SPI, các ví dụ mẫu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  109
Hiển thị chữ trên LED matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  109
Đọc dữ liệu từ cảm biến BMP280, hiển thị trên OLED. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  112
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  117
Chuẩn giao tiếp 1-Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  118
1-Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  119
1-Wire là gì? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  119
1-Wire hoạt động như thế nào? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  120
Tiến trình hoạt động (Workflow) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  121
Ví dụ chuẩn giao tiếp 1-Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  122
Một master và một slave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  122
Một master và nhiều slave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  127
Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  130
Timer - Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  131
Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  132
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  132
Ví dụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  134
Timer/Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  138
Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  138
Thư viện TimerOne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  139
Một số ví dụ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  140
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  151
Một số dự án tham khảo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  152
Điều khiển xe tự động bằng module Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  153
Cơ bản về ứng dụng điều khiển xe tự động . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  153
Mở đầu về điều khiển động cơ DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  154
Xe điều khiển từ xa với 4 động cơ DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  160
Điều khiển xe từ xa bằng Bluetooth . . . . . . . . . . . . . . . . . . ... 
Sử dụng giao thức I2C
Với các vi điều khiển, IC, cảm biến, có hỗ trợ chuẩn giao tiếp I2C thì sẽ có 2 chân có tên SCL và SDA,
tương ứng với 2 dây SCL, SDA cho giao tiếp I2C. Với board IoT Maker UnoX, chân A4 là chân SDA và
chân A5 là chân SCL, 2 chân A4, A5 này cũng được nối tới 2 chân SDA, SCL tương ứng ở header sử
dụng với OLED của board IoT Maker UnoX. Với các IC và vi điều khiển được sản xuất ngày nay đều có
hỗ trợ điện trở nội kéo lên do đó trong việc kết nối dây không cần thêm điện trở nội kéo lên. Với các
module hỗ trợ I2C chỉ có 1 tính năng như OLED SSD1306, LCD 1602 để hiển thị, Cảm biến AM2315 để
đọc nhiệt độ, độ ẩm của môi trường, thường hoạt động ở chế độ slave và có 4 chân: SDA, SCL, GND
và VCC.
Hình 76. Hình ảnh module sử dụng giao tiếp I2C (OLED-SSD1306)
90/188
IoT Maker Viet Nam
Viết chương trình cho I2C
Chương trình cho giao tiếp I2C giữa cảm biến và vi điều khiển thường cần thư viện thích hợp cho từng
loại vi điều khiển. Các cảm biến, thiết bị, sẽ đọc dữ liệu từ môi trường và gởi về cho vi điều khiển
cũng như vi điều khiển sẽ điều khiển các thiết bị thông qua giao tiếp I2C. Nhiều loại cảm biến, module
cần dùng thêm thư viện riêng cho việc đọc, hiển thị dữ liệu,
Một số chương trình có yêu cầu phải khai báo địa chỉ của thiết bị slave trong giao tiếp I2C thì việc
đọc, hiển thị dữ liệu mới thực hiện được. Khi đó, nảy sinh vấn đề phải xác định được địa chỉ của thiết
bị trong giao tiếp I2C. Địa chỉ này thường được cung cấp trong datasheet của thiết bị, hoặc có thể
xác định thông qua các chương trình đọc địa chỉ.
Để sử dụng thư viện I2C trong Arduino, người dùng cần gọi thư viện tích hợp sẵn trên trình
biên dịch Arduino IDE.
Xác định địa chỉ của thiết bị trong giao tiếp I2C
Như đã trình bày ở phần giới thiệu, mỗi thiết bị trong giao tiếp I2C sẽ có một địa chỉ riêng. Các địa chỉ
này sẽ được nhà sản xuất cung cấp trong datasheet của thiết bị. Ở phần này, chúng ta sẽ tìm hiểu
về chương trình xác định địa chỉ của một thiết bị trong giao tiếp I2C. Một số linh kiện có hỗ trợ I2C
nhưng người dùng khó tìm được datasheet chính thức từ nhà sản xuất thì việc dùng một chương trình
ngắn để định địa chỉ I2C là một việc làm đơn giản và cần thiết.
Yêu cầu
Xác định địa chỉ các thiết bị trong giao tiếp I2C và phát hiện số thiết bị có giao tiếp I2C trong kết nối
hiện tại.
Linh kiện cần dùng
• Board IoT Maker UnoX
• Module LCD 20x4
Source code
Arduino cho người mới bắt đầu 91/188
#include 
void setup()
{
  Wire.begin(); // Khởi tạo thư viện Wire
  Serial.begin(9600);
  while (!Serial); // Đợi Serial Monitor hiển thị
  Serial.println("I2C Scanner");
}
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  // Định địa chỉ I2C có 7 bit ứng với 128 thiết bị, việc quét sẽ tiến hành
  // từ 1 tới 127 (1 thiết bị làm master nên chỉ còn 127)
  for (address = 1; address < 127; address++ ) {
  Wire.beginTransmission(address);
  error = Wire.endTransmission();
  if (error == 0) {
  Serial.print("I2C device found at address 0x");
  if (address < 16)
  Serial.print("0");
  Serial.print(address, HEX);
  Serial.println(" !");
  nDevices++;
  Serial.println("Device no. " + String(nDevices));
  } else if (error == 4) {
  Serial.print("Unknown error at address 0x");
  if (address < 16)
  Serial.print("0");
  Serial.println(address, HEX);
  }
  }
  if (nDevices == 0)
  Serial.println("No I2C devices found\n");
  else
  Serial.println("number of devices " + String(nDevices));
  delay(5000); // Delay 5s cho quá trình scan tiếp theo
}
Với chương trình này, đầu tiên ta kiểm tra khi chỉ có 1 master - 1 slave với master là board IoT Maker
UnoX và slave là Module LCD 20x4 (các kiến thức cơ bản về hoạt động của LCD bạn đọc tham khảo ở
nội dung phần tiếp theo Giới thiệu về LCD và OLED).
Bảng 8. Bảng kết nối board IoT Maker UnoX với Module LCD 20x4
Module LCD20x4 IoT Maker UnoX
VCC 5V
GND GND
SDA A4
SCL A5
92/188
IoT Maker Viet Nam
Hình 77. Hình ảnh kết nối LCD 20X04 với board IoT Maker UnoX
Sau khi kết nối thành công, ta nạp chương trình trên vào board IoT Maker UnoX và kiểm tra kết quả.
Hình 78. Kết quả hiển thị địa chỉ I2C của LCD 20X04
Kết quả:
• Số thiết bị kết nối vào là 1 thiết bị.
• Slave có địa chỉ I2C là 0x3F, ta sẽ dùng địa chỉ này để khai báo trong những chương trình giao
tiếp I2C với module này.
Tiếp theo, ta xét việc định địa chỉ với chương trình trên khi trong giao tiếp I2C có ít nhất 2 thiết bị làm
slave. Kết nối board IoT Maker UnoX với LCD 20x04 và OLED SSD1306.
Bảng 9. Bảng kết nối board IoT Maker UnoX với OLED
OLED SSD1306 IoT Maker UnoX
VCC 5V
Arduino cho người mới bắt đầu 93/188
OLED SSD1306 IoT Maker UnoX
GND GND
SDA A4
SCL A5
Hình 79. Hình ảnh kết nối OLED với board IoT Maker UnoX
Kết nối song song các chân SCL, SDA, VCC, GND của các thiết bị slave và thiết bị master với nhau.
Sau khi kết nối thành công, nạp chương trình trên vào cho board IoT Maker UnoX.
Kết quả
Hình 80. Kết quả hiển thị địa chỉ I2C của LCD 20X04 và OLED SSD1306
Bạn đọc có thể sẽ đặt câu hỏi rằng: "Vậy việc định địa chỉ sẽ như thế nào khi trong giao tiếp I2C có 2
thiết bị giống nhau ?"
Để kiểm chứng việc này, ta sẽ kết nối 2 thiết bị giống hệt nhau trong giao tiếp I2C và nạp chương
trình trên. Kết quả nhận được sẽ là chương trình chỉ phát hiện được có 1 thiết bị kết nối vào, và trả về
94/188
IoT Maker Viet Nam
địa chỉ I2C duy nhất của thiết bị đó.
Một số module có các option để lựa chọn địa chỉ I2C thông qua việc setup phần
cứng, một số module cho phép người dùng có thể định lại địa chỉ I2C bằng phần
mềm, nếu không chúng ta có thể sử dụng các mạch I2C Multiplexer khi muốn
kết nối nhiều module có cùng địa chỉ I2C.
Giới thiệu về LCD và OLED
Giới thiệu về LCD
LCD là chữ viết tăt của Liquid Crystal Display, tiếng Việt có nghĩa là màn hình tinh thể lỏng, đây là
loại thiết bị để hiển thị nội dung, cấu tạo bởi các tế bào (cũng là các điểm ảnh) chứa các tinh thể lỏng
(liquid crystal) có khả năng thay đổi tính phân cực của ánh sáng và do đó thay đổi cường độ ánh
sáng truyền qua khi kết hợp với các kính lọc phân cực. LCD có ưu điểm là phẳng, cho hình ảnh sáng,
chân thật và tiết kiệm năng lượng.
Hình 81. Màn hình LCD 20x04
Các hãng sản xuất linh kiện ngày nay sản xuất nhiều module LCD hỗ trợ cho việc tương tác với các vi
điều khiển mà phổ biến nhất là 2 module LCD text 16x02 và LCD text 20x04. Các thông số 16x02 và
20x04 là số hàng và số cột tương ứng của các module, ví dụ với 16x02 cho biết module có 16 hàng và
2 cột, 20x04 là 20 hàng và 4 cột.
Như ở hình vẽ, các module có 16 chân để kết nối với chức năng mỗi chân:
• VSS: Tương đương với GND - cực âm.
• VDD: Tương đương với VCC - cực dương (5V).
Arduino cho người mới bắt đầu 95/188
• Constrast Voltage (Vo): Điều khiển độ sáng màn hình.
• Register Select (RS): Lựa chọn thanh ghi (RS=0 chọn thanh ghi lệnh, RS=1 chọn thanh ghi dữ
liệu).
• Read/Write (R/W): R/W=0 ghi dữ liệu , R/W=1 đọc dữ liệu.
• Enable pin: Cho phép ghi vào LCD.
• D0 - D7: 8 chân nhận dữ liệu.
• Backlight (Backlight Anode (+) và Backlight Cathode (-)): Tắt bật đèn màn hình LCD.
Để sử dụng module LCD, người dùng cần gọi thư viện LCD tích hợp sẵn trên trình
biên dịch Arduino IDE. Nếu không dùng thêm module nào, người dùng sẽ phải đấu nối 8 dây tín hiệu
và cần dùng thêm một biến trở để điều chỉnh độ sáng màn hình như hình mô phỏng bên dưới.
Hình 82. Hình ảnh mô phỏng kết nối dây với LCD
Để khắc phục nhược điểm đấu nối nhiều dây với module LCD thông thường, các nhà sản xuất đã tích
hợp thêm IC LCM1602 hỗ trợ giao tiếp I2C vào module LCD như hình vẽ, việc đấu nối cũng như nạp
chương trình từ đây sẽ trở nên đơn giản hơn.
Bảng 10. Bảng kết nối IoT Maker UnoX với IC LCM1602
LCM1602 IoT Maker UnoX
VCC 5V
GND GND
SDA A4
SCL A5
96/188
IoT Maker Viet Nam
Hình 83. Hình ảnh kết nối module LCD2004 với board IoT Maker UnoX
Chúng ta sẽ viết chương trình hiển thị ký tự lên màn hình LCD. Với module LCD có module I2C kèm
theo, chúng ta cần thêm thư viện LiquidCrystal_I2C và Wire.h.
Link download thư viện : Liquid Crystal I2C. Add thư viện sau khi download vào chương trình.
Yêu cầu
Chương trình hiển thị dòng chữ "IOT MAKER VIETNAM" và "Hello World" lên LCD trên 2 hàng
Source code
Arduino cho người mới bắt đầu 97/188
#include 
#include 
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Khởi tạo lcd 20x04 với 0x3F là địa chỉ của LCD
void setup()
{
  lcd.begin(); // Khởi tạo LCD
  lcd.backlight(); // Mở đèn nền của LCD
  lcd.setCursor(1,0); // Lệnh setCursor() tương tự như với thư viện LiquidCrystal
  lcd.print("IOT MAKER VIETNAM");
  lcd.setCursor(3,1);
  lcd.print("Hello, world!");
}
void loop()
{
  // Không làm gì cả
}
Giới thiệu về OLED
OLED là chữ viết tắt của Organic Light Emitting Diode), là loại màn hình hiển thị bao gồm một lớp vật
liệu hữu cơ với thành phần chính là carbon nằm giữa hai điện cực anode và cathode, nó sẽ tự động
phát sáng mỗi khi có dòng điện chạy qua. OLED sử dụng diode phát quang hữu cơ, chính vì thế OLED
không cần tới đèn nền chiếu sáng nên có kích thước nhỏ gọn cũng như tiết kiệm điện hơn so với các
loại LCD, độ sáng của OLED cũng tương đối tốt ở môi trường sáng tự nhiên.
OLED SSD1306
Hình 84. Hình ảnh màn hình OLED SSD1306
98/188
IoT Maker Viet Nam
OLED SSD1306 là loại OLED có màn hình loại nhỏ, kích thước tầm 0.96 inch cho tới 1.25 inch. OLED
SSD1306 hỗ trợ chuẩn giao tiếp I2C được sử dụng khá rộng rãi trong các sản phẩm điện tử. Tấm nền
của OLED được điều khiển bằng chip driver SSD1306. Về cơ bản, để OLED có thể hiển thị được các
thông tin mong muốn thì cần có thư viện hỗ trợ, cũng giống như khi làm việc với LCD. Tùy vào mỗi loại
vi điều khiển với kiến trúc phần cứng khác nhau mà sẽ có những thư viện OLED SSD1306 khác nhau
hỗ trợ, ví dụ như với các board dùng chip ESP8266 có thể sử dụng thư viện: ESP8266 OLED SSD1306,
với board IoT Maker UnoX (dùng chip ATmega328), thư viện OLED hỗ trợ được nhiều người sử dụng là
Adafruit SSD1306.
Để sử dụng được hoàn chỉnh tất cả các tính năng thư viện này bao gồm cả
những tính năng đồ họa, người dùng cần cài đặt thêm thư viện: Adafruit GFX
Library (thư viện hỗ trợ thêm các tính năng đồ họa).
Viết chương trình hiển thị thời gian lên màn hình OLED
Yêu cầu
Chương trình hiển thị thời gian từ lúc nạp chương trình vào board IoT Maker UnoX.
Đấu nối
Bảng 11. Kết nối IoT Maker UnoX với OLED
OLED IoT Maker UnoX
VCC 5V
GND GND
SDA A4
SCL A5
Hình 85. Hình ảnh kết nối OLED SSD1306 với board IoT Maker UnoX
Source code
Arduino cho người mới bắt đầu 99/188
#include 
#include 
#include 
#include 
#define OLED_RESET 4
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
Adafruit_SSD1306 display(OLED_RESET);
int time_run = 0;
void setup()
{
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Hello, world!");
  display.display();
  delay(2000);
  display.clearDisplay();
}
void loop()
{
  int hour_run, min_run, sec_run;
  delay(1000);
  time_run ++;
  hour_run = time_run / 3600;
  min_run = (time_run % 3600) / 60;
  sec_run = time_run % 60;
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println(String(hour_run) + ":" + String(min_run) + ":" + String(sec_run));
  display.display();
}
Ngoài ra, chúng ta cũng có thể tự tìm hiểu thêm các tính năng đồ họa của OLED với thư viện Adafruit
SSD1306 với các chương trình có sẵn trong phần Example của thư viện.
Giao tiếp giữa 2 board IoT Maker UnoX
Có nhiều cách để giao tiếp giữa các vi điều khiển với nhau như truyển nhận qua Serial như đã đề cập
ở chương 3. Phần này, chúng ta sẽ tìm hiểu cách giao tiếp giữa 2 board IoT Maker UnoX thông qua
chuẩn giao tiếp I2C.
Yêu cầu*
Board master điều khiển bật tắt LED trên thiết bị slave.
100/188
IoT Maker Viet Nam
Kết nối
Đầu tiên ta thực hiện việc kết nối giữa 2 board IoT Maker UnoX.
Bảng 12. Kết nối giữa Arduino
Master Slave
5V Vin
GND GND
A4 A4
A5 A5
Hình 86. Hình ảnh kết nối gĩưa 2 board IoT Maker UnoX
Ở đây, để thuận tiện ta có thể lấy ngõ ra 5V trên master để cấp nguồn cho slave, người dùng cũng
có thể cấp nguồn riêng cho thiết bị slave trong các ứng dụng thực tế tùy theo yêu cầu sử dụng.
Nạp các chương trình cho master và slave.
Source code cho master
Arduino cho người mới bắt đầu 101/188
// Master
#include 
void setup()
{
  Serial.begin(9600); // Khởi tạo giao tiếp I2C
  Wire.begin(); // Khởi tạo truyền nhận dữ liệu I2C
}
void loop()
{
  // Bắt đầu quá trình truyền dữ liệu trên Serial Monitor
  while (Serial.available()) {
  char c = Serial.read(); // Đọc dữ liệu từ serial nếu có và lưu vào biến c
  if (c == 'H') {
  Wire.beginTransmission(3); // Bắt đầu truyền đến slave với address la 3
  Wire.write('H'); // Truyền chữ H đến slave
  Wire.endTransmission(); // Kết thúc quá trình truyền
  } else if (c == 'L') {
  Wire.beginTransmission(3);
  Wire.write('L');
  Wire.endTransmission();
  }
  }
}
Source code cho slave
// Slave
#include 
#define pinLed 3 // Định nghĩa chân LED trên board Iotmaker Uno X
void setup()
{
  Wire.begin(3); // Khởi tạo giao tiếp I2C với địa chỉ của slave là 3
  Wire.onReceive(receiveEvent); // Đăng kí hàm receiveEvent sẽ được gọi khi nhận được dữ liệu
  pinMode(pinLed,OUTPUT);
  digitalWrite(pinLed,LOW);
}
void loop()
{
  // Không làm gì cả
}
void receiveEvent()
{
  while(Wire.available()) {
  char c = Wire.read(); // Lưu dữ liệu nhận được từ master vào biến c nếu có
  if(c == 'H') // So sánh dữ liệu nhận được và điều khiển LED
  digitalWrite(pinLed,HIGH);
  else if(c == 'L')
  digitalWrite(pinLed,LOW);
  }
}
Giải thích source code
I2C sử dụng việc định địa chỉ 7 bit tương ứng với 128 thiết bị kết nối. Trong Arduino, ta có thể định địa
chỉ cho slave bởi hàm Wire.begin(địa chỉ slave), khi đó, slave được khởi tạo một địa chỉ với địa chỉ nằm
trong khoảng từ 1 tới 127. Master sẽ truyền dữ liệu tới slave qua câu lệnh Wire.beginTransmission(địa
chỉ slave). Master thì không cần truyền địa chỉ.
102/188
IoT Maker Viet Nam
Kết quả
Sau khi nạp chương trình cho master và slave thành công, ta mở cửa số Serial Monitor ở board IoT
Maker UnoX master lên và gõ vào dòng Send kí tự H hoặc L tương ứng với các lệnh để bật và tắt LED
trên board IoT Maker UnoX slave.
Hình 87. Hình ảnh gởi dữ liệu trên Serial Monitor
Arduino cho người mới bắt đầu 103/188
Tổng kết
Qua phần này, chúng ta đã tìm hiểu được những khái niệm cơ bản về giao tiếp I2C, các kết nối giữa vi
điều và các IC sử dụng giao thức này, hiểu được cách xác định địa chỉ và tìm hiểu một số chương
trình cơ bản dùng giao thức này. Bạn đọc có thể tham khảo các ứng dụng mở rộng của giao thức này
với các module cảm biến gia tốc, thời gian thực, các module phối hợp chuẩn I2C và SPI, Tùy vào
những ứng dụng cụ thể mà người dùng sẽ phải lựa chọn những IC thích hợp dùng giao tiếp I2C.
104/188
IoT Maker Viet Nam

File đính kèm:

  • pdfarduino_cho_nguoi_moi_bat_dau_phan_1.pdf