查看: 3327|回复: 14

[原创] 【LPC824lite】进度②——视觉跟踪初步

[复制链接]
  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
    发表于 2016-10-27 21:09:07 | 显示全部楼层 |阅读模式
    本帖最后由 何昌昕 于 2016-10-27 21:48 编辑

    LPC824,板载资源很多是优点也是缺点,不如资源占据的IO口无法作为其他用途,除非更改硬件。笔者移植OLED时就被这些IO坑过,最后发现有些有上拉,有些接了芯片,所以建议外接模块时不要使用以下IO口,减少麻烦。
    1.串口:P0_0和P0_4作为默认的串口 非常好用
    2.SWD下载接口:P0_2和P0_3 不能作为通用口
    3.晶振接口:P0_8和P0_9作为晶振口,尽量不要使用
    4.电位器口:P0_23 挺好用的,但无法作为他用
    5.SPI芯片接口:P0_15/P0_24/P0_25/P0_26
    6.IIC芯片接口:P0_10/P0_11
    7.ISP和RST:P0_5和P0_12尽量不要使用
    这样一看剩下的接口还剩一半不到,资源宝贵。

    目前主要完成了获取上位机"迹"的信息获取,这款APP是网上一位大神开发的,APP就不做过多的介绍了,具体APK和arduino库下载可以看这个帖子目标跟随小车-让手机成为Arduino的眼睛
    附上处理串口数据的代码。

    #include "chip.h"
    #include "board.h"
    #include "string.h"
    #include "tick.h"
    #include "math.h"
    #include "lcd.h"

    #define TICKRATE_HZ     1000
    #define MAX_SIZE 128

    typedef struct{
            char RevBuff[MAX_SIZE];
          unsigned int RevCount;
        volatile unsigned int RevTime;
            unsigned char RevFlag;
            unsigned char RevOver;
    }UART_RevInfo;

    typedef struct{
          uint16_t X;
            uint16_t Y;
          uint16_t T;
    }TraceData;

    TraceData tData;

    UART_RevInfo info;
    UART_RevInfo *UART_Info = &info;

    //static uint16_t data;
    char str;

    void Task_200ms(void)
    {
            Board_LED_Toggle(0);
    }
    void Task_500ms(void)
    {
            Board_LED_Toggle(1);
    }
    void Task_1000ms(void)
    {
            Board_LED_Toggle(2);
    }

    void USART_RevSave(char input,UART_RevInfo *Struct)
    {
        if(Struct->RevCount<MAX_SIZE)
            {
                    Struct->RevBuff[Struct->RevCount++]=input;
            }
            Struct->RevTime=GetTime();
            Struct->RevFlag=0xff;
    }


    void UART0_IRQHandler(void)
    {   
        if((Chip_UART_GetStatus(LPC_USART0)&UART_STAT_RXRDY)!=0)
        {
          //data = Chip_UART_ReadByte(LPC_USART0);   
              str = Chip_UART_ReadByte(LPC_USART0);   
              //USART_RevSave(data,UART_Info);
              USART_RevSave(str,UART_Info);
        }
    }

    uint8_t Convert(char num)
    {   
          uint8_t temp;
            switch(num)
            {
                case '0':temp=0;break;
                case '1':temp=1;break;
                case '2':temp=2;break;
                case '3':temp=3;break;
                case '4':temp=4;break;
                case '5':temp=5;break;
                case '6':temp=6;;break;
                case '7':temp=7;;break;
                case '8':temp=8;break;
                case '9':temp=9;break;
                default:break;
            }
            return temp;
    }

    void DataSplit(void)
    {
          uint8_t j;
        uint8_t temp=0;
          uint8_t S1,S2,S3;
          for(j=3;j<UART_Info->RevCount;j++)
            {
                    if(UART_Info->RevBuff[j]==','||UART_Info->RevBuff[j]==';')//判断分号和逗号
                    {
                            //DEBUGOUT("SplitNum is %d\r\n",j);
                          temp++;
                          if(temp==1){S1=j;} //Round 1
                            if(temp==2){S2=j;} //Round 2
                            if(temp==3){S3=j;}
                    }            
            }
        //DEBUGOUT("%d %d\r\n",S1,S2);   
        for(j=3;j<S1;j++)
            {
                    //DEBUGOUT("%c ",UART_Info->RevBuff[j]);
                  //DEBUGOUT("%d",Convert(UART_Info->RevBuff[j]));   
                  //DEBUGOUT("%d",(int)pow(10,S1-j-1));            
                  tData.X+=Convert(UART_Info->RevBuff[j])*pow(10,S1-j-1);
            }
            for(j=S1+1;j<S2;j++)
            {
                    //DEBUGOUT("%c ",UART_Info->RevBuff[j]);
                  tData.Y+=Convert(UART_Info->RevBuff[j])*pow(10,S2-j-1);
            }        
            for(j=S2+1;j<S3;j++)
            {
                    //DEBUGOUT("%c ",UART_Info->RevBuff[j]);
                  tData.T+=Convert(UART_Info->RevBuff[j])*pow(10,S3-j-1);
            }
            //DEBUGOUT(" ");
            /*DEBUGOUT("X:%d ",tData.X);            
            DEBUGOUT("Y:%d ",tData.Y);            
            DEBUGOUT("T:%d\r\n",tData.T);*/   
            
           Display(tData.X,64,2);
            Display(tData.Y,64,4);
            Display(tData.T,64,6);
            if(tData.X>=160){Board_LED_Set(6,true);LCD_Print(0,0," left");}else{Board_LED_Set(6,false);LCD_Print(0,0,"right");}        
            if(tData.Y>=240){Board_LED_Set(7,true);LCD_Print(50,0," up ");}else{Board_LED_Set(7,false);LCD_Print(50,0,"down");}        
            if(tData.T>=20){Board_LED_Set(4,true);LCD_Print(90,0,"near");}else{Board_LED_Set(4,false);LCD_Print(90,0,"far ");}     
           tData.X=0;
            tData.Y=0;
            tData.T=0;
    }

    void SysTick_Handler(void)
    {
      static uint16_t sys_count;
        sys_count++;   
        CalacCounter();
        if(sys_count%200==0)
        {
             Task_200ms();   
        }
         if(sys_count%500==0)
        {
             Task_500ms();
        }
         if(sys_count%1000==0)
        {
             Task_1000ms();
        }
        if(sys_count>=1000)
        {
                sys_count=0;
        }
    }

    int main(void)
    {
      //uint16_t i;
        SystemCoreClockUpdate();
        Board_Init();
        LCD_Init();
        SysTick_Config(SystemCoreClock / TICKRATE_HZ);
      
         DEBUGOUT("UART IRQ example for both TX and RX\r\n");
       
        Chip_UART_IntEnable(LPC_USART0, UART_INTEN_RXRDY);
       
        NVIC_EnableIRQ(UART0_IRQn);
       
        LCD_Print(50,2,"X:");
        LCD_Print(50,4,"Y:");
        LCD_Print(50,6,"T:");
        while(1)
        {   
            
            if(UART_Info->RevFlag==0xff)
            {
                    if(DiffTime(UART_Info->RevTime,GetTime())>50)
                    {
                        
                            /*for(i=0;i<UART_Info->RevCount;i++)
                            {
                                 DEBUGOUT("%c",UART_Info->RevBuff);
                            }*/
                          if(UART_Info->RevBuff[0]=='o'&&UART_Info->RevBuff[1]=='k'
                             &&UART_Info->RevBuff[2]==','&&UART_Info->RevBuff[UART_Info->RevCount-1]==';')
                            {
                                 //DEBUGOUT("Data is OK!\r\n");
                                 DataSplit();
                            }
                            /*else if(UART_Info->RevBuff[0]=='f'&&UART_Info->RevBuff[1]=='a'
                                    &&UART_Info->RevBuff[2]=='i'&&UART_Info->RevBuff[3]=='l'
                                  &&UART_Info->RevBuff[4]==';')
                            {
                                 //DEBUGOUT("Error!\r\n");
                            }*/
                          UART_Info->RevCount=0;
                          UART_Info->RevFlag=0;      
                    }
            }
        }
    }
    最后附上视频,OLED用于显示指定颜色物体的X、Y轴坐标和距离T,通过这些信息,我们可以控制小车完成视觉跟踪的功能。等过两天有空了,自己移植一下Opencv试试,简单学习一下图像处理。
    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15343
    最后登录
    1970-1-1
    发表于 2016-10-27 21:41:03 | 显示全部楼层
    厉害,期待学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-8 10:40
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    110

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    279
    最后登录
    2016-12-30
    发表于 2016-10-27 21:55:33 | 显示全部楼层
    搬板凳前排学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
    发表于 2016-10-27 22:12:02 | 显示全部楼层
    厉害,学习下            
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
     楼主| 发表于 2016-10-27 23:48:28 | 显示全部楼层

    你头像是哪种芯片,看着眼熟
    签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-11-18 12:16
  • 签到天数: 560 天

    [LV.9]以坛为家II

    23

    主题

    913

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2305
    最后登录
    2019-11-18
    发表于 2016-10-28 08:35:05 | 显示全部楼层
    挺有意思的,最近也在学opencv,824lite性能还是孱弱…………
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3980
    最后登录
    2023-6-2
    发表于 2016-10-28 08:55:44 | 显示全部楼层
    这个是用手机实现的图像识别吗?




    nxp.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    [LV.5]常住居民I

    22

    主题

    817

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1713
    最后登录
    2019-12-7
    发表于 2016-10-28 09:37:42 | 显示全部楼层
    厉害,学习下      ,马上就能用到了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
     楼主| 发表于 2016-10-28 09:41:25 | 显示全部楼层
    andrewz 发表于 2016-10-28 08:55
    这个是用手机实现的图像识别吗?

    对 当然APP用的成电一个大神,以后有机会自己用一下opencv
    签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-31 12:48
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    91

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    280
    最后登录
    2017-3-31
    发表于 2016-10-28 13:53:47 | 显示全部楼层
    厉害厉害  学习了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-7 14:16 , Processed in 0.128477 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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