Tiller Pilot for Yacht
Project using Arduino to steer a full-size boat on a compass heading.
Components and supplies
1
Jumper wires (generic)
1
Relay (generic)
3
Button
1
Resistor 220 ohm
1
Resistor 221 ohm
1
Breadboard (generic)
1
Arduino UNO
1
LSM303 Compass Board
Project description
Code
TillerPilot_V05
arduino
1//TillerPilot 04/05/2019 2//Buttons wired to A8 A9 and A10 3//LED wired D5 4//Relay wired from IN1 to A0 and IN2 to A1 5//Compass SDA to A4 & SCL to A5 6#include <Wire.h> 7#include <Adafruit_Sensor.h> 8#include <Adafruit_LSM303_U.h> 9Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345); 10const int B_Port = 8; 11const int B_Lock = 9; 12const int B_Star = 10; 13int Heading; 14int Course; 15int Val_01 = 0; 16int Val_02 = 0; 17int Tillerpilot_off = 0; 18int B_State = 0; 19int R_Port = A0; 20int R_Star = A1; 21int LED_Port = 13; 22int LED_Lock = 5; 23int LED_Star = 12; 24void setup() 25{ 26Serial.begin(9600); 27if(!mag.begin()) 28 { 29 while(1); 30 } 31 pinMode(B_Port, INPUT_PULLUP); 32 pinMode(B_Lock, INPUT_PULLUP); 33 pinMode(B_Star, INPUT_PULLUP); 34 pinMode(LED_Port, OUTPUT); 35 pinMode(LED_Lock, OUTPUT); 36 pinMode(LED_Star, OUTPUT); 37 pinMode(R_Port, OUTPUT); 38 pinMode(R_Star, OUTPUT); 39 digitalWrite(R_Port, HIGH); 40 digitalWrite(R_Star, HIGH); 41 digitalWrite(LED_Port, HIGH); 42 digitalWrite(LED_Lock, HIGH); 43 digitalWrite(LED_Star, HIGH); 44} 45void loop() 46{ 47//Tillerpilot in standby mode 48Val_01 = digitalRead(B_Lock); 49if(Val_01 == HIGH && Tillerpilot_off == LOW) 50 { 51 B_State = 1-B_State; // Debound Button 52 delay(1); 53 } 54Tillerpilot_off = Val_01; 55if(B_State == HIGH) 56 { 57 //Flash ON/OFF Lock LED 58 digitalWrite(LED_Lock, HIGH); 59 delay(250); 60 digitalWrite(LED_Lock, LOW); 61 delay(250); 62 { 63 if (digitalRead(B_Port) == LOW) 64 digitalWrite(R_Port, LOW); 65 digitalWrite(LED_Port, HIGH); 66 } 67 { 68 if (digitalRead(B_Star) == LOW) 69 digitalWrite(R_Star, LOW); 70 digitalWrite(LED_Star, HIGH); 71 } 72 delay (250); 73 digitalWrite(R_Port, HIGH); 74 digitalWrite(LED_Port, LOW); 75 digitalWrite(R_Star, HIGH); 76 digitalWrite(LED_Star, LOW); 77 Val_02 = 0; 78 } 79else 80 { 81 //Tillerpilot in steering mode 82 //Lock LED continuous ON 83 digitalWrite(LED_Lock, HIGH); 84 delay(1); 85 Serial.print("Course: ");Serial.print(Course);Serial.print(" "); 86 sensors_event_t event; 87 mag.getEvent(&event); 88 float Pi = 3.14159; 89 int Heading = (atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi; 90 { 91 if (Heading < 0) 92 Heading = 360 + Heading; 93 } 94 Serial.print("Heading: "); Serial.println(Heading); 95 if (Course +3 <= Heading)digitalWrite(R_Port, LOW); digitalWrite(LED_Port, HIGH); 96 if (Course -3 >= Heading)digitalWrite(R_Star, LOW); digitalWrite(LED_Star, HIGH); 97 { 98 if (Val_02 == 0) 99 Course = Heading; 100 Val_02 = (Val_02 +1); 101 } 102 { 103 if (digitalRead(B_Port) == LOW) 104 Course = (Course - 1); 105 } 106 { 107 if (Course < 0) 108 Course = 360 + Course; 109 } 110 { 111 if (Course > 360) 112 Course = Course - 360; 113 } 114 { 115 if (digitalRead(B_Star) == LOW) 116 Course = (Course + 1); 117 } 118 delay (250); 119 digitalWrite(R_Port, HIGH); 120 digitalWrite(LED_Port, LOW); 121 digitalWrite(R_Star, HIGH); 122 digitalWrite(LED_Star, LOW); 123 } 124}
TillerPilot_V05
arduino
1//TillerPilot 04/05/2019 2//Buttons wired to A8 A9 and A10 3//LED 4 wired D5 5//Relay wired from IN1 to A0 and IN2 to A1 6//Compass SDA to A4 & 7 SCL to A5 8#include <Wire.h> 9#include <Adafruit_Sensor.h> 10#include <Adafruit_LSM303_U.h> 11Adafruit_LSM303_Mag_Unified 12 mag = Adafruit_LSM303_Mag_Unified(12345); 13const int B_Port = 8; 14const int 15 B_Lock = 9; 16const int B_Star = 10; 17int Heading; 18int Course; 19int Val_01 20 = 0; 21int Val_02 = 0; 22int Tillerpilot_off = 0; 23int B_State = 0; 24int R_Port 25 = A0; 26int R_Star = A1; 27int LED_Port = 13; 28int LED_Lock = 5; 29int LED_Star 30 = 12; 31void setup() 32{ 33Serial.begin(9600); 34if(!mag.begin()) 35 { 36 37 while(1); 38 } 39 pinMode(B_Port, INPUT_PULLUP); 40 pinMode(B_Lock, INPUT_PULLUP); 41 42 pinMode(B_Star, INPUT_PULLUP); 43 pinMode(LED_Port, OUTPUT); 44 pinMode(LED_Lock, 45 OUTPUT); 46 pinMode(LED_Star, OUTPUT); 47 pinMode(R_Port, OUTPUT); 48 pinMode(R_Star, 49 OUTPUT); 50 digitalWrite(R_Port, HIGH); 51 digitalWrite(R_Star, HIGH); 52 digitalWrite(LED_Port, 53 HIGH); 54 digitalWrite(LED_Lock, HIGH); 55 digitalWrite(LED_Star, HIGH); 56} 57void 58 loop() 59{ 60//Tillerpilot in standby mode 61Val_01 = digitalRead(B_Lock); 62if(Val_01 63 == HIGH && Tillerpilot_off == LOW) 64 { 65 B_State = 1-B_State; // Debound Button 66 67 delay(1); 68 } 69Tillerpilot_off = Val_01; 70if(B_State == HIGH) 71 { 72 73 //Flash ON/OFF Lock LED 74 digitalWrite(LED_Lock, HIGH); 75 delay(250); 76 77 digitalWrite(LED_Lock, LOW); 78 delay(250); 79 { 80 if (digitalRead(B_Port) 81 == LOW) 82 digitalWrite(R_Port, LOW); 83 digitalWrite(LED_Port, HIGH); 84 85 } 86 { 87 if (digitalRead(B_Star) == LOW) 88 digitalWrite(R_Star, 89 LOW); 90 digitalWrite(LED_Star, HIGH); 91 } 92 delay (250); 93 digitalWrite(R_Port, 94 HIGH); 95 digitalWrite(LED_Port, LOW); 96 digitalWrite(R_Star, HIGH); 97 digitalWrite(LED_Star, 98 LOW); 99 Val_02 = 0; 100 } 101else 102 { 103 //Tillerpilot in steering mode 104 105 //Lock LED continuous ON 106 digitalWrite(LED_Lock, HIGH); 107 delay(1); 108 109 Serial.print("Course: ");Serial.print(Course);Serial.print(" "); 110 sensors_event_t 111 event; 112 mag.getEvent(&event); 113 float Pi = 3.14159; 114 int Heading = (atan2(event.magnetic.y,event.magnetic.x) 115 * 180) / Pi; 116 { 117 if (Heading < 0) 118 Heading = 360 + Heading; 119 } 120 121 Serial.print("Heading: "); Serial.println(Heading); 122 if (Course +3 <= Heading)digitalWrite(R_Port, 123 LOW); digitalWrite(LED_Port, HIGH); 124 if (Course -3 >= Heading)digitalWrite(R_Star, 125 LOW); digitalWrite(LED_Star, HIGH); 126 { 127 if (Val_02 == 0) 128 Course 129 = Heading; 130 Val_02 = (Val_02 +1); 131 } 132 { 133 if (digitalRead(B_Port) 134 == LOW) 135 Course = (Course - 1); 136 } 137 { 138 if (Course < 0) 139 140 Course = 360 + Course; 141 } 142 { 143 if (Course > 360) 144 Course 145 = Course - 360; 146 } 147 { 148 if (digitalRead(B_Star) == LOW) 149 Course 150 = (Course + 1); 151 } 152 delay (250); 153 digitalWrite(R_Port, HIGH); 154 digitalWrite(LED_Port, 155 LOW); 156 digitalWrite(R_Star, HIGH); 157 digitalWrite(LED_Star, LOW); 158 } 159}
Downloadable files
Tiller Pilot Schematic
Tiller Pilot Schematic

Tiller Pilot Schematic
Tiller Pilot Schematic

Tiller Pilot Schematic
Tiller Pilot Schematic

Comments
Only logged in users can leave comments