发新帖本帖赏金 3.00元(功能说明)我要提问
返回列表
[应用方案]

【新唐方案分享】基于NUC472开发板的机智云功能板控制

[复制链接]
1452|15
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2017-11-23 10:40 | 显示全部楼层 |阅读模式
NUC472开发板上配有Arduino接口,若以该接口与机智云的功能板相配合,则可以有效地拓展该开发板的功能。就目前来讲,对机智云功能板提供支持的核心底板有两种,一种是基于STM32F103的,另一种则是基于ATMEGA328的。以NUC472开发板来支持机智云功能板则可以增加一种对其进行支持的核心底板。  
就机智云功能板来说,它提供了RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。这里仅对RGB_LED、小电机、红外感应、小按键及OLED接口的使用加以介绍。
此外,配合片内的RTC、UART、A/D等资源,还实现了RTC电子时钟、串行通讯及A/D采集等功能。
h.jpg
1 机智云功能板

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

电机与NUC472的连接关系为:
IA-PC11      
IB-PC10
小电机的初始化函数为:
1.void MODER_init(void)
2.{
3.    GPIO_SetMode(PC, BIT11, GPIO_MODE_OUTPUT);  //  IA
4.    GPIO_SetMode(PC, BIT10, GPIO_MODE_OUTPUT);  //  IB
5.    PC10 = 0;
6.    PC11 = 0;
7.}
使用如下高低电平输出语句即可使电机转动,互换高低电平即可实现反向转动。      
  PC11 = 1;      //输出高电平
  PC10 = 0;        //输出低电平
2.小按键
利用板载的小按键,可进行相应功能的控制,其电路如图3所示。
e.jpg
3  按键电路
按键与NUC472的连接关系为:
KEY1- PA10   
KEY2- PA9
按键的初始化函数为:
1.void KEY_init(void)
2.{     // K1、K2
3.  GPIO_SetMode(PA, BIT10, GPIO_MODE_INPUT);   //  KEY1
4.  GPIO_SetMode(PA, BIT9, GPIO_MODE_INPUT);    //  KEY2
}  
K2键控制电机转动的语句如下:
PC10 = 0;
if (PA9 != 1)    //  K2
{
     PC10 = 1;   //  MODOR
}
else
{
     PC10 = 0;
}
3.红外感应
板载的红外感应器是用于避障控制的,其电路如图4所示。
f.jpg
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所示。
g.jpg
5  RGB_LED接口电路

那使用P9813又有何特别之处呢?其主要用途在于,可以串行方式来传送控制信号,并起到控制RGB亮度的作用。而通常情况下,这是需要通过PWM来实现的。在信号传送过程中,是通过32个脉冲信号来把控制数据传递到P9813中,再由RGB引脚加以输出来控制RGB_LED。
P9813与NUC472的连接关系为:
A0-PE1        
SCL- PD10   
SDA-PD12
RGB_LED的初始化函数为:
1.void RGB_init(void)
2.{
3.  GPIO_SetMode(PD, BIT12, GPIO_MODE_OUTPUT);  //  SDA
4.  GPIO_SetMode(PD, BIT10, GPIO_MODE_OUTPUT);  //  SCL
5.  GPIO_SetMode(PE, BIT1, GPIO_MODE_OUTPUT);   //  A0
6.  PE1 = 0;
7.}
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_0;
25.        SCL_1;
26.        SCL_1;
27.   }
28.   SDA_0;         
29.   for (i=0;i<32;i++)
30.   {
31.           SCL_0;
32.           SCL_0;
33.          SCL_1;
34.          SCL_1;
35.   }        
36.}
实现呼吸灯的程序为:
     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所示。
c.jpg
6  RGB_LED显示效果

使用红外感应器作为感应提示器的语句如下:
if (PF9 != 1)      // IR
{
       RGB_Write_Data(120,0x00,0x00);   
}
else
{
       RGB_Write_Data(0x00,120,0x00);  
}
实现感应提示的效果如图7所示。
b.jpg
7  未遮挡状态

5.OLED接口
    在功能板上提供了OLED接口,该接口适用于SPI接口的演示屏,其引脚分配如图8所示。由于LCD5110屏使用的十分广泛,故这里以该接口实现LCD5110屏的显示。由于两者的接口并不完全一致,因此需要稍加修改,具体的做法是将GND与NC引脚连接,来为LCD5110的SCE引脚提供片选信号。其它引脚只需修改引脚定义即可。
图片1.png
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的引脚配置函数如下:
1.void GPIO_Configuration(void)
2.{
3.    GPIO_SetMode(PD, BIT0, GPIO_MODE_OUTPUT);
4.    GPIO_SetMode(PD, BIT2, GPIO_MODE_OUTPUT);
5.    GPIO_SetMode(PD, BIT3, GPIO_MODE_OUTPUT);
6.    GPIO_SetMode(PD, BIT6, GPIO_MODE_OUTPUT);
7.    GPIO_SetMode(PD, BIT7, GPIO_MODE_OUTPUT);
8. }
[size=13.3333px]初始化函数为:
1.void LCD_init(void)
2.{
3.    SetLCD_RST_Low();   
4.    delay_1us();
5.    SetLCD_RST_High();   
6.    delay_1us();
7.    delay_1us();
8.    LCD_write_CMD(0x21);
9.    LCD_write_CMD(0xc0);
10.    LCD_write_CMD(0x06);
11.    LCD_write_CMD(0x13);
12.    LCD_write_CMD(0x20);
13.    LCD_Clear();           
14.    LCD_write_CMD(0x0c);
15.}
主函数为:
1.int main(void)
2.{
3.    GPIO_Configuration();
4.    PD7 = 1;   
5.    LCD_Init();
6.    LCD_Clear();
7.    LCD_write_english_string(2,0,"NUC472 +");
8.    LCD_write_hanzi(2,3,6);
9.    LCD_write_hanzi(14,3,7);
10.    LCD_write_hanzi(26,3,8);
11.    LCD_write_hanzi(38,3,9);
12.    LCD_write_hanzi(50,3,10);
13.    LCD_write_hanzi(62,3,11);
}
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图9所示。
a.jpg
9  LCD5110屏显示效果

鉴于NUC472的资料相对较少,这里仅以机智云功能板的应用为题对NUC472开发板的应用进行了一些探索,相对来讲NUC472使用起来还是比较易于上手的。



打赏榜单

21ic小管家 打赏了 3.00 元 2017-12-08

heisexingqisi| | 2017-11-23 14:22 | 显示全部楼层
机智云开发板的接口跟新唐472开发板接口一致吗?

使用特权

评论回复
jinglixixi|  楼主 | 2017-11-23 17:14 | 显示全部楼层
heisexingqisi 发表于 2017-11-23 14:22
机智云开发板的接口跟新唐472开发板接口一致吗?

没问题插上可用,只需按新唐472的对应引脚编程即可。

使用特权

评论回复
heisexingqisi| | 2017-11-24 08:37 | 显示全部楼层
jinglixixi 发表于 2017-11-23 17:14
没问题插上可用,只需按新唐472的对应引脚编程即可。

厉害了,很容易链接上机智云的服务器吧

使用特权

评论回复
jinglixixi|  楼主 | 2017-11-24 10:55 | 显示全部楼层
heisexingqisi 发表于 2017-11-24 08:37
厉害了,很容易链接上机智云的服务器吧

改写下串行通讯部分来用WiFi实现云服务。

使用特权

评论回复
捉虫天师| | 2017-11-24 20:12 | 显示全部楼层
我也有个机智云的板子。

使用特权

评论回复
dongnanxibei| | 2017-11-24 21:02 | 显示全部楼层
只要会传输指令,那边单片机就很容易控制设备了。

使用特权

评论回复
天灵灵地灵灵| | 2017-11-25 22:36 | 显示全部楼层
多谢分享,看来玩机智云不仅STM32可以玩,新唐也行。

使用特权

评论回复
jinglixixi|  楼主 | 2017-11-26 09:09 | 显示全部楼层
天灵灵地灵灵 发表于 2017-11-25 22:36
多谢分享,看来玩机智云不仅STM32可以玩,新唐也行。

只需稍稍需改一下引脚的定义等,其它大多数不变。

使用特权

评论回复
xixi2017| | 2017-11-26 21:34 | 显示全部楼层
不知道51可以试试不

使用特权

评论回复
jinglixixi|  楼主 | 2017-11-27 09:15 | 显示全部楼层
xixi2017 发表于 2017-11-26 21:34
不知道51可以试试不

可能有问题,目前多是ARM来支持它,可能51在内存上小一些,但不妨一试。

使用特权

评论回复
caoqing| | 2017-11-28 22:50 | 显示全部楼层
没有利用NUC472以太网功能,只用串口通信,如果用NUC472以太网口连接机智云就好了。

使用特权

评论回复
jinglixixi|  楼主 | 2017-11-29 09:45 | 显示全部楼层
caoqing 发表于 2017-11-28 22:50
没有利用NUC472以太网功能,只用串口通信,如果用NUC472以太网口连接机智云就好了。 ...

还没做过这方面的内容,有时间学习学习。

使用特权

评论回复
643757107| | 2017-11-29 10:20 | 显示全部楼层
人家设计时候只要按照协议跟串口通信就行了。

使用特权

评论回复
sopc12| | 2017-12-4 14:26 | 显示全部楼层
不错,谢谢分享

使用特权

评论回复
734774645| | 2017-12-15 21:05 | 显示全部楼层
最近这个机智云很火啊。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

36

粉丝