You are on page 1of 14

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ VIỄN THÔNG


---------------------

BÀI THÍ NGHIỆM MÔN HỌC


HỆ THỐNG NHÚNG VÀ
THIẾT KẾ GIAO TIẾP NHÚNG

Mã học phần : ET4361


Họ và tên sinh viên : Phùng Huy Hoàng
Mã số SV : 20172578
Lớp : 708421
Nhóm thí nghiệm :………………………
Ngày nộp báo cáo : 21/1/2022

HÀ NỘI, 2022

1
BÀI 1. PHÁT TRIỂN DEVICE DRIVER CHO I2C PORT
ĐIỀU KHIỂN ROBOT 2 BẬC TỰ DO
1.1. Báo cáo kết quả thí nghiệm
(Sinh viên mô tả các kịch bản, giải thích và có kèm hình chụp)
Kịch bản 1: Cánh tay robot gồm 2 servo, thay đổi góc quay bên dưới, vị trí
mong muốn cách vị trí ban đầu (90 độ)

Kịch bản 2: Thay đổi góc quay servo bên trên, từ vị trí ban đầu servo lần lượt di
chuyển 5 độ, tăng hoặc giảm dần cho đến khi đạt cực đại, đồng thời kết hợp với
kịch bản 1 để điều khiển cùng lúc 2 servo

1.2. Câu hỏi kiểm tra


• Biên dịch chéo (cross-compile) là gì? Tại sao cần phải biên dịch chéo mã nguồn
nói trên?
Biên dịch chéo là tạo ra thực thi mã cho một nền tảng khác so với cái mà trình
biên dịch đang chạy.
Mã nguồn nói trên được biên dịch để chạy trên Raspberry Pi 4 kiểu chip arm, trong khi
máy tính thí nghiệm kiểu x86, cho nên để biên dịch mã nguồn trên máy tính thí nghiệm
và chạy được nó trên raspberry pi 4 thì ta cần biên dịch chéo

• Bản chất của file device_driver.ko nói trên là:


a) file chương trình nhị phân (chọn đáp án a)
b) file thư viện
c) file đối tượng
d) file dữ liệu

● Giới thiệu ngắn gọn về giao tiếp I2C? Mô tả các bước khi truyền dữ liệu qua
giao tiếp I2C.
I2C là 1 giao thức giao tiếp nối tiếp đồng bộ được phát triển bởi Philips
Semiconductors, sử dụng để truyền nhận dữ liệu giữa các IC với nhau chỉ sử dụng
hai đường truyền tín hiệu.
Các bước khi truyền dữ liệu qua giao tiếp I2C là:
• Bước 1: Thiết bị Master sẽ gửi đi 1 xung Start bằng cách kéo lần lượt các
đường SDA, SCL từ mức 1 xuống 0.
• Bước 2: Master gửi đi 7 bit địa chỉ tới Slave muốn giao tiếp cùng với bit
Read/Write. Bước 3: Slave sẽ so sánh địa chỉ vật lý với địa chỉ vừa được gửi
tới. Nếu trùng khớp, Slave sẽ xác nhận bằng cách kéo đường SDA xuống 0 và
set bit ACK/NACK bằng ‘0’. Nếu không trùng khớp thì SDA và bit
ACK/NACK đều mặc định bằng ‘1’.
• Bước 4: Thiết bị Master sẽ gửi hoặc nhận khung bit dữ liệu. Nếu Master gửi đến Slave
thì bit Read/Write ở mức 0. Ngược lại nếu nhận thì bit này ở mức 1.
• Bước 5: Nếu như khung dữ liệu đã được truyền đi thành công, bit
ACK/NACK được set thành mức 0 để báo hiệu cho Master tiếp tục.
• Bước 6: Sau khi tất cả dữ liệu đã được gửi đến Slave thành công, Master sẽ phát
1 tín hiệu Stop để báo cho các Slave biết quá trình truyền đã kết thúc bằng các
chuyển lần lượt SCL, SDA từ mức 0 lên mức 1

● Nêu nguyên lý việc điều khiển động cơ dựa vào độ rộng xung PWM.
Điều chế độ rộng xung (PWM) là một kỹ thuật mà độ rộng của xung được thay đổi trong khi
vẫn giữ tần số không đổi. Tùy thuộc vào loại động cơ ta có chu kỳ quay là khác nhau, ví dụ để
điều khiển động cơ servo SG90 trong khoảng quay từ -90 ° đến +
90 °. Chúng ta cần tạo ra dạng sóng PWM 50Hz với sự thay đổi chu kỳ nhiệm vụ từ
~ 0,5ms đến ~ 2,4ms.

• Chỉ rõ các công việc chính mà Device Driver điều khiển giao tiếp I2C phải thực
hiện ?
o Tạo giao tiếp I2C giữa Raspberry Pi 4 và module động cơ
o Cài đặt xung PWM
o Cài đặt góc quay với kênh và góc quay động cơ
o Điều khiển xung PWM với góc quay tương ứng sang module động cơ
BÀI 2. KẾT NỐI RASPBERRY PI 4 VỚI BOARD MAIX
DOCK QUA GIAO TIẾP SPI
2.1. Báo cáo kết quả thí nghiệm
(Sinh viên mô tả các kịch bản, giải thích và có kèm hình chụp)
Kịch bản 1: Sinh viên làm theo hướng dẫn thí nghiệm, biên dịch file bin và nạp vào kit
MAIX DOCK. Kết quả hiển thị lên màn hình terminal của Raspberry Pi 4

Kịch bản 2: Sinh viên chỉnh sửa file code trong thư mục lcd_m và thực hiện biên dịch
đúng theo như hướng dẫn

Kịch bản 3: Sinh viên sau khi thực hiện viết chương trình cho LCD, tùy biến nội dung
hiển thị lên màn hình
2.2. Câu hỏi kiểm tra
Giải thích khái niệm GPIO?
GPIO là một chân tín hiệu kỹ thuật số trên mạch tích hợp mà hành vi của nó
(đầu vào hoặc đầu ra) được điều khiển bởi phần mềm ứng dụng. GPIO về cơ
bản là một chân có thể được cấu hình làm đầu vào hoặc đầu ra. Nếu chúng ta
cấu hình chân như một đầu ra, chúng ta có thể ghi 0 (LOW) hoặc 3,3 / 5 V
(VDD) vào chân đó. Khi được cấu hình làm đầu vào, chúng ta có thể đọc tín
hiệu trên chân đó. GPIO là giao diện tiêu chuẩn mà qua đó vi điều khiển có thể
giao tiếp với thế giới bên ngoài. Nó có thể được sử dụng để đọc các giá trị từ
cảm biến analog hoặc kỹ thuật số, điều khiển đèn LED, điều khiển đồng hồ cho
giao tiếp I2C.

Cách sử dụng/điều khiển qua các chân GPIO?


Các chân GPIO trong raspbery pi 4 gồm 40 chân với các chân thực hiện đuợc
chức năng với I2C, UART, SPI, PWM và các chân tín hiệu cho người sử dụng
tùy ý lập trình. Những chân này cho phép Pi nhận tín hiệu gửi bởi thiết bị được
kết nối với các chân này. Điện áp từ 1.8V đến 3.3V sẽ được đọc là mức cao,
thấp hơn 1.8 sẽ là mức thấp, theo đó tùy thuộc vào ý định sử dụng mà người
dùng sử dụng các chân GPIO.

So sánh ưu và nhược điểm của SPI so với I2C?


Ưu điểm:
SPI hỗ trợ truyền thông full-duplex tốc độ cao hơn trong khi I2C chậm
hơn SPI tiết kiệm năng lượng hơn I2C
Nhược điểm:
SPI yêu câù số lượng dây kết nối lớn hơn (4 dây), I2C (2 dây)
SPI chỉ hỗ trợ 1 thíết bị chính trên bus
SPI có khoảng cách truyền ngắn hơn I2C

Vẽ sơ đồ đấu nối các chân cổng hai thiết bị truyền thông với nhau bằng cổng
SPI. Mô tả các bước khi truyền dữ liệu qua giao thức SPI.
Khi truyền dữ liệu từ SPI Master sang SPI Slave:
Tại một cạnh lên hoặc xuống của tín hiệu SCLK, SPI Master tạo điện áp mức cao
hoặc thấp để biểu diễn 1 hoặc 0 trên đường MOSI. SPI Master sẽ duy trì điện áp này
trong một chu kỳ của SCLK trước khi chuyển sang một mức điện áp khác để gửi đi bit
tiếp theo trong chu kỳ SCLK kế tiếp.
SPI Slave nhận dữ liệu trên đường MOSI bằng cách lấy mẫu (sample) điện áp trên đường dây
này. Để thu được dữ liệu chính xác, SPI Slave phải lấy mẫu một bit dữ liệu trong khoảng thời gian từ
khi SPI Master setup bit đó đến trước khi SPI Master setup bit kế tiếp.

Device Driver điều khiển cổng SPI phải thực hiện những công việc gì để kết
nối thành công bo mạch ngoại vi MAIX Dock?
Với bài thí nghiệm, bo Raspberry Pi 4 đóng vai trò slave, MAIX Dock đóng vai trò master.
Hiện nay, trên raspberry Pi 4 chỉ có chức năng master cho giao tiếp SPI nên sử dụng cấu hình GPIO
cho cơ chế slave trên Pi 4. Các GPIO trên bo Pi 4 thực hiện chức năng thay thế cho các chân SCLK,
MOSI, MISO, SS tương ứng với các chân 21, 19, 23, 13, sau khi nhận tín hiệu từ MAIX Dock các chân
GPIO này thực hiện chức năng như một slave.
BÀI 3. PHÁT TRIỂN PHẦN MỀM NHÚNG THÔNG MINH VỚI
KIT MAXI DOCK

3.1. Báo cáo kết quả thí nghiệm


(Sinh viên mô tả các kịch bản, giải thích và có kèm hình chụp)
Kịch bản 1: Sinh viên chụp lại kết quả kiểm tra camera

Kịch bản 2: Sinh viên chụp lại kết quả đã phát hiện được gương mặt của mình để báo
cáo

Kịch bản 3: Sinh viên chụp lại thông báo có tự đề như yêu cầu hiện lên trong giao diện
Terminal của Raspberry Pi
3.2. Câu hỏi kiểm tra
So sánh 3 giao thức I2C, SPI và UART (về số lượng chân cần kết nối, về phương thức
truyền, tốc độ truyền, số lượng thiết bị, phân tích ưu nhược điểm của các giao thức và chỉ ra các giao thức này
phù hợp với những ứng dụng nào)

Đặc điểm UART SPI I2C

Sơ đồ kết nối đơn giản khác phức tạp khá đơn giản

Số lượng dây 2 dây (1 dây 4 dây (số lượng 2 dây


truyền & 1 dây nhận dây tăng khi số thiết
dữ liệu) bị tăng)

Chế độ truyền Full duplex Full duplex (Một Half duplex


(Không phân biệt master & nhiều slave) (Nhiều master &
master-slave) nhiều slave)

Tốc độ truyền Truyền không Truyền đồng bộ Truyền đồng


đồng bộ (Tốc độ tự (Tốc độ khoảng bộ(Hỗ trợ tốc độ
đặt, tối đa khoảng 10Mbps đến 20Mbps) 100kps, 400kps,
460kbps) 3.4Mbps, 1Mbps)

Khoảng cách 12m trên lý trên bo mạch trên bo mạch


thuyết

Số lượng thiết bị 2 thiết bị, giao số lượng hạn chế, lên đến 127 thiết
tiếp 1-1 giao tiếp bằng chân bị, giao tiếp bằng địa
chọn chip chỉ

Ứng dụng UART thường Các bộ chuyển dùng trong nhiều


được sử dụng trong đổi (ADC và DAC) kiến trúc điều khiển,
các bộ vi điều khiển Các loại bộ nhớ (SD như SMBus (System
cho các yêu cầu chính Card , MMC , Management Bus),
xác và chúng cũng có EEPROM , Flash) PMBus (Power
sẵn trong các thiết bị Các loại IC thời gian Management Bus),
liên lạc khác nhau thực Các loại cảm IPMI (Intelligent
như giao tiếp không biến (nhiệt độ, áp Platform
dây, thiết bị GPS, suất…) và một số loại Management
mô-đun Bluetooth khác như: bộ trộn tín Interface), DDC
hiệu, LCD, Graphic (Display Data
LCD, video game Channel) và ATCA
controlle (Advanced Telecom
Computing
Architecture)

Thuật toán nhận dạng khuôn mặt được thực hiện tại đâu? Tại bo mạch chủ RP4
hay khách (MAIX DOCK) hay cả trên 2 bo?
Thực hiện trên MAIX DOCK

Dữ liệu truyền thông qua lại với bo mạch Pi gồm những gì?
Gồm bản tin xác nhận đã nhận diện được khuôn mặt

Trong bài thí nghiệm, để truyền dữ liệu từ MAIX DOCK sang Raspberry Pi 4 cần
thực hiện những công đoạn gì?
• Thực hiện kết nối dây cho giao tiếp UART giữa 2 thiết bị
• Thực hiện chương trình gửi bản tin bên MAIX DOCK
• Thực hiện chương trình nhận bản tin bên RP4

Mô tả vắn tắt những đoạn mã trong chương trình Python xử lý nội dung video. Nêu rõ
công việc mà cac hàm trong đó thực hiện
"""
Khai báo các thư viện cần thiết cho bài thí nghiệm tại đây
"""
import sensor, image, lcd, time

import KPU as kpu

import gc, sys

from fpioa_manager import fm

"""
Sinh viên thực hiện cấu hình kết nối chân cho giao tiếp UART tại đây
cài đặt chân 10 là chân TX, chân 11 là RX
"""
fm.register(pin_tx, fm.fpioa.UART1_TX, force=True)
fm.register(pin_rx, fm.fpioa.UART1_RX, force=True)

from machine import UART


"""
Điền tham số baudrate tương ứng với kết nối UART

* uart = machine.UART(uart,baudrate,bits,parity,stop,timeout, read_buf_len)


* uart Số UART, sử dụng UART được chỉ định, có thể hoàn thành bằng cách nhấn phím tab
trong machine.UART.
* baudrate: Tốc độ truyền UART (9600)
* bits: Độ rộng dữ liệu UART, hỗ trợ 5/6/7/8(cổng nối tiếp mặc định được sử dụng bởi
REPL (UARTHS) chỉ hỗ trợ chế độ 8 bit), mặc định 8
* parity: Parity bit, hỗ trợ None, machine.UART.PARITY_ODD,
machine.UART.PARITY_EVEN(các cổng nối tiếp mặc định (UARTHS) được sử dụng bởi
REPL chỉ hỗ trợ None), mặc định là None
* stop: Stop bit, hỗ trợ 1, 1.5, 2, mặc định 1
* timeout: Thời gian chờ nhận cổng nối tiếp
* read_buf_len: bộ đệm nhận cổng nối tiếp, cổng nối tiếp nhận dữ liệu thông qua ngắt, nếu
bộ đệm đầy sẽ tự động ngừng nhận dữ liệu

"""
uart_A = UART(UART.UART1, baudrate, bits, 1, 0, timeout=1000,
read_buf_len=4096)

time.sleep_ms(100) # wait uart ready

"""
Sinh viên thực hiện lập trình hiển thị lcd
"""
def lcd_show_except(e):

import uio

err_str = uio.StringIO()
sys.print_exception(e, err_str)

err_str = err_str.getvalue()
"""
Điền kích thước ảnh w x h
"""
img = image.Image(size=(w,h))
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)

def main(model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False,


sensor_vflip=False):
try:
sensor.reset()
except Exception as e:
raise Exception("sensor reset fail, please check hardware
connection, or hardware damaged! err: {}".format(e))
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.set_vflip(1)
sensor.run(1)
"""
Sinh viên khởi tạo các thông số liên quan đến hiển thị lcd dưới đây
* lcd.init() Khởi tạo LCD hiển thị màn hình
* lcd.rotation() Đặt LCD hướng màn hình
* lcd.clear() Xóa màn hình LCD thành màu đen hoặc màu được chỉ định.
"""
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
"""
kpu.init_yolo2 (task, 0.5, 0.3, 5, anchor)
args đầu vào:
* kpu_net: kpu net obj
* threshold: prop gate
* nms_value: box_iou gate
* anchor_num: anchor number
* anchor: anchor args
"""
anchors = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658,
5.155437, 6.92275, 6.718375, 9.01025)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:
[0,1], nms_value: [0, 1] while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
"""
Thay đổi bản tin gửi từ kit maix tới raspberry pi 4 theo yêu cầu của bài hướng
dẫn
"""
img.draw_rectangle(obj.rect())
uart_A.write(b'Da phat hien guong mat sinh vien
Phung Huy Hoang - 20172578 - Khoa K62\n')
break
"""
Sinh viên được yêu cầu hiển thị ra màn hình lcd của kit maix thông tin số lần nhận
diện được khuôn mặt
"""
img.draw_string(0, 200, "t:%dms" %(t), scale=2)
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is
None:
kpu.deinit(task)

You might also like