Ultraschallsensoren funktionieren nur mit USB

Hallo,
das ist mein erster Beitrag, deshalb Gnade, falls er nicht den Richtlinien entspricht.

Ich versuche eine Modellseilbahnsteuererung mit Arduino Nano zu erstellen:

  • In der Talstation befinden sich 2 Ultraschallsensoren, die die Entfernung der Gondeln messen.
  • Beim Einschalten läuft sie mit voller Geschwindigkeit los.
  • Nähert sich eine Gondel der Talstation, wird die Geschwindigkeit langsam reduziert.
  • Ist sie in der Talstation, bleibt die Seilbahn stehen, wartet 15 Sekunden und dann läuft der Motor in die andere Richtung langsam an, bis er die volle Geschwindigkeit erreicht hat.

Das funktioniert alles,wenn ich den Arduino über USB an den PC anschließe. Wenn ich ihn über ein Netzteil mit 12 V, über das auch der Motor läuft, anschließe, läuft der Motor immer mit voller Geschwindigkeit und wechselt dann irgendwann - nicht nachvollziehbar - die Richtung - wieder mit voller Geschwindigkeit.

Hier ist mein Schaltplan (etwas unprofessionell; wenn USB angeschlossen ist sind die beiden 12V Verbindungen VIN und GND am Arduino nicht verbunden):
grafik

Und mein Sketch:

/* Steuerung der Seilbahn
 * - Für jede Kabine der Seilbahn gibt es einen Ultraschall-Sensor, der den 
 *   Abstand der Kabine zum Sensor misst. Nähert sich eine Kabine bis auf 
 *   SLOW_DISTANCE wird die Geschwindigkeit verringert bis die Kabine 
 *   STOP_DISTANCE erreicht und dann steht.
 * - Dann bleibt die Seilbahn STOP_TIME lang stehen.
 * - Anschließend fährt die Seilbahn langsam an, bis sie SLOW_DISTANCE ereicht
 *   und fährt dann mit voller Geschwindigkeit weiter.
 *
 * Für die Abstandsmessung wird die Bibliothek "NewPing" verwendet, da 
 * sie einige Vorteile gegenüber der Standardbibliothek hat.
 *
 * Belegung Arduino:
 *	D1	
 *	D2	
 *	D3	
 *	D4	
 *	D5	Trigger-Pin linker Ultraschallsensor	
 *	D6	Echo-Pin linker Ultraschallsensor
 *	D7	Trigger-Pin rechter Ultraschallsensor
 *	D8	Echo-Pin rechter Ultraschallsensor
 *	D9	Motortreiber Pin 4	
 *	D10	Motortreiber Pin 5
 *	D11	Motortreiber Pin 6	
 *	D12	
 *	D13	
 * Belegung Motortreiber:
 *	___
 *  | |
 *  ---
 *  ___     Motor
 *  | |
 *  ---
 *    _______ 
 *    |1|2|3| |4|5|6|
 *    -------
 *
 * 1 +12V (in)
 * 2 GND
 * 3 +5V  (out)
 * 4 Arduino D9
 * 5 Arduino D10
 * 6 Arduino D11
 */

#include <NewPing.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Defines
#define DEBUG					// Steuerung der Debug-Ausgabe

#define MAX_DISTANCE	70 		// Maximaler Abstand in cm, der gemessen werden 
								// soll; größere Abstände werden nicht gemessen
#define SLOW_DISTANCE	50		// Abstand in cm, bei dem die Geschwindigkeit 
								// reduziert wird
#define STOP_DISTANCE	10		// Abstand in cm, bei dem gestoppt wird
#define STOP_TIME		15000 	// Stopzeit in ms in der Station
#define MOTOR_RECHTS  	false  	// Variable für die Motorrichtung
#define MOTOR_LINKS		true	// Variable für die Motorrichtung
#define NEXT_PING    	100		// Delay in ms nächste distanzabfrage (>= 30!)

// Vereinbarungen für den Motor
#define MIN_MOTOR_SPEED 	 50
#define MAX_MOTOR_SPANNUNG 10.0
#define MAX_ARD_SPANNUNG   10.0
#define MAX_ARD_SPEED       255

// Vereinbarungen für den Motortreiber
// Pin am Motortreiber | Pin am Arduino
//            6        |        11
//            5        |        10
//            4        |         9
#define MOTOR_PWM   9
#define MOTOR_IN1  10
#define MOTOR_IN2  11

// Die aktuellen Modi, in der sich die Seilbahn befinden kann
#define MODE_STOP        0
#define MODE_SLOWDOWN    1
#define MODE_ACCELERATE  2
#define MODE_MAX         3

// Linker Ultraschallsensor (in Fahrtrichtung)
#define TRIGGER_PIN_1  5
#define ECHO_PIN_1     6
NewPing sensor1 (TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE); 

// Rechter Ultraschallsensor  (in Fahrtrichtung)
#define TRIGGER_PIN_2  7
#define ECHO_PIN_2     8
NewPing sensor2 (TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE);

// Globale Variable
float distanceLinks,			// Gemessener Abstand links
	  distanceRechts,			// Gemessener Abstand rechts
	  currentDistance,			// Aktueller Abstand
	  currentMotorSpeed;		// Aktuelle Motorgeschwindigkeit
boolean currentMotorDirection;	// Aktuelle Motordrehrichtung
unsigned long myTimer = 0;		// Timer-Variable (nicht mit delay)
int speed,
	maxMotorSpeed,
	currentMode;
	
// --------------------------------------------

void setup() 
{
#ifdef DEBUG
	Serial.begin(9600);
#endif

	// Verbindung Motor
	pinMode (MOTOR_IN1, OUTPUT);
	pinMode (MOTOR_IN2, OUTPUT);
	pinMode (MOTOR_PWM, OUTPUT);
		
	// Motorspannung <= MAX_MOTOR_SPANNUNG, aber Arduino Maximalspannung = ARD_MAX_SPANNUNG5
	maxMotorSpeed = MAX_ARD_SPEED * MAX_MOTOR_SPANNUNG / MAX_ARD_SPANNUNG;

	// Seilbahn fährt am Anfang immer mit maximaler Geschwindigkeit los
	// Drehrichtung ist links
	currentMode           = MODE_MAX;
	currentMotorSpeed     = maxMotorSpeed;
	currentMotorDirection = MOTOR_LINKS;  
}

// --------------------------------------------

void loop() 
{
	// Abstände messen
	distanceLinks  = sensor1.ping_cm();
	distanceRechts = sensor2.ping_cm();
	
#ifdef DEBUG
  if (currentMode != MODE_STOP)
  {
    Serial.print("distanceLinks: ");
    Serial.print(distanceLinks);
    Serial.print("cm,    distanceRechts: ");
    Serial.print(distanceRechts);
    Serial.println("cm");
  }
#endif
 
	// Aktion abhängig vom Modus
	switch (currentMode)
	{
		case MODE_STOP:
			modeStop ();
		break;
				
		case MODE_SLOWDOWN:
			modeSlowDown ();
		break;
				
		case MODE_ACCELERATE:
			modeAccelerate ();
		break;
				
		case MODE_MAX:
			modeMax ();
		break;
	}

	// Warte bis zur nächsten Distanzabfrage
	delay (NEXT_PING); 
}

// --------------------------------------------

void setRotationDirection ()
{
	if ( currentMotorDirection )
	{
		// Drehrichtung links
		digitalWrite (MOTOR_IN1, HIGH);
		digitalWrite (MOTOR_IN2, LOW);
	}
	else
	{
		// Drehrichtung rechts
		digitalWrite (MOTOR_IN1, LOW);
		digitalWrite (MOTOR_IN2, HIGH);
	}
}

//---------------------------------------------

int calculateSpeed ()
{
  speed = MIN_MOTOR_SPEED + (maxMotorSpeed - MIN_MOTOR_SPEED) * 
		 (currentDistance - STOP_DISTANCE) /
         (SLOW_DISTANCE - STOP_DISTANCE);
  speed = max (speed, MIN_MOTOR_SPEED);              
  return speed;
}

//---------------------------------------------

void modeStop ()
{
#ifdef DEBUG
  Serial.println("modeStop ");
#endif  
	// Seilbahn wird gestoppt	
	currentMotorSpeed = 0;
	analogWrite (MOTOR_PWM, currentMotorSpeed);
	
	// Seilbahn wartet die vorgegebene Zeit.
	// Aber die Motorgeschwindigkeit = 0 muss gesetzt werden. Deshalb 
	// funktioniert "delay" nicht und ein Timer wird verwendet.
	if ( millis() > (myTimer + STOP_TIME ) )
	{
		// Stopzeit ist erreicht
		myTimer = millis();
  
		// Dann wird beschleunigt
		currentMode       = MODE_ACCELERATE;
		setRotationDirection ();
		currentMotorSpeed = MIN_MOTOR_SPEED;
		analogWrite (MOTOR_PWM, maxMotorSpeed);
	}
}

//---------------------------------------------

void modeSlowDown ()
{
	// Prüfe, ob die STOP_DISTANCE erreicht ist
	if ( (  currentMotorDirection && (distanceLinks  > 0) && 
			(distanceLinks  <= STOP_DISTANCE )) ||
         ( !currentMotorDirection && (distanceRechts > 0) && 
			(distanceRechts <= STOP_DISTANCE )) ) 
	{
		// Seilbahn wird gestoppt
		currentMode = MODE_STOP;
		
		// Timeranfangszeit wird gesetzt
		myTimer = millis ();
		
		// Motor-Drehrichtung wird umgekehrt
		if ( currentMotorDirection == MOTOR_RECHTS )
		{
			currentMotorDirection = MOTOR_LINKS;
		}
		else
		{
			currentMotorDirection = MOTOR_RECHTS;
		}
	}
	else
	{
		// Seilbahn wird verlangsamt
		// Aktueller Abstand
		if ( currentMotorDirection == MOTOR_RECHTS )
		{
			currentDistance = distanceRechts;
		}
		else 
		{
			currentDistance = distanceLinks;
		}

		// Fehlmessungen werden nicht  berücksichtigt
		if ( currentDistance == 0 )
		{
			return;
		}
		
		// Berechne die neue Geschwindigkeit
		speed             = calculateSpeed ();
		currentMotorSpeed = min (currentMotorSpeed, speed);
		
#ifdef DEBUG
  Serial.print("modeSlowDown ");
  Serial.print("   currentMotorDirection:   ");
  Serial.print(currentMotorDirection);
  Serial.print("   currentMotorSpeed:   ");
  Serial.print(currentMotorSpeed);
  Serial.print("   currentDistance:   ");
  Serial.println(currentDistance);
#endif 

		// Setze Drehrichtung und Geschwindigkeit
		setRotationDirection ();
		analogWrite (MOTOR_PWM, currentMotorSpeed);
	}
}

//---------------------------------------------

void modeAccelerate ()
{
	// Prüfe, ob die SLOW_DISTANCE erreicht ist
	if ( (  currentMotorDirection && (distanceRechts  > 0) && 
			(distanceRechts  >= SLOW_DISTANCE ))  ||
         ( !currentMotorDirection && (distanceLinks  > 0) && 
			(distanceLinks >= SLOW_DISTANCE )) ) 
	{
		// Seilbahn fährt mit  Maximal-Geschwindigkeit weiter
		currentMode       = MODE_MAX;
		currentMotorSpeed = maxMotorSpeed;
	}
	else
	{
		// Seilbahn wird  beschleunigt
		// Aktueller Abstand
		if ( currentMotorDirection == MOTOR_LINKS )
		{
			currentDistance = distanceRechts;
		}
		else
		{
			currentDistance = distanceLinks;
		}
		
		// Berechne die neue Geschwindigkeit
		speed             = calculateSpeed ();
		currentMotorSpeed = max (currentMotorSpeed, speed);
    
#ifdef DEBUG
  Serial.print("modeAccelerate ");
  Serial.print("   currentMotorDirection:   ");
  Serial.print(currentMotorDirection);
  Serial.print("   currentMotorSpeed:   ");
  Serial.print(currentMotorSpeed);
  Serial.print("   currentDistance:   ");
  Serial.println(currentDistance);
#endif 
 
		// Setze Drehrichtung und Geschwindikeit
		setRotationDirection ();
		analogWrite (MOTOR_PWM, currentMotorSpeed);
	}
}

//---------------------------------------------

void modeMax ()
{
#ifdef DEBUG
  Serial.print("modeMax: ");
  Serial.println(currentMotorSpeed);
#endif  
	// Setze Drehrichtung und Geschwindigkeit
	setRotationDirection ();
	analogWrite (MOTOR_PWM, currentMotorSpeed);

	// Prüfe, ob ein Grenzabstand schon erreicht ist
	if ( (  currentMotorDirection && (distanceLinks  > 0) && 
		(distanceLinks  <= SLOW_DISTANCE )) ||
         ( !currentMotorDirection && (distanceRechts > 0) && 
			(distanceRechts <= SLOW_DISTANCE )) ) 
	{
		currentMode = MODE_SLOWDOWN;
	}
}

Wo liegt mein Fehler?

Du hättest erst mal den Beitrag "Wie benutze ich das Forum" lesen sollen.
Dann weißt du, wie du den Sketch posten musst, damit dieser lesbar ist.
Und dein vermeintliches Schaltbild ist kein Schaltbild, da ist nichts drauf zu erkennen.

Es wird im Datenblat geschrieben VIN max 12V nur das Problem ist der Spannungsregler am NANO verträgt die 12V aber er wird sehr heiß und öfters schattet ab und ab 13V gibts Rauchwolke.
Also nim sowas

auf 4,8 - 5,2V einstellen .
Nur als Beispiel.
Dazu wahrscheinlich ist kleiner Fehler in der Schaltung.
Zeichne mit Hand so das man erkennen kann was Du meinst

Hallo fony, in welchem Datenblatt hast Du gelesen, dass der Spannungsregler des Nano ab 13V Rauchwolke erzeugt? Kannst Du dieses Datenblatt bitte verlinken?

Erfahrung (2 habe ich in den Halbleiterhimmel geschickt bei 13,5V) sowas wird selten in den blätter geschrieben

Dann hast du die Verlustleistung überschritten.
Die Regler sind mit 18V max. angegeben.

Oder du hast 2.Wahl gekauft.

Egal ach wie, war LCD 20x4 , 2 LED, BME280, RTC + SD Kartenleser dran zum Glück die NANO's haben überlebt nur der AMS1117 defekt

Neee, wenn es egal ist, dann thematisiert man es nicht.
Erst Recht nicht, wenn es falsch ist.

Und bei der Last, war es der Strom, der den gekillt hat.
Allerdings auch das ist ungewöhnlich.

Das wundert mich auch wobei die IC sehen aus wie original (Geläsert nicht wies bedruckt)

Was sagt uns das ?
Wenn 5 Volt Verbraucher dran hängen, mit der Spannung nie über 7Volt gehen.
Oder gleich alles mit 5Volt betreiben.

Genau soises deshalb seit dem meinem Unfug benutze ich die oben genanten Wandler, Kosten so viel wie nanno und sind dazu noch belastbar bis 3A

Hallo,
wenn es mit 5 V soweit geht scheint der Sketch ja erst mal ok zu sein. Leider kann man auf Deinem Schaltbild nichts erkennen. Ich vermute aber mal es fehlt irgendwo die 0V Verbindung .
Heinz

Ja Ok, wo es passt.
Mir wären die zu Groß. Ich suche die immer passend zum Projekt aus.
Vielfach auch einen AMS1117 plus Kondensatoren, wenn ich eine niedrige Eingangsspannung habe.

Oder Spannungsspitzen, die die absolute Maximum-Ratings überschritten haben.

@ mhartmuth

Ohne Schaltplan den man lesen kann können wir Dir nicht weiter helfen.
Das was Du geliefert hast ist ein mikriger ( = zu klein um was zu erkennen) Platinenplan wo wohl die Pisten (= Verbindungen) dargestellt sind aber nicht was sie verbinden.
Grüße Uwe

Ich hätte ja gerne alles richtig gemacht. Aber:

  • In einer Anleitung stand (sinngemäß): Bilder können einfach reinkopiert werden. Das habe ich gemacht und gleich gesehen, dass die Pixelanzahl sehr klein ist. Das Bild selber habe ich leider nicht gesehen.
  • Als ich mich im Forum angemeldet habe, kam eine kurze Anleitung, die aber gleich wieder verschwunden ist. Als ich dann die Frage formuliert habe, habe ich nach dieser Anleitung gesucht (Suchfunktion), sicher ne 1/2 Stunde, bin aber leider nicht fündig geworden. Auch bzgl. des Einfügens von Bildern habe ich nichts gefunden. Liegt vielleicht an meinem fortgeschrittenen Alter.
  • Was ich von anderen Foren kenne - ich bin kein eifriger Forenbesucher - ist eine Vorschau-Funktion, wo man seinen Beitrag ansehen kann, bevor man ihn abschickt.. Dann hätte ich gesehen, wies ausschaut. Diese Funktion habe ich hier nicht gesehen.
  • Habe jetzt tatsächlich den von dir erwähnten Beitrag gefunden. Da steht drin, dass ein Schaltplan nützlich ist, aber nicht wie ich ihn einfüge. Hilft mir also auch nicht viel. Also hilf mir: Wie füge ich ein Bild ein, so dass man es erkennen kann?

@Bernhard:
Im (nicht erkennbaren) Schaltbild ist ein Motortreiber L298N. Der liefert 5V. Und das habe ich auch probiert und den Arduino daran angeschlossen - mit demselben Ergebnis.

@Rentner
Genau das vermute ich auch, dass irgend ein Anschluss falsch ist. Aber meine Elektronikkenntnisse sind zeimlich beschränkt und deshalb meine Frage. Schaltbild kommt, sobald mir jemand sagt, wie ichs richtig einfüge.

Hier schon mal der Sketch - jetzt hoffentlich richtig formatiert:

/* Steuerung der Seilbahn
 * - Für jede Kabine der Seilbahn gibt es einen Ultraschall-Sensor, der den 
 *   Abstand der Kabine zum Sensor misst. Nähert sich eine Kabine bis auf 
 *   SLOW_DISTANCE wird die Geschwindigkeit verringert bis die Kabine 
 *   STOP_DISTANCE erreicht und dann steht.
 * - Dann bleibt die Seilbahn STOP_TIME lang stehen.
 * - Anschließend fährt die Seilbahn langsam an, bis sie SLOW_DISTANCE ereicht
 *   und fährt dann mit voller Geschwindigkeit weiter.
 *
 * Für die Abstandsmessung wird die Bibliothek "NewPing" verwendet, da 
 * sie einige Vorteile gegenüber der Standardbibliothek hat.
 *
 * Belegung Arduino:
 *	D1	
 *	D2	
 *	D3	
 *	D4	
 *	D5	Trigger-Pin linker Ultraschallsensor	
 *	D6	Echo-Pin linker Ultraschallsensor
 *	D7	Trigger-Pin rechter Ultraschallsensor
 *	D8	Echo-Pin rechter Ultraschallsensor
 *	D9	Motortreiber Pin 4	
 *	D10	Motortreiber Pin 5
 *	D11	Motortreiber Pin 6	
 *	D12	
 *	D13	
 * Belegung Motortreiber:
 *	___
 *  | |
 *  ---
 *  ___     Motor
 *  | |
 *  ---
 *    _______ 
 *    |1|2|3| |4|5|6|
 *    -------
 *
 * 1 +12V (in)
 * 2 GND
 * 3 +5V  (out)
 * 4 Arduino D9
 * 5 Arduino D10
 * 6 Arduino D11
 */

#include <NewPing.h>

// Defines
#define DEBUG					// Steuerung der Debug-Ausgabe

#define MAX_DISTANCE	70 		// Maximaler Abstand in cm, der gemessen werden 
								// soll; größere Abstände werden nicht gemessen
#define SLOW_DISTANCE	50		// Abstand in cm, bei dem die Geschwindigkeit 
								// reduziert wird
#define STOP_DISTANCE	10		// Abstand in cm, bei dem gestoppt wird
#define STOP_TIME		15000 	// Stopzeit in ms in der Station
#define MOTOR_RECHTS  	false  	// Variable für die Motorrichtung
#define MOTOR_LINKS		true	// Variable für die Motorrichtung
#define NEXT_PING    	100		// Delay in ms nächste distanzabfrage (>= 30!)

// Vereinbarungen für den Motor
#define MIN_MOTOR_SPEED 	 50
#define MAX_MOTOR_SPANNUNG 10.0
#define MAX_ARD_SPANNUNG   10.0
#define MAX_ARD_SPEED       255

// Vereinbarungen für den Motortreiber
// Pin am Motortreiber | Pin am Arduino
//            6        |        11
//            5        |        10
//            4        |         9
#define MOTOR_PWM   9
#define MOTOR_IN1  10
#define MOTOR_IN2  11

// Die aktuellen Modi, in der sich die Seilbahn befinden kann
#define MODE_STOP        0
#define MODE_SLOWDOWN    1
#define MODE_ACCELERATE  2
#define MODE_MAX         3

// Linker Ultraschallsensor (in Fahrtrichtung)
#define TRIGGER_PIN_1  5
#define ECHO_PIN_1     6
NewPing sensor1 (TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE); 

// Rechter Ultraschallsensor  (in Fahrtrichtung)
#define TRIGGER_PIN_2  7
#define ECHO_PIN_2     8
NewPing sensor2 (TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE);

// Globale Variable
float distanceLinks,			// Gemessener Abstand links
	  distanceRechts,			// Gemessener Abstand rechts
	  currentDistance,			// Aktueller Abstand
	  currentMotorSpeed;		// Aktuelle Motorgeschwindigkeit
boolean currentMotorDirection;	// Aktuelle Motordrehrichtung
unsigned long myTimer = 0;		// Timer-Variable (nicht mit delay)
int speed,
	maxMotorSpeed,
	currentMode;
	
// --------------------------------------------

void setup() 
{
#ifdef DEBUG
	Serial.begin(9600);
#endif

	// Verbindung Motor
	pinMode (MOTOR_IN1, OUTPUT);
	pinMode (MOTOR_IN2, OUTPUT);
	pinMode (MOTOR_PWM, OUTPUT);
		
	// Motorspannung <= MAX_MOTOR_SPANNUNG, aber Arduino Maximalspannung = ARD_MAX_SPANNUNG5
	maxMotorSpeed = MAX_ARD_SPEED * MAX_MOTOR_SPANNUNG / MAX_ARD_SPANNUNG;

	// Seilbahn fährt am Anfang immer mit maximaler Geschwindigkeit los
	// Drehrichtung ist links
	currentMode           = MODE_MAX;
	currentMotorSpeed     = maxMotorSpeed;
	currentMotorDirection = MOTOR_LINKS;  
}

// --------------------------------------------

void loop() 
{
	// Abstände messen
	distanceLinks  = sensor1.ping_cm();
	distanceRechts = sensor2.ping_cm();
	
#ifdef DEBUG
  if (currentMode != MODE_STOP)
  {
    Serial.print("distanceLinks: ");
    Serial.print(distanceLinks);
    Serial.print("cm,    distanceRechts: ");
    Serial.print(distanceRechts);
    Serial.println("cm");
  }
#endif
 
	// Aktion abhängig vom Modus
	switch (currentMode)
	{
		case MODE_STOP:
			modeStop ();
		break;
				
		case MODE_SLOWDOWN:
			modeSlowDown ();
		break;
				
		case MODE_ACCELERATE:
			modeAccelerate ();
		break;
				
		case MODE_MAX:
			modeMax ();
		break;
	}

	// Warte bis zur nächsten Distanzabfrage
	delay (NEXT_PING); 
}

// --------------------------------------------

void setRotationDirection ()
{
	if ( currentMotorDirection )
	{
		// Drehrichtung links
		digitalWrite (MOTOR_IN1, HIGH);
		digitalWrite (MOTOR_IN2, LOW);
	}
	else
	{
		// Drehrichtung rechts
		digitalWrite (MOTOR_IN1, LOW);
		digitalWrite (MOTOR_IN2, HIGH);
	}
}

//---------------------------------------------

int calculateSpeed ()
{
  speed = MIN_MOTOR_SPEED + (maxMotorSpeed - MIN_MOTOR_SPEED) * 
		 (currentDistance - STOP_DISTANCE) /
         (SLOW_DISTANCE - STOP_DISTANCE);
  speed = max (speed, MIN_MOTOR_SPEED);              
  return speed;
}

//---------------------------------------------

void modeStop ()
{
#ifdef DEBUG
  Serial.println("modeStop ");
#endif  
	// Seilbahn wird gestoppt	
	currentMotorSpeed = 0;
	analogWrite (MOTOR_PWM, currentMotorSpeed);
	
	// Seilbahn wartet die vorgegebene Zeit.
	// Aber die Motorgeschwindigkeit = 0 muss gesetzt werden. Deshalb 
	// funktioniert "delay" nicht und ein Timer wird verwendet.
	if ( millis() > (myTimer + STOP_TIME ) )
	{
		// Stopzeit ist erreicht
		myTimer = millis();
  
		// Dann wird beschleunigt
		currentMode       = MODE_ACCELERATE;
		setRotationDirection ();
		currentMotorSpeed = MIN_MOTOR_SPEED;
		analogWrite (MOTOR_PWM, maxMotorSpeed);
	}
}

//---------------------------------------------

void modeSlowDown ()
{
	// Prüfe, ob die STOP_DISTANCE erreicht ist
	if ( (  currentMotorDirection && (distanceLinks  > 0) && 
			(distanceLinks  <= STOP_DISTANCE )) ||
         ( !currentMotorDirection && (distanceRechts > 0) && 
			(distanceRechts <= STOP_DISTANCE )) ) 
	{
		// Seilbahn wird gestoppt
		currentMode = MODE_STOP;
		
		// Timeranfangszeit wird gesetzt
		myTimer = millis ();
		
		// Motor-Drehrichtung wird umgekehrt
		if ( currentMotorDirection == MOTOR_RECHTS )
		{
			currentMotorDirection = MOTOR_LINKS;
		}
		else
		{
			currentMotorDirection = MOTOR_RECHTS;
		}
	}
	else
	{
		// Seilbahn wird verlangsamt
		// Aktueller Abstand
		if ( currentMotorDirection == MOTOR_RECHTS )
		{
			currentDistance = distanceRechts;
		}
		else 
		{
			currentDistance = distanceLinks;
		}

		// Fehlmessungen werden nicht  berücksichtigt
		if ( currentDistance == 0 )
		{
			return;
		}
		
		// Berechne die neue Geschwindigkeit
		speed             = calculateSpeed ();
		currentMotorSpeed = min (currentMotorSpeed, speed);
		
#ifdef DEBUG
  Serial.print("modeSlowDown ");
  Serial.print("   currentMotorDirection:   ");
  Serial.print(currentMotorDirection);
  Serial.print("   currentMotorSpeed:   ");
  Serial.print(currentMotorSpeed);
  Serial.print("   currentDistance:   ");
  Serial.println(currentDistance);
#endif 

		// Setze Drehrichtung und Geschwindigkeit
		setRotationDirection ();
		analogWrite (MOTOR_PWM, currentMotorSpeed);
	}
}

//---------------------------------------------

void modeAccelerate ()
{
	// Prüfe, ob die SLOW_DISTANCE erreicht ist
	if ( (  currentMotorDirection && (distanceRechts  > 0) && 
			(distanceRechts  >= SLOW_DISTANCE ))  ||
         ( !currentMotorDirection && (distanceLinks  > 0) && 
			(distanceLinks >= SLOW_DISTANCE )) ) 
	{
		// Seilbahn fährt mit  Maximal-Geschwindigkeit weiter
		currentMode       = MODE_MAX;
		currentMotorSpeed = maxMotorSpeed;
	}
	else
	{
		// Seilbahn wird  beschleunigt
		// Aktueller Abstand
		if ( currentMotorDirection == MOTOR_LINKS )
		{
			currentDistance = distanceRechts;
		}
		else
		{
			currentDistance = distanceLinks;
		}
		
		// Berechne die neue Geschwindigkeit
		speed             = calculateSpeed ();
		currentMotorSpeed = max (currentMotorSpeed, speed);
    
#ifdef DEBUG
  Serial.print("modeAccelerate ");
  Serial.print("   currentMotorDirection:   ");
  Serial.print(currentMotorDirection);
  Serial.print("   currentMotorSpeed:   ");
  Serial.print(currentMotorSpeed);
  Serial.print("   currentDistance:   ");
  Serial.println(currentDistance);
#endif 
 
		// Setze Drehrichtung und Geschwindikeit
		setRotationDirection ();
		analogWrite (MOTOR_PWM, currentMotorSpeed);
	}
}

//---------------------------------------------

void modeMax ()
{
#ifdef DEBUG
  Serial.print("modeMax: ");
  Serial.println(currentMotorSpeed);
#endif  
	// Setze Drehrichtung und Geschwindigkeit
	setRotationDirection ();
	analogWrite (MOTOR_PWM, currentMotorSpeed);

	// Prüfe, ob ein Grenzabstand schon erreicht ist
	if ( (  currentMotorDirection && (distanceLinks  > 0) && 
		(distanceLinks  <= SLOW_DISTANCE )) ||
         ( !currentMotorDirection && (distanceRechts > 0) && 
			(distanceRechts <= SLOW_DISTANCE )) ) 
	{
		currentMode = MODE_SLOWDOWN;
	}
}

Gruß Markus

Warum soll das nochmal jemand aufschreiben ?
Es steht in der Beschreibung, die ich in meinem 1. Beitrag hier verlinkt habe.
Zudem wird es auch im Fenster, wenn du auf Antworten klickst, nochmals angezeigt.
Also genauer und besser geht es wirklich nicht.

Der Sketch ist jetzt ok und lesbar.

Eine Suche nach "Bild" (Ctrl+F) in dem von dir verlinkten Beitrag bringt genau 4 Fundstellen. Keine einzige davon beschreibt, wie man ein Bild hochlädt. Das erste Bild hab ich mit Ctrl+C - Ctrl+V eingefügt - so wie ich dads auch von vielen Programmen gewohnt bin.
Ich habs jetzt reingezogen, es sind mehr Pixel, sehenv tu ichs in meiner Antwort immer noch nicht.
Passts jetzt?

Glaube ich nicht. So funktioniert ein L298 nicht.

Oder hast Du ein Modul? wenn ja welches?

Grüße Uwe

Das Bild ist jetzt sichtbar.
Das du es im rechten Anzeigefenster nicht sehen kannst, muss an deinem Browser liegen.
Oder du musst das Fenster (Windowstechnik) vergrößern.
Ich kann mir hier beliebige Bilder reinziehen und sehe die im Anzeigefenster.

Und sorry, in der Beschreibung ist tatsächlich nicht erklärt, wie man hier mit "Windowstechniken" Bilder einfügt. Da geht man sicher davon aus, die User können das.

Zu deinem Problem:
Ich vermute bei 12Volt wird der Onboardregler zu heiß. Der kann das leider nicht ab, wass er verbraten soll.