3D Printed Remote Controlled 2-speed AWD Car

by TRDB in Circuits > Remote Control

40632 Views, 443 Favorites, 0 Comments

3D Printed Remote Controlled 2-speed AWD Car

3D printed remote controlled 2-speed AWD car
Crawler V5 with RC.png
Power train of 3D printed remote controlled 2-speed AWD car
Crawler V5.png
Power train.png

Are you fascinated by mechanics, and in particular, how the drivetrain of a car works and transmits power? Are you interested in 3D printing and electronics? Well, then, it’s time to build your own RC car! These were my starting points for this project, but I wanted to do more than replicate what has been done with 3D printing already multiple times. Hence, I tried to design a car in Fusion 360 that can be built with as little (specialized) commercial components as possible. The car runs on custom electronics and comes with a powertrain that is as close to that of a real car as I could achieve based on self-made parts from a typical plastic filament 3D printer.

Facts about this project

  1. This all-wheel drive (AWD) car encompasses a two-speed manual gearbox with a manual clutch and three differentials (main differential with asymmetric torque output, Torsen differentials for front and rear axle)
  2. The car is based on independent suspension for all four wheels, with double Cardan joints between the differentials and the wheels
  3. Additional actuators (dis)engage a parking brake and a lock for the center differential
  4. Almost all parts are custom-built by 3D printing, including the full powertrain and the shock absorbers, except for bearings, springs, and stabilizing metal bars
  5. The actuators in this project are based on different motors (brushed DC, stepper, and servo motors), trying to use motor types that are best suited for a specific application
  6. The electronics are custom-made and employ ESP32 microcontrollers for the car and its remote control, even with self-made joysticks for the remote control
  7. All calibration steps required for the joysticks and actuators can be performed within the menu of the remote control. Thus, the project can be built without having to write or modify a single line of code (but you can, of course, modify the sketches to customize the control according to your preferences)

The biggest challenge in the design and manufacturing was to find a balance between adding these powertrain parts and not sacrificing too much stability of the full setup. The car is meant to drive and should not only represent a design study. This car has a footprint of approx. 47 cm (body length, excluding wheels) by 39 cm (axle track) and a weight of almost 7 kg. It is a follow-up project after building a tracked vehicle. The AWD car requires much more sophisticated mechanics than the tank, which is because I tried to reproduce the powertrain of a real car but did not go through the simple RC-model-compatible shortcuts that I employed for the tank (like using one motor per track instead of selectively distributing torque to the two tracks). Obviously, there were many obstacles and design iterations on the way, and not all powertrain parts worked out exactly as I wanted them to, but still, I’m very happy with the result.

Disclaimers

I’m neither an automotive nor an electrical engineer by training, and the design of this car is mostly a result of trial and error rather than applied textbook knowledge. Hence, be aware that the components may be poorly designed from an engineering perspective, and note that my explanations regarding the different powertrain parts may not be entirely correct. Further, I try to provide links or credit to others. Yet, as this project took quite some time to be finalized, and given that some ideas were not successful, I cannot guarantee that I did not forget to mention a source. Hence, if you feel that I missed adding a source, please let me know, and I’ll add it to the instructable.

I hope that you’ll like this instructable as much as I enjoyed building this car! The instructable contains the bill of materials with links to all components, the CAD files for the printed parts, the Gerber files for the PCBs, and the code required for the car and the remote control. If you have any questions or criticism regarding this project, or if you want to share your feedback, I’m looking forward to reading your thoughts, and I’ll try my best to help you if you need support with completing this project!

Supplies

Copper wire example exploded view CAD.png
Copper wire example CAD.png
Copper wire example one.jpg
Copper wire example two.jpg
Copper wire example three.jpg
Copper wire example four.jpg
Copper wire example five.jpg

Before diving deeply into the design of the parts, let’s check what is needed to build this project. These are the required tools:

  1. FDM 3D printer. I’m using a Prusa i3 MK3S. However, given the number of parts that need to be printed, a faster printer is recommended (but not needed if you’re patient).
  2. Set of hex keys, with a 2.5 mm ball head hex key
  3. Pillar drill, metal saw, rasp, thread cutter for M3, angle grinder
  4. Soldering iron, multimeter, battery chargers (for AA NiMH and 3S LiPo), lab power supply
  5. Wire stripper, wire cutter, crimping pliers

Some information on crimping: There is a saying in German that can be translated into something like “if you buy something cheap, you’ll have to buy it twice,” meaning that cheap tools will break inevitably, and then you anyway have to buy something of a better quality. I had to learn that the hard way when it came to crimping: I started my projects with the common and very cheap DuPont clones for 2.54 mm (0.1 inch) spacing. They aren’t reverse polarity protected, and they don’t come with a lock that prevents them from disconnecting if there are vibrations or tension on the wires. That can be considered acceptable for hobby projects, but every now and then, I realized that the electronics did weird things, not because of my poor programming skills but simply because of bad electrical connections. Hence, I did check for alternatives, and luckily, I stumbled across this site on crimp connectors. A big thanks to Matt Millman for this extremely good overview of electrical connectors and crimping tools! After reading the article, I opted for the Molex SL series: They come with a lock, are reverse polarity protected, and are rated for up to 3 A, which is enough for everything but the big “main engine” motor. Regarding the crimping pliers, I chose the Engineer PA-09, which crimps these connectors very easily and is much better than my old (cheap) crimping pliers.

Print settings

All 3D printed parts are printed with a layer height of 0.2 mm and the default infill rate (around 15-20 %). They are either printed from PETG or from TPU. TPU is colored in black in the CAD images. PETG is either gray or green; the color choice is up to you. Plastic parts are mostly connected with screws and nuts or screws and threaded inserts, which you’ll see in the files of the parts. If a nut shall be used, then there’s a pocket that can carry an M3 hex nut. Threaded inserts go into holes with a diameter of 4.1 mm, which can be used to melt a threaded M3 insert into the part. All print parts are provided as .stp files so that you can adjust them if needed. All parts carry an identifier as a prefix in their name in the style of xx-yy-zz, where xx denotes the step the part belongs to, yy is the consecutive number of the parts within a step, and zz indicates how many times a part has to be printed. If the part contains “TPU” in its name, it has to be printed from TPU; otherwise, it shall be printed from PETG.

All parts are designed so that they fit in the desired way (tight or loose fit) with the default print settings of a Prusa i3 MK3S. For the sake of text length, I will not specify how to orient or attach the different parts. In general, whenever a part contains a round shape that should pair with a bearing, the round shape needs to be oriented axially (in parallel to the printer’s z-axis) to ensure that it will be round after printing. Support is only needed if a part has an overhang exceeding 45°. I will also not mention the exact length and number of M3 screws needed for each part; only if another screw diameter is needed. Equally, the use of bearings is determined by the size of the pockets in the different parts and will not be mentioned separately. Mostly, you will need tiny 683 bearings (3x7x3 mm), but also 605, 608, 6802, and 6804 bearings.

The provided .stp files for this project may cause compatibility issues with certain CAD software when attempting to convert them for slicer software. In case you encounter such problems, they are also available as .stl files on my GitHub account.

Assembly of rotating shaft components

The car’s powertrain requires the assembly of many components as a rotating shaft that allow to transmit torque radially while being secured axially so that they stay in place. To this end, a specific method of joining the parts is used, for which I added example images here. A single-stranded copper wire (1.5 mm² diameter) has to be pushed through the two mating printed plastic parts (they carry holes with the correct diameter for this wire). The advantage of this approach over screws and nuts is that it cannot loosen over time while still offering the option to be disassembled without having to destroy any parts.

Below, you can find a complete bill of materials that includes links to the shops where I procured the items. This BOM includes all the parts needed for the project. When summarizing the costs for all required parts, you end up at more than 1.100 € for this project. Please note that this number conservatively assumes that you don’t have any supplies yet, and I did not look for the cheapest possible options (e.g., some parts could be sourced cheaper, like the PCBs or the filaments). For instance, if you are already equipped with screws, nuts, and wires, this number drops by around 200 €. If your RC garage has batteries in stock, you’ll save another 75 €, and if you look for cheaper filaments or want to finish your pile of aging spools, you can save money on the 180 € that I accounted for PETG and TPU filaments.

Main Body

Base plate with top and bottom cover.png
Base plate.png
Base plate overview.png
Base plate overview_bottom.png
RGB bar overview.png
RGB bar exploded view backside.png
RGB bar exploded view.png
Front block including RGB bar.png
Front block overview.png
Front block exploded view.png
Front block exploded view rear.png
Rear block overview.png
Rear block exploded view.png
Rear block exploded view rear.png
Top cover overview.png
Top cover exploded view.png
Base plate with top cover.png
Bottom cover overview inside.png
Bottom cover overview.png
Bottom cover exploded view.png
Bottom cover fenders highlighted.png
Base plate with bottom cover.png

The main body is the starting point of the project. It wasn’t the first part to be designed because I started with parts of the powertrain to get an idea of the required size for the whole car, but the main body is the frame that holds everything in place. First, there is a base frame (parts 01 to 07) meant as a mounting plate for the powertrain and the electronics. When designing the chassis, I wanted to keep the maintenance/replacement of parts of this car easy. Hence, to improve the accessibility of the parts, the outer “shell” of the car does not carry any components but only acts as a protection for the mechanics and electronics. Everything is mounted on the base frame. The main engine, with its drivetrain and all supporting actuators, is mounted on the bottom side of the base frame, whereas the electronics are mounted on the upper side of the base frame. The base frame is supported by M4 threaded rods (length of 390 mm) to improve its stability (for instance, the 3D printed RC car Tarmo 5 uses the same principle), which are fixed using nuts (use two nuts per side and per rod to not only press them against the printed parts but also against each other to prevent them from coming loose). Besides this exception, all parts are connected using M3 screws and nuts or threaded inserts.

Front and rear

On top of the base frame, there are attachments in the front and rear of the car, which act as mounting points for the shock absorbers and carry the RGB LED strips. The front section (parts 08 to 11) additionally carries the four LED headlights. The rear side (parts 17 to 21) encompasses is a mounting hole for the antenna of the car. I call these parts the front and rear blocks of the car, each consisting of multiple parts that are attached using M3 screws and nuts or threaded inserts. The joints of the shock absorbers carry 683 bearings. The bars that hold the RGB LED strips need to be assembled with the LED strips inside (parts 13 to 16). Cut two 15 LED segments from the 144 LEDs/m strip, solder wires to the strips, and push them into the RGB LED bars. The two segments are interconnected: The front part is connected to the main PCB of the car, and it is then connected in series to the rear part (thus, LEDs 0-14 are in the front of the car, and 15-29 are in the rear of the car). The four LED headlights need to be soldered in parallel so that they share the same supply voltage that is distributed from a single connector of the main PCB. The front and rear blocks include cut-outs, allowing you to lead the wires into the electronics section easily. Do not mount the front plate (part 09) until the electronics are installed.

Bottom cover

The bottom cover of the car (parts 33 to 42) protects the mechanics from dust and dirt. It is completely closed, except for cut-outs for the steering links. I’m not fully satisfied that these cut-outs are there, but so far, I have not encountered severe issues with dirt entering through these openings and damaging the mechanics (although I would not recommend entering muddy or overly dusty terrain with the car). Also, the bottom cover includes a hatch that can be flipped open by removing two screws to exchange the battery. According to the design concept, the bottom cover is not needed for the powertrain to operate but only as a protection. Hence, it should be installed as the last part of the car, as the calibration of the actuators needs to be done with the mechanics being accessible.

The bottom cover does not support the drivetrain, but an additional part is needed to increase the rigidity of the base frame. I call this part the cage (parts 43 to 45) because it locks the gear connections in place. This part must be mounted after all powertrain parts have been installed but before operating any of the actuators. Otherwise, the remaining flexibility in the base frame may result in gear skipping, which can permanently damage the components. The bottom cover is assembled as one big component consisting of the different smaller parts, except for the two fenders at the front (parts 40 and 41, highlighted in blue in one of the images). Those are directly attached to the base frame of the car.

Top cover

The top cover of the car (parts 22 to 32) protects the electronics from the environment, and it is designed analogously to the hood of a car: It can be flipped open after loosening three screws. Again, this part does not carry any components and can, therefore, be installed in the end. It carries the car’s name (“Crawler V5”), which you can easily modify if you want to give the model your personal touch. All parts of the top cover are attached using M3 screws and threaded inserts, apart from the label: Here, I’m using a special stencil font (Octin Stencil), which allows printing of all characters as cut-outs in a printed part. Then, a plate with a different color is attached to the backside, which then provides color contrast for the label. That’s a simple workaround allowing two-colored prints without a printer supporting printing with multiple filaments. This plate is attached using a soldering iron (you heat it up to around 240 °C, the print temperature of PETG, and then follow the contact line between the plate and the top cover part to fuse the two parts (welding the two parts).

Required parts:

  1. 1x On/off-switch (Marquardt 1801.6115)
  2. 2x WS2812 RGB LED strip with 15 LEDs (144 LEDs/m)
  3. 4x E10 LED white, 1 W
  4. 4x E10 LED socket
  5. 1x WiFi antenna

Engine and Gearbox

Gearbox overview.png
Gearbox overview other side.png
Motor with gears.png
Motor with gears exploded view.png
Gear shifting mechanism.png
Gear shifting mechanism exploded view other side.png
Gear shifting mechanism exploded view.png
Engine and gear shifter.png

The car’s engine is a 775 brushed DC motor. This is a very common, rather large motor size with a diameter of 42 mm and a body length of 98 mm. These motors can vary in their design with respect to torque and velocity at a given voltage. The motor of this car should reach 10k rpm at 12 V, and it should be rated for >100 W power. Brushed DC motors cannot compete with brushless DC motors in terms of efficiency and power output (at the same size). Still, they have two main advantages over BLDCs: The motor and its driver are cheaper, and the motor is way easier to control than a BLDC. The reason for the simple control of brushed DC motors is that they are controlled by the input voltage. The higher the voltage, the faster the motor spins. Reversing the supply voltage reverses the rotation direction. If the load increases, the rpm will drop, but the control of the motor is not affected, meaning that the rpm can still be fluently increased or decreased by adjusting the input voltage (until the motor stalls).

On the other hand, a brushless motor requires a sophisticated motor driver that powers its three phases selectively at the right time (when the motor shaft is at the right angle) to convert electricity into motion. Thus, timing is important, particularly when considering that the desired and actual rpm differ when the load changes. The motor driver needs to account for that by incorporating a sensing circuit that detects the position of the motor to enable the correct timing for powering the phases. Hence, high-quality drivers are expensive, whereas cheap drivers perform poorly at adapting to varying loads on the motor. On the other hand, a brushed DC motor driver only needs to supply power (or not), which is intrinsically simpler. Voltage control is usually done by pulse width modulation (PWM), effectively meaning that the driver switches the power supply on and off at a very high frequency, thereby generating an average voltage (time “on” divided by total time) that equals the desired motor supply voltage. That can be done by the built-in PWM function of the ESP32 microcontroller that controls the car, which, in turn, uses the motor driver, with its big transistors, to handle the motor’s large currents.

Gearbox design

However, a motor is not enough to power a car. The motor’s rpm range needs to be adjusted to match the rotational speeds of the wheels that are required for the desired velocity of the car. Further, its torque needs to be considered. Tiny motors can spin extremely fast but don’t have the torque to move large loads. A gearbox that reduces the speed while increasing torque is needed: When neglecting efficiency losses due to the gearbox, the motor’s power, which is the product of torque and speed, remains constant when adding a gearbox. Therefore, the output of a fast-spinning motor can be converted into a low-speed, high-torque application such as in an offroad RC car. Kudos to the developers of GF Gear Generator, which is the Fusion 360 app that I used to design all the gears in this project!

Typically, RC cars use gearboxes with a fixed transmission ratio (the ratio between input and output speed) because electric motors have the favorable characteristic of providing decent power output over a vast rpm range starting at 0. Internal combustion engines, however, are restricted to a comparably narrow rpm range in which the motor can operate efficiently. Thus, a gearbox with the option to select the transmission ratio depending on the required speed is needed. This car is meant to resemble the powertrain of a real car, which is why a two-speed manual gearbox is incorporated, which allows one to choose between a high-speed and a high-torque gear.

Gearbox specifications

This gearbox is enabled by selectively uncoupling the output of two sets of gears that are permanently connected to the shaft of the motor. The output of the gearbox is either connected to one or the other set of gears. The car’s fast gear uses a ratio of 35 teeth to 35 teeth between the motor and the gearbox output, whereas the slow gear uses a ratio of 25 teeth to 45 teeth. Further gear reductions are included in the following parts of the drivetrain, resulting in a final reduction of 21.7 for the fast gear and 39.1 for the slow gear. Thus, at the same motor rpm, the slow gear results in almost 50 % lower wheel rpm than the fast gear. Given that the motor reaches ~ 10,000 rpm at maximum speed, the car reaches a top speed of 11.7 km/h in the fast gear and 6.5 km/h in the slow gear.

The shifting mechanism relies on a slider (the shift fork) that can be pushed either toward the slow or the fast gear. This slider is located on the output shaft of the gearbox in a way that allows it to move axially, but radial movements are not possible. Hence, when the slider enters a gear, the motor rotation is transmitted from the selected gear to the output shaft of the gearbox. The slider meshes with the gear using a dog clutch, which uses axial instead of radial teeth on gears to mesh. This mechanism can be flawlessly connected at a standstill or when the motor and gearbox output speed match, but speed deviations between the two result in wear of the dog teeth. Real gearboxes use so-called synchronizer rings for this purpose, which force the gearbox to rotate at the same speed as the motor before the dog teeth make contact. I tried to implement this mechanism by designing the dog clutch to be printed from flexible TPU. This material choice allows the design of the dog clutch in a way that a friction-based connection is established before the dog teeth mesh. Thus, the output shaft of the gearbox is accelerated to the same speed as the motor before engaging a gear, avoiding wear on the dog teeth as long as the load on the output of the gearbox is minimal during shifting. However, given the limited force of the actuator used for shifting gears and the poor stability of the printed parts, this friction-based contact is weak and degrades quickly. Thus, this synchronizer ring is more of a concept than a functional addition to the gearbox.

Assembly information

There are some points to be considered when assembling the gearbox. The gears on the motor shaft are connected by pushing a flexible TPU linker into the corresponding pockets of the gears, which is needed to avoid the buildup of vibrations. If the motor, the flange coupler, and the printed gears were perfectly balanced, there wouldn’t be any vibrations when the motor runs. However, the frame of the car was trembling from the unbalanced mass that was attached to the motor when the gears were attached to the motor shaft as a single part, which the TPU linker could mitigate. Further, the gear shifting mechanism is a mechanically sophisticated setup, given that many parts need to be mounted on a single rotating shaft. Thus, the shaft is based on two 3 mm steel bars with a length of 81 mm, and the single parts are pushed onto these rods, enabling the whole shaft to transmit torque without deflection.

The slider of the gear shifter consists of multiple parts that are interconnected by the copper wire approach described in the supplies section. The bearings in the two spur gears on the gearbox shaft (parts 14 and 15) are locked in place firstly by a tight fit in the plastic part and secondly by placing the lockrings (part 16) on top and welding them to the gears (soldering iron at 240 °C along the mating line to fuse the plastic parts). The slider moves axially using LM6UU bearings that are mounted on 6 mm aluminum bars with a length of 70 mm.

Notably, the car’s drivetrain uses spur gears although helical gears or herringbone gears are typically the better choice for 3D printed gears. This design choice is due to the poor tolerance of the 3D-printed chassis and drivetrain parts. For instance, herringbone gears rely on being perfectly centered because axial offsets result in friction and wear. On the other hand, spur gears aren’t affected by an axial offset. Hence, even though spur gears are, in theory, the poorer choice, in practice, spur gears work better in this design.

Required parts:

  1. 1x 775 brushed DC motor with 5 mm shaft, 2x M4x10 screws for mounting the motor
  2. 1x Flange connector for 5 mm shaft (replace grub screws by M3 cylinder head screws)
  3. 2x 3 mm steel round bar with 81 mm length
  4. 2x 6 mm aluminum round bar with 70 mm length

Clutch

Clutch assembly other side.png
Clutch assembly.png
Clutch overview open.png
Clutch overview other side.png
Clutch overview.png
Clutch inner assembly.png
Clutch exploded view other side.png
Clutch exploded view.png
Clutch.png

The clutch connects two rotating parts so that the power can be transmitted from one shaft to another. While this definition sounds rather simple, the implementation can become quite tricky. As for the gear shifting mechanism, typical RC cars omit the clutch because it is simply unnecessary if you use a fixed gear ratio and when the motor can start from zero rpm without problems. Even with multiple gears, a separate clutch is not necessary because the dog clutch of the gear-shifting mechanism basically acts as a clutch. However, in a car with a combustion engine, you still need a dedicated clutch because you want to gradually increase the amount of power that is transmitted from the engine to the wheels, e.g., when you want to start from a standstill slowly.

Design considerations

That is the tricky part: All the power from the motor not transmitted to the wheels must go somewhere. This “somewhere” is friction, resulting in heat when the clutch slips. Naturally, printed parts made from thermoplastic filament can’t withstand heat very well. Thus, a 3D-printed clutch that uses friction between input and output discs will very quickly wear out. I tried to build such a clutch and failed (but I did not attempt to immerse the clutch in a liquid). Thus, I decided to go one step back and build at least a clutch that can reliably connect and disconnect the motor from the wheels and transmit the power without degrading.

Even with this more straightforward concept, the design is challenging. The clutch has a resting position (engaged or closed), typically held in place by a spring, and the opposite position (disengaged or open), which must be held using an actuator. Small RC servo motors are, in principle, suited for the task of moving the clutch. However, they are based on brushed DC motors, which are not supposed to stand still while powered. That means the motor is stalling, which leads to overheating and can destroy both the motor and its driver. Such a servo motor is only suited for holding a position if it is not back-drivable, meaning that it is self-locking in the application. Hence, the actuator that drives the clutch adds another challenge in addition to the mechanical issues caused by trying to build a clutch from 3D-printed parts. The clutch design needs to allow the actuator to idle in both end positions and only be powered while moving the clutch.

Magnetic-mechanic coupling

Considering these issues, a magnetic solution instead of a spring-based clutch enabled the desired design. The clutch stays closed by magnets that clamp the discs together once the input and output discs come in contact. Therefore, the actuator does not have to apply force while the clutch is closed. Vice versa, when opening the clutch, the actuator once needs to overcome the force of the magnets while opening. As soon as the clutch is open, the distance between the discs and their magnets is too large to result in a significant attractive force, so the actuator also does not need to be powered when the clutch is open. The magnets can clamp the discs together, but they cannot hold the discs in position when the motor produces large torque, which would cause involuntary slipping of the clutch. Thus, a set of dog teeth was added to the discs that significantly increased the tolerated torque levels of the clutch. The disadvantage of this design is that it does not allow the clutch to slip intentionally. I tried it, but the dog teeth are ripped off when attempting to accelerate the car while closing the clutch. The clutch can, therefore, only be safely operated when the motor and the car are standing still.

Equally to the gearbox, the clutch consists of multiple parts that need to be assembled in a way that keeps them in place during operation (at high rpm and under load). However, ideally, it can still be disassembled for maintenance without destroying anything. Hence, the clutch also uses 1.5 mm² single-stranded copper wires to fix parts axially on the shaft, while the plastic parts are radially interlocking. The magnets of the input and output discs are ring-shaped with an internal chamfer, which allows them to be fixed using countersunk M3 screws. Using oppositely polarized magnets for the two discs (one disc assembled with north-polarized ring magnets facing the other disc, the other with only south-polarized magnets facing the first disc) enables the clutch to engage at any angle. Note that the magnets are only displayed in the images that show the assembled clutch.

Two sliders and accounting for tolerances

The clutch uses two actuators to open and close, which is needed to avoid tilting or bending the slider. The magnets exert a significant force that must be overcome when opening the clutch, and with two actuators on each side, the slider can be moved in a controlled and balanced way. Balancing the slider is further supported by the loosely mounted 6804 bearing within the sliding part of the clutch. This bearing connects the slider with the output disc, and due to the loosely mounted bearing, the output disc can move +- 1 mm axially within the slider. Thus, when closing the clutch, the design allows some tolerance in the end position of the two actuators without affecting the function of the clutch.

The clutch adds one stage of the overall gear reduction of the drivetrain. The gear shifter output shaft ends in a 20-teeth spur gear, while the input shaft of the clutch uses a 40-teeth spur gear. Hence, there is a fixed 1:2 gear reduction in the clutch segment of the drivetrain. Further, note that there is a small 683 bearing with a plastic part (gear shifter spacer, part 18) that is pushed into this bearing. This spacer makes loose contact with the gearbox’s output shaft. Thus, the shaft of the gearbox cannot move axially out of its position. Finally, the output shaft of the clutch uses a 3 mm steel bar with 65 mm length as a reinforcement to avoid bending.

Required parts:

  1. 1x 3 mm steel bar with 65 mm length
  2. 2x 6 mm aluminum bar with 73 mm length
  3. 6x neodymium magnets (8x.3.5x3 mm), south
  4. 6x neodymium magnets (8x3.5x3 mm), north

Center Differential

Center differential assembly other side.png
Center differential assembly.png
Center differential overview other side.png
Center differential overview.png
Asymmetric differential.png
Asymmetric differential exploded view other side.png
Asymmetric differential exploded view.png
Gear spacer.png
Gear spacer exploded view.png
Differential lock and rotation inverter.png
Differential lock and rotation inverter exploded view other side.png
Differential lock and rotation inverter exploded view.png
Center diff with lock and rotation inverter.png

The differential is used to distribute the power from one input shaft between two output shafts. For the regular operation of a car, its differentials must be open, which means that the rotational speeds between the two output shafts can differ. This function is needed whenever a car does not drive straight but turns: The wheels on the outer side must rotate faster than the inner wheels to avoid slipping. Hence, the differential needs to compensate for these speed differences. On the other hand, when going offroad, the differential should be locked (both output shafts always rotate at the same speed) so that the car can still move even if one wheel is not in contact with the ground.

In a two-wheel-drive car, one differential is sufficient for the whole powertrain because you either have front or rear wheel drive, and therefore, only one axis is actively driven by the engine and equipped with a differential. However, in an all-wheel-drive car, differentials are needed between the left and right wheels on the front and rear axle and between the front and rear axle to accommodate all possible speed differences for the four wheels. Thus, a total of three differentials is required. However, in many AWD RC cars, you won’t find that many (open) differentials. Some designs use open differentials in the front and rear axle and omit the center differential, like the Robak 2 or the Cramer 4x4. The Tarmo 4 even locks the rear differential. This approach is simple and straightforward: The open front differential enables sufficient control and traction during turns, and the lack of any other (open) differential offers traction even if one wheel has a weaker contact than the others. On the other hand, this concept reduces traction in turns because the rear wheels are forced to slip.

Locking the center differential

The goal of this RC car was to assemble a powertrain that resembled a real car. Hence, three open differentials are part of the AWD powertrain, and the center differential includes an optional lock to account for the fact that this car should be offroad-compatible. The locking mechanism is added to the front output of the differential, enabling the front output shaft to be locked with the differential carrier. When engaged, this setup effectively prevents the differential from serving its purpose: front and rear outputs are forced to rotate at the same speed as the carrier. Thus, if a front or rear wheel loses contact, the car still has traction when the differential is locked. If the differential is open, lifting one wheel from the ground means that the car can’t drive any longer as all the power is directed to the wheel with the least resistance. Therefore, locking this differential improves the offroad capability of the car at the price of forcing the front and rear wheels to have matching speeds, which increases the strain on the drivetrain and reduces traction in turns.

The locking mechanism uses a dog clutch. One dog gear is part of the differential carrier, and the other one is mounted axially and movable on the front output shaft. Because of this design and the poor tolerances and resolution of 3D printing, there is the intrinsic risk that the dog teeth don’t mesh as intended but become stuck when the angle between the slider and carrier results in the tips of the teeth being on top of each other. This risk can be minimized by only locking the differential when the clutch is open and/or if a wheel has already lost its contact with the surface. Then, the drivetrain can freely move, and the dog teeth of the lock can mesh more easily. If you ignore this rule, you can damage the actuator when it tries to lock the differential but can’t reach its end position. This design flaw may be counteracted by using a similar magnetic design as implemented for the clutch (the magnets assist in correct gear meshing), but there was no space left in the car, and I didn’t want to build the prototype from scratch again.

Asymmetric torque distribution

The classical design of a differential is based on bevel gears, with one bevel gear per output shaft and two bevel gears mounted in the carrier that is driven by the input shaft. The idea is that the carrier can rotate freely, as can the two output shafts: The rpm of the carrier matches the average rpm of the two output shafts. If one output shaft faces a higher resistance, it will rotate slower, while the other output shaft, consequently, rotates faster. Hence, the average output shaft speed remains equal to that of the carrier, but the design compensates for speed differences between the wheels that occur, e.g., when turning the car. In a symmetric differential, the gear ratios of the bevel gears in the carrier are constant for both output shafts, which results in an equal torque distribution to both output shafts. Here, the center differential is asymmetric, transferring more torque to the rear wheels than to the front wheels. An asymmetric torque distribution from the center differential very likely does not make a big difference in the operation of this RC car, but in a real car, the handling in certain situations is supposed to be improved when more torque is reaching the rear wheels.

The bevel gears on the output shafts of an asymmetric differential need to have different teeth counts so that the gear ratio between the carrier and the output shafts differs for the two outputs. This design can be achieved by mounting the bevel gears in the carrier not orthogonal but at an angle that matches the size difference of the bevel gears on the two output shafts. However, a different design was needed here as the differential is made from printed plastic: Printed gears need to be assembled so that the acting forces don’t bend the part to prevent it from breaking. On the other hand, 3D printing allows the use of designs that can hardly be manufactured using classical subtractive manufacturing. Therefore, two sets of bevel gears were stacked in the differential carrier, resulting in a gear ratio of 24:36 from the carrier to the rear output shaft (1.5x reduction) and 16:20 for the front output shaft (1.25x reduction). The absolute gear reduction is not important, but the difference between the two ratios matters: This difference means that the rear output receives 1.2x the torque of the front wheels, or, in percentage, 55 % of the torque goes to the rear wheels, and 45 % to the front wheels.

A differential is also commonly used as a gear reducer in drivetrains. Equally, the center differential serves this purpose by receiving power from a 25-teeth spur gear and transmitting it to a 50-teeth spur gear on the differential carrier (1:2 reduction). Further, a spacer was needed to increase the distance between the clutch and the differential to allow the required actuators to be mounted between these components. Therefore, another set of spur gears was added between the clutch and the center differential, increasing the gear reduction by two.

Reversing the rotation direction

The final component that is included in the center differential is a part that I refer to as a rotation inverter. This part does not appear in the powertrain of real cars: Its purpose is to reverse the rotation direction of the front output shaft of the differential. It is needed in this powertrain because the drive shaft is not in the center but offset to the left of the car. The offset is needed due to size constraints to keep the car as compact as possible while still fitting all drivetrain elements into the chassis. Therefore, the front and rear differentials are basically mirrored instead of located at the opposite side of the drive shaft (as it is done for real cars), which results in opposite output rotation directions for the front and rear. The rotation inverter compensates for this direction discrepancy, making the front and rear wheels rotate in the same direction.

Essentially, the rotation inverter is a set of bevel gears that makes the front output spin reversely compared with the input. Notably, uneven torque splitting between the front and rear wheels could also be implemented in this component using nonequal gear sizes for the input and output. However, that task is accomplished by the center differential. Thus, the rotation inverter uses the same gear sizes for input and output, only adjusting the rotation direction but not the torque distribution.

As for the gear shifter and the clutch, the differential also uses the copper wire approach as an assembly tool to connect parts on the shafts. A tight fit fixes the bearing in the slider of the differential lock, and it is further secured by a lock ring that is welded onto the differential lock, like the bearings in the gears of the gearbox. The bevel gears of the differential carrier and the rotation inverter are mounted on 3 mm diameter steel, and the slider of the locking mechanism moves on 6 mm diameter aluminum rods.

Required parts:

  1. 1x 3 mm steel bar with 47 mm length (differential)
  2. 1x 3 mm steel bar with 37 mm length (rotation inverter)
  3. 2x 6 mm aluminum bar with 46 mm length (differential lock)

Actuators

Actuator assembly other side.png
Actuator assembly.png
Actuator overview.png
Actuator overview other side.png
Actuator exploded view other side.png
Actuator exploded view.png

So far, three components have been added to the powertrain that require manual adjustment: The gear shifter needs to move between the slow and fast gear, the clutch needs to be opened and closed, and the lock of the center differential needs to be (dis)engaged. Since the model is supposed to be a fully remote-controlled vehicle, actuators are required. Typically, RC servos are used for this purpose: small, brushed DC motors equipped with a large gear reduction to render them high-torque actuators. They come with a built-in potentiometer that reads their current position so that the controller only needs to tell them the desired angle, and the servo motor will try to reach this angle.

Pros and cons of RC servo motors

These servo motors are available in many sizes and qualities. A wide variety is available, from extremely cheap (< 5 €) to more than 100 € per servo. In an earlier design of this car, I used these servo motors as actuators for the powertrain. Yet, several problems are associated with the use of RC servos for this purpose. First, cheap servos typically have poor quality: They have a comparably bad reproducibility in reaching a specific position, they tend to “shiver” if they can’t properly reach the desired position, there is significant backlash due to the included gearbox, and they have the tendency to be destroyed randomly and frequently when their controller fails, the motor burns, or the gearbox breaks. On the other hand, using more decent servos (e.g., from Hitec) adds quite some costs to the project (at least 20-40 € per servo).

Further, the fact that RC servo motors do not provide feedback on their current position makes them unsuited if the application includes hard stops and a limited operational range for the servo. Hitting the hard stop means the servo motor is stalling, and overheating destroys a stalled brushed DC motor within a few seconds. Hence, calibrating the drivetrain from an unknown starting position becomes dangerous, concerning the risk of ruining the actuators. An additional challenge for using servo motors in this application is that they need to be installed so that the servo horn does not tilt under load, which can happen for small servos that use servo horns and gearboxes made from plastic. That requires a comparably large printed holder, which consumes more space than can be afforded in the chassis.

A custom actuator

For these reasons, a custom actuator design was chosen instead of plug-and-play RC servo motors. The underlying principle is the same: A small brushed DC motor with a gearbox to increase the torque is coupled with a potentiometer to read the position of the actuator. However, the main ESP32 microcontroller of the RC car reads the position and controls the DC motor, which enables complete control over position and movement. There are still some compromises in this actuator design to keep the price low. The motors are N20 geared DC motors, which are cheap and neither very sturdy nor good in terms of backlash. Space constraints required the potentiometer to be mounted offset from the motor shaft using a spur gear, which adds additional backlash and, consequently, limits the accuracy of the position readout. Nonetheless, the actuators perform surprisingly well, even without a sophisticated PID control, with mere software-specified upper and lower position limits that trigger the microcontroller to stop the motors.

The costs for each actuator are higher than for super-cheap servo motors but lower than for high-quality servo motors. Each actuator has one N20 motor, a potentiometer, some bearings, and a single brushed DC motor driver (Pololu DRV8876 QFN). I didn’t want to save money on the motor driver, and this driver type enables a simple two-pin motor control from a 3.3-V-logic microcontroller, rendering it the ideal choice for this application. The total costs per actuator, including the motor driver, are about 15 €.

Assembly information

Two points need to be considered for the assembly of the actuators. Firstly, the gear on the shaft of the N20 motor is attached by a tight fit. Thus, a considerable force is needed to push the gear onto the motor shaft. Ideally, you use a vise to push the gear onto the shaft to avoid tilting the gear while pushing it onto the shaft. If that happens, a new gear should be printed to prevent the shaft from slipping through the gear. Secondly, the gear on the potentiometer has a double-D-shaped cut-out for the 6 mm shaft of the potentiometer. Thus, the round shaft of the potentiometer has to be prepared by a rasp to grind the corresponding double-D-shape, and it has to be cut to the correct length. It is important not to grind off too much material from the shaft of the potentiometer as it has to mate with its gear in a tight fit.

The actuator is needed in two versions (mirrored to drive a slider on the right or left), and each version is required twice in the car. The mounting positions on the base plate of the car carry cut-outs for the wires of the potentiometers and the motor, and the positions are labeled with versions (I and II) to assist with the assembly.

When assembling the actuator and placing it into the chassis, the angle of the potentiometers needs to be set correctly. They are mechanically restricted to a 300° rotational range and have around 240° electrical range. Thus, the actuator should be assembled with the potentiometer in its center position, and the sliders of the powertrain components should be moved halfway when the actuators are placed in the chassis. You don’t need to be overly precise when doing so, as the required movement angle for the potentiometer in the actuators is only around 120° or less. Still, it should be roughly centered to avoid breaking anything upon calibrating the actuators.

Required parts:

  1. 4x N20 motor (12 V, 50 rpm)
  2. 4x Omeg PC20BU 10k linear potentiometers

Brake

Brake assembly other side.png
Brake assembly.png
Brake overview.png
Brake overview other side.png
Brake exploded view other side.png
Brake exploded view.png
Brake.png
Brake animation.gif

The next part in the car’s powertrain compartment is a component that doesn’t even belong to the powertrain: A mechanical brake. While this component is essential in any vehicle to enable it to stop safely, it is typically not found in RC cars. In RC cars, stopping the vehicle can be simply done by no longer powering the main motor. Then, the electric motor will act as a generator and exert force against its current rotation direction, resulting in a very effective braking mechanism supported by the used gear reduction. Therefore, this brake is not meant to reduce the car’s speed but rather as a parking brake. As the car has the option to disengage the motor from the drivetrain by opening the clutch, the wheels can spin freely, and the car can uncontrollably roll down hills. A parking brake can prevent that, and that’s what the brake is meant to do here.

Design considerations

Mechanical brakes work by moving parts from a low-friction (no contact) to a high-friction (pressed together) position to alter the rotation resistance of a wheel. As a consequence, the kinetic energy of the car is converted into heat, which is something that isn’t recommended for heat-sensitive 3D-printed parts. However, the parking brake does not need to consume any kinetic energy as it is only meant to hinder the car from starting to move rather than stopping a fast-moving vehicle. Therefore, there won’t be any heat or excessive wear issues. Yet, the issue of designing a compact but sturdy and reliable braking system based on 3D-printed plastic parts is still there. To this end, I discarded implementing the brake at the wheels due to space constraints. Instead, the brake is acting at the center differential’s front output shaft, making this concept a transmission brake. This design isn’t perfect, as it means the car could still move if one of the front wheels is lifted from the ground (due to the front differential). Nonetheless, it can still act as a design exercise, and in most cases, all wheels do have contact with the ground.

The design of the brake needs to fulfill several criteria: It needs to fit into the powertrain compartment (compact), it needs to be self-centering (no imbalanced pressure on the shaft), it needs to be self-locking (allowing the actuator to be not powered when the brake is engaged), and it should open and close with high repeatability (constant brake force every time the brake is engaged). With these considerations in mind, I opted for a clamp-like design for the brake: two arm-like calipers surround the drive shaft. The calipers are interconnected by a joint on one side of the shaft and attached to a drive gear on the other. Thus, the two calipers close or open simultaneously by rotating the drive gear.

Self-locking worm drive

This layout fulfills the criterion of being compact. The two brake calipers are wrapped around the existing drive shaft, meaning no additional parts like drums or discs need to be added to the drive shaft. Also, this brake is self-centering since the geared connection between the calipers forces them to move equally. Further, the brake is supposed to be self-locking. Self-locking means that the gear ratio and/or gearbox efficiency are tuned so that an actuator can drive its output but cannot be back-driven by the output. A commonly used gearbox design for this purpose is a worm drive. In principle, worm drives consist of helical gears that are mounted at 90° relative to each other and that use a spur gear-like tooth design on the worm wheel but a screw-like gear design on the worm gear.

This concept results in two effects: Firstly, a comparably high gear reduction can be achieved within a small footprint (the higher the reduction, the more torque is needed to back-drive a gearbox, making it harder to be back-driven). Secondly, the way the gears mesh in a worm drive leads to a much larger friction between the teeth than in a classical spur gear arrangement, particularly when back-driving the gearbox. Therefore, worm drives are not meant for high-speed applications (resulting in heat and wear) but rather for slow and high-torque applications. That is what is needed here, and the increased friction in the gearbox means even more torque is needed to back-drive this gearbox. If the force required to back-drive a gearbox exceeds the typically occurring forces in an application, it can be considered as not back-drivable, rendering the setup self-locking.

Choosing a suitable actuator

Finally, opening and closing the brake is supposed to be highly repeatable. Some tolerance can be accepted for the other actuators in the powertrain since the end position only has to be reached within certain tolerance limits to (dis)engage a feature. However, the brake must reach an exact endpoint to ensure enough braking force is applied without destroying any part. Further, in the beginning, I was not sure whether I could achieve a self-locking design, and therefore, I opted for a stepper motor instead of a brushed DC motor for moving the brake.

A stepper motor is basically a brushless DC motor, but it is designed so that powering one set of coils only results in a tiny angular movement (typical stepper motors rotate 1.8° per step). When the coil remains powered on, the motor has an increased holding torque but doesn’t burn like a brushed DC motor. That’s because good stepper motor drivers use chopping to limit the maximum current flow through the motor. Chopping means the power is switched on/off at a very high frequency to achieve the desired maximum average current flow. A stepper motor rotates by switching the power between the coils at a constant (fast) frequency, which creates a continuous motion from the fast incremental steps. An exact movement is enabled by counting the number of steps and stopping the motor precisely when the desired number of steps has been reached.

Thus, stepper motors are a cheap way of moving parts repeatably and precisely, which is why they can be found in many CNC devices, such as 3D printers and cheap laser engravers or CNC mills. The disadvantages of stepper motors are their comparably large weight and low achievable speeds. However, the actuator of the brake doesn’t need to be very fast, and because of the large gear reduction ratio enabled by the worm drive, the motor also does not need a very high torque. Hence, I opted for a small NEMA 14 stepper motor for the brake. A side note regarding the installation of the motor: Do not crimp the connector of the stepper motor’s cable to the main PCB yet. Step 13 (calibration) explains how to wire the motor correctly to the PCB.

When relying on a stepper motor, continuous positional feedback is not needed for an actuator. The number of steps performed in a specific direction gives the current position. Yet, the initial position is unknown to the system (compared to a servo motor that constantly reads its current position). Therefore, a limit switch is used to home the brake. Homing is typically done at startup to ensure that an external force has not moved the actuator since the last run, which would result in an offset between the apparent and actual position of the actuator. Note that the sensor of the brake has to be wired so that it outputs high (logic voltage) when it is triggered and low (ground) when it is not triggered. If you do not stick to this wiring protocol, the brake may be damaged because the car’s microcontroller will misinterpret the sensor output.

Assembly information

The diameter of the drive shaft is enlarged within the brake to increase the effective brake force (the larger the diameter of this shaft, the more torque is needed to overcome the brake force when applying a constant force by the calipers). The brake itself is printed from PETG except for the brake pads, which have to be printed from TPU to allow the brake force to be gradually increased by elastic deformation of the brake pads. The brake calipers are mounted on a 4 mm diameter steel round bar with a length of 24 mm. The limit switch position can be adjusted to allow fine-tuning of its position so that the brake is fully open when the switch is triggered by the little shaft that protrudes from the brake’s drive gear. This “open” position means that the drive shaft can rotate freely without touching the brake pads. Also, you need to pay attention to the brake calipers: When assembling the brake, you must ensure that the calipers mesh at the correct angle and relative to each other with the drive gear so that both have the same distance from the drive shaft (the brake is then centered) and the shaft that protrudes from the drive gear can reach the limit switch when the brake is open. The worm gear should be printed at an angle of 45° with support (the organic support of Prusaslicer works well) to allow the teeth to be precisely manufactured.

Required parts:

  1. 1x Joy-IT NEMA14-01 stepper motor
  2. 1x Panasonic AV 32543 AT limit switch
  3. 1x 4 mm steel round bar with a length of 24 mm

Front and Rear Differentials

Differential assembly.png
Differential assembly center diff and brake removed.png
Differential overview top frame mounts removed.png
Differential overview.png
Differential exploded view other side.png
Differential exploded view.png
Rear differential open.png
Rear differential.png

The first differential was added in step four, but two more differentials are missing: The power needs to be distributed from the two output shafts of the center differential to the left and right wheels in the front and rear. The design of the center differential equals the most known layout of a differential, using multiple bevel gears to achieve the desired functionality. However, this classical type of differential cannot automatically compensate for slipping wheels. A locking mechanism is needed, as it was introduced to the center differential.

The space between the front and rear wheels is even more constrained than in the rest of the powertrain compartment, given that the differentials must fit between the wheels. Thus, a separate, manual locking mechanism is undesirable. Therefore, I opted for a Torsen (torque sensing) differential, which is a limited-slip differential. Limited slip means its design results in the effect of a differential but with a comparably large internal friction that counteracts the differential action. Hence, speed differences between the two output shafts result in a resistance due to friction. That can’t save a car if a wheel is freely spinning in the air, but if one wheel is on a slippery surface and the other one on dry tarmac, there may be enough power reaching the tarmac side to maintain some traction.

Design of a Torsen differential

A Torsen differential consists of two sun gears (the two output shafts) that are each surrounded by three planet gears. The torque-sensing operation is enabled by mounting its sun and planet gears like a worm drive. However, the teeth on the planets and the sun gears are both oriented at 45°, whereas worm drives typically use different angles for worm gear and worm wheel. This design results in the desired friction for the differential operation. What is still missing is the connection between the two output shafts to link their motion: The planet gears harbor a set of spur gears at their top and bottom, which mesh with the opposing output side. Thus, when considering the full assembly, driving the left output shaft in one direction forces the right output shaft to rotate in the other direction at the same speed if the planet carrier is fixed. Or, if the planet carrier is rotating (the normal operation of the differential), the average speed of both output shafts matches the speed of the carrier.

This concept appears confusing, but once you assemble the differential, you will see how elegantly this gearbox works (or watch this animation on YouTube). The underlying design is quite straightforward, but building it from 3D-printed plastic becomes challenging. Many rotating parts are involved, and the 45° teeth of the output shafts and the planet gears are at the limit of what a 3D printer can produce at sufficient quality without support. Thus, poor tolerances of filament-based 3D printing can affect the desired smooth motion of the differential. Multiple design iterations were needed until I finally came up with a layout that enabled the operation of the Torsen differential satisfactorily.

Size and tolerance constraints

The most important lesson learned during these design iterations was that I do not want to rely on plastic-plastic or plastic-metal gliding for rotating gears. The printed parts are never perfectly round, which results in an unsteady friction between the parts. Instead, ball bearings are used for all gears. Notably, this design choice limits the function of the Torsen differential, which requires internal friction to operate as a limited-slip differential. Yet, if the friction occurs only at certain angles but not constantly, the operation is unpredictable and far from smooth. A consequence of supporting all rotating parts by bearings is the comparably large differential size given by the smallest bearings at hand (683), plus the minimal gear sizes that a filament 3D printer can produce.

The power transmission from the center differential to the front and rear differentials is done by a set of bevel gears with a 21:57 teeth ratio (2.7x reduction). This is the final reduction in the drivetrain, meaning that the maximum torque in the powertrain is acting on the front and rear differentials. Therefore, a sturdy design is mandatory to prevent the differentials from breaking. To this end, the planet gears are mounted on stable axes, 3 mm steel round bars with a length of 33 mm each. The output shafts of the differentials are connected to three planet gears mounted at a 120° spacing, which balances the forces and prevents the shafts from bending. Thus, this design avoids the common failure mode of 3D printed gears (allowing the part to bend means it’ll break under load).

Assembly information

A main concern for the layout of the Torsen differential is how to secure the output shafts axially. In principle, that can be done by clamping the bearings into the shafts and placing the bearings into tight-fitted cut-outs in the differential carrier. However, that turned out to be quite difficult as I’m not particularly eager to use glue, and screw-nut connections in 3D-printed drive shafts are prone to loosen due to vibrations. Therefore, the output shafts are axially fixed by the copper-wire approach. However, here, the assembly is a bit more tricky: The differential has to be installed together with the output shafts and has to be placed onto the base frame of the car, but without fixing it with its top frame mounts (parts 02, 04, 07, and 09). Only the bottom frame mounts (parts 01, 03, 06, and 08) shall be placed onto the base frame. Then, the inner part of the Cardan joints of the wheels has to be pushed onto the output shaft and secured by the copper wire approach. Only after this step has been done the upper part of the frame mounts can be added, and the differentials can be secured with screws to the base frame.

This assembly is a bit tedious, but the connection is very durable. My prototype has been driving for many hours, and several components have been updated and replaced based on the experience and due to wear from these rides, but the differentials, the Cardan joints, and the link between the output shafts and the Cardan joints were none of those. Only the rear 21-teeth pinion that connects to the differential had to be replaced due to wear. The differentials are completely printed from PETG, with the linkers to the center differential being the only exception. They are made from TPU to compensate for axial offsets due to the bending of the base frame and poorly centered and balanced 3D-printed shafts. The front and rear differentials are identical; only the frame mounts are mirrored to account for their locations in the chassis, and the linkers to the center differential differ in length to match the required length in the front and rear.

Required parts:

  1. 12x 3 mm steel round bar with 33 mm length

Steering

Steering assembly.png
Steering assembly other side.png
Steering overview.png
Steering overview other side.png
Steering exploded view other side.png
Steering exploded view.png
Steering.png
Ackermann steering.png
Parallel steering.png
Toe angle.png

The powertrain is fully assembled, but the car’s steering system is still missing. Different options are available, and the most classical version has two fixed rear wheels and adjustable front wheels to enable the car to turn. The most straightforward steering system consists of a bar that connects the left and the right wheel at an offset of their center of rotation, and by moving this bar left and right, the angle of the two wheels changes accordingly. This approach is possible when using a rigid axle between the two wheels, but this car was supposed to use independent suspension for all four wheels. Thus, the steering mechanism needs to account for all degrees of freedom that the wheels have.

Design considerations

One of the problems associated with independent suspension and steering is keeping the toe angle constant when a wheel travels up and down along its suspension interval. The toe angle is the offset of the wheels from being parallel when oriented straight (see the image for a depiction). That can be achieved by designing the steering system so that the length of the tie rods equals the length of the wishbones of the wheel assembly. Yet, this design was not possible because the drive shaft from the center differential to the front differential is not in the center but shifted to the left side of the car. Thus, when considering the maximum desired steering angle, the inner end of the tie rod would hit the drive shaft. Therefore, the tie rods had to be slightly shorter, resulting in a slight toe-out of the front wheels when bottoming out the suspension, which does not occur during normal driving. Therefore, this issue is negligible.

One design choice that I made in the beginning was the use of rack-and-pinion steering. That is not very common in RC cars, as most use a pitman arm connected to a servo motor to translate rotational motion into the required linear motion for steering. I opted for rack-and-pinion steering because I suspected this design to be sturdier than multiple joints between multiple fragile printed plastic bars. Of course, commercial metal steering link systems are available for RC cars, but the overall design idea is to keep this vehicle on a DIY level. In retrospect, I’m not fully convinced by my rack-and-pinion steering any longer, as the wheels have more play than anticipated. Nonetheless, the steering system works satisfactorily, so I didn’t see the need to start with a different design from scratch.

Layout of the steering mechanism

Rack-and-pinion steering requires the center link of the steering system to be fixed as a linear axis, with only one degree of freedom (moving left and right). I reached this goal by using two 6 mm aluminum round bars (134 mm length) traveling through fixed carriages using LM6UU linear bearings. This design reverts the typical concept of a linear axis using fixed round bars and traveling carriages on these bars. A rack driven by a pinion is added on one side of the center link to control the translational movement.

The pinion is mounted to a strong RC servo motor. I opted for a servo motor to enable steering as this motor type perfectly matches the requirements for steering. Servo motors have integrated PID control to reach a specific desired rotational angle. Thus, it automatically compensates for external forces acting on the steering to reach the desired steering angle without the need for tedious programming of the actuator. Also, RC servo motors come with the required gear reduction to enable a low-speed but high-torque application, such as adjusting the steering angle of the wheels of a car.

Ackermann steering geometry

Another point to be considered when designing the steering system is the individual angle of each wheel. Even though the wheels turn in the same direction when steering left or right, the actual steering angle for each wheel can (and should) differ. The underlying concept is called Ackermann steering. It describes a solution to the problem that a vehicle, which is supposed to turn without forcing any wheel to slip, needs to adjust the angle of every wheel toward one common center point of the rotation. In a car with two fixed rear wheels, this center point has to lie on a line defined by the car’s rear axle. Thus, the front wheels need steering angles that meet this imaginary line at the same point to enable “perfect” turning. The images highlight what the Ackermann condition for steering compared with parallel steering looks like.

Perfect Ackermann steering is not necessary to make a car turn. Still, if the car differs significantly from Ackermann steering, increased wear can occur, and the car is more likely to lose traction when turning, at least if the car is moving slowly. The faster the car drives, the more additional effects occur, such as centrifugal force pushing more load onto the outer wheel, reducing the influence of the inner wheel. Given that this car is designed as a low-speed offroad vehicle, none of these additional effects were considered. This RC car uses “Ackermann approximated” steering, which means that (according to the CAD rendering) the Ackermann condition is met within a tolerance of 2° for the full range of steering angles (up to ~40° for the inner wheel). Given that plain trial and error was used to adjust the steering geometry (which is dictated by the length of the steering knuckle and its offset to the center link), I was happy with this result and did not consider any further corrections to the steering geometry.

Notably, the deviation in the steering angles for the inner and the outer wheel to meet the Ackermann condition can be quite significant. For example, the geometry of the wheels on this car and the maximum steering angle means it can achieve a minimum turning circle with a diameter of around 1.2 m. When perfectly meeting the Ackermann condition for this turn, the inner wheel must have a steering angle of 38.6° and the outer wheel a steering angle of only 26.2°. The difference decreases with increasing turning circle size. For instance, a turning circle with a diameter of 4 m requires 11.1° for the inner and 9.7° for the outer wheel.

Assembly information

The joints in the steering mechanism are based on a bunch of 683 bearings instead of dedicated ball joints, as I tried to stick as close to the do-it-yourself approach as possible. The idea was to minimize backlash and wear by using a combination of bearings and metal shafts (either 3 mm steel rods or M3 screws) for the joints. The latter was achieved by this design (none of the joints failed so far), but there is a considerable amount of play in the steering, which increases the more the steering angle differs from zero. This effect stems from the ductility of the printed parts and is further supported by the unfavorable geometry of the tie rod/steering knuckle layout with increasing steering angle.

The steering system uses fixed anchoring points for the tie rods, but the printed connectors on the center link (rack connectors, parts 06 to 09) can be mounted at an offset to adjust the toe angle: They are fixed by clamping a screw against the aluminum round bar, which should be secured with a lock nut instead of a standard nut. Adjusting the toe angle should not be made at this step; it should only be done after the wheels have been mounted so that the toe angle of the front wheels can be adjusted to zero in the resting position of the shock absorbers.

Required parts:

  1. 1x Sunfounder SF3218MG servo motor with its servo horn
  2. 2x 6 mm aluminum round bar with 124 mm length
  3. 4x 3 mm steel round bar with 18 mm length (joints at the tie rods)
  4. 1x 3 mm steel round bar with 6 mm length (top of servo horn)

Wheel Assembly

Wheel full assembly other view.png
Wheel full assembly steering.png
Wheel full assembly.png
Wheel assembly.png
Wheel assembly other side.png
Cardan shaft overview other side.png
Cardan shaft overview.png
Cardan shaft exploded view other side.png
Cardan shaft exploded view.png
Right front wheel overview.png
Right front wheel overview other side.png
Right front wheel exploded view other side.png
Right front wheel exploded view.png
Shock absorber overview.png
Shock absorber overview other side.png
Shock absorber exploded view.png
Shock absorber exploded view other side.png
Wheel overview.png
Wheel overview other side.png
Wheel exploded view.png
Camber angle.png
Wishbone geometry.png
Shock absorber length calculation.png
Shock absorber length over wheel height.png
Spring force over wheel height.png

In this step, the four wheels and the suspension are manufactured and installed on the car. The car uses independent suspension for the wheels, which means that no rigid axle transmits power from the motor to the wheels, but a combination of two specific joints at each wheel that allow transmitting rotation along an axle at varying angles. The advantage of independent suspension over a rigid axle is that the suspension can independently react to unevenness on the road for each wheel, resulting in a better overall behavior of the car. On the other hand, the complexity of the setup increases, and more components typically also means more possible sources of error. Still, I was fascinated by the mechanics involved in transmitting rotation over a flexible axis, and therefore, I opted for independent suspension for the car. Different designs are available for the required joints, with the most common being Cardan joints (also called universal joints) and subtypes of so-called constant velocity joints.

Double Cardan joints for the drive shafts

Cardan joints consist of two hinges that are connected to a cross shaft. The hinges can swivel around the shafts of the cross shaft. Consequently, the cross shaft fixes the rotation of the axes attached to the hinges, resulting in the desired transmission of rotation. The degrees of freedom enabled by the two hinges allow this rotation to be transmitted at a non-zero angle between the axes. A disadvantage of Cardan joints is that they do not transmit motion continuously when they are operated at a non-zero angle: The output motion is distorted by a cyclic increase and decrease relative to the input rotational speed, and the amplitude of this cyclic speed offset increases with increasing angle of the joint. That’s why constant velocity joints are used in modern cars to prevent vibrations and wear due to this phenomenon.

Nonetheless, I was intrigued by the design of Cardan joints and wanted to use them. Also, there is a simple solution to the problem of non-constant output velocity. If a second Cardan joint is added and the first and second Cardan joints are kept at the same angle (input and output shaft are parallel and only shifted transversally), the output speed will be constant again. This solution is called a double Cardan joint, and it works very well for the rear wheels of a car since there is no steering that would alter the angle of the wheels. The suspension mainly lifts or lowers the wheel without significantly changing the angle of the wheel relative to the car (assuming a neutral camber angle). However, a double Cardan joint cannot fully compensate for the non-constant speed output of the front wheels when turning as steering alters the angle between wheels and car (input and output shafts are not parallel any longer when turning). Thus, Cardan joints are not ideally suited for driven front wheels, but I still liked this design and continued with them for all four wheels.

Design considerations regarding the drive shaft

I considered the drive shafts the most fragile part of the powertrain of the car because they have to convey the highest torque in the system while being a comparably thin printed shaft. Therefore, I started the design of the car with the Cardan joints, decided on the smallest footprint of these parts that I considered as trustworthy for the involved torque (gut feeling, no calculations involved), and only then started with designing the wheel assembly. A challenge for the Cardan joints was that they were supposed to run on metal bearings for the sake of stability and constant, low friction. Further, this project was meant to be built without serious metal machining, meaning that most of the parts of the joints needed to be 3D printed.

With these limitations in mind, I ended with a Cardan joint of 27 mm diameter and a cross shaft that consists of a printed centerpiece that carries the heads of four M3x6 screws, each of them used as a shaft for holding the two hinges of the Cardan joint. 683 bearings are placed into pockets of the hinges, thereby enabling the swivel motion of the hinges to be supported by ball bearings. The assembly is done by placing bearings and M3 screws into the hinges, then pushing the screw heads into the printed center part of the cross shaft, and finally securing the screws with the end cap of the printed cross shaft centerpiece. Use a lock nut at this point to ensure the cap won’t come loose over time. The idea of this design is to avoid having any screw connection being under direct load, which prevents vibrations from loosening the connection. Also, this design enables a (dis)assembly of the joints without having to destroy any printed part. The design allows an operation angle of the Cardan joint of up to 40°, sufficient for the desired suspension travel and steering angle.

The drive shafts that connect the wheels with the powertrain parts within the chassis consist of two Cardan joints, each pushed into a linker made from TPU, which compensates for vibrations and absorbs sudden speed changes between the wheel and drive shaft (acting as a torque damper). The wheels are mounted at a neutral camber angle. Camber angle describes the angle at which a wheel is oriented relative to the surface (see the picture). A neutral camber means the wheel is vertical, whereas a negative camber angle means the wheels are “leaning inwards”. Negative camber is helpful in high-speed curves, but that is not what this car is meant to do. Hence, I opted for a neutral camber, which also enables the two Cardan joints to compensate for their non-continuous output velocity perfectly as long as the car goes straight.

Caster and camber angle

Notably, the suspension is designed so that the camber angle of the wheels remains constant for the entire suspension travel. A change in camber angle along the suspension travel can be helpful for a road car since cornering results in more load on the outer wheels. Thus, the outer wheel, which is responsible for most of the traction when turning at high speeds, profits from a more negative camber when the shock absorber is compressed. However, the idea was to create an offroad car where the suspension is needed to compensate for rough terrain rather than forces due to high-speed cornering. Further, cars are engineered with a specific caster angle, which is the angle between the wheel’s suspension travel and the wheel’s vertical axis, to improve their driving behavior. Here, the caster angle is neutral for the sake of simplicity, albeit cars typically employ a positive caster angle on the front wheels. A slightly positive caster angle can improve the stability of the car at high speeds.

The suspension is based on a double-wishbone assembly, with equal lengths for the upper and the lower wishbone, resulting in the desired neutral camber angle irrespective of the angle of the wishbones. The wishbones are identical on the front and rear wheels, but the front wheels use a joint at the wheels with an additional degree of freedom to allow steering. Note that the assembly requires the usage of fully threaded M3x25 screws to attach the upper wishbones to the frame mount plates.

Consequences of independent suspension

A disadvantage of this double wishbone design is the comparably large change in axle track along the suspension travel. The axle track is the distance from the left to the right wheel hub. Here, it can change from around 387 mm (resting position) to a maximum of approx. 392 mm (wishbones are horizontal) and a minimum of ~371 mm (maximum extended length of the shock absorbers). Thus, a significant change in axle track is possible. However, most of the change occurs when the shock absorber extends from the resting position (axle track reduced by up to 8 mm per side). In contrast, compression of the shock absorbers from the resting position results in a smaller deviation in the axle track.

A change in axle track requires the wheel to slip sideways unless the wheel has no contact with the road anyway. While this phenomenon is not ideal, it likely supports the shock absorbers of this car. Shock absorbers are supposed to compensate for the unevenness of the road by absorbing any abrupt height differences. Ideally, the wheel moves up or down once before reaching its resting position again, thereby conveying as little of the upwards/downwards acting force as possible to the car’s chassis. To do so, it consists of a combination of a spring, which forces the wheel to return to the resting position, and a dampening element responsible for absorbing the vertical forces. Without a dampening element, driving over uneven terrain would result in an oscillation caused by the spring, thereby resulting in the car repeatedly bouncing up and down.

Designing a custom shock absorber

The shock absorbers in this car are 3D printed, which means that I did not add a hydraulic or pneumatic damper but could only add a spring. Thus, friction has to serve as a dampening effect, and the forced lateral movement of the tire when altering the wheel height probably supports this friction-based dampening. Spring, shock absorber, and the layout of the wheel assembly were chosen and designed in a way that the maximum travel of the shock absorber results in 30° (maximum extended travel) up to -15° (bottom-out) of the wishbones (0° means horizontal). The resting position of the car is at 15°. With the given weight of the car, the resting position is determined by two variables of the spring: unloaded length and spring rate.

When starting the design, I was unsure about the car’s final weight, and I did not know the behavior of the suspension when the car was driving (which spring rate results in a not-too-soft and not-too-stiff behavior). Hence, I started with a random compression spring that was available at the local hardware store and checked it in the car. The spring rate of a spring without data sheet can be determined by adding a weight with known mass and measuring the compression. The spring rate is given in N/mm. 1 N equals around 100 g (0.102 kg, to be precise). Thus, if a spring is compressed by 10 mm when adding 1 kg on top, it has a spring rate of ~1 N/mm. I determined the spring rate of this spring with a simple kitchen scale, and I measured the compression when mounting the shock absorbers in the car, which resulted in a resting load of 32 N. The wheel assembly design was already finished at that time, meaning I calculated the desired length of the shock absorber at resting load (15° of the wishbones; 102.5 mm length of the shock absorbers). With the given shock absorber geometry, a spring with a loaded length of approx. 45 mm at a load of 32 N was needed. I chose a spring with a length of 63.5 mm and a spring rate of 1.783 N/mm (Febrotec 0C0480-0512500M), which equals a length of 45.6 mm at 32 N, sufficiently close to the desired value.

If you can’t source the same spring or want to adjust the stiffness of the suspension system, you can look for a spring with a different spring rate. The important requirement is that the spring’s length at a load of 32 N equals around 45 mm. With this condition being met, the resting position of the car remains unchanged while the suspension is either altered toward a more soft or stiff behavior. That differs from the typical adjustment of a shock absorber, which is based on altering the pre-tension of the spring, thereby altering the resting position of the wheels, too. I recommend staying in the window between 1.5 and 2 N/mm, as the car’s suspension works quite well with the current spring. The fully compressed length of the shock absorber is 87.5 mm, which corresponds to a length of 30 mm for the spring, and the maximum length equals 107.5 mm (50 mm for the spring). Thus, the spring’s block length (length of the spring at maximum compression) has to be smaller than 30 mm and the unloaded length more than 50 mm to maintain the full shock absorber travel. The shock absorber is designed to hold a spring with an outer diameter of 12.2 mm and an inner diameter of 9.6 mm. Deviations from this size must be accounted for in the printed parts holding the spring.

Manufacturing and mounting the shock absorbers

The shock absorber is built around a 6 mm aluminum round bar, which is connected to plastic parts by a screw pushed through a radial through-hole on one side and a thread that needs to be cut into the cutting plane of the rod on the other side. The distance between the cutting plane with thread and the center of the through-hole on the other side needs to be 66 mm. The bar can extend up to 5 mm in the other direction from the through-hole. Thus, ideally, an aluminum bar is cut at a length of 70 mm, an M3 threading is cut into one of the cutting planes of the bar, and a hole of 3 mm diameter is drilled sideways through the round bar at a distance of 4 mm from the other cutting plane (the distances are given relative to the center of the hole). The M3 threading is used to clamp an M3 washer to the aluminum bar, limiting the shock absorber’s maximum travel. The minimum travel is limited by the aluminum bar (with the washer & screw as an extension) hitting the printed top parts of the shock absorber. Thus, the travel of the shock absorber changes if the length differs from the specified values.

The two shock absorbers per wheel are mounted to the chassis using a 3 mm steel bar with 49 mm length, which is pushed through the 683 bearings in the printed shock joint parts. The shock absorbers are pushed onto the steel bar from both sides and kept in place by the TPU-based shock clamps.

Geometry and suspension characteristics

The shock absorbers are mounted at an angle relative to the wheels, like the typical design of a beach buggy. This layout was primarily chosen for design reasons and space constraints, but it also affects the behavior of the suspension. According to Hooke’s law, springs follow a linear force-compression trend: if you double the load, the compression is also doubled. Here, however, the geometric arrangement between the wishbone and shock absorber results in an angle-dependent alteration of this relation, meaning that a non-linear change in spring force accompanies a change in wheel height. In other words, the more the wheel is pushed upwards, the stiffer the suspension gets. This effect almost acts like a protection for the suspension from bottoming out, given that the force needed to push the wheel further upwards rises the more compressed the shock absorber is.

If you wondered at school when you would ever need the Pythagorean theorem in your life: Well, it applies here and allows you to calculate these values, like the length of the shock absorber in dependence of the wishbone angle. Further, based on the known spring rate of the compression spring in the shock absorber, this data can be converted into a plot of spring force over wheel height or wishbone angle. The required calculations are highlighted in one of the images. The geometry of the wheel assembly can be split into several triangles, and by combining their angle-dependent side lengths, the desired values can be computed using the sine law and the Pythagorean theorem.

Assembly information

This wheel assembly is required four times. The images show only the right front wheel, but most of the parts are identical for the front and rear wheels. Exceptions are the wheel mount plates (the front ones incorporate mounting points for the steering knuckle) and the wishbone joints at the wheel mount plates (the ones in the front harbor one additional joint based on a 3 mm steel bar with 18 mm length that enables adjusting the steering angle).

The wheels are based on separate rims and tires. The rims and their spiders are separate parts, allowing you to modify them if you prefer a different design. Notably, this rather massive design of the spiders was chosen after observing cracks in a more delicate prior iteration of the rim’s spider. The forces acting on the rims while accelerating and cornering at fast speeds are apparently quite significant. The tires are printed from TPU, and threaded inserts are used to mount them onto the rims. They are designed so that no support is needed for printing and mimic a tire filled with air. However, they are rather stiff due to their sidewall width. If you prefer a softer tire or a different tire tread, you can adjust the design in the provided .stp file.

Required parts:

  1. 8x Febrotec 0C0480-0512500M compression spring
  2. 8x M3 washer (top end of shock absorber aluminum bars)
  3. 8x 6 mm aluminum round bar with 70 mm length, with M3 threading cut into the top of one side and sideways drilled 3 mm hole at 4 mm distance from the other side
  4. 4x 3 mm steel bar with 49 mm length (shock absorber joints)
  5. 2x 3 mm steel bar with 18 mm length (wishbone joint adapters, front)

Electronics

Electronics mounted.png
Electronics mounting parts highlighted.png
Electronics mounting parts shaded.png
Bottom assembly full.png
Battery cage.png
Circuit.png
Board layout.png
PCB.png
Electronics compartment.png

The car’s mechanical parts are done, but it can’t operate without electronics. Most designs of DIY RC cars rely on commercial sets of an RC transmitter and receiver, which offer a very straightforward application: No programming is needed, and the remote control typically has an excellent range and signal stability. However, as with most proprietary systems, this concept lacks flexibility when you want to do more than what the manufacturer intended – in this case, more than controlling a motor driver and a few servos with a limited number of channels. Thus (and because the car should be as much DIY as possible), custom electronics were built for the car, enabling it to read sensors and send their data to the remote control, control various custom actuators, and implement additional logic.

Controlling the car with an ESP32 microcontroller

The electronics are centered around the ESP32 microcontroller. The big advantage of this controller is its wealth of built-in functions (compare this summary by StudioPieters). It does not only, like the well-known Arduino, provide several general-purpose input output pins that can be used as digital inputs and outputs, but it also encompasses, e.g., easy-to-program, frequency-adjustable PWM and WiFi for communication with other ESP32s. Despite these additional functions, the ESP32 can be programmed as easily as an Arduino using Arduino IDE. Yet, the ESP32 also has some disadvantages. For instance, the analog-to-digital converters of this microcontroller are of poor quality (noisy, non-linear, and individually offset for each device), and the number of available pins is more limited than one would guess based on the 38-pin design of the development boards. This limitation is because not all pins can serve all functions (e.g., some can only work as inputs, some shouldn’t be used because their usage can interfere with booting, or they output unwanted signals during start). Running out of pins is also a typical issue for projects using an Arduino Uno or Nano, but there is the Arduino Mega with many additional pins available in that case. Such a high pin-count edition is not available for the ESP32.

Still, the advantages of integrated bidirectional wireless communication outweigh the disadvantages. Wireless data transmission is always prone to stability issues. For example, the NRF24L01 is often used for Arduino-based projects, but it is also known that poor-quality clones of this chip are often sold instead of the original version, and already increasing the cable length between the transmitter and microcontroller to more than a few cm can be sufficient to cause instability. I had this experience with the NRFL01 but never encountered such problems with wireless communication by ESP32 development boards. Further, limits in pin count and analog inputs can be compensated by using additional modules: The MCP23017 is a port expander, a module that is connected to the ESP32 using the I²C interface (with two pins) and provides another 14 programmable digital input/output pins to the ESP32. The ADS1115 is a four-channel analog-digital converter, which is also connected using the I²C interface. It offers a high-quality reading of analog sensors without blocking any additional pins of the ESP32.

The ESP32 runs on 3.3 V logic, which requires the connected components to be compatible with this logic level. That is the case for ADS1115 and MCP23017, and the brushed DC motor drivers (Cytron MD20A for the main engine and four Pololu DRV8876 (QFN) for the actuators) were chosen with the same requirement in mind. The car’s headlights are controlled by an IRLZ44N MOSFET, which has a sufficiently low gate voltage threshold to be also compatible with 3.3 V logic voltage. The WS2812b-based RGB LED strip is designed for operation at 5 V, but the data pin also works with 3.3 V logic voltage (although not officially supported). The steering servo is addressed by a PCA9685 servo controller, which was chosen instead of trying to tune one PWM channel of the ESP32 to the required frequency and duty cycle characteristics. This decision was made because the ESP32 already has to deal with many libraries and timing-critical tasks. It is the safer option to use a dedicated driver that only performs this task. This servo controller can also be driven by 3.3 V, similar to the data pin of most available RC servo motors. Note that only the data pin of the servo has to be plugged into the PCA9685 board (channel 0). The car’s main PCB provides the power supply of the servo motor. Thus, no level shifting to another logic level is needed within the car’s electronics, which is always good: Logic level shifters are available, but they add another source of error that one should try to avoid if possible.

Auxiliary electronic components

The stepper motor for the brake is powered by a Pololu DRV8825 stepper driver, which, in turn, is controlled by an auxiliary ESP32. This task is outsourced to a separate microcontroller due to how a stepper motor is controlled. Stepper motors require step signals in a very time-critical manner to achieve a constant velocity. This control fundamentally differs from brushed DC motors, which require a defined voltage that PWM can approximate to control the speed. Each step pulse is converted into a specific rotational increment for a stepper motor. Any deviation in the frequency of these pulses results in unwanted vibrations, even if it only occurs once, and, in the worst case, steps will be missed if the speed is close to the maximum velocity of the motor. Hence, it is a common procedure to control stepper motors from a dedicated breakout board, which does not fulfill any other task to ensure stable real-time control of the motors. Here, an auxiliary ESP32 serves this purpose. Its data connection to the primary ESP32 is based on a very simple parallel interface read once per loop iteration, resulting in the desired constant timings for the stepper motor.

Another main electronic component is a high-power MOSFET that is used as the main power switch for the car. The small mechanical on/off switch that is used to turn it on and off is not designed to handle currents as high as those for the main engine and, therefore, only switches this MOSFET (an IRFP7430PBF). This transistor is specified for almost 200 A, much more than the car draws from the battery. Since the car's average current draw is only around 10 A, it can be used without adding an extra heatsink. A 30 A automotive fuse is added to the circuitry as a safety feature in case of a severe electrical short. Further, DC-DC converters are added to reduce the battery voltage to 5 V (servo motor and RGB LED strip power supply) and 3.3 V (logic level voltage). Several capacitors are added to stabilize the voltage supply for the different components.

Adjusting voltage levels

The 3.3 V line additionally powers the car’s headlight LEDs. They are directly fed from the 3.3 V line instead of a digital output of the ESP32 because the microcontroller cannot handle currents larger than a few mA. The LEDs’ required voltage reduction (or, more precisely, the required current limit) is achieved by adding a 1 Ohm resistor. Each of the LEDs consumes 80 mA at full brightness (3 V according to the manufacturer), and since they are wired in parallel, the total current equals 320 mA. When adding an Ohmic resistor in series to the LEDs, Ohm’s law states that the 1 Ohm resistor is responsible for a voltage drop by 0.32 V (U=R*I), resulting in the required ~3 V at the LEDs when powering the circuit from a 3.3 V source. Note that this calculation needs to be redone if different LEDs are used. Ohmic resistors convert electricity into heat, meaning that heat dissipation needs to be considered if an Ohmic resistor is used to reduce a voltage. Here, the resistor will convert a maximum of 0.1 W into heat (P=I²*R). The resistors used for the PCB are specified for up to 0.5 W, meaning that they can be safely used for this purpose.

The analog-to-digital converters are supposed to communicate with the ESP32; therefore, they are powered from 3.3 V. They can only handle analog input voltages up to their supply voltage. Therefore, voltage dividers are added to read the battery voltage (between 10 and 12.6 V (3S LiPo)) and the signal from the current sensor. The latter is an ACS712 hall-effect sensor, which requires a 5 V supply voltage and outputs an analog signal between 0 and 5 V. The sensor measures in a +/- 30 A range, which is more than enough for the car’s power consumption. Notably, the ACS712 board uses terminals that are not specified for such high currents. Therefore, I soldered the wires to the bottom of the board (the pins of the terminals) instead of using the terminals of the board. One of the power supply lines (either positive or negative) from the battery to the main electronics board has to be guided through this sensor. Since this sensor measures not only the current but also the current flow direction, the sign of the measured output needs to be considered. It could be simplified by using the absolute value of the reading. However, the current can be negative when the car is braking (the motor acts then as a generator, thereby creating a current from the motor to the battery), which should also be measured. Therefore, an automatic routine in the remote control code detects the current flow direction upon startup (while the remote control displays “pairing”) and adjusts the sign of the displayed values accordingly.

PCBs make the wiring easy

I designed a PCB for the car’s electronics, which is a great help in the assembly and wiring because it reduces the number of cables significantly compared with using a breadboard. The design is kept simple (primarily due to my limited skills in electrical engineering), which means that probably every PCB manufacturer can produce this standard 2-layer PCB. The board was produced by the German manufacturer Aisler, and this board worked flawlessly. Note that the PCB files have been updated (revision 1.1) compared with the board I used for my prototype (revision 1.0). Besides the necessary parts on the board, mounting points for optional pull-up or pull-down resistors are on the board. They do not need to be populated unless problems occur. The optional PWM pull-down resistors are meant to provide a stable GND signal to the motor drivers during power-up, in case the pins of the ESP32 are (still) floating during booting, to prevent any twitching of the motors before the main program on the microcontroller is running. The I²C pull-up resistors are meant to adjust the pull-up resistance of the I²C bus in case the peripheral components (MCP23017, 2x ADS1115, PCA9685) on this bus don’t work as expected.

The I²C data bus uses so-called open collector outputs, which means that the data pins SDA and SCL can only be pulled low by the components of the bus but are otherwise floating. However, they must be at a clear logical high instead of an undefined floating state when not being actively pulled low to ensure the data bus is working. All components that are connected using I²C are connected to the same SDA and SCL lines, but not every manufacturer adds an or the same integrated pull-up resistor to their components. Thus, depending on the components you use, you may end with a too-low (if all components come with their own, comparably low-Ohmic pull-up resistor) or too-high (if most of the components omit this resistor completely) resistance between these data lines and logic voltage, resulting in an unstable operation. In that case, you can add your own pull-up resistors to the PCB of the car and manually remove the pull-up resistors from the components (here, the two ADS1115 and the PCA9685 boards) if needed. The ideal resistance between SDA/logic voltage and SCL/logic voltage can be calculated, but for hobby projects, it is sufficient to estimate that something in the range of 2 kOhm to 10 kOhm will likely work. In my case, each of the three I²C connected boards came with a 10 kOhm pull-up resistor, resulting in a total pull-up resistance of 3.3 kOhm, which worked without requiring any modification.

Programming and power consumption

The codes of the two ESP32 microcontrollers can be uploaded before placing them onto the board. In principle, the code should prevent any involuntary movements of the actuators and the motor when powering the car for the first time and if the actuator calibration has not yet been performed. However, I cannot guarantee that there aren’t any bugs left in the code. Thus, to be safe, don’t connect any motors when switching on the power for the first time. Make sure that everything else (wireless connection and LEDs work), and secure the car in a way that you cannot be hurt if a motor is powered on accidentally. Further, do not plug in an actuator motor connector without having connected its sensor. In that case, the actuator can act unpredictably. Also, it is important to note that I wrote and installed the code with Arduino IDE and the esp32 board manager package version 2.0.17. The code is incompatible with version 3 and higher of the board manager package! Ensure you install the older version of the board manager in Arduino IDE if you aim to use it plug-and-play (otherwise, the compilation will fail).

The car uses a 5.000 mAh 3S LiPo battery as a power supply. This large capacity is sufficient to power the car for at least 1 h, obviously depending on how you drive it. When you drive it slowly and steadily, roughly at the pace of a walking pedestrian, it has a power consumption of around 20 W. Maximum speed (about 11-12 km/h in the fast gear) equals around 80 W, and accelerations can reach up to 200 W. That means the engine will not exceed a current draw of about 20 A (short-term peaks, not more than 2-3 s) and needs up to ~8 A continuous current when going at max speed. The battery is mounted in a dedicated frame in the lower part of the chassis, and the cut-out in the base plate is used to push its wires into the electronic compartment.

Assembly information

The electronics are mounted on frames as spacers on the base plate. The custom PCB, as well as the MD20A motor driver, are installed using M3 screws. The ACS712 current sensor is installed with two zip ties, and the PCA9685 servo controller is clamped between brackets. Since the base plate includes many holes and threaded inserts, the mounting points for the electronics are highlighted to assist with the assembly.

The two sketches for the ESP32 microcontrollers (CrawlerV5main, CrawlerV5aux) as well as the Gerber files for the PCB (Car PCB files) are available on GitHub.

Required parts:

  1. 1x Crawler V5 PCB V1.1
  2. 1x Cytron MD20A
  3. 1x PCA9685
  4. 1x ACS712
  5. 1x SLS XTRON 5000 mAH 3S1P battery
  6. 1x XT60 connector (battery to main PCB; one of the wires needs to go through the current sensor, the other directly to the PCB)
  7. 2.5 mm² stranded wire (main power and wire to the 775 motor)
  8. 0.25 mm² stranded wire (wires to sensors, actuators, LEDs)

Components for the PCB:

  1. 4x Pololu DRV8876 QFN (mount on corresponding socket terminal strips)
  2. 1x Pololu DRV8825 (mount on corresponding socket terminal strips)
  3. 2x ESP32 NodeMCU (38 pin version, 1x with connector for external antenna (main ESP32); the other one (auxiliary ESP32) does not need WiFi; mount on corresponding socket terminal strips)
  4. 2x ADS1115 (mount on corresponding socket terminal strips)
  5. 1x MCP23017 (on IC socket GS28-2)
  6. 1x Gaptec LC78_05-2.0 DCDC converter
  7. 1x Gaptec LME78_03-1.0 DCDC converter
  8. 3x Omron B3F-1002 PCB buttons
  9. 1x Vishay TLHG 4600 green 3mm LED
  10. 6x Panasonic FC100/50 electrolytic capacitor
  11. 5x 1206/3216 22 µF 10 V ceramic capacitor
  12. 2x 2220/5750 10 µF 50 V ceramic capacitor
  13. 2x 0805/2012 100 nF 50 V ceramic capacitor
  14. 1x IMAXX F7030 30A fuse in 1x IMAXX H7810 fuse holder
  15. 1x IRFP7430PBF power MOSEFT (on/off switch)
  16. 1x IRLZ 44N logic level MOSFET (headlight LED control)
  17. 1x AKL175-04 connector terminal
  18. Axial resistors (9x3.2 mm, 1 %, 0.5 W) as written on the silk screen of the PCB
  19. Molex SL series sockets

Remote Control

RC assembly.png
RC assembly other side.png
RC bottom with components.png
RC top with components.png
RC printed parts exploded view.png
Joystick overview.png
Joystick overview other side.png
Joystick exploded view other side.png
Joystick exploded view.png
RC board circuit.png
RC board layout.png
PCB.png
Remote control main screen.png

The car’s remote control is based on the same layout as the one in my previous project. However, I modified the remote control to improve its operation and handling. Firstly, the remote control uses an external antenna to increase its range. Secondly, four pushbuttons are used instead of a rotary encoder to enter and navigate the menu. The buttons are also used to dis(engage) the parking brake, the main differential lock, and the car’s headlight LEDs (the function of the different input switches and buttons is explained in step 13).

Custom joysticks

Another upgrade for this remote control is the joysticks. Custom-built joysticks are added instead of the commercial thumb sticks that work in two axes (front/rear, left/right) and include a push button. The DIY approach was due to the poor quality of the cheap thumb sticks. The pair that I used for the prototype of this remote control had a “numb zone” around the center position in which the joystick’s output remained constant. Yet, this region was not exactly in the center of the joystick’s travel. Thus, the joystick’s output stayed at its default value for some degrees when moving the stick – but only in one direction. That phenomenon resulted in poor controllability of the car. Further, the thumb sticks reached their min/max values a lot sooner than their mechanical travel: At least half of the travel of the joysticks was, therefore, wasted.

Since I was not eager to buy a variety of cheap joysticks until a pair worked satisfactorily, I decided to design and build custom joysticks to eliminate these issues. The design of a joystick is quite simple: A potentiometer has to be added to the swivel axis of the thumb stick. The throttle joysticks of aircraft remote controls use exactly this design. However, here, the joysticks need an additional function: They need to be self-centering. If you do not actively push them in one or the other direction, they need to return to the center. That’s done by adding a set of levers and springs that push the joystick to the center position if no external force is applied. I used a 7x19 mm compression spring (0.5 mm wire diameter) from a cheap box with various small compression spring sizes. This spring determines the force needed to move the joystick and governs its return-to-center characteristics (faster or slower).

Joystick assembly

The joystick results from several design iterations until good mechanical characteristics were reached. The final design uses two levers and two springs. The joysticks should have the same force acting in each direction, which this design achieves. The joysticks are designed for a swivel of +-30° around the center, roughly the same as the cheap commercial joystick modules, but with the difference that the axle-mounted potentiometer can record the full travel of the custom joystick. The joystick uses a slightly more expensive potentiometer than the actuators of the car: The employed Bourns potentiometer has a better tolerance than the Omeg potentiometer (10% instead of 20%), it requires less force to be rotated (improves the ability of the joystick to return to the center position), and it is a more stable design that reduces backlash (which is a dealbreaker for a joystick).

The potentiometer is mounted in the joystick by cutting its shaft to a length of 6 mm and grinding it to a double-D shape. Then, it is pushed into the joystick body with a tight fit (make sure that you don’t remove too much material from the potentiometer’s shaft: if it is too loose, you’ll have backlash in the joystick). Make sure to grind the double-D shape at the correct angle of the potentiometer: It is supposed to be in its center position when pushing it into the joystick mechanics to ensure the joystick can travel the full range without reaching the potentiometer’s limit. The joystick’s swivel mechanism is supported by two 608 bearings, which results in a smooth, very stable operation. The mechanics of the levers are wrapped around two 4 mm steel bars with a length of 23 mm.

Other input devices and display

The remote control’s other input/output components are off-the-shelf standard parts: A 20x04 I2C LCD, an on/off switch, two toggle switches, a potentiometer, and four push buttons. Six rechargeable AA batteries provide the power supply, and all the electronics are mounted on a small PCB inside the remote control case. A detachable cover in the front allows access to the ESP32 microcontroller of the remote control in case code adjustments are needed.

The PCB includes the required DC-DC converters that generate 3.3 and 5 V from the battery. The remote control requires 5 V logic power for the LCD display. The other components, including the ADS1115 used to read all analog inputs, run on 3.3 V. A bidirectional logic level shifter allows attaching the LCD display to the rest of the I²C bus of the remote control (that runs on 3.3 V). All external components are connected to the PCB with Molex SL wire-board connectors, and the connectors are labeled on the PCB to be unambiguously identified. Again, a set of optional pull-up resistors is available if problems with the I²C connection exist. I left them unpopulated.

Programming the ESP32

The code on the remote control is the most complex (or at least the longest) code of the three ESP32 microcontrollers in this project. That’s because programming the LCD screen requires many lines of code, especially if the screen has to include several pages. In this case, most of the code is needed to allow the calibration of the joysticks and the actuators without having to modify the code but by selecting and completing calibration steps within the remote control.

The sketch for the ESP32 microcontroller (CrawlerV5rc) as well as the Gerber files for the PCB (RC PCB files) are available on GitHub.

Required parts:

  1. 2x Bourns 93R1AR2215L potentiometer (joysticks)
  2. 4x 7x19 mm compression spring
  3. 1x Omeg PC20BU 10k linear potentiometer (rotary knob)
  4. 1x Marquardt 1801.6115 on/off switch
  5. 2x Marquardt 1821.1101 toggle switch
  6. 4x ONPOW anti-vandal push button with LED ring
  7. 1x 20x04 I2C LCD module
  8. 1x battery holder for 6x AA battery
  9. 1x WiFi antenna
  10. 6x NiMH AA battery
  11. 1x Crawler V5 RC PCB V1.1

Components for the PCB:

  1. 1x bidirectional logic level shifter (mount on corresponding socket terminal strips)
  2. 1x ADS1115 (mount on corresponding socket terminal strips)
  3. 1x Gaptec LME78_03-1.0 DCDC converter
  4. 1x Gaptex LME78_05-1.0 DCDC converter
  5. 1x ESP32 NodeMCU with a socket for external antenna (mount on corresponding socket terminal strips)
  6. 3x 1206/3216 22 µF 10 V ceramic capacitor
  7. 2x 2220/5750 10 µF 50 V ceramic capacitor
  8. 1x 0805/2012 100 nF 50 V ceramic capacitor
  9. Axial resistors (9x3.2 mm, 1 %, 0.5 W) as written on the silk screen of the PCB
  10. Molex SL connector sockets

High-speed Option

Speed calculation.png

This step is optional: In case you don't mind reprinting parts of the drivetrain regularly, there is the option to adjust the gear reduction ratio of the car. This high-speed option results in doubling the wheel speed at the same motor velocity compared with the standard version. The handling of the car is affected by the higher speed, which is why not only two gears have to be replaced, but also slightly adjusted codes have to be uploaded to the main ESP32 of the car as well as the ESP32 of the remote control.

The high-speed option differs from the standard version by replacing the output shaft of the clutch (part 03-09) and the 40-to-25-teeth spacer between the clutch and the center differential (part 04-02) with the files below. Initially, they consisted of a 20-teeth and a 40-teeth spur gear. In the high-speed option, both gears harbor 30 teeth. Thus, one reduction step by a factor of two is omitted. The new codes for the microcontrollers are needed to improve the handling of the car at the resulting higher speeds. In the fast gear of the high-speed option, the speed changes of the motor are more limited to prevent tire slipping, and the steering angle is limited to avoid losing traction when attempting cornering with a too-small radius at high speeds.

Testing of the car with the high-speed option was done for about one hour without observing instant hardware failures. Nonetheless, the risk of hitting an obstacle when driving faster and increased wear due to operating the car closer to the limit must be considered when switching from the standard to the high-speed version. The car consumes between 250 and 300 W when accelerating with the high-speed option (approx. 100 W more than in the standard version) and requires around 100 to 120 W at top speed (approx. 20 to 40 W more than in the standard version).

The required sketches for the ESP32 microcontrollers of the car (CrawlerV5main_highspeed) and the remote control (CrawlerV5rc_highspeed) are available on GitHub.

Calibration and Control

Remote control inputs.png
Remote control display.png
Remote control of 3D printed 2-speed AWD car
Joystick calibration of custom remote control for 3D printed car

The calibration of the car is the last step before it is ready to run: From the custom joysticks to the parking brake – all components need to operate in the designated direction and range to operate the car. The calibration is supposed to be performed without modifying any code on the microcontrollers: Car and remote control need to be assembled and wired, the provided codes need to be flashed onto the respective microcontroller, and then you can start.

Calibration with open chassis

Note that the bottom part of the car’s chassis needs to be removed for the calibration: You need to check the positions of the actuators by eye to complete the calibration. Also, the calibration with open mechanics is the perfect opportunity to add grease to all gears. Lubrication of the gears is mandatory to prevent them from excessive wear due to heat from friction. Thus, make sure to lubricate all powertrain gears before driving the car. The gears of the actuators do not require lubrication since they are only operated at slow speeds and do not run continuously.

The calibration starts with the remote control: The car won’t drive or steer before calibrating the joysticks and the steering servo. This safety measure prevents the car from damaging its steering system or driving uncontrollably upon startup. Thus, switch on the remote control first. You’ll see the initialization screen waiting for the connection with the car. You can skip this screen if you press the upper left and right buttons. However, you don’t need this shortcut that I added to allow modifications on the code without always having to connect the car. Instead, simply switch on the car, too.

The RGB LEDs of the car blink in red if there is no connection. If it is connected to the remote control, it’ll show K.I.T.T.’s running light and the remote control will display the default screen with all sensor values and actuator positions. The connection is established using ESP-NOW, which uses the MAC addresses of the microcontrollers to send the information to a paired device. However, the code of the car’s main ESP32 and the remote control’s ESP32 do not need to be updated by typing in the MAC addresses of your ESP32 boards because the code includes the function to overwrite the hardcoded MAC address with a custom MAC address. You’d only need to change this entry if you want to build more than one of these cars and want to drive them simultaneously. For the first startup, the remote control will show that the calibration of the joysticks and the steering servo is missing. You need to enter the remote control menu (lower right button) and then select the joystick entry (upper/lower left buttons move the cursor, lower right button selects the entry). Then, the respective calibration page will guide you through the process. An explanatory video shows the process for the joystick calibration.

Calibrating joysticks and steering

For the joysticks, the remote control needs to know the travel limits and the desired tolerance around the center of the joysticks. Move the joysticks as the calibration menu indicates and confirm the position once you reach the travel limit. For the tolerance, leaving it at its default value for now is recommended. Once you drive the car, you can fine-tune these values. The tolerance indicates the travel around the joystick’s center that the remote control ignores. It is needed to prevent false inputs (noise around the center when you don’t push the joysticks, but the measured value doesn’t exactly match the neutral position). The higher the tolerance value, the more you need to push the joystick to measure a non-neutral value. The lower the tolerance, the better the responsiveness, but the more prone it is to noise. This value is given in percent of the analog readout range of the potentiometer. The final entry of the joystick calibration menu is needed if the wiring of the engine is inverted: If it is wired invertedly, the car will reverse when pushing the joystick forward. Thus, you can switch the motor wires at the motor driver or use the joystick calibration to invert the readout of the right joystick. Leave it at default for now since you need to drive the car first to determine if you need to invert the joystick readout. You can always re-run the calibration later to change this setting.

Next, the steering servo is calibrated. To this end, first, the left travel limit of the steering system has to be specified, then the right travel limit, and then the neutral position is fine-tuned. Note that the latter is done by simultaneously adjusting the left and right travel limits. The neutral position is defined by (left limit + right limit)/2. Thus, don’t exaggerate when specifying the travel limits for the steering system. The tie rods should not hit or bend the front fenders when reaching the travel limit. The displayed numbers in the LCD of the remote control represent the minimum and maximum values that Adafruit’s PWMServoDriver library uses to provide position output to servo motors. The values can be adjusted within the interval from 150 to 600. However, you do not need the full interval (e.g., the limits are 489 (left) and 294 (right) for my steering/servo assembly). The steering (neutral position) fine-tuning works best by driving the car straight on a smooth and even surface (without touching the steering joystick) and checking if it deviates from traveling straight. Then, you re-run the calibration and incrementally adjust the neutral position until it does go straight.

Calibrating gear shifter, clutch, and differential lock

The next calibration steps are the actuators in the car that are needed to shift gears, lock the differential, and (dis)engage the clutch. To this end, select the entry in the remote control menu and flip the car so that you can see the position of the respective actuator. When performing the calibration, you need to push the upper/lower left button to move an actuator in one or the other direction. This procedure is done incrementally (pressing the button once means it will move by one given increment). The direction in which you move the actuator depends on how the actuator’s motor is wired to the PCB. However, you don’t need to pay attention to the motor’s wiring because this information is provided to the system during the calibration. Thus, you merely have to move the actuator into the open/closed or fast/slow position, as indicated in the remote control display, and confirm the position by pressing the upper right button. Then, you move the actuator to the other end position and confirm again. That’s it: the actuator is ready to work.

For the clutch, two actuators need to be calibrated at once. It is important to move the two clutch actuators in parallel so that the slider of the clutch is not tilted (that could cause damage to the parts). In this calibration step, you can switch between the two actuators by moving the left toggle switch up/down. Then, actuators A and B can be moved stepwise by an increment, one after the other, to ensure the clutch slider moves without tilting. The ideal end position of the actuators is found when the slider has reached its limit without being pressed against this limit. Pushing an actuator too far increases friction (ball bearings are not meant for axial loads) and adds unnecessary strain to the printed parts. On the other hand, not moving an actuator far enough means that the dog teeth of the slider do not fully mesh, thereby resulting in the risk of tearing them off during operation.

The parking brake runs on a separate microcontroller

Last but not least, the parking brake has to be calibrated. The procedure for this system differs from that of the other actuators. The brake is controlled by the auxiliary ESP32, which does not have a wireless connection to the remote control. Further, its interface to the main ESP32 is very simple and limited in bit depth, which would make it difficult to enable a calibration using the remote control. To this end, three pushbuttons are installed on the PCB: They are connected to the auxiliary ESP32 and are used to calibrate the brake. The calibration process starts by pressing the middle one of the three buttons. You’ll see the status of the brake indicated by the LED on the PCB next to the pushbuttons: If it blinks with 1 Hz (once per second), the brake is not calibrated.

Before starting the calibration, some information on the stepper motor has to be shared: The stepper driver on the PCB includes a small screw that is used to limit the current flow through the motor. Since the motor is not permanently powered on but only powered while moving the brake, there is no need to adjust the current limit to optimize energy consumption. However, by limiting the current, you can avoid excessive heating of the motor and its driver. Thus, it is recommended to reduce the current until the motor can still turn but does not burn more energy than needed. You can measure the current by monitoring the power draw of the car on the remote control during the brake calibration. The current draw at idle is at around 0.3 A. Powering the stepper motor in my prototype does not require more than 0.2 A; thus, a displayed current of around 0.5 A while moving the stepper is fine.

Further, you need to ensure that the wiring of the stepper motor is done correctly. The used stepper motor is a two-phase stepper motor. That means it is connected to the driver using four wires: 1A, 1B, 2A, and 2B. The connections on the motor are not labeled, which makes the connection prone to errors. Luckily, a mistake at this point does not destroy anything. It does, however, result in the stepper motor producing noises without moving. In that case, you must rearrange the wires until you see that the motor turns during the calibration. It is not important which coil is connected to the “1” or “2” output of the stepper driver, but the two wires of a coil must be connected to the A and B outputs of either the “1” or ”2” output of the driver. If you are unsure which pair of wires belong to one motor coil, you can use a voltmeter to measure the Ohmic resistance between the wires. The resistance should be below 100 Ohm for a pair of wires connected to one coil. The resistance is infinite for wires of different coils.

Calibrating the parking brake

Upon entering the brake’s calibration, the LED’s blinking frequency increases to 2 Hz (twice per second). You use the left or right button within the calibration to move the brake actuator. Here, the actuator moves as long as you keep the button pressed (unlike the other actuators, where pressing the button results in moving the actuator once for a given increment). This part of the calibration has to be started when the brake sensor is not engaged. If it is, the system can’t detect the direction of opening the brake. Hence, if the brake sensor is triggered when you start this process, you can reset the internal counter that measures the direction by pressing the center button on the PCB again after rotating the actuator until the brake sensor is not triggered. Then, you press the left or right button to open the brake (rotate the brake’s drive gear toward the brake sensor).

Once you trigger the brake sensor, the system will jump to the next and final step of the brake calibration: You need to specify the “closed” position of the brake. The brake LED will once be active for 1 s upon entering this step and then blink at a frequency of 5 Hz (five times per second) during this step. You press the left button (button one) to close the brake. There is no hard limit for when the brake is closed. It is best practice to manually rotate the drive shaft and slowly close the brake while doing so. Once you can’t turn the shaft with your fingers any longer, the brake position “closed” has been found. Then, you press the center button once to finish the calibration. Don’t exaggerate by moving the brake too far: it can get stuck or take damage when applying too much force. When the brake is open and calibrated, the LED blinks slowly (0.25 Hz, once every four seconds). It blinks at 5 Hz when the brake moves (opening or closing), and it is continuously on when the brake is engaged.

Finishing the initial calibrations

The calibration of all actuators needs to be performed with great care. The actuators in the system have enough torque to damage themselves when they try to reach a position they cannot reach. Thus, keep your finger close to the car’s power switch or to the connector of the respective motor of the actuator when you run the calibration. In principle, everything should work safely, but I cannot guarantee that there is no bug left in my code. The most critical actuator is the lock of the differential. The actuator can be damaged if the angle between the slider and the differential results in the dog teeth pushing tips onto tips. Therefore, this actuator should only be operated when the clutch is open or when the wheels can spin freely.

The last entries in the remote control’s menu are the adjustment of the headlight LED intensity and the RGB LED color. The former is adjusted by rotating the potentiometer of the remote control and confirming the choice with one of the right buttons. The latter is adjusted with the left buttons and confirmed with one of the right buttons.

Final notes and hints

In the default screen, the potentiometer (#4) limits the maximum speed of the car (between 20 and 100 % PWM duty cycle). The left toggle switch (#5) opens/closes the clutch, the right toggle switch (#6) shifts gears, the left joystick (#3) is responsible for steering, and the right joystick (#2) controls the speed and direction of the main engine. The upper left button (#7) (dis)engages the parking brake, the lower left button (#8) locks/opens the differential, and the upper right button (#9) enables/disables the headlight LEDs.

A built-in safety feature tries to prevent mechanical damage by incompatible user inputs: The car’s engine won’t move while the clutch is moving or when the brake is engaged (unless the clutch is open). Shifting gears with a closed clutch triggers the car to open the clutch automatically, then shift gears and close the clutch afterward. Another safety measure prevents discharging the battery below a safe minimum voltage threshold. LiPo batteries can be permanently damaged if their voltage drops too low. Thus, the remote control indicates if the 3S battery is drained (if it reaches <11.1 V at idle/<10.8 V under load – corresponding to 3.7/3.6 V per cell) and does not accept drive inputs any longer when reaching this threshold. The remote control also indicates if its NiMH batteries are empty (<6.8 V – corresponding to 1.1 V per cell).

The car’s motor control includes interpolating the input to smooth abrupt changes in desired speed or direction. The idea is to prevent the wheels from slipping since the powertrain has more than enough torque to let the wheels slip when accelerating. Thus, this interpolation acts as a rudimentary traction control by preventing excessive motor accelerations. On the other hand, the car’s responsiveness is impaired by this approach. The interpolation was tuned toward a compromise between traction and responsiveness. You may adjust it in the car’s main ESP32 code if needed. However, keeping the interpolation is recommended to reduce tire wear and increase the lifetime of the car’s powertrain.

With these last hints, you’re packed with everything you need to know. The car is assembled and calibrated – ready to run!

Conclusion

Crawler V5 assembly.png

First of all, thanks to everyone who read this instructable to the end. It turned out to be way more text than anticipated! Also, this project is, by far, the most complex mechanical and electrical design I have ever done (which isn’t too difficult, to be honest, since it includes the first PCBs I designed). Given my limited spare time for hobbies, it took me one year to develop the operating prototype from scratch, including many design iterations and even one complete design overhaul. That is why my last published project is called Crawler V3, and this project here is termed V5. V4 was my first attempt at this AWD car, but its design turned out to be a dead end, forcing me to start the design again.

I implemented several improvements in this project to mitigate problems that I identified in my last projects. For instance, this project includes dedicated ADCs for the ESP microcontrollers, high-quality connectors for wire-board connections, “real” PCBs instead of improvised home-made ones, and external antennas for the microcontrollers to increase their range compared to the small PCB antennas. Also, the code that runs the car has been improved so that the user does not have to know programming to build this project. Every required calibration step can be performed in the menu of the remote control or by using buttons on the car’s PCB.

After building the car, several parts needed to be optimized to improve their durability. For example, the first broken parts were the pinions connecting the shafts from the center differential to the front and rear differentials. They have been improved by adding the 2nd bearing and by reinforcing the teeth. Still, they can be considered the weakest point in the powertrain. Another quite interesting failure found was the rims. Their first design included a rather delicate spider, and these connections had cracks on the front wheels after some hours of driving. Apparently, the forces acting on the front wheels when turning at high speed are pretty high. The updated spider design included here is sufficiently sturdy to withstand the occurring forces.

With these points being said, I’m very happy with the result of this project. My goal was to build a 3D-printed remote-controlled car that simulates the powertrain of a real car, and this RC car is mostly successful in that regard. Yet, as usual in engineering, there is always room for optimization. For example, the fact that the lock of the differential is prone to damage when closing it at the wrong angle is a clear design flaw. Also, my remote control gets stuck upon bootup when it is powered on for the first time in several hours. Then, it has to be switched off and on again to make it work. This problem is likely related to the I²C peripherals linked with a logic level shifter. There seems to be an initialization/connection problem with the capacitances in the remote control’s 3.3 and 5 V circuits when the capacitors aren’t charged yet.

Despite these flaws, the car operates very reliably, and it is fun to let it drive. This car is not as fast as many other RC cars, but going as fast as possible was never the intention of this project. I believe that 3D printing and DIY projects serve a different purpose. Self-made printed parts aren’t as sturdy and can’t keep up with the tolerances of metal parts or extruded plastic. Therefore, I did not attempt to build a rugged, high-speed car only to see it break over and over again when it crashes at 30+ km/h. Crawler V5 is limited to a maximum speed of around 12 km/h in its fast gear – which is, in my opinion, a good compromise between controllability and speed for an RC car. You’ll lose sight quickly if it runs faster, making it quite hard to control the vehicle. Instead of reaching for speed records, this car has superior slow-speed controllability.

But that’s really enough text: I’m finally at the end of this instructable. I hope you enjoyed it, and I’d be delighted if one of you decided to build this car or use this project as a basis to create something better! Please leave a comment below if something isn’t clear about this instructable or if you need assistance with making this project. I’m happy to help!