This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions..

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions..

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions..

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions..

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions..

Thứ Tư, 21 tháng 10, 2015

GIỚI THIỆU VỀ SPI MỀM

GIỚI THIỆU VỀ SPI MỀM


Bài viết hôm nay tôi sẽ gii thiu ti các bn mt chun truyn thông khá ph biến và thông dụng trong lĩnh vực lập trình nhúng. Nó được ng dng rộng rãi trên hu hết các dòng chip. Đó là chun truyn thông SPI. Bài viết được tôi chia làm 3 phần chính. Đầu tiên tôi sẽ giới thiệu về giao thức SPI. Tiếp theo tôi sẽ giới thiệu một các tiếp cận mới trên chuẩn SPI là “SPI mềm” và cuối cùng tôi sẽ đưa ra một ví dụ để các bạn tiện theo dõi.

I. Vậy SPI là gì?
1. Trưc hết chúng ta cùng tìm hiu 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 chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Hình 1 thể hiện một kết SPI giữa một chip Master và 3 chip Slave thông qua 4 đường.
SCK: 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 truyề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: 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: 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: 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 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.
Hình 1. Chuẩn truyền thông SPI
Đôi khi chuẩn SPI được sử dụng chỉ để ghi dữ liệu từ Master ra Slaver thì chân MISO sẽ không được dùng.
2. Cơ chế hoạt động: mỗi chip Master hay Slave có một thanh ghi dữ liệu 8 bits. Cứ mỗi xung nhịp do Master tạo ra trên đường giữ nhịp SCK, một bit trong thanh ghi dữ liệu của Master được truyền qua Slave trên đường MOSI, đồng thời một bit trong thanh ghi dữ liệu của chip Slave cũng được truyền qua Master trên đường MISO. Do 2 gói dữ liệu trên 2 chip được gởi qua lại đồng thời nên quá trình truyền dữ liệu này được gọi là “song công”. Hình 2 mô tả quá trình truyền 1 gói dữ liệu thực hiện bởi module SPI trong AVR, bên trái là chip Master và bên phải là Slave.
Hình 2. Truyền dữ liệu SPI

3. Các chế độ hoạt động
- Cực của xung giữ nhịp (Clock Polarity): được gọi tắt là CPOL là khái niệm dùng chỉ trạng thái của chân SCK ở trạng thái nghỉ. Ở trạng thái nghỉ (Idle), chân SCK có thể được giữ ở mức cao (CPOL=1) hoặc thấp (CPOL=0).
- Phase (CPHA): dùng để chỉ cách mà dữ liệu được lấy mẫu (sample) theo xung giữ nhịp. Dữ liệu có thể được lấy mẫu ở cạnh lên của SCK (CPHA=0) hoặc cạnh xuống (CPHA=1).
Sự kết hợp của SPOL và CPHA làm nên 4 chế độ hoạt động của SPI. Nhìn chung việc chọn 1 trong 4 chế độ này không ảnh hưởng đến chất lượng truyền thông mà chỉ cốt sao cho có sự tương thích giữa Master và Slave. Khi giao tiếp vi điều khiển giữa các ic khác các bạn phải chú ý xem ic đó hoạt động ở chế độ nào mà cấu hình vi điều khiển cho phù hợp

CPHA=0
CPHA=1

Hình 3. Các chế độ hoạt động của SPI

2. Khái niệm về “SPI mm”?
     Trên mỗi dòng vi điều khiển khác nhau module SPI sẽ được tích hợp, điều khiển bởi các thanh ghi,phần cứng, IO khác nhau, đấy gọi là SPI cứng (hardware SPI). Như vậy bản chất chuẩn truyền thông SPI giống nhau trên mỗi chip nhưng lại được cài đặt và sử dụng không giống nhau. Điều này gây thêm phiền toái cho người sử dụng khi bạn bắt đầu tìm hiểu một dòng vi điều khiển mới, bạn sẽ phải nhớ các chân MISO, SS, MOSI, SCK mỗi chip khác nhau, nhớ các thanh ghi, các chế độ hoạt động và cách cài đặt trên các dòng vi điều khiển khác nhau. Có cách nào khắc phục điều này không?
Để khắc phục nhược điểm trên tôi xin giới thiệu một cách lập trình giả lập SPI cứng đó là “SPI mềm”. Thực chất SPI mềm là cách “bắt trước” bằng cách tạo ra một giao thức truyền thông giống SPI nhưng chỉ sử dụng các cổng vào ra của vi điều khiển. Như vậy chỉ với việc điều khiển GPIO của chip bạn hoàn toàn có thể thực hiện giao thức SPI. Điều này cũng có nghĩa bạn có thể sử dụng giao thức này trên bất kì vi điều khiển nào mà không cần phải nhớ thanh ghi hay các chân phần cứng.


3. Ví dụ về cách sử dụng SPI mềm
Sau đây tôi xin trình bày một cách chi tiết việc sử dụng SPI mềm trên một ví dụ để các bạn cùng tham khảo:

Hình 4. Sơ đồ nguyên lý ghép nối ATMEGA 16 và MCP41010


                        
Trên hình chip ATMEGA 16 được sử dụng như một master, còn MCP41010 là slaver. Chip MCP41010 thực chất là một DAC 8 bits giao tiếp bằng chuẩn SPI. Đầu vào là 1 số 8 bits và đầu ra là mức điện áp tương ứng trên chân PW0 (chân số 6).
·       Chân số 1: CS (chip select) tương ứng chân SS(trong chuẩn SPI) đã được giới thiệu ở trên, chip thực hiện việc giao tiếp với Master khi chân này ở mức logic 0.
·       Chân số 2 là chân SCK giữ nhịp cho đường truyền.
·       Chân số 3 SI (slaver input) là chân dữ liệu truyền từ Master sang Slaver(Giống chân MOSI), dữ liệu từ MCP41010 không phản hồi ngược lại vi điều khiển nên không có chân MISO.
·       Chân PA0 (chân 5) được sử dụng làm điện áp tham chiếu đầu ra. Chip  MCP41010 thực chất là bộ chuyển đổi DAC 8 bits, đầu vào là giá trị số có giá trị từ 0-255(tương ứng 8 bits) gọi là Vin, và đầu ra cho mức điện áp tương ứng 0V-Vref(điện áp tham khảo trên chân PA0). Điện áp ta thu được trên chân PW0 được tính theo công thức:
Vra=Vin/255*Vref; Vref ở đây là giá trị điện áp tham chiếu được sử dụng trên chân PA0 (có giá trị Vref=2.7-5.5V);
·       Chi tiết chip MCP41010 tham khảo datasheet tại: http://www.allMOSIsheet.com/MOSIsheet-pdf/pdf/91948/MICROCHIP/MCP41010.html

Bước đầu tiên ta định nghĩa cho 3 chân sử dụng trong chương trình:

#define SCK PORTC.0  // chân SCK
#define MOSI PORTC.1 // Chân MOSI
#define SS  PORTC.2  // Chân SS
#define MISO PORTC.3 // chân MISO trong bài không dùng tới
Khai báo các chương trình con được sử dụng trong chương trình

void SPI_init();// chương trình khởi tạo SPI
void clock();// chương trình tạo 1 xung clock
void send_byte(unsigned char MOSI);// chương trình gửi 1 byte từ ATMEGA 16 ra chip
unsigned char receiver_byte();// chương trình nhận về 1 byte MCP41010.

Sau đây chúng ta đi  tìm hiểu kĩ các hàm có trong chương trình.
Đầu tiên là hàm khởi tạo SPI:

void SPI_init()
{
DDRC=0xf7; // Cấu hình chân MOSI,SS, SCK là cổng ra và MISO là cổng vào
SCK=0;     // Đặt MCP41010 ở trạng thái chưa hoạt động
MOSI=0;
SS=1;
}

Hàm tạo xung clock.
void clock()
{
SCK=1;delay_us(5);
SCK=0;delay_us(5);
}

1 xung clock được phát ra thì 1 bits sẽ được gửi đi hoặc đọc về trên đường dữ liệu,tốc độ gửi hay đọc phụ thuộc vào thời gian phát 1 xung clock,các bạn sẽ tùy vào từng thông số từng chip khác nhau để thời gian delay_us(x) tương ứng.

Hàm gửi 1 byte từ ATMEGA 16 ra MCP41010
void send_byte(unsigned char data)
{
 unsigned int i=0,x=0;// byte cao có giá trị 0x11 là mã lệnh ghi vào chip của    MCP41010
 SS=0;// cho phép chip MCP 41010 hoạt động
 for(i=0;i<8;i++)// gửi ra 1 byte tương ứng 8 bits
 {
  x=data&0x80;// đưa bit cần truyền lên chân MOSI
  if (x>0) MOSI=1;
  else MOSI=0;
  clock();// phát 1 xung clock gửi dữ liệu đi
  data=data<<1;// dịch dữ liệu cần gửi lên 1 bits
 }   
 SS=1;//Đã gửi xong,đưa chân SS lên mức 1
}

Các bạn thấy đó thật sự giao tiếp qua SPI mềm chương trình cực kì đơn giản dễ thực hiện. Với chip MCP 41010 thì không có chiều dữ liệu từ Slaver tới Master tuy nhiên với những chip khác có chiều dữ liệu từ Slaver tới Matster thì hàm đọc dữ liệu vô cùng đơn giản:

unsigned char receiver_byte()// chương trình nhận về 1 byte
{
 unsigned char data=0x00,i=0;
 while(i<8)
   {
    data=data<<1;// dịch dữ liệu lên 1 bit
    data=data|MISO;//đọc chân MISO
    clock();// phát một xung clock để đọc bit tiếp theo
   }
  return data;// trả về dữ liệu đọc được
}

Mình sẽ thực hiện ví dụ tạo ra 1 điện áp nửa sin có biên độ 5V trên codevision
Trước khi thực hiện ví dụ các bạn khai báo thêm một số thư viện:


#include <mega16.h>
#include <math.h>
#include <delay.h>

unsigned int i=0;
unsigned char MOSI;
float h=(3.1415/50);// tạo ra một hình sin 50 bậc trên nửa chu kì

Cuối cùng ví dụ trong thân hàm main:

void main(void)
{
SPI_init();// Khởi tạo SPI
send_byte(0x00);// Xóa sạch đầu ra
delay_ms(20);
unsigned char data=0;
while (1)
     {
      for(i=0;i<50;i++)
        {
         data=(unsigned char)((5*sin(h*i))/5.0*255);// gửi ra giá trị điện áp   cần tạo ra
         send_byte(0x11);// đây là mã lệnh yêu cầu ghi giữ liệu vào MCP41010
         send_byte(data);// dữ liệu cần chuyển đổi
         delay_ms(30);
        }
      }
}

Các bạn đã tạo ra một điện áp nửa sin như hình.

Hình 5.Điện áp thu được từ DAC
Xin cám ơn các bạn đã theo dõi blog.

Thứ Hai, 19 tháng 10, 2015

GIỚI THIỆU VỀ XỬ LÝ ẢNH (IMAGE PROCESSING)

GIỚI THIỆU VỀ XỬ LÝ ẢNH

 (IMAGE PROCESSING)


     1.     Cái duyên “xử lý ảnh” đến với tôi như thế nào?

Ngày xưa khi học trong trường đại học Bách Khoa Hà Nội,tôi nghe loáng thoáng có cái khái niệm “xử lý ảnh” nhưng trong trong đầu hoàn toàn không có mường tượng gì về nó. Là dân điện tự động hóa tôi chỉ biết đến: điện tử, trang bị điện hay lý thuyết điều khiển. Cứ nghĩ “xử lý ảnh”là một cái gì đó đơn thuần như photoshop. Thế nhưng giờ đây tôi đang làm việc cho một công ty chuyên về xử lý ảnh. Vậy cơ duyên bắt đầu từ đâu. Tôi xin kể tiếp.
 Sang đại học năm thứ 3 tôi bắt đầu làm đồ án II với thầy giáo trong khoa có tiếng về xử lý tín hiệu nói chung và xử lý ảnh nói riêng ( nếu ai từng học khoa điện bách khoa chắc chắn sẽ từng nghe danh đến “người mà ai cũng biết đấy là ai” tôi đang nhắc tới). Nhưng cái đồ án tôi làm lại hoàn toàn chẳng liên quan gì đến xử lý ảnh cả =)).
Sau khi làm xong đồ án vì mến phong cách làm việc khoa học của thầy và cách chỉ bảo tận tình của thầy mà tôi muốn chọn chuyện lĩnh vực nghiên cứu của thầy để đi theo làm đồ án tốt nghiệp. Lúc bấy giờ tôi chọn xử lý ảnh. Cái duyên đến với lĩnh vực này của tôi bắt đầu từ đây.



     2.     Xử lý ảnh là gì
        Xử lý ảnh thực chất vì việc thực hiện các phép toán trên từng pixel của ảnh. Xử lý ảnh nhằm giải quyết các bài toán:
-               Đo lường đối tượng: Xác định vết nứt trên tường dựa vào ảnh chụp từ camera, đo lường kích cỡ chân ic, đo lường khoảng cách từ đối tượng đến camera, đo lường nhịp tim, nhiệt độ…
-               Bám đối tượng: Sử dụng máy bay không người lái để bám theo mục tiêu nào đấy, sử dụng camera để giám sát cảnh báo lái xe ngủ gật,
-               Nhận dạng: Nhận dạng biển số xe, nhận dạng mặt người, nhận dạng vân tay, nhận dạng chữ viết, nhận dạng đám cháy…
-               Phân loại: Phân loại sản phẩm theo màu sắc, kích cỡ; đánh giá chất lượng nông sản…
-               Xây dựng phần mềm xử lý ảnh chuyên nghiệp: photoshop, camera 360…
Ứng dụng xử lý ảnh hiện nay vô cùng phong phú đã có một ngành khoa học nghiên cứu về nó trên khắp thể giới “Thị giác máy tính” (Computer vision).

     3.     Để học xử lý ảnh bạn cần những gì?
           Đến đây chắc các bạn cũng lờ mờ đoán ra xử lý ảnh là gì. Nhưng để học xử lý ảnh các bạn cần những gì?
-             Theo tôi cái đầu tiên các bạn cần có là niềm đam mê và sự kiên trì bởi lẽ xử lý ảnh không phải là một thứ dễ học nhưng cũng không quá khó.
-             Laptop đương nhiên rồi, giờ hầu như sinh viên nào cũng có :)
-             Một số kiến thức cơ bản về lập trình C, thuật toán
-             Các công cụ thường dùng để lập trình xử lý ảnh
·       Thư viện image processing trong Matlab, thư viện này rất tốt cho bạn mới làm quen về xử lý ảnh. Bạn chỉ việc gọi hàm và matlab sẽ trả về kết quả của các hàm trong xử lý ảnh
·       Thư viện xử lý ảnh OpenCV và Visual Studio. Đây là thư viện xử lý ảnh mã nguồn mở do Intel phát triển trên ngôn ngữ C (OpenCV 1x) và C++ (OpenCV 2x). Nó có đầy đủ các hàm về xử lý ảnh và có cộng đồng sử dụng rất lớn. Bất cứ ai làm về xử lý ảnh cũng biết đến bộ thư viện đồ sộ này. Trong các bài hướng dẫn tiếp theo tôi sẽ hướng dẫn các bạn sử dụng thư viện xử lý ảnh này.
-             Một số cuốn sách kinh điển về xử lý ảnh: (tôi chưa tìm thấy quyển sách tiếng việt nào ứng ý về xử lý ảnh cả nên xin trích dẫn tên một số cuốn tiếng anh)
·     Christorpher M Bishop, “Pattern Recognition and Machine Learning”, Springer, 2006
·     Rafael C.Gonzalez, Richard E.Woods, “Digital Image Processing”, Pearson International Edition, 2000.
·     Mark S.Nixon, Alberto S.Aguado, “Feature Extraction and Image Processing”, Newnes, 2002.
·     Richard Szeliski, “Computer Vision: Algorithms and Applications”, Springer, 2010.

Ngoài ra còn một số website bạn có thể tham khảo :
·     http://docs.opencv.org/doc/tutorials/tutorials.html, http://opencv-srf.blogspot.com/ : hai trang này cung cấp rất nhiều bài viết hay về opencv
·     http://www.cvpapers.com/:  chọn lọc những bài báo khoa học hay nhất trao đổi tại các hội nghị về computer vision

Trên đây là những gì chung nhất về lĩnh vực này. Các bạn hãy chờ những bài viết tiếp theo của tôi nhé!

Chủ Nhật, 18 tháng 10, 2015

BẮT ĐẦU VỚI VI ĐIỀU KHIỂN STM32

BẮT ĐẦU VỚI VI ĐIỀU KHIỂN STM32 

Khi bắt đầu tìm hiểu về một dòng vi điều khiển mới chắc điều các bạn phải làm đầu tiên là viết một chương trình nháy led đơn giản với nó. Để làm được điều đấy các bạn cần phải biết mình sẽ sử dụng công cụ nào để lập trình và nạp chương trình xuống vi điều khiển. Bài viết sau đây tôi sẽ hướng dẫn các bạn các công cụ các bạn sẽ sử dụng để lập trình dòng vi điều khiển STM32. Ưu điểm lớn nhất của dòng vi điều khiển hãng này so với các hãng khác chắc hẳn các bạn đã biết là về giá thành.
KIT STM32F103C8T6
          

        -  Để lập trình với dòng vi điều khiển STM32 bạn có thể sử dụng IAR hoặc Keil C. Có lẽ với các bạn làm việc với hệ thống nhúng hai phần mềm này đã khá quen thuộc. Trong khuôn khổ bài viết này tôi sẽ hướng dẫn các bạn sử dụng phần mềm Keil C.Đầu tiên các bạn tải Keil C 4.x tại link sau:
http://www.mediafire.com/download/zs8pce23ux5yo6u/MDK_ARM_4.72_%26_HLP.rar
Chắc các bạn đã khá quen thuộc với phần mềm này. Nó được sử dụng để soạn thảo và dịch code sang mã hex. Nó khác với bản sử dụng cho dòng chip 8051 mà các bạn vẫn dùng. Đây là phiên bản sử dụng cho arm.
Sau khi cài đặt xong phần mềm,các bạn Crack nó bằng cách copy file trong thư mục “Rus_font_dll” đến đường dẫn vừa cài đặt và chạy file “FontSubstitutes”. Lúc này Keil C của bạn đã được crack và bạn có thể thoải mái code mà không bị giới hạn về dung lượng.
         - Tiếp theo để việc lập trình trên dòng STM32 được dễ dàng hơn bạn phải download thư viện CMSIS của hãng. Các bạn có thể tìm và download nó tại đây: http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031?sc=internet/mcu/subclass/1169.jsp
Thư viện này hỗ trợ các hàm để bạn không phải trực tiếp thao tác với các thanh ghi của arm. Sử dụng thư viện này sẽ giảm đi những phức tạp khi lập trình. Trong thư viện gốc có một số file không cần thiết nên tôi đã download về và giữ lại những file cần thiết tạo một thư viện riêng cho mình. Các bạn  có thể download thư viện của tôi tại link sau:
http://www.mediafire.com/download/78jju6b5gmzubzf/Mylib.rar
Trong thư viện của tôi được chia ra là 2 folder :
·        CMSIS: chứa các file chứa các hàm cấu hình nhân arm của vi điều khiển như, các file định nghĩa các thanh ghi…
·        STM32F10x_StdPeriph_Driver_a: thư mục này chứa thư viện ngoại vi của vi điều khiển bao gồm các file *.c và *.h phục vụ cho việc cấu hình: timer, ngắt, DMA, ngoại vi…
·        File “start-up”: Mỗi dòng arm sử dụng một file stm32 riêng. Con STM32F103C8T6 mà tôi sắp sửa hướng dẫn các bạn dưới đâu thuộc dòng stm32f103_md nên nó sử dụng file startup “startup_stm32f10x_md.s”
           - Phần mềm nạp chip: STM32 có hỗ trợ 2 chuẩn nạp của nhà sản xuất JTAG, SWD một số loại mạch nạp thông dụng như J-LINK, ST-LINK, U-LINK. Tùy vào loại mạch nạp bạn sử dụng mà bạn có thể nạp chịp trực tiếp từ Keil C hoặc phải dùng phần mềm khác. Tôi thường dùng mạch nạp ST-LINK 2 bởi vì nó rẻ hơn so với các mạch nạp còn lại (khoảng 150k) và nó có thể dùng chung cho dòng chip STM8.
Mạch nạp STM32



    Để dùng mạch nạp chip này bạn phải dụng thêm phần mềm sau:
·        Đầu tiên là driver cho mạch nạp: http://www.mediafire.com/download/3npz6mpbusb2qmn/st-link_v2_usbdriver.zip
·        Tiếp đến là phần mềm để nạp code: http://www.mediafire.com/download/hdqtwipujlilg0a/STM32_ST-LINK_Utility_v3.6.0.exe
Bên cạnh những chuẩn nạp chip mà nhà sản xuất hỗ trợ bạn có thể nạp chip bằng bootloader (tức nạp chip qua cổng UART) . Phương pháp này bạn chỉ cần thêm 1 mạch chuyển đổi USB to TTL 232 như hình sau:
Bộ chuyển đổi USB to TTL

Giá của nó trên thị trường khoảng 50k. Khi sử dụng phương pháp nạp chip này bạn cần thêm phần mềm:
http://www.mediafire.com/download/ccgr2czxkwaoavp/Flash_Loader_Demonstrator_v2.5.0_Setup.exe
Tuy nạp theo kiểu này giá thành rẻ nhưng việc nạp này rất mất thời gian vì bạn luôn phải chuyển đổi giữa hai chế độ nạp và chạy bằng cách thay đổi trạng thái trên hai chân BOOT 0 và BOOT 1 (trên các kit thường dùng switch để thay đổi giữa hai chế độ này). Hơn thế với trường hợp kích cỡ của code hơi lớn bạn sẽ cảm nhận được sự ì ạch khi nạp chip theo chuẩn này.
Như vậy bạn đã có đầy đủ các công cụ cần thiết để lập trình STM32. Hãy theo dõi blog và chờ những bài viết tiếp theo.

Thứ Năm, 8 tháng 10, 2015

MODULE BLUETOOTH HC-05 (PHẦN 2)

MODULE BLUETOOTH HC-05 (PHẦN 2)

1.Sơ đồ nguyên lý

Tôi sử dụng KIT Arduino Uno và nối chân như sơ đồ hình vẽ. Để thuận tiện tôi sử dụng luôn led trên mạch là Led ở trên Digital 13. Sở dĩ phải phải sử dụng hai điện trở trên hình vẽ là do Arduino hoạt động ở mức logic 5V còn HC-05 hoạt động ở mức logic 3.3V. Nên sử dụng hai điện trở để phân áp nhằm chuyển đổi mức logic 5V sang 3.3V (các bạn có thể nối trực tiếp của không sao, nhưng để module hoạt động ổn định và lâu dài thì nên có phương pháp chuyển đổi mức logic)





2. Lập trình

#define KEY 7
#define LED 13
bool ok;
String bf="";

void setup() 
{
  // Open serial communications and wait for port to open:
  pinMode(KEY,OUTPUT);
  digitalWrite(KEY,LOW);
  pinMode(LED,OUTPUT);
  digitalWrite(LED,HIGH);
  delay(3000);
  Serial.begin(9600);
  while (!Serial)
  {
  }
  // set the data rate for the SoftwareSerial port
  ok=configure_HC05();
}

void loop() // run over and over
{
  if (ok)
  {
    if (Serial.available()>0)
    {
      while (Serial.available())
      {
        char c=(char)(Serial.read());
        bf=bf+c;
        delay(10);
      }
    Serial.println(bf);
    if (Compare("LEDON",bf))
    digitalWrite(LED,HIGH);
    if (Compare("LEDOFF",bf))
    digitalWrite(LED,LOW);
    bf="";
    }
  }
}

bool Compare (String x,String a)
{
  int len_x=x.length();
  int len_a=a.length();
  int i,j;
   for (j=0;j<=len_a-len_x;j++)
   {
   for (i=0;i<len_x;i++)
    {
    if (x[i]!=a[i+j]) break;
    }
   if (i==len_x) return true;
   }
  return false;
}

bool configure_HC05()
{
  digitalWrite(KEY,HIGH);
  Serial.println("AT");
  delay(2000);
  if (!Serial.find("OK"))
  return false;
 
  Serial.println("AT+RMAAD");
   delay(2000);
  if (!Serial.find("OK"))
  return false;
 
  Serial.println("AT+PSWD=1234");
  delay(2000);
  if (!Serial.find("OK"))
  return false;
 
  Serial.println("AT+ROLE=0");
  delay(2000);
  if (!Serial.find("OK"))
  return false;
  digitalWrite(KEY,LOW);
  Serial.println("AT+RESET");
  delay(2000);
  if (!Serial.find("OK"))
  return false;
  delay(5000);
  Serial.println("Bluetooth Ready!");
  return true;
}

2. Mô tả Code
Trong code đầu tiên tôi sẽ chỉnh chân KEY lên mức logic cao sau đó sẽ tiến hành cấu hình nó như một SLAVE với tập lệnh sau:
·       AT+RMAAD
·       AT+PSWD=1234
·       AT+ROLE=0
Sau khi cấu hình sau ta đưa chân KEY lên mức logic cao và reset lại module với  lệnh
AT+RESET
Lúc này HC-05 của bạn đã chạy ở chế độ SLAVE và bạn đã hoàn tất bước cấu hình.

Sau đó module sẽ đợi lệnh bật tắt Led từ máy tính.
Sau khi cấu hình sau ta đưa chân KEY lên mức logic cao và reset lại module với  lệnh
AT+RESET
Lúc này HC-05 của bạn đã chạy ở chế độ SLAVE và bạn đã hoàn tất bước cấu hình.
Sau đó module sẽ đợi lệnh bật tắt Led từ máy tính.

3.Thiết lập kết nối giữa PC và HC-05
Sau khi cấu hình sau ta đưa chân KEY lên mức logic cao và reset lại module với  lệnh
AT+RESET
Lúc này HC-05 của bạn đã chạy ở chế độ SLAVE và bạn đã hoàn tất bước cấu hình.
Sau đó module sẽ đợi lệnh bật tắt Led từ máy tính.
Thiết lập kết nối giữa PC và HC-05
·       Bước 1:Sau khi nạp code vào vi điều khiển bạn hãy tiến hành kết nối HC-05 với Bluetooth trên máy tính
Sau khi PC và HC-05 đã được ghép nối ta sẽ thấy trong mục “ Device Manager” hiện thêm 2 cổng COM



·       Bước 2:Ta vào mục Bluetooth Setting để xem cổng nào là cổng “OutGoing” ta sẽ dùng cổng này để điều khiển đèn Led (trong trường hợp hình bên dưới là cổng COM 9)




·       Bước 3:Sử dụng Hercules để điều khiển cổng COM với lệnh:
               OFFLED: Tắt đèn LED
               ONLED: Bật đèn LED