X Y Bediening dc motors h-brug

Hallo allemaal,

Ik ben nieuw hier op het forum en dit is mijn eerste arduino project.
Ik probeer voor mijn project 2 brushed dc motors samen te laten werken vanaf 1 joystick x/y knop.
Het is voor een boot met 2 schroeven,(code voor een robot met 2 wielen oid werkt dus ook prima) als ik naar links stuur met de joystick moet de linker motor achteruit draaien en de rechter naar voren etc.

Ik gebruik:

1x 1L298 Dual H-Bridge Motor driver http://blog.whatgeek.com.pt/arduino/l298-dual-h-bridge-motor-driver/

1x arduino uno

1x battery pack 6v

2x brushed dc motor 5.5v

1x Dual Axis XY Joystick/Biaxial joystick/PS2 game/JoyStick http://www.hobbyelectronica.nl/product/joystick-duo-as/

Ik heb code gevonden die met deze onderdelen zou moeten werken maar als ik "gas" geef hoor ik de motor alleen hoge piep tonen maken.
De pieptonen veranderen als ik de richting van de joystick verander.

De code die ik gebruik is:

/*

  • Switch test program
    */

/*
Changing the PWM frequency on Pins 11 and 3
Setting Divisor Frequency
0x01 1 31250 //should not be able to hear this though the frequency is a little high for the l298
0x02 8 3906.25
0x03 32 976.5625
0x04 64 488.28125 // default
0x05 128 244.140625
0x06 256 122.0703125
0x07 1024 30.517578125 //here is also good..in theroy but may be a little to low for the dc motor
*/

int potx = A0; // analog pin 0, connected to VRx on the joystick board
int poty = A1; // analog pin 1, connected to VRy on the joystick board
// The joystick board 5 volts needs to be connected to the Arduino 5 volts pin
// The joystick board ground needs to be connected to an Arduino ground pin

int motor1 = 3; //Digital pin 3, connected to Enable pin A(ENA) on the L298N
int motor2 = 11; //Digital pin 11, connected to Enable pin B(ENB) on the L298N

int IN1 = 4; //Digital pin 4, connected to IN1 on the L298N
int IN2 = 5; //Digital pin 5, connected to IN2 on the L298N
int IN3 = 6; //Digital pin 6, connected to IN3 on the L298N
int IN4 = 7; //Digital pin 7, connected to IN4 on the L298N
// The L298N ground needs to be connected to an Arduino ground pin.
// In the L298N one DC motor terminals will be connected to OUT1 and OUT2 and the second DC motor to OUT3 and OUT4
// polarity in the motors is determined by the direction that you want for pan and tilt.

int value = 6; //4 being the default giving 488.28125hz

int CenterX = 0;
int CenterY = 0;

void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
pinMode(potx, INPUT);
pinMode(poty, INPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
TCCR2B = (TCCR2B & 0xF8) | value;// change the value of the (Timer 2 pins 11, 3?) register to a value ranging between 1 - 7

CenterX = analogRead(potx); // Get the center x value in the joystick
CenterY = analogRead(poty); // Get the center y value in the joystick

}

int getPotX() {
int v;
v = analogRead(potx);
return v;
}
int getPotY() {
int v;
v = analogRead(poty);
return v;
}

int moveMotorX() {

int ValueX = getPotX();
if( ValueX < CenterX ){
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
ValueX = CenterX - ValueX;
ValueX /= 4;
ValueX = max(ValueX, 0);
ValueX = min(ValueX, 255);
analogWrite(motor1, ValueX);
}
else{
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
ValueX = ValueX - CenterX;
ValueX /= 4;
ValueX = max(ValueX, 0);
ValueX = min(ValueX, 255);
analogWrite(motor1, ValueX);
}
}
int moveMotorY() {

int ValueY = getPotY();
if( ValueY < CenterY ){
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
ValueY = CenterY - ValueY;
ValueY /= 4;
ValueY = max(ValueY, 0);
ValueY = min(ValueY, 255);
analogWrite(motor2, ValueY);
}
else{
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
ValueY = ValueY - CenterY;
ValueY /= 4;
ValueY = max(ValueY, 0);
ValueY = min(ValueY, 255);
analogWrite(motor2, ValueY);
}
}

void loop() // run over and over again
{
moveMotorX();
moveMotorY();
}

heeft iemand misschien een idee wat ik fout doe ?
Ik heb al verschillende PWM frequency's geprobeerd. maar dat leek niet te werken.

Alvast bedankt !

m.v.g.
iggy

Hoi Iggy, en welkom.

De motor is een 5.5 volt type vertelde je, en de batterij is een 6 volt type.
Je gebruikt een analoog circuit met interne dubbele transistoren (Darlington) in zowel de "plus" als de "min" leiding.
Een transistor genereert een spanningsval van ongeveer 0.7 volt.
Das dus 1.4 volt in de plus, en 1.4 volt in de min.
Dan blijft er van de 6 volt dus maar 3.2 volt over, en dat is vermoedelijk wel wat weinig voor de motors.
Weet je ook hoeveel stroom de motors willen verbruiken ?
Das ook wel van belang.

Het eerste wat ik zou doen, is gaan kijken voor een accupack van een 7.2 of 8 volt.
Het hangt af van het type accu op welke waarde je uit zult komen.
Een liPo accupack heeft een spanning van 3.7 volt als ik me niet vergis, en komt dan dus uit op 7.4 voor een paar.
Als je je Arduino ook uit die accu voedt, moet je 'm dan dus op de voedingsstekker aansluiten en niet op de 5 volt aansluiting.

Bedankt voor je reactie MAS3 !

Ik had het ook al met een 9 V geprobeerd, ik heb er nu 8 AA aan hangen en ik meet 10.8 V.
Maar helaas nog steeds geen beweging in de motors.

Ik meet over de output van de h-brug naar de motor 0.04 V als ik de joystick beweeg, en 0 als de joystick neutraal staat. dus de code lijkt te werken maar ik krijg amper spanning naar de motors. ik heb de h-brug en de motors ook getest met een test code die ik ergens vond en alles draait wel. Ik denk dus dat het toch ergens in de code zit.

Hoeveel strooom de motors trekken weet ik niet precies.
Hier heb ik trouwens de code van:
http://ufonv.com/viewtopic.php?f=32&t=3180&p=10071&hilit=dc+motor+arduino#p10071

Alle tips en kritiek zijn welkom.

als eerste even testen of de motoren wel draaien als je ze direct aansluit op de batterij of voeding.
als dat werkt, maak een batterij set voor de motoren dus bijvoorbeeld 7 volt of zo, die gaat dus naar de Vmotor van de L298
ook een batterijset voor de logica dus 6 volt die je op Vin zet
dan sluit je alles aan zoals de bedoeling is.
dan pak je in1 en motor1 en die zet je op 5 Volt.
dan zou de motor moeten gaan draaien, je kiunt ook nog alle andere mogelijkheden proberen.
volgende stap is motor1 en motor2 op 5 volt en dan met de joystick speln. dan moet de motor steeds vol gaan draaien in de goed erichtingen.
als dat zo is dan is het alleen nog een probleem van de PWM., het programma lijkt mij in orde.

Heb je al eens de waarden je naar die motordriver stuurt op de Serial gezet? Ik zou eerst dat eens bekijken. Nu heb je 2 probleem gebieden. Enerzijds de source en anderzijds de elektronica. Ik zou het eerst splitsen. En de software kun je testen door de analogWrites ook naar de Serial te sturen.

De code die je gebruikt is nogal ingewikkeld voor een eerste projectje.

Er word heel veel heen en weer gesprongen waardoor als je dat niet precies volgt, je de hele code niet kunt volgen.
Dus de vraag of je die code een beetje snapt is wel op z'n plaats.
Die site waar je 'm vandaan hebt komt nou niet bepaald over als een site die is gericht op een serieus stukje leren, maar lijkt meer "instructables", en das nou niet bepaald een positieve opmerking als ik 'm maak (ik haat die laatstgenoemde site, en daar laat ik het nu even bij).

Verder word er gekeken waar tijdens het opstarten je joysticks staan, en aangenomen dat dat het exacte nulpunt is (wat meestal ook wel zal kloppen).
Vervolgens word er gekeken of je joystick een richting op gaat ten opzichte van dat nulpunt.
Hoe groter die richting, des te sneller zal de motor worden aangestuurd.
Als de joystick niet in die ene richting van daarnet stond, dan moet is dus in de andere richting staan, en word er de andere kant op gestuurd.
Er zit wel een berekening in die op nul uit kan komen waardoor op de midden positie niet gestuurd zal worden, maar daar zit geen dood punt in.
Dus een kleine afwijking zal toch tot een stuurcommando leiden (ook al is dat een wel erg klein commando).
Aangezien er dan wel een heel lage snelheid aangestuurd zou worden, is het maar de vraag of de motoren dan überhaupt wel in beweging zouden komen.
Maar hé, is dat niet precies het probleem dat je hebt ?
Het zou wel interessant zijn om er achter te komen of je potmeters correct ingelezen worden.

Ik heb daarom een aantal vragen voor je:

Snap je de code die je gebruikt (ook al is het maar een beetje) ?
Je joystick is toch wel een versie met potmeters ?
Hoe heb je die potmeters aangesloten ?

Omdat je zegt dat de motor draait met een andere test code, ga ik er van uit dat je de motor en de L298 correct hebt aangesloten (die testcode laat de motor draaien zonder enige input, right ?).

Als die 9 volt zo'n 6f22 blokbatterij is, moet je die maar gelijk weer vergeten.
De capaciteit van die dingen is zo laag dat je die nauwelijks kunt gebruiken met een Arduino, en al zeker niet als je er een motorje mee wil aansturen.

Uiteraard kun je laten zien wat de waarde van je potmeters zijn.
Daar zijn verschillende mogelijkheden voor, zoals die waarde weergeven met een LED (helderheid), op een displaytje of via de seriële poort naar je PC sturen.
Maar dan moet je voor die test dus wel de code wat aanpassen.

Bedankt allemaal voor de reacties !

Ik heb het nu enigszins werkend op 12v en de motoren draaien !
Het draait nu op een 12v adapter van 1A.
Blijkbaar toch te weinig spanning zoals MAS3 al zei ;D

Om antwoord te geven op de vragen:
Ik snap de code een beetje. ik zou het zelf niet kunnen schrijven maar ik kan het voor 80% lezen en begrijpen.
De test code werkt inderdaad zonder input en stuurt gewoon vaste waardes uit.
De potmeter zit op A0 en A1 van arduino voor de x en y as.
Drukknop van de joystick is niet aangesloten.

Nu heb ik wel 1 klein probleempje nog.

Wil de stuur richting kloppen dan moet de potmeter diagonaal staan.
Dus wil ik naar voren sturen dan stuur ik naar links boven
naar achteren sturen = rechts onder
links = links onder
rechts = rechtboven

Ik zou natuurlijk de potmeter diagonaal kunnen monteren in de controller maar ik vroeg me af of iemand hier een oplossing voor ziet.
Ik heb al gezocht in google maar kon niks nuttigs vinden.

Ja dit is logisch.

De code is voor een pan en tilt oplossing.
Das om een camera naar links en rechts of boven en onder te laten draaien.

Jij geeft aan dat je de beide schroeven van je vaartuig elk met een richting wil aansturen.
Dus dan moet je inderdaad je joystick twee richtingen gelijktijdig sturen.
Om dit te veranderen kun je inderdaad je joystick verkeerd monteren, maar je kunt ook je programma aanpassen.
Dan moet je dus niet direct de waarde van de potmeters naar de aandrijving sturen, maar eerst gaan omrekenen wat de stand van je beide potmeters moet betekenen voor de draaisnelheid van je schroeven.
Ik kan je niet zomaar even vertellen hoe je dat kunt uitrekenen, das ook voor mij nog wel een uitdaging.

Je kunt ook 2 joysticks gebruiken die je dus in de respectievelijk stand moet zetten.

Maar ik denk dat het leuker en heel interessant is om het een en ander te berekenen.

Overigens is het sturen door te wringen met de schroeven (wat jij dus wil doen) meestal niet heel erg effectief (in tegenstelling tot het sturen met een rupsvoertuig).

Oh ja tuurlijk, x en y zijn 2 losse motors in deze code .. stom van me.

toch begrijp ik niet helemaal waarom er niks gebeurt als ik alleen x of y uitstuur.
pas als ik x en y tegelijk uitstuur gaat de motor aan, vervolgens kan ik door de joystick te bewegen wel alleen x of y aan sturen.

dus ik kan naar voren sturen en vervolgens naar links voor.
maar niet meteen naar links voor, dan gaan de motors niet aan.

richtingen voor achter links en rechts werken meteen.
linksvoor rechtsvoor linkachter linksvoor werken pas als de motoren al draaien.

Ik vermoed dat dit iets met de enable op de h-brug te maken heeft.

in ieder geval ga ik de joystick gewoon diagonaal monteren in de behuizing.
dit scheelt me een hoop tijd en tijd heb ik weinig als werkend student.

ik kies voor een dubbelschroef systeem zodat ik kan draaien om de as.
de schroeven zitten aan de boorden van het vaartuig voor maximale arm.
misschien dat ik dit later nog vervang door een azipod aangezien dit een beter rendement geeft.
het liefst zou ik voith schneider gebruiken maar dit kost me te veel geld.
voortstuwings berekeningen en stabiliteit maak ik me geen zorgen om ik ben scheepsbouwkundige van opleiding.

mocht iemand nog weten waarom de pot niks doet in de diagonale richtingen (van uit neutrale stand) dan hoor ik het graag !

in ieder geval bedankt voor alle hulp tot nu toe !

het programma wat jij hebt is inderdaad voor lins rechts voor en achter.
de software is simpel aan te passen hoor, Y is voor en achteruit van beide motoren.
de X is hoeveel de linkermotor harder moet lopen .
gewoon de regels een beetje aanpassen.
schuin zetten kan ook hoor.

Azipod geeft echt een veel beter rendement, dat klopt.
Het vereist dan wel ook 2 keer aansturen per pod, 1 keer voor de richting en 1 keer voor het toerental.

Dat heb je ook met Voith Schneider, maar het grote voordeel daarbij is dat je onmiddellijk de aandrijving en de spoed in de goede richting krijgt, waar je bij een azipod moet wachten tot de pod naar die richting is gedraaid.
VSP (Voith Schneider Propeller) is een heel ingenieus en efficiënt systeem.
Het aanschaffen van zo'n systeempje voor modelbouw (ik ken het van Graupner, geen idee of dat nog bestaat), is een kostbare zaak.
Maar heel lang geleden heb ik er ook al eens een bouwtekening voor gezien in een Duits modelbouw blad.
Dan moet je het nog steeds wel ff maken, maar kun je het ook zo dimensioneren dat het precies past en heb je er naast het bouwplezier ook een stuk minder kosten aan.

Ik heb je code nog maar eens bekeken, en kan in die code niets zien wat je probleem met X of Y ten opzichte van X en Y niet verklaren aan de hand van de code (maar ik kan het ook gewoon gemist hebben).
Ik raad je daarom aan om nog maar eens te controleren of je het allemaal wel goed bedraad hebt.
Zitten pins 4,5, 6 en 7 van je Arduino op de juiste pins van je motorshield c.q. L298 aangesloten ?
Als daar iets gekruisd zit krijg je ook zulke problemen.

MAS3:
Ik heb je code nog maar eens bekeken, en kan in die code niets zien wat je probleem met X of Y ten opzichte van X en Y niet verklaren aan de hand van de code (maar ik kan het ook gewoon gemist hebben).
Ik raad je daarom aan om nog maar eens te controleren of je het allemaal wel goed bedraad hebt.
Zitten pins 4,5, 6 en 7 van je Arduino op de juiste pins van je motorshield c.q. L298 aangesloten ?
Als daar iets gekruisd zit krijg je ook zulke problemen.

+1.

 /*
 * Switch test program
 */
 
 /*
Changing the PWM frequency on Pins 11 and 3
Setting   Divisor   Frequency
0x01   1   31250  //should not be able to hear this though the frequency is a little high for the l298
0x02   8   3906.25
0x03   32   976.5625
0x04   64   488.28125 // default
0x05   128   244.140625
0x06   256   122.0703125
0x07   1024   30.517578125 //here is also good..in theory but may be a little to low for the dc motor
*/


int potx = A0; // analog pin 0, connected to VRx on the joystick board
int poty = A1; // analog pin 1, connected to VRy on the joystick board
// The joystick board 5 volts needs to be connected to the Arduino 5 volts pin
// The joystick board ground needs to be connected to an Arduino ground pin

int motor1 = 3; //Digital pin 3, connected to Enable pin A(ENA) on the L298N
int motor2 = 11; //Digital pin 11, connected to Enable pin B(ENB) on the L298N

int IN1 = 4; //Digital pin 4, connected to IN1 on the L298N
int IN2 = 5; //Digital pin 5, connected to IN2 on the L298N
int IN3 = 6; //Digital pin 6, connected to IN3 on the L298N
int IN4 = 7; //Digital pin 7, connected to IN4 on the L298N
// The L298N ground needs to be connected to an Arduino ground pin.
// In the L298N one DC motor terminals will be connected to OUT1 and OUT2 and the second DC motor to OUT3 and OUT4
// polarity in the motors is determined by the direction that you want for pan and tilt.

int value = 6; //4 being the default giving  488.28125hz

int CenterX = 0;
int CenterY = 0;

void setup()                    // run once, when the sketch starts
{
  Serial.begin(9600);           // set up Serial library at 9600 bps
  pinMode(potx, INPUT);
  pinMode(poty, INPUT);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  TCCR2B = (TCCR2B & 0xF8) | value;// change the value of the (Timer 2 pins 11, 3?) register to a value ranging between 1 - 7
 
  CenterX = analogRead(potx); // Get the center x value in the joystick
  CenterY = analogRead(poty); // Get the center y value in the joystick

}

int getPotX() {
  int v;
  v = analogRead(potx);
  return v;
}
int getPotY() {
  int v;
  v = analogRead(poty);
  return v;
}

int moveMotorL() {
 // linker motor
// PotY-CenterY+PotX-CenterX
// if value < 0 dan motor achteruit

/*  int ValueX = getPotX();
  if( ValueX < CenterX ){
    digitalWrite (IN1, HIGH);
    digitalWrite (IN2, LOW);
    ValueX = CenterX - ValueX;
*/    ValueX /= 4;
    ValueX = max(ValueX, 0);
    ValueX = min(ValueX, 255);
    analogWrite(motor1, ValueX);
  }
  else{
    digitalWrite (IN1, LOW);
    digitalWrite (IN2, HIGH);
    ValueX = ValueX - CenterX;
    ValueX /= 4;
    ValueX = max(ValueX, 0);
    ValueX = min(ValueX, 255);
    analogWrite(motor1, ValueX);
  }
}
int moveMotorR() {
 // rechtermotor poty-centery+centerx-potx

  int ValueY = getPotY();
  if( ValueY < CenterY ){
    digitalWrite (IN3, HIGH);
    digitalWrite (IN4, LOW);
    ValueY = CenterY - ValueY;
    ValueY /= 4;
    ValueY = max(ValueY, 0);
    ValueY = min(ValueY, 255);
    analogWrite(motor2, ValueY);
  }
  else{
    digitalWrite (IN3, LOW);
    digitalWrite (IN4, HIGH);
    ValueY = ValueY - CenterY;
    ValueY /= 4;
    ValueY = max(ValueY, 0);
    ValueY = min(ValueY, 255);
    analogWrite(motor2, ValueY);
  }
}

void loop()                     // run over and over again
{
  moveMotorX();
  moveMotorY();
}

de berekeningen moeten dan iets anders worden (zoals delen door 2) en de waarden ABS maken.
maar ga niet alles vertellen.

Het grote voordeel van Voith is dat zowel de richting als vermogen met een heel klein motortje gedaan worden en er dus geen grote vermogensregeling nodig is. Helpt natuurlijk ook om lekker snel te kunnen sturen, Je kunt er gewoon mee dansen een wals is te doen disco niet.