开发日志 170424

今天把船拿到启真湖跑了跑测试,下午回来分析数据。本打算把数据在本地分析的,但无意中发现phpMyAdmin居然集成了GIS系统,MySQL本身也可以处理地理数据,那不妨就试一试。

使用INSERT INTO Table VALUES (PointFromText('Point(latitude longtitued)'));可以插入坐标点,坐标点查询时会以二进制数据的形式显示,需要用AsText()函数转换回人类友好的文本格式。哦,对了,别忘了把表的存储引擎改为MyISAM。

继续阅读“开发日志 170424”

开发日志 170421

昨天3D打印了一个安放电路板的结构件,然后发现没有树莓派用的M2.5的螺丝,赶紧网上下单然后开始码别的。

想了一下,人家MPU9250明明是有GPIO中断输出的,干啥要用延迟呢,改个中断吧,于是今天基本就折腾了一天中断。

其实中断也不是很难,用wiringPi这个库就可以了,或者BCM的那套也行。不过用了wiringPi之后执行需要root权限,让我不太高兴。Linux不是一切皆文件吗?Linux不是有GPIO子系统吗?借助这个子系统不就好了?

别说,还真有,用/sys/class/gpio/这个目录就可以了。这个要求编译内核时开启Device Drivers -> GPIO Support -> /sys/class/gpio/… (sysfs interface) 这个选项,树莓派官方镜像的内核已经开启了。

然后echo 端口号(BCM) > /sys/class/gpio/export来将这个接口从内核中暴露出来,接下来就可以通过/sys/class/gpio/gpio*/下的direction value edge这几个文件来进行输入输出和中断触发边沿选择了。

最后怎么用作中断呢?select/poll/epoll都可以了,它们会挂起线程知道文件内容改变。

另外这是我的参考文章:http://blog.sina.com.cn/s/blog_7880d3350102w2um.html

另外MPU9250还总是有零漂,我前几周调好了,今天上电一看飘了0.4dps,纠正过来后一看又漂了0.1dps,根本不知道该怎么处理。这倒还好,大不了系统启动时纠偏,但它要是走着走着飘起来了该咋办?

继续阅读“开发日志 170421”

开发日志 170415

今天处理了一下配置文件的问题,毕竟不能啥都往程序里写对吧……其实我以前一直是记好了第几行是啥,然后直接读进来。不过这样显然不太优雅,所以要用点啥格式。本来是想用GKeyFile来处理的,然后它要include一个glib.h的头文件,大蜥蜴里面这个文件有点问题,路径各种不对。JSON吧,按说不错,但是手写的话格式不是那么友好,XML就更别提了。加上之前被安利过一波YAML,就决定用它了。

YAML,说来也简单,直接安装yaml-cpp-devel就可以了,封装的很好,很方便。没用什么高级的配置,看着代码自己悟吧(滑稽

嗯……话说昨天不小心暴露了我的数据库密码,应该没关系吧?

继续阅读“开发日志 170415”

开发日志 170411

之前一周一直在弄I2C和UART,感觉也没做太多的东西,就没单独写,今天算是一起记了。另外今天“海试”,遥控方面没啥大毛病,船也不漏水。不过就是一次下水被水草缠住了;清理了水草第二次下水,L298N驱动芯片过热保护了,船途中失控,差点被水浇了,也挺惊险的。

看到左侧那个喷水的玩意了吗?失控后,不偏不倚就从那个水柱下面钻过去了。三个人差点吓尿了,也没想起来拍照片,可惜了xD

简单来说,树莓派的I2C和UART要用raspi-config打开,或者直接编辑/boot/config.txt也可以,然后就可以用了。然后在程序中作为文件打开,使用ioctl设定了模式,就可以简单的用read(), write()这两个函数读写了。

哦,对了,还修复了一个安卓遥控器在热点模式下不能遥控船的bug。热点模式下,受限广播似乎不会发到热点下面那个子网,而是会发到4G那边,组播224.0.0.1似乎也是。因此需要用Multicast::setNetworkInterface指定要用的网络接口,然后向224.0.0.1发送组播。

继续阅读“开发日志 170411”

开发日志 170329

遥控粗粗的可以跑通了,今天就开始做自动导航相关的东西了。想了一下,不如先处理GPS。我的GPS是串口的GPS,因此我需要一个函数,大概getline的效果差不多。

如果是STM32的话,比较简单,直接调HAL的函数来读读写写就好了;另外听说树莓派上用Python也挺方便的。可惜这次是打算用Raspberry Pi,还不能用Python,只能用C/C++。

先放出来我的参考文章,基本就按照这个配就行,另外那个cfmakeraw函数最好别用……

其实本来也没什么,不过以前C语言学的不牢,对stdio的缓冲区理解不到位,printf的时候没有\n,导致缓冲区没刷新。以前知道iostream的这个问题,但printf就没往这茬想,吃了个大亏,真是脚都要抠烂了……

既然是C++,那就封装成一个类吧(然而并没有什么卵用。

继续阅读“开发日志 170329”

开发日志 170223

虽然还是有点问题,不过这个CAN总线总算是通了,我猜我八成是买到了假芯片。

CAN总线驱动器用的VP230,模块上写的供电3V3,看了下芯片的DataSheet也是这么写的。测电平总觉得根CAN总线标准不太一样,接示波器看对地电位,CAN_H = CAN_L = 1.6V,显性位CAN_H = 2.6V,CAN_L = 0.8V,显然与CAN标准电平不符。

而CAN总线调试器是用的TJA1050,看电平的话显性位3.5V/1.5V,隐性位2.5V/2.5V,倒是很正常。

网上搜了一下,发现好像VP230是有仿冒的啥的,就把芯片丢了准备重新买TJA1050的片子。后来想想……

等下!这电平怎么看怎么像供电电压不够,难道芯片是打磨的TJA1050然后充数不成?

好吧,把片子从垃圾箱捡回来,电压提升到5V,电平正常,通信正常。

我真是日了狗了……

另:昨天接了示波器行,撤了示波器不行,大概是示波器把差分电平给拉高了吧……

开发日志 170322

昨天简单给报文分了下组,设计了一下协议,今天让电机转起来。

说难嘛,好像也不难,不过遇到了几个问题:

  • CAN总线问题:夹上示波器,波形没问题,通信OK;撤掉示波器,通信挂了。
  • 供电问题:实验室没有合适的电池,用实验室的直流电源也不行,最后拿两个直流电源并联才算供上电。
  • 电机嘎嘎响,贼响,师兄说以为隔壁打电钻。

总线目前怀疑是终端匹配电阻、CAN调试器电平和电容(示波器两表笔间阻抗\geq 10M\Omega ,电容约17\pm pF)的问题。至于接地,我觉得不太可能,CAN总线本来就是差分信号,接地应该没关系。而且本身板子由JLink经过USB取电,CAN调试器也是插在USB上面,所以不太可能。明天一一检查。

供电打算用航模电池,杨桐推荐用格式的,11.1V 5300mAh的大概¥280,放电能到55A,应该足够了。

电机……额,也就那样吧,不行就换电机,最不济换船,实在不行上泵推。

另外,螺旋桨不是转速越高推力越大!因为可能会产生空泡啊啥的。参考数据:翔鹤4轴4.2m直径,300RPM,功率119MW。所以大概电机速度不能控太快?

开发日志170320

今天起来了CAN总线,实现了STM32和某CAN-TTL-USB模块的通信,然后接上了船上的直流电机。舵的话发现原来用的不是个舵机,是个直流电机,辣鸡,淘宝买一个防水的装上。

主要参考了微雪课堂的教程。有一点要注意的是,必须开启滤波器,这时消息才能经过滤波器进来,否则消息根本过不来。只是初始化CAN设备并接收是不行的,最开始因为这个问题坑了好久……

明天看CANopen和DeviceNet的内容,并决定要不要用这两个东西。如果不用,就定CAN总线协议。

开发日志 170228

这其实都是昨天的内容。主要折腾了MCP2515CAN总线模块,已经可以和杨老师给的CAN总线调试器互发数据帧了。STM32的板子也到了,下午开始做一些动力系统的内容吧xD。

这篇文章主要讲了如何把MCP2515 CAN总线模块开起来,不涉及具体的分析。

继续阅读“开发日志 170228”