E-Scooter mit Arduino und Daumengas regeln

Hallo,

ich bin gerade dabei meinen eigenen E-Scooter zu bauen (ja ich weiß, dass das nicht zugelassen ist, aber darum geht es nun nicht :D...)
bei der Regelung bin ich nach diesem Schema vorgegangen:
Arduino und MOSFET steuern Gleichstrommotor – Makerblog.at (mit dazugehörigem Programm)
Nun möchte ich die Geschwindigkeit nicht über ein Poti, sondern über ein Daumengasgriff regeln.
Dafür habe ich einen einfachen Daumengasregler bei ebay bestellt:
https://www.ebay.de/itm/Daumengas-Gasgriff-Gashebel-für-E-Bike-Elektro-Bike-Elektrofahrrad-E-Scooter-DE/283581348768?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649
Folgendes Problem ist nun aufgetreten:
ich kann zwar die Geschwindigkeit über den Daumengasgriff regel, jedoch fängt der Motor sofort nach dem einschalten mit geringer Drehzahl zu laufen, ohne das Daumengas zu betätigen....
Kann mir jemand weiterhelfen, wie ich dieses Problem lösen kann?
Evtl mit einer Programmänderung oder einem vorgeschalteten Widerstand?
Wäre sehr über eure Hilfe dankbar

Hallo Fu83,
ich schätze mal, dein Daumengas ist ein Potentiometer.
Ich habe mir auch kurz den Link zum Makerblog angeschaut.
Sehr wahrscheinlich nutzt Dein Daumengas nicht den vollen weg des Potentiometers und das Potentiometer steht bei Nullstellung des Daumengas nicht auf Null oder GND.
Du musst deshalb in Deinem Sketch die Abfrage des Daumengas etwas anpassen.

Setze bitte Deinen Sketch hier ins Forum, damit ich Dir weiterhelfen kann.
Wir müssen nämlich Deinen sketch etwas erweitern, damit Du die Werte für die 'Nullstellung' also für Stop, sowie für 'Vollgas' angezeigt bekommst, so dass wir diese Werte richtig umsetzen können.

LG Stefan

Zwei Möglichkeiten: der Antrieb läuft erst wenn der eScooter per Fußtritt angeschoben wurde,
oder vom Gasgriff wird ein Offset abgezogen, so daß der Motor erst mal steht.

vielen Dank für deine schnelle Antwort!
Der Sketch ist genau der gleiche wie der, der unter dem Link von Makerblog zu finden ist.
Oder kann ich ihn hier auch irgendwie einstellen?

DrDiettrich wie würde denn so ein Offset aussehen und an welche Stelle des Programms müsste er?

Hallo fu83,
ja Du kannst den sketch hier reinstellen. Benutze im Forumseditor die CodeTags Symbol </> oben links in der Symbolleiste.
Was für nen Arduino benutzt Du?

LG Stefan

const int gatePin = 9;
const int potiPin = A0;
int potiValue = 0;
 
void setup() 
{
  pinMode(gatePin, OUTPUT);
}
 
void loop() 
{
    potiValue = analogRead(potiPin)/4;
    analogWrite(gatePin, potiValue);
}

Ich benutze einen Arduino UNO

DrDiettrich:
Zwei Möglichkeiten: der Antrieb läuft erst wenn der eScooter per Fußtritt angeschoben wurde,
oder vom Gasgriff wird ein Offset abgezogen, so daß der Motor erst mal steht.

Erste Möglichkeit würde ich nicht empfehlen, ein Zweirad sollte mMn kein Gas geben, wenn nicht Gas gegeben wird. Mal abgesehen von technisch ausgereiften Tempomat Systemen bei übermäßig ausgestatteten Motorrädern deutschen Fabrikats.

Wenn du es einfach haben willst nimm die map() Funktion. Wird etwa so verwendet:

map(Variablenname, niedrigster Potiwert, höchster Potiwert, neuer (gewünschter) niedrigster Wert, neuer höchster Wert)

(für die letzten beiden Werte möchtest du 0 und 255 verwenden, die ersten Werte musst du selbst rausfinden, das was dein Poti eben bei "kein Gas" und bei "Vollgas" anzeigt.

Zur Map Funktion kannst du hier noch mehr nachlesen: Arduino-Referenz - Arduino-Referenz

Danke für die Info, fu83.
Nimm erstmal diesen Sketch , kompilire ihn und dann auf den Uno hochladen.

// Gate des MOSFET über PWM-_Pin ansteuern!
const int gatePin = 9;
const int potiPin = A0;

const int minPoti = 0;      // hier den Wert eintragen der dir im Serial-Monitor bei nulstellung vom Daumengas angezeigt wird
const int maxPoti = 255;   // hier den Wert eintragen der dir im Serial-Monitor bei vollgastellung vom Daumengas angezeigt wird
int potiValue = 0;
int oldPoti = 0;

void setup() {
  Serial.begin(9600);
  pinMode(gatePin, OUTPUT);
}
 
void loop() { 
    potiValue = analogRead(potiPin)/4;
    if (oldPoti =! potiValue){
      Serial.print("Gasstellung");
      Serial.println(potiValue);
      oldPoti = potiValue;
    }    
    analogWrite(gatePin, map(potiValue, minPoti, maxPoti, 0 , 255));
}

Dann aktiviere den Seriellen Monitor in der IDE , benutze dazu das kleine Lupensymbol oben rechts.
Der Serielle Monitor gibt Dir nun die werte , die vom Daumengas kommen aus, wenn Du das Gas bedienst.
Notiere Dir die beiden werte die du erhältst, wenn Du das Gas ganz offen und wenn Du es ganz zu hast.

Den wert vom ganz geschlossenen Gas trägst du dann im Sketch oben bei const int minPoti = ein. und den Wert von Gas ganz offen, also Vollgas bei cinst int maxPoti =
Einfach die Zahl, die jetzt da steht ersetzen.

LG Stefan

Hi

Mein Ansatz:
Bei JEDEM Start muß das Daumengas EINGELERNT werden.
Dafür wird das Gas 1x langsam bis zum Maximum, 1x langsam bis zum Minimum betätigt (sofern Es 'nach Unten' auch noch weiter geht).
Dadurch kann der Arduino als erste Amtshandlung den Stellbereich des Poti mitschreiben, erkennt, wenn Du Damit fertig bist, piepst 2x und der Spaß kann beginnen.
(Piepsen kann der Arduino nicht 'von Haus aus')
Von den so erfassten Endpositionen gerne etwas weg bleiben - besonders von der Unteren, damit sicher 'kein Gas' erkannt wird.
Zusätzlich, sofern nicht eh schon vorgesehen, eine Abwurf-Erkennung - wenn's dar Scooter geschafft hat, Dich loszuwerden, sollte - egal welche Gas-Stellung - auf Null angenommen werden.

MfG

Im Daumengas ist normalerweise ein Hallsensor eingebaut.
Der liefert immer ein wenig Spannung bei Endanschlag unten und keine volle 5V bei oberem Anschlag. Damit kann auch eine Überprüfung auf Unterbrechung und Kurzschluss erfolgen. Nach dem Einschalten Spannung messen und wenn diese 0V oder 5V beträgt, auf Störung gehen und den Motorstrom sperren.

edit1:
Schau Dir mal die Funktion "map" an. Da kannst Du Deinen Wertebereich anpassen.
https://www.arduino.cc/reference/en/language/functions/math/map/

edit2:
Vergiss nicht einen Watchdog einzubauen. Dumm wenn Dir bei dem Ding bei voller Geschwindigkeit der Arduino einfriert und er nicht mehr auf gewünschte Geschwindigkeitsänderungen reagiert.

Gruß, Jürgen

Danke für die hilfreichen Antworten und vorallem danke deltaflyer für den Sketch!
Könntest du evtl nur noch dein Programm mit Kommentaren erläutern? Insbesondere warum die 9600 und warum der Poti Wert durch 4 geteilt werden muss?

Hi fu83
Die 9600 ist die Baudrate, also die Geschwindigkeit mit der der Serielle Monitor mit dem Arduino Daten austauscht. Standardmässig ist der Serielle Monitor in der IDE auf 9600 Baud eingestellt. Der Serielle Monitor, sowie der Arduino schaffen das schon auch viel schneller, jedoch habe ich extra die Standard-Einstellung im Sketch für Dich gewählt, weil wenn die beiden einstellungen NICHT übereinstimmen, zeigt die der Serielle Monitor nur Müll an. Und ich wusste nicht genau, wie fit Du im Umgang mit der IDE schon bist, da wollte ich dich nicht mit unsinnigen Anzeigen des Seriellen Monitors konfrontieren.

Das Teilen des Potiwert durch 4 war ja schon im Original-Sketch so.
Es ist so: Beim Einlesen eines wertes am Analogeingang (egal an welchem) vom Arduino bekommst Du eine Zahl von minimal 0 und maximal 1023.
Beim schreiben eines Analog-Wertes an enen PWM-Ausgang geht der Wertebereich nur von minimal 0 - maximal 255. Der wertebereich beim Einlesen des Poti umfasst somit also maximal 1024 (die 0 wird mitgezählt). Und beim Schreiben auf einen PWM hast Du einen maximalen Bereich von 256 (auch hier wird die 0 mitgezählt). 256 sind ja 1/4 von 1024, darum muss der eingelesene Wert durch 4 geteilt werden, bevor er an den PWM rausgeschrieben werden kann.
Ohne die Teilung durch 4 würde dein motor spätestens ab 1/4 Gasstellung mit voller Geschwindigkeit drehen.

Reicht es Dir so als Erklärung (Du kannst ja damit auch selber noch Komentare in den Sketch einfügen) , oder muss ich den Sketch nochmals überarbeiten und frisch hochladen? Dann müsstest Du aber bis Abends warten, ich hab die IDE nicht auf diesem Rechner an dem ich grad Arbeite drauf. (Ist der PC meiner meiner CNC-Fräsen, bin grad am Fräsen und kann nicht weg).
Sorry.

LG Stefan

Danke für die Erklärung!
Nein alles gut, so ist es voll in Ordnung danke

ich habe nun den sketch von dir auf den UNO geladen und wollte das mit dem Seriellen Monitor probieren. jedoch zeigt dieser nichts an... danach habe ich es nochmal mit meinem normalen Poti versucht, dabei zeigt der serielle monitor nur etwas an wenn das Poti auf "Null" steht und zwar "Gasstellung 0". Da das Daumengas jedoch nie ganz auf null steht, wird wahrscheinlich auf dem seriellen Monitor nichts angezeigt.. oder mache ich iwas falsch?

Eigentlich sollte sich der Wert im Serial-Monitor ändern, am anfang , also was anderes als 0 anzeigen und ddann erst wieder was schreiben, wenn du die Gasstellung änderst. Hab ich gemacht, damit der nicht wie verrückt in jedem Loopdurchlauf den Gleichen wert hinschreibt, wenn sich nix am gas ändert.

Was wird dir angezeigt, wenn Du diesen Sketch benutzt:

// Gate des MOSFET über PWM-_Pin ansteuern!
const int gatePin = 9;
const int potiPin = A0;

const int minPoti = 0;      // hier den Wert eintragen der dir im Serial-Monitor bei nulstellung vom Daumengas angezeigt wird
const int maxPoti = 255;   // hier den Wert eintragen der dir im Serial-Monitor bei vollgastellung vom Daumengas angezeigt wird
int potiValue = 0;
int oldPoti = 0;

void setup() {
  Serial.begin(9600);
  pinMode(gatePin, OUTPUT);
}
 
void loop() {
    potiValue = analogRead(potiPin)/4;
    //if (oldPoti =! potiValue){
      Serial.print("Gasstellung");
      Serial.println(potiValue);
     // oldPoti = potiValue;
    //}   
    analogWrite(gatePin, map(potiValue, minPoti, maxPoti, 0 , 255));
}

So schreibt er halt bei jedem Loopdurchgang den Potiwert an den Serial-Monitor, egal, ob sich dieser ändert oder nicht.

Wenn Du mit meinem ersten Sketch das gas bewegst, wärend auch der serielle Monitor offen ist, regelt denn dann der Motor? Nicht dass Du jetzt das daumengas am falschen analogeingang angeschlossen hast?

LG Stefan

perfekt so funktioniert es jetzt
der MinWert ist 45 und der MaxWert ist 219 muss ich diese nur oben ändern oder auch unten bei "map" wo 0 und 255 steht?

Hallo fu83
du must die Werte NUR oben eintragen. Wenn du das im Map einträgst, und da was falsch machst, läuft das Ganze nicht mehr richtig.
Die beiden Werte 0 und 255 darfst du nicht ändern,, die geben an, Was der minimale und der Maximale AUSGANGS-Wert ist, der an den PWM-Pin gegeben werden kann. Damit weiss der arduino, wie er die Eingangswerte umrechnen muss, damit Du den gesamten Regelbereich des Motors nutzen kannst.

Trage oben bei minPoti besser 50 anstatt nur 45 ein, dann bewegt sich der E-Scooter nicht schon bei der allerleisesten Berührung des Daumengas. Du hast dann in der Stopstellung etwas spielraum, einen sogenanten Tot-Bereich, in dem noch nix passiert. Das kann beim Aufsteigen eine gewisse Sicherheit geben, falls Du dabei an den Gashebel kommst. So einen Totbereich hat man oft auch bei ferngesteuerten Modellen.
Ich hab den bei meinen ferngesteuerten Elektro-Autos, bei allen drin, besonders bei denen die in 2,3 Sekunden von 0 auf 100Km/h beschleunigen ist das ein grosser Vorteil und Sicherheitsaspekt.

LG Stefan

p.s. so Mittagsruhe vorbei, ich muss wieder weiter fräsen.

Danke für deine ausführliche Antwort!
Hab nun das Programm mit Motor und allem getestet und beim 1. Versuch klappte auch alles wunderbar, aber nach dem ich die Geschwindigkeit erhöht habe läuft er jetzt immer mit vollgas.... auch nach erneutem ausschalten und wieder einschalten läuft der Motor gleich in Volllast ohne das Daumengas zu berühren... :astonished: langsam bin ich echt bisschen am verzweifeln... :sweat_smile:

Hallo fu83,
dann musst Du mir jetzt ein par Infos geben, damit ich weiss wie Dein Aufbau aussieht:
Was hast Du für einen Motor angeschlossen? (Stromverbrauch?)
Welchen Mosfet hast du genommen, bitte genauen Typ:
Welchen Typ hat Diode?
Mit wieviel Spannung betreibst Du den Motor?

Das Ganze klingt jetzt nämlich nach nem Mosfet, der dauernd durchschaltet.
Mache wenn möglich ein Foto Deines aufbaus und stelle es hier rein.

Nur wenn ich diese Infos habe, kann ich Dir weiter helfen.
LG Stefan