Liberty Proportional Winch assist

This page shall hold the information relating to the ongoing upgrade to the liberty electric assist module controller.


Presently ,

The Liberty's electric assist controller is only ON/OFF, controlled by micro switches.
This does not allow for minor adjustments of the sail (smaller than a person might operate the micro switch)

Trials underway for Proportional Control, that is – minor movement of joystick, means slow speed of motor winch for fine control of sheets. Full throw of the joystick giving a programmable max motor speed up to 100%


Present test bed,
– Wheelchair Joystick with potentiometer's giving analog input to micro computer (Arduino Nano V3.0)
– Out put from micro computer to (2) two Brushed, RC car ESC's
(not going to work due to voltage limitations of the ESC's)

Going to try the L298N Motor Driver, the Preslite motors (in the Liberty Winches) are supposed to only draw 2amp (Kevin G and I are highly dubious of this)

$10 + freight, Purchased from –
Voltage Range 7-24V

If they dont work out then either the Pololu Simple High-Power Motor Controller 24v12 
or the Pololu TReX Dual Motor Controller DMC01

I prefer the TReX, dual motor control with third output that we could use to drive a bilge pump.

Significant differences in costs but also in their capabilities.

Prototype L298N info

Test info – In a wiper test (motor drive forward/reverse) in a loop. Driver got only slightly warm, the Preslite motors are rated at 2amp draw. TReX Dual Motor Controllers will be used as they are more robust, with current limiting and able to drive three motors, 2 biDirectional and one Single Direction motor.

The TRex would be able to drive Main Sheet winch, Rudder Winch and bilge pump.


Code for above L298N Prototype

// connect motor controller pins to Arduino digital pins
// motor one Main Sheet
int enA = 10;
int in1 = 9;
int in2 = 8;
int mainPin = A0;  //input A0 for mainsheet
int mainVal = 0;  // int to hold main Input value (507 neutral)

// motor two
int enB = 5;
int in3 = 7;
int in4 = 6;
int rudderPin = A1; //input A1 for rudder
int rudderVal = 0;  // int to hold main Input value (507 neutral)

void setup()
  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(38400); // to cross check throw so i can set values relevant to deflection / tremor removal

void loop (){
  // Main Sheet deadbands
  mainVal = analogRead(mainPin);
  Serial.print("Main Val = ");
  if (mainVal >= 900)
  else if (mainVal <= 100 )

  // Rudder control deadbands
  rudderVal = analogRead(rudderPin);
  Serial.print("Rudder Val = ");
  if (rudderVal >= 900)
   else if (rudderVal <= 100 )

void mainOut() {
  // this function will let the main sheet out
  // turn on motor A 'forward'
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);  // main out speed

void mainIn() {
  // this function will pull the main sheet in
  // turn on motor A 'reverse'
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200); // main in speed

void mainStop () {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);

void rudderOut() {
  // this function will rudder right
  // turn on motor B 'forward'
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);  // main out speed

void rudderIn() {
  // this function will rudder left
  // turn on motor B 'reverse'
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200); // main in speed

void rudderStop () {
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);


Test Pilot and Sponsor – Brendan Hain
Maker – Tony Matthews