You are on page 1of 9

THỰC TẬP CƠ SỞ VIETTEL TUẦN 1

Buổi 1_12/5/2022: Tìm hiểu datasheet của arduino UNO R3 và các chuẩn giao tiếp quan
trọng
I. Tìm hiểu về vi điều khiển Atmega328P

ATmega328P là một bộ vi điều khiển tiên tiến và nhiều tính năng. Nó là một trong
những vi điều khiển nổi tiếng của Atmel vì nó được sử dụng trong bo mạch arduino
UNO. Nó là một bộ vi điều khiển thuộc họ vi điều khiển megaMVR của Atmel.
1. Đặc tính / Thông số kỹ thuật của ATmega328P

Thiết kế hiệu suất cao


Tiêu thụ ít điện năng
Tổng số chân ngõ vào Analog là 6
Chứa 32 kilobyte bộ nhớ flash
Chứa 2 kilobyte SRAM: Static random-access memory(Bộ nhớ truy cập ngẫu nhiên tĩnh
hay RAM tĩnh), lưu giữ các bit dữ liệu trong bộ nhớ miễn là nguồn điện được cung cấp
đầy đủ
Chứa 1 kilobyte EEPROM
Tốc độ xung nhịp 16 megahertz
Nhiệt độ tối thiểu và tối đa -40 độ C đến 105 độ C.
Tổng số chân I / O kỹ thuật số là 14 chân
RISC tiên tiến
Khóa chức năng chương trình để bảo mật mã lập trình
Chứa tổng cộng ba bộ định thời, hai 8 bit và một 16 bit
Tổng số chân I / O là 23 chân
Tổng số kênh PWM là 6
Điện áp hoạt động tối thiểu và tối đa từ 1.8V DC đến 5.5V DC

2. Sơ đồ chân

STT
Mô tả Chức năng Mô tả chức năng
chân
Khi chân reset này ở mức thấp, bộ vi điều
1 PC6 reset
khiển và chương trình của nó sẽ được reset.
2 PD0 Chân kỹ thuật số (RX) Chân đầu vào cho giao tiếp nối tiếp
3 PD1 Chân kỹ thuật số (TX) Chân đầu ra cho giao tiếp nối tiếp
4 PD2 Chân kỹ thuật số Chân 4 được sử dụng làm ngắt ngoài 0
5 PD3 Chân kỹ thuật số (PWM) Chân 5 được sử dụng làm ngắt ngoài 1
Chân 6 được sử dụng cho nguồn bộ đếm
6 PD4 Chân kỹ thuật số
bên ngoài Timer0 (8 bit)
7 Vcc Điện áp dương Nguồn dương của hệ thống
8 GND Nối đất Nối đất của hệ thống
Chân này nối với một châncủa bộ dao động
9 XTAL Dao động tinh thể tinh thể để cung cấp xung nhịp bên ngoài
cho chip
Chân này nối với chân còn lại của bộ dao
10 XTAL Dao động tinh thể động tinh thể để cung cấp xung nhịp bên
ngoài cho chip
Chân 11 được sử dụng cho nguồn bộ đếm
11 PD5 Chân kỹ thuật số (PWM)
bên ngoài Timer1(16 bit)
12 PD6 Chân kỹ thuật số (PWM) Bộ so sánh analog dương i / ps
13 PD7 Chân kỹ thuật số  Bộ so sánh analog âm i / ps
14 PB0 Chân kỹ thuật số  Nguồn đầu vào bộ đếm hoặc bộ hẹn giờ
15 PB1 Chân kỹ thuật số(PWM) Bộ đếm hoặc bộ hẹn giờ so sánh khớp A
Chân này hoạt động như lựa chọn slave i /
16 PB2 Chân kỹ thuật số (PWM)
p.
Chân này được sử dụng làm đầu ra dữ liệu
17 PB3 Chân kỹ thuật số (PWM)
master và đầu vào dữ liệu slave cho SPI.
Chân này hoạt động như một đầu vào xung
18 PB4 Chân kỹ thuật số 
nhịp master và đầu ra xung nhịp slave.
Chân này hoạt động như một đầu ra xung
19 PB5 Chân kỹ thuật số nhịp master và đầu vào xung nhịp slave
cho SPI.
20 AVcc Điện áp dương Điện áp dương cho ADC (nguồn)
Điện áp tham chiếu analog cho ADC (Bộ
21 AREF Tham chiếu analog
chuyển đổi analog sang kỹ thuật số)
22 GND Nối đất Nối đất của hệ thống
23 PC0 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 0
24 PC1 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 1
25 PC2 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 2
26 PC3 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 3
Đầu vào analog giá trị kỹ thuật số kênh 4.
27 PC4 Đầu vào analog Chân này cũng có thể được sử dụng làm
kết nối giao diện nối tiếp cho dữ liệu.
Đầu vào analog giá trị kỹ thuật số kênh 5.
28 PC5 Đầu vào analog Chân này cũng được sử dụng như dòng
xung nhịp giao diện nối tiếp.
Chân này hoạt động như lựa chọn slave i /
16 PB2 Chân kỹ thuật số (PWM)
p.

3. Bổ sung
3.1. Cấu trúc hàm ngắt trong arduino (Chân 4 và 5)
attachInterrupt(thứ tự ngắt, tên chương trình con thực hiện ngắt, chế độ ngắt)
Thứ tự ngắt: có kiểu (int) (1/0)
Tên chương trình con thực hiện ngắt: khai báo một chương trình con, để khi sự kiện ngắt
xảy ra thì sẽ thực hiện chương trình con đó
Chế độ ngắt: khai báo kiểu ngắt, có 4 kiểu ngắt
+ LOW: ngắt mức thấp(thực hiện chương trình ngắt khi chương trình ngắt ở mức thấp
0V)
+ CHANGE: Khi chân ngắt có sự thay đổi, chương trình ngắt sẽ được thực hiện
+ RISING: Ngắt cạnh lên, thực hiện chương trình ngắt khi chân ngắt từ mức thấp lên
mức cao
+ FALLING: Ngắt cạnh lên, thực hiện chương trình ngắt khi chân ngắt từ mức mức cao
xuống mức thấp
detachInterrupt(pin): Tắt chương trình ngắt

II. Các chuẩn giao tiếp của Arduino

A. Chuẩn truyền thông SPI


1. Khái niệm cơ sở

SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao (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 )

SPI là một cách truyền song công toàn phần (full duplex: 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 còn được gọi là chuẩn truyền thông “4 dây”, bao gồm 4 đường giao tiếp:

SCK (Serial Clock): 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. 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

 DÒNG ĐỒNG BỘ

Truyền đồng bộ Truyền không đồng bộ


Các luồng dữ liệu ở chế độ song công  Các luồng dữ liệu ở chế độ bán
dưới dạng khối hoặc khung. Đồng bộ song công, 1 byte hoặc một ký tự tại
hóa giữa người gửi và người nhận là một thời điểm. Nó truyền dữ liệu
cần thiết để người gửi biết byte mới trong một dòng byte liên tục. Nói
bắt đầu từ đâu (vì không có khoảng chung, kích thước của một ký tự
cách giữa dữ liệu). Do đó, mỗi khối được gửi là 8 bit mà một bit chẵn lẻ
ký tự được gắn nhãn với các ký tự được thêm vào, tức là một bit bắt
đồng bộ hóa và thiết bị nhận sẽ thu đầu và một bit dừng cho tổng số là
thập dữ liệu cho đến khi một ký tự kết 10 bit. Sử dụng các bit chẵn lẻ để
thúc đặc biệt được xác định. cho người nhận biết cách diễn giải
dữ liệu. Các bit chẵn lẻ này được gọi
là các bit bắt đầu và dừng điều khiển
việc truyền tín hiệu

MISO (Master Input Slave Output)/ MOSI (Master Ouput Slave Input)

MISO : Sử dụng chip Master(Input)/ chip Slave(Output)

 MANG DỮ LIỆU TỪ CÁC THIẾT BỊ SPI VỀ ARDUINO

MOSI : Sử dụng chip Master(Output)/ chip Slave(Input)

 MANG DỮ LIỆU TỪ ARDUINO ĐẾN CÁC THIẾT BỊ SPI

MISO của Master và các Slaves được nối trực tiếp với nhau.. 

SS (Slave Select): SS là đường chọn Slave cần giao tiếp, trên các chip Slave đường SS
sẽ ở mức cao khi không 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.

 CHỌN THIẾT BỊ SPI CẦN LÀM VIỆC

Đối với arduino UNO R3, các chân giao tiếp theo đúng chuẩn SPI là: SS-10, MOSI-11,
MISO-12, SCK-13. Chúng ta có thể kiểm soát 1 hoặc nhiều thiết bị SPI.
Dữ liệu được truyền qua lại dữa 2 đường MISO và MOSI. Điều này chỉ thực hiện được
khi Dòng SS được thiết lập ở mức thấp LOW. Nói cách khác, để 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.

Sử dụng bất kỳ một chân digital nào trên arduino để cho dòng SS để giao tiếp với nhiều
thiết bị SPI cùng lúc

2. Gửi/nhận tín hiệu giữa arduino và các thiết bị SPI

Sử dụng thư viện SPI. có sẵn trong Arduino IDE (#include “SPI.h”)

Trong void setup (), khai báo pin(s) để sử dụng cho dòng SS và cài đặt chúng ở dạng
output (VD: pinMode(ss, OUTPUT);)
Kích hoạt giao tiếp SPI (VD: SPI.begin();)
Xác định cách thức truyền dữ liệu: SPI.setBitOrder(MSBFIRST);
SPI.setBitOrder(LSBFIRST);
Đưa dòng SS về mức thấp, gửi dữ liệu và đưa về mức cao
digitalWrite(SS, LOW);
SPI.Tranfer(value);
digitalWrite(SS, LOW);
Thư viện trog chương trình để sử dụng chức năng giao tiếp SPI
SPI.begin(): khởi tạo bus SPI và đặt chân SCK và MOSI thành LOW, chân SS thành
HIGH.
SPI.transfer(val): được sử dụng để giao tiếp đồng thời giữa các thiết bị Master và Slave.
SPI.attachInterrupt(handler): được sử dụng để nhận dữ liệu từ master trong slave và
được gọi trong slave.
SPI.setClockDivider(divider): thiết lập bộ chia xung nhịp SPI phù hợp với xung nhịp hệ
thống.

Buổi 2_13/5/2022: Giao tiếp SPI của arduino với các thiết bị
A. Giao tiếp SPI giữa 2 arduino bật tắt LED
Để thực hiện giao tiếp giữa 2 arduino, cần quy định cấu hình của 1 arduino làm master
và 1 arduino còn lại làm slave. Master sẽ truyền đi tín hiệu nếu người dùng nhấn nút nhấn
được kết nối với D2 của arduino SPI Slave Arduino nhận dữ liệu này và dựa trên dữ liệu
nhận được, đưa ra quyết định bật hoặc tắt đèn LED được kết nối với chân D4 của
Arduino.
Trước tiên, cần xác định được mã của thiết bị Master arduino SPI (Arduino 1)
1. Khai báo: Bao gồm việc sử dụng thư viện SPI và xác định các biến khác nhau. Các
biến push là các chân I/O kỹ thuật số Arduino nơi nút nhấn sẽ được kết nối và tùy thuộc
vào trạng thái của nó, dữ liệu sẽ được truyền đến slave. Biến LED là chân Arduino dựa
trên dữ liệu nhận được từ trạng thái đầu ra của slave sẽ được hiển thị.
#include<SPI.h>
#define push 2;
#define LED 4;
int x, value;
2. Thiết lập thiết bị
Serial.begin(x); // xuất một số thông tin từ Arduino ra màn hình máy tính hoặc có một
ứng dụng đang chạy trên máy tính sẽ mong đợi dữ liệu từ Arduino qua một cổng nối tiếp.
Hàm serial.begin() nằm bên trong hàm setup(). Tốc độ truyền x và tốc độ truyền được đặt
trên thiết bị nhận cần phải khớp với nhau để giao tiếp nối tiếp hoạt động.
pinMode(push, INPUT);
pinMode(LED, OUTPUT);
SPI.begin();
SPI. setClockDivider (SPI_CLOCK_DIV8);
DigitalWrite(SS, HIGH);// Xuất tín hiệu ra các chân digital
3. Thực hiện chương trình
Thao tác thực tế gửi và nhận lệnh
byte m_send, m_receive; // Khởi tạo 2 biến gửi và nhận tín hiệu
Value = digitalRead(push); // Đọc giá trị từ chân push HIGH/LOW và lưu vào biến
value
if(value == HIGH)
{
x=1;
}
else
{
x=0; }
digitalWrite(SS, LOW); // m_send = x;
m_receive= SPI.tranfer(m_send);
if(m_receive==1) // Tín hiệu nhận ở mức cao
{
digitalWrite(LED, HIGH); // Xuất tín hiệu mức cao ra chân LED
}
else
{
digitalWrite(LED, LOW); // Xuất tín hiệu mức thấp ra chân LED
}
delay(s);} // Hàm dừng chương trình trong khoảng thời gian s giây, không có giá trị
trả về

Xác định mã của thiết bị Slave arduino SPI


1. Khai báo
#include<SPI.h>;
#define inputbutton 2; // Chân kỹ thuật số arduino nơi nút nhấn được kết nối và tùy
thuộc vào trạng thái cả nó, dữ liệu sẽ truyền đến master
#define outputLED 4; // Chân xuất tín hiệu ra trên arduino slave dựa trên dữ liệu nhận
được từ trạng thái đầu ra của master
volatile boolean received; // Giá trị của biến được khai báo có thể bị tác động bởi các
yếu tố nằm ngoài sự kiểm soát của chương trình đang chạy, nói đơn giản hơn là giá trị
của biến thay đổi một cách không xác định
volatile byte Salvereceived, Slavesend;
int buttonvalue;
int x;
2. Thiết lập thiết bị
Serial.begin(x);
pinMode(inputbutton, INPUT);
pinMode(outputLED, OUTPUT);
pinMode(MISO, OUTPUT); // MISO gửi dữ liệu đến Master IN nên dữ liệu được gửi
qua MISO của Slave arduino
SPCR | = _BV (SPE); // Bật chế độ slave bằng cách sử dụng đăng ký điều khiển SPI
SPI.attachInterrupt(); // Bật ngắt cho giao tiếp SPI, nếu nhận được 1 dữ liệu từ master,
hàm ngắt được gọi thì giá trị nhận được sẽ lấy từ SPDR(thanh ghi dữ liệu SPI)
ISR(SPI_STC_vect)// Giá trị từ master được lấy từ thanh ghi dữ liệu SPI và được lưu
vào biến Slavereceived, điều này được thực hiện trong chương trình ngắt sau
{
Slavereceived = SPDR;
Received = true;}
// Vòng lặp thực hiện chương trình ON/OFF LED trên arduino slave phụ thuộc và giá trị
của biến Slavereceived
if(Slavereceived == 1)
{
digitalWrite(outputLED, HIGH);
Serial.println(“Slave LED ON”);
}
else
{
digitalWrite(outputLED, LOW);
Serial.println(“Slave LED OFF”);
}
buttonvalue = digitalWrite(inputbutton);
if(buttonvalue == HIGH)
{
x=1;

}
else
{
x=0;
}

You might also like