Motorfader über Touchsensor steuern

Hallo liebe Arduino Community,

ich habe mir vor kurzem einen Arduino Uno + Adafruit Motor Shield v2 und den Touchsensor MPR121 zugelegt. Als Motorfader verwende ich einen Alps RSA0N11M9A04, der sich soweit auch ganz gut per Touch hoch und runterfahren lässt. Nun zu einem Problem: Wenn ich den Fader hochfahre (zum Maximal Wert 1023 des Potentiometers) wird dieser Wert nicht ganz erreicht, obwohl der Fader am Ende ist. Der Motor dreht sich dann also weiter wenn das Touchfeld weiter berührt wird, was ja nicht gut für den Motor ist. Wenn man den Fader jetzt aber wieder runterfahren lässt, so wird der Null Wert erreicht und der Motor hört, so wie es sein soll, auf zu drehen. Irgendwie habe ich das Gefühl, dass der Motor evtl zu schnell hochfährt, und die Potiwerte zu langsam ausgelesen werden. Wundert mich aber, dass es beim Runterfahren klappt. Vielleicht hat einer von euch eine Idee? Hier ist mein Code:

my_motorfaders-1fader.ino.ino (3.38 KB)

Hier der Code, damit die Tabletuser auch eine Chance zum Helfen bekommen :wink:

/*********************************************************
This is a library for the MPR121 12-channel Capacitive touch sensor

Designed specifically to work with the MPR121 Breakout in the Adafruit shop 
  ----> https://www.adafruit.com/products/

These sensors use I2C communicate, at least 2 pins are required 
to interface

Adafruit invests time and resources providing this open source code, 
please support Adafruit and open-source hardware by purchasing 
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.  
BSD license, all text above must be included in any redistribution
**********************************************************/

#include <Wire.h>
#include "Adafruit_MPR121.h"
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();

Adafruit_MotorShield AFMS1 = Adafruit_MotorShield(0x60);
Adafruit_DCMotor *myMotor1 = AFMS1.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS1.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS1.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS1.getMotor(4);

// Keeps track of the last pins touched
// so we know when buttons are 'released'
uint16_t lasttouched = 0;
uint16_t currtouched = 0;

int analog_input0= A0;

int poti = 0;

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

  while (!Serial) { // needed to keep leonardo/micro from starting too fast!
    delay(10);
  }
  
  Serial.println("Adafruit MPR121 Capacitive Touch sensor test"); 
  
  // Default address is 0x5A, if tied to 3.3V its 0x5B
  // If tied to SDA its 0x5C and if SCL then 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }
  Serial.println("MPR121 found!");
  
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
  AFMS1.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  // Set the speed to start, from 0 (off) to 255 (max speed)
  myMotor1->setSpeed(255);
  myMotor1->run(FORWARD);
  // turn on motor
  myMotor1->run(RELEASE);
}

void loop() {
  // Get the currently touched pads
  currtouched = cap.touched();
  poti = analogRead(analog_input0);

    // it if *is* touched and *wasnt* touched before, alert!
    if (currtouched & _BV(2) ) {
      Serial.print(2); Serial.println(" touched");
      Serial.println(analogRead(poti));
      if (analogRead(poti) > 0 ) {
        myMotor1->run(FORWARD);
        myMotor1->setSpeed(255);
        delay(5); 
      }
    }

    if (currtouched & _BV(3) ) {
      Serial.print(3); Serial.println(" touched");
      Serial.println(analogRead(poti));
      if (analogRead(poti) < 1023 ) {
        myMotor1->run(BACKWARD);
        myMotor1->setSpeed(255);
        delay(5); 
      }
    }
    
  myMotor1->run(RELEASE);
  
  // reset our state
  lasttouched = currtouched;

  // comment out this line for detailed data from the sensor!
  return;
  
  // debugging info, what
  Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);
  Serial.print("Filt: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.filteredData(i)); Serial.print("\t");
  }
  Serial.println();
  Serial.print("Base: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.baselineData(i)); Serial.print("\t");
  }
  Serial.println(poti);
  
  // put a delay so it isn't overwhelming
  delay(100);
}

Da scheint der Fader nicht ganz bis zum Ende der Widerstandsschicht zu fahren. Kann vorkommen.
Du kannst eventuell einfach den Endwert im Programm anpassen. Also die 1023 einfach auf 1020
oder was auch immer erreicht wird anpassen.

Welcher Wert wird denn erreicht?

Gruß, Jürgen

Katsumi_S:
Da scheint der Fader nicht ganz bis zum Ende der Widerstandsschicht zu fahren. Kann vorkommen.
Du kannst eventuell einfach den Endwert im Programm anpassen. Also die 1023 einfach auf 1020
oder was auch immer erreicht wird anpassen.

Welcher Wert wird denn erreicht?

Gruß, Jürgen

Genau, irgendwie sowas scheint das Problem zu sein...
leider ist der Endwert immer total unterschiedlich, mal liegt der bei 970, mal bei 895 usw. Habs auch schon mit niedrigeren Werten als 1023 versucht, leider ist dann der Endwert total willkürlich

Wie sind denn die einzelnen Komponenten miteinander verbunden? Gibt es einen Schaltplan oder ein Bild von dem Aufbau?

Seltsam wenn die Werte so schwanken.

Ich versuche nacher mal einen Schaltplan zu zeichnen... Ich finde es sehr merkwürdig. Denn wenn ich nur das Poti des Motorfaders bewege und die Werte durch Serial.AnalogRead auf den Monitor ausgeben lasse bekomme ich durch bewegen des Faders auch oben auf den Wert 1023

Ich würde erstmal die delays rausschmeissen...

MaHa76:
Ich würde erstmal die delays rausschmeissen...

Das würde dazu führen, dass sich die Motoren nicht mehr bewegen

Hi,

diese Aussage bringt mich zur Vermutung, daß Du mit Steckbrett und Dupontkabeln arbeitest.

kingcandy:
Ich versuche nacher mal einen Schaltplan zu zeichnen... Ich finde es sehr merkwürdig. Denn wenn ich nur das Poti des Motorfaders bewege und die Werte durch Serial.AnalogRead auf den Monitor ausgeben lasse bekomme ich durch bewegen des Faders auch oben auf den Wert 1023

Das ganze ist manchmal sehr wackelig, und die gesteckten Kontakte haben Übergangswiderstände, die sich bei niederohmigen Sachen bemerkbar machen.

Gruß André

SpaghettiCode:
Hi,

diese Aussage bringt mich zur Vermutung, daß Du mit Steckbrett und Dupontkabeln arbeitest.

Das ganze ist manchmal sehr wackelig, und die gesteckten Kontakte haben Übergangswiderstände, die sich bei niederohmigen Sachen bemerkbar machen.

Gruß André

Hallo André,

ne arbeite mit festverlöteten Kabeln und einem Motorshield sowie Prototype Shield, die auf den Arduino gestackt werden.

viele Grüße

Lukas