[DE0-NANO] HC-05藍芽模組實現與測試(一)

本文使用友晶開發的RFS模組[1],此模組的特性如下:

RFS
  • Wi-Fi, using ESP-WROOM-02 module
  • Bluetooth SPP, using HC-05 module
  • 9-axis sensor: accelerometer,gyroscope,magnetometer
  • Ambient light sensor
  • Humidity and temperature sensor
  • UART to USB
  • 2x6 TMD GPIO Header 

本篇文章會注重在藍芽模組的控制。

此RFS_模組是使用HC-05晶片來做藍芽控制。

 

其中de0-nano對應RFS模組的腳位配置如下所示:

 1 //              LSENSOR_INT;    // GPIO_0_IN[0]  //              WIFI_RST_n;     // GPIO_0[0]
 2 //              MPU_INT;        // GPIO_0_IN[1]  //              RH_TEMP_I2C_SCL;// GPIO_0[1]
 3 //              RH_TEMP_DRDY_n; // GPIO_0[2]     //              RH_TEMP_I2C_SDA;// GPIO_0[3]
 4 //              MPU_FSYNC;      // GPIO_0[4]     //              LSENSOR_SCL;    // GPIO_0[5]
 5 //              BT_KEY;         // GPIO_0[6]     //              LSENSOR_SDA;    // GPIO_0[7]
 6 //              WIFI_EN;        // GPIO_0[8]     //              MPU_SCL_SCLK;   // GPIO_0[9]
 7 //              WIFI_UART1_RX;  // GPIO_0[10]    //              MPU_SDA_SDI;    // GPIO_0[11]
 8 //              WIFI_UART0_RX;  // GPIO_0[12]    //              WIFI_UART0_TX;  // GPIO_0[13]
 9 //              UART2USB_TX;    // GPIO_0[14]    //              UART2USB_RX;    // GPIO_0[15]
10 //              BT_UART_RX;     // GPIO_0[16]    //              BT_UART_TX;     // GPIO_0[17]
11 //              WIFI_UART0_CTS; // GPIO_0[18]    //              WIFI_UART0_RTS; // GPIO_0[19]
12 //              UART2USB_RTS;   // GPIO_0[20]    //              UART2USB_CTS;   // GPIO_0[21]
13 //              BT_UART_CTS;    // GPIO_0[22]    //              BT_UART_RTS;    // GPIO_0[23]
14 //              MPU_CS_n;       // GPIO_0[24]    //              MPU_AD0_SDO;    // GPIO_0[25]
15 //              TMD_D[2]        // GPIO_0[26]    //              TMD_D[3];       // GPIO_0[27]
16 //              TMD_D[1]        // GPIO_0[28]    //              TMD_D[0];       // GPIO_0[29]
17 //              TMD_D[7]        // GPIO_0[30]    //              TMD_D[6];       // GPIO_0[31]
18 //              TMD_D[5]        // GPIO_0[32]    //              TMD_D[4];       // GPIO_0[33]

 

 以下是參考友晶範例,修改成DE0-NANO版本。

  1 /*
  2     Tamkang University I.C.LAB.
  3 */
  4 
  5 // ============================================================================
  6 // Revision History:
  7 // ============================================================================
  8 //   Ver.: |Author:   |Mod. Date:    |Changes Made:
  9 //   V1.0  |Shih-An Li|09/01/2017    | HC-05 test
 10 // ============================================================================
 11 
 12 //=======================================================
 13 //  This code is generated by Terasic System Builder
 14 //=======================================================
 15 `default_nettype none
 16 module DE0_Nano(
 17 
 18     //////////// CLOCK //////////
 19     CLOCK_50,
 20 
 21     //////////// LED //////////
 22     LED,
 23 
 24     //////////// KEY //////////
 25     KEY,
 26 
 27     //////////// SW //////////
 28     SW,
 29 
 30     //////////// SDRAM //////////
 31     DRAM_ADDR,
 32     DRAM_BA,
 33     DRAM_CAS_N,
 34     DRAM_CKE,
 35     DRAM_CLK,
 36     DRAM_CS_N,
 37     DRAM_DQ,
 38     DRAM_DQM,
 39     DRAM_RAS_N,
 40     DRAM_WE_N,
 41 
 42     //////////// EPCS //////////
 43     EPCS_ASDO,
 44     EPCS_DATA0,
 45     EPCS_DCLK,
 46     EPCS_NCSO,
 47 
 48     //////////// Accelerometer and EEPROM //////////
 49     G_SENSOR_CS_N,
 50     G_SENSOR_INT,
 51     I2C_SCLK,
 52     I2C_SDAT,
 53 
 54     //////////// ADC //////////
 55     ADC_CS_N,
 56     ADC_SADDR,
 57     ADC_SCLK,
 58     ADC_SDAT,
 59 
 60     //////////// 2x13 GPIO Header //////////
 61     GPIO_2,
 62     GPIO_2_IN,
 63 
 64     //////////// GPIO_0, GPIO_0 connect to GPIO Default //////////
 65     GPIO_0,
 66     GPIO_0_IN,
 67 
 68     //////////// GPIO_1, GPIO_1 connect to GPIO Default //////////
 69     GPIO_1,
 70     GPIO_1_IN 
 71 );
 72 
 73 //=======================================================
 74 //  PARAMETER declarations
 75 //=======================================================
 76 
 77 
 78 //=======================================================
 79 //  PORT declarations
 80 //=======================================================
 81 
 82 //////////// CLOCK //////////
 83 input                       CLOCK_50;
 84 
 85 //////////// LED //////////
 86 output           [7:0]      LED;
 87 
 88 //////////// KEY //////////
 89 input            [1:0]      KEY;
 90 
 91 //////////// SW //////////
 92 input            [3:0]      SW;
 93 
 94 //////////// SDRAM //////////
 95 output          [12:0]      DRAM_ADDR;
 96 output           [1:0]      DRAM_BA;
 97 output                      DRAM_CAS_N;
 98 output                      DRAM_CKE;
 99 output                      DRAM_CLK;
100 output                      DRAM_CS_N;
101 inout           [15:0]      DRAM_DQ;
102 output           [1:0]      DRAM_DQM;
103 output                      DRAM_RAS_N;
104 output                      DRAM_WE_N;
105 
106 //////////// EPCS //////////
107 output                      EPCS_ASDO;
108 input                       EPCS_DATA0;
109 output                      EPCS_DCLK;
110 output                      EPCS_NCSO;
111 
112 //////////// Accelerometer and EEPROM //////////
113 output                      G_SENSOR_CS_N;
114 input                       G_SENSOR_INT;
115 output                      I2C_SCLK;
116 inout                       I2C_SDAT;
117 
118 //////////// ADC //////////
119 output                      ADC_CS_N;
120 output                      ADC_SADDR;
121 output                      ADC_SCLK;
122 input                       ADC_SDAT;
123 
124 //////////// 2x13 GPIO Header //////////
125 inout           [12:0]      GPIO_2;
126 input            [2:0]      GPIO_2_IN;
127 
128 //////////// GPIO_0, GPIO_0 connect to GPIO Default //////////
129 inout           [33:0]      GPIO_0;
130 input            [1:0]      GPIO_0_IN;
131 
132 //////////// GPIO_1, GPIO_1 connect to GPIO Default //////////
133 inout           [33:0]      GPIO_1;
134 input            [1:0]      GPIO_1_IN;
135 
136 
137 //=======================================================
138 //  REG/WIRE declarations
139 //=======================================================
140 //////////// GPIO, GPIO connect to RFS - RF and Sensor //////////
141 
142 
143 //              LSENSOR_INT;    // GPIO_0_IN[0]  //              WIFI_RST_n;     // GPIO_0[0]
144 //              MPU_INT;        // GPIO_0_IN[1]  //              RH_TEMP_I2C_SCL;// GPIO_0[1]
145 //              RH_TEMP_DRDY_n; // GPIO_0[2]     //              RH_TEMP_I2C_SDA;// GPIO_0[3]
146 //              MPU_FSYNC;      // GPIO_0[4]     //              LSENSOR_SCL;    // GPIO_0[5]
147 //              BT_KEY;         // GPIO_0[6]     //              LSENSOR_SDA;    // GPIO_0[7]
148 //              WIFI_EN;        // GPIO_0[8]     //              MPU_SCL_SCLK;   // GPIO_0[9]
149 //              WIFI_UART1_RX;  // GPIO_0[10]    //              MPU_SDA_SDI;    // GPIO_0[11]
150 //              WIFI_UART0_RX;  // GPIO_0[12]    //              WIFI_UART0_TX;  // GPIO_0[13]
151 //              UART2USB_TX;    // GPIO_0[14]    //              UART2USB_RX;    // GPIO_0[15]
152 //              BT_UART_RX;     // GPIO_0[16]    //              BT_UART_TX;     // GPIO_0[17]
153 //              WIFI_UART0_CTS; // GPIO_0[18]    //              WIFI_UART0_RTS; // GPIO_0[19]
154 //              UART2USB_RTS;   // GPIO_0[20]    //              UART2USB_CTS;   // GPIO_0[21]
155 //              BT_UART_CTS;    // GPIO_0[22]    //              BT_UART_RTS;    // GPIO_0[23]
156 //              MPU_CS_n;       // GPIO_0[24]    //              MPU_AD0_SDO;    // GPIO_0[25]
157 //              TMD_D[2]        // GPIO_0[26]    //              TMD_D[3];       // GPIO_0[27]
158 //              TMD_D[1]        // GPIO_0[28]    //              TMD_D[0];       // GPIO_0[29]
159 //              TMD_D[7]        // GPIO_0[30]    //              TMD_D[6];       // GPIO_0[31]
160 //              TMD_D[5]        // GPIO_0[32]    //              TMD_D[4];       // GPIO_0[33]
161 
162 
163     wire       RESET_N ; 
164     wire [7:0] BCD_T , BCD_H;  
165     wire [7:0] POWERUP ; 
166  
167 
168 reg [31:0]      rCnt1s;
169 reg             rLedg;
170 //=======================================================
171 //  Structural coding
172 //=======================================================
173 assign  LED[7] = rLedg;
174 always@(posedge CLOCK_50 or negedge RESET_N) begin
175     if(!RESET_N) begin
176         rCnt1s <= 0;
177         rLedg <= 0;
178     end
179     else begin
180         if(rCnt1s > 50000000) begin
181             rCnt1s <= 0;
182             rLedg <= ~rLedg;
183         end
184         else begin
185             rCnt1s <= rCnt1s+1;
186             rLedg <= rLedg;
187         end
188     end
189 end
190  
191     rfsqsys u0 (
192         .clk_clk                   (CLOCK_50),                   //                clk.clk
193         .reset_reset_n             (RESET_N),             //              reset.reset_n
194         .sdram_addr                (DRAM_ADDR),                //              sdram.addr
195         .sdram_ba                  (DRAM_BA),                  //                   .ba
196         .sdram_cas_n               (DRAM_CAS_N),               //                   .cas_n
197         .sdram_cke                 (DRAM_CKE),                 //                   .cke
198         .sdram_cs_n                (DRAM_CS_N),                //                   .cs_n
199         .sdram_dq                  (DRAM_DQ),                  //                   .dq
200         .sdram_dqm                 (DRAM_DQM),                 //                   .dqm
201         .sdram_ras_n               (DRAM_RAS_N),               //                   .ras_n
202         .sdram_we_n                (DRAM_WE_N),                //                   .we_n
203  
204         .ledg_export               (LED[6:0]),               //               ledg.export
205         .sw_export                 (SW),                 //                 sw.export
206         .dramclk_clk               (DRAM_CLK),               //            dramclk.clk
207         .altpll_0_areset_export    (0),    //    altpll_0_areset.export
208         
209         // PIO KEY
210         .pio_key_external_connection_export(KEY[1]),
211         .bt_key_external_connection_export(GPIO_0[6]),
212         //BT_UART
213         .hc_05_uart_rxd            (GPIO_0[16]),            //         hc_05_uart.rxd
214         .hc_05_uart_txd            (GPIO_0[17])             //                   .txd
215         
216 //        .altpll_0_locked_export    (1),    //    altpll_0_locked.export
217 //        .altpll_0_phasedone_export (1)  // altpll_0_phasedone.export
218     );
219  
220 //---- RESET ---
221 assign RESET_N = KEY[0];
222 
223 endmodule

 完整檔案請參考下面範例  DE0_Nano_RFSbrd_BT.zip

 操作環境是:

    Quartus 13.0sp1,

    Nios II eclipse 13.0sp1

系統架構如下:

我使用NiosII裡面的UART跟RFS版裡的HC-05溝通。

 

操作步驟如下:

1. 先把DE0-NANO電源線拔掉。

2. 按住RFS板上面的BT_KEY鈕不放,之後插上DE0-NANO的下載線,提供DE0-板子跟RFS板電源。

    (注意: 此時的BT板上的藍色LED燈會慢閃,此時會亮2秒暗2秒,表示HC-05進入了AT COMMAND模式,此時就可以放掉BT_KEY了)

3. 下載 \output\DE0_Nano.sof檔

4. 打開Nios II Eclipse,載入跟執行 \qsys\software\RFS_BT目錄下的檔案*.c跟\BT資料夾

5. 下載友晶提供的APP。

打開APP,點選右上角選項,打開手機藍芽裝置後等待DE0-NANO板連接。

 

5.執行NIOS並下載到DE0-NANO板結果如下:

按0會秀出0, 1,2 三個選項,我們選2。

Input 0 to show the menu:

0
 0: Show menu.
 1: BT Config.
 2: Enter BT SPP RFCOMM Master mode.
Input 0 to show the menu:

接續上圖

 

  1 Input 0 to show the menu:
  2 
  3 0
  4  0: Show menu.
  5  1: BT Config.
  6  2: Enter BT SPP RFCOMM Master mode.
  7 Input 0 to show the menu:
  8 
  9 2
 10  6: Enter BT SPP RFCOMM Master mode.
 11 HC-05 Master Demo
 12 TX-->AT+ORGL
 13 TX--> AT+ORGL
 14 
 15 RX<--OK
 16  
 17 TX-->AT+INIT
 18 TX--> AT+INIT
 19 
 20 RX<--OK
 21  
 22 TX-->AT+NAME=HC-05
 23 TX--> AT+NAME=HC-05
 24 
 25 RX<--OK
 26  
 27 TX-->AT+UART=115200,0,0
 28 TX--> AT+UART=115200,0,0
 29 
 30 RX<--OK
 31  
 32 TX-->AT+PSWD?
 33 TX--> AT+PSWD?
 34 
 35 RX<--+PSWD:1234
 36  
 37 RX<--OK
 38  
 39 TX-->AT+CLASS=0
 40 TX--> AT+CLASS=0
 41 
 42 RX<--OK
 43  
 44 TX-->AT+CLASS?
 45 TX--> AT+CLASS?
 46 
 47 RX<--+CLASS:0
 48  
 49 RX<--OK
 50  
 51 TX-->AT+ROLE=1
 52 TX--> AT+ROLE=1
 53 
 54 RX<--OK
 55  
 56 TX-->AT+POLAR=1,0
 57 TX--> AT+POLAR=1,0
 58 
 59 RX<--OK
 60  
 61 TX-->AT+INQM=1,9,48
 62 TX--> AT+INQM=1,9,48
 63 
 64 RX<--OK
 65  
 66 TX-->AT+INQ
 67 TX--> AT+INQ
 68 
 69 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 70 
 71 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBF
 72 
 73 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 74 
 75 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 76 
 77 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 78 
 79 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBF
 80 
 81 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 82 
 83 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBE
 84 
 85 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4
 86 
 87 RX<--OK
 88 
 89 Device[0]:1002,B5,AB9E55
 90 TX-->AT+RNAME?1002,B5,AB9E55
 91 TX--> AT+RNAME?1002,B5,AB9E55
 92 
 93 +RNAME:DESKTOP-GC2UFIB
 94 
 95 Device[1]:90E7,C4,4F1DA2
 96 TX-->AT+RNAME?90E7,C4,4F1DA2
 97 TX--> AT+RNAME?90E7,C4,4F1DA2
 98 
 99 +RNAME:DESKTOP-GC2UFIB
100 
101 Please input a number to select the desired device.
102 For example, input 0 to select first device.
103 
104 1
105 1
106 TX-->AT+PAIR=90E7,C4,4F1DA2,30
107 TX--> AT+PAIR=90E7,C4,4F1DA2,30
108 
109 RX<--+RNAME:lishyhan01
110  
111 RX<--OK
112  
113 TX-->AT+BIND=90E7,C4,4F1DA2
114 TX--> AT+BIND=90E7,C4,4F1DA2
115 
116 RX<--OK
117  
118 TX--> Hello World!
119 
120 RX<--0
121 RX<--1
122 RX<--2
123 RX<--3

 

在第89行和95行有找到2個藍芽元件,一個是我電腦的藍芽,一個是手機的藍芽。
我輸入1 讓DE0-NANO連接手機
當連接成功後 手機APP畫面會出現輸入BT配對碼視窗,預設密碼是1234
當手機輸入完後,APP左上角就會出現connect to HC-05成功訊息。
在APP畫面按LED0,LED1後會再NIOS console視窗出現第120~123行的訊息,表示成功。


 

 --------------------------HC-05燈號說明------------------------------------------------

1. 在尚未與裝置連線之前,HC-05板子上的LED將快速閃爍

2. 在與裝置連線成功後,HC-05板子上的LED將每三秒連閃兩次

3. 進入AT模式,LED將慢速閃爍(兩秒閃爍一次)

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

 完整範例檔案下載

DE0_Nano_RFSbrd_BT.zip

[1]  RFS module,

 

posted @ 2017-09-01 23:42  Harris_Li  阅读(937)  评论(0编辑  收藏  举报