Hallo Zusammen,
Vor einiger Zeit habe ich mit zwei alte S51 gekauft. Beide waren stark restaurierungsbedürftig =D. Nun sind beide frisch aufgebaut und ich bin auf der Suche nach einem neuen Projekt, wobei mir die Idee kam eine Digitalisierung an der Simme durchzuführen =D.
Kurz zu meiner Idee:
Alles was mechanisch abgenommen wird und durch Wellen übertragen wird, verursacht Reibung und Verschließ. Zudem ist es bei 50 ccm echt schwer den Motor richtig warm zu fahren und nicht gleich mit Vollgas loszubrettern #mangeldeSelbstdisziplin =D.
Der Plan:
Beide Vergaser Seilzüge, sowie die Tachowelle zu ersetzen.
Wie?
-> der Vergasser bekommt einen neuen CNC-Aluminium Deckel ( fahre BING deshalb problemlos möglich ). auf den Deckel kommen 2 Servos, einer für den Haubtschieber, einer für den Startvergaser. Beide Servos werden mittels E-Gas-Griff (aus dem E-Scooter-Bereich) angesteuert, zudem ermöglicht das eine Tempomatfunktion (beim betätigen eines Tasters wird die Gas-Servo-Position gehalten (bis hier hin steht mein Quellcode so halbwegs ).
Das ganze soll Temperatur und Drehzahlabhänig ablaufen: Heißt der Arduino misst die Temperatur (zum Beispiel mit einem Temperaturfühler an der Zündkerze)
und gibt in Abhänigigkeit von der Temperatur die Maximale Drehzahl für den Motor vor. Somit kann dieser schonend warm gefahren werden. Zudem loggt der Arduino sämtliche Motordaten auf einer SD-Karte.
Was natürlich die Könung des Ganzen wäre: ein Drehzahlgebundener Tempomat =D. Hierzu nimmt der Arduino nicht die Gas-Servo-Position beim Tastendruck, sondern speichert die Drehzahl, und hält diese dann nahezu konstant. so wird vermieden, dass man berghoch langsamer und bergab schneller wird. Drehzahl Pickup müsste man über Opptokoppler machen , könnte hierzu an den Geber der E-Zündung gehn ).
Was haltet Ihr davon? Auf einer Skala von "völlig Banane " bis "Hammer Idee" liege ich wo ?
Und nun an die IT-Nerds unter euch =D. Ich bin leider nur Werkstoff-Ingenieur und meine Arduino-Skills lassen etwas zu wünschen übrig . Ich hab mehrere Sketche gefunden und umgeschrieben. 2 Findet Ihr im Anhang. Einer für die Drehzahl-messung einer für die Servo-Steuerung. Beide funktionieren unabhänig von einander gut, nur wenn ich beides miteinander verwurste, dann geht garnichtsmehr xD. Beim Quellcode könnte ich also Hilfe gebrauchen . Alle CAD und CAM Sachen sind kein Problem, nen Deckel für den Bing und die Servohalterungen werde ich zeitnah fräsen =). Würde das Ganze natürlich für jederman verfügbar machen und auch gerne bei Bedarf die gefrästen Teile bzw CAD-Modelle zu Verfügung stellen.
---------------------------------------------------------------------------------Quellcode E-Gas-Griff-----------------------------------------------------------------------------
#include <Servo.h>
Servo servogas; // erstellt ein Servo-Objekt um einen Servomotor zu steuern
//Konstante Variablen
int pot1 = A1; // Analog Pin, an dem das Potentiometer angeschlossen ist
const int BUTTON = 2; // Pushbutton Pin auf dem Board (2)
const int TasterBremse = 3; //Bremstaster auf D3
// Variablen
int pot1_wert = 0; //wir setzen den Wert vor der Messung auf
int position1 = 0;
int val; // Variable um den Vert des Analogen Pin zwischen zu speichern
int val2 = 0; // speichert den Zustand des Tasters
int old_val2 = 0; // speichert den vorherigen wert von val2
int state = 0; // 0 = Servo Position eins 1 = Servo Position zwei
int konst; // hält den potiwert für den Tempomat bereit
int Bremse = 0; // bremstaster zustand wird hier abgelegt
int Bremse_old = 0;
int state2 = 0;
void setup() {
Serial.begin(9600); // Starte Serialmonitor
servogas.attach(4);
pinMode(BUTTON, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist - DAS IST GEÄNDERT
pinMode(Bremse, INPUT_PULLUP); // Bremse soll beim ziehen Tempomat deaktivieren
servogas.write(0); // gibt die Grundstellung des Servo beim start an
}
void loop() {
if (state == 1) {
servogas.write(konst); // Stelle servo auf 180 grad
Serial.print("P1 = "); // Der Serialmonitor soll vor dem Wert des ersten Potis "P1 =" anzeigen, fals wir mehrere Potis anschließen wollen
Serial.println(val); // Nun wird der Wert ausgegeben und die Zeile des Serialmonitors beendet.
Serial.print("Konstant = ");
Serial.println(konst);
Serial.print("State = ");
Serial.println(old_val2);
Serial.print("Bremse = ");
Serial.println(Bremse_old);
delay (50);
// Bremse = digitalRead(TasterBremse);
// if ( (Bremse == LOW) && (Bremse_old == HIGH)) {
// state = 1 - state;
// delay(50);
// }
// Bremse_old = Bremse; // aktueller val wird zu val alt
}
else {
val = analogRead(pot1); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 150, 900, 0, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und180)
konst = val;
servogas.write(val); // überträgt die Zielposition an den Servomotors
Serial.print("P1 = "); // Der Serialmonitor soll vor dem Wert des ersten Potis "P1 =" anzeigen, fals wir mehrere Potis anschließen wollen
Serial.println(val); // Nun wird der Wert ausgegeben und die Zeile des Serialmonitors beendet.
Serial.print("Konstant = ");
Serial.println(konst);
Serial.print("State = ");
Serial.println(old_val2);
delay(50); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
}
val2 = digitalRead(BUTTON); // liest den Input aus und cheked ob er gedrückt ist.
if ((val2 == LOW) && (old_val2 == HIGH)) {
state = 1 - state;
delay(50);
}
old_val2 = val2; // aktueller val wird zu val alt
}
---------------------------------------------------------------------------------QuellcodDrehzahlmessung (Danke GreatScott! )-----------------------------------------------------------------------------
#include <Arduino.h>
unsigned long rpmtime;
float rpmfloat;
unsigned int rpm;
bool tooslow = 1;
void setup() {
pinMode(9, OUTPUT); \\ Simuliert eine Drehzahl
Serial.begin(9600);
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1 << CS12); //Prescaler 256
TIMSK1 |= (1 << TOIE1); //enable timer overflow
pinMode(2, INPUT);
attachInterrupt(0, RPM, FALLING);
}
ISR(TIMER1_OVF_vect) {
tooslow = 1;
}
void loop() {
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9,LOW);
delay(100);
if (tooslow == 1) {
Serial.print("SLOW ");
}
else {
rpmfloat = 120 / (rpmtime/ 31250.00);
rpm = round(rpmfloat);
Serial.print("Drehzahl = ");
Serial.print(rpm);
}
}
void RPM () {
rpmtime = TCNT1;
TCNT1 = 0;
tooslow = 0;
}