DIY Lawnmower 2023

From cod3v

Introduction

My tobe biodiversity destroyer.

2 wheel drive using kids ATV chassis with 3" wheels without differential but with steering, 2x350W motor; speed controller. The grass cutter is a part from an old lawn mower. The ATV is steerable, thus a rotation measurement device is needed so that the motor will not burn.


https://www.kuldnebors.ee/search/search.mec?pob_action=search&search_O_string=atv&search_source=kwc

Arduino + GPS + IMU (Differential GPS).


Consider also

Theory

Steering

Use distance sensor to detect the angle
Gray code with rotary disk

The angles needed are:

The motion of steering is restricted, thus the angle need to be measured. Two easy options:

  1. Use distance sensor (HC-SR04), or
  2. Use rotary encoder (single or multi track gray code)

Add the limit sensors to both.

Distance sensor HC-SR04

Gray code

Include the most significant bit (varies most) to outer circle.

Mechanics.

The position where the rotation angle measurement device is to be inserted.

Python code

Python code to generate the gray code image

#
# Use sxiv to continously display the image 
#
#

import drawsvg as draw

d = draw.Drawing(300, 300, origin='center')

#Arcline(x0, y0, radius, angle0, angle1 )


#Draw the center hole
d.append(draw.ArcLine(0, 0, 5, 0, 360,
        fill='red', fill_opacity=1))


maxAngle = 360/2
maxAngle = 100

# Draw multiple circular arcs
stroke = 15
radius = 2*stroke

period = 2 #(one black strip, one white strip)
phaseshift = 0
d.append(draw.ArcLine(0, 0, radius, 0, maxAngle/period,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))


period = 2 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)  ##90 degrees
d.append(draw.ArcLine(0, 0, radius+stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))


period = 4 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)                    ## 45 deg
d.append(draw.ArcLine(0, 0, radius+2*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))
phaseshift = maxAngle/(2*period) + 2*maxAngle/(period)   ## 45+2*90 deg
d.append(draw.ArcLine(0, 0, radius+2*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))


period = 8 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)                    ## 22.5 deg
d.append(draw.ArcLine(0, 0, radius+3*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))
phaseshift = maxAngle/(2*period)+2*maxAngle/(period)
d.append(draw.ArcLine(0, 0, radius+3*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))
phaseshift = maxAngle/(2*period)+4*maxAngle/(period)
d.append(draw.ArcLine(0, 0, radius+3*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))
phaseshift = maxAngle/(2*period)+6*maxAngle/(period)
d.append(draw.ArcLine(0, 0, radius+3*stroke, 0+phaseshift, maxAngle/period+phaseshift,
        stroke='red', stroke_width=stroke, fill='none', fill_opacity=0.2))


#
# Print it
#
d.set_pixel_scale(2)  # Set number of pixels per geometry unit
#d.set_render_size(400, 200)  # Alternative to set_pixel_scale
d.save_svg('example.svg')
d.save_png('example.png')

# Display in Jupyter notebook
#d.rasterize()  # Display as PNG
d  # Display as SVG

Current

Heat Dissipation

Motor

First prototype of the motor bed.
First prototype of the motor bed.

Motor Bed plan: keep is as simple as possible. Note that no welding machine, and other metal tools are scarce.


Torque, Speed, Duty Cycle

The gear is standard 410-9T bicycle chain. Thus, the gears from bicycles will be used for steering and driving. The wheel diameter is 3" (18 cm?), and the front gear is 9 spokes and the maximum rpm is 300. Thus, we have for the back gear



Vevor 24V 350W Nennstrom: 18,4A Brushed Permanentmagnetmotor Gear Reduction Packungsgröße: 22 x 19 x 17 cm (8,66 x 7,48 x 6,69 Zoll) Bruttogewicht: 3,05 kg



9 Zahnrad für Kette Nr. 410, Teilung 12,7 mm. Besonders gut für Heimwerker geeignet, da der Antrieb mit Standard-Fahrradketten (1/2 Zoll Teilung) kompatibel ist

Motor Speed Controller BTS7960

We use BTS7960 based speed controller IBT-2 with max 43 Amps current. The datasheet is available at https://electropeak.com/learn/download/bts7960-43a-motor-driver-datasheet/

Example code from Electropeak or Hessmer

Pins

  • VCC: 5V
  • GND: Ground
  • IS-R: Input signal for detecting high current – Straight rotation
  • IS-L: Input signal for detecting high current – Inverse rotation
  • EN-R: Output Signal for controlling motor direction – Straight rotation
  • EN-L: Output Signal for controlling motor direction – Inverse rotation
  • WM-R: PWM Signal for controlling motor speed – Straight rotation
  • PWM-L: PWM Signal for controlling motor speed – Inverse rotation

Motor pins (High current):

  • M+: Motor Positive; M-: Motor negative
  • B+: Battery positive; * B-: Battery negative


Some instructions:


Extra things and older thoughs.

Use PWM. Feedback? Arduino L298N H-bridge.

Arduino pwm motor controller 300W 36V 20Amps


https://electropeak.com/learn/interfacing-bts7960-43a-high-power-motor-driver-module-with-arduino/

High power dc motor speed controller

Radio controller

We chose Flysky FS-i6X RC Radio Sender & FS-IA10B Set 10-Kanal 2,4 GHz AFHDS unit to send and receive data.


Gear ratios

Lawnmower2013 gearRatioSpeed.svg

Gear ratio

Laser cutted parts and files

Rotation detector


Steering gear plate


Driving gear plate