Project OMower - open universal wheel platform (start)

I want to present my project of an open universal platform for home robots (lawn mowers, vacuum cleaners and the like). The project is still at the stage of assembling and writing software, I hope for useful comments and suggestions.

I recently met the Ardumower project (an article about it ) and got a lot of interesting experience. But, unfortunately, this robot has many different limitations, so my customer of the “smart home” sponsored a project of a completely new and much more powerful robot that can do well both with grass mowing and with various other tasks (for example, there is an idea deliver drinks around the house for guests :)). The project is developed in the form of a universal and extensible platform, with an open scheme and an SDK for writing its own software versions.

The main element of the robot is a board with a 32-bit ATSAM3X8E processor, identical to that used in Arduino Due, which allows using a simple and familiar development environment, as well as eliminates many problems with technical issues at the expense of a large community of people writing programs for this platform. Due to the large number of microcontroller ports, connect almost anything to the board. Characteristics of the board:

Power from 12 to 30 volts, built-in battery charging unit with a current of up to 5 amps, and even a booster for charging from the solar battery during operation.

Two seats for widespread Polulu Dual MC33926 collector motor controllers, with the ability to control up to four motors (in two versions - two motors on wheels, the second controller controls a skewing motor, or four motors on wheels with separate channels). Motor connectors have pins for connecting odometers.

Seat for the stepper motor controller (drive to change the height of grass mowing, for example).

Connector for installing Orange Pi Zero (to support RTK GPS centimeter accuracy and some external complex control algorithms) with the ability to update the firmware through this microcomputer.

6 PPM signal outputs for controlling brushless motors and servo drives.

6 ports for HC-SR04 sonars, 2 ports for collision sensors (ardumower bumper with its pneumatic sensors, for example), two capacitive grass sensors, 2 inputs for infrared analog distance sensors, four inputs for wired perimeter sensors, two connectors for thermistors, controlled ports for fan, beeper and three LEDs (20 and 70 mA). Of course, many ports can be used to connect other sensors, with certain limitations.

Also on the connectors are removed almost all external ports supported by the microcontroller:

3 serial port connectors, two I2C buses with 9 connectors (one of which is buffered with connectors for both five-volt and three-volt devices), 2 SPI buses, CAN (without a physical transceiver), USB, two separate DACs (just brought to the connectors since there is, you can play music there or something like that).

Additional pulse stabilizer 5 volts 2 amps with six connectors for external devices. Well, the relay with latching, for emergency shutdown of the battery, to prevent its overdischarge in case it did not reach the charging station. Naturally, the voltage and current consumption is controlled by the microcontroller (partly through the built-in multi-channel ADC, partly through the optional MAX11617EE).

In idle mode (motor drivers in the inactive state) - the current consumption is 130-140 milliamperes.

Scheme (put everything on one sheet, for convenience):

During the soldering process, the board encountered the fact that some of the elements are too small for manual soldering with a hair dryer, and something can overheat (such as a diode in the charging unit), so some minor changes are possible.

The development of the SDK for writing the firmware of the robot is already underway, with its help it will be possible to almost completely abstract from the control of hardware at a low level, having received a set of classes for all peripheral devices and sensors. For example, a piece of code that makes the robot turn north will look like this (these examples are already working, although without some overload checks and the like):

course = 0.0; imuSens.setCourse(course); motWheel.rollCourse((navThing *) &imuSens, 9000); 

And to go along the wire perimeter to the station, lifting the mowing motor:

  mow.setHeight(0); perSens.setTracking(true); motWheel.moveCourse((navThing *) &perSens, 120000); 

Unfortunately, I can’t lay out the SDK myself, a lot has not been written yet (such as the code for supporting Decawave DW1000 radio tags and any secondary sensors). But I can say that all the low-level functions work and after a short time I can put it on github.



All Articles