Schiebepotentiometer an Arduino anschließen

unsigned int value = 0;
unsigned int oldvalue=2000;
unsigned int pwmValue;

void setup() {
  //Setup Channel A
  pinMode(12, OUTPUT);    //Initiates Motor Channel A pin
  pinMode(9, OUTPUT);     //Initiates Brake Channel A pin
  Serial.begin(9600);   //Beginn der seriellen Kommunikation.
  Serial.println(F("Start..."));
}


void loop() {

  value = analogRead(A5);                   // Potiwert für die Geschwindigkeit
  pwmValue = map(value, 0, 1023, 0, 255);   // Da ein ANALOG-SIGNAL zwischen 0 und 1023 liegt muss
                                            // die Range des analogen Wertes auf die des PWM gemappt werden 
  analogWrite(3, pwmValue);

  if (oldvalue!=value)
  {
  Serial.print(F("value: "));
  Serial.print(value);
  Serial.print(F("\t pwmvalue: "));
  Serial.println(pwmValue);
  }
 
}

Mach mal den und sag mal ab wann der aktor loslegt.

Auch wieder nur etwa ein Zentimeter vor Ende des Potis.. Also genauso wie vorher!
Die Werte liegen dann in etwa bei: Value: 865, pwmvalue: 215

Ja, das war richtig und gewollt.
Was hast Du da für einen Treiber zwischen Arduino und dem Aktor dran?
Für mich sieht das so aus, als würde der nur schalten.

Puh ok ich habe definitiv noch zu wenig Ahnung von dem Thema..
Ich habe den Aktor an die Klemmschrauben von Channel A des Motor Shields angeschlossen und das Potentiometer über die 5V und GND sowie A5 angeschlossen.
Mehr habe ich da nicht.

Welches?
Ach - da war doch schon mal was mit dem EIn/AUsgang

Dann hilft vielleicht:
http://tortendummy.com/Homepage/mikrocontroller/ArduinoMotorShield.pdf

Hallo ,
mMn ist das doch ein Logarytmischer poti

Bernhard

Die"c" ist ein Logarytmischer
a= linial
b= c nur umgekehrt,

NEIN! #2

Na Ja solles so bleiben bei den Japaner "V: For vol" , fast linial nach dem Datenblat
in meiner Asbildung wurde uns gesagt (vor 45 Jahren
A= Linial zB für Klang
C für Vol
Und wenn Du alte schaltpläne gugst ist das ach so

Wissen auffrischen.
aktuelle Datenblätter lesen.

Das wurde auch schon vor 45 Jahren gesagt.

Naja, da gibt es vielleicht noch mehr.
Was passiert hier:

const int MotorPinA = 3;
const int StromPinA = A0;
const int DirPinA = 12;
const int BrakePinA = 9;
unsigned int value = 0;
unsigned int oldvalue = 2000;
unsigned int pwmValue;
bool oldDir = LOW;

void setup() {
  //Setup Channel A
  pinMode(DirPinA, OUTPUT);
  pinMode(BrakePinA, OUTPUT);
  Serial.begin(9600);   //Beginn der seriellen Kommunikation.
  Serial.println(F("Start..."));
}


void loop() {
  value = analogRead(A5);                   // Potiwert für die Geschwindigkeit


  if (value > oldvalue)                     // Werte steigen an
  {
    if (oldDir == LOW)                      // Wenn vorher abfallend
    {
      digitalWrite(BrakePinA, HIGH);        // Bremse
      oldDir = HIGH;                        // Richtungswechsel
    }
    else                                    // Wenn vorher steigend
    {
      digitalWrite(BrakePinA, LOW);         // Bremse lösen
      digitalWrite(DirPinA, HIGH);          // Richtung vorwärts
      pwmValue = map(value, 0, 1023, 0, 255);
      analogWrite(MotorPinA, pwmValue);     // Schreiben
    }
  }

  if (value < oldvalue)                     // Werte fallen
  {
    if (oldDir == HIGH)                     // Wenn vorher steigen
    {
      digitalWrite(BrakePinA, HIGH);        // Bremse
      oldDir = LOW;                         // Richtungswechsel
    }
    else                                    // Wenn vorher fallend
    {
      digitalWrite(BrakePinA, LOW);         // Bremse lösen
      digitalWrite(DirPinA, LOW);           // Richtung rückwärts
      pwmValue = map(value, 0, 1023, 255, 0);
      analogWrite(MotorPinA, pwmValue);     // Schreiben
    }
  }
  if (oldvalue != value)
  {
    Serial.print(F("value: "));
    Serial.print(value);
    Serial.print(F("\t pwmvalue: "));
    Serial.println(pwmValue);
  }
}

Danke für den Aktor-Link.
Nun, ich denke, dass da ein Hardware-Problem vorliegt: Das ist laut Link-Adresse ein 12V-Typ. Wenn ich die Beschreibung des Motorshields (auch danke!) richtig lese, verbindet das in Normalausführung die Motorspannung mit dem Vin des Arduino.

Wie wird momentan der Arduino versorgt? Netzteil und Hohlbuchse oder nur USB?

Das mit einem Testsketch ist nicht so schwer, hier (ohne Test trocken runtergeschrieben und mit pösen Delays) die loop(), die den Aktor in 16 Schritten durchfährt:

void loop() {

  for (int pwm = 0; pwm <= 256; pwm += 16) 
  {
    analogWrite(3, pwm >= 256 ? 255 : pwm);
    Serial.print(F("pwm: "));
    Serial.println(pwm);
	delay(1000);
  }
}

Bei dem Code ist der Aktor unten wenn das Poti ganz links ist (Value: 0, pwmvalue: 255) und geht dann bei einem Value von ca. 250 und pwmvalue von ca. 200 sprunghaft nach oben - da habe ich den Poti ca. 1,5cm nach rechts bewegt.
Und wenn ich den Poti von rechts nach links schiebe geht er dann kurz vor dem Ende langsam runter und bleibt dann eben unten bis ich den Poti wieder nach rechs bewege.

@my_xy_projekt
Warum eigentlich setzt Du oldvalue nur einmal global? Müsste das nicht nachgeführt werden oder hat mein notepad++ versagt?

image

:wink:

Ne nicht ganz:

Schematic: (hatte ich oben schon mal dran)

Ich habe den Arduino über USB an meinem Laptop angeschlossen und zusätzlich noch ein Labornetzgerät mit 5V angeschlossen.

Bei dem Sketch reagiert geht der Poti in kleinen Schritten runter, hält dann ganz unten kurz fest und springt dann wieder hoch.

Nein meiner.
Die letzte Sequenz hab ich beim einfügen nicht mitgenommen.

Richtig:

  if (oldvalue != value)
  {
    Serial.print(F("value: "));
    Serial.print(value);
    Serial.print(F("\t pwmvalue: "));
    Serial.println(pwmValue);
    oldvalue=value;
  }

Na, hoffentlich der Aktor.

Das ist aber ein gutes Ergebnis - das Ding reagiert offensichtlich korrekt (entgegen meiner Annahme; muss ich mir den MotorShield- Schaltplan mal zu Gemüte führen).
Das Hüpfen am Ende liegt daran, dass ich zu faul war, auch den Rückweg zu programmieren.

USB und Netzgerät gleichzeitig - hmmm.
Wo genau hast Du das Netzgerät angeschlossen?

Da ich keine Ahnung habe, wie analogWrite() auf sehr häufige Änderungen des Pulses reagiert muss ich dann aber passen. Einzige Idee (falls die interne Logik da durch zu schnelles neues Ansteuern durcheinander kommt): Mal nicht so oft analogWrite() aufrufen - für einen ersten Test vielleicht auch nur jede Sekunde.

Hmm. In der Beschreibung steht dann aber:

Das macht mich stutzig - "Vin Connect" ist doch vermutlich noch nicht aufgekratzt.
Da ich aber diese Hardware hier leider nicht vorliegen habe: Unter Vorbehalt!
Ich irre öfter mal...

Ups ja klar, natürlich der Aktor :grinning:

Manchmal vergesse ich aber auch das Netzgerät anzuschalten und dann läuft er nur über USB.
Habe das Netzgerät auch an den Klemmschrauben befestigt, an Vin und GND.