Stuurautomaat Arduino

Al een tijd terug zo rond 2008 was ik aan het varen op de boot van mijn ouders (ONJ spurt van 1972). Op het voordek lag het ankertouw niet goed en wilde dat even oppakken en opbergen. Heel vervelend, een stuurautomaat zou toch wel handig zijn, en dan met een draadloze afstandbediening dat zou perfect zijn. Maarja, de boot heeft kabelbediening en voor die eene keer een stuurautomaat aan te schaffen…

Zo zijn er een paar seizoenen voorbij gegaan. Elk seizoen had ik een paar keer het idee om een stuurautomaat te gaan installeren.

Ik zat steeds op de wip, een stuurautomaatsysteem kopen en de kabelbesturing vervangen door hydrauliek. Ik ben al een tijdje aan het prutsen met een Arduino. Na een paar projectjes met de Arduino dacht ik hee:
Arduino+kompas module+H-brug+joystick+hydraulische pomp=stuurautomaat.
Moet lukken toch, er zijn vast meer met dit idee.

Dit jaar is het dan zo ver, ik ga een stuurautomaat in de boot zetten. Als eerste moet de oude kabelbesturing worden vervangen door hydraulische leidingen. Ook moet er een stuurwiel-pomp (met terugslagkleppen) komen, met een nieuw stuur. En natuurlijk een hydraulisch stuur-cilinder. Alles moet dus nieuw en nieuw geplaatst worden. Maar in de tussentijd kan ik deze winter mooi werken aan de stuurautomaat. Een Raymarine hydraulische pomp, die had ik al -_-

Hoofdzaak, het mag niets kosten, dat is het doel van deze actie.

20130922 Wat wil ik eigenlijk

Als eerste minimale toepassing wil ik de hydraulische pomp kunnen bedienen met een joystick. En die moet proportioneel aangestuurd worden. De keuze voor een joystick is de nunchuck van een Wii, ideaal. Deze heeft 2 knoppen voor de bediening voor de stuurautomaat en een joystick. En als klap op de vuurpijl: hij is er ook draadloos!
Als tweede toepassing moet hij kunnen sturen op een kompas koers. Hiervoor is een kompasmodule beschikbaar. Met PID moet dat in combinatie met Arduino niet al te moeilijk zijn.

  • Status 1: uit
  • Status 2: joystick sturen (C-button)
  • Status 3: compas sturen (Z-button)

Voordat ik verder ga met het bestellen van de onderdelen, eerst denken en de eerste flowcharts maken:

Zelfbouw stuurautomaat met ArduinoGehele PDF van de Flowchart1: Stuurautomaat met Arduino flowchart1

20130827 Software geraamte maken

Stuurautomaat met Arduino nunchuckAP_nunchuckwerkend_joystick (ino-file)
Als eerste ben ik begonnen met een stukje code te schrijven voor de nunchuck, internet staat er vol mee en was geen probleem. Het enige dat je nodig hebt is een PCB-connector die je op een breadboard kan prikken. Zonder deze zou je de kabel van de nunchuck moeten doorknippen, dat wordt ruzie met de familie.  Deze komt later in een procedure. Overigens heb ik een originele nunchuck in gebruik. De draadloze nunchuck die ik in China had besteld werkt prima, maar die is niet zo nauwkeurig als de orignele, zeker bij het nulpunt van de joystick. Als alles werkt, dan koop ik een originele Wii draadloze nunchuck aan.

Stuurautomaat met Arduino nunchuck en statusNu de code voor de verschillende statussen maken. Om de status zichtbaar te maken zijn er LEDs op geplaatst. Het activeren van status kan mooi met de twee buttons op de nunchuck (button C+Z). Je kan de onderstaande code openen, maar dit is een versie die niet echt netjes is:
Stuurautomaat met Arduino AP004 (ino-file)
In dit geraamte is het nu mogelijk met de nunchuck C+Z button de status te veranderen (en de LEDs)

20130910 nunchuck-function + Buzzer + PWM output op LED

Stuurautomaat met Arduino AP008
Een paar versies verder, en de code is iets opgeruimd, en er wordt gebruik gemaakt van #include <nunchuck_funcs.h> Dat leest een stuk beter. Daarnaast is het nu mogelijk om met de Joystick op de nunchuck (als de status Joysteer is) een rode en groene LED met PWM te laten branden. Dat is mooi, want ik wacht nu op de H-brug, en die heeft alleen een PWM-input nodig en een draairichting.

Met “mapping” is het nu heel simpel om de 1024 waarde die uit de nunchuck komt aan te bieden op de PWM waarde van 255. Om er zeker van te zijn dat de waarde van de joystick niet boven 255 komt is er een hysterese bij op geteld (of afgetrokken) hieronder de code, het stelt eigenlijk niet veel voor.

// Joystick is naar links
  if (nunchuck_joyx() <= (JoyCenter – JoyHys)){
   PumpDir = 0;          // Draairichting Hydro pomp 0=links 1= rechts
   MotorPWMlinks = map(nunchuck_joyx(),  JoyCenter , JoyMaxLinks, 0, 255);
   analogWrite(LEDlinksaf, MotorPWMlinks);  // Zet LED linksLED aan

  }else{
   digitalWrite(LEDlinksaf, LOW);  // Zet LED linksLED uit
   MotorPWMlinks = 0;
  }
 
// Joystick is naar rechts
  if (nunchuck_joyx() >= (JoyCenter + JoyHys)){
   PumpDir = 1;          // Draairichting Hydro pomp 0=links 1= rechts
   MotorPWMrechts = map(nunchuck_joyx(),  JoyCenter , JoyMaxRechts, 0, 255);
   analogWrite(LEDrechtsaf, MotorPWMrechts);  // Zet LED rechtsafLED aan
  }else{
   digitalWrite(LEDrechtsaf, LOW);  // Zet LED rechtsaf LED uit  
   MotorPWMrechts = 0;
  }

20131013 Roerstandgever toegevoegd

Stuurautomaat met Arduino GP2D120Stuurautomaat met Arduino AP009 (ino-file)
Ik zou het eerst niet gaan toevoegen, maar toch gedaan. Maar hoe, met een POD-meter aan een stangetje? Kan, maar door een tip van Peter is de keuze een IR module GP2D120. Dit is een afstandmeter tot 30 centimeter, perfect. De code is simpel.
Maar als het roer te ver is, dan stopt de PWM naar de motor –> RudderRef(). Dus naar beide kanten, hier kan je dus niets mee de oplossing is om de richting van de roerstand mee te geven, zodat je wel terug kan sturen, maar niet verder het roer het vlak in drukken. (dit zit pas vanaf 014 in de code)

Fout:

// Joystick is naar links
  if (RudderRef() & nunchuck_joyx() <= (JoyCenter – JoyHys)){
   PumpDir = 0;          // Draairichting Hydro pomp 0=links 1= rechts
   MotorPWMlinks = map(nunchuck_joyx(),  JoyCenter , JoyMaxLinks, 0, 255);
   analogWrite(LEDlinksafPin, MotorPWMlinks);  // Zet LED linksLED aan

  }else{
   analogWrite(LEDlinksafPin, 0);  // Zet LED linksLED uit
   MotorPWMlinks = 0;
  }
 
Prima:

// Joystick is naar links
  if (RudderRef()!=3 & nunchuck_joyx() <= (JoyCenter – JoyHys)){  // Als RudderRef() roer links te ver gaat, dan stoppen, maar hij moet
                                                                  // ook weer terug daarom 3 status voor rechts wel draaien
   PumpDir = 0;          // Draairichting Hydro pomp 0=links 1= rechts
   digitalWrite(PumpDirPin, PumpDir);
   MotorPWMlinks = map(nunchuck_joyx(),  JoyCenter , JoyMaxLinks, 10, 255);
   analogWrite(LEDlinksafPin, MotorPWMlinks);  // Stuur LED linksLED met PWM waarde aan
   analogWrite(MotorPWMpin, MotorPWMlinks);  // Stuur H-brug met PWM waarde
   analogWrite(LEDrechtsafPin, 0);  // Stuur LED rechtsLED uit
  } else     
// Joystick is naar rechts
   if (RudderRef()!=2 & nunchuck_joyx() >= (JoyCenter + JoyHys)){  // Als roer te ver naar rechts gaat, dan stoppen, maar linksom pomp wel draaien
   PumpDir = 1;          // Draairichting Hydro pomp 0=links 1= rechts
   digitalWrite(PumpDirPin, PumpDir);
   MotorPWMrechts = map(nunchuck_joyx(),  JoyCenter , JoyMaxRechts, 10, 255);
   analogWrite(LEDrechtsafPin, MotorPWMrechts);  // Stuur LED rechtsLED met PWM waarde aan
   analogWrite(MotorPWMpin, MotorPWMrechts);  // Stuur H-brug met PWM waarde
   analogWrite(LEDlinksafPin, 0);  // Stuur LED rechtsLED uit
  } else {
//Serial.print(” -Joystick in hysterese- “);
   PumpDir = 0;          // Draairichting Hydro pomp 0=links 1= rechts
   digitalWrite(PumpDirPin, PumpDir);
   analogWrite(MotorPWMpin, 0);  // Stuur H-brug met PWM waarde 0
   analogWrite(LEDrechtsafPin, 0);  // Stuur LED rechtsLED uit
   analogWrite(LEDlinksafPin, 0);  // Stuur LED linksLED uit
  }

20131023 kompas module toegevoegd

Stuurautomaat met Arduino GY-273 HMC5883LStuurautomaat met Arduino AP011 (ino-file)
Eindelijk het kompasmudule binnengekregen GY-273 HMC5883L (van dealextreme overigens, deze werkt, ideaal om mee te testen) het is een niet gestabiliseerde versie en kost 4,50 dollar, nou dat is niet veel. Maar het lijkt er ook op dat de module echt een gestabiliseerde versie moet zijn, maar goed eerst hier maar mee experimenteren.
Met de #include <HMC5883L.h> en de I2C aangesloten, is het vrij eenvoudig om de waarden vanuit de module te printen in de tekstbox. Meer doet hij nog niet.

20131021 H-brug aansluiten

Stuurautomaat met Arduino HG7881Ik moest heel erg lang wachten op de ‘dikke’ H-brug, maar wilde toch verder. Dus heb ik maar even een kleine H-brug gebruikt om te testen. HG7881 Two-Channel Motor Driver Board. Het vreemde van de aansturing voor deze module is dat linksom van 255-0 gaat en rechtsom 0-255, en je toch moet je de richting opgeven. Wel weer veel geleerd, weer niet veel werk omdat de LEDs al PWM kregen. Aansluiten, en werken. Ik kan nu de motor links en rechts om laten draaien en dat ook nog proportioneel!

20131108 de dikke H-brug is er

Stuurautomaat met Arduino 240W H-bridgeStuurautomaat met Arduino AP014 (ino-file)
Eindelijk hij is er voor 13.80 dollar een 240 Watt H-brug, gevonden op aliexpress.com soms gaat het wel eens fout en krijg je niets maar deze (na een maand) kwam toch binnen. De module kan 240Watt hebben, laat dat de helft zijn 120Watt. Dat delen door 12-14V is 10 Ampere, ik denk dat dat ongeveer door een hydraulische pomp Type1 gaat bij gewoon gebruik… Hoop ik, anders wordt het een lichtje….
Er zit ook een SPI interface op, hier zouden diagnostische waarde uit komen. Zoals Amperage, status, etc dat ga ik later eens onderzoeken.
Het gedeelte voor het sturen met de joystick is nu compleet. Dus als je een hydraulische pomp aan boord hebt, en je hebt een adruino+nunchuck dan kan je al sturen met een nunchuck : o )

Tijd voor een filmpje:

20140110 PID met compas

Stuurautomaat met Arduino AP018 (ino-file)
Nou hier gaan we, PID. Ik heb zowat alle YouTube filmpjes gezien over PID, ik heb de meest idiote berekeningen gezien. Erg veel is er te vinden toch is het niet super ingewikkeld. Op het instellen van de 3 variabelen als de boot weer in het water is na.
De Adruno heeft een library die #include <PID_v1.h> heet. Je stopt er een doel-waarde en een actuele-waarde in (de kompaswaarde) en er komt een PWM waarde uit.

Onbegrijpelijke formules PID:
http://nl.wikipedia.org/wiki/PID-regelaar

In het kort PID zoals ik het zie:
Je hebt een gewenste waarde bijvoorbeeld 120 graden, dat wil je altijd zo houden. Als de actuele waard (die je meet) 115 graden is, dan wil je iets aansturen om weer op de 120 te komen. In dit geval een hydraulische pomp aangestuurd met een H-brug die met PWM wordt aangestuurd.
Om terug te komen naar de gewenste waarde van 120 graden kan je de pomp 100% linksom laten draaien óf omdat hij al in de buurt is rustig (met PWM) linksom laten draaien. Ik heb gekozen voor PWM omdat dat stiller is (hoewel je erg duidelijk de elektromotor hoort zingen op de PWM).
Door gebruik te maken van P, I en D kan je bepalen hoe snel en hoe lang de pomp moet gaan draaien. In dit geval is de P het verschil 120-115 = -5 graden, dat is behoorlijk veel en zal de pomp met 60-80% worden aangestuurd. Maar als het te lang gaat duren dan gaat de I de vorige waarden meetellen en zien dat het te lang duurt, dus komt dat er bij op en zal de pomp 80-90% worden aangestuurd. Dit is al voldoende om een stuurautomaat te maken. Maar omdat de PID-functie van Arduino hem toch heeft gebruik ik de ook D. Deze kijkt hoe snel de fout (dus de 5 graden) is ontstaan. Als die snel is ontstaan dan wordt de pomp hysterischer aangestuurd.
Als je nu deze P+I+D optelt, dan heb je een (fout)waarde die je in de H-brug stopt. Je kan deze waarden van PID calibreren met Kp, Ki en Kd. Dit is het meeste werk, en kan alleen als de boot in het water ligt.

  • P = Proportioneel, geeft het verschil in de huidige waarde en de waarde die je wilt hebben en wordt eventueel versterkt met Kp. Heb je een koers van 120 graden maar je meet 115, dan is deze waarde -5.
  • I = Integrerend, alle voorgaande waarden worden opgeteld, hiermee kan je bepalen of het te lang duurt. Deze waarde kan je beïnvloeden met Ki.
  • D = Differentiërend, als het verschil tussen de wenswaarde en huidige waarde snel veranderd, dan sneller sturen naar de wenswaarde. Deze waarde kan je beïnvloeden met Kd.

PID plaatje voor de arduino stuuratomaat

20140212 stuurautomaat proefopstelling

De stuurautomaat is bijna klaar, alles lijkt te werken. Maar ja ik had alleen maar losse componenten. Om toch een beetje te kunnen zien hoe het nu zal werken ik heb een super simpele opstelling gemaakt die de werking een beetje laat zien inclusief de roerstandgever. Ik had bij dx een motortje gekocht met een flinke vertraging werkelijk super. Alleen hoe nu een hydraulische pomp simuleren. Nou was ik even blij met een kapotte DVD-brander, een mooi snaartje, en tandwielen voor de vertraging.
(Werkelijk ongelooflijk wat we aan goed werkende onderdelen en componenten gewoon weggooien… kan eigenlijk niet)

De stuurautomaat heeft twee standen:

  1. Sturen op de joystick
  2. Sturen op het kompas

In het onderstaande filmpje is te zien hoe de boel werkt in de 2 standen. Nu wachten op mooi weer en de installatie van de hydraulische besturing op de boot.

20140715 Hydraulische besturing plaatsen

Helaas heb ik dit seizoen niet veel tijd gehad, om aan de boot te werken. En er kwam bij dat de huidige kabelbesturing moest worden vervangen door een hydraulische besturing. Ik zal nog een verslagje maken in een ander artikel met de stappen en gevonden drempels.

  kabelbesturing vervangen hydraulisch roer kabelbesturing vervangen hydraulisch stuur kabelbesturing vervangen hydraulisch

20150113 Hydraulische besturing plaatsen

De oude besturing heb ik er uit gehaald, en kwam er al snel achter dat ik op een hele lastige plek ruimte moest maken voor de nieuwe hydraulische leidingen. Ik heb gekozen voor een hydraulische besturing van Vetus.

20170405 Eindelijk weer tijd

Lekker is dat, vorig jaar helemaal niet toe gekomen aan de stuurautomaat alleen maar alle bedrading moeten vervangen en laders, omvormers en natuurlijk de GSM bilge-alarm geplaatst waarmee ik ook de koelkast aan en uit kan zetten met een SMS. Het is tijd voor een stappenplan.

  1. Hydraulische pomp is geplaatst met retour leiding, want dat met een expansievat (je) gaat echt niet werken.
  2. Wens: mooi kastje maken (kan ik alles mee naar huis nemen om te testen)
  3. Het eerste dat anders moet is de roerstandgever, is nu een infrarood afstandmeter, maar dat is toch te gevoelig voor storingen. Dat moet een potmeter worden.
  4. Proefvaren en netjes op de koers kunnen sturen, dat is nog niet helemaal goed gegaan tijdens de laatste proefvaart.
  5. Wens: Nunchuck. Erg leuk meer misschien is een andere bediening wel beter.. Maar wat… (heb je tips?)

3 thoughts on “Stuurautomaat Arduino”

  1. Voor de potentiometer voor de roerstandgever zou je het beste een draadgewonden (5k Bourns bv) kunnen nemen. De Nunchuck zou je kunnen vervangen door een oude android telefoon met daarop Virtuino of Droidscript. Als je dan de Arduino vervangt door een ESP8266 dan kun je alles aansturen (en terugontvangen) via WiFi. Het is maar een idee.

    Ik heb verder je project met veel plezier gelezen. Wat ik overigens niet gevonden heb is de laatste INO file AP018. De link ernaar geeft AP016. Zou je me (de link naar) de laatste versie kunnen sturen?

    Veel succes verder
    Karl

    1. Hoi Karl, ja komend jaar hoop ik er weer mee bezig te gaan. De potmeter, ja (natuurlijk) die gaat er komen.
      De nunchuck zou iets anders moeten worden, maar bediening via een app weet ik nog niet, goede tip.
      ESP ja die zijn prachtig, een Raspberry pi zou het misschien wel gaan winnen. (of toch lekker simpel op de arduino 🙂

      De link is aangepast.

      Misschien tot komend jaar.

  2. Hoi Karl

    Ik vond het een interessant artikel en speel ook met de gedachte om zoiets te gaan doen voor mijn boot. Waar ik wel aan denk is om de handbediening met een stuurhendel zoals in de binnenvaart gebruikelijk te maken. In de basis is dat een verstelbare potmeter. Bij verstelling word het roer versteld en zodra het roer eenzelfde hoek heeft bereikt als aangegeven op het stuurhendel stopt het roer. ( Stand van het roer wordt teruggekoppeld via de roerstandmelder). Een en ander lijkt een beetje op een servobesturing via een arduino.
    Zal voor m

Leave a Reply to Karl Cancel reply

Your email address will not be published. Required fields are marked *

five × 2 =

This site uses Akismet to reduce spam. Learn how your comment data is processed.