收藏官网首页
查看: 1055|回复: 2

IoT小能手:基于GD32F450的机智云功能板应用支持

1

主题

4

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2017-7-12 20:30:05 | 显示全部楼层 |阅读模式
ESP8266模块首单6.8元
机智云是智能硬件时代专为硬件提供后台支持的云服务平台,其服务内容主要包括统计分析、数据安全、远程管理、软件升级等。去年底机智云又迎来了2.0版本gokit2,相较于GoKit1它在功能上没什么变化,而是将Gokit1的单板卡结构设计为控制板和功能板的双板卡结构,并通过兼容arduino UNO的扩展接口座来连接。这种改变进一步更强了应用的灵活性,也为其它类型的控制板来支持功能板通过了方便。
就目前来讲,控制板有两种类型,一种是基于STM32 主控板,以 STM32F103C8T6为主控芯片;另一种则是基于 Atmel 主控板,以Atmega328为主控芯片。
GD32F450是兆易科技新推出的一款ARM产品,在GD32F450开发板上也配有Arduino接口,这样便为机智云控制板的种类扩展提供了相应的支持。
就机智云功能板来说,它提供了RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。
图片1.png
1 机智云功能板

下面就以GD32F450开发板为控制核心,对RGB_LED、小电机、红外感应、小按键、温湿度传感器、串行通讯及OLED接口的使用加以介绍。若配上对GD32F450片内RTC、UART、A/D等资源的所用,则能够进一步增强实用性能。
图片2.png
2 GD32F450开发板

要对机智云功能板进行编程,主要涉及各引脚关系的构建、GPIO口输入/输出功能的设置及高低电平输出语句的定义、输入电平的读取与判别、脉冲信号与时序的模拟等。
为了便于理解,这里按由简单到复杂的顺序来进行。
1.小电机
功能板上提供了一个小的直流电机,其接口电路如图3所示。它是通过L9110进行功率驱动,当在IAIB两端施加相异的电平时,可控制电机的正反转。
图片3.png
3  电机电路

电机与GD32F450的连接关系为:
  IA-PB10  
  IB-PE14     
小电机的初始化函数为:
  1. void MODER_init(void)
  2.   {
  3.     rcu_periph_clock_enable(RCU_GPIOB);
  4.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_10);
  5. gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_10);
  6.     GPIO_BC(GPIOB) = GPIO_PIN_10;
  7. rcu_periph_clock_enable(RCU_GPIOE);
  8.     gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_14);
  9. gpio_output_options_set(GPIOE,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_14);
  10.     GPIO_BC(GPIOE) = GPIO_PIN_14;
  11. }
复制代码
使用如下高低电平输出语句即可使电机转动,互换高低电平即可实现反向转动。      
GPIO_BOP(GPIOB) = GPIO_PIN_10;    // 输出高电平
GPIO_BC(GPIOE) = GPIO_PIN_14;      // 输出低电平
2.小按键
利用板载的小按键,可进行相应功能的控制,其电路如图4所示。
图片4.png
4  按键电路

按键与GD32F450的连接关系为:
K1-PB14
K2-PB15
按键的初始化函数为:
  1. void KEY_init(void)
  2. {
复制代码
K1键控制电机转动的语句如下:
GPIO_BC(GPIOE) = GPIO_PIN_14;  
if(RESET==gpio_input_bit_get(GPIOB,GPIO_PIN_14)) RGB_Write_Data(0xff,0x00,0x00);        // K1
{
     GPIO_BOP(GPIOE) = GPIO_PIN_14;    //输出高电平
}
else
{
     GPIO_BC(GPIOE) = GPIO_PIN_14;      //输出低电平
}
3.红外感应
板载的红外感应器用于避障或感应控制,其电路如图5所示。
图片5.png
图片6.png

5  红外感应电路

电路的作用是:在TCRT5000的一端是一个可发出红外光的二极管,另一端是一个接受器。在无遮挡的情况下,受到照射使电路导通并在AOUT端输出低电平。在LM393的电路中,其作用是充当一个AOUT与电位器设定电位的比较器,以产生阀值开关的效果。当IR_OUT为低电平时,LED2被点亮,否则被熄灭。通过采集IR_OUT的状态即可启动感应开关的作用。
  IR_OUTGD32F450的连接关系为:
  IR_OUT-PD4
IR_OUT的初始化函数为:
  1. void IR_init(void)
  2. {
  3. rcu_periph_clock_enable(RCU_GPIOD);
  4.     gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_4);
  5.     gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_4);
  6.     GPIO_BC(GPIOD) = GPIO_PIN_4;
  7.   }
复制代码
IR控制电机正反转的语句如下:
if (RESET== gpio_input_bit_get(GPIOD,GPIO_PIN_4))
{
GPIO_BOP(GPIOB) = GPIO_PIN_10;
GPIO_BC(GPIOE) = GPIO_PIN_14;      
}   
else        
{
GPIO_BC(GPIOB) = GPIO_PIN_10;
GPIO_BOP(GPIOE) = GPIO_PIN_14;
}       
4.RGB_LED
通常RGB_LED的使用是无需**驱动电路的,故使用起来很简单,只需输出高低电平即可控制其点亮与否。然而在机智云的功能板上却是由P9813来驱动和控制RGB_LED,其接口电路如图6所示。
图片7.png
图片8.png
6  RGB_LED接口电路

那使用P9813又有何特别之处呢?其主要用途在于,可以串行方式来传送控制信号,并起到控制RGB亮度的作用。而在通常情况下,这是需要使用PWM来实现的。在信号传送过程中,它是通过32个脉冲信号来把控制数据传递到P9813中,再由RGB引脚来输出和控制RGB_LED。
P9813与GD32F450的连接关系为:
SDA-PB7
SCL-PB6
A0-PA3
输出高低电平的定义语句为:
#define SDA_1   GPIO_BOP(GPIOB) = GPIO_PIN_7;
#define SDA_0   GPIO_BC(GPIOB) = GPIO_PIN_7;
#define SCL_0   GPIO_BOP(GPIOB) = GPIO_PIN_6;
#define SCL_1   GPIO_BC(GPIOB) = GPIO_PIN_6;
RGB_LED的初始化函数为:
  1. void RGB_init(void)
  2. {
  3. rcu_periph_clock_enable(RCU_GPIOB);
  4. rcu_periph_clock_enable(RCU_GPIOA);
  5.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_6|GPIO_PIN_7);
  6.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);
  7.     GPIO_BC(GPIOB) = GPIO_PIN_6|GPIO_PIN_7;
  8.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_3);
  9.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3);
  10.     GPIO_BC(GPIOA) = GPIO_PIN_3;
  11. }
复制代码

RGB_LED的控制函数如下:
  1. void RGB_Write_Data(uint8_t R,uint8_t G,uint8_t B)
  2. {
  3.   uint32_t RGB_Data = 0;
  4.   uint8_t i;
  5.   RGB_Data |= 0xC0000000;
  6.   RGB_Data |= ((uint32_t)((~B) & 0xc0)) << 22;
  7.   RGB_Data |= ((uint32_t)((~G) & 0xc0)) << 20;
  8.   RGB_Data |= ((uint32_t)((~R) & 0xc0)) << 18;
  9.   RGB_Data |= ((uint32_t)B) << 16;            
  10.   RGB_Data |= ((uint32_t)G) << 8;
  11.   RGB_Data |= R;
  12.   for (i=0;i<32;i++)
  13.   {
  14.        if((RGB_Data & 0x80000000) != 0)
  15.        {
  16.          SDA_1;
  17.        }
  18.        else
  19.        {
  20.          SDA_0;
  21.         }
  22.        RGB_Data <<= 1;
  23.         SCL_0;
  24.         SCL_1;
  25.    }
  26.    SDA_0;         
  27.    for (i=0;i<32;i++)
  28.    {
  29.         SCL_0;
  30.         SCL_1;
  31.    }        
  32. }
复制代码
实现呼吸灯的程序为:
  1. uint8_t i=0;
  2. RGB_init();
  3. GPIO_BOP(GPIOA) = GPIO_PIN_3;
  4. RGB_Write_Data(0x00,0x00,0x00);
  5. for (i=0;i<125;i++)
  6. {
  7.         RGB_Write_Data(0x00,0x00,i);
  8. delay_1ms(20);
  9. }
  10. for (i=125;i>0;i--)
  11. {
  12.        RGB_Write_Data(0x00,0x00,i);
  13.    delay_1ms(20);
  14. }
  15. for (i=0;i<125;i++)
  16. {
  17. RGB_Write_Data(0x00,0x00,i);
  18.    delay_1ms(20);
  19. }
  20. for (i=125;i>0;i--)
  21. {
  22.        RGB_Write_Data(0x00,0x00,i);
  23.    delay_1ms(20);
  24. }
复制代码

            
实现色彩环的程序如下:
  1. while(1)
  2. {
  3.       for (i=0;i<255;i++)
  4.       {
  5.             RGB_Write_Data(i,0x00,255-i);
  6. delay_1ms(20);
  7.       }
  8.   for (i=0;i<255;i++)
  9.       {
  10. RGB_Write_Data(255-i,i,0x00);
  11. delay_1ms(20);
  12.       }
  13.   for (i=0;i<255;i++)
  14.       {
  15. RGB_Write_Data(0x00,255-i,i);
  16. delay_1ms(20);
  17.       }
  18. }
复制代码

   RGB_LED的显示效果如图7所示。
图片9.png
7 RGB_LED显示效果

使用红外感应器作为感应提示器的语句如下:
if(RESET== gpio_input_bit_get(GPIOD,GPIO_PIN_4))   
{
     RGB_Write_Data(0x00,0x00,0xff);    //  蓝色
}
else
{
       RGB_Write_Data(0xff,0x00,0x00);  //  红色
}
实现感应提示的效果如图8。
图片10.png
8  感应控制

5.OLED接口
功能板上配有OLED接口,该接口适用于SPI接口的OLED屏,其电路如图9所示。由于LCD5110屏用的比较广泛,故这里介绍一下以该接口实现LCD5110屏的显示。由于两者的接口并不完全一致,因此所以需要做些改造,具体的做法是将GNDNC引脚连接,以此向LCD5110SCE引脚提供片选信号,其它引脚则只需修改引脚的定义即可。
图片11.png
9 OLED

LCD5110屏与GD32F450的连接关系为:
CS-GND
RESET-PE6
D/C-PE2
SDIN-PE4
SCL-PD0
LED-PD1
LCD5110各引脚输出高低电平的定义语句如下:
#define DC_1 GPIO_BOP(GPIOE) = GPIO_PIN_2;
#define DC_0 GPIO_BC(GPIOE) = GPIO_PIN_2;
#define RST_1 GPIO_BOP(GPIOE) = GPIO_PIN_6;
#define RST_0 GPIO_BC(GPIOE) = GPIO_PIN_6;
#define LCD_SCLK_1 GPIO_BOP(GPIOD) = GPIO_PIN_0;
#define LCD_SCLK_0 GPIO_BC(GPIOD) = GPIO_PIN_0;
#define LCD_SDIN_1 GPIO_BOP(GPIOE) = GPIO_PIN_4;
#define LCD_SDIN_0 GPIO_BC(GPIOE) = GPIO_PIN_4;
LCD5110的引脚配置函数如下:
  1. void SPI_CONFIG()
  2. {
  3. rcu_periph_clock_enable(RCU_GPIOE);
  4. gpio_mode_set          (GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,   GPIO_PIN_2| GPIO_PIN_4| GPIO_PIN_6);
  5. gpio_output_options_set(GPIOE, GPIO_OTYPE_PP,    GPIO_OSPEED_50MHZ,GPIO_PIN_2| GPIO_PIN_4| GPIO_PIN_6);
  6.   
  7. rcu_periph_clock_enable(RCU_GPIOD);
  8. gpio_mode_set          (GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,   GPIO_PIN_0| GPIO_PIN_1);
  9. gpio_output_options_set(GPIOD, GPIO_OTYPE_PP,    GPIO_OSPEED_50MHZ,GPIO_PIN_0| GPIO_PIN_1);
  10. GPIO_BOP(GPIOD) = GPIO_PIN_1;
  11. }
复制代码

     lcd5110初始化函数:
  1. void LCD_init(void)    //lcd5110测试化
  2. {
  3. RST_0;
  4. delay(100);
  5. RST_1;
  6. delay(100);
  7. RST_0;
  8. delay(100);
  9. RST_1;
  10. delay(100);
  11. LCD_write_byte(0x21,0);
  12. LCD_write_byte(0xc3,0);
  13.     LCD_write_byte(0x10, 0);
  14. LCD_write_byte(0x20,0);
  15. LCD_write_byte(0x0C,0);
  16. LCD_clear();
  17. }
复制代码
主函数:
  1. int main(void)
  2. {
  3.      SPI_CONFIG();
  4. LCD_init();
  5. LCD_write_english_string(10,1,"GD32F450VE",0);
  6. LCD_write_english_string(36,2,"&",0);
  7. LCD_write_english_string(20,3,"IOTKIT",0);
  8. LCD_write_english_string(10,5,"2017.6.10",0);
  9. }
复制代码
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图10所示。
图片12.png
10  LCD5110屏显示效果

6.温湿度传感器
功能板上配有DHT11温湿度传感器,其接口电路如图11所示。DHT11与GD32F450的连接关系为:
DHT11_D-PD3
图片13.png
11 DHT11温湿度传感器电路

DHT11的基本定义语句为:
#define DHT11_GPIO GPIOD  
#define DHT11_GPIO_CLKEN  rcu_periph_clock_enable(RCU_GPIOD)
#define DHT11_PIN GPIO_PIN_3  
#define DHT11_PIN_SET gpio_bit_set(DHT11_GPIO,DHT11_PIN)
#define DHT11_PIN_CLR gpio_bit_reset(DHT11_GPIO,DHT11_PIN)
#define DHT11_PIN_Read gpio_input_bit_get(DHT11_GPIO,DHT11_PIN)
DHT11的初始化函数为:
  1. int DHT11_Init()
  2. {
  3. DHT11_GPIO_CLKEN;
  4. gpio_mode_set(DHT11_GPIO,GPIO_MODE_INPUT,GPIO_PUPD_NONE,DHT11_PIN);
  5. gpio_output_options_set(DHT11_GPIO,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,DHT11_PIN);
  6. DHT11_Reset();
  7. return DHT11_Check();
  8. }
复制代码
位读取函数为:
  1. int DHT11_Read_Bit()  
  2. {
  3.         int retry=0;
  4. while(DHT11_PIN_Read&&retry<100)   
  5. {
  6. retry++;
  7. Delay_us(1);
  8. }
  9. retry=0;
  10. while(!DHT11_PIN_Read&&retry<100)  
  11. {
  12. retry++;
  13. Delay_us(1);
  14. }
  15. Delay_us(40);   
  16. if(DHT11_PIN_Read) return 1;
  17. else return 0;  
  18. }
复制代码
字节读取函数为:
  1. char DHT11_Read_Byte()   
  2. {        
  3. char i,dat;
  4. dat=0;
  5. for(i=0;i<8;i++)
  6. {
  7.            dat<<=1;
  8.     dat|=DHT11_Read_Bit();
  9.   }
  10. return dat;
  11. }
复制代码
数据读取函数为:
  1. int DHT11_Read_Data(char *temp,char *humi)   
  2. {        
  3.         char buf[5],i;
  4. DHT11_Reset();
  5. if(DHT11_Check()==0)
  6. {
  7. for(i=0;i<5;i++)   
  8. {
  9. buf[i]=DHT11_Read_Byte();
  10. }
  11. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  12. {
  13. *humi=buf[0];
  14. *temp=buf[2];
  15. }
  16. }
  17. else return 1;
  18. return 0;            
  19. }
复制代码

温湿度的检测程序为:
  1. SPI_CONFIG();
  2. LCD_init();
  3. LCD_clear();
  4. LCD_write_english_string(0,0,"  Temp & Humi",0);
  5. LCD_write_english_string(0,2,"temp:   C",0);
  6. LCD_write_english_string(0,4,"humi:   %",0);
  7.             while (1)
  8. {
  9.   DHT11_Read_Data(&temp,&humi);
  10. delay_1ms(200);  
  11. LCD_set_XY(32,2);  
  12. LCD_write_char(temp/10+'0',0);
  13.     LCD_write_char(temp%10+'0',0);
  14. LCD_set_XY(32,4);
  15. LCD_write_char(humi/10+'0',0);
  16.     LCD_write_char(humi%10+'0',0);
  17.    }
复制代码
        温湿度检测效果如图12所示。
图片14.png
12 温湿度显示效果

7.串行通讯
功能板上具有串行通讯功能,其接口电路如图13所示。串行通讯引脚与GD32F450的连接关系为:
USART_RX-PD5
USART_TX-PD6
图片15.png
图片16.png
13 串行通讯接口电路

串行通讯初始化函数:
  1. void usb_to_uart_init(void)
  2. {
  3.    rcu_periph_clock_enable(RCU_GPIOD);
  4. rcu_periph_clock_enable(RCU_USART1);
  5.    gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_5);
  6.    gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_6);
  7.    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_5);
  8.    gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,     GPIO_OSPEED_50MHZ,GPIO_PIN_5);
  9.    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6);
  10.    gpio_output_options_set(GPIOD,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
  11.    usart_deinit(USART1);
  12.    usart_baudrate_set(USART1, 9600U);  
  13.    usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  14.    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  15.    usart_word_length_set(USART1, USART_WL_8BIT);
  16.    usart_stop_bit_set(USART1, USART_STB_1BIT);
  17.    usart_parity_config(USART1, USART_PM_NONE);
  18.    usart_enable(USART1);
  19. }
复制代码
利用串行通讯功能,可向EMW3162发送指令,进而实现WIFI通讯及控制。
结束语:
机智云是一个面向智能硬件时代开发平台,通过和新的ARM产品相结合能够不断提升产品的性能,这里通过它与GD32F450开发板的配合,便又增添了一种控制板的方式及一些附加功能,期待在大家共同努力下,机智云产品的性能能够越来越丰富。

发表于 2017-7-13 11:33:51 | 显示全部楼层
本帖最后由 Genius 于 2017-7-13 11:40 编辑

可以这么理解不?

1、楼主的这个帖子是讲  GD32F450接入机智云  以及相关功能实现的代码。关于GD32F450是全新32位通用MCU基于200MHz Cortex®-M4内核,持续以业界领先的强大处理效能与低功耗、高集成度、高可靠性和易用性的最佳组合,主要用于工业控制与物联网。
        GD32F450支持Arduino uno R3标准串口,所以插入一块Gokit扩展板即可接入机智云,并使用机智云自助开发平台的服务。
不管是什么型号的开发板,只要支持Arduino uno R3标准串口,或者是支持插入ESP8266 LPB100 G510等模块并烧写GAgent固件,即可接入机智云。
接入机智云不局限于Gokit。


2、GD32F450+EMW3162(可替换成ESP8266 LPB100 G510等)  接入机智云这里,有没有相关注意事项了?





1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息
发表于 2017-7-13 12:08:31 | 显示全部楼层
支持国产MCU,GD是北京兆易创新的产品,同后缀名的和意法半导体的STM32系列引脚兼容,还是不错的
1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

© 2011-2017 Gizwits ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表