微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 第十七篇?rico board双模式小车项目演示(结项帖)

第十七篇?rico board双模式小车项目演示(结项帖)

时间:10-02 整理:3721RD 点击:

项目所需的硬件也都分别的调试通了,主要用到了Rico Board 的GPIO、外部中断、高精度定时器、定时器,还有额外的一个PWM转DA输出的硬件电路。

整个系统结构如下所示:


上图,也列出来了,是用到的GPIO管脚编号。

对应的驱动,都在我之前的帖子里都能找到。我也上传到了我的github上:iysheng's github。

编写的用户空间的程序如下所示:

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. typedef enum
  8. {        
  9.         false,true
  10. }bool;

  11. #define PT2262_PATH "/dev/input/event1"
  12. #define RADAR_PATH "/dev/radar0"
  13. #define MOTOR_PATH "/dev/motor0"
  14. #define MOTOR_F 1500
  15. #define MOTOR_L 1000
  16. #define MOTOR_R 2000
  17. #define DIRECTION_NUM 1

  18. int fd_mada[4],fd_pt2262,fd_radar,fd_motor;
  19. int motor_f = MOTOR_F;
  20. int motor_l = MOTOR_L;        
  21. int motor_r = MOTOR_R;
  22. int direction_num = DIRECTION_NUM+1;

  23. bool robot_mode = false;

  24. int wt_mada(int *fd, int *value)
  25. {
  26.         int i,ret;
  27.         char value_buf[8];
  28.         for(i=0; i value_l) ? motor_r : motor_l;
  29.         
  30. fail:
  31.         printf("\n**********************************return is %d.\n", ret);
  32.         return ret;
  33. }

  34. void paulse(void)
  35. {
  36.         int mada_value_tmp[4];
  37.         mada_value_tmp[0]=1;mada_value_tmp[1]=1;mada_value_tmp[2]=1;mada_value_tmp[3]=1;
  38.         wt_mada(fd_mada, mada_value_tmp);
  39.                
  40. }


  41. int main(int argc,char * * argv)
  42. {
  43.         char path_tmp[16];
  44.         char length_buf[16];
  45.         
  46.         int ret,i,j,mada_value[4],length;

  47.         struct input_event event;

  48.         ret = open(PT2262_PATH, O_RDWR|O_NONBLOCK);
  49.         if(ret < 0)
  50.                 goto fail1;
  51.         else
  52.                 fd_pt2262 = ret;

  53.         ret = open(MOTOR_PATH, O_RDWR);
  54.         if(ret < 0)
  55.                 goto fail2;
  56.         else
  57.                 fd_motor = ret;

  58.         ret = open(RADAR_PATH, O_RDWR);
  59.         if(ret < 0)
  60.                 goto fail3;
  61.         else
  62.                 fd_radar= ret;
  63.         
  64.         for(i=0;i<4;i++)
  65.         {
  66.                 sprintf(path_tmp, "/dev/mada%d", i);
  67.                 ret = open(path_tmp, O_RDWR);
  68.                 if(ret < 0)
  69.                         goto fail4;
  70.                 fd_mada[i] = ret;
  71.         }

  72.         while(1)
  73.         {
  74.                 read(fd_pt2262, &event, sizeof(struct input_event));
  75.                 if((event.value == 1)&&(event.type == EV_KEY)&&(event.code == 0x0f))
  76.                 {
  77.                         robot_mode = !robot_mode;//切换工作模式
  78.                 }
  79.                 if((event.value == 1)&&(event.type == EV_KEY)&&(robot_mode == true))
  80.                 {
  81.                         wt_motor(fd_motor,MOTOR_F);
  82.                         switch(event.code)
  83.                         {
  84.                                 case 0x10:
  85.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=1;mada_value[3]=999;break;
  86.                                 case 0x12:
  87.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=999;mada_value[3]=1;break;
  88.                                 case 0x13:
  89.                                         mada_value[0]=999;mada_value[1]=1;mada_value[2]=1;mada_value[3]=999;break;
  90.                                 case 0x11:
  91.                                         mada_value[0]=1;mada_value[1]=1;mada_value[2]=1;mada_value[3]=1;break;
  92.                                 default:
  93.                                         break;
  94.                         }
  95.                         wt_mada(fd_mada, mada_value);
  96.                 }
  97.                 else if(robot_mode == false)
  98.                 {
  99.                         memset(length_buf,0,sizeof(length_buf));
  100.                         ret = read(fd_radar,length_buf,sizeof(length_buf));
  101.                         if(ret < 0)
  102.                         {
  103.                                 printf("read radar failed.\n");
  104.                                 goto fail4;
  105.                         }
  106.                         //printf("read length is %s.\n",length_buf);
  107.                         length = atoi(length_buf);
  108.                         if(length < 50)
  109.                         {
  110.                                 ret = get_direction();
  111.                                 if(ret == motor_r)
  112.                                 {
  113.                                         mada_value[0]=999;mada_value[1]=1;mada_value[2]=1;mada_value[3]=999;wt_mada(fd_mada, mada_value);        
  114.                                 }
  115.                                 else if(ret == motor_l)
  116.                                 {
  117.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=999;mada_value[3]=1;wt_mada(fd_mada, mada_value);
  118.                                 }
  119.                                 else
  120.                                 {
  121.                                         printf("valid get_direction return.\n");
  122.                                 }
  123.                                 sleep(1);                                
  124.                         }
  125.                         else
  126.                         {
  127.                                 wt_motor(fd_motor,MOTOR_F);
  128.                                 mada_value[0]=1;mada_value[1]=999;mada_value[2]=1;mada_value[3]=999;wt_mada(fd_mada, mada_value);
  129.                         }
  130.                 }
  131.                 printf("robot_mode is %d.\n", robot_mode);
  132.         }
  133.         
  134. fail4:
  135.         printf("fd_radar err.\n");
  136.         close(fd_radar);
  137.         for(j=0; j<i; j++)
  138.         {
  139.                 close(fd_mada[j]);
  140.         }
  141. fail3:
  142.         printf("fd_motor err.\n");
  143.         close(fd_motor);
  144. fail2:
  145.         printf("fd_pt2262 err.\n");
  146.         close(fd_pt2262);
  147. fail1:
  148.         return ret;
  149. }

复制代码

对应的按键的功能呢个如下:


其中,前进、停止、左转、右转都是在遥控模式下使用的,电视键起到遥控模式和自主避障两种模式之间的切换。自主避障模式下,前方的舵机会自动旋转带动雷达,探测两侧到障碍物的距离信息,完成避障。


对应的,我录制了模拟的演示的视频(包含两种模式,极其切换过程):

http://v.youku.com/v_show/id_XMTgzNjY5OTU3Ng==.html

以及两种模式下的运动视频(还是接的5v电源,所以只是在我的桌子上运动了下,权当作演示了):

自主导航避障模式

http://v.youku.com/v_show/id_XMTgzNzM4OTIyNA==.html

遥控模式:

http://v.youku.com/v_show/id_XMTg0MTE3NjM2NA==.html


总结一下这次试用,在linux驱动方面,对于一个架构有了进一步的了解,知道了总线、设备和驱动的三部分;对于uboot我学习到了如何添加自定义命令的层次;对于kernel,我学到了如何固化自己的驱动到内核中。


干货 get

谢谢支持。

必须支持, 原创高手来袭~

lemon,uboot,我修改了对应的start.S,让LED熄灭,但是led却还在亮着,可能是什么问题啊?

start.S 修改了, 建议你看一下反汇编代码,确认一下对应的代码是否已经改变了; 另外就是查看一下LED对应的寄存器,是不是看错了。   一般来说, start.S编译之后的start.o 在链接中,应该是最先开始的。

应该是改变了,因为,修改后,uboot从SD卡启动,串口都没有输出了,取消我修改的部分,串口就能正常输出。uboot编译后生成了MLO uboot.img这种形式有什么特殊要注意的地方吗?

这个具体生成的文件,你要看看 rico的芯片是什么, S5PV210生成的是uboot.bin

AM437X,官方的生成的就是MLO和uboot.img

那就应该没有错的; 加入你的代码,串口就没有输出, 这个着实奇怪了,你加一个打印字符的语句看看。

我准备换一个别的gpio试一下,不用板载的led。

恩, 这个主意也是极好的。

再uboot的的start.S文件直接修改,使用用别的gpio配置,还是没有成功。

你重新解压一下uboot的压缩包,重新修改试试看。

不太懂啊!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top