NỘI DUNG BÁO CÁO5Phần 1: Giới thiệu51.1. Lịch thực tập tại công ty.51.2. Công ty cổ phần VSMARTTEK JSC.51.2.1. Giới thiệu chung về công ty.51.2.2. Lĩnh vực hoạt động chính.6Phần 2: Công việc được giao.62.1. Công việc chính.62.2. Các công việc chi tiết.7Phần 3: Thực hiện các công việc.83.1. Tìm hiểu lý thuyết.83.1.1. Tìm hiểu về chip CC3200 SimpleLink™ WiFi83.1.2. TIRTOS.83.2. Xây dựng lưu đồ thuật toán tổng quan đề tài.103.3. Lập trình các module.113.3.1. Nghiên cứu lập trình Touch cảm biến điều khiển thiết bị.133.3.2. Lập trình Socket điều khiển thiết bị qua wifi.163.3.4. Lập trình với tập tin hệ thống.223.4. Kết quả đề tài đạt được.233.4.1. Kết quả.233.4.2. Hướng phát triển.25Phần 4. Kết quả đạt được qua đợt thực tập.264.1. Kiến thức lý thuyết được củng cố.264.2. Kĩ năng thực hành học thêm.264.3. Kinh nghiệm thực tiễn tích lũy.26
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KỸ THUẬT MÁY TÍNH
-NGHIÊN CỨU LẬP TRÌNH NODE ĐIỀU KHIỂN THIẾT BỊ SỬ DỤNG TI-RTOS
BÁO CÁO THỰC TẬP DOANH NGHIỆP
SV thực hiện: Nguyễn Văn Bình
Thành phố Hồ Chí Minh – Năm 2016
Trang 2MỤC LỤC
NỘI DUNG BÁO CÁO 5
Phần 1: Giới thiệu 5
1.1 Lịch thực tập tại công ty 5
1.2 Công ty cổ phần VSMARTTEK JSC 5
1.2.1 Giới thiệu chung về công ty 5
1.2.2 Lĩnh vực hoạt động chính 6
Phần 2: Công việc được giao 6
2.1 Công việc chính 6
2.2 Các công việc chi tiết 7
Phần 3: Thực hiện các công việc 8
3.1 Tìm hiểu lý thuyết 8
3.1.1 Tìm hiểu về chip CC3200 SimpleLink™ Wi-Fi 8
3.1.2 TI-RTOS 8
3.2 Xây dựng lưu đồ thuật toán tổng quan đề tài 10
3.3 Lập trình các module 11
3.3.1 Nghiên cứu lập trình Touch cảm biến điều khiển thiết bị 13
3.3.2 Lập trình Socket điều khiển thiết bị qua wifi 16
3.3.4 Lập trình với tập tin hệ thống 22
3.4 Kết quả đề tài đạt được 23
3.4.1 Kết quả 23
3.4.2 Hướng phát triển 25
Phần 4 Kết quả đạt được qua đợt thực tập 26
4.1 Kiến thức lý thuyết được củng cố 26
4.2 Kĩ năng thực hành học thêm 26
4.3 Kinh nghiệm thực tiễn tích lũy 26
Trang 3NỘI DUNG BÁO CÁO
Phần 1: Giới thiệu
1.1 Lịch thực tập tại công ty
- Các ngày trong tuần: thứ 4, thứ 5, thứ 6
- Thời gian:
Sáng: 8h30 đến 11h30Chiều: 13h30 đến 17h30
- Ngoài ra còn có thể thực tập vào các ngày khác trong tuần tùy theo tiến độ côngviệc yêu cầu
1.2 Công ty cổ phần VSMARTTEK JSC
1.2.1 Giới thiệu chung về công ty
Công ty TNHH nghiên cứu và phát triển VSMARTTEK được thành lập từ năm
2013 bởi một nhóm cựu sinh viên trường Đại học Công Nghệ Thông Tin –ĐHQG TP.HCM với ý tưởng hiện thực hóa một giải pháp công nghệ nhà thôngminh có thể giúp cho mỗi gia đình Việt Nam có thể hưởng thụ những tiện ích docông nghệ mang lại trong cuộc sống thường nhật trong chính căn nhà của mìnhvới mức giá hợp lý nhất
Để duy trì những thành quả thu được trong giai đoạn nghiên cứu và phát triểnsản phẩm và tiếp tục phát triển công ty trong giai đoạn mới, kêu gọi được nhiềunhà đầu tư tiềm năng chung tay trong việc đưa những sản phẩm công nghệ củangười Việt Nam đến tay người tiêu dùng, tháng 4 năm 2016 công tyVSMARTTEK đã thay đổi mô hình hoạt động sang công ty cổ phần, mở thêmlĩnh vực hoạt động kinh doanh sản xuất Hiện nay công ty cổ phầnVSMARTTEK (VSMARTTEK JSC) là một doanh nghiệp hoạt động trong lĩnhvực IoT (Internet of Things – Vạn vật kết nối Internet), chuyên cung cấp cácgiải pháp công nghệ, thiết bị, dịch vụ kỹ thuật về nhà thông minh và điều khiển
tự động thông qua kết nối không dây
Trang 4Website công ty: vsmarttek.net
1.2.2 Lĩnh vực hoạt động chính
Công ty cổ phần VSMARTTEK tập trung phát triển theo lĩnh vực chính là hệthống nhà thông minh Hệ thống nhà thông minh VSMARTTEK cũng cung cấpcho người dùng các số liệu môi trường trong ngôi nhà như nhiệt độ, độ ẩm, chấtlượng không khí… để đảm bảo môi trường sống hợp lý nhất cho người dùng.Một điểm đáng chú ý khác của giải pháp nhà thông minh VSMARTTEK là hệthống giám sát an ninh bao gồm các camera, cảm biến di chuyển, cảm biến cửa
và các thiết bị khác cho phép người dùng phát hiện mọi nguy cơ an ninh tiềm
ẩn, từ đó đề ra những phương án bảo vệ và chống đột nhập thích hợp Tất cảnhững tiện ích trên đều được gói gọn trong phần mềm điều khiển trên các thiết
bị thông minh như điện thoại thông minh, máy tính bảng cho phép người dùngthao tác mọi lúc mọi nơi thông qua kết nối Internet
Phần 2: Công việc được giao.
2.1 Công việc chính
- Tên đề tài:
Nghiên cứu lập trình một node điều khiển thiết bị qua Wifi Node hoạt độngtheo như mô hình sau:
Trang 5 Device Node sẽ kết nối với Access Point qua chuẩn bảo mật WiFi Protected Access (WPA).
Khi thiết điều khiển ( laptop, máy tính bảng, smart phone) sẽ kết nối vớiAccess point gửi lệnh điều khiển tới Device Node thông qua giao thức truyềnthông UDP khi đó thiết bị (đèn, quạt,…) sẽ được điều khiển thực hiện chứcnăng theo lệnh điều khiển tương ứng
Device Node giống như 1 công tắc cớ điều khiển thiết bị thông thường
- Mục tiêu đề tài: lập trình firmware cho một node điều khiển thiết bị không dâyqua Wifi trên nền tảng hệ điều hành thời gian thực TI-RTOS
- Các chức năng chính của sản phẩm sau khi hoàn thiện:
Cho phép điều khiển thiết bị bằng tay tương tự như các công tắc thôngthường
Cho phép điều khiển thiết bị thông qua wifi nhờ giao thức UDP Phản hồi lạitrạng thái thiết bị cho người dùng
Lưu lại trạng thái của thiết bị vào bộ nhớ non-volatile và phục hồi lại trạngthái trước đó khi khởi động lại
Trang 62.2 Các công việc chi tiết.
- Tìm hiểu về module Wifi TI CC3200 và hệ điều hành thời gian thực TI-RTOS
- Tìm hiểu về các API TI-RTOS để phục vụ việc lập trình đa luồng
- Xây dựng lưu đồ giải thuật tổng quan
- Lập trình task thực hiện chức năng điều khiển bằng tay sử dụng cảm biến điệndung
- Lập trình các task liên quan UDP socket để phục vụ chức năng điều khiển từ xa
và phản hồi trạng thái qua Wifi
- Tìm hiểu về file system của module Wifi CC3200 và lập trình các chức nănglưu trữ và phục hồi trạng thái của node
Phần 3: Thực hiện các công việc.
3.1 Tìm hiểu lý thuyết
3.1.1 Tìm hiểu về chip CC3200 SimpleLink™ Wi-Fi
Hình 2: Chip CC3200 SimpleLink™ Wi-Fi
Chip Wireless MCU CC3200 là đơn chip cho vi điều khiển (MCU microcontroller unit ) kết nối Wifi do TI (Texas Instruments ) nghiên cứu vàphát triển
CC3200 SimpleLink™ Wi Fi là một MCU không dây tích hợp một hiệu cao ARM Cortex-M4 32bit-80HZ, 256KB RAM
3.1.2 TI-RTOS
- TI-RTOS là một hệ điều hành thời gian thực cho vi điều khiển TI (TexasInstruments )
Trang 7- TI-RTOS cho phép phát triển nhanh hơn bằng cách loại bỏ sự cần thiết chocác nhà phát triển để viết và duy trì hệ thống phần mềm như lập lịch( schedule ), giao thức ngăn xếp ( protocal stacks ) và trình điều khiển.
- Kết hợp thời gian thực hiện đa nhiệm giữa nhân ( kernel ) với các thành phầntrung gian như TCP/IP và ngăn xếp USB, tập tin hệ thống FAT và các thiết bịđiều khiển, cho phép đa dạng ứng dụng
- TI-RTOS cung cấp một nền tảng phần mềm nhúng phù hợp trên các thiết bị
vi điều khiển của TI, nên dễ dàng kế thừa ứng dụng trên các thiết bị mới
- Các thành phần của TI-RTOS:
TI-RTOS Kernel - SYS/BIOS: là một nhân (kernal) thời gian thực có khảnăng mở rộng Được thiết kế để hỗ trợ các ứng dụng đòi hỏi phải lập kếhoạch thời gian thực, đồng bộ hóa, thời gian thực đo lường Cung cấp độ
ưu tiên đa luồng, trừu tượng phần cứng, phân tích thời gian thực SYS /BIOS được thiết kế để giảm thiểu yêu cầu bộ nhớ và CPU
TI-RTOS Instrumentation - UIA: Các Instrumentation ArchitectureUnified (UIA) cung cấp mục tiêu nội dung hỗ trợ trong việc tạo ra và thuthập dữ liệu đo lường
TI-RTOS Networking - NDK: Network Developer's Kit (NDK) là nềntảng phát triển các ứng dụng mạng trên bộ xử lí nhúng của TI
TI-RTOS Network Services: Cung cấp giao thức các lớp ứng dụng mạngnhư là HTTP Client và SNTP Client
TI-RTOS File System: hỗ trợ tập tin hệ thống FAT
- Tìm hiểu API sử dụng TI-RTOS trên CC3200
Tìm hiểu lập trình Task trên CC3200 sử dụng flatform TI-RTOS
Hàm tạo task: OsiReturnVal_e osi_TaskCreate(){}
OsiReturnVal_e osi_TaskCreate(P_OSI_TASK_ENTRY pEntry,
const signed char*const pcName,unsigned short usStackDepth,
void *pvParameters,unsigned long uxPriority,
OsiTaskHandle *pTaskHandle);
Trang 8Tham số:
pcName: kiểu chuổi kí tự, Tên của Task
pvParameters: con trỏ đến cấu trúc để được thông qua các hàm Task.pTaskHandle: task sử lí thường mặc định là null
pEntry: con trỏ trỏ tới hàm Task để thực thi Task
uxPriorit: mức độ ưu tiên của task trong quá trình thực thi
usStackDepth: kích thước Stack Kiểu dữ liệu long 32-bit
Hàm xóa task: void osi_TaskDelete(OsiTaskHandle* pTaskHandle);Tham số: pTaskHandle là con trỏ trỏ tới task cần được xóa
Tìm hiểu API với Message Queue trên CC3200
Hàm tạo queue: OsiReturnVal_e osi_MsgQCreate (OsiMsgQ_t* pMsgQ,
char* pMsgQName, unsigned long MsgSize, unsigned long MaxMsgs);
Hàm ghi queue: OsiReturnVal_e osi_MsgQWrite (OsiMsgQ_t* pMsgQ,
void* pMsg , OsiTime_t Timeout);
Hàm đọc queue: OsiReturnVal_e osi_MsgQRead (OsiMsgQ_t* pMsgQ,
void* pMsg , OsiTime_t Timeout);
Hàm xóa queue: OsiReturnVal_e osi_MsgQDelete (OsiMsgQ_t*pMsgQ);
3.2 Xây dựng lưu đồ thuật toán tổng quan đề tài
- Device Node được lập trình theo lưu đồ
Trang 9Hình 2: Lưu đồ thuật toán tổng quan đề tài
- Giải thích lưu đồ:
B1: Bắt đầu
B2: Khởi board CC3200
B3: Khởi tạo Flatform TI-RTOS cho board CC3200
B4: Khởi tạo UART để debug
B5: Tạo Scheduler để lập lịch cho Task thực thi
B6: Kiểm tra tạo Scheduler cho task có thành công hay không Nếu thànhcông chuyển sang bước B7, ngược lại kết kết thúc chương trình
Trang 10B7: Tạo message queue cho task thực thi Nếu thành công chuyển qua bướctiếp theo B8, ngược lại kết thúc chương trình.
B8: Tạo task thực thi cho UDP Server
B9: Tạo task thực thi cho UDP Client
B10: Tạo task thực thi điều khiển thiết bị
B11: Bắt đầu task Scheduler Các task được thực thi riêng biệt
3.3 Lập trình các module
- Để chạy thử code trong quá trình phát triển, lập trình các module thì mộtboard CC3200 launchpad kết nối với 1 daughter board touch sensor được sửdụng
Hình 3: Board launchpad và daughter board touch sensor
- Sau khi đã kiểm thử các chức năng lập trình thì sẽ sử dụng một board thiết bị
do công ty cung cấp để chạy thử toàn bộ các chức năng
Trang 11Hình 4: Board thiết bị nạp code ( Device Node )
3.3.1 Nghiên cứu lập trình Touch cảm biến điều khiển thiết bị
- Để Device Node cho phép người dùng điều khiển thiết bị bằng cảm ứng điệndung Ta xây dựng lập trình module theo lưu đồ sau
Trang 12Hình 5: Lưu đồ lập trình Touch cảm biến
- Giải thích lưu đồ:
B1: Bắt đầu chương trình
B2: Kiểm tra Touch Sensor đã được hoạt động hay chưa Nếu TouchSensor đã hoạt động thực hiện bước B3, ngược lại tiếp tục kiểm tra TouchSensor
B3: Cấu hình Touch Sensor
B4: Kiểm tra Touch Sensor cấu hình có thành công hay không Nếu thànhcông chuyển sang bước B5, ngược lại trở lại cấu hình lại Touch Sensor B5: Đọc trạng thái đầu vào của Touch Sensor
B6: Kiểm tra Touch có thay đổi trạng thái hay không Nếu có sự thay đổithực hiện bước B7, ngược lại tiếp tục đọc trạng thái Touch
B7: Điều khiển thiết bị tương ứng
Trang 13- Module được thực thi trong hàm chính void ControlTouch(void) {} hàm sẽthực thi khởi tạo, cấu hình phần cứng cho Touch cảm biến diện dung, nhậntín hiệu cảm ứng đầu vào, điều khiển thiết bị nhờ lập trình API cho các IO
Sau khi Touch hoạt động cảm biến điện dung sẽ được cấu hình bởi hàm:
void ConfigTouchSensor(void){}
Tham số: không có tham số
Chức năng: Kích hoạt tính năng cảm biến đầu vào, vô hiệu hóa mạch đacảm ứng, thiết lập giá trị touch cấu hình thanh ghi mặc định, thay đổi độnhạy cảm ứng, vô hiệu hóa tỷ lệ lặp lại của cảm biến, thiết lập lại thanh ghitrạng thái, đặt lại trạng thái thanh ghi chung, đặt lại thanh ghi điều khiểnchính
Touch cảm ứng điện dung sẽ được khởi tạo sau khi Touch đã hoạt động:
void InitDevHardware(void){}
Tham số: không có tham số
Chức năng hàm: Gọi hàm ConfigTouchSensor() cấu hình cảm biến điện dung CAP1298 và hàm InitI2Cmastr() khởi tạo bus I2C trên CC3200 để
giao tiếp với các thiết bị I2C Slave để thiết lập cấu hình ban đầu cho touch.Gọi hàm khôi phục trạng thái của touch và thiết bị đã được lưu Thiết lậpcác kênh cảm biến đầu vào
- Trong module cảm biến diện dụng sẽ giao tiếp với CC3200 qua giao tiếpngoại vi I2C để nhận và truyền tín hiệu điều khiển đầu vào điều khiển thiết
bị Các hàm lập trình API với I2C là:
Hàm khởi tạo giao tiếp I2C: void InitI2CMastr(void){}
Tham số: không có tham số
Chức năng hàm: kích hoạt I2C clock, cấu hình chân truyền dữ liệu SDA,cấu hình chân giữ xung SLC, khởi tạo chế độ truyền dữ liệu ở mứcchuẩn100KHz hay ở chế độ 400KHz
Hàm mở kết nối thiết lập giao tiếp I2C với thiết bị ngoại vi
Trang 14int I2C_IF_Open ( unsigned long ulMode){}
Tham số:
ulMode: Chế độ truyền tín hiệu gồm 2 chế độI2C_MASTER_MODE_STD cho 100 Kbps chế độ tiêu chuẩn,I2C_MASTER_MODE_FST for 400 Kbps chế độ tốc độ
Hàm ghi dữ liệu cần truyền tới thiết bị (Slave)
int I2C_IF_Write(unsigned char ucDevAddr, unsigned char *pucData,
unsigned char ucLen, unsigned char ucStop){}
Tham số:
ucDevAddr: là 7-bit địa chỉ I2C Slave
*pucData: là con trỏ đến dữ liệu được ghi
ucLen: là độ dài của dữ liệu được ghi
ucStop: là bit cuối cùng để xác định dừng truyền dữ liệu
Hàm đọc dữ liệu từ thiết bị truyền (Master)
int I2C_IF_Read(unsigned char ucDevAddr, unsigned char *pucData,
unsigned char ucLen)
Tham số:
ucDevAddr: là 7-bit địa chỉ I2C Slave
*pucData: là con trỏ đến dữ liệu cần được đọc
ucLen: độ dài dữ liệu được đọc
Hàm đóng kết nối I2C với thiết bị ngoại vi: int I2C_IF_Close()
- Để hiển thị các trạng thái của thiết bị sử dụng lập trình trình API cho IO ledtrạng thái và switch out
void SetActuatorStatus(_u8 ucChanID, _u8 ucActualVal) {}
Tham số:
_u8 ucChanID: biến định danh các kênh touch cảm ứng điều khiển thiết bị
Trang 15_8 ucActualVal: là biến xác định giá trị của touch khi có thay đổi tươngứng đó là giá trị mà thiết bị được điều khiển.
Chức năng hàm: Xét giá trị trạng thái cho touch đầu vào khi có tác độngđiều khiển
unsigned char GetActuatorStatus(_u8 ucChanID) {}
Tham số: _u8 ucChanID: là biến định danh các kênh touch cảm ứng điều
_u8 ucLedStt: biến hiển thị led trạng thái
_u8 ucLedSttVal: biến lưu trạng thái của led
Chức năng hàm: xét trạng thái led cho từng kênh ( chân ) của touch cảmứng đầu vào khi có sự thay đổi
unsigned char GetLedStatus (_u8 ucLedStt) {}
Tham số: _u8 ucLedStt: biến hiển thị led trạng thái
Chức năng hàm: lấy giá trị trạng thái led từng kênh ( chân ) của touch cảmứng đầu vào khi có sự thay đổi trạng thái các kênh của touch
3.3.2 Lập trình Socket điều khiển thiết bị qua wifi
- Để điều khiển thiết bị qua wifi trên CC3200 có các hàm lập trình API cho UDP Socket
Hàm tạo Socket:_i16 sl_Socket(_i16 Domain, _i16 Type, _i16 Protocol);
Hàm gán địa chỉ cho UDP Sever:
_i16 sl_Bind(_i16 sd, const SlSockAddr_t *addr, _i16 addrlen);
Tham số:
sd: biến chứa Socket vừa được tạo
*addr: biến chứa địa chỉ của Socket
addrlen: chiều dài của địa chỉ Socket
Trang 16 Hàm phản hồi UDP Server cho UDP Client.
_i16 sl_RecvFrom(_i16 sd, void *buf, _i16 Len, _i16 flags, SlSockAddr_t
*from, SlSocklen_t *fromlen);
Tham số:
sd: biến chứa Socket cần thực thi
*buf: bộ đệm kiểu con trỏ chứa gói tin
Len: chiều dài bộ đệm
Flags: cờ chỉ định gói tin nhận, trong hàm này không sử dụng và mặc địnhbằng NULL
*from: con trỏ địa chỉ cần gửi phản hồi
*fromlen: con trỏ chiều dài địa chỉ cần gửi phản hồi
Hàm gửi gói tin
_i16 sl_SendTo(_i16 sd, const void *buf, _i16 Len, _i16 flags, const
SlSockAddr_t *to, SlSocklen_t tolen);
sd: biến chứa Socket cần thực thi
*buf: bộ đệm kiểu con trỏ chứa gói tin
Len: chiều dài bộ đệm
Flags: cờ chỉ định gói tin nhận, trong hàm này không sử dụng và mặc định làNULL
*to: con trỏ địa chỉ nhận gói tin (địa chỉ UDP Server)
*fromlen: con trỏ chiều dài địa chỉ nhận gói tin
Hàm đóng Socket: _i16 sl_Close(_i16 sd){}
- Device Node sẽ nhận gói tin điều khiển thông nhờ lập trình hàm thực thi UDP Server có lưu đồ giải thuật sau: