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
Problem bei Aktorpositionierung via Hall-Sensoren
22.02.2016, 14:39
Beitrag #1
Problem bei Aktorpositionierung via Hall-Sensoren
Hallo zusammen,

für mein derzeitiges Projekt habe ich aus einem alten Drucker einen Druckerkopfantrieb ausgebaut, der mit einem 5V DC Motor läuft. Mein Ziel ist es, dass der Schlitten eine von drei Positionen anfährt und dort verweilt. Die Eingabe erfolgt zunächst über den Serial Monitor der Arduino IDE.
Leider funktioniert dies jedoch bisher nur bedingt. Wenn der Schlitten nach dem Start des Arduino nach ganz rechts auf die "Kalibrierungsposition" gefahren ist, kann man eine der drei
Positionen 1, 2, 3 eingeben. Schrittweise klappt dies sehr gut, also zunächst auf 1, dann auf 2 und von dort auf 3 sowie umgekehrt ebenso. Auch von der Kalibrierungsposition direkt auf Position 2 klappt. Sobald jedoch Position 2 übersprungen werden soll, also von 1 auf 3 oder von 3 auf 1, bleibt er an Position 2 stehen. Im Serrial Monitor habe ich dies beobachtet, hier springt er in die entsprechende Schleife im Programmcode und schriebt als aktuelle Position die nächst folgende an Stelle von Position 2. Hierdurch bleibt der Schlitten stehen, da das Programm von Zielpunkt ausgeht. Ein geringes Delay (zwischen 10ms und 100ms) verursacht leider nur, dass ggf. Positionen nicht erkannt werden. Schiebt man den Schlitten per Hand, passiert das gleiche, weshalb ich nicht von einer zu hohen Geschwindigkeit ausgehe.

Ich schätze der Fehler liegt im Programmcode, dass eine Schleife fälschlicherweise einmal zu viel durchlaufen wird. Leider sehe ich diesen Fehler jedoch nicht. Über Ansätze würde ich mich sehr freuen.
Nachfolgend nützliche Informationen:


Zum Aufbau:
Signal ohne Magnet: Sensor 1 = 1; Sensor 2 = 1;
Signal links (Position 3): Sensor 1 = 1; Sensor 2 = 0;
Signal mitte (Position 2): Sensor 1 = 0; Sensor 2 = 0;
Signal rechts (Position 1): Sensor 1 = 0; Sensor 2 = 1;

|-------------------------o------------------o---------|Kalibrierungs-
|-----o-------------------o----------------------------|position (ganz rechts)

Hall-Sensoren:
Zur Positionierung habe ich mich aufgrund der Flexibilität für den Einsatz von zwei Hall-Sensoren in kombination mit kleinen 3mm x 1mm Neodymium-Magneten entschieden. Die Hall-Sensoren sind mit je einem 10k Ohm Widerstand als PullUp versehen und werden über die Pins 3 und 4 des Arduino Uno ausgelesen. Der Abstand der Sensoren ist knapp über den Magneten, sodass die Detektion eines Magneten eine Invertierung von 1 auf 0 erzeugt.

Motorsteuerung:
Der 5V DC Motor wird über ein L2930 IC gesteuert, wobei +4,5V bzw. -4,5V bereitgestellt werden. Die Drehrichtung wird über die Pins 12 und 11 per "digital write" bestimmt.

Arduino:
Verwendet wird ein original Arduino Uno. Die Spannungsversorgung erfolgt getrennt vom Motor über das USB Kabel am (Windows) PC. Die Masse ist natürlich jeweils verbunden.

Programm in Worten:
Nach der Initialisierung aller Variablen sowie Ein- und Ausgängen wird der Schlitten einmalig in die Kalibrierungsposition verfahren. Im Loop wird auf eine Eingabe im Serial Monitor gewartet, die an eine Funktion zur Positionierung übergeben wird. Hier gibt es zwei Möglichkeiten: entweder die Differenz zwischen Sollposition und aktueller Position ist positiv, was eine Fahrt nach links erfordert, oder die Differenz ist negativ, sodass nach rechts gefahren werden muss. Bei der Fahrt wird der Zustand der Hall-Sensoren abgefragt, sodass die aktuelle Position bei der Überfahrt der Magneten angepasst wird. Wird die Sollposition erreicht, sollte die Psotion durch die Sensoren erkannt und die aktuelle Position geschrieben werden, sodass Sollposition und aktuelel Position sich entsprechen. (ggf. Fehler bei größer, gleich Null Bedingung der anfänglichen While-Schelifen - wird jedoch für die Richtungserkennung benötigt?!)

Code:
const int hallPin11 = 11; //Hallsensor 2
const int hallPin12 = 12; //Hallsensor 2
int hallState1 = 1; //Hallsensor 1 am Arduino Pin 11
int hallState2 = 2; //Hallsensor 2 am Arduino Pin 12

int actPos = 0; //aktuelle Schlittenposition
int homePos = 0; //Ausgangspunkt nach anfänglicher Kalibrierung
int sollPos = 0; //Sollposition des Schlittens

int motor[] = {4, 3}; //Steuerungspins des DC Motos für L2930 IC

void setup() {
Serial.begin(9600);  

//Hallsensor Pins als Input:
pinMode(hallPin11, INPUT);
pinMode(hallPin12, INPUT);
  
//Motor Pins als Output:
int i;
for(i = 0; i < 2; i++){
pinMode(motor[i], OUTPUT);
}

goHome(); //Kalibrierung durch vollständige Fahrt nach Rechts
}


void loop() {

//Eingabe über Serial Port:
if (Serial.available() > 0) {
                // read the incoming byte:
                sollPos = Serial.read();
                sollPos = sollPos - 48; //Subtraktion um die Werte 1;2;3 zu erhalten
                goPos(sollPos);
                }

}


//Kalibrierungsfunktion:
void goHome() {
digitalWrite(motor[0], HIGH);
digitalWrite(motor[1], LOW);
delay(1000);
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], LOW);
actPos = 0;
}

//Fahren auf Sollposition:
void goPos(int sollPos){
  
//Fahren auf Positionen, die links der aktuellen Position liegen:
while ((sollPos - actPos) > 0){
  
//Schlitten verfährt nach links, in aufsteigende Positionsrichtung:
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], HIGH);

hallState1 = digitalRead(hallPin11);
hallState2 = digitalRead(hallPin12);

//Speichern der Positionen beim Überfahren:
  if (hallState1 == 0 && hallState2 == 1){ //rechte Position [0;1]
  actPos = 1;
  digitalWrite(motor[0], LOW);
  digitalWrite(motor[1], LOW);
  }
      else if (hallState1 == 0 && hallState2 == 0){ //mittige Position [0;0]
      actPos = 2;
      digitalWrite(motor[0], LOW);
      digitalWrite(motor[1], LOW);
      }
          else if (hallState1 == 1 && hallState2 == 0){ //linke Position [1;0]
          actPos = 3;
          digitalWrite(motor[0], LOW);
          digitalWrite(motor[1], LOW);        
          }
}
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], LOW);


//Fahren auf Positionen, die rechts der aktuellen Position liegen:
while ((sollPos - actPos) < 0){
  
//Schlitten verfährt nach rechts, in aufsteigende Positionsrichtung:
digitalWrite(motor[0], HIGH);
digitalWrite(motor[1], LOW);

hallState1 = digitalRead(hallPin11);
hallState2 = digitalRead(hallPin12);

//Speichern der Positionen beim Überfahren:
  if (hallState1 == 0 && hallState2 == 1){
  actPos = 1;  
  }
      else if (hallState1 == 0 && hallState2 == 0){
      actPos = 2;  
      }
          else if (hallState1 == 1 && hallState2 == 0){
          actPos = 3;
          }
}
digitalWrite(motor[0], LOW);
digitalWrite(motor[1], LOW);
}



Besten Dank für Hilfe und viel Grüße
Corban
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Bootloader update mit USBASP Problem sepp01 15 576 12.05.2018 17:23
Letzter Beitrag: sepp01
  C++ Library Datenübergabe Problem jose_ph 9 370 08.05.2018 14:10
Letzter Beitrag: Tommy56
  Problem mit der Textauswertung Franz54 13 482 15.04.2018 18:17
Letzter Beitrag: Tommy56
  Zwei identische I2C sensoren an einem Bus Karli 19 859 02.04.2018 22:13
Letzter Beitrag: Harry
  Problem mit RIFD UID ParadoxDev 6 301 27.03.2018 12:04
Letzter Beitrag: ParadoxDev
  Problem mit OLED 0.96" Display torsten_156 5 1.806 07.03.2018 23:27
Letzter Beitrag: Tommy56
  Ucglib Library Problem Bully 26 1.183 05.03.2018 18:47
Letzter Beitrag: Tommy56
  Problem mit Wire.available() abfrage avoid 1 378 11.01.2018 13:40
Letzter Beitrag: Tommy56
  SerialComInstruments 4 Problem Darstellung Nextero 35 1.592 15.12.2017 18:51
Letzter Beitrag: ElEspanol
  Problem mit Nema17 und A4988 Philthy 6 534 08.12.2017 12:35
Letzter Beitrag: Tommy56

Gehe zu:


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