INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wegbegrenzung für Schrittmotor
03.01.2019, 22:19
Beitrag #1
Wegbegrenzung für Schrittmotor
Hallo und guten Abend.
Mein Name ist Ralph und ich hänge bei meinem aktuellen Projekt etwas.
Ich möchte für ein Modellboot mit vier Schrittmotoren die Geschütztürme drehen. Dafür habe ich auf einem Arduino Nano Clon schonmal einen Sketch zusammengebastelt, der vier Schaltkanäle (PPM) an meinem RC-Empfänger ausliest.
Die unterschiedlichen Zustände sollen dann entsprechend die Schrittmotore nach links bzw. rechts drehen. Soweit so gut. Dafür wollte ich dann ein Arduino Uno und zwei Adafruit Motor Shields nehmen (sind bestellt und auf dem Weg).

Für das Uno hab ich auch schon angefangen den Sketch zu schreiben und bin bis hierher gekommen:

Code:
#include <Wire.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMSbot = Adafruit_MotorShield(0x60);
Adafruit_MotorShield AFMStop = Adafruit_MotorShield(0x61);

Adafruit_StepperMotor *myMotor1 = AFMSbot.getStepper(200, 1);
Adafruit_StepperMotor *myMotor2 = AFMSbot.getStepper(200, 2);
Adafruit_StepperMotor *myMotor3 = AFMStop.getStepper(200, 1);
Adafruit_StepperMotor *myMotor4 = AFMStop.getStepper(200, 2);
//Variablen

//RC-bezogen
int cnt_CH_1 = 0; //Zähler Channel 1 für Interruptroutine
int frqraw_CH_1 = 0; //Ãœbergabewert Channel 1 aus Interruptroutine
int cnt_CH_2 = 0; //Zähler Channel 2 für Interruptroutine
int frqraw_CH_2 = 0; //Ãœbergabewert Channel 2 aus Interruptroutine
int cnt_CH_3 = 0; //Zähler Channel 3 für Interruptroutine
int frqraw_CH_3 = 0; //Ãœbergabewert Channel 3 aus Interruptroutine
int cnt_CH_4 = 0; //Zähler Channel 4 für Interruptroutine
int frqraw_CH_4 = 0; //Ãœbergabewert Channel 4 aus Interruptroutine
int Relais_1 = 6;
int Relais_2 = 7;
int Relais_3 = 8;
int Relais_4 = 9;
int Relais_5 = 10;
int Relais_6 = 11;
int Relais_7 = A0;
int Relais_8 = A1;

//Programmbezogen
const int deadzone = 10;
const int hlevel = 174; //höchste gelieferte Frequenz
const int llevel = 115; //niedrigste gelieferte Frequenz
const int glevel = 310; //Grenzlevel für Ergebnis

void setup() {

  // Controller pins
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMSbot.begin();
  AFMStop.begin();
  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz

  myMotor1->setSpeed(10);  // 10 rpm
  myMotor2->setSpeed(10);  // 10 rpm
  myMotor3->setSpeed(10);  // 10 rpm
  myMotor4->setSpeed(10);  // 10 rpm
  DDRD = 0b11000011; //Setzt D2-D5 als Eingang 0 und die restlichen als Ausgang 1
  cli(); // Clear interrupts Interrupts ausschalten

  // Register zurücksetzen
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 20; //Output Compare Register auf Vergleichswert setzen, war 20

  TCCR1B |= (1 << CS11); //Prescale 8
  // 16MHz/8=2MHz mit OCR1A=20 Interrupt alle 10µs

  TCCR1B |= (1 << WGM12); //CTC-Mode einschalten
  TIMSK1 |= (1 << OCIE1A); //Timer Compare Interrupt setzen

  sei(); // Set Interrupts Interrupts einschalten



}

ISR(TIMER1_COMPA_vect) { //die Interruptroutine gibt ein Zehntel der Impulsbreite in µs zurück


  if (PIND & (1 << PD2)) { //Channel 1 rechts horizontal, das ist PIN D2
    cnt_CH_1++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_1) {          //wenn Eingang Low dann prüfen ob Zähler gestartet
    frqraw_CH_1 = cnt_CH_1 - 1; //wenn Zähler gestartet, stoppen und Wert übergeben

    cnt_CH_1 = 0; //Zähler zurücksetzen
  }


  if (PIND & (1 << PD3)) { //Channel 2 rechts vertikal, das ist PIN D3
    cnt_CH_2++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_2) {          //wenn Eingang Low dann prüfen ob Zähler gestartet
    frqraw_CH_2 = cnt_CH_2 - 1; //wenn Zähler gestartet, stoppen und Wert übergeben

    cnt_CH_2 = 0; //Zähler zurücksetzen
  }

  if (PIND & (1 << PD4)) { //Channel 3 links vertikal, das ist PIN D4
    cnt_CH_3++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_3) {          //wenn Eingang Low dann prüfen ob Zähler gestartet
    frqraw_CH_3 = cnt_CH_3 - 1; //wenn Zähler gestartet, stoppen und Wert übergeben

    cnt_CH_3 = 0; //Zähler zurücksetzen
  }


  if (PIND & (1 << PD5)) { //Channel 4 links horizontal , das ist PIN D5
    cnt_CH_4++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_4) {          //wenn Eingang Low dann prüfen ob Zähler gestartet
    frqraw_CH_4 = cnt_CH_4 - 1; //wenn Zähler gestartet, stoppen und Wert übergeben

    cnt_CH_4 = 0; //Zähler zurücksetzen
  }


}

void loop() {



  if (frqraw_CH_1 > 180)
  {
    myMotor1->step(1, FORWARD, MICROSTEP);
  }
  else if (frqraw_CH_1 < 120)
  {
    myMotor1->step(1, BACKWARD, MICROSTEP);
  }
  if (frqraw_CH_2 > 180)
  {
    myMotor2->step(1, FORWARD, MICROSTEP);
  }
  else if (frqraw_CH_2 < 120)
  {
    myMotor2->step(1, BACKWARD, MICROSTEP);
  }
  if (frqraw_CH_3 > 180)
  {
    myMotor3->step(1, FORWARD, MICROSTEP);
  }
  else if (frqraw_CH_3 < 120)
  {
    myMotor3->step(1, BACKWARD, MICROSTEP);
  }
  if (frqraw_CH_4 > 180)
  {
    myMotor4->step(1, FORWARD, MICROSTEP);
  }
  else if (frqraw_CH_4 < 120)
  {
    myMotor4->step(1, BACKWARD, MICROSTEP);
  }
}

Er ist noch nicht komplett, da ich es noch nicht testen konnte. Nun zu meinem Problemchen. Da sich die Geschütztürme nicht volle 360° drehen sollen sondern nur 290° würde ich gern eine "Endlage" mit in den Sketch schreiben wollen. Hat da einer eine Idee?
Ich weiß, dass das teilweise von den Motoren abhängt, Steps/U etc, mir geht es auch nur darum, wie man das am einfachsten einbindet.
Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2019, 22:25
Beitrag #2
RE: Wegbegrenzung für Schrittmotor
Leider habe ich keine Erfahrungen mit Schrittmotoren, stelle aber mal die Frage, warum Schrittmotoren und keine Servos ?
Ich hätte das mit Servos aufgebaut.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2019, 22:29
Beitrag #3
RE: Wegbegrenzung für Schrittmotor
Ich baue die Bismarck in 1:200, da ist in den Geschütztürmen nicht sonderlich viel Platz für ein Servo, allerdings passen da wunderbar Ministepper rein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2019, 22:34
Beitrag #4
RE: Wegbegrenzung für Schrittmotor
(03.01.2019 22:29)Scouter schrieb:  Ich baue die Bismarck in 1:200, da ist in den Geschütztürmen nicht sonderlich viel Platz für ein Servo, allerdings passen da wunderbar Ministepper rein.

Na...ok, ist ein Argument. Poste bitte mal einen Link so eines Ministepper.

Danke.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2019, 22:44
Beitrag #5
RE: Wegbegrenzung für Schrittmotor
Sowas ist das Kleinste, was ich kenne. Guckst du hier.
Ganz so klein sind meine aber nicht. Guckst du da.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2019, 08:33
Beitrag #6
RE: Wegbegrenzung für Schrittmotor
Hallo,

mach es wie die 1541 Floppy vom C64 vor über 30 Jahre:
mechanischen Anschlag an den Endlagen. Beim Einschalten zu einem Anschlag fahren, einfach die maximale nötige Schrittzahl für den kompletten Schwenkbereich + ein paar Reserve. Dann hast Du eine definiert Startposition und kannst Schritte zählen.
Notfalls kleines Gummistückchen an die Anschläge, damit es nicht so klappert. Bei Deiner nötigen Motorleistung sollte das kein Problem sein.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2019, 10:24
Beitrag #7
RE: Wegbegrenzung für Schrittmotor
Inzwischen hab ich mich schon damit abgefunden, dass ich min. ein Endlagenschalter pro Motor brauche. Nun muss ich nur noch herausfinden, wie ich das in den Sketch mit einbinde.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2019, 10:51
Beitrag #8
RE: Wegbegrenzung für Schrittmotor
Hallo Schiffsmodellbaukollege!
Wieso willst Du den Motor in das Geschütz einbauen? Da schleppst Du bei jeder Drehung die Kabel mit,die dir eventuell abreißen oder brechen können.Besser und einfacher wäre,den Turm auf die Motorachse zu setzen.
Für die Erkennung der Endpositionen und Grundposition habe ich Reed-Kontakte verwendet,Endschalter sind nicht so toll,da die nur in einer Richtung zuverlässig funktionieren.Von der anderen Seite her kann es hier klemmen und die Feder verbiegen.Da man nicht ausschließen kann,daß sich beim Transport der Motor bereits verdreht hat (durch Anecken oder andersweiliger Berührung),habe ich es so gemacht,daß der Turm beim Setup einen Begrenzungsschalter anfährt und danach den Schalter für die Grundstellung,je nach Position auch direkt den Schalter für die Grundstellung.Wegen der Größe und Gewicht meines MG-Standes habe ich einen DC-Getriebemotor verwendet.Dürfte aber kein Problem sein,den Sketch für Stepper zu ändern.Hier mein Setup wie ich es verwende:

Code:
#include <PWMServo.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

PWMServo Servo_Rohr;

int EmpfaengerKanal_2 =2; //Empfängerausgang RC-Betrieb
int EmpfaengerKanal_3 =3; //Empfängerausgang RC-Betrieb
unsigned long Impuls_Eingang_Kanal_2 =1500; //3und9Uhr  RC-Betrieb
unsigned long Impuls_Eingang_Kanal_3 =1500; //6und12Uhr RC-Betrieb

int Endschalter3Uhr =17;
int Endschalter12Uhr =18;
int Endschalter9Uhr =19;
int Stop3Uhr;
int Stop12Uhr;
int Stop9Uhr;
int MotorA =13;
int MotorB =14;
int enableMotor=15;

int Drehrichtung=0;//Info über den gesetzten Input_Steuerkanal,also 3,6,9 oder12
boolean SequenzGestartet=false;

int ServoPos_Rohr = 90;

void setup()
{  
    pinMode (Endschalter3Uhr,INPUT);
    pinMode (Endschalter12Uhr,INPUT);
    pinMode (Endschalter9Uhr,INPUT);
    pinMode (enableMotor,OUTPUT);
    pinMode (MotorA,OUTPUT);
    pinMode (MotorB,OUTPUT);
    Servo_Rohr.attach(9);  
    
    Stop3Uhr=digitalRead(Endschalter3Uhr);
    Stop12Uhr=digitalRead(Endschalter12Uhr);
    Stop9Uhr=digitalRead(Endschalter9Uhr);
  
    while(Stop3Uhr==LOW && Stop12Uhr==LOW) // Drehkranz steht entweder vor                        oder hinter Endschalter12Uhr , aber vor Endschalter 3Uhr
         {
          Stop3Uhr=digitalRead(Endschalter3Uhr);
          Stop12Uhr=digitalRead(Endschalter12Uhr);
          digitalWrite(enableMotor,HIGH);
          digitalWrite(MotorA,HIGH);// Drehkranz dreht sich nach rechts bis entweder Endschalter12Uhr oder Endschalter3Uhr erreicht ist
          digitalWrite(MotorB,LOW);
         }
    while(Stop3Uhr==HIGH && Stop12Uhr==LOW) // Endschalter3Uhr hatte ausgelöst,Drehkranz dreht sich nach links bis Endschalter12Uhr erreicht ist  
         {
          Stop12Uhr=digitalRead(Endschalter12Uhr);
          digitalWrite(enableMotor,HIGH);
          digitalWrite(MotorA,LOW);
          digitalWrite(MotorB,HIGH);
         }
    digitalWrite(MotorA,LOW);
    digitalWrite(MotorB,LOW);
    digitalWrite(enableMotor,LOW);
    Servo_Rohr.write(ServoPos_Rohr);        
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Projekt Portionierer mit Schrittmotor, Bluetooth hilfe Flieger 3 870 09.08.2018 13:02
Letzter Beitrag: Hilgi
  Endschalter für Schrittmotor clemens5555 10 2.763 18.04.2018 14:37
Letzter Beitrag: Tommy56
  Schrittmotor mit Puls/Richtung Steuern Günni 6 2.152 19.01.2018 10:30
Letzter Beitrag: Tommy56
  Schrittmotor Geschwindigkeit mit Wägezelle + HX711 Modul steuern Schrittmotor 10 3.744 30.08.2017 23:45
Letzter Beitrag: hotsystems
  Schrittmotor mit l298n Sequenz huber5093 10 3.061 26.04.2017 15:06
Letzter Beitrag: huber5093
  Haltestrom Schrittmotor reduzieren TimF 3 2.804 24.10.2016 12:33
Letzter Beitrag: Binatone
  Schrittmotor Clemens55555 9 4.067 25.08.2016 10:15
Letzter Beitrag: Binatone
  Schrittmotor soll auf Tasterdruck bis zum Endschalter fahren Wurstbemme 11 7.571 08.01.2016 11:56
Letzter Beitrag: hotsystems
  Piezosummer und Schrittmotor Gilbert Neon 0 1.273 20.12.2015 15:40
Letzter Beitrag: Gilbert Neon
  Problem mit 2 Potis und Schrittmotor Sven90 1 1.836 24.09.2015 10:19
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste