最后,我们围绕着发布了针对OMower项目的承诺SDK(针对基于32位ATSAM3X8E控制器的轮式机器人的开放式硬件和软件平台,并在Arduino IDE中进行了开发支持)。 软件的完成程度不是很好(例如,没有保险杠,雨水和草皮传感器的类,某些功能尚未完全调试),但是即使以目前的形式,机器人也可以通过RTK GPS高精度驱动,它几乎支持机器人所需要的一切。割草机-声纳,有线周边,指南针和GPS导航,可从充电站或太阳能电池板充电。
我之前关于OMower项目的文章带有电路和电路板布线的SDK代码和Kicad文件
位于github上 。
当前仅支持两个平台-带Polulu双MC33926电动机驱动器的OMower板v3和一堆Arduino Due + IHM12A1电动机驱动器(在小型四轮底盘上测试机器)。 可能会添加基于Arduino Due的Ardumower支持。 非常需要IMU GY-80板,如果没有IMU GY-80板,导航就不会简单地工作(尽管您可以创建一个简单的割草机人,意外地在电线周边内开车)。
在新的第四版开发板上,计划在其上安装IMU MPU9250并添加FRAM芯片,以将用户设置保存在控制器的内部闪存中(当固件重新加载时将重置),那么,各种各样的卡都可以存储在其中。 另外,我可能会增加电阻器和电容器组件的尺寸,用吹风机将“ 0402”焊接在膝盖上是一种低于平均水平的享受,并增加了连接器的空间,以便您可以使用夹子放置它们,而不仅仅是粘针。
API代码以少数几个类的形式编写(omower-* .H文件),您需要将这些类作为对象包含在软件中(并且可选地包括所有这些类,除了基本类以外,您只能采用所有需要的类)。 为了简化理解和测试,
编写了 OMower_Simple,它执行从任何智能手机通过pfodApp发出的相当大的命令集。
该SDK可以控制所有低级功能,并且主要用于中断,这使最终的软件程序员能够以非常自由的方式(独立于特定机器人的特定细节)编写软件(可以编写状态机,也可以简单地调用启动驱动器功能)然后等待机器人到达所需的位置)。 只有调用机器人的初始化和控制功能的过程才落在程序员的肩膀上(实际上是去哪里以及处理声纳和其他传感器的操作的指令)。
要连接板上的其他外部设备(当然,并获得SDK的支持)-有许多外部连接器。 例如,带有PPM输入的标准伺服驱动器最多可以连接四块(如果拒绝两台电动机,甚至可以连接六块)。 割草机有很多“标准”传感器;这些声纳多达6个,外围传感器多达4个。 当然,在大多数情况下,并不需要那么多,它们的连接器的一部分可以用来连接其他一些设备(微控制器的几乎所有输出都是输出)。 知识部分(处理RTK GPS,与wifi连接)由Orange PI Zero(安装在特殊连接器中)执行。
我为某些地方的曲线和未完成的代码预先表示歉意,不得不深入研究其他项目,并且发现了许多我无法应付的困难。 但是我学到了很多新东西,例如,我们所处位置的地球椭圆的曲率几乎是40米,并且地球的磁极每年都在数十公里范围内徘徊(如果不考虑这一点,机器人会以非常弯曲的线从一个点到另一个点移动)。 有时,我似乎是在发射太空火箭,而不是在割草。 :)
好吧,作为奖励,我还用Decawave DW1000布置了arduino的固件源,该固件组织了这些设备的微型网络,并允许机器人确定其在室内的位置或RTK GPS根本无法确定其坐标的位置(几乎支持无限量)标签并分为多个房间)。 该
固件仍然非常原始,但是对于某些人来说可能会派上用场。
更新后,我决定在文章中补充一个有关其内部排列方式的故事:
SDK用户必须确定他需要的所有对象,为每个人调用begin()函数(硬件初始化,仅一次),然后设置其参数的值(从闪存读取它们或仅获取默认值之后),为每个人调用init()(该函数可以(用于重置对象负责的设备),将hook函数设置为poll10 / poll20 / poll50(每秒10、20和50次),必须从中调用所有使用过的对象的相应poll *()函数。 从理论上讲,可以通过SDK本身的代码来自动化所有这些操作,但是由于控制器资源的额外消耗,我决定不执行此操作。 您需要查看OMower_Simple.ino的使用示例
电机对象(omower-motors.h)是主要的类别之一,它通过poll10()函数控制电机驱动器。 用户只需调用navThing类的某些对象子级对象的数据(通过readCourseError()函数提供基于期望行驶方向的偏差值)即可进行滚动/移动(无需导航的转弯和行驶)或rollCourse / moveCourse(通过导航/校正进行骑乘) )
navThing的派生类是imu和gps类的对象(omower-imu.h和omower-gps.h),第一个负责读取罗盘/加速度计/陀螺仪数据并将其转换为方便的形式(它在两个轴上以度为单位提供罗盘和倾斜值) 第二个-处理GPS数据并在需要乘坐GPS或RTK GPS坐标的情况下将电机对象指向正确的方向(对于后者,校正是在天线未放置在机器人主体中心的情况下计算的,并通过里程表传感器进行短期校正)。 用户程序负责与GPS接收器本身进行通信,并将NMEA字符串或就绪坐标传输到gps对象。
割草对象(omower-mow.h)负责剪切电动机及其带有步进电动机的执行器提升装置(如果有)。 使用者说出要旋转的速度和设定的切割高度。
pwmServo对象(omower-pwmservo.h)控制PWM-A / B / C / D / E / F / G / H输出(由于可能与计时器冲突,因此无法通过其他库完成此操作)。
电源对象(omower-power.h)负责控制电荷调节器,并将ADC值转换为每个人都能理解的伏特和安培数。 用户程序必须检测充电电极上电压的出现并调用开启充电功能,然后它将拾取调节器的PWM周期以匹配充电电流。
由于使用标准Arduin串行*对象可以中断中断处理(请参见下文),因此有一个串行对象(omower-serial.h)用于读取和传输串行端口。 不幸的是,I2C总线也存在相同的问题,必须使用due-i2c-blocking.h中定义的功能来使用它们。
其他对象的功能从它们的名称中可以清楚地看出,您可以仅查看头文件中的注释(omower-sonars.h,omower-rtc.h,omower-current * .h,omower-odometry.h等)。
现在介绍最低级别的中断。 机箱对象(omower-chassis.h)将TIM7配置为每秒100次中断。 在每个中断处,读取MAX11617 ADC芯片的12个通道(输入一个特殊的数组,OMower SDK对象从中读取它们的值-max11617-adc-scan.h)。 每隔一秒钟-为poll50()函数挂钩生成一个软中断,每隔五分-poll20(),每十分之一-poll10()生成一个软中断。 它们都异步工作(这很方便,但是对I2C总线的使用施加了限制,稍后我计划在那里添加一些事务/信号灯)。
TIM5定时器也配置为生成频率为38462赫兹的中断。 从此中断中,读取内部ADC控制器的所有通道并将其输入一个特殊的数组(它还支持将选定缓冲区的每个接收值输入到环形缓冲区中,例如通过外围类完成此操作,然后使用傅立叶变换对这些样本进行滤波)。
要输出调试信息,有一个debug()函数具有最低的优先级来显示消息(也就是说,虽然不执行调试,但不会向控制台输出任何内容,但是在任何时候您至少可以启用最大级别,它将被发送垃圾邮件)。 在调试值的格式(* printf格式)中,支持浮点数(与标准Arduin函数不同)。
更新:OMower板的新第四版,到目前为止仅一个电路(等待PCB的制造)。 此外还包括一个指南针/加速度计MPU9250、128 KB的F-RAM,用于保存设置,地图,航点和其他东西,所有带有闩锁的连接器(Molex 22-11-20x3 / 10-11-20x3,与一个2.54的旧版本兼容)引脚),用于声纳和里程表的74HC4050逻辑电平转换器,功能更强大的3.3 / 5伏电源转换器(高达3安培),连接器上还有两个PWM / PPM输出,用于独立控制第二个步进电机驱动器的单独线路,更多用于稳定的缓冲电容器大尺寸SMD元件,易于组装 轻微修订。
