Newbie Problem mit einem Sketch

Hallo zusammen, ich benutze zwar schon länger immer mal wieder Arduinos für verschiedene Zwecke, bis jetzt aber immer nur nach Anleitungen die auch funktioniert haben.
Jetzt stehe ich aber vor einem kleinen Problem..

Ich habe diesen Sketch hier benutzt:

/*
 * Written by Tiny Boat Productions, 2022
 * DIY Pick up winder version 2
 * 
 * Referance Documents
 * Potentiometer: https://docs.arduino.cc/learn/electronics/potentiometer-basics
 * DC Motor: https://www.tutorialspoint.com/arduino/arduino_dc_motor.htm
 * Reed Switch: https://create.arduino.cc/projecthub/muchika/reed-switch-with-arduino-81f6d2
 * I2C LCD: https://create.arduino.cc/projecthub/Arnov_Sharma_makes/lcd-i2c-tutorial-664e5a
 * Debounce: https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce
 * H-Bridge: https://hackerstore.nl/PDFs/Tutorial298.pdf
 * 
 */

#include "Wire.h"
#include "LiquidCrystal_I2C.h" // v1.1.2

const int DEBUG_PORT = 9600;
const unsigned long DEBOUNCE_DELAY = 20;
const int LCD_COLUMNS = 16;

//Pin declarations
const int MOTOR_PIN = 9; //motor pin
const int POT_PIN = A1;  //pot switch pin
const int REED_PIN = 3;  //reed switch pin
const int CW_PIN = 6;    //clockwise pin vorher 5
const int CCW_PIN = 5;  //vorher 4
const int IN3_PIN = 12;  
const int IN4_PIN = 11;


LiquidCrystal_I2C lcd(0x27,20,4); //LCD setup

//Inital Values
int potVal;     //reading from the potentiometer
int lastPotVal = 0;
int motorSpeed;
int turnCount = 0;      //revoultion count
bool runState = false;           //run state
bool lastRunState = false;
unsigned long lastDebounceTime = 0;
int turnsSinceUpdate = 0;
int lastUpdateTime = 0;
int currentRPM = 0;
int lastPercent = 0;
int motorPercent = 0;

void handleReedUpdate() {
  int currentTime = millis();

  if (currentTime - lastDebounceTime > DEBOUNCE_DELAY) {
    turnsSinceUpdate++;
    currentRPM = 60 / (currentTime - lastUpdateTime);
    lastUpdateTime = currentTime;
  }
  lastDebounceTime = currentTime;
}

void setup() {
  //set up motor and reed switch pins
  pinMode(MOTOR_PIN, OUTPUT);
  pinMode(REED_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(REED_PIN), handleReedUpdate, FALLING);
  pinMode(CW_PIN, INPUT_PULLUP);
  pinMode(CCW_PIN, INPUT_PULLUP);
  pinMode(IN3_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);

  Serial.begin(DEBUG_PORT);

  //set up the lcd
  lcd.init();
  lcd.backlight();    //turn on the backlight
  lcd.setCursor(0,0); //set the cursor in the uper left corner
  lcd.print("Pickup winder");
  lcd.setCursor(0,1); //set the cursor at the start of the second line
  lcd.print("By: Tiny Boat");
  delay(1500);
  
  while (analogRead(POT_PIN) > 5){ //Make sure the motor is at low speed before starting it
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Turn pot CCW");
    delay(500);
  }
  
  while(digitalRead(REED_PIN) == 0){ //Ensure you dont start on the magnet so the count is accurate
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Turn winding wheel 1/4 turn");
    delay(500);
    turnCount = 0;
  }

  while(digitalRead(CW_PIN) == 0 || digitalRead(CCW_PIN) == 0){ //Ensure the switch is in the off position
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Flip switch to");
    lcd.setCursor(0,1);
    lcd.print("off position");
    delay(500);
  }

    lcd.clear();
    lcd.print("Speed:  Count:");
    lcd.setCursor(0, 1);
    lcd.print("0");
}

void loop() {
  // put your main code here, to run repeatedly:
  potVal = analogRead(POT_PIN);
  if(digitalRead(CW_PIN) == 0){
    lastRunState = runState;
    runState = true;
    digitalWrite(IN3_PIN, HIGH);
    digitalWrite(IN4_PIN, LOW);
  } else if (digitalRead(CCW_PIN) == 0){
    lastRunState = runState;
    runState = true;
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, HIGH);
  } else {
    lastRunState = runState;
    runState = false;
  }

  //set the motor speed var
  if (!runState){
    motorSpeed = 0;
  } else if ((potVal != lastPotVal || runState != lastRunState) && runState) { //if the motor speed or the run state has ch/anged, and the motor is not off
    motorSpeed = potVal / 4;
    lastPotVal = potVal;    
  }

  //set the motor speed pwm
  analogWrite(MOTOR_PIN, motorSpeed);

  //update the screen
  motorPercent = (motorSpeed*100)/255;
  if (motorPercent != lastPercent){
    //if( motorSpeed >= lastSpeed*0.01)||(motorSpeed <= lastSpeed*0.01){
      lcd.setCursor(0, 1);
      lcd.print("        ");
      lcd.setCursor(0, 1);
      lcd.print( motorPercent);
      lastPercent = motorPercent;
    //}
  }
  
  if (turnsSinceUpdate > 0) {
    if(digitalRead(CCW_PIN) == 0){
      turnCount += turnsSinceUpdate;
    } else {
      turnCount -= turnsSinceUpdate;
    }
    
    turnsSinceUpdate = 0;

    lcd.setCursor(LCD_COLUMNS / 2, 1);
    lcd.print(turnCount);
  }

  Serial.print("Motor speed: ");
  Serial.print(motorSpeed);
  Serial.print(",Count: ");
  Serial.print(turnCount);
  Serial.print(",run state: ");
  Serial.println(runState);
}

Beim einschalten sollte er z.B. einen Hinweis darauf geben, dass der Schalter an Pin D5 und D6 nicht auf Off steht (natürlich nur wenn er nicht auf Off steht), das macht er aber nicht.
Genauso Zählt der Hallsensor auf D3 nicht, die LED am Sensor zeigt mir aber ein Signal an, wenn ich einen Magneten dran halte.
Das Signal vom Poti an A1 erkennt er aber.

Jetzt kommt das (für mich) seltsame.. Ich versorge den Nano in dieser Schaltung über den VIN mit 12V. Zum aufspielen des Sketches trenne ich diese Stromversorgung und stecke ihn per USB an den PC an. Komischerweise erkennt er so dann das Signal vom Schalter..

Was mache ich falsch? Ein Foto von meinem Aufbau wäre glaube ich nicht wirklich hilfreich, nur Kabel und Klemmen zu sehen

Das klingt in erster Näherung evtl. nach einem Problem mit einer GND-Verbindung.
Wie sind die Schalter verschaltet?

Wenn es kein sinnvolles Bild gibt, wirst Du um das Zeichnen eines Schaltplanes (Bleistift genügt) nicht herum kommen.

Gruß Tommy

Das paßt nicht zusammen, hat aber mit Deinem Problem nichts zu tun.

Ein 20x4 LCD benötigt recht viel Strom, so daß der Längsregler auf dem Nano, der die 12 V in 5 V wandelt, möglicherweise überfordert ist. Wenn Du Dir mit dem Finger eine Brandblase holst, ist das so. Du kannst auch ein IR-Thermometer verwenden oder die 5 V überprüfen, tut nicht so weh :slightly_smiling_face:

Nur eine Ergänzung zu Tommy, fehlende Verbindung zu GND macht auch komische Fehler.

Ich befürchte das sieht genauso wild aus :frowning:
Habe jetzt auch mal Testweise das Display über die 5V und GND vom Motortreiber Board versorgt, aber genau gleiches Verhalten..

ne passt. nix für ungut

Ja schon, aber man kann was erkennen :slightly_smiling_face:

Ich sehe drei 10 kΩ Widerstände, deren Sinn ich nicht verstehe. Was würde passieren, wenn man sie wegläßt?

Hast Du ein Multimeter, um die 5 V zu messen?

Hier ist dein Code ergänzt um komfortable debug-ausgabe auf den seriellen Monitor

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298

#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);

#define dbgi(myFixedText, variableName,timeInterval) \
  { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  }

#define dbgc(myFixedText, variableName) \
  { \
    static long lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  }

#define dbgcf(myFixedText, variableName) \
  { \
    static float lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  }
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *

unsigned long MyTestTimer = 0;                   // Timer-variables MUST be of type unsigned long
const byte    OnBoard_LED = 2;     // onboard-LEDESP32 / ESP8266
//const byte    OnBoard_LED = 25;  // onboard-LED Raspberry Pi pico
//const byte    OnBoard_LED = 13;   // onboard-LED uno, mega

/*
  BlinkHeartBeatLED(OnBoard_LED,250);

  if ( TimePeriodIsOver(MyTestTimer,1000) ) {

  }  
*/

/*
 * Written by Tiny Boat Productions, 2022
 * DIY Pick up winder version 2
 * 
 * Referance Documents
 * Potentiometer: https://docs.arduino.cc/learn/electronics/potentiometer-basics
 * DC Motor: https://www.tutorialspoint.com/arduino/arduino_dc_motor.htm
 * Reed Switch: https://create.arduino.cc/projecthub/muchika/reed-switch-with-arduino-81f6d2
 * I2C LCD: https://create.arduino.cc/projecthub/Arnov_Sharma_makes/lcd-i2c-tutorial-664e5a
 * Debounce: https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce
 * H-Bridge: https://hackerstore.nl/PDFs/Tutorial298.pdf
 * 
 */

#include "Wire.h"
#include "LiquidCrystal_I2C.h" // v1.1.2

const int DEBUG_PORT = 9600;
const unsigned long DEBOUNCE_DELAY = 20;
const int LCD_COLUMNS = 16;

//Pin declarations
const int MOTOR_PIN = 9; //motor pin
const int POT_PIN = A1;  //pot switch pin
const int REED_PIN = 3;  //reed switch pin
const int CW_PIN = 6;    //clockwise pin vorher 5
const int CCW_PIN = 5;  //vorher 4
const int IN3_PIN = 12;  
const int IN4_PIN = 11;


LiquidCrystal_I2C lcd(0x27,20,4); //LCD setup

//Inital Values
int potVal;     //reading from the potentiometer
int lastPotVal = 0;
int motorSpeed;
int turnCount = 0;      //revoultion count
bool runState = false;           //run state
bool lastRunState = false;
unsigned long lastDebounceTime = 0;
int turnsSinceUpdate = 0;
int lastUpdateTime = 0;
int currentRPM = 0;
int lastPercent = 0;
int motorPercent = 0;

void handleReedUpdate() {
  int currentTime = millis();

  if (currentTime - lastDebounceTime > DEBOUNCE_DELAY) {
    turnsSinceUpdate++;
    currentRPM = 60 / (currentTime - lastUpdateTime);
    lastUpdateTime = currentTime;
  }
  lastDebounceTime = currentTime;
}

void setup() {
  // Serial.begin(DEBUG_PORT); als ALLERERSTES 
  // serielle Ausgaben von Anfang an  
  Serial.begin(115200);
  Serial.println("Setup-Start");
  PrintFileNameDateTime();
  
  //set up motor and reed switch pins
  pinMode(MOTOR_PIN, OUTPUT);
  pinMode(REED_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(REED_PIN), handleReedUpdate, FALLING);
  pinMode(CW_PIN, INPUT_PULLUP);
  pinMode(CCW_PIN, INPUT_PULLUP);
  pinMode(IN3_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);


  //set up the lcd
  lcd.init();
  lcd.backlight();    //turn on the backlight
  lcd.setCursor(0,0); //set the cursor in the uper left corner
  lcd.print("Pickup winder");
  lcd.setCursor(0,1); //set the cursor at the start of the second line
  lcd.print("By: Tiny Boat");
  delay(1500);
  
  dbg("01",analogRead(POT_PIN) );
  while (analogRead(POT_PIN) > 5){ //Make sure the motor is at low speed before starting it
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Turn pot CCW");
    delay(500);
  }

  dbg("02",digitalRead(REED_PIN) );
  dbg("03",digitalRead(CW_PIN) );
  dbg("04",digitalRead(CCW_PIN) );
  
  while(digitalRead(REED_PIN) == 0){ //Ensure you dont start on the magnet so the count is accurate
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Turn winding wheel 1/4 turn");
    delay(500);
    turnCount = 0;
  }

  while(digitalRead(CW_PIN) == 0 || digitalRead(CCW_PIN) == 0){ //Ensure the switch is in the off position
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Flip switch to");
    lcd.setCursor(0,1);
    lcd.print("off position");
    delay(500);
  }

    lcd.clear();
    lcd.print("Speed:  Count:");
    lcd.setCursor(0, 1);
    lcd.print("0");
}

void loop() {
  // put your main code here, to run repeatedly:
  potVal = analogRead(POT_PIN);

  dbgc("L1",digitalRead(CW_PIN) );
  dbgc("L2",digitalRead(CCW_PIN) );
  if(digitalRead(CW_PIN) == 0){
    lastRunState = runState;
    runState = true;
    digitalWrite(IN3_PIN, HIGH);
    digitalWrite(IN4_PIN, LOW);
  } 
  else if (digitalRead(CCW_PIN) == 0){
    lastRunState = runState;
    runState = true;
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, HIGH);
  } 
  else {
    lastRunState = runState;
    runState = false;
  }

  //set the motor speed var
  if (!runState){
    motorSpeed = 0;
  } 
  else if ((potVal != lastPotVal || runState != lastRunState) && runState) { //if the motor speed or the run state has ch/anged, and the motor is not off
    motorSpeed = potVal / 4;
    lastPotVal = potVal;    
  }

  //set the motor speed pwm
  analogWrite(MOTOR_PIN, motorSpeed);

  //update the screen
  motorPercent = (motorSpeed*100)/255;
  if (motorPercent != lastPercent){
    //if( motorSpeed >= lastSpeed*0.01)||(motorSpeed <= lastSpeed*0.01){
      lcd.setCursor(0, 1);
      lcd.print("        ");
      lcd.setCursor(0, 1);
      lcd.print( motorPercent);
      lastPercent = motorPercent;
    //}
  }

  dbgc("L3",turnCount );
    
  if (turnsSinceUpdate > 0) {
    if(digitalRead(CCW_PIN) == 0){
      turnCount += turnsSinceUpdate;
    } 
    else {
      turnCount -= turnsSinceUpdate;
    }
    
    turnsSinceUpdate = 0;

    lcd.setCursor(LCD_COLUMNS / 2, 1);
    lcd.print(turnCount);
  }

  dbgc("L4",motorSpeed );
  dbgc("L5",turnCount );
  dbgc("L6",runState );

/*
  Serial.print("Motor speed: ");
  Serial.print(motorSpeed);
  Serial.print(",Count: ");
  Serial.print(turnCount);
  Serial.print(",run state: ");
  Serial.println(runState);
*/  
}

// helper-functions
void PrintFileNameDateTime() {
  Serial.println( F("Code running comes from file ") );
  Serial.println( F(__FILE__) );
  Serial.print( F("  compiled ") );
  Serial.print( F(__DATE__) );
  Serial.print( F(" ") );
  Serial.println( F(__TIME__) );  
}


// easy to use helper-function for non-blocking timing
// explanation see here
// https://forum.arduino.cc/t/example-code-for-timing-based-on-millis-easier-to-understand-through-the-use-of-example-numbers-avoiding-delay/974017
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}



void BlinkHeartBeatLED(int IO_Pin, int BlinkPeriod) {
  static unsigned long MyBlinkTimer;
  pinMode(IO_Pin, OUTPUT);
  
  if ( TimePeriodIsOver(MyBlinkTimer,BlinkPeriod) ) {
    digitalWrite(IO_Pin,!digitalRead(IO_Pin) ); 
  }
}

lass den mal laufen, schaue dir die debugausgabe an und poste die debug-Ausgabe als Code-Section

Vielen Dank übrigens schonmal für eure Antworten!

Das hier ist was der Serielle Monitor ausspuckt:

T#QԔ��Pt��*T�YY@����'a�ō���s�W{T]��������Ӛ��N��F�4���T]����@�]����}J�^(=x��4��N��\(=p��4

Die 10k Widerstände standen so im originalen Schema, hab das einfach so übernommen nachdem es ja bei anderen zu laufen scheint.. was ich allein schon wegen der 5V Versorgung am VIN des Nano bezweifle :thinking:
Die Löte ich nachher mal raus.
Wo soll ich die 5V messen? An dem Motortreiber Board liegen 5V an, daran hab ich jetzt alles was Strom braucht angeschlossen außer den Nano und den Motor.

Das hier ist übrigens die "originale" Schaltung, da hat aufgrund der 5V der Nano nichtmal gestartet:

Baudrate einstellen am Seriellen Monitor :wink: dann erkennst Du auch etwas.
gleich diesem hier

Serial.begin(115200);

Joop da fehlt GND zum NANO

So.. neue erkenntnis, danke für den Tip:
Ich habe alle 10K Widerstände ausgelötet, jetzt erkennt er den Schalter und den Hallsensor!
Der Motor dreht auch, aber das Poti gibt irgendwie nue Murks aus.. der Motor sollte theoretisch bis 1000 u/min gehen, beim drehen des Potis wird er aber erst schneller, dann langsamer und dann wieder schneller, aber immer viel zu langsam. Die Anzeige dazu geht erst in den + und dann zum Ende des Drehwegs hin in den - Bereich..

Das mit der Baud Rate probier ich gleich mal aus!

Auch 5V am Vin Pin ist falsch.

Direction Switch ist falsch beschaltet.
Wenn die internen Pullupwiderstände nicht aktiviert sind dann ist immer einer der beiden Eingangspins ohne definiertes Potential also kann da irgendwas zufällig gelesen werden ( HIGH oder LOW)
Wenn die internen Pullupwiderstände aktiviert sind dann machen diese mit den 10kOhm Widerstand einen Spannungsteiler. Da die internen Pullupwiderstände nominell einen Wert zwischen 20 und 50 kOhm haben (produktionsbedingt) ist die Spannung am Pin (bei 5V) bei geschlossenen Schalter zwischen ca 1,6 und ca 0,8V. Im ersten Fall genügt das Wahrscheinlich nicht um LOW erkannt zu werden.

Außerdem wieso brauchst Du einen Wechsler (Schalter) ? Wenn der Schalter offen ist dann ist er nicht zu. Es genügt ein Öffner oder ein Schließer, also nur einen Eingang. Willst Du auch ein Aus, also einen Schalter mit Mittelstellung dann brauchst Du 2 Eingänge und dann ist das Symbol für den schalter falsch.

Außerdem macht der 10kOhm Widerstand am Potentiometer diesen nichtlinear ( Der gelesene Spannungswert ist nicht proportional zum Drehwinkel).
Grüße Uwe

So, hier hab ich jetzt ein Brauchbares Protokoll aus dem Serial Monitor :slight_smile:
Was ich gemacht habe: Absichtlich alle Variablen die am Start überprüft werden auf Falsch gesetzt, also den Richtungsschalter nicht auf Aus und den Poti auch nicht auf Nullstellung.

Wie ich da erkennen kann, erkennt er dass ich den Poti auf 0 drehe und den Schalter auf 0 stelle.. dann startet er in den Betriebsmodus.. hier habe ich jetzt den Poti einmal voll auf und dann wieder auf 0 gedreht, er gibt mir da ganz brav eine Geschwindigkeit bis 1000 und wieder zurück aus. Der Motor wird aber abwechselnd schneller und langsamer und geht niemals annähernd an die 1000 U/min.

Er kopiert mir nicht alles da raus.. also er geht hoch bis 1000 und dann wieder runter auf 0

"01" analogRead(POT_PIN)=2174
"02" digitalRead(REED_PIN)=1
"03" digitalRead(CW_PIN)=1
"04" digitalRead(CCW_PIN)=0
"L1" digitalRead(CW_PIN) changed from 0 to 1
"L2" digitalRead(CCW_PIN) changed from 0 to 1
"L2" digitalRead(CCW_PIN) changed from 1 to 0
"L6" runState changed from 0 to 1
"L4" motorSpeed changed from 0 to 1
"L4" motorSpeed changed from 1 to 2
"L4" motorSpeed changed from 2 to 3
"L4" motorSpeed changed from 3 to 14
"L4" motorSpeed changed from 14 to 25
"L4" motorSpeed changed from 25 to 33
"L4" motorSpeed changed from 33 to 42
"L4" motorSpeed changed from 42 to 48
"L4" motorSpeed changed from 48 to 51
"L4" motorSpeed changed from 51 to 52
"L4" motorSpeed changed from 52 to 51
"L4" motorSpeed changed from 51 to 52
"L4" motorSpeed changed from 52 to 54
"L4" motorSpeed changed from 54 to 53
"L4" motorSpeed changed from 53 to 57
"L4" motorSpeed changed from 57 to 59
"L4" motorSpeed changed from 59 to 64
"L4" motorSpeed changed from 64 to 66
"L4" motorSpeed changed from 66 to 67
"L4" motorSpeed changed from 67 to 71
"L4" motorSpeed changed from 71 to 74
"L4" motorSpeed changed from 74 to 77
"L4" motorSpeed changed from 77 to 82
"L4" motorSpeed changed from 82 to 84
"L4" motorSpeed changed from 84 to 87
"L4" motorSpeed changed from 87 to 92
"L4" motorSpeed changed from 92 to 94
"L4" motorSpeed changed from 94 to 99
"L4" motorSpeed changed from 99 to 103
"L4" motorSpeed changed from 103 to 109
"L4" motorSpeed changed from 109 to 114
"L4" motorSpeed changed from 114 to 121
"L4" motorSpeed changed from 121 to 123
"L4" motorSpeed changed from 123 to 129
"L4" motorSpeed changed from 129 to 132
"L4" motorSpeed changed from 132 to 138
"L4" motorSpeed changed from 138 to 141
"L4" motorSpeed changed from 141 to 146
"L4" motorSpeed changed from 146 to 151

@uwefed Mit diesem Schema hat tatsächlich garnichts funktionert, deswegen hab ich mich selber auf die Suche begeben und bin letztendlich nicht sehr weit gekommen.. bis jetzt, dank eurer Hilfe! Bleibt nurnoch das Problem mit dem Motor.. da die Software die Potistellung ja einwandfrei erkennt, muss das dann ja irgendwo in der Ansteuerung vom Motor faul sein..

5V auf VIN ???? das haut nicht hin auch bei Nano! Du musst schon die auf 5V tun.
Auf VIN muss min 6.5V

Das hab ich mittlerweile schon geändert, anders hat er ja garnicht erst gestartet.
Jetzt geht es nurnoch darum, dass der Motor, wenn ich das Poti aufdrehe, im Verlauf immer erst schneller wird, dann plötzlich wieder fast stehen bleibt, wieder schneller wird usw. .. im Verlauf der Potidrehung insgesamt 4x

dann zeig mal auch den aktuellen Softwarestand

Der Softwarestand hat sich nicht geändert, ich habe lediglich die 10kOhm Widerstände aus der Schaltung entfernt, dadurch hat er dann den Richtungsschalter und den Hallsensor erkannt.

Von wo hast Du diese Beschaltung der H-Brücke L298?
Auf dem Enabel PIN die PWM aufschlagen kommt mir irgendwie Suspekt vor.
Auch deine Abfrage ob dann der Richtungsschalter auf IO5 und IO6 mindestens 1 mal auf LOW sein sollen.
Es wäre Sinnvoll wenn Du mal genau erklärst (In Einzelschritten) was Du vor hast. Dein Skatch passt überhaupt nicht zu deinem Mechanischen Aufbau

Ich habe das Ganze von Printables, einer 3D Druck Seite im Netz. Es soll eine Wickelmaschine für Gitarrentonabnehmer werden. Der Motor soll Stufenlos von 0 bis 1000 Umdrehungen per Poti gesteuert werden. Ein Richtungsschalter gibt die Drehrichtung vor. Dieser muss beim Einschalten auf neutral stehen, daher die Abfrage.
Die Beschaltung von ENA mit PWM ist aber ganz normal wie ich gelesen hab?
Ach ja.. ein Hallsensor zählt noch die Wicklungen per Magnet mit.

https://www.printables.com/model/464876-arduino-nano-pickup-winder

Ah ha... nun besser als ChatGPT :slight_smile:
als erstes würde ich mal auch den PotiPin als Input festlegen.
pinMode(POT_PIN, INPUT);

void Setup(){......


  pinMode(CW_PIN, INPUT_PULLUP);
  pinMode(CCW_PIN, INPUT_PULLUP);
  pinMode(IN3_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);
  pinMode(POT_PIN, INPUT);  // Das müsste Zeile 68 in deinem Sketch sein.

Ich geh davon aus, das Du dennoch nicht die 1000 1/min erreichen wirst. aber später dann mehr.