曾购置过一块机智云的开发板,本期待是STM32F103为核心的底板,不曾想却是基于ATMEGA328核心的底板。 为了能使之与手中的ST开发板相配合使用,故决定在STM32F030的开发板上实现对该机智云功能板的驱动开发,从而避免它被闲置在一旁的**。 就机智云功能板来说,它共RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。限于时间的关系,这里仅对RGB_LED、小电机、红外感应、小按键及OLED接口的使用加以介绍。 图1 机智云功能板 1.OLED接口 功能板上提供了OLED接口,该接口如图2所示。由于手头并没有SPI接口的OLED屏,而只有一块LCD5110屏,故决定用该接口来支持LCD5110屏显示。由于两者的接口并不一致,所以需进行稍许改造,具体的做法是将GND与NC引脚短接,这样就使LCD5110的SCE引脚有了所需的控制信号。其它的只需修改引脚的定义即可。 图2 OLED接口 LCD5110各引脚输出高低电平的定义语句如下: #define SetLCD_RST_High() GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET); #define SetLCD_RST_Low() GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET); #define SetLCD_DC_High() GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET); #define SetLCD_DC_Low() GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET); #define SetLCD_SDIN_High() GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET); #define SetLCD_SDIN_Low() GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET); #define SetLCD_SCLK_High() GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); #define SetLCD_SCLK_Low() GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET); #define SetLCD_LED_High() GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET); #define SetLCD_LED_Low() GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET); LCD5110的引脚配置函数如下: void GPIO_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
SetLCD_LED_High();
}
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图3所示。 图3 LCD5110屏显示效果 2.小电机 功能板上提供了一个小电机以供测试,其接口电路如图4所示,是通过L9110进行功率驱动,在IA和IB两端施加相异的电平即可控制电机的正反转。 图4 小电机电路 控制电机的引脚配置如下: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // MOTOR: IA-PB4 IB-PB5 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); 使用如下高低电平输出语句即可是电机转动,呼唤高低电平即可反向转动。 GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET); //输出高电平 GPIO_WriteBit(GPIOB, GPIO_Pin_4, Bit_RESET); //输出低电平 3.RGB_LED 本来RGB_LED的控制十分简单,只需输出高低电平即可,然而在机智云的功能板上却是以P9813来驱动控制RGB_LED,其接口电路如图5所示。 图5 RGB_LED接口电路 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_1;
}
SDA_0;
for (i=0;i<32;i++)
{
SCL_0;
SCL_1;
}
}
RGB_LED的显示效果如图6所示。 图6 RGB_LED显示效果 4.小按键 利用板载的小按键,可进行相应功能的控制,其电路如图6所示。 图7 RGB_LED接口电路 小按键的引脚配置如下: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // K1-PB10 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // K2-PA8 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); K1键控制电机转动的语句如下: GPIO_WriteBit(GPIOB, GPIO_Pin_4, Bit_RESET); if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)==RESET) // K1 { GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET); // MODOR } else { GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET); } 5.红外感应 板载的红外感应器是用于避障控制的,其电路如图8所示。 图8 红外感应电路 IR_OUT引脚的配置语句如下: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); 使用红外感应器能够作为感应提示器来使用,其实现的语句如下: if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==RESET) // IR { RGB_Write_Data(0x00,0x00,0xff); // 蓝色 } else { RGB_Write_Data(0x00,0xff,0x00); // 绿色 } 实现感应提示的效果如图9和图10所示。 图9 未遮挡状态
图10 遮挡状态
|