Electric Canoe

by timothy in Outside > Boats

36924 Views, 92 Favorites, 0 Comments

Electric Canoe

default-8.jpg
This is a series of 9 short videos about how I set up my electric canoe. It's not exactly instructions, but I do go through a many of the different parts. I hope that others who are building electric boats, or thinking about it, might enjoy some of my rambling. This canoe is unique in that its twin screw (two propellers), and is driven by a wii nunchuck. It's powered by two golf cart batteries. The motors are Minkota Endura 30s.

Also, Here is the original movie I made about this boat last year:


Batteries and Wiring

default-7.jpg
Give a general description of the Step


FLexiwire at mcmaster.com:

9620T22 6 Ft. 392 Deg F Hi-voltage/high-flex Wire, 10 Awg, .330" Od, 20000 Vdc, Clear

Motor Mount Hinge

default-6.jpg
The rest of the wiring and the hinge setup
to drop the motor down.

The hinge part:
1513A39 2 Each Mortise-mnt Nontemplate Hinge W/removable Pin, Square Corners,dull 304ss, 4"h Leaf, 4"open Widt

Electronics

default-5.jpg


Here is the arduino code I used:

WiiChuck.h and ServoTimer1.h are both available on-line. Drop a message if you want them and cant find them.

******************

#include "Wire.h"
#include "WiiChuck.h"
#include "ServoTimer1.h"

#define TILL_POWER_PIN 8
#define TILL_STBD_PIN 10
#define TILL_PORT_PIN 9

#define THROTT_DIFF_PIN 12
#define THROTT_MAIN_PIN 11

#define MINTILLPULSE 1100 // Minimum servo position
#define MAXTILLPULSE 1900 // Minimum servo position

#define MINTHROTTPULSE 1000 // Minimum servo position
#define MAXTHROTTPULSE 1965 // Maximum servo position

//ServoTimer1 tiller = ServoTimer1();
WiiChuck chuck = WiiChuck();

int tillerPulse = 1500; // Amount to pulse the servo
int throttlePulse = 1500; // Amount to pulse the servo

int throttleDiffPulse = 1500; // Amount to pulse the servo

int lastTillerPulse = 1500;
int baseTillerPulse = 1500;

int move = 10;

long lastPulse = 0; // the time in milliseconds of the last pulse
int refreshTime = 20; // the time needed in between pulses

int analogValue = 0; // the value returned from the analog sensor
int analogPin = 0; // the analog pin that the sensor's on

boolean wake = true;
long sleeptimer = 0;
boolean dothrottle = true;

void setup() {

Serial.begin(9600);
chuck.begin();
chuck.update();
//tiller.setMaximumPulse(2500);
//tiller.setMinimumPulse(500);

for (int i =8; i<13;i++) {
pinMode(i, OUTPUT); // Set servo pin as an output pin
}
}

int angle;
void loop() {

chuck.update();
lastTillerPulse = tillerPulse;

if (chuck.buttonC) {
//tiller.attach(9);
//tiller.write(angle);
//tiller.attach(10);
//tiller.write(angle);
baseTillerPulse = (int)(1500.0 - chuck.readRoll() * 3);
throttleDiffPulse = (int)(1500.0 + chuck.readJoyX() * 5);
tillerPulse = baseTillerPulse;
}
else {
if (abs(chuck.readJoyX()) > 10) {
tillerPulse = baseTillerPulse - chuck.readJoyX();
}
else {
tillerPulse = baseTillerPulse;
}
}

if (chuck.buttonZ) {
throttlePulse = (int)(1500.0 + chuck.readJoyY() * 5);

}

if (throttlePulse < MINTHROTTPULSE) {
throttlePulse = MINTHROTTPULSE;
}
if (throttlePulse > MAXTHROTTPULSE) {
throttlePulse = MAXTHROTTPULSE;
}

if (throttleDiffPulse < MINTHROTTPULSE) {
throttleDiffPulse = MINTHROTTPULSE;
}
if (throttleDiffPulse > MAXTHROTTPULSE) {
throttleDiffPulse = MAXTHROTTPULSE;
}

if (tillerPulse < MINTILLPULSE) {
tillerPulse = MINTILLPULSE;
}
if (tillerPulse > MAXTILLPULSE) {
tillerPulse = MAXTILLPULSE;
}

Serial.print(tillerPulse);
Serial.print(", ");
Serial.println(throttlePulse);

if (tillerPulse != lastTillerPulse) {
wake = true;
sleeptimer = 0;
}
else {
sleeptimer += 1;
}

if (sleeptimer > 80)
wake = false;

if (wake) {
digitalWrite(TILL_POWER_PIN, HIGH);
}
else {
digitalWrite(TILL_POWER_PIN,LOW);
}
updateServos();

}

void updateServos() {

//analogValue = analogRead(analogPin); // read the analog input
//tillerPulse = (analogValue * 19) / 10 + MINPULSE; // convert the analog value
// to a range between MINPULSE
// and MAXPULSE.

if (dothrottle) {
// tillerPulse the servo again if rhe refresh time (20 ms) have passed:
digitalWrite(THROTT_MAIN_PIN, HIGH);
delayMicroseconds(throttlePulse);
digitalWrite(THROTT_MAIN_PIN, LOW); // Turn the motor on

digitalWrite(THROTT_DIFF_PIN, HIGH);
delayMicroseconds(throttleDiffPulse);
digitalWrite(THROTT_DIFF_PIN, LOW); // Stear Motors
delayMicroseconds(5000 - throttlePulse - throttleDiffPulse);

}
else {
delayMicroseconds(5000);
}
dothrottle = !dothrottle;

digitalWrite(TILL_STBD_PIN, HIGH); // Turn the motor on
digitalWrite(TILL_PORT_PIN, HIGH); // Turn the motor on
delayMicroseconds(tillerPulse); // Length of the pulse sets the motor position
digitalWrite(TILL_STBD_PIN, LOW); // Turn the motor on
digitalWrite(TILL_PORT_PIN, LOW); // Turn the motor on

delayMicroseconds(5000-tillerPulse);

}

WiiChuck Steering

default-4.jpg


The Demo step shows what's connected with what. The Electronics step has the Arduino code that does it.

Steerage

default-3.jpg


Flange
5520K124 2 Each 1-1/4" Cast Bronze Companion Flange

Collars:
9959K33 2 Each Chrome-plated Steel One-piece Clamp-on Collar, 1-3/8" Bore, 2-1/4" Outside Diameter, 9/16" Widt

The Sprocket:
2737T287 1 Each Steel Finished-bore Roller Chain Sprocket, For #25 Chain, 1/4" Pitch, 40 Teeth, 1-3/8" Bore

upper Bronze Sleeve to adapt the sprocket
6381K567 2 Each Alloy 932 (sae 660) Bronze Sleeve Bearing, For 1-1/8" Shaft Diameter, 1-3/8" Od, 1" Length

The lower bronze sleeve
6381K251 2 Each Alloy 932 (sae 660) Bronze Sleeve Bearing, For 1-1/8" Shaft Diameter, 1-3/8" Od, 4" Length

Chain: (links)
6261K108 4 Each #25 Connecting Link For, Standard Ansi Roller Chain
6261K284 1 Each Standard Ansi Roller Chain, #25, Sngl Strand,1/4"pitch, Rollerless,.13"dia,4l

The Hone I was talking about:
4424A75 1 Each Flexible Cylinder Hone, 1-1/8" Cylinder Id, 120 Grit, 8" Overall Length

The Motor Mount Clamp and Setup

default-2.jpg


The Demo!

default-1.jpg
See things running, and how to drive with a wiichuck.


The Canoe Cart

default.jpg
The cart might be my favorite part.



McMaster parts list:

78155T17 40 Each Cart-smart Junior Caster, Rigid, 2" X 1" Rubber Wheel, 90# Capacity

92364A245 2 Packs Type 410 Ss Pan Head Phil Self-drill Screw, 10-16 Thread, 3/4" Length, Drill Point #3

3644T51 1 Each Horizontal-pulling Hand Winch, For 1/8"dia Wire Rope,1 Speed,600# First Layer Cap

5458T42 1 Each Aluminum Narrow-width Ladder, 8 Height, 12" Width, 300 Lb Capacity

44745K81 1 Each Slit Foam Rubber Insulation For Pipe & Tube, 1" Thick, 1-3/8" Insulation Id, 6 Length

Add to this some wide two sided velcro straps, and a boat cart. The boat cart is sold on ebay as an instep cc100, but it goes by other names elsewhere. That appears to be the cheapest version though. A solid cart on its own.