米尔电子
直播中

杨永胜

12年用户 2379经验值
擅长:嵌入式技术
私信 关注

【Rico Board试用体验】第十七篇☞rico board双模式小车项目演示(结项帖)

本帖最后由 iysheng 于 2017-1-5 12:09 编辑

项目所需的硬件也都分别的调试通了,主要用到了Rico Board GPIO、外部中断、高精度定时器、定时器,还有额外的一个PWMDA输出的硬件威廉希尔官方网站
整个系统结构如下所示:
0004.PNG
上图,也列出来了,是用到的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<4; i++)
  29.         {        
  30.                 sprintf(value_buf, "%d", value[i]);
  31.                 //printf("mada_value[%d]:%sn",i,value_buf);
  32.                 ret = write(fd[i],value_buf,strlen(value_buf));
  33.                 if(ret < 0)
  34.                         goto fail;
  35.         }
  36.         return ret;
  37. fail:
  38.         printf("write failed.n");
  39.         return ret;
  40. }

  41. int wt_motor(int fd, int value)
  42. {
  43.         char value_buf[8];
  44.         int ret;
  45.         sprintf(value_buf, "%d", value);
  46.         ret = write(fd, value_buf, strlen(value_buf));
  47.         return ret;
  48. }

  49. int get_direction(void)
  50. {
  51.         char value_left[8];
  52.         char value_right[8];
  53.         int value_l,value_r,ret;
  54.         char value[8];
  55.         sprintf(value, "%d", motor_l);
  56.         write(fd_motor, value, strlen(value));
  57.         sleep(1);
  58.         memset(value_left, 0, sizeof(value_left));
  59.         memset(value_right, 0, sizeof(value_right));
  60.         ret = read(fd_radar, value_left, sizeof(value_left));
  61.         if(ret < 0)
  62.         {
  63.                 printf("get_direction left err.n");
  64.                 goto fail;
  65.         }
  66.         else
  67.         {
  68.                 value_l = atoi(value_left);
  69.                 //printf("int value_l is %d.n", value_l);
  70.                 //printf("n************************char value_l is %s.n", value_left);
  71.         }

  72.         sprintf(value, "%d", motor_r);
  73.         write(fd_motor, value, strlen(value));
  74.         sleep(1);
  75.         //printf("motor_r is %s.n", value);
  76.         ret = read(fd_radar, value_right, sizeof(value_right));
  77.         if(ret < 0)
  78.         {
  79.                 printf("get_direction right err.n");
  80.                 goto fail;
  81.         }
  82.         else
  83.         {
  84.                 value_r = atoi(value_right);
  85.                 //printf("value_r is %s.n", value_right);
  86.         }
  87.         ret = (value_r > value_l) ? motor_r : motor_l;
  88.         
  89. fail:
  90.         printf("n**********************************return is %d.n", ret);
  91.         return ret;
  92. }

  93. void paulse(void)
  94. {
  95.         int mada_value_tmp[4];
  96.         mada_value_tmp[0]=1;mada_value_tmp[1]=1;mada_value_tmp[2]=1;mada_value_tmp[3]=1;
  97.         wt_mada(fd_mada, mada_value_tmp);
  98.                
  99. }


  100. int main(int argc,char * * argv)
  101. {
  102.         char path_tmp[16];
  103.         char length_buf[16];
  104.         
  105.         int ret,i,j,mada_value[4],length;

  106.         struct input_event event;

  107.         ret = open(PT2262_PATH, O_RDWR|O_NONBLOCK);
  108.         if(ret < 0)
  109.                 goto fail1;
  110.         else
  111.                 fd_pt2262 = ret;

  112.         ret = open(MOTOR_PATH, O_RDWR);
  113.         if(ret < 0)
  114.                 goto fail2;
  115.         else
  116.                 fd_motor = ret;

  117.         ret = open(RADAR_PATH, O_RDWR);
  118.         if(ret < 0)
  119.                 goto fail3;
  120.         else
  121.                 fd_radar= ret;
  122.         
  123.         for(i=0;i<4;i++)
  124.         {
  125.                 sprintf(path_tmp, "/dev/mada%d", i);
  126.                 ret = open(path_tmp, O_RDWR);
  127.                 if(ret < 0)
  128.                         goto fail4;
  129.                 fd_mada[i] = ret;
  130.         }

  131.         while(1)
  132.         {
  133.                 read(fd_pt2262, &event, sizeof(struct input_event));
  134.                 if((event.value == 1)&&(event.type == EV_KEY)&&(event.code == 0x0f))
  135.                 {
  136.                         robot_mode = !robot_mode;//切换工作模式
  137.                 }
  138.                 if((event.value == 1)&&(event.type == EV_KEY)&&(robot_mode == true))
  139.                 {
  140.                         wt_motor(fd_motor,MOTOR_F);
  141.                         switch(event.code)
  142.                         {
  143.                                 case 0x10:
  144.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=1;mada_value[3]=999;break;
  145.                                 case 0x12:
  146.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=999;mada_value[3]=1;break;
  147.                                 case 0x13:
  148.                                         mada_value[0]=999;mada_value[1]=1;mada_value[2]=1;mada_value[3]=999;break;
  149.                                 case 0x11:
  150.                                         mada_value[0]=1;mada_value[1]=1;mada_value[2]=1;mada_value[3]=1;break;
  151.                                 default:
  152.                                         break;
  153.                         }
  154.                         wt_mada(fd_mada, mada_value);
  155.                 }
  156.                 else if(robot_mode == false)
  157.                 {
  158.                         memset(length_buf,0,sizeof(length_buf));
  159.                         ret = read(fd_radar,length_buf,sizeof(length_buf));
  160.                         if(ret < 0)
  161.                         {
  162.                                 printf("read radar failed.n");
  163.                                 goto fail4;
  164.                         }
  165.                         //printf("read length is %s.n",length_buf);
  166.                         length = atoi(length_buf);
  167.                         if(length < 50)
  168.                         {
  169.                                 ret = get_direction();
  170.                                 if(ret == motor_r)
  171.                                 {
  172.                                         mada_value[0]=999;mada_value[1]=1;mada_value[2]=1;mada_value[3]=999;wt_mada(fd_mada, mada_value);        
  173.                                 }
  174.                                 else if(ret == motor_l)
  175.                                 {
  176.                                         mada_value[0]=1;mada_value[1]=999;mada_value[2]=999;mada_value[3]=1;wt_mada(fd_mada, mada_value);
  177.                                 }
  178.                                 else
  179.                                 {
  180.                                         printf("valid get_direction return.n");
  181.                                 }
  182.                                 sleep(1);                                
  183.                         }
  184.                         else
  185.                         {
  186.                                 wt_motor(fd_motor,MOTOR_F);
  187.                                 mada_value[0]=1;mada_value[1]=999;mada_value[2]=1;mada_value[3]=999;wt_mada(fd_mada, mada_value);
  188.                         }
  189.                 }
  190.                 printf("robot_mode is %d.n", robot_mode);
  191.         }
  192.         
  193. fail4:
  194.         printf("fd_radar err.n");
  195.         close(fd_radar);
  196.         for(j=0; j
  197.         {
  198.                 close(fd_mada[j]);
  199.         }
  200. fail3:
  201.         printf("fd_motor err.n");
  202.         close(fd_motor);
  203. fail2:
  204.         printf("fd_pt2262 err.n");
  205.         close(fd_pt2262);
  206. fail1:
  207.         return ret;
  208. }
对应的按键的功能呢个如下:
0003.jpg
其中,前进、停止、左转、右转都是在遥控模式下使用的,电视键起到遥控模式和自主避障两种模式之间的切换。自主避障模式下,前方的舵机会自动旋转带动雷达,探测两侧到障碍物的距离信息,完成避障。

对应的,我录制了模拟的演示的视频(包含两种模式,极其切换过程):
[media]http://v.youku.com/v_show/id_XMTgzNjY5OTU3Ng==.html[/media]
以及两种模式下的运动视频(还是接的5v电源,所以只是在我的桌子上运动了下,权当作演示了):
自主导航避障模式
[media]http://v.youku.com/v_show/id_XMTgzNzM4OTIyNA==.html[/media]
遥控模式:
[media]http://v.youku.com/v_show/id_XMTg0MTE3NjM2NA==.html[/media]

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

回帖(14)

小萃米

2016-12-1 14:01:44
干货 get
举报

杨永胜

2016-12-1 17:30:12

谢谢支持。
举报

柠檬守护

2016-12-10 10:40:12
必须支持, 原创高手来袭~
举报

杨永胜

2016-12-10 22:25:41
引用: 柠檬守护 发表于 2016-12-10 10:40
必须支持, 原创高手来袭~

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

柠檬守护

2016-12-10 23:11:12
引用: iysheng 发表于 2016-12-10 22:25
lemon,uboot,我修改了对应的start.S,让LED熄灭,但是led却还在亮着,可能是什么问题啊?

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

杨永胜

2016-12-11 19:31:56
引用: 柠檬守护 发表于 2016-12-10 23:11
start.S 修改了, 建议你看一下反汇编代码,确认一下对应的代码是否已经改变了; 另外就是查看一下LED对应的寄存器,是不是看错了。   一般来说, start.S编译之后的start.o 在链接中,应该是最先开始的。

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

柠檬守护

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

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

杨永胜

2016-12-11 19:40:39
引用: 柠檬守护 发表于 2016-12-11 19:34
这个具体生成的文件,你要看看 rico的芯片是什么, S5PV210生成的是uboot.bin

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

柠檬守护

2016-12-11 19:42:12
引用: iysheng 发表于 2016-12-11 19:40
AM437X,官方的生成的就是MLO和uboot.img

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

杨永胜

2016-12-12 14:39:18
引用: 柠檬守护 发表于 2016-12-11 19:42
那就应该没有错的; 加入你的代码,串口就没有输出, 这个着实奇怪了,你加一个打印字符的语句看看。

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

柠檬守护

2016-12-12 15:03:34
引用: iysheng 发表于 2016-12-12 14:39
我准备换一个别的gpio试一下,不用板载的led。

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

杨永胜

2016-12-24 06:57:01
引用: 柠檬守护 发表于 2016-12-12 15:03
恩, 这个主意也是极好的。

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

柠檬守护

2016-12-25 20:42:17
引用: iysheng 发表于 2016-12-24 06:57
再uboot的的start.S文件直接修改,使用用别的gpio配置,还是没有成功。

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

licongxingguang

2016-12-25 21:32:27
不太懂啊!!!!!!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分