DIY Lawnmower 2023: Difference between revisions
(60 intermediate revisions by the same user not shown) | |||
Line 17: | Line 17: | ||
== Theory == | == Theory == | ||
=== Rotary Encoders or a Shaft Encoder === | |||
Two main types of rotary encoder: absolute (angle transducer) and incremental. | |||
* Mechanical (eg potentiometer) | |||
* Optical (sensitive to dust) | |||
* Capacitive | |||
* On-axis magnetic () | |||
* Off-axis magnetic | |||
Rotary pulse encoder; Eg 600 ppr (pulses per rotation). | |||
=== Gray code 3d STL files === | |||
<gallery> | |||
Lawnmower gray5.jpg |Caption1 | |||
Lawnmower gray4.jpg |Caption2 | |||
Lawnmower gray3.jpg |Caption2 | |||
Lawnmower gray2.jpg |Caption2 | |||
Lawnmower gray1.jpg |Caption2 | |||
</gallery> | |||
=== 3d design with Blender === | |||
[[File:Gray blend.png|The 50 deg Gray Code Disc]] | |||
60 degree limit; 16 segments. | |||
# Create a cylinder with 16x6 = 96 vertices; Radius 35; Depth 3. | |||
# Edit mode; extrude radially; scale s using the following numbers (which makes the difference of the radii the same). The data is found on [[File:Gracode_percentages.ods]]. The difference <math>d=\frac{R-r_1}{4}</math> | |||
{| class="wikitable" | |||
|+ Caption text | |||
|- | |||
! Radii !! Subtraction (d=0.825) !! Coeffiecient | |||
|- | |||
| R<sub>max</sub> || 7 || | |||
|- | |||
| R || 6.6 || 0.943 | |||
|- | |||
| r<sub>4</sub> || 5.775 || 0.875 | |||
|- | |||
| r<sub>3</sub> || 4.95 || 0.857 | |||
|- | |||
| r<sub>2</sub> || 4.125 || 0.8333 | |||
|- | |||
| r<sub>1</sub> || 3.3 || 0.8 | |||
|} | |||
# Make the cylindrical object which is to be attached to the axis. The angle is 100 deg. | |||
# Interesting but not working method: Cube; Hole; Simple Deform; Array | |||
The blend file: [[File:Gray disc.zip]] | |||
Sizes | |||
* Diameter of the axis: 25 mm | |||
* Width: 10 cm | |||
* Length: 7 cm (4.5 cm) | |||
* Height: Less than 26 mm | |||
* Diameter of the LDR is 0.51 mm | |||
Four + two (4+2) radii. | |||
* 7 / 6 = 1.1 cm | |||
=== Steering === | === Steering === | ||
Line 22: | Line 83: | ||
[[File:Lawnmower2023 rotaryAngle distance.svg|thumb|Use distance sensor to detect the angle]] | [[File:Lawnmower2023 rotaryAngle distance.svg|thumb|Use distance sensor to detect the angle]] | ||
[[File:Lawnmower2013 graycode.png|thumb|Gray code with rotary disk]] | [[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 angles needed are: | ||
Line 43: | Line 106: | ||
* [https://baldur.iti.kit.edu/sat-race-2015/descriptions/bench/SingleTrackGrayCode-Manthey.pdf Finding Single Track Gray Codes with SAT] | * [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. | Include the most significant bit (varies most) to outer circle. | ||
Line 81: | Line 123: | ||
import drawsvg as draw | import drawsvg as draw | ||
import math as math | |||
d = draw. | 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')) | |||
#Draw the center hole | maxAngle = 60 | ||
d | |||
# 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) | period = 2 #(one black strip, one white strip) | ||
phaseshift = 0 | 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) | period = 2 #(one black strip, one white strip) | ||
phaseshift = maxAngle/(2*period) ##90 degrees | 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) | period = 4 #(one black strip, one white strip) | ||
phaseshift = maxAngle/(2*period) | phaseshift = maxAngle/(2*period) | ||
r1 = r1 + width + diff | |||
for i in range(0, 4, 2): | |||
phaseshift = maxAngle/(2*period) + | 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) | 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) | |||
phaseshift = maxAngle/(2*period)+ | t1 = phaseshift | ||
t2 = maxAngle/period + phaseshift | |||
outline(r1, width, t1, t2) | |||
phaseshift | |||
# | # | ||
# Print it | # Print it | ||
# | # | ||
d.set_pixel_scale(2) # Set number of pixels per geometry unit | d.set_pixel_scale(2) # Set number of pixels per geometry unit | ||
#d.set_render_size(400, 200) # Alternative to set_pixel_scale | #d.set_render_size(400, 200) # Alternative to set_pixel_scale | ||
d.save_svg(' | d.save_svg('gray.svg') | ||
d.save_png(' | d.save_png('gray.png') | ||
# Display in Jupyter notebook | # Display in Jupyter notebook | ||
#d.rasterize() # Display as PNG | #d.rasterize() # Display as PNG | ||
d # Display as SVG | d # Display as SVG | ||
print( 'Total width: ', r1 + width, ' mm' ) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Borderline only === | |||
=== Wheels and tires === | === Wheels and tires === | ||
Line 173: | Line 247: | ||
Torque, Speed, Duty Cycle | Torque, Speed, Duty Cycle | ||
The gear is standard 410-9T bicycle chain (9 teeth). 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> | |||
410 Roller Chain Dimension (see https://www.nitrochain.com/410-non-standard-roller-chain-10ft) | |||
* Pitch 12.7 mm (1/2") | |||
* Inner width 3.175 mm (1/8") | |||
* Roller diameter 7.747 mm (0.305") | |||
* Overall width 9.271 mm (0.365") | |||
* Pin diameter 3.6068 mm (0.142") | |||
* Link plate height 9.906 mm (0.390") | |||
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 | 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 | |||
=== Chain === | |||
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. | ||
Shimano: 114L or 116L depicts the number of links, length, of the chain. | |||
Chains are identified by the number of rear sprockets they can support, anywhere from 3 (why not 1?) to 13. The following list enables measuring a chain of unknown origin to determine its suitability. | |||
* 10 speed – 6.0 to 7.0 mm (1⁄4 to 9⁄32 in) (Shimano, Campagnolo) | |||
* 10 speed (Narrow) – 5.88 mm (7⁄32 in) (Campagnolo, KMC) | |||
* 10 speed (Narrow, Direction) – 5.88 mm (7⁄32 in) (Shimano CN-5700, CN-6700, CN-7900) | |||
Chains come in 3⁄32 in (2.4 mm), 1⁄8 in (3.2 mm), 5⁄32 in (4.0 mm), or 3⁄16 in (4.8 mm) roller widths, the internal width between the inner plates. | |||
Chain widths | |||
*3⁄32 in (2.4 mm) chains are generally used on bikes with derailleurs such as racing, touring, and mountain bikes.[17] (Fixed sprockets and freewheels are also available in 3⁄32 in (2.4 mm) widths, so fixed-gear and single-speed bikes can be set up to use the narrower and lighter 3⁄32 in (2.4 mm) chains.) | |||
* 1⁄8 in (3.2 mm) chains are typically used on bikes with a single rear sprocket: those with coaster brakes, hub gears, fixed gears such as track bicycles, or BMX bikes. | |||
* 5⁄32 in (4.0 mm) chains are used on cargo bikes and tricycles. | |||
Shimano cn-nx10 1s suits. | |||
=== Motor Speed Controller BTS7960 === | === Motor Speed Controller BTS7960 === | ||
Line 230: | Line 339: | ||
=== Radio controller === | === 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. | 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. | |||
== Cutting the grass == | |||
RPM, tip speed, | |||
Tip speed. The faster the blades move the sharper, more define the cut... impact energy | |||
* Anything over 90 m/s is fine. | |||
* 84 m/s (16,500 fpm) blade tip speed | |||
* WB mfg are up near 86 m/s or 91 m/s (17k or 18k fpm). Husqvarna WB with a tip speed of 81 m/s (15.9k). | |||
* blade tip speed with 94 m/s | |||
* the design of the deck. | |||
Blades available from a shop | |||
* 32cm | |||
* 33cm | |||
* 38cm veitsiterä | |||
* 42cm | |||
* 43cm veitsiterä (bio) | |||
* 46cm veitsiterä (akkukäyttöinen) | |||
* 48cm veitsiterä (bio, akku) | |||
* 49cm | |||
* 50cm | |||
* 51cm | |||
* 53cm (myös 2x, eli 107 cm) 42" | |||
* 56cm (bioleikkaava) | |||
For example (at 97 m/s blade speed, 3.5 m/s ground speed, running single blades--so you get two "cuts" per revolution): | |||
* 30.5cm blade: 6048 rpm (!), 1.8 cm of ground travel between cuts (in/cut) | |||
* 42cm blade: 4398 rpm, 2.5 cm | |||
* 46cm blade: 4032 rpm, 2.7 cm | |||
* 53cm blade: 3455, 3 cm | |||
* 61cm blade: 3023, 3.5 cm | |||
The blade should spin at approximately 3000 RPM (revolutions per minute) to cut grass efficiently. ANSI standards: the tip of the blade should spin at a speed no greater than 97 m/s. | |||
'''Trimmer mower''' or '''field and brush mower''' for a very long grass |
Latest revision as of 22:43, 17 June 2025
Introduction

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
- ArduPilot https://ardupilot.org/rover/docs/gettit.html
- Cube Orange https://ardupilot.org/copter/docs/common-thecubeorange-overview.html
- OpenMower
Theory
Rotary Encoders or a Shaft Encoder
Two main types of rotary encoder: absolute (angle transducer) and incremental.
- Mechanical (eg potentiometer)
- Optical (sensitive to dust)
- Capacitive
- On-axis magnetic ()
- Off-axis magnetic
Rotary pulse encoder; Eg 600 ppr (pulses per rotation).
Gray code 3d STL files
-
Caption1
-
Caption2
-
Caption2
-
Caption2
-
Caption2
3d design with Blender
60 degree limit; 16 segments.
- Create a cylinder with 16x6 = 96 vertices; Radius 35; Depth 3.
- Edit mode; extrude radially; scale s using the following numbers (which makes the difference of the radii the same). The data is found on File:Gracode percentages.ods. The difference
Radii | Subtraction (d=0.825) | Coeffiecient |
---|---|---|
Rmax | 7 | |
R | 6.6 | 0.943 |
r4 | 5.775 | 0.875 |
r3 | 4.95 | 0.857 |
r2 | 4.125 | 0.8333 |
r1 | 3.3 | 0.8 |
- Make the cylindrical object which is to be attached to the axis. The angle is 100 deg.
- Interesting but not working method: Cube; Hole; Simple Deform; Array
The blend file: File:Gray disc.zip
Sizes
- Diameter of the axis: 25 mm
- Width: 10 cm
- Length: 7 cm (4.5 cm)
- Height: Less than 26 mm
- Diameter of the LDR is 0.51 mm
Four + two (4+2) radii.
- 7 / 6 = 1.1 cm
Steering




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.
- Tests on accuracy
Gray code
- In a gray code the bit distance between two consecutive words is exactly one (mono-difference).
- Accuracy:
- Absolute Position Coding Method for Angular Sensor—Single-Track Gray Codes
- The Structure of Single-Track Gray Codes
- Finding Single Track Gray Codes with SAT
Include the most significant bit (varies most) to outer circle.
Mechanics.

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
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")
- https://www.tuontitukku.fi/pienkone-vene-ja-varaosa/monkijan-rengas-vanteella-145-70-6-taka-eturengas-145-70-6-vanteella/p/6419773657219/
- https://www.tuontitukku.fi/pienkone-vene-ja-varaosa/monkija-rengas-vanne-vasen-7-lasten-monkijan-rengas-vanteella/p/6438471012071-s/
Current
Heat Dissipation
Motor


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 (9 teeth). 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
410 Roller Chain Dimension (see https://www.nitrochain.com/410-non-standard-roller-chain-10ft)
- Pitch 12.7 mm (1/2")
- Inner width 3.175 mm (1/8")
- Roller diameter 7.747 mm (0.305")
- Overall width 9.271 mm (0.365")
- Pin diameter 3.6068 mm (0.142")
- Link plate height 9.906 mm (0.390")
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
Chain
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.
Shimano: 114L or 116L depicts the number of links, length, of the chain.
Chains are identified by the number of rear sprockets they can support, anywhere from 3 (why not 1?) to 13. The following list enables measuring a chain of unknown origin to determine its suitability.
- 10 speed – 6.0 to 7.0 mm (1⁄4 to 9⁄32 in) (Shimano, Campagnolo)
- 10 speed (Narrow) – 5.88 mm (7⁄32 in) (Campagnolo, KMC)
- 10 speed (Narrow, Direction) – 5.88 mm (7⁄32 in) (Shimano CN-5700, CN-6700, CN-7900)
Chains come in 3⁄32 in (2.4 mm), 1⁄8 in (3.2 mm), 5⁄32 in (4.0 mm), or 3⁄16 in (4.8 mm) roller widths, the internal width between the inner plates.
Chain widths
- 3⁄32 in (2.4 mm) chains are generally used on bikes with derailleurs such as racing, touring, and mountain bikes.[17] (Fixed sprockets and freewheels are also available in 3⁄32 in (2.4 mm) widths, so fixed-gear and single-speed bikes can be set up to use the narrower and lighter 3⁄32 in (2.4 mm) chains.)
- 1⁄8 in (3.2 mm) chains are typically used on bikes with a single rear sprocket: those with coaster brakes, hub gears, fixed gears such as track bicycles, or BMX bikes.
- 5⁄32 in (4.0 mm) chains are used on cargo bikes and tricycles.
Shimano cn-nx10 1s suits.
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:
- https://www.homemade-circuits.com/dc-motor-speed-controller-circuits/
- https://howtomechatronics.com/tutorials/arduino/arduino-dc-motor-control-tutorial-l298n-pwm-h-bridge/
- https://howtomechatronics.com/tutorials/arduino/arduino-dc-motor-control-tutorial-l298n-pwm-h-bridge/
Extra things and older thoughs.
Use PWM. Feedback? Arduino L298N H-bridge.
Arduino pwm motor controller 300W 36V 20Amps
- https://www.pololu.com/product/755
- https://www.infineon.com/cms/en/product/evaluation-boards/bldc-shield_ifx007t/
- https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc47_relax_5v_ad_v1/
- https://www.canakit.com/50a-dc-pwm-motor-speed-controller.html
https://electropeak.com/learn/interfacing-bts7960-43a-high-power-motor-driver-module-with-arduino/
High power dc motor speed controller
- https://www.ebay.de/itm/255283289430?hash=item3b7011dd56:g:ooAAAOSwhexb6eW9&amdata=enc%3AAQAIAAAA4Gjfo%2FMILLwl3G9ygIqNAj7fpl%2FtigoAQMba%2FwqTqxj%2F4nqjin1d6Re7Jqa2XBzZBTYTsTZEUjiXEhH%2BpvJd1RaWoR5%2FsWhgtcwpXnTrpL1Y5wDPHZ1wJJTmdK4mb4LOQLw%2BmqT%2B9tcOBX%2BAwD37WZcEfTk3P5B6boz%2BRV7G1fj3KiqeZ%2B0ZA98o9mIFBOG2E6fxDo9K3cQN2u5M53jQ7PrP6%2BjtJTGNnfCQA0tuOE8V8bAfFmBRCnPAFt001aTDSAUCuyxzZNQK%2FaKJMdzbLnmLjxgPMQmkSpSDCFQrBg8D%7Ctkp%3ABFBM6Ie9uvph
- Amazon: Songhe BTS7960 43A, HiLetgoBTS7960 43A, Melife PWM 10-50V 60A,
- https://www.ebay.de/itm/123021644824?hash=item1ca4a95418:g:nbkAAOSwFwlgA~qm&amdata=enc%3AAQAIAAAA4D2ya%2FD4v6plC%2B8Wi7%2BlXiqyFvx9ZVmTFiGrhSZCNY2YnjdXjYQSdBGKApiC33DWt5chAE5RKlktpUjFvfAH7zshCx42W8yONOQ4zchZuo1246qn5qB8HmRBhVVuQ4urPQKY5239P%2FA%2BODko%2BEp8V0A2%2FuEAhTO2Dxs5GGNBIJL45pGyQFEMNEa8NpisE0ebKnTokdhtuJVPQNap6U0DW1jeEwasXUUanOoWC0uDn%2Bt2gC3ulFIBbXn1epQw3wCnTR1iOv%2BRR%2Fz5KjKpYRsaZfmprbV7gONgMIgdZ3QgdJ%2B6%7Ctkp%3ABk9SR7rT4rf6YQ
- 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/
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.
// 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

Gear ratio
Cutted parts and files

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.
Cutting the grass
RPM, tip speed,
Tip speed. The faster the blades move the sharper, more define the cut... impact energy
- Anything over 90 m/s is fine.
- 84 m/s (16,500 fpm) blade tip speed
- WB mfg are up near 86 m/s or 91 m/s (17k or 18k fpm). Husqvarna WB with a tip speed of 81 m/s (15.9k).
- blade tip speed with 94 m/s
- the design of the deck.
Blades available from a shop
- 32cm
- 33cm
- 38cm veitsiterä
- 42cm
- 43cm veitsiterä (bio)
- 46cm veitsiterä (akkukäyttöinen)
- 48cm veitsiterä (bio, akku)
- 49cm
- 50cm
- 51cm
- 53cm (myös 2x, eli 107 cm) 42"
- 56cm (bioleikkaava)
For example (at 97 m/s blade speed, 3.5 m/s ground speed, running single blades--so you get two "cuts" per revolution):
- 30.5cm blade: 6048 rpm (!), 1.8 cm of ground travel between cuts (in/cut)
- 42cm blade: 4398 rpm, 2.5 cm
- 46cm blade: 4032 rpm, 2.7 cm
- 53cm blade: 3455, 3 cm
- 61cm blade: 3023, 3.5 cm
The blade should spin at approximately 3000 RPM (revolutions per minute) to cut grass efficiently. ANSI standards: the tip of the blade should spin at a speed no greater than 97 m/s.
Trimmer mower or field and brush mower for a very long grass