传媒学子

  • 2019-08-14
  • 回复了主题帖: 来聊聊吧:5G为何是一种革命?

    这个报告写得不错,可以更为深入的了解5G,赞一个 个人感觉: 5G,感觉是4G+;总感觉不是太靠谱。 但是,各种5G商用,5G什么的,也不知道真的假的。 总之,资本大量涌入了5G领域,一场产品升级换代的事业,必将创造更多的就业岗位,GDP,和故事。 自动驾驶,电动汽车,都是故事性很强,市场确并不是认可,能不能发展起来,关键还是能不能让老百姓真正的感触到。    

  • 2019-07-10
  • 回复了主题帖: 趋势讨论:5G 时代什么会火?

    5G主要体现在通信速度的提升上,通信延迟会大大降低,远程实时性操作会变得更为流畅。 人工智能,机器人会快速发展,自动驾驶等技术也会得到提升。 5G能火了啥? 这个还真不好说,空中课堂,自动驾驶,智能家居,估计都能火。 5G还可能让远程操控,自动监控等更加成熟。 EEworld的百亿估值 或许也能被5G带火呦

  • 2019-07-09
  • 加入了学习《基于GD32E231的金鱼自动投喂机器人设计》,观看 基于GD32E231的金鱼自动投喂机器人设计

  • 回复了主题帖: 【RT-Thread读书笔记】9. RT-Thread 学习14-16章读后感

    沈婷婷 发表于 2019-7-9 11:00 为什么RT-Thread的启动流程里面,“小心翼翼,十分谨慎”里面如何实现的。每创建一个线程后它都 ...
    “小心翼翼..”是什么?书么?

  • 2019-07-01
  • 回复了主题帖: [颁奖]学习有礼,分享也有礼,跟着小梅哥一起Soc FPGA走起

    确认个人信息无误,感谢EE 感谢小梅哥

  • 2019-06-23
  • 加入了学习《《小水电站自动控制》项目演示》,观看 《家庭智能监控》项目演示

  • 加入了学习《小梅哥Intel SoC FPGA开发与应用培训课程》,观看 soc基本概念

  • 回复了主题帖: 07. 基于GD32E231的金鱼自动投喂机器人设计

    word版本在此,主要word版本格式容易变乱,所以一般release都用pdf版本的

  • 2019-05-28
  • 加入了学习《小梅哥Intel SoC FPGA开发与应用培训课程》,观看 soc开发工具

  • 评论了课程: EEWORLD大学堂----小梅哥Intel SoC FPGA开发与应用培训课程

    不错不错

  • 加入了学习《FPGA设计思想与验证方法视频教程(小梅哥主讲)》,观看 第十二课 嵌入式块RAM使用之双口RAM

  • 加入了学习《FPGA设计思想与验证方法视频教程(小梅哥主讲)》,观看 第一课 科学的FPGA开发流程(中)

  • 加入了学习《FPGA设计思想与验证方法视频教程(小梅哥主讲)》,观看 第一课 科学的FPGA开发流程(上)

  • 加入了学习《FPGA设计思想与验证方法视频教程(小梅哥主讲)》,观看 作者语_芯航线FPGA开发板介绍

  • 2019-05-26
  • 加入了学习《智能房车控制系统作品演示》,观看 作品演示

  • 回复了主题帖: [GD32E231 DIY大赛]作品提交:观赏鱼缸控制器

    牛,手巧

  • 加入了学习《EE网友DIY作品:都市青年家庭安防卫士》,观看 都市青年家庭安防卫士

  • 发表了主题帖: 07. 基于GD32E231的金鱼自动投喂机器人设计

    本帖最后由 传媒学子 于 2019-5-26 19:36 编辑 基于GD32E231的金鱼自动投喂机器人设计作品提交 一、项目背景 长时间出差不在家,家里的金鱼会挨饿。因此,为了让金鱼在主人不在家的时候不会挨饿,基于4自由度机械手臂和GD32E231设计一款基于自动投喂机器人。 GD32E231通过生成PWM来控制机械臂,同时按照预先设定的时间,从固定地方去取鱼食,放入鱼缸,通过多次人工训练,让机械臂根据人工训练的数据,实现自动计算投喂取食位置。 同时还可以增加一些辅助功能,通过串口或者板载ADC加上光敏电阻来大概获取GD32E231的内部温度和鱼缸周围光照情况,天黑暗时可以打开台灯等照明设备。 该系统采用了GD32E231的以下功能:1. UART 高性能异步通信接口2. GPIO 通用输入输出接口3. 72MHz主频4. RTC实时时钟5. Timer0定时器触发DMA传输6. DMA传输7. Timer2 启动四通道PWM来连接机械臂8. 外部中断ETI9. ADC 内部模数转换 从实际测试效果和项目推进过程中所用的模块具体运行情况来看,GD32E231这款处理器,定时器功能强大,定时器2可以输出4路PWM,而且ADC功能也很实用,可用于普通的机器人应用。 二、系统设计本项目基于兆易创新公司生产的GD32E231arm处理器,作为《基于GD32E231的金鱼自动投喂机器人设计》的主控处理器,负责读取光照数据,比对定时时间,执行自动或者手动投喂任务。图2.1 基于GD32E231的金鱼自动投喂机器人架构图2.1 硬件设计 硬件设计采用Arduino转接板,电源采用5V3A供电+电脑USB-串口供电,具体硬件电路如下:图2.2部分硬件连接图2.2软件设计 软件设计主要围绕ov5640的驱动来实施的,程序实施原理图如下图2.3程序框架图 程序流程图如下: 代码参看: EEWORLD论坛_作品提交贴附件, 代码工程路径:Auto_Feed_Robot\auto_feed_robot\Projects\auto_feed_robot\MDK-ARM\ 部分函数:void adc_rcu_config(void); void adc_gpio_config(void); void adc_dma_config(void); void adc_timer_config(void); void adc_config(void); void display_adc_value(void); void rtc_setup(void); void rtc_show_time(void); void rtc_pre_config(void); void rtc_comp_time(void); void led_config(void); void led_flash(int times); void exti_config(void); void gpio_config(void); void pwm_timer_clock_enable(void); void pwm_timer_config(uint32_t timer); void control_motor(uint8_t motor_tag, uint32_t pulse); void auto_feed_fish(void); 复制代码 三、项目完成情况 项目历时30天(2019年4月27日到2019年5月26日),项目完成了预期的所有内容,并额外扩展了光敏传感器和串口显示功能。 图3.1实物图 实现的功能主要有:1. 定时器0触发ADC,并通过DMA传输数据2. 定时器2配置四通道PWM,实现对机械臂的控制3. 通过人工训练,得到较好的抓取位置和释放位置4. 通过不断尝试,克服了电源峰值功率不能满足机械臂快速调整的弊端,通过平滑调整,实现对机械臂的控制5. 成功实现RTC模块,通过RTC模块,实现定时启动投喂,每次投喂次数可设定,默认为3次,可设定每天投喂几次,何时投喂6. 串口显示系统信息,方便调试和人工交互 四、项目总结与展望 4.1 项目总结 (1) 项目实现了对机械臂的控制,并且能够实现抓取鱼食进行投喂。 (2) 项目实现了对鱼缸所处光照情况的采集,用于打开灯或者关闭等,项目中以LED4模拟实现。 (3) 同时,增加了常用的串口模块,方便用于扩展和交互。 4.2 未来的优化搭建web服务器,实现远程控制机械臂。 4.3 论坛发帖情况 [GD32E231 DIY大赛] 01. GD32E231-start以及创意内容介绍http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1075713&fromuid=363532(出处: 电子工程世界-论坛) [GD32E231 DIY大赛] 02. 为何PWM的占空比不能在外部中断服务函数中更改?http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1076014&fromuid=363532(出处: 电子工程世界-论坛) [GD32E231 DIY大赛] 03. 忽视运放设置会导致PB1输出电压不正确http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1076051&fromuid=363532(出处: 电子工程世界-论坛) [GD32E231 DIY大赛] 04. 机械臂艰难的组装过程http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1077469&fromuid=363532(出处: 电子工程世界-论坛) [GD32E231 DIY大赛] 05. 自动喂鱼机器人之PWM篇http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1077467&fromuid=363532(出处: 电子工程世界-论坛) [GD32E231 DIY大赛] 06. 自动喂鱼机器人之ADC/DMA/TIMER0/串口篇http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1077838&fromuid=363532(出处: 电子工程世界-论坛) 07. 基于GD32E231的金鱼自动投喂机器人设计http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1078206&fromuid=363532(出处: 电子工程世界-论坛) 五、致谢 感谢论坛一如既往的支持,感谢GD公司提供开发板和样片,感谢各位坛友的帮助,让我们支持国产,奋发图强,砥砺前行!

  • 2019-05-21
  • 发表了主题帖: [GD32E231 DIY大赛] 06. 自动喂鱼机器人之ADC/DMA/TIMER0/串口篇

    [GD32E231 DIY大赛] 06. 自动喂鱼机器人之ADC/DMA/TIMER0/串口篇 这里用到了光敏电阻来监测鱼缸周围的光照度。 从内部ADC采集,定时器0的比较事件0触发ADC转换,ADC转换的结果将随着模拟值输入的改变而改变。 转换结果由DMA 搬运到SRAM 中,最后判断AD的值是否大于一定数值。 具体程序如下: 首先涉及以下函数和变量: __IO uint16_t ad_value[220];  //day:ad_value 2500 void adc_rcu_config(void); void adc_gpio_config(void); void adc_dma_config(void); void adc_timer_config(void); void adc_config(void); void display_adc_value(void);复制代码/*!     \brief      RCU configuration function for ADC     \param[in]  none     \param[out] none     \retval     none */ void adc_rcu_config(void) {     /* enable the GPIO clock */     //rcu_periph_clock_enable(RCU_GPIOA);     //rcu_periph_clock_enable(RCU_GPIOB);     //rcu_periph_clock_enable(RCU_GPIOC);    // rcu_periph_clock_enable(RCU_GPIOF);     /* ADCCLK = PCLK2/6 */     rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);     /* enable DMA clock */     rcu_periph_clock_enable(RCU_DMA);     /* enable ADC clock */     rcu_periph_clock_enable(RCU_ADC);     /* enable TIMER0 clock */     rcu_periph_clock_enable(RCU_TIMER0); } /*!     \brief      GPIO configuration function for ADC     \param[in]  none     \param[out] none     \retval     none */ void adc_gpio_config(void) {     /* configure PA2(ADC channel2) as analog input */     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2); } /*!     \brief      DMA configuration function for ADC     \param[in]  none     \param[out] none     \retval     none */ void adc_dma_config(void) {     dma_parameter_struct dma_init_struct;     /* initialize DMA channel0 */     dma_deinit(DMA_CH0);     dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;     dma_init_struct.memory_addr  = (uint32_t)ad_value;     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;     dma_init_struct.number       = 220;     dma_init_struct.periph_addr  = (uint32_t)&(ADC_RDATA);     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;     dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;     dma_init(DMA_CH0, &dma_init_struct);         /* configure DMA mode */     dma_circulation_enable(DMA_CH0);     dma_memory_to_memory_disable(DMA_CH0);         /* enable DMA channel0 */     dma_channel_enable(DMA_CH0); } /*!     \brief      TIMER configuration function for ADC     \param[in]  none     \param[out] none     \retval     none */ void adc_timer_config(void) {     timer_oc_parameter_struct timer_ocintpara;     timer_parameter_struct timer_initpara;     timer_deinit(TIMER0);     /* TIMER0 configuration */     timer_initpara.prescaler         = 5;     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;     timer_initpara.counterdirection  = TIMER_COUNTER_UP;     timer_initpara.period            = 399;     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;     timer_initpara.repetitioncounter = 0;     timer_init(TIMER0, &timer_initpara);     /* CH0 configuration in PWM mode1 */     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_LOW;     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;     timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);     timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 100);     timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM1);     timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);     /* auto-reload preload enable */     timer_auto_reload_shadow_enable(TIMER0);     timer_primary_output_config(TIMER0, ENABLE); } /*!     \brief      ADC configuration function     \param[in]  none     \param[out] none     \retval     none */ void adc_config(void) {     /* ADC channel length config */     adc_channel_length_config(ADC_REGULAR_CHANNEL, 1);     /* ADC regular channel config */     adc_regular_channel_config(0, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);     /* ADC external trigger enable */     adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);     /* ADC external trigger source config */     adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T0_CH0);     /* ADC data alignment config */     adc_data_alignment_config(ADC_DATAALIGN_RIGHT);     /* enable ADC interface */     adc_enable();     /* ADC calibration and reset calibration */     adc_calibration_enable();     /* ADC DMA function enable */     adc_dma_mode_enable(); } void display_adc_value(void) {           printf("\r\n%d\r\n",ad_value[0]); } 复制代码 ad转换我只用了第一个值,其实DMA传输会不停的循环传输。 主函数中这样用: gd_eval_com_init(EVAL_COM1,115200);   adc_rcu_config();     adc_gpio_config();           adc_dma_config();     adc_timer_config();     adc_config();          /* TIMER0 counter enable for ADC */     timer_enable(TIMER0);                 /* test on channel0 transfer complete flag */                 while( !dma_flag_get(DMA_CH0, DMA_FLAG_FTF));                 display_adc_value();复制代码 然后在while(1) 中执行display_adc_value(); 就能把值实时打印到串口。 DMA配置完会不断循环写入到buffer中,配置完成后CPU不需要参与,我们在循环中,可以直接读取AD值,这些值在配置DMA时是循环覆盖写入的。 printf是采用串口显示, 具体方法如下,在keil的魔术棒option里,Target中,勾选Use MicroLIB, 然后添加如下子程序,重新映射串口,/* retarget the C library printf function to the USART */ int fputc(int ch, FILE *f) {     usart_data_transmit(EVAL_COM1, (uint8_t)ch);     while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE));     return ch; }复制代码 关于串口初始化:gd_eval_com_init(EVAL_COM1,115200); 其是在gd32e231c_start.c、gd32e231c_start.h中定义的: gd32e231c_start.h //-----------------added by user--------------------------// /* eval board low layer COM */ #define COMn                             1U   //定义数组大小 /* definition for COM0, connected to USART0 */ #define EVAL_COM1                        USART0 #define EVAL_COM1_CLK                    RCU_USART0 #define EVAL_COM1_TX_PIN                 GPIO_PIN_9 #define EVAL_COM1_RX_PIN                 GPIO_PIN_10 #define EVAL_COM_GPIO_PORT               GPIOA #define EVAL_COM_GPIO_CLK                RCU_GPIOA #define EVAL_COM_AF                      GPIO_AF_1 /* configure COM port */ void gd_eval_com_init(uint32_t com, uint32_t baud);复制代码 gd32e231c_start.c static rcu_periph_enum COM_CLK[COMn]  = {EVAL_COM1_CLK}; static uint32_t COM_TX_PIN[COMn]      = {EVAL_COM1_TX_PIN}; static uint32_t COM_RX_PIN[COMn]      = {EVAL_COM1_RX_PIN};复制代码 void gd_eval_com_init(uint32_t com, uint32_t baud) {     uint32_t COM_ID;        if(EVAL_COM1 == com){         COM_ID = 0U;     }else{     }     /* enable COM GPIO clock */     rcu_periph_clock_enable(EVAL_COM_GPIO_CLK);     /* enable USART clock */     rcu_periph_clock_enable(COM_CLK[COM_ID]);     /* connect port to USARTx_Tx */     gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN[COM_ID]);     /* connect port to USARTx_Rx */     gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN[COM_ID]);     /* configure USART Tx as alternate function push-pull */     gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);     gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_TX_PIN[COM_ID]);     /* configure USART Rx as alternate function push-pull */     gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);     gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, COM_RX_PIN[COM_ID]);     /* USART configure */     usart_deinit(com);    // usart_baudrate_set(com, 115200U);           usart_baudrate_set(com, baud);     usart_receive_config(com, USART_RECEIVE_ENABLE);     usart_transmit_config(com, USART_TRANSMIT_ENABLE);     usart_enable(com); }复制代码 注意串口0还是1。 -------------------------------------------

  • 2019-05-20
  • 回复了主题帖: [GD32E231 DIY大赛] 04. 机械臂艰难的组装过程

    hujj 发表于 2019-5-19 20:54 看了几遍还没有明白这机械手的结构原理。
    很简单,四个舵机,转向,控制舵机就行

最近访客

< 1/4 >

统计信息

已有192人来访过

  • 芯币:2493
  • 好友:3
  • 主题:76
  • 回复:323
  • 课时:3
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


warmeros 2018-11-25
你好,在么
查看全部