Wo soll ich anfangen?
Erstmal damit:
Hi ihr hier, von mir aus. Mein erster Post, bitte seid gnädig.
Ich bin ein Kinderauto für meine Enkeling und zukünftigen Enkel am bauen.
Und würde euch bitten, mal über meinen Arduino Code zu schauen um Anfängerfehler zu erkennen und mir mitzuteilen.
Kurzer Überblick:
- 2 Bleigelbatterien in Reihe für 24V
- 2 Motoren DC die über den Controller unten geregelt werden sollen
- Gaspedal mit Hallsensor
- Original Vor- / Rückwärtsschalter wird übernommen aber über Relais an den Controller gegeben
- RC Fernbedienung und Empfänger aus dem Modellbau
Dazu verwende ich:
-Arduino Nano Every
-Klemmboard dafür
AZDelivery Nano Terminal Adapter Board mit Schraubklemmen
-Relaismodul
Elegoo 8 Kanal DC 5V Relaismodul mit Optokoppler für Arduino UNO R3 1280 DSP ARM PIC AVR STM32 Raspberry Pi
-Motorcontroller
Akozon DC Motor Drehzahlregler PWM Steuerschalter Regler 10-50V 100A 5000W Hochleistungs Motor Drehzahlregler Schalter
-Gaspedal
elektrische gaspedal für Kart Gas elektrische Auto - Kinder - Dreirad mit fußpedal elektrische geschwindigkeitskontrolle
-Netzteile für die Spannungen
4 Stücke Einstellbarer LM2596S DC-DC Abwärtswandler Abwärt Spannungsregler Leistungsmodul 36V 24V 12V bis 5V 2A Spannung Stabilisator mit Digitaler Voltmeter Anzeige
-Ein klein bisschen angeeignetes Wissen
Arduino: Kompendium: Elektronik, Programmierung und Projekte
-Fernsteuerung und Empfäner diesen Typs
-Hat nichts mit Arduino zu tun, aber diesen Fahrtenregler für die Lenkung
Leider konnte ich nicht alle Links mit Posten, aber alles mit #ist von Amazon
Nun zu meinem Code:
//mittlerwert lib
#include <RunningMedian.h>
RunningMedian samples = RunningMedian(8); //anzahl durchgänge für mittelwer
//gaspedal
int GPdrossel = 125; //drossel gaspedal standart 125
int nullgas = 55; //nullpunkt gaspedal
float gpteiler = 0.6; //gpteiler
int gaspedal = A1; //Gaspedal Input
int vargaspedal = 0; //variable gaspedal
int GPschub = 0; //Schub von Gaspedal
//knüppel
int kn1 = 0; //eingang knüppel pin 4
int kn2 = 0; //eingang knüppel pin 6
bool KNvor = 0; //knüppel vorwärts
bool KNzur = 0; //knüppel rückwärts
int nitroknopf = 0; //nitro eingang pin 2
bool nitro = 0; //nitro Knopfvariable
// fernbedienung
int CH_2 = 3; //rc empfänger pin pin 3
int FBin = 0; //fernbedienung live input
int fb = 0; //rc empfänger pulsezeit enstörrt & korrigiert
int nullvor = 1260; //nullpunkt vorwärts mittelwert etwa 1230
int nullzur = 1190; //nullpunkt rückwärts
int fbstoerL = 900; //störungskorrektur unten 900
int fbstoerH = 1900; //störungskorrektur oben 1900
int FBschub = 0; //gasstellung zum poti
bool FBvor = 0; //vorwärts von FB
bool FBzur = 0; //rückwärts von FB
// ausgabe zum controller
int Cschub = 0; //variable ausgang zum poti
bool Cvor = 0; //vorwärtsgang
bool Czur = 0; //rückwärtsgang
// ------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(19200); //usb schnitstelle monitor
//knüppel initialisieren
pinMode(4, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
//nitro initialisieren
pinMode(2, INPUT_PULLUP);
//relais initialisieren
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
//Controller initialisieren
pinMode(7, OUTPUT);
}
//-----------------------------------------------------------------------------------------------------------------------------------
void loop() {
//reset
Cvor = 0;
Czur = 0;
Cschub = 0;
FBvor = 0;
FBzur = 0;
GPschub = 0;
FBschub = 0;
KNvor = 0;
KNzur = 0;
nitro = 0;
nitroknopf = 0;
//einlesen eingänge
analogRead(gaspedal);
digitalRead(2); //nitro knopf
digitalRead(4); //KNvor
digitalRead(6); //KNzur
//gaspedal
vargaspedal = analogRead(gaspedal)/4-nullgas; //korrigiertes gaspedal
//nullkorrektur gaspedal
if (vargaspedal<0) {
vargaspedal=0;
}
GPschub = vargaspedal/gpteiler; //vargaspedal input / gpteiler = GPschub
//begrenzer gaspedal
if (GPschub > 255) {
GPschub =255;
}
//drossel & nitro gaspedal
nitroknopf = digitalRead(2);
if(nitroknopf == LOW) { //wenn nitro gedrückt, keine drossel
nitro = 1;
}
if (nitro<1) { //wenn nitro nicht gedrückt, GPschub auf auf GP drossel begrenzt
if (GPschub>GPdrossel) {
GPschub = GPdrossel;
}
}
//knüppel
KNvor = 0;
KNzur = 0;
kn1 = digitalRead(4);
kn2 = digitalRead(6);
if (kn1 == LOW) {
KNvor = 1;
}
if (kn2 == LOW) {
KNzur = 1;
}
//fernbedienung
//signal auslesen
int FBin = pulseIn(CH_2, HIGH, 25000); //dekodierung empfängerpin in pulsezeit
fb = FBin; //pulzeit von empfänger zu variable FB
//FB Entstörung
if (FBin<fbstoerL) { //wenn das Signal von FBin außerhalb der Tolleranz fbstoerL oder fbstoerH ist, wird fb auf nullpunkt (1230) gesetzt
FBvor = 0;
FBzur = 0;
FBschub = 0;
fb = 1230;
}
if (FBin>fbstoerH) {
FBvor = 0;
FBzur = 0;
FBschub = 0;
fb = 1230;
}
//mittelwertbestimmung mit RunningMedian.lib um weitere störungen zu filtern
int x = fb; //entsörtes signal wird zur mittelwertbestimmung übergeben
samples.add(x);
long m = samples.getMedian();
fb = m; //mittelwert wird als fb zurück gegeben
//erkennung richtung und schub
//vorwärts
if (fb >nullvor) { //entstörtes und gemitteltes Signal wird mit den Nullpunkt Variablen verglichen/umgerechnet, vor- oder rückwärtsgang eingelegt und FBschub geschrieben sowie auf max 255 begrenzt
FBvor =1;
FBschub = fb-nullvor;
FBschub = FBschub/2;
}
//rückwärts
if (fb <nullzur) {
FBzur =1;
FBschub = nullzur-fb;
}
//schubbegrenzung
if (FBschub>255) {
FBschub =255;
}
//MOTORCONTROLLER
//C-vorwärts
if (FBvor>0) { //wenn vorwärtssignal von Fernbedienung kommt, wird alle anderen Variablen überschrieben und vorwärtsgang eingelegt
KNvor = 0;
KNzur = 0;
Czur = 0;
Cvor = 1;
}
else {
Cvor = KNvor; //kein signal von Fernbedienung, Knüppelstellung wird übernommen
}
//C-rückwärts
if (FBzur>0) { //wenn rückwärtssignal von Fernbedienung kommt, wird alle anderen Variablen überschrieben und rückwärtsgang eingelegt
KNzur = 0;
KNvor = 0;
Cvor = 0;
Czur = 1;
}
else {
Czur = KNzur; //kein signal von Fernbedienung, Knüppelstellung wird übernommen
}
//C-schub
if (FBschub>5) { //wenn an der Fernbedienung merkbar Gas gegeben wird, wird Gaspedal auf 0 gesetzt und FBschub auf Controllerschub geschrieben
Cschub = FBschub;
GPschub = 0;
}
else {
Cschub = GPschub;//kein Schubsignal von der Fernbedienung, Controllerschub wird vom gedrosseltem Gaspedal übernommen
}
//Relaiskarte
//leerlauf
if (Cvor+Czur == 0) {
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
}
//Cvorwärts
if (Cvor == 1) {
digitalWrite(9, HIGH);
delay(80);
digitalWrite(10, LOW);
}
//Crückwärts
if (Czur == 1) {
digitalWrite(10, HIGH);
delay(80);
digitalWrite(9, LOW);
}
analogWrite(5, Cschub);
//monitor ausgaben
Serial.print(" GP: ");Serial.print(vargaspedal);
Serial.print(" GPschub: ");Serial.print(GPschub);
Serial.print(" KNvor: ");Serial.print(KNvor);
Serial.print(" KNzur: ");Serial.print(KNzur);
Serial.print("\t");Serial.print("\t");
Serial.print(" FBin: ");Serial.print(FBin);
Serial.print(" FB: ");Serial.print(fb);
Serial.print(" FBschub: ");Serial.print(FBschub);
Serial.print(" FBvor: ");Serial.print(FBvor);
Serial.print(" FBzur: ");Serial.print(FBzur);
Serial.print("\t");Serial.print("\t");
Serial.print("AUSGABEN:");
Serial.print("\t");
Serial.print(" Cvor: ");Serial.print(Cvor);
Serial.print(" Czur: ");Serial.print(Czur);
Serial.print(" Cschub: ");Serial.print(Cschub);
//nicht löschen!!
Serial.println(" ");
digitalWrite(7, LOW);
}
Soweit so gut.
Ich hoffe es ist alles halbwegs aktzeptabel und verständlich kommentiert und geschrieben.
Bitte teilt mir eure gedanken und anregungen mit.
Wie gesagt, ich bin da NOOB, das was ich gemacht habe funktioniert ganz gut, aber bevor ich alles zusammenbaue, würde ich gern die PRO- meinungen hören.
Für Anmerkungen und Kritik bin ich hier....
Grüße
AMORph01