在NUC472開發(fā)板上配有Arduino接口,若以該接口與機智云的功能板相配合,則可以有效地拓展該開發(fā)板的功能。就目前來講,對機智云功能板提供支持的核心底板有兩種,一種是基于STM32F103的,另一種則是基于ATMEGA328的。以NUC472開發(fā)板來支持機智云功能板則可以增加一種對其進行支持的核心底板。 就機智云功能板來說,它提供了RGB_LED、小電機、紅外感應(yīng)器、小按鍵、溫濕度傳感器、WIFI模塊及OLED接口等,如圖1所示。這里僅對RGB_LED、小電機、紅外感應(yīng)、小按鍵及OLED接口的使用加以介紹。此外,配合片內(nèi)的RTC、UART、A/D等資源,還實現(xiàn)了RTC電子時鐘、串行通訊及A/D采集等功能。
要對機智云功能板進行編程,主要涉及各引腳的關(guān)系構(gòu)建、GPIO口輸入/輸出功能的設(shè)置及高低電平輸出語句的定義、輸入電平的讀取與判別、脈沖信號與時序的模擬等。為了便于理解,這里按由簡單到復(fù)雜的順序來進行。
1.小電機
功能板上提供了一個小直流電機,其接口電路如圖2所示。它是通過L9110進行驅(qū)動,當在IA和IB兩端施加相異的電平時,就可控制電機的正反轉(zhuǎn)。
圖2 電機電路
電機與NUC472的連接關(guān)系為:
IA-PC11 IB-PC10
小電機的初始化函數(shù)為:
void MODER_init(void){GPIO_SetMode(PC, BIT11, GPIO_MODE_OUTPUT); // IAGPIO_SetMode(PC, BIT10, GPIO_MODE_OUTPUT); // IBPC10 = 0;PC11 = 0;}
使用如下高低電平輸出語句即可使電機轉(zhuǎn)動,互換高低電平即可實現(xiàn)反向轉(zhuǎn)動。
PC11 = 1; //輸出高電平 PC10 = 0; //輸出低電平
2.小按鍵
利用板載的小按鍵,可進行相應(yīng)功能的控制,其電路如圖3所示。
圖3 按鍵電路
按鍵與NUC472的連接關(guān)系為:
KEY1- PA10 KEY2- PA9
按鍵的初始化函數(shù)為:
void KEY_init(void)
{ // K1、K2GPIO_SetMode(PA, BIT10, GPIO_MODE_INPUT); // KEY1GPIO_SetMode(PA, BIT9, GPIO_MODE_INPUT); // KEY2}
K2鍵控制電機轉(zhuǎn)動的語句如下:
PC10 = 0;if (PA9 != 1) // K2{ PC10 = 1; // MODOR}else{ PC10 = 0;}
3.紅外感應(yīng)
板載的紅外感應(yīng)器是用于避障控制的,其電路如圖4所示。
圖4 紅外感應(yīng)電路
電路的作用作用為:在TCRT5000的一端是一個可發(fā)出紅外光的二極管,另一端是一個接受器。在無遮擋的情況下,受到照射使電路導(dǎo)通并在AOUT端輸出低電平。在LM393的電路中,其作用是充當一個AOUT與電位器設(shè)定電位的比較器,以產(chǎn)生閥值開關(guān)的效果。當IR_OUT為低電平時,LED2被點亮,否則被熄滅。通過采集IR_OUT的狀態(tài)即可啟動感應(yīng)開關(guān)的作用。
IR_OUT與NUC472的連接關(guān)系為:
IR_OUT - PF9
IR_OUT的初始化函數(shù)為:
void IR_init(void) { GPIO_SetMode(PF, BIT9, GPIO_MODE_INPUT); // IR-OUT }
以IR控制電機正反轉(zhuǎn)的語句如下:
if (PF9 != 1) { PC11 = 1; PC10 = 0; } else { PC11 = 0; PC10 = 1; }
4.RGB_LED
通常RGB_LED的使用是無需外圍驅(qū)動電路的,故使用起來十分簡單,只需輸出高低電平即可控制其點亮與否。然而在機智云的功能板上卻是以P9813來驅(qū)動和控制RGB_LED,其接口電路如圖5所示。
圖5 RGB_LED接口電路
那使用P9813又有何特別之處呢?其主要用途在于,可以串行方式來傳送控制信號,并起到控制RGB亮度的作用。而通常情況下,這是需要通過PWM來實現(xiàn)的。在信號傳送過程中,是通過32個脈沖信號來把控制數(shù)據(jù)傳遞到P9813中,再由RGB引腳加以輸出來控制RGB_LED。
P9813與NUC472的連接關(guān)系為:
A0-PE1 SCL- PD10 SDA-PD12
RGB_LED的初始化函數(shù)為:
void RGB_init(void){GPIO_SetMode(PD, BIT12, GPIO_MODE_OUTPUT); // SDAGPIO_SetMode(PD, BIT10, GPIO_MODE_OUTPUT); // SCLGPIO_SetMode(PE, BIT1, GPIO_MODE_OUTPUT); // A0PE1 = 0;}
RGB_LED的控制函數(shù)如下:
void RGB_Write_Data(uint8_t R,uint8_t G,uint8_t B){ uint32_t RGB_Data = 0; uint8_t i; RGB_Data |= 0xC0000000; RGB_Data |= ((uint32_t)((~B) & 0xc0)) 《《 22; RGB_Data |= ((uint32_t)((~G) & 0xc0)) 《《 20; RGB_Data |= ((uint32_t)((~R) & 0xc0)) 《《 18; RGB_Data |= ((uint32_t)B) 《《 16; RGB_Data |= ((uint32_t)G) 《《 8; RGB_Data |= R; for (i=0;i《32;i++) { if((RGB_Data & 0x80000000) != 0) { SDA_1; } else { SDA_0; } RGB_Data 《《= 1; SCL_0; SCL_0; SCL_1; SCL_1; }SDA_0; for (i=0;i《32;i++) { SCL_0; SCL_0; SCL_1; SCL_1; } }
實現(xiàn)呼吸燈的程序為:
uint8_t i=0; RGB_init(); PE1 = 1; RGB_Write_Data(0x00,0x00,0x00); for (i=0;i《125;i++) { RGB_Write_Data(0x00,0x00,i); delay_1ms(20); } for (i=125;i》0;i--) { RGB_Write_Data(0x00,0x00,i); delay_1ms(20); } for (i=0;i《125;i++) { RGB_Write_Data(0x00,0x00,i); delay_1ms(20); } for (i=125;i》0;i--) { RGB_Write_Data(0x00,0x00,i); delay_1ms(20); }
實現(xiàn)色彩環(huán)的程序如下:
while(1){ RGB_Write_Data(120,0x00,0x00); RGB_del(5); RGB_Write_Data(0x00,120,0x00); RGB_del(5); RGB_Write_Data(0x00,0x00,120); RGB_del(5); RGB_Write_Data(120,120,0x00); RGB_del(5); RGB_Write_Data(0x00,120,120); RGB_del(5); RGB_Write_Data(120,0x00,120); RGB_del(5); RGB_Write_Data(120,120,120); RGB_del(5); RGB_Write_Data(0x00,0x00,0x00); RGB_del(5); }
使用紅外感應(yīng)器作為感應(yīng)提示器的語句如下:
if (PF9 != 1) // IR{ RGB_Write_Data(120,0x00,0x00); }else{ RGB_Write_Data(0x00,120,0x00); }
5.OLED接口
在功能板上提供了OLED接口,該接口適用于SPI接口的演示屏,其引腳分配如圖8所示。由于LCD5110屏使用的十分廣泛,故這里以該接口實現(xiàn)LCD5110屏的顯示。由于兩者的接口并不完全一致,因此需要稍加修改,具體的做法是將GND與NC引腳連接,來為LCD5110的SCE引腳提供片選信號。其它引腳只需修改引腳定義即可。
圖8 OLED接口
LCD5110屏與NUC472的連接關(guān)系為:
CS---GND
RST---PD2
D/C---PD0
SDIN--PD3
SCLK--PD6
LED+--PD7
LCD5110各引腳輸出高低電平的定義語句如下:
#define SetLCD_RST_High() PD2 = 1;#define SetLCD_RST_Low() PD2 = 0;#define SetLCD_DC_High() PD0 = 1;#define SetLCD_DC_Low() PD0 = 0;#define SetLCD_SDIN_High() PD3 = 1;#define SetLCD_SDIN_Low() PD3 = 0;#define SetLCD_SCLK_High() PD6 = 1;#define SetLCD_SCLK_Low() PD6 = 0;
LCD5110的引腳配置函數(shù)如下:
void GPIO_Configuration(void){ GPIO_SetMode(PD, BIT0, GPIO_MODE_OUTPUT); GPIO_SetMode(PD, BIT2, GPIO_MODE_OUTPUT);
GPIO_SetMode(PD, BIT3, GPIO_MODE_OUTPUT); GPIO_SetMode(PD, BIT6, GPIO_MODE_OUTPUT); GPIO_SetMode(PD, BIT7, GPIO_MODE_OUTPUT); }
初始化函數(shù)為:
void LCD_init(void){ SetLCD_RST_Low(); delay_1us(); SetLCD_RST_High(); delay_1us(); delay_1us(); LCD_write_CMD(0x21); LCD_write_CMD(0xc0); LCD_write_CMD(0x06); LCD_write_CMD(0x13); LCD_write_CMD(0x20); LCD_Clear(); LCD_write_CMD(0x0c);}
主函數(shù)為:
int main(void){ GPIO_Configuration(); PD7 = 1; LCD_Init(); LCD_Clear();
LCD_write_english_string(2,0,“NUC472 +”); LCD_write_hanzi(2,3,6); LCD_write_hanzi(14,3,7); LCD_write_hanzi(26,3,8);
LCD_write_hanzi(38,3,9); LCD_write_hanzi(50,3,10); LCD_write_hanzi(62,3,11);}
其它驅(qū)動LCD110屏顯示的函數(shù)基本無需變化,運行后的顯示效果如圖9所示。
鑒于NUC472的資料相對較少,這里僅以機智云功能板的應(yīng)用為題對NUC472開發(fā)板的應(yīng)用進行了一些探索,相對來講NUC472使用起來還是比較易于上手的。