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:
Hier der Code, damit die Tabletuser auch eine Chance zum Helfen bekommen
/*********************************************************
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.
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
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
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.