Programma keuze

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 27
Geregistreerd: 05 Mrt 2018, 07:30

Programma keuze

Berichtdoor Arduinouno » 03 Apr 2018, 23:13

Hallo,

Voor een programma heb ik 2 drkknopen, die elke dienen voor een programma te starte, namelijk naar links draaien of naar rechts draaien.

Maar het programma zou eerst de volledige cyclus voor naar rechts te draaien moeten uitvoeren voordat dat de cyclus naar links wordt uitgevoerd, ookal wordt er tijdens de beweging naar rechts al op de drukknop naar links geduwd.

Maar ik vind niet goed met welke voorwaarde ik dit in het programma kan verwerken, dus wet er iemand met welk commanda ik dit kan programmeren?

Advertisement

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Programma keuze

Berichtdoor baco1978 » 03 Apr 2018, 23:36

je kan het oplossen met een IF statement,

als de motor stil staat is het mogelijk, draait de motor dan slaat die de toets-detektie over.
Met vriendelijke groet Arjan

Berichten: 27
Geregistreerd: 05 Mrt 2018, 07:30

Re: Programma keuze

Berichtdoor Arduinouno » 03 Apr 2018, 23:38

Is,inderdaad een mogelijk, maar er moet onthouden worden dat als er tijdens een beweging getriggerd wordt voor een andere beweging dat deze beweging uitgevoerd wordt nadat de eerste beweging gedaan is.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Programma keuze

Berichtdoor Koepel » 04 Apr 2018, 00:19

Kun je het beter beschrijven ?

Continue draaien of slechts één rondje ?
Als iemand op een knop drukt, wil je dan 360 graden draaien en daarna stoppen ?
Of draait het dan continue in die richting ?

Maak de positie uit ?
Gaat het altijd om een volledige cyclus ? Dat het in rust het altijd 0 graden is ?
Stel het staat stil op 180 graden. Wil je dan met een knop een hele 360 graden maken ? of wil je alleen tot 0 graden ?
Kun je de positie aflezen ?

Wat als iemand heel veel op de knoppen drukt ?
Stel iemand drukt op linksom, dan wordt die cyclus uitgevoerd.
Dan drukt iemand op rechtsom (terwijl de cyclus nog bezig is met linksom), dat wil je onthouden.
Maar dan drukt iemand alsnog op linksom.
Je had onthouden om na een volledige cyclus rechtsom te doen.
Wil je dat weggooien, en de laatste knop (linksom) onthouden ? Dus dan worden er twee rondjes linksom gedaan ?

Berichten: 27
Geregistreerd: 05 Mrt 2018, 07:30

Re: Programma keuze

Berichtdoor Arduinouno » 04 Apr 2018, 08:36

Een volledige cyclus bestaat uit 90º draaien en terug naar 0º draaien. En er wordt altijd een volledige cyclus uitgevoerd.

We gaan er van uit dat er eventueel maar 1 keer op de knop voor de andere cyclus geduwd wordt terwijl de andere cyclus loopt.

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Programma keuze

Berichtdoor FPCUser » 04 Apr 2018, 09:54

Ik zit te denken aan een boolean, genaamd vrijgave o.i.d.
Deze voorwaarde opnemen voor beide knoppen.
Zodra een van beide wordt bediend begint de cyclus (links- of rechtsom) en wordt tevens 'vrijgave' geset.
Na afloop van de desbetreffende cyclus wordt 'vrijgave' gereset en programma reageert weer op de knoppen.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Programma keuze

Berichtdoor Koepel » 04 Apr 2018, 10:32

Om te programmeren is het belangrijk om de echte wereld te kunnen beschrijven.
Er van uit gaan dat iets gebeurt, dat kan ik niet programmeren :(

Het eenvoudigste om te programmeren is om de laatste knop te onthouden.

Dus als de motor bezig is, en er wordt heel veel op de knoppen gedrukt, dan wordt de laatste knop onthouden. Is dat goed ?

En als de motor bezig is met linksom draaien, en de knop voor linksom wordt ingedrukt, dan worden er twee cyclus gedaan. Is dat goed ?

Ik heb al wel iets werkend, maar ik weet niet goed hoe ik de motor moet simuleren. Is het een gewone DC motor en kun je de positie aflezen ? of is het een servo motor of stappenmotor ?
Laatst gewijzigd door Koepel op 04 Apr 2018, 10:46, in totaal 1 keer gewijzigd.

Berichten: 27
Geregistreerd: 05 Mrt 2018, 07:30

Re: Programma keuze

Berichtdoor Arduinouno » 04 Apr 2018, 10:45

Dat zou perfect zijn moest me dat lukken

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Programma keuze

Berichtdoor Koepel » 04 Apr 2018, 10:52

Probeer dit eens uit. Je kunt in de seriële monitor een commando geven.

Het is quick en dirty, maar het goede idee zit er wel in. Dus als de motor bezig is, en er komt een commando, dan wordt dat command bewaard. Als de motor weer in rust is, dan wordt gekeken of er nog een commando bewaard was.

Ik heb nu een variabele "commando" en een variabele "bewaarCommando", en ik denk dat het ook met slechts één variabele kan, vanwege de finite state machine. Voor het gemak heb ik toch maar twee variabelen gebruikt.

Let er maar niet op dat de 90 graden twee keer wordt gedaan, en de 0 graden soms drie keer. Dat is een tekortkoming van mijn simulatie van de motor samen met de finite state machine.

cpp code
const int stapgrootte = 10;    // rotatie wijziging in stappen
int positie = 0; // rotatie positie in graden, van -90 tot +90


// De 'state' waarden zijn niet alleen de status van het programma,
// ze worden ook gebruikt voor de commando's.
// Op die manier is dit bijvoorbeeld mogelijk: state = commando;
enum
{
IN_RUST,
LINKSOM,
LINKSOM_TERUG,
RECHTSOM,
RECHTSOM_TERUG,
} state = IN_RUST;

int bewaarCommando = IN_RUST;


void setup()
{
Serial.begin( 9600);
Serial.println();
Serial.println( "Verstuur een r of een l gevolgd door Enter");
}


void loop()
{
// ------------------------------------------
// Haal de binnenkomende gegevens op
// ------------------------------------------

int commando = IN_RUST; // default, geen commando ontvangen.

if( Serial.available())
{
int inChar = Serial.read();
inChar = tolower( inChar);

switch( inChar)
{
case 'l':
commando = LINKSOM;
break;
case 'r':
commando = RECHTSOM;
break;
}
}


// ------------------------------------------
// Verwerk de gegevens
// ------------------------------------------

// Dit is de uitzonderingsregel die voor het gemak buiten de state machine is geplaatst.
// Wanneer de motor bezig is, dan het nieuwe commando even bewaren
if( state != IN_RUST && commando != IN_RUST)
{
bewaarCommando = commando;
commando = IN_RUST;
}

// Dit is de echte finite state machine
switch( state)
{
case IN_RUST:
// Is er niets te doen, maar staat er nog wel een nieuw commando te wachten ?
if( commando == IN_RUST && bewaarCommando != IN_RUST)
{
commando = bewaarCommando;
bewaarCommando = IN_RUST;
}

// Verwerk het commando en start de beweging van de motor.
if( commando != IN_RUST)
{
state = commando;
}
break;
case LINKSOM:
if( positie <= -90)
{
state = LINKSOM_TERUG;
}
else
{
positie -= stapgrootte;
}
break;
case LINKSOM_TERUG:
if( positie >= 0)
{
state = IN_RUST;
}
else
{
positie += stapgrootte;
}
break;
case RECHTSOM:
if( positie >= 90)
{
state = RECHTSOM_TERUG;
}
else
{
positie += stapgrootte;
}
break;
case RECHTSOM_TERUG:
if( positie <= 0)
{
state = IN_RUST;
}
else
{
positie -= stapgrootte;
}
break;
}


// ------------------------------------------
// Het laten zien van het resultaat
// ------------------------------------------

Serial.print( "positie = ");
Serial.print( positie);
Serial.println( " graden");

// ------------------------------------------
// Zomaar een delay.
// Zo dat met de stapgrootte en delay samen het er aardig uit ziet.
// ------------------------------------------

delay( 700);
}

Berichten: 27
Geregistreerd: 05 Mrt 2018, 07:30

Re: Programma keuze

Berichtdoor Arduinouno » 04 Apr 2018, 11:55

Bedankt, ga ik eens proberen of ik het in mijn programma verwerkt krijg,
Ik heb wel nog enkele vraagjes.
wat is de bedoeling van de stapgrootte? Is dit voor een stappenmotor? Ik maak gebruik van een DC motor.
Ik heb nu ook aparte voids gemaakt van de programma’s voor links en rechts omdat er tijdens de draaibeweging nog enkele sensoren gebruikt worden, moet ik die voids dan dezelfde naamgeven als in de enum?

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten