本帖最后由 jinglixixi 于 2017-7-7 15:49 编辑
在NUC472 开发板上配有Arduino接口,若以该接口与机智云的功能板相配合,则可以有效地拓展该开发板的功能。就目前来讲,对机智云功能板提供支持的核心底板有两种,一种是基于 STM32F103 的,另一种则是基于ATMEGA328 的。以NUC472 开发板来支持机智云功能板则可以增加一种对其进行支持的核心底板。 就机智云功能板来说,它提供了RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。这里仅对RGB_LED、小电机、红外感应、小按键及OLED接口的使用加以介绍。 此外,配合片内的RTC、UART、A/D等资源,还实现了RTC 电子时钟、串行通讯及A/D采集等功能。
图1 机智云功能板
要对机智云功能板进行编程,主要涉及各引脚的关系构建、GPIO口输入/输出功能的设置及高低电平输出语句的定义、输入电平的读取与判别、脉冲信号与时序的模拟等。 为了便于理解,这里按由简单到复杂的顺序来进行。 1.小电机 功能板上提供了一个小直流电机,其接口 电路如图 2所示。它是通过L9110进行驱动,当在IA和IB两端施加相异的电平时,就可控制电机的正反转。
图2 电机电路
电机与NUC472的连接关系为: IA-PC11 IB-PC10
小电机的初始化函数为:
- void MODER_init(void)
- {
- GPIO_SetMode(PC, BIT11, GPIO_MODE_OUTPUT); // IA
- GPIO_SetMode(PC, BIT10, GPIO_MODE_OUTPUT); // IB
- PC10 = 0;
- PC11 = 0;
- }
复制代码
使用如下高低电平输出语句即可使电机转动,互换高低电平即可实现反向转动。 PC11 = 1; //输出高电平 PC10 = 0; //输出低电平 2.小按键 利用板载的小按键,可进行相应功能的控制,其电路如图3所示。
图3 按键电路
按键与NUC472的连接关系为: KEY1- PA10 KEY2- PA9 按键的初始化函数为:
- void KEY_init(void)
- { // K1、K2
- GPIO_SetMode(PA, BIT10, GPIO_MODE_INPUT); // KEY1
- GPIO_SetMode(PA, BIT9, GPIO_MODE_INPUT); // KEY2
- }
复制代码
K2键控制电机转动的语句如下: PC10 = 0; if (PA9 != 1) // K2 { PC10 = 1; // MODOR } else { PC10 = 0; }
3.红外感应 板载的红外感应器是用于避障控制的,其电路如图4所示。
图4 红外感应电路
电路的作用作用为:在TCRT5000的一端是一个可发出红外光的二极管,另一端是一个接受器。在无遮挡的情况下,受到照射使电路导通并在AOUT端输出低电平。在LM393的电路中,其作用是充当一个AOUT与电位器设定电位的比较器,以产生阀值开关的效果。当IR_OUT为低电平时,LED2被点亮,否则被熄灭。通过采集IR_OUT的状态即可启动感应开关的作用。 IR_OUT与NUC472的连接关系为: IR_OUT - PF9 IR_OUT的初始化函数为: void IR_init(void) { GPIO_SetMode(PF, BIT9, GPIO_MODE_INPUT); // IR-OUT } 以IR控制电机正反转的语句如下: if (PF9 != 1) { PC11 = 1; PC10 = 0; } else { PC11 = 0; PC10 = 1; } 4.RGB_LED 通常RGB_LED的使用是无需外围驱动电路的,故使用起来十分简单,只需输出高低电平即可控制其点亮与否。然而在机智云的功能板上却是以P9813来驱动和控制RGB_LED,其接口电路如图5所示。
图5 RGB_LED接口电路
那使用P9813又有何特别之处呢?其主要用途在于,可以串行方式来传送控制信号,并起到控制RGB亮度的作用。而通常情况下,这是需要通过PWM来实现的。在信号传送过程中,是通过32个脉冲信号来把控制数据传递到P9813中,再由RGB引脚加以输出来控制RGB_LED。 P9813与NUC472的连接关系为: A0-PE1 SCL- PD10 SDA-PD12 RGB_LED的初始化函数为:
- void RGB_init(void)
- {
- GPIO_SetMode(PD, BIT12, GPIO_MODE_OUTPUT); // SDA
- GPIO_SetMode(PD, BIT10, GPIO_MODE_OUTPUT); // SCL
- GPIO_SetMode(PE, BIT1, GPIO_MODE_OUTPUT); // A0
- PE1 = 0;
- }
复制代码
RGB_LED的控制函数如下:
- 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;
- }
- }
复制代码
实现呼吸灯的程序为: 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); } 实现色彩环的程序如下: 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); } RGB_LED的显示效果如图6所示。
图6 RGB_LED显示效果
使用红外感应器作为感应提示器的语句如下: if (PF9 != 1) // IR { RGB_Write_Data(120,0x00,0x00); } else { RGB_Write_Data(0x00,120,0x00); } 实现感应提示的效果如图7所示。
图7 未遮挡状态
5.OLED接口 在功能板上提供了OLED接口,该接口适用于SPI接口的演示屏,其引脚分配如图8所示。由于LCD5110屏使用的十分广泛,故这里以该接口实现LCD5110屏的显示。由于两者的接口并不完全一致,因此需要稍加修改,具体的做法是将GND与NC引脚连接,来为LCD5110的SCE引脚提供片选信号。其它引脚只需修改引脚定义即可。
图8 OLED接口
LCD5110屏与NUC472的连接关系为: 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的引脚配置函数如下:
- 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);
- }
复制代码
- 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);
- }
复制代码
- 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);
- }
复制代码
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图9所示。
图9 LCD5110屏显示效果 结语: 鉴于NUC472的资料相对较少,这里仅以机智云功能板的应用为题对NUC472开发板的应用进行了一定深度的探索,积累了一定的使用经验。相对来讲NUC472使用起来还是比较易于上手的,板上资源相对于黑色的NuTiny-SDK-NUC472也要丰富些,以后的探索方向是解决I2S的语音录放问题。
|