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
  Problem mit SD Card Library BennIY 4 194 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  4x16 Tastermatrix Problem Michel 16 855 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 461 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 608 13.06.2016 21:14
Letzter Beitrag: torsten_156
  ESP8266_01 flashen - Problem torsten_156 12 1.057 30.05.2016 20:12
Letzter Beitrag: torsten_156
  Hardwareserial/Softserial: Problem mit Superklasse tuxedo0801 10 483 19.05.2016 12:25
Letzter Beitrag: amithlon
  ESP8266 HTML Problem arduino_weatherstation 1 498 25.04.2016 21:52
Letzter Beitrag: rkuehle
  Problem mit OLED 0.96" Display torsten_156 3 546 03.04.2016 15:10
Letzter Beitrag: hotsystems
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 490 01.04.2016 05:49
Letzter Beitrag: MartinK

Gehe zu:


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