Start auf Knopfdruck


hallo zusammen,

ich habe ein programm geschrieben, das für eine linearachse mit schrittmotor gedacht ist. der schlitten soll mit der vorgegebenen geschwindigkeit von links nach rechts bzw rechts nach links fahren und jeweils endschalter stoppen. nun möchte ich, das die bewegung von endschalter zu endschalter nur dann startet, wenn ich deinen start-knopf betätige (einmaliges drücken, kein dauerhaftes drücken).

nun bin ich mir jedoch nicht sicher, ob mein programm das auch abruft. ich habe das programm zusammen mit meinem vater geschrieben und habe leider selber kaum programmierkenntnise.

code: [select]
// einlesen der accelstepper library
// wird benötigt, da spezielle commands hinterlegt sind
#include <accelstepper.h>
#include <multistepper.h>

//festlegung der geschwindigkeiten
const int speed1 = 50.51; //  entspricht 1m/min
const int speed2 = 37.88; //  entspricht 0,75m/min
const int speed3 = 25.25; //  entspricht 0,5m/min
//    berechnet sich aus:
//    n_umdrehungen=v_schlitten/u_achse       n_achse=drehzahl der achse [1/sec]; u_achse=66mm; v_schlitten= vorschubgeschwindigkeit schlitten [m/min]
//    st_achse=n_umdrehung*st_umdrehung       st_achse= steps pro sekunde die benötigt wird für die gewünschte geschwindigkeit; st_umdrehung= steps pro umdrehung (motor)

//hier werden die pins des arduino zugeordnet
// eingaenge:
const int speed1pin = 2;            // pin2 wird der position 1 des schiebeschalters zugeordnet
const int speed2pin = 3;            // pin3 wird der position 2 des schiebeschalters zugeordnet
const int speed3pin = 4;            // pin5 wird der position 3 des schiebeschalters zugeordnet
const int startswitchpin = 5;       // pin6 wird dem startschalter zugeordnet
const int eslpin = 6;               // pin6 wird dem linken endlageschalter zugeordnet
const int esrpin = 7;               // pin7 wird der rechten endlageschalter zugeordnet

// ausgaenge:
const int dirpin = 8;               // pin8 wird dem 'richtungs-pin' zugeordnet
const int pulpin = 9;               // pin9 wird dem 'schritte-pin' zugeordnet
const int enblpin = 12;             // pin12 wird dem enable zugeordnet


//aufrufen der accelstepper library für die verwendung eines schrittmotor
accelstepper schrittmotor(1,9,8);   //1 steht für anbindung einen treiber, schritte-pin, richtungs-pin

//festlegen des setups
// eingänge und ausgänge festlegen
void setup(){
 //eingänge:
  pinmode( speed1pin, input );
  pinmode( speed2pin, input );
  pinmode( speed3pin, input );
  pinmode( startswitchpin, input );
  pinmode( esrpin, input );
  pinmode( eslpin, input );
 
  schrittmotor.setenablepin(enblpin);       // accelstepper command zum festlegen des enable pin
 
  schrittmotor.setmaxspeed(70);             // maximale geschwindigkeit in steps pro sekunde
  schrittmotor.setspeed(getspeed());        // festlegen der geschwindigkeit in steps pro sekunde

//startposition einnehmen 
  move( 'l' );
}


// starten des eigentlichen hauptprogrammes
void loop() {

char direction = 'r'; // aktuelle laufrichtung, muss nach dem einehmen der startpositions 'r' sein
while( 1 ){
  schrittmotor.setspeed(getspeed());       // möglichkeit zum einstellen der geschwindigkeit
        while( digitalread(startswitchpin) == high ){  delay(50);/* warte auf start */ }
move( direction );                      // durchfühen der motorbewerung
// ende der bewegung die richtung wieder umschalten
if( direction == 'l' ) {
direction = 'r';
} else if( direction == 'r' ) {
direction = 'l';
}
}
}

// motorbewegung
// ausgehend von der aktuellen stellung in die angegebene richtung mit der angegebenen geschwindigkeit
// eingänge:
//  char direction: 'l' für links, 'r' für rechts

void move( char direction )
{
// endposition schon erreicht?
if( getendswitch() == direction ) return;

    schrittmotor.enableoutputs(enblpin);  // motor kann laufen

    int speed = getspeed();

while( getendswitch() == 'n' ) {
       if( direction == 'l' ) {schrittmotor.setspeed(getspeed()); schrittmotor.runspeed();}       // wenn sich der schlittem vom linken enschalter aus bewegt, laufe nacch rechts
       if( direction == 'r' ) {schrittmotor.setspeed(-getspeed()); schrittmotor.runspeed();}      // wenn sich der schlitten vom rechten endschalter aus bewegt, laufe nach links
}
   
schrittmotor.disableoutputs(enblpin);  // motor bleibt stehen
}


// funktion zum einlesen der geschwindigkeit
// liefert 1, 2, oder 3 für die selektierte geschwindigkeit
int getspeed()
{
  // es ist immer nur einer der pins auf low (drehschalter/schiebeschalter)
  if( digitalread( speed1pin ) == low ) return speed1; 
  if( digitalread( speed2pin ) == low ) return speed2;
  if( digitalread( speed3pin ) == low ) return speed3;
}

// auslesen der endschalter
// 'l' wenn linker endschalter aktiv ist
// 'r' wenn rechter endschalter aktiv ist
// 'n' wenn kein endschalter aktiv ist
char getendswitch()
{
if( digitalread( eslpin ) == low ) return 'l';
    if( digitalread( esrpin ) == low ) return 'r';
return 'n';
}
 

hallo,

das ist nicht euer hauptproblem. ihr habt endlosschleifen "ohne ende".

loop ist eine und while(1) ebenso. entscheidet euch lieber für loop.
wenn irgendwann move (...) aufgerufen wird, ist das fast eine endlosschleife.
während das programm darin verweilt kann es auf nichts anderes reagieren.
wie wäre es mit einer reaktion jederzeit auf not-aus?

zur eingangsfrage. entprellt einen taster und toggelt dabei den zustand einer bool variablen. dann ergibt das eine schalterfunktion.

im grunde wird das auch ein zustandsautomat. zustände stop, start, links, rechts
je nachdem welcher zustand aktuell ist verzweigt das programm lässt den motor laufen oder auch nicht.



Arduino Forum > International > Deutsch (Moderator: uwefed) > Start auf Knopfdruck


arduino

Comments

Popular posts from this blog

Error compiling for board Arduino/Genuino Uno.

Installation database is corrupt

esp8266 (nodemcu 0.9) client.write très lent ???