Difference between revisions of "DIY Lawnmower 2023"

From cod3v
 
(61 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Introduction ==
== Introduction ==


2 wheel drive using kids ATV chassis with 3" wheels without differential but with steering, 2x350W motor; speed controller. The cutter is a part from an old lawn mower.  
[[File:Lawnmower2023 planPhoto.jpg|thumb|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
https://www.kuldnebors.ee/search/search.mec?pob_action=search&search_O_string=atv&search_source=kwc
Line 11: Line 14:
* ArduPilot https://ardupilot.org/rover/docs/gettit.html
* ArduPilot https://ardupilot.org/rover/docs/gettit.html
* Cube Orange https://ardupilot.org/copter/docs/common-thecubeorange-overview.html
* Cube Orange https://ardupilot.org/copter/docs/common-thecubeorange-overview.html
* OpenMower


== Theory ==  
== Theory ==  
=== Steering ===
[[File:Lawnmower2023 rotaryAngle distance.svg|thumb|Use distance sensor to detect the angle]]
[[File:Lawnmower2013 graycode.png|thumb|Gray code with rotary disk]]
[[File:Gray.svg|thumb|Gray code; the thumbnail gets rendered wrong. However, the svg image is correct. width = 4, diff = 10, diff_center = 10, radius_center = 20 #mm ]]
[[File:Gray.png|thumb|Gray code, in png format. width = 4, diff = 10, diff_center = 10, radius_center = 20 #mm]]
The angles needed are:
The motion of steering is restricted, thus the angle need to be measured. Two easy options:
# Use distance sensor (HC-SR04), or
# Use rotary encoder (single or multi track gray code)
Add the limit sensors to both.
'''Distance sensor HC-SR04'''
* Dependent on ambient temperature.
* Ping rarely so that no echoes.
* [https://forum.arduino.cc/t/hc-sr04-tests-on-accuracy-precision-and-resolution-of-ultrasonic-measurement/236505/11 Tests on accuracy]
'''Gray code'''
* In a gray code the bit distance between two consecutive words is exactly one (mono-difference).
* Accuracy:
* [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6111776/ Absolute Position Coding Method for Angular Sensor—Single-Track Gray Codes]
* [https://www.ee.bgu.ac.il/~schwartz/publications/MSjrnl1.pdf The Structure of Single-Track Gray Codes]
* [https://baldur.iti.kit.edu/sat-race-2015/descriptions/bench/SingleTrackGrayCode-Manthey.pdf Finding Single Track Gray Codes with SAT]
Include the most significant bit (varies most) to outer circle.
'''Mechanics'''.
[[File:Lawnmower2023 steetingAngle plan.jpg|thumb|The position where the rotation angle measurement device is to be inserted. ]]
=== Python code ===
Python code to generate the gray code image
<syntaxhighlight lang="python">
#
# Use sxiv to continously display the image
#
#
import drawsvg as draw
import math as math
def outline(r1, width, t1, t2):
    #Use degrees
    pi = 3.14159
    r2 = r1 + width
    d.append(draw.ArcLine(0, 0, r1, t1, t2,
            stroke='black', stroke_width=1, fill='none', fill_opacity=0))
    d.append(draw.ArcLine(0, 0, r2, t1, t2,
            stroke='black', stroke_width=1, fill='none', fill_opacity=0))
    #Convert to rads
    t1 = -t1*2*pi/360
    t2 = -t2*2*pi/360
    d.append(draw.Lines( r1*math.cos(t1), r1*math.sin(t1),
                        r2*math.cos(t1), r2*math.sin(t1),
                        close=False, fill='none', stroke='black'))
    d.append(draw.Lines( r1*math.cos(t2), r1*math.sin(t2),
                        r2*math.cos(t2), r2*math.sin(t2),
                        close=False, fill='none', stroke='black'))
maxAngle = 60
# Draw multiple circular arcs
width = 4          # mm
diff = 10          #
diff_center = 10  #Extra difference from the center hole
radius_center = 20 #mm
d = draw.Drawing(400, 400, origin=( -2 -radius_center, -400 +1 + radius_center))
#Draw the center hole
d.append(draw.ArcLine(0, 0, radius_center, 0, 360,
        fill='nore', stroke='black', fill_opacity=0))
#
# 1st row
#
period = 2 #(one black strip, one white strip)
phaseshift = 0
r1 = radius_center + diff_center + diff
t1 = 0
t2 = maxAngle/period
outline(r1, width, t1, t2)
#
# 2nd row
#
period = 2 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)  ##90 degrees
r1 = r1 + width + diff
t1 = phaseshift
t2 = maxAngle/period + phaseshift
outline(r1, width, t1, t2)
#
# 3rd row
#
period = 4 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)                   
r1 = r1 + width + diff
for i in range(0, 4, 2):
        phaseshift = maxAngle/(2*period) + i*maxAngle/(period)         
        t1 = phaseshift
        t2 = maxAngle/period + phaseshift
        outline(r1, width, t1, t2)
#
# 4th row;
#
period = 8 #(one black strip, one white strip)
r1 = r1 + width + diff
for i in range(0, 8, 2):
        phaseshift = maxAngle/(2*period)+i*maxAngle/(period)
        t1 = phaseshift
        t2 = maxAngle/period + phaseshift
        outline(r1, width, t1, t2)
#
# 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('gray.svg')
d.save_png('gray.png')
# Display in Jupyter notebook
#d.rasterize()  # Display as PNG
d  # Display as SVG
print( 'Total width: ', r1 + width, ' mm' )
</syntaxhighlight>
=== Borderline only ===


=== Wheels and tires ===
=== Wheels and tires ===


Using an old kids ATV; 3" wheels; too small for pushing the snow, but perhaps enough for the first project.
Cheap axis:
* 125cc 835 mm, 55.90€:  https://www.tuontitukku.fi/pienkone-vene-ja-varaosa/monkija-125cc-taka-aksila-835-mm-taka-aksila-monkijaan-83-5-cm/p/6419773800559/
* Takanapa 4x110 Mikilon Pentora 125cc; 32.90€: https://www.tuontitukku.fi/pienkone-vene-ja-varaosa/takanapa-4x110-mikilon-pentora-125cc-taka-akselille-jossa-19-os-20mm-boori/p/9977000025276/


Ulkohalkaisija täynnä noin 36cm (6")
Ulkohalkaisija täynnä noin 36cm (6")
Line 26: Line 178:


=== Motor ===
=== Motor ===
[[File:Lawnmower2023 motorbed 1stprotoA.jpg|thumb|First prototype of the motor bed.]]
[[File:Lawnmower2023 motorbed 1stprotoB.jpg|thumb|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
Torque, Speed, Duty Cycle


Vvor 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  
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
<math>
in
</math>
 
 
 
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  
* https://www.ebay.de/itm/134260101005?hash=item1f42868f8d:g:t1kAAOSwf0ljOTPG&amdata=enc%3AAQAIAAAA8Ao6wUUoT1WDjHCODdl3m2xH255xL30h99ZcuqQSUjSyt7JvM02btIHsmHAXNg8FOqT0oIQPQ1KEC%2BnLal19zabXO%2FLykrgs0JxbSzZ8Wn4lngUubdhcxlNQ9op1Sb4uRV9cEiDEpRE8FClxXNuuwthOD1ZohDHUaSX2pwc4qnR15VhyL%2BrjcdeHNSCwr5vR7opzR4d5lTXLmMAF%2F4N%2BAWB1l1EexFKuGxqAR7dT0KqQ6pl9WV44uaR0jWWJPDtfi3zOEBwXzrODyMSYV3K71T23rYouoCzlAZCzlSftYSI9QHaSTRe6hc%2F%2FqWAFoGA42A%3D%3D%7Ctkp%3ABk9SR5qVyrn6YQ
* https://www.ebay.de/itm/134260101005?hash=item1f42868f8d:g:t1kAAOSwf0ljOTPG&amdata=enc%3AAQAIAAAA8Ao6wUUoT1WDjHCODdl3m2xH255xL30h99ZcuqQSUjSyt7JvM02btIHsmHAXNg8FOqT0oIQPQ1KEC%2BnLal19zabXO%2FLykrgs0JxbSzZ8Wn4lngUubdhcxlNQ9op1Sb4uRV9cEiDEpRE8FClxXNuuwthOD1ZohDHUaSX2pwc4qnR15VhyL%2BrjcdeHNSCwr5vR7opzR4d5lTXLmMAF%2F4N%2BAWB1l1EexFKuGxqAR7dT0KqQ6pl9WV44uaR0jWWJPDtfi3zOEBwXzrODyMSYV3K71T23rYouoCzlAZCzlSftYSI9QHaSTRe6hc%2F%2FqWAFoGA42A%3D%3D%7Ctkp%3ABk9SR5qVyrn6YQ
Older idea:
https://www.ebay.de/itm/354278930033?hash=item527cab7671:g:NcAAAOSwrQNjIXA8&amdata=enc%3AAQAHAAAAsMHTOr42GQrvrE2i3wCdqI2r5jjEv1Xs%2BiBNogN2wRUiTlV4oLKSZLa9D8iT9KRAftUAsueGPYsgt1wNozci7go5zGnmZBCTHTE%2FBg2kQv04EJubQSPv9UXCipRa6pBzGubI%2B5RJl9PVJZdOm%2B2MaNdAeKMCMpAT5vLeXDPcrm0rR88Buo1sV4Q0l%2B9JTswzo5Qq5QxHEeGmWyUQU4NN4EgYsJ4TaD6%2BwVnMTwp2sTW%2B%7Ctkp%3ABk9SR8anh5a_YQ




    410-9T Kettenrad


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
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
Line 39: Line 207:
=== Motor Speed Controller BTS7960 ===
=== Motor Speed Controller BTS7960 ===


We use BTS7960 based speed controller with max 43 Amps current. The datasheet is available at https://electropeak.com/learn/download/bts7960-43a-motor-driver-datasheet/
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 https://electropeak.com/learn/interfacing-bts7960-43a-high-power-motor-driver-module-with-arduino/
Example code from [https://electropeak.com/learn/interfacing-bts7960-43a-high-power-motor-driver-module-with-arduino/ Electropeak] or [https://www.hessmer.org/blog/2013/12/28/ibt-2-h-bridge-with-arduino/ Hessmer]


Pins
Pins
Line 83: Line 251:
* https://www.ebay.de/itm/165676940912?hash=item26931d7e70:g:q8YAAOSwVM1jIqNq&amdata=enc%3AAQAIAAAA4CKa5nRcyz0RlXcN3Iw7mhcTalyBSBfC33bdLn08wqjCcgaPgKgjMgdkmbwdwGTC6QibwZ7WjVqyWysp7Uh97reXnrw5Srml4CJ9O%2FyBC8wqga6cohaq7tBAZOgFx9G1PP9PzZ7QEYWiGCiR4%2F55MdLP8kI%2B4gynCWyknKAlshev5BExzvKvazuC0SGQQEqT6WFZy6m%2Bp1jw7jwGlg8I8dFZ0O5s%2Fizj6E7DzlotaLFb8OiyJKRzpuPZSo2vpAM2Q5831W6kODRgLCo0N0QlmaU5HUxUq4AEXCiPrsit0W7R%7Ctkp%3ABk9SR7zT4rf6YQ
* https://www.ebay.de/itm/165676940912?hash=item26931d7e70:g:q8YAAOSwVM1jIqNq&amdata=enc%3AAQAIAAAA4CKa5nRcyz0RlXcN3Iw7mhcTalyBSBfC33bdLn08wqjCcgaPgKgjMgdkmbwdwGTC6QibwZ7WjVqyWysp7Uh97reXnrw5Srml4CJ9O%2FyBC8wqga6cohaq7tBAZOgFx9G1PP9PzZ7QEYWiGCiR4%2F55MdLP8kI%2B4gynCWyknKAlshev5BExzvKvazuC0SGQQEqT6WFZy6m%2Bp1jw7jwGlg8I8dFZ0O5s%2Fizj6E7DzlotaLFb8OiyJKRzpuPZSo2vpAM2Q5831W6kODRgLCo0N0QlmaU5HUxUq4AEXCiPrsit0W7R%7Ctkp%3ABk9SR7zT4rf6YQ
* MD25HV https://makermotor.com/pn00218-cyt13-25amp-7v-58v-high-voltage-dc-motor-driver-speed-controller-md25hv/
* MD25HV https://makermotor.com/pn00218-cyt13-25amp-7v-58v-high-voltage-dc-motor-driver-speed-controller-md25hv/
=== Radio controller ===
[[File:Lawnmower receiver arduino.svg|thumb|How to connect the receiver to Arduino]]
We chose Flysky FS-i6X RC Radio Sender & FS-IA10B Set 10-Kanal 2,4 GHz AFHDS unit to send and receive data.
<syntaxhighlight lang="python">
// https://medium.com/@werneckpaiva/how-to-read-rc-receiver-signal-with-arduino-54e0447f6c3f
#define CH1 3
#define CH2 5
#define CH3 6
#define CH4 9
#define CH5 10
// Read the number of a given channel and convert to the range provided.
// If the channel is off, return the default value
int readChannel(int channelInput, int minLimit, int maxLimit, int defaultValue){
  int ch = pulseIn(channelInput, HIGH, 30000);
  if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);
}
// Red the channel and return a boolean value
bool redSwitch(byte channelInput, bool defaultValue){
  int intDefaultValue = (defaultValue)? 100: 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}
void setup(){
  Serial.begin(115200);
  pinMode(CH1, INPUT);
  pinMode(CH2, INPUT);
  pinMode(CH3, INPUT);
  pinMode(CH4, INPUT);
  pinMode(CH5, INPUT);
}
int ch1Value, ch2Value, ch3Value, ch4Value;
bool ch5Value;
void loop() {
  ch1Value = readChannel(CH1, -100, 100, 0);
  ch2Value = readChannel(CH2, -100, 100, 0);
  ch3Value = readChannel(CH3, -100, 100, -100);
  ch4Value = readChannel(CH4, -100, 100, 0);
  ch5Value = redSwitch(CH5, false);
 
  Serial.print("Ch1: ");
  Serial.print(ch1Value);
  Serial.print(" Ch2: ");
  Serial.print(ch2Value);
  Serial.print(" Ch3: ");
  Serial.print(ch3Value);
  Serial.print(" Ch4: ");
  Serial.print(ch4Value);
  Serial.print(" Ch5: ");
  Serial.println(ch5Value);
  delay(500);
}
</syntaxhighlight>
* https://medium.com/@werneckpaiva/how-to-read-rc-receiver-signal-with-arduino-54e0447f6c3f
=== Gear ratios ===
[[File:Lawnmower2013 gearRatioSpeed.svg|thumb]]
Gear ratio
<math>
\begin{align}
N_2 &= 2\pi r N_1 \frac{n_1}v  \\
&= 2\pi 18cm  9 \frac{5 1/s}{20 km/h}  \\
&= 2\pi 0.18 m  9 \frac{5 1/s}{20/3.6 m/s}  \\
&= 18 \pi 0.18  \frac{5\times 3.6 }{20 }  \\
&= 18 \pi 0.18  \frac{5\times 3.6 }{20 }  \\
&= 9
\end{align}
</math>
=== Cutted parts and files ===
[[File:Plans.svg|thumb|Dimensions]]
Inkscape's G Code generator, or use [https://jscut.org/index.html JsCut]
'''Rotation detector'''. [https://wiki.tampere.hacklab.fi/tyokaluja/plasmaleikkuri Plasma cutter].
* Center hole: diameter 20 mm.
* Width: 14 cm.
'''Steering gear plate''':
* Just two holes
* Distance between hokes 56 mm.
'''Driving gear plate'''
* Just some holes.

Latest revision as of 00:19, 22 August 2023

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
Gray code; the thumbnail gets rendered wrong. However, the svg image is correct. width = 4, diff = 10, diff_center = 10, radius_center = 20 #mm
Gray code, in png format. width = 4, diff = 10, diff_center = 10, radius_center = 20 #mm

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
import math as math

def outline(r1, width, t1, t2):
    #Use degrees
    pi = 3.14159
    r2 = r1 + width
    d.append(draw.ArcLine(0, 0, r1, t1, t2,
            stroke='black', stroke_width=1, fill='none', fill_opacity=0))
    d.append(draw.ArcLine(0, 0, r2, t1, t2,
            stroke='black', stroke_width=1, fill='none', fill_opacity=0))

    #Convert to rads
    t1 = -t1*2*pi/360
    t2 = -t2*2*pi/360
    d.append(draw.Lines( r1*math.cos(t1), r1*math.sin(t1),
                        r2*math.cos(t1), r2*math.sin(t1),
                        close=False, fill='none', stroke='black'))
    d.append(draw.Lines( r1*math.cos(t2), r1*math.sin(t2),
                        r2*math.cos(t2), r2*math.sin(t2),
                        close=False, fill='none', stroke='black'))


maxAngle = 60

# Draw multiple circular arcs
width = 4          # mm
diff = 10          #
diff_center = 10   #Extra difference from the center hole
radius_center = 20 #mm

d = draw.Drawing(400, 400, origin=( -2 -radius_center, -400 +1 + radius_center))


#Draw the center hole
d.append(draw.ArcLine(0, 0, radius_center, 0, 360,
        fill='nore', stroke='black', fill_opacity=0))


#
# 1st row
#
period = 2 #(one black strip, one white strip)
phaseshift = 0
r1 = radius_center + diff_center + diff
t1 = 0
t2 = maxAngle/period
outline(r1, width, t1, t2)

#
# 2nd row
#
period = 2 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)  ##90 degrees
r1 = r1 + width + diff
t1 = phaseshift
t2 = maxAngle/period + phaseshift
outline(r1, width, t1, t2)

#
# 3rd row
#
period = 4 #(one black strip, one white strip)
phaseshift = maxAngle/(2*period)                    
r1 = r1 + width + diff
for i in range(0, 4, 2):
        phaseshift = maxAngle/(2*period) + i*maxAngle/(period)           
        t1 = phaseshift
        t2 = maxAngle/period + phaseshift
        outline(r1, width, t1, t2)

#
# 4th row; 
#
period = 8 #(one black strip, one white strip)
r1 = r1 + width + diff
for i in range(0, 8, 2):
        phaseshift = maxAngle/(2*period)+i*maxAngle/(period)
        t1 = phaseshift
        t2 = maxAngle/period + phaseshift
        outline(r1, width, t1, t2)

#
# 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('gray.svg')
d.save_png('gray.png')

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

print( 'Total width: ', r1 + width, ' mm' )

Borderline only

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

Older idea: https://www.ebay.de/itm/354278930033?hash=item527cab7671:g:NcAAAOSwrQNjIXA8&amdata=enc%3AAQAHAAAAsMHTOr42GQrvrE2i3wCdqI2r5jjEv1Xs%2BiBNogN2wRUiTlV4oLKSZLa9D8iT9KRAftUAsueGPYsgt1wNozci7go5zGnmZBCTHTE%2FBg2kQv04EJubQSPv9UXCipRa6pBzGubI%2B5RJl9PVJZdOm%2B2MaNdAeKMCMpAT5vLeXDPcrm0rR88Buo1sV4Q0l%2B9JTswzo5Qq5QxHEeGmWyUQU4NN4EgYsJ4TaD6%2BwVnMTwp2sTW%2B%7Ctkp%3ABk9SR8anh5a_YQ


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

How to connect the receiver to Arduino

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

// https://medium.com/@werneckpaiva/how-to-read-rc-receiver-signal-with-arduino-54e0447f6c3f
#define CH1 3
#define CH2 5
#define CH3 6
#define CH4 9
#define CH5 10

// Read the number of a given channel and convert to the range provided.
// If the channel is off, return the default value
int readChannel(int channelInput, int minLimit, int maxLimit, int defaultValue){
  int ch = pulseIn(channelInput, HIGH, 30000);
  if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);
}

// Red the channel and return a boolean value
bool redSwitch(byte channelInput, bool defaultValue){
  int intDefaultValue = (defaultValue)? 100: 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}

void setup(){
  Serial.begin(115200);
  pinMode(CH1, INPUT);
  pinMode(CH2, INPUT);
  pinMode(CH3, INPUT);
  pinMode(CH4, INPUT);
  pinMode(CH5, INPUT);
}

int ch1Value, ch2Value, ch3Value, ch4Value;
bool ch5Value;

void loop() {
  ch1Value = readChannel(CH1, -100, 100, 0);
  ch2Value = readChannel(CH2, -100, 100, 0);
  ch3Value = readChannel(CH3, -100, 100, -100);
  ch4Value = readChannel(CH4, -100, 100, 0);
  ch5Value = redSwitch(CH5, false);
  
  Serial.print("Ch1: ");
  Serial.print(ch1Value);
  Serial.print(" Ch2: ");
  Serial.print(ch2Value);
  Serial.print(" Ch3: ");
  Serial.print(ch3Value);
  Serial.print(" Ch4: ");
  Serial.print(ch4Value);
  Serial.print(" Ch5: ");
  Serial.println(ch5Value);
  delay(500);
}


Gear ratios

Lawnmower2013 gearRatioSpeed.svg

Gear ratio

Cutted parts and files

Dimensions

Inkscape's G Code generator, or use JsCut

Rotation detector. Plasma cutter.

  • Center hole: diameter 20 mm.
  • Width: 14 cm.


Steering gear plate:

  • Just two holes
  • Distance between hokes 56 mm.


Driving gear plate

  • Just some holes.