<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://fairdevices.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://fairdevices.github.io/" rel="alternate" type="text/html" /><updated>2025-12-16T20:48:30+00:00</updated><id>https://fairdevices.github.io/feed.xml</id><title type="html">Fair Devices Blog</title><subtitle>A simple blog page for Fair Devices</subtitle><entry><title type="html">Development Journal for universal washing machine damper</title><link href="https://fairdevices.github.io/jekyll/update/2025/12/13/development-diary-damper/" rel="alternate" type="text/html" title="Development Journal for universal washing machine damper" /><published>2025-12-13T16:30:00+00:00</published><updated>2025-12-13T16:30:00+00:00</updated><id>https://fairdevices.github.io/jekyll/update/2025/12/13/development-diary-damper</id><content type="html" xml:base="https://fairdevices.github.io/jekyll/update/2025/12/13/development-diary-damper/"><![CDATA[<h1 id="development-journal">Development Journal</h1>
<h1 id="universal-washing-machine-damper">Universal Washing Machine Damper</h1>

<h2 id="1-introduction">1 Introduction</h2>
<p>This is the development journal for an open source hardware washing machine damper. The damper is the most important part for long mechanical life of a washing machine. …</p>

<h2 id="2-general-technical-facts">2 General technical facts</h2>

<p>what are typical damper types? which one fail sooner, which ones last? damper parameters? loads/stresses/frequencies/ damping-power /thermal losses/ differential equations that describe the system of mass/spring coeff/damper —&gt; forces —-&gt; design</p>

<ul>
  <li>length: tbd.</li>
  <li>mounting holes: 8.0 mm for fitting screw</li>
</ul>

<h2 id="3-fundamental-differential-equations-for-mass-spring-damper-sytsem">3 fundamental differential equations for mass-spring-damper-sytsem</h2>
<h3 id="31-amplitude-vs-frequency">3.1 amplitude vs. frequency</h3>

<p>The following <a href="https://octave.org/download.html" title="https://octave.org/download.html">GNU Octave</a> script calculates and plots the amplitude of a damped mass-spring oscillator depending on the excitation frequency.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>% spring_dampe_mass_amplitude.m
% Calculates and plots the amplitude of a damped
% spring–mass oscillator as a function of the excitation frequency.

clear all; close all; clc;

% ---- Parameters -------------------------------------------------
m  = 40.0;        % Mass / kg
k  = 15000.0;      % Spring constant / N/m
c  = 1.0;        % Damping constant / N·s/m (0 = undamped)
F0 = 1.0;        % Amplitude of the excitation force / N

% Natural angular frequency and natural frequency
omega0 = sqrt(k/m);           % / rad/s
f0     = omega0/(2*pi);       % / Hz

% Frequency axis around the natural frequency
f_min = 0.0 * f0;             % Lower limit / Hz
f_max = 3.0 * f0;             % Upper limit / Hz
N     = 1000;                 % Number of support points

f     = linspace(f_min, f_max, N);  % Frequency [Hz]
omega = 2*pi*f;                     % Angular frequency [rad/s]

% ---- Amplitude calculation --------------------------------------
% A(omega) = F0 / sqrt((k - m*omega^2)^2 + (c*omega)^2)
num  = F0;
den  = sqrt( (k - m.*omega.^2).^2 + (c.*omega).^2 );
A    = num ./ den;

% ---- Spring force calculation -----------------------------------
% Peak spring force magnitude: |F_spring| = k * A (from F_s = -k x)
F_spring = k .* A;  % / N

% ---- Plot ------------------------------------------------------
figure;
plot(f, A, 'LineWidth', 2, 'DisplayName', 'Amplitude');
hold on;
plot(f, F_spring/1000, 'LineWidth', 2, 'DisplayName', 'Spring Force /kN');  % Scaled for visibility
grid on;
xlabel('Frequency f /Hz');
ylabel('Amplitude A /m , Force / kN');
title('Amplitude and Spring Force of Damped Spring-Mass Oscillator');
legend('Location', 'best');

% Enlarge font size for all axes text (title, labels, ticks, legend)
set(gca, 'FontSize', 16);  % Adjust 16 to your preferred size (e.g., 20 for even larger)

% Mark the natural frequency
y_eig = interp1(f, A, f0);     % Amplitude at natural frequency
plot(f0, y_eig, 'ro', 'MarkerSize', 8, 'LineWidth', 2);
text(f0, y_eig, sprintf('  f_0 = %.2f Hz', f0), ...
     'VerticalAlignment', 'bottom');

drawnow;
% pause;    % Optionally enable if you want the window to remain open

</code></pre></div></div>
<h3 id="32-unbalanced-forces-vs-rpm">3.2 unbalanced forces vs. rpm</h3>

<p>The following scipt calculates the unbalance forces as a funktion of the rotations per minute. Huge forces arise out of a unproper balance which is why the Fairdevices control unit needs to have function to minimise the unbalance of loundry inside the machine.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>% Unbalance force of a rotating mass
% m in kg, r in m, n in 1/min

clear all; close all; clc;

% Parameters
r = 0.25;                 % Radius in m (example value 0.1 m)
n = linspace(0, 1400, 500);   % Speed from 0 to 1400 rpm

% Convert speed to angular velocity
omega = 2*pi*n/60;       % rad/s

% Family of curves for masses 1 ... 8 kg
m_vec = 1:1:8;

figure;
hold on; grid on;

for m = m_vec
    F = m * r .* (omega.^2);    % Unbalance force in N
    plot(n, F, 'DisplayName', sprintf('m = %d kg', m));
end

xlabel('Speed n [rpm]');
ylabel('Unbalance force F [N]');
title(sprintf('Unbalance force F(n) for r = %.3f m and m = 1...8 kg', r));
legend('show', 'Location', 'northwest');
</code></pre></div></div>
<hr />
<p>DIAGRAM placeholder
—</p>

<p>3.3 spring constant</p>

<p>Assumptions:</p>

<ul>
  <li>mass of tub = 30 kg</li>
  <li>water mass = 10 kg</li>
  <li>loundry mass = 1..8 kg</li>
</ul>

<p>max delta for static load: 2.5 cm</p>

<p>Spring constant for 3 parallel springs: 15000 N/m</p>

<h2 id="2do--next-steps">2Do / Next Steps</h2>

<ol>
  <li>
    <p>Documatation of physical and mathematical fundamentales to calculate load / stresses / amplidudes / optimum values by equations, figures, etc. All ‘scientific’ knowledge should be gathered. It’s the base for opimisation by calculations and not trying ;)</p>
  </li>
  <li>Determination of typical values for
    <ul>
      <li>spring constants</li>
      <li>damper constants</li>
      <li>massrange of empty and fully loaded washing drum
in washing machines.</li>
    </ul>
  </li>
  <li>Note values in this document</li>
  <li>calculation of forces and amplitudes, maximum allowable amplitudes / imbalance of loundry</li>
  <li>Investigation / List of available oil damper</li>
  <li>concept of frictionless, wearless, electromagnetic damper by Eddy Current or by generator coil</li>
  <li>estimation of unbalance force</li>
</ol>

<p>…</p>]]></content><author><name>Fair Devices Team</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Development Journal Universal Washing Machine Damper]]></summary></entry><entry><title type="html">Development Journal for universal washing machine control unit</title><link href="https://fairdevices.github.io/jekyll/update/2025/03/15/development-diary-controlunit/" rel="alternate" type="text/html" title="Development Journal for universal washing machine control unit" /><published>2025-03-15T16:30:00+00:00</published><updated>2025-03-15T16:30:00+00:00</updated><id>https://fairdevices.github.io/jekyll/update/2025/03/15/development-diary-controlunit</id><content type="html" xml:base="https://fairdevices.github.io/jekyll/update/2025/03/15/development-diary-controlunit/"><![CDATA[<h1 id="development-journal">Development Journal</h1>
<h1 id="universal-washing-machine-control">Universal Washing Machine Control</h1>

<h2 id="1-introduction">1 Introduction</h2>
<p>This is the development journal for an open source/hardware washing machine control. It shall help to repair an old washing machine for which there are no spare parts available or update a more current model to more connectivity functions to as to use cheap electricity tariffs with a WiFi internet connection.</p>

<h2 id="2-general-technical-facts">2 General technical facts</h2>

<ul>
  <li>Input: 230 V, 16 A</li>
  <li>universal sockets with screws or clamps</li>
  <li>common Mikrocontroller with open software documentation (ESP32?!)</li>
  <li>fault identification techniques</li>
  <li>full repair instructions</li>
  <li>machine model related firmware in regards to sensor characteristics, valve control, etc.</li>
  <li>the control will work for machines with so-called universal motors only. It will not serve for drive-fed motor</li>
  <li>…</li>
</ul>

<h2 id="3-components">3 Components</h2>
<h3 id="31-power-supply">3.1 power supply</h3>
<p>Conventional washing machines without a converter drive have the following three power levels:</p>
<ul>
  <li>230-V-Level for Motor, Heating and Valves directly connected to the power plug (+electric filters and fuses)</li>
  <li>12-V-Level for the relay control elements</li>
  <li>3.3-V-Level for the microcontroller</li>
</ul>

<h4 id="311-230-v-level">3.1.1 230 V-Level</h4>
<p>Fuse, Filter to reduce EMC levels of the universal motor</p>

<h3 id="312-12-v-level">3.1.2 12-V-Level</h3>
<p>The 12 V will be provided by a separat power supply unit. This will make the control more robust overall. The power functionality of the power supply unit can be checked easily by a multimeter. It can be purchased or taken from an old PC. The latter one would also provide 5 V which is used for the 3.3 V. Alternatively almost every smartphone charger can provide the 5V and 500 mA easily.</p>

<h4 id="313-33-v-level">3.1.3 3.3-V-Level</h4>
<p>The stabilized power supply of 3.3 V for the microcontroller is realized via a linear regulator from 5V.</p>

<h4 id="314-zero-current-switching">3.1.4 Zero current switching</h4>
<p>Switching causes trouble and wear. When using a single relay an arc at opening contacts will wear the contacts eventually. Small arcs may even occur while closing when the moving contacts of the relay bounce. The wear and possible weling of the contacts is minimized by putting a thyristor parallel to the relay. This has the following advantages:</p>

<ul>
  <li>no switching arcs for ON- and OFF-state within the relay</li>
  <li>minimal thermal losses on the thyristor, because of only one half-wave of current</li>
</ul>

<p>Every switch event shall be synchronized with net voltage in such a way, that the high loads like motor and heating will be switched on just after the zero crossing of the voltage and switch off at zero current by the thyristor. The reaction time of a relay is usually less than 15 ms so it can easily open during on half cycle of the AC net voltage.</p>

<p>This is the first bit of code</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#include &lt;driver/adc.h&gt;
#include &lt;driver/dac.h&gt;

const int inputPin = 27;  // GPIO-Pin für das Eingangssignal
const int outputPin = 25; // DAC1 (GPIO25) für den analogen Ausgang

volatile unsigned long lastInterruptTime = 0;
volatile unsigned long period = 0;
volatile int interruptCounter = 0;

void IRAM_ATTR handleInterrupt() {
 unsigned long currentTime = micros();
  if (interruptCounter &gt; 0) {
    period = currentTime - lastInterruptTime;
  }
  lastInterruptTime = currentTime;
  interruptCounter++;
 }

 void setup() {
  Serial.begin(115200);
  
  pinMode(inputPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(inputPin), handleInterrupt, RISING);
  
  dac_output_enable(DAC_CHANNEL_1);
}
 
void loop() {
  if (interruptCounter &gt; 1) {
    float frequency = 1000000.0 / period; // Frequenz in Hz
    
    // Begrenze die Frequenz auf den Bereich 0-1000 Hz für die Ausgabe
    frequency = constrain(frequency, 0, 1000);
    
    // Skaliere die Frequenz auf 0-3300 mV
    int outputVoltage = map(frequency, 0, 1000, 0, 3300);
    
    // Setze den analogen Ausgang
    dac_output_voltage(DAC_CHANNEL_1, outputVoltage / 13); // DAC erwartet Werte von 0-255
    
    Serial.print("Frequenz: ");
    Serial.print(frequency);
    Serial.print(" Hz, Ausgangsspannung: ");
    Serial.print(outputVoltage);
    Serial.println(" mV");
    
    interruptCounter = 0;
  }
  
  delay(100); // Kurze Pause, um die CPU-Auslastung zu reduzieren
}
</code></pre></div></div>

<p><img src="/assets/images/frequency-detection.svg" alt="frequency detection" /></p>

<h4 id="315-frequency-detection">3.1.5 Frequency detection</h4>

<p>The frequency detection serves the time dependent relay switching for minimized wear at the relay contacts. The voltage of an ohmic divider at one end of the secondary winding of the power supply transformer is lead via a diode to an input of the Mikrocontroller. A 2.7…3 V-Zener-Diode protects the input against possible over-voltages.</p>

<p>The ESP has to measure the time difference use it for the determination of the time trigger for the relay. The high load of motor and heat resistor need to be switch on alternative in positiv an negativ half-wave to symmetric loads to the feeding electric network.</p>

<h3 id="32-heating---temperature-control">3.2 Heating - temperature control</h3>
<h4 id="331-general">3.3.1 General</h4>

<p>The water temperature is conventionally controlled by a resistance heater (230V, 2kW, 10A). The temperature is measured via an NTC element. Most washing machines use NTC sensors with a resistance of around 4.8 kΩ at 20°C. If a different model is used in a particular WaMA, this must be stored accordingly in the software for the µC.
The central µC takes over the control. The electrical switching element is a relay (12 V/230).
Relays as switching elements have the following advantages and disadvantages:</p>
<ul>
  <li>galvanic isolation</li>
  <li>low electrical resistance → low thermal losses, no cooling required</li>
  <li>favorable costs</li>
  <li>Burn-off at the switching electrodes and possible contact sticking – failure / life
Triacs/thyristors as switching elements</li>
  <li>No mechanically moving parts → long life</li>
  <li>no arcing → long life</li>
  <li>high thermal loss 1W/A → heat sink required</li>
  <li>no galvanic isolation → optocoupler required
Due to the development goal of achieving the longest possible service life, the decision was made to use a triac. The 10W losses at a current of 10 A correspond to a reasonable 10W/2000W = 0.5 % power loss. A sufficiently large heat sink is determined by tests.</li>
</ul>

<h4 id="332-physical-boundary-conditions-for-heating-control">3.3.2 Physical boundary conditions for heating control</h4>

<ul>
  <li>Water volume, approx.: 10-25 L</li>
  <li>Heat capacity, water: 4,19 kJ/(kg K)</li>
  <li>Worst case: 90-°C-program, dT=80 K, 10..25 kg → 30…60 min heat period with thermal losses over vat and housing</li>
  <li>Control with relay: 2-point-control with +/- 1.5 °C sufficient</li>
  <li>Control via thyristor: Switch-on duration function-related 2 sine half-waves = 20 ms, the thyristors would have to be retriggered every period.</li>
</ul>

<h4 id="34-motor-control">3.4 Motor control</h4>
<p>RPM, direction, tumbling, spinning</p>

<h4 id="35-magnetic-valves-for-cold-and-hot-water">3.5 magnetic valves for cold and hot water</h4>
<p>Electric parameters for valves: 230 V, xxx? A</p>

<h2 id="4-fault-identification-strategies">4 Fault identification strategies</h2>

<p>Similar to cars, which tell you that i.e. the rear right brake light is defective, the control system should be able to check itself or detect faults in the controlled components.</p>

<h3 id="41-dampers">4.1 dampers</h3>
<ul>
  <li>The washing drum is a spring-mass oscillator → natural frequency → if a corresponding current harmonic in the motor current is too high, then the damper is worn out.</li>
</ul>

<h3 id="42-main-bearing">4.2 main bearing</h3>
<ul>
  <li>acoustic signal via piezo microphone.</li>
</ul>

<h3 id="43-heating">4.3 heating</h3>
<ul>
  <li>no current, broken fuse, earth fault</li>
</ul>

<h3 id="44-main-motor">4.4 main motor</h3>
<ul>
  <li>no current, then defected carbon brushes</li>
</ul>

<h3 id="45-drain-pump">4.5 drain pump</h3>

<h2 id="5-question-lists">5 Question lists</h2>
<ul>
  <li>12V vs 24 V bei den Relais? → 12 V is supposed to be cheaper because more common through automotiv.</li>
  <li>Relais vs Thyristoren vs SSR?</li>
</ul>

<h2 id="6-2do-list">6 2Do list</h2>
<ul>
  <li>Frequency detection with capacitive divider</li>
  <li>Washing programme, times, motor speed for tumbling</li>
  <li>ECO-Modes: temperature reduction and time extension</li>
  <li>determination of switch-off times of relay</li>
</ul>]]></content><author><name>Fair Devices Team</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Development Journal Universal Washing Machine Control]]></summary></entry><entry><title type="html">everything starts with a first step</title><link href="https://fairdevices.github.io/jekyll/update/2024/08/18/first-step/" rel="alternate" type="text/html" title="everything starts with a first step" /><published>2024-08-18T10:30:29+00:00</published><updated>2024-08-18T10:30:29+00:00</updated><id>https://fairdevices.github.io/jekyll/update/2024/08/18/first-step</id><content type="html" xml:base="https://fairdevices.github.io/jekyll/update/2024/08/18/first-step/"><![CDATA[<p>Everything starts with a <a href="https://www.linkedin.com/posts/fairdevices_everything-starts-with-a-first-step-activity-7230287179174825985-5n1A">first step</a>.</p>]]></content><author><name>Fair Devices Team</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Everything starts with a first step.]]></summary></entry><entry><title type="html">fairdevices wants to become an association</title><link href="https://fairdevices.github.io/jekyll/update/2024/07/25/fairdevices-to-become-association/" rel="alternate" type="text/html" title="fairdevices wants to become an association" /><published>2024-07-25T10:30:29+00:00</published><updated>2024-07-25T10:30:29+00:00</updated><id>https://fairdevices.github.io/jekyll/update/2024/07/25/fairdevices-to-become-association</id><content type="html" xml:base="https://fairdevices.github.io/jekyll/update/2024/07/25/fairdevices-to-become-association/"><![CDATA[<p><em><strong>fair</strong>devices</em> wants to become an association, listed as a German <em>“eingetragener Verein”</em>.</p>

<p>You are more than welcome to join and become a founding member!</p>]]></content><author><name>Fair Devices Team</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[fairdevices wants to become an association, listed as a German “eingetragener Verein”.]]></summary></entry></feed>