快要插爆了。。。。

中山野鬼 发布于 2015/10/31 04:05
阅读 1K+
收藏 4

最近忙着做个小车,其实是机器人,但别人说不象,无所谓,我就权且说它是小车,哈。自己给自己挖个坑,给小朋友搞活动没器材,机器人厂家不给力,我要的指标没有货,索性自己玩了。测试用的开发板直接拿了arduino uno板,后面换成arduino nano板应付一下后就自己开板了,原因嘛,很简单,现在快要插爆了。哈。

目前一共插了27根。总共要插30根。

vcc /gnd input : 2根

4路DC输出: 8根

usb host (ch376b):5根

nrf24l01+ : 8根

mpu6050 : 4根

1路舵机: 3根(还没插)其实计算资源变化不大下可支持8路,腿不够,不考虑了。哈。

电源电压检测这个版本不做了。不然还有的插,而且到爆点了。哈。

整体系统的系统设计目标和技术指标的大概信息如下:

可由无线手柄控制,带有姿态稳定的4路电机驱动和1路舵机驱动的执行处理单元。

1、200Hz的姿态检测及姿态稳定控制

2、100Hz的手柄信息检测及模式控制

3、4路独立实时,正负双向32速驱动(不含死区)

4、1路舵机输出。

一路过来是小坑不断。上面比较重要的一个技术指标是4路dc独立实时输出操作,大部分的坑也是基本从这出来的。没有采用pwm方式驱动,而是采用的量化bit的方式来驱动。简单举例,理想情况下,如果分8个速度当,那么 速度五则按照周期 输出 1 0 1 1 1 0 1 0 ,如果速度是3 则按周期输出 0 1 0 1 0 1 0 0 ,当然实际的设计考虑死区做补偿,要比这个稍微复杂点点,不过也只是造速度表的简单算法问题。这样的效果比pwm要好,死区小,同时电机共振区基本落在死区内。

要保证上述操作,目前是16个us做一次中断,4路电机的上述处理,系统计算资源占用比约在25%左右。这里用了timer2 ,因为它的优先级相对较高,在reset ,int0,int1 ,pintXX和看门狗中断之后。除了reset ,看门狗,中间两种中断我是喀嚓掉的,由此保证dc输出的实时性。

舵机采用类似算法,其实可以同时输出8路不同的舵机,计算费用一样,不过腿不够,暂时只支撑一路,用的是timer1。

余下除了真正的软件内容,碰硬件的都是按照1ms的方式实时化操作。包括从usb host 获取无线手柄的数据,nrf24l01+发送无线数传数据(如果有),定期检测mpu6050数据等等。正常主循环就做点软件该做的事情,反正碰驱动硬件的,放主while里面玩,这是小孩子的玩法,哈。

为了毫秒计数器仍然可行,以及timer2 ,timer1的中断能响应,实际timer0的中断代码如下:

ISR(TIMERMS_OVF_vect)//func module count
{
  

  TCNT0 = DEF_1KHZ;

  timer0_millis++;
#ifdef NEST_TEST
    static uint8_t seiflag = 0;
    if (seiflag != 0){
        seiflag = 2;
        return; 
    }else{
        seiflag = 1;
    }
#endif
    sei();
   // half_millis_mission();
    
        
    millis_mission();
        
    cli();
    seiflag = 0;
    return;
}



为了防止自嵌套,这里增加了seiflag的函数内局部数据(我不喜欢说变量)。

目前millis_mission中可以处理5个不同的函数,我的个人名词叫做实时任务槽,。类似不同进程分别工作,当然和进程还差了十万八千里。无非多个函数同一个毫秒内,依次走一把,其实就是一个函数指针的数组,没啥新奇的。。目前没时间折腾arm,等这个执行处理模块折腾完了,肯定要折腾arm的,看有啥好的rtos可以上,linux肯定是不上的,上linux不如上freebsd。如果是freebsd看是否能内核改改,构造几个实时任务槽出来。哈。(说linux 和freebsd没有什么区别的,我只能说,你没被各种小坑坑惨过,反正我现在mac os 下写代码,能不转到linux上就不转)。

忙了段时间,槽点不少:

最要吐槽的是ch375b 。

槽点1:这个片子,第一死贵,贵有贵的理由,里面应该是有个单片机的。关键是,它不是并口就是串口,加个spi会死人吗,i2c也行啊?反正你的片子已经死贵了,不差这点成本吧。ch375b的,东西是不错,几个命令一打,就工作,但是占了串口,更本没办法通过串口做debug,也没办法下载代码,每次下载代码都要拔插模块的线。

最开始ch375b的驱动,完全苦逼的靠板子的led的闪的次数观测某个值或某个值的某几位,来判断当前驱动的某一步写的对不对。如果一个值为4,则闪4次快的长灭一次。所以要有小朋友问我,arduino的板子为啥有个可以控制的led灯,我肯定丢他一块ch375b让他慢慢玩,这是救命灯啊!!!

槽点2:资料少的可怜,至少datasheet做完整点吧,你江苏沁恒也老大不小的,就两个中文版本的资料,属于能少说一句的绝对不会细的多解释两个词,不得不说老外的datasheet是很具体的。参考代码是各种不全。依葫芦画瓢给驱动成功了,一测试,抓一次数据要51个ms。参考代码(用在别的地方的,跑不起来,只能借鉴),注释中说,发送一个命令后要delay几个毫秒,才能再发送对应的参数。实在受不了,按照us级别的delay做了测试,75us的delay是不靠谱的,但85us是可行的,最后放宽到100us。当然还有些其他的delay,这样实际抓一次数据2个毫秒不要。最后分三个步骤,散在三次1ms频率的同一个实时任务槽里面完成,3个ms搞定一批数据,无非做个简单的状态机。

下面是delay微秒的函数,从组织数据到处理完(不是执行call开始,前面有2个cycle是loading 常量,我也算进去了),基本是 n * 16  +2 个cycles。误差不大,如果参数n为5 ,则为82 ,参数n为10,则为162个cycle。16Mhz,基本对应微秒数。

void delay_us(uint16_t n){
    uint16_t i;
    n = n * 2 - 2;
    for (i = 0 ; i < n ;i++){
        asm volatile("nop"::);
        asm volatile("nop"::);
    }
}



第二个要吐槽的就是nrf24l01的模块。

槽点1:其实东西是不错,价格不贵,淘宝3.5的一个模块,就是你加多个电容会死人吗?如今只能这样凑合。

没加电容前,叫做欲哭无泪啊。我的一般原则是不会怪硬件问题,更相信x宝店家,3.5元的质量,于是先从软件驱动找问题,折腾两个通宵,结果加上后,泪如泉涌啊。。。。

槽点2:中文资料一塌糊涂。几乎所有的小坑全是看英文版的资料过的,国内的一些所谓的资料,一句话带过,和我发帖子一样,细节更本不说。哪怕翻译原版英文成中文也好啊。

无线手柄用的是bk2433,资料看过,这是个好东西,也可以和nrf24l01通信,如果和nrf24l01通信,我也没必要折腾usb host。不过虽然跳频表可以黑出来,但是地址表想黑出来实在费力。索性后面重新设计无线手柄时,用nrf24l01将他们一起替换掉。手柄厂家说方案公司不会给这些资料,不给拉倒,后面直接干掉,轮不到我伺候别人的方案,我只伺候用户的感受。

第三个要吐槽的是mpu6050的arduino版的驱动。

mpu6050的价格有点小贵,如果现在的价格拦腰砍一半,我觉得是有性价比的。东西是好东西。支持arduino的一个驱动版本,里面自带dmp代码,要loading到mpu6050里面去的,还是2014年版本的。结果就是等待。号称等8秒,基本我要等20秒,和你的摆放位置还有关系。你让我的客户开机后在那默默等10秒以上? 你去死吧!!!坚决干掉,虽然这套代码我也是从c++转c,外加各种优化折腾了2,3个通宵。于是找到个12年版本,给stm32用的,如果没记错是个arm。代码叫做大,前面的帖子已经吐槽过了。也是花了我两个通宵,才把代码重写一遍,压缩到原先代码量的1/3,现在装进去。外带抓了两个bug,某轴精度提高一个数量级。如果问我啥感觉,难得有种把我优化技术发挥出来爽的感觉,看着代码量几十个字节,几十个字节的少,不搞的人,其中的爽是不知道的,突然能少了200个字节,就和中彩票一样高兴。哈。

最后要吐槽的是arduino:

arduino的东西确实是好东西,搭建模块速度叫做一个快啊,和吃豆子一样。基本上一天能搞定,简单的,1,2个小时内就能折腾好。但问题来了,第一,只能叫做搭建模块,连系统原型搭建都不行。你要没冲突表示你东西少,几个模块一上就是各种冲突,且不谈mcu内部资源冲突,引脚冲突就是常见的事情。

另外我就不吐槽一点,嵌入式系统驱动,你用c++写?!省得这里又有人说我藐视c++,万能的c++,啥都可以做,php是世界上最好的语言,没有之一,除了c++。哈。

不得不吐槽的是一些外围板。最初用adafruit Motor shield 的板子做电机驱动。板子死贵不说,资料倒是有篇英文的介绍的足够全,但是发现整个板子的驱动方式是各种脱裤子放屁的设计。还不稳定。离搞活动还有10天,毅然放弃,淘宝上订了9110的片子(电机驱动小,这个足够了),只要3块多啊,赌一把,到手时离搞活动还有6天,当晚把螺丝、排线的各种拧插,搞定!和adafruit Motor shield的板子对比,简直一个天上一个地下。各种爽啊。用的爽,价格爽。

另外一开始用的arduino usb host shield 的板子,简直贵到天上去了,40多人民币一块,max3421的片子,驱动也是各种复杂,还让我用不少时间把c++的代码重写成c。结果呢,还不如ch375b的模块好,所以别说因为都是南京的我帮沁恒说话,usb 的东西还是用ch37x的好,ch374的模块没有的卖,貌似spi的应该更爽(串口的事情放一边,不想提串口,都是泪!!!)。

反正总结说几点:

1、开源的东西,无论硬件还是软件,就是好,搭建模块超级快,这个绝对要赞的。哈。

2、电子积木和软件不一样。软件模块化,特别是上层应用软件模块化,各种堆叠,注重逻辑功能,其实也没啥效率要求,各种线程进程也没太多打架,所以无所谓。但硬件系统,模块化的东西只能做原型,几种模块堆一起,引脚放一边不谈吧,效率放一边不谈吧,对mcu的内部资源的冲突,你还是无法解决。

3、开源的软件系统确实有不少效率高的。开源的硬件系统,如果有稳定度高的(效率我们就不谈了,谈了是鬼扯)就真见鬼了。哈。

4、单纯的谈技术永远是没意义的,用户的体验度是no.1,为了体验感的提高,我是愿意把我所有优化的能力发挥到最大化的。至于还有不爽的,无非暂时没时间干掉,厂家不给力换掉厂家,方案不给力换掉方案,芯片不给力,换掉芯片。任何厂家或方案商,别tmd给我找理由,说凑合!

补充说一句:不管这里的朋友是否认识,这里还是要非常感谢南京的陈大庆师傅,机械板材件等,各种帮忙。哈。

@红薯  , 论坛可以上视频不?以后有点好玩的视频,可以传一传。哈。








加载中
0
西昆仑
西昆仑
这是自己玩呢,还是做了给孩子玩呢。。。话说这标题,太吸引眼球了。鬼哥就是标题党啊。。。
0
Tom-Lin
Tom-Lin
关注。。。。。。
0
明月惊鹊
明月惊鹊
老衲是来看你插那里爆了, 
0
lee123lee
lee123lee
野鬼的头像啥时候的呢?
0
混世顽童
混世顽童
少一个“哈”
中山野鬼
中山野鬼
哈,忘了。。。
0
叫我刀刀
叫我刀刀
少一个“哈”
0
铂金浪子
铂金浪子
少一个“哈”
0
loyal
loyal
我们公司也有,两个轮子的.平衡车底,上面是机器人.
中山野鬼
中山野鬼
两轮的也不复杂,其实上面的看真功夫,当然我还没碰到上面那层面。
0
返回顶部
顶部