Problem: ich möchte das Fahrradtachosignal, also das, was vom
Speichenmagnet erzeugt wird, nutzen, um bei einer bestimmten
Geschwindigkeit einen Schaltvorgang auszulösen, bspw oberhalb 8km/h
dauerhaft "ein"
Kann mir jemand behilflich sein?
Danke vorab
Genau dazu kann man sehr gut einen Mikrocontroller nehmen.
mit FlipFlop-Zähler und Quarz ginge auch. Ist aber ein bisschen 70er.
1 Transistor der von einer Kapzitität mit Selbstentladung getriggert
wird ginge auch. Ist wohl die sportlichste Variante.
Danke, ahnte schon, daß es auf DiY hinausläuft. Und da ist das Problem
hinter der Tastatur :D
Noch nie was mit Elektronik gemacht :( Aber da muß ich nun mal durch.
Es geht ja schon damit los, daß ich die elektrischen Werte des Impulses
der vom Tachosensor kommt nicht kenne. Was ich schalten möchte sind
allerdings nur max 5V und sehr kleiner Strom, in etwa der Größe, wie
auch von Tachosensor.
Mikroprozessor möchte ich für diesen trivialen Anwendungsfall
ausschließen, da muß ich ja noch viel mehr Aufwand betreiben ;)
Der Tachsensor (also das Teil, das direkt neben deiner Speiche befestigt
ist), ist ein sogenanntes Reedrelais. Es schaltet zu, wenn der Magnet
(der an der Speiche befestigt ist) an ihm vorbeiläuft.
Der Tacho wertet das dann aus und berechnet daraus die
Winkelgeschwindigkeit des Rads. Mit dem eingestellten Radumfang wird
dann die Geschwindigkeit berechnet.
So wurde es jedenfalls früher gemacht. Welche anderen Systeme es heute
gibt (drahtlos und der ganze Müll), kann ich dir nicht sagen.
Wenn du so ein System hast, kannst du wahrscheinlich mit dem Multimeter
zwischen den beiden Kabel des Reedrelais einen Spannungsimpuls messen,
wenn du das Rad drehst.
Das kann dann ausgewertet werden (µC, analoges Zeitglied).
Deine erste Aufgabe ist also erst mal das Signal festzustellen/messen.
@pegel interessant, muß ich mir mal in Ruhe anschauen, sowas in der Art
dachte ich als "Baustein"
Wenn man als "Laie" sowas sucht, fehlen einem die Suchbegriffe
Es gab mal den MilCandy von SeeedStudio. Weiss nicht, ober der noch
verfügbar ist. Dieser hat einen Input (in deinem Fall für den
Magnetschalter) und einen Output. Je nachdem, was du schalten möchtest,
müsstest du noch ein Relais oder ähnliches anschliessen.
https://www.mouser.com/ds/2/744/Seeed_102990023-1217532.pdf
Dem MilCandy verpasst man dann noch ein entsprechende Programm. Diese
paar benötigten Zeilen Code kann dir sicherlich hier im Forum jemand
"spendieren".
Timo N. schrieb:> Deine erste Aufgabe ist also erst mal das Signal festzustellen/messen.
Richtig. Wenn du dich dann für die Frequenz-Spannungswandler Variante
entscheidest, kann zur Auswertung der LM3914 verwendet werden.
http://www.ti.com/lit/ds/symlink/lm3914.pdf
Damit hast du schon einen einfachen Tacho, bzw. kannst an Stelle der LED
auch etwas anderes ansteuern.
pegel schrieb:> Es gibt auch noch den:>> https://media.digikey.com/pdf/Data%20Sheets/Texas%20Instruments%20PDFs/LM231,%20LM331.pdf>> Figure 18. Simple Frequency-to-Voltage Converter>> Der gibt eine Spannung aus, je nachdem wie die Frequenz bzw. Pulse pro> Zeiteinheit ist.>> Diese Spannung musst du dann interpretieren.
Da steht, dass er eine Frequenz in Abhängigkeit von der Spannung
ausgibt. Also genau andersherum.
@All Wunderbar, so viele nützliche Informationen, da werde ich wohl was
draus machen können.
Die beiden Varianten R-Glied mit Poti und die mit Transistor und
se!bstentladender Kapazität scheinen mir die für mich am
Überschaubarsten Varianten zu sein.
Wobei die anderen Varianten zum "Lernen" nicht" weggelegt" werden. Ich
kann ja dabei nur etwas hinzugewinnen
Hallo,
> Joachim H. schrieb:> Es geht ja schon damit los, daß ich die elektrischen Werte des Impulses> der vom Tachosensor kommt nicht kenne.
Da kann ich dem Vorredner (Timo N.) zustimmen.
Kläre ab, was du da für ein Signalgeber hast.
Es wäre aber auch leicht möglich als Randbedingung fest zu definieren,
dass es ein Reedkontakt ist, der von einem Speichenmagnet ausgelöst
wird.
Dann hätte man einen sehr gute Ausgangsposition.
> Was ich schalten möchte sind allerdings nur max 5V
Heißt das, 5V stehen als Betriebsspannung stabil zur Verfügung?
Oder woher kommt die Stromversorgung? Gebe genaue Auskunft dazu!
> und sehr kleiner Strom, in etwa der Größe, wie> auch von Tachosensor.
Ok, kein Problem. Aber erkläre dich genauer, was du genau schalten
willst und warum (siehe Fragen unten)!
> Mikroprozessor möchte ich für diesen trivialen Anwendungsfall> ausschließen, da muß ich ja noch viel mehr Aufwand betreiben ;)
Ja, man muß auch nicht alles mit einem uC machen.
Aber unter Umständen geht es nur mit einem uC vernünftig und bezahlbar.
Das hängt von konkreten Randbedingungen ab, die du noch nicht genannt
hast.
Ich nenne mal paar Punkte:
- Welche Zustand darf oder soll das Umschaltsignal im Stand einnehmen,
wenn sich nix bewegt.
- Löst der Schaltvorgang eine Reaktion aus (welche?) oder ist es nur
eine Anzeige?
- Was ist mit Genauigkeit und Reproduzierbarkeit?
- Was passiert im Grenzbereich, wenn das Signal in kurzer Zeit mal unter
den Schwellwert fällt und dann wieder darüber steigt -> Da "flattert"
die Umschaltelektronik! Wir also eine Hysterese benötigt.
- Soll der Schwellwert später evtl doch noch einstellbar sein?
- Welche Zeitkonstanten für die Umschaltung werden gewünscht. Soll es
eher träge reagieren oder sehr schnell bei Durchfahren des
Schwellwertes?
- In welchem Zeitrahmen mit welchem Aufwand (Budged) willst du das
umsetzen. Welche Voraussetzungen hast du.
Ohne solche Fragen vor Anfang an zu klären, führt das nur zu unendlich
langen Rückfrageorgien und am Ende sind alle frustriert und du bekommtst
keine Hilfe mehr von Fachleuten (eher von Trollen).
Gruß Öletronika
Siehe Anhang. IC1A arbeitet nur als Pulsformer, um aus dem gefilterten
Tachokontaktsignal ein knackiges Digitalsignal zu machen. Das braucht
man für den Trick der nachfolgenden Stufe. Man hätte auch einen
Schmitt-Trigger nehmen können, aber das wäre ein zusätzlicher IC
gewesen. IC1B arbeitet als Pulsbreitenmesser. Wenn eine steigende Flanke
aus IC1A/Q kommt, geht die sowohl zum Monoflop als auch D-FlipFlop.
Letzteres speichert den aktuellen Zustand von IC1B/Q. Ist der 0, war die
Periodendauer zu groß bzw. die Geschwindigkeit zu klein. Entsprechend
umgekehrt wenn die Geschwindigkeit groß genug ist, dann wird ein HIGH
gespeichert und erscheint am Schaltausgang. Ebenso wird dieser auf LOW
per Reset zurüch gesetzt, wenn die Geschwindigkeit zu klein wird und
IC1B/Q zwischenzeitlich auf LOW geht.
Anbei auch gleich ein Layout für einen Lochrasteraufbau.
Ein 26er Reifen hat ca. 2m Umfang, macht bei 8km/h ~ 2,2m/s ~ 1Hz. Also
muß man mit R5 ca. 1s Pulsbreite einstellen. Die Dimensionierung sollte
für den Bereich 4-40km/h passen.
NE/ICM/LM555 oder 556 ginge es auch. Erste Stufe ist ein Monoflop
getriggert von Schaltkontakt. Zweite Stufe ist eine RC-Kombination, die
vom Monoflopausgang aufgeladen wird. Wird die Schwelle (2/3 Uss)
erreicht, dann schaltet die nächste Stufe (bei 1/3 Uss wieder aus).
@oelektronica also die "Aufgabenstellung": Am "Pedelec" soll der Motor
erst oberhalb einer definierten Geschwindigkeit zuschalten ( nicht mein
Wunsch, sondern eines Kollegen.)
Läuft im Originalzustand bspw der Motor oberhalb dieser Geschwindigkeit,
kann man die Stromzufuhr zum Motor mittels am Bremshebel installierter
Reedkontakte, deren Betriebsspannung von 5V vom Motorcontroller kommt,
unterbrechen. Nun soll diese Funktion "Motor stromlos schalten" genau
über diese Leitung aber grundsätzlich ohne Nutzung der Bremshebel
Grundeinstellung durch "meinen Baustein" werden. Der Motor wird erst
zugeschaltet, wenn der Fahrer mit Eigenleistung die voreingestellte
Geschwindigkeit erreicht. Als Signalgeber für diesen "Baustein" habe ich
mir nun den Signalgeber vom Tacho vorgestellt.
Hoffe, das ist einigermaßen verständlich (mir ists dieser Wunsch nicht,
aber ..)
Die Zeit der Wiederkehr des Impulses liegt in etwa bei 1s. Hysterese
wäre schön, ist mir aber erst einmal um des Prinzip willens unerheblich.
Ich meine, da es sich um einen Freundschaftsdienst handelt, sollte es
schon kleines Budget bedeuten. Aber wenn ich so R-C-Glied, Transistor,
Schmitt-Trigger, sehe, sind das keine Kosten.
Und so nen fertigen Baustein um -20€ wäre mir das kein Problem, ich will
dabei was zu gewinnen.
Arduino wäre schon da, war eigentlich für nen Enkel, aber der wollte was
anderes. Ich hatte da ne Idee ne Lauflichtschaltung für mich
umzufunktionieren; noch nicht angegangen.
Tja Voraussetzungen 0 Ahnung. Noch nie was mit Elektronik zu tun gehabt.
Deswegen, weil mir das jetzt nach den Anregungen machbar erscheint,
möcht Ichs angehen. Deshalb was ohne Microcontroller.
Hoffe habe das Fragespektrum einigermaßen abgedeckt ;)
@falk das ist ja ein Service mannomann. Danke
@Dieter ja den timmer555 hatte ich auch im Visier, nur fehlt mir eben
das Verständnis die inneren Strukturen zu nutzen, dh was man damit
anstellen kann.
Ich würde erstmal davon absehen, das Signal vom vorhandenen Tacho
abzugreifen. Denn der ist auf geringe Stromaufnahme optimiert und sicher
nicht dafür vorbereitet, eine weitere Last anzusteuern. Ausserdem müsste
man die technischen Details erst einmal heraus bekommen.
Also installiere einfach einen zweiten Sensor. Darin befindet sich ein
magnetisch betätigter Kontakt.
Da du nicht imstande bist, die Schaltung selbst zu entwerfen, ist dies
der ideale Zeitpunkt, den Umgang mit Mikrocontrollern zu erlernen. Denn
dann brauchst du nur sehr wenige Bauteile:
- Mikrocontroller z.B. ATtiny13A
- Knopfzelle mit Halter Typ CR2032
- Kondensator 100nF
- Widerstand 470 Ohm
- Leuchtdiode (nicht in weiss und nicht in blau)
Später kommt dann noch das Schaltelement dazu, dass du ansteuern willst.
Vermutlich ein Optokoppler, wieder mit 470 Ohm Vorwiderstand.
Anleitung: http://stefanfrings.de/mikrocontroller_buch/index.html> Mikroprozessor möchte ich für diesen trivialen Anwendungsfall> ausschliessen, da muss ich ja noch viel mehr Aufwand betreiben
Nein, ganz im Gegenteil. Das ist ein überschaubares kleines Projekt,
wirklich.
> Die beiden Varianten R-Glied mit Poti und die mit Transistor und> selbstentladender Kapazität scheinen mir die für mich am> Überschaubarsten Varianten zu sein.
Und wenn die Schaltung dann doch nicht so funktioniert, wie gewollt
(wovon ich zu 99% ausgehe), fängst du nochmal ganz vor vorne an und bist
wieder nicht imstande, sie selbst zu entwerfen. Ich würde das lassen.
Mit Mikrocontroller wird die Elektronik viel einfacher, als ohne. Das
beste ist: Du kannst ihre Funktion ohne Lötkolben ändern.
> Die Zeit der Wiederkehr des Impulses liegt in etwa bei 1s.
Was soll das bedeuten?
Du solltest alle Anforderungen gleich zu beginn nennen, sonst mühen sich
die Helfer mit der Erstellung von Plänen ab, die gleich wieder in die
Mülltonne wandern. Was hier jetzt wohl wahrscheinlich der Fall ist.
Damit verärgerst du sie.
G. O. schrieb:> Ich werfe 'mal den NE(µA)567 in den Ring.
Aus mehreren Gründen würde ich den hier nicht nehmen. Erstens ist die
Detektorfrequenz mit 1Hz hier sehr niedrig und zweitens ist das ja kein
Baustein, der oberhalb einer Frequenz weiterhin ein Signal ausgibt. Der
NE567 kann sehr gut eine Frequenz erkennen, aber sonst nix.
Falks Plan ist doch gut, man kanns auch aus CD40xx Bausteinen bauen,
damit der Betriebsspannungsbereich grösser wird. Oder eben mit MC...
Es geht natürlich noch ganz einfach:
Ein Magnet an die Speichen schrauben.
Am Rahmen eine Spule als Abnehmer.
Über eine Diode einen Kondensator laden, der Direkt das Relais steuert.
Das braucht nicht einmal eine Stromversorgung.
Ich danke allen, die mir hier mit Rat und Tat zur Seite stehen.
Die 3 pdf-books von Stefan(us) habe ich natürlich sofort heruntergeladen
und von links oben nach rechts unten überflogen. Die werden mir vieles
verständlicher machen.
Einige Bauteile habe ich ja schon, für Beschaffung fehlender habe ich ja
Conrad vor Ort.
Also kann ich mich jetzt theoretisch und praktisch ans Werk machen.
Nochmals danke an alle für die Unterstützung.
Noch einen schönen Abend und ein ebensolchen 2. Feiertag
Matthias S. schrieb:> Aus mehreren Gründen würde ich den hier nicht nehmen. Erstens ist die> Detektorfrequenz mit 1Hz hier sehr niedrig und zweitens ist das ja kein> Baustein, der oberhalb einer Frequenz weiterhin ein Signal ausgibt. Der> NE567 kann sehr gut eine Frequenz erkennen, aber sonst nix.
Das liest man halt so im Internet und ist nur die halbe Wahrheit. Nach
Datenblatt liegt der Detektionsbereich des NE567 zwischen 0,01Hz! und
500kHz. Desweitern kann man den Baustein so beschalten, dass er
unterhalb der gewählten Frequenz zB '0' ausgibt, oberhalb jedoch '1',
oder umgekehrt, quasi ein frequenzabhängiger Schalter. Sogar die
Schalthysterese läßt sich anpassen.
Hallo,
> Joachim H. schrieb:> Also kann ich mich jetzt theoretisch und praktisch ans Werk machen.> Nochmals danke an alle für die Unterstützung.
ich hätte auch noch eine rel. einfache Schaltung ohne uC, die den Zweck
erfüllen könnte -> siehe Anhang.
Es braucht nur einen IC 74HC123 (2-fach retriggerbares Monoflop)
https://assets.nexperia.com/documents/data-sheet/74HC_HCT123.pdf
Das erste Monoflop (MF-1) erzeugt am Ausgang Impulse mit 1s Länge.
Diese werden über ein Differenzierglied auf das 2. Monoflop (MF-2)
gegeben.
Wenn das Rad langsam dreht, so dass die Periodendauer des Sensors länger
ist als die eingestellte 1s am MF-1, dann fällt das MF-1 vorher wieder
ab.
Wenn dann wider ein Sensorimpuls kommt, wird MF-1 wieder angetriggert.
Dreht das Rad schneller, so dass der Sensorimpuls kommt, bevor MF-1
abfällt, bleibt MF-1 ständig aktiv.
MF-2 bekommt also von MF-1 über ein Differenzierglied Impulse, wenn die
Geschwindigkeit geringe ist und zieht an.
Bei höherer Geschw. bleiben die Impulse aus und MF-2 fällt ab -> Motor
kann starten. Die Zeitkonstante von MF-2 sollte etwas länger sein, so ca
4..6 sek.
Eine Effekt hat die Schaltung aber noch.
Im Stand fällt MF-2 natürlich auch nach einiger Zeit ab und der Motor
wird wieder aktiviert. Da kann aber evtl. sogar sehr vorteilhaftsein,
quasi an Anfahrhilfe.
Über den Widerstand R21 kann man für die Umschaltschwelle auch noch
etwas Hysterese auf das MF-1 geben.
Gruß Öletronika
Ich bin ziemlich sicher, dass innerhalb der erstem Monate Praxis-Test
noch weitere Anforderungen dazu kommen. Und dann ist man mit so einer
hart verdrahteten Schaltung ziemlich aufgeschmissen.
Wenn es ein Spezial-IC sein darf: LM2917. Ist genau dafür gemacht.
Ich habe mal ein paar auf Lüfterplatinen gefunden, die ich aus
einem Altgerät ausgebaut habe. Dienten dort als Alarmsensor bei
Lüfter-Stillstand.
Ein µC ist die erste Wahl. All dies externe Geraffel ist viel zu
aufwendig & unpräzise. Ein ATTiny ist ausreichend. Das Programm dürfte
in die Kategorie der Dreizeiler fallen.
Hallo erst mal:
Bin der Manuel und genau der, für den Joachim gefragt hat.
Bin absoluter Arduino Anfänger und habe den UNO Nachbau gerade eben zum
laufen gebracht. (Blinkprogramm)
Den Sketch stelle ich mir so vor, das wenn am Eingang der Reedkontakt
vom Fahrrad über 100 Umdrehungen in der Minute misst dann am Ausgang der
Dreipolige Stecker mit GND 5V Signal vom Bremseingang des
Motorkontrollers geöffnet wird. Und der Motor läuft. Über 300
Umdrehungen wird der Bremseingang wieder geschlossen und der Motor geht
aus.
Geht das mit einem Dreizeiler?
Arduino UNO ist nicht gerade von uns empfohlen worden. Der eignet sich
für Batteriebetrieb nicht gut, weil er eine hohe Ruhestromaufnahme hat.
Halte Dich an die obigen Empfehlungen.
> Geht das mit einem Dreizeiler?
Da hat der Daniel Dir einen Bären aufgebunden. Er wollte damit zum
Ausdruck bringen, dass das für Profis eine relativ einfache Aufgabe ist.
Drei Zeilen reichen dazu aber nicht, sonst hätte die hier bereits jemand
hin geschrieben. Es werden wohl eher 100 sein.
Christoph db1uq K. schrieb:> http://www.ti.com/lit/ds/symlink/lm2907-n.pdf>> Ein Frequenz-Spannungs-Wandler. Die Applikationsschaltung benötigt noch> 2 Widerstände und 2 Kondensatoren. Für die Schaltschwelle muss man noch> einen Komparator nachschalten.
Noch nicht mal das. Figure 18. "Speed Switch" auf Seite 15 des
Datenblatts ist genau die gesuchte Schaltung, die eine Last bestromt,
wenn eine bestimmte Eingangsfrequenz (bestimmt durch einen Kondensator
und einen Widerstand) überschritten wird.
Doch, auch wenn noch viel mehr dabei erledigt wird:
http://mino-elektronik.de/fmeter/fm_software.htm#bsp7
Es geht letztlich um eine Frequenz bzw. Drehzahlmessung. Die Anzeige
kannst Du weglassen und in der Endlosschleife in main() abhängig von der
gemessenen Frequenz eine Entscheidung einbauen, die das notwendige
Signal erzeugt.
Schaffst Du das?
Das Signal vom Reedrelais kannst Du einfach mit einem RC-Glied (50 ms)
entprellen, da der AVR schon Schmitttriggereingänge hat.
Danke erst mal.
Aber die ich suche einen möglichst einfachen Sketch den auch ein
Anfänger mit etwas studieren verstehen kann. Und dann auch selber
anpassen kann.
Drehzahl / Schaltkontakt Verhältnis.
Ich würde gerne nur den Reedkontakt abtasten in Verhältnis zur Zeit
setzen und den Motor dann nur bei Wunsch Geschwindigkeit mit laufen
lassen.
Denke ich da zu einfach?
Wie ein Fahrradtacho nur ohne Anzeige, stattdessen zwei Schaltpunkte.
Bei 10 km/h ein und 25 km/h aus.
> Ich würde gerne nur den Reedkontakt abtasten in Verhältnis zur Zeit> setzen und den Motor dann nur bei Wunsch Geschwindigkeit mit laufen> lassen.
Klingt erstmal gut.
> Denke ich da zu einfach?
Ja vermutlich. Aber der Ansatz ist gut.
Wenn das Ding am Ende angenehm arbeiten soll muss wohl noch etwas mehr
"Intelligenz" rein. Wenn die Geschwindigkeit z.B. knapp an der
Schaltschwelle liegt, wirst du nicht wollen, dass der Antrieb immer
abwechselnd an und aus geschaltet wird. Ein Zweipunktregler (mit zwei
Schaltschwellen) verbessert das Verhalten. Aber egal, fange einfach mal
an. Die Ideen zur Verbesserung werden von alleine kommen. Aus diesem
Grund hatte ich zu einer programmierbaren Lösung geraten.
Du willst also Arduino nutzen. Da kannst du den Millisekunden-Counter
zur Messung verwenden. Im Prinzip so:
1
unsingedlongtime=0;
2
3
voidloop()
4
{
5
if(Kontaktgeschlossen)
6
{
7
// Zeit-Differenz zum vorherigen Impuls ermitteln
8
unsignedlongdiff=millis()-time;
9
time=millis();
10
11
// Abhängig von der Zeitspanne reagieren
12
if(diff<500)
13
{
14
motoreinschalten;
15
}
16
else
17
{
18
motorausschalten;
19
}
20
21
// Kontakt ggf. entprellen
22
delay(10);
23
}
24
}
Zum Abfragen des Sensors und zum Ansteuern des Motors (vermutlich über
Optokoppler) wirst du die Funktionen pinMode(), digitalRead() und
digitalWrite() brauchen.
Bevor wir weiter in die Details gehen, solltest du den Schaltplan
zeigen. Dazu können wir auch Verbesserungstipps geben, zum Beispiel
bezüglich elektromagnetischer Entstörung.
Und dann musst du noch ausprobieren, wie du den Motor ansteuern kannst.
Ich bin jetzt einfach mal von einem Optokoppler parallel zum vorhandenen
Schaltkontakt ausgegangen, dies sollte man frühzeitig überprüfen.
Besorge Dir einen gewöhnlichen Optokoppler (PC817) und eine 3V
Knopfzelle (Typ CR2032 oder kleiner), damit kannst du das antesten. Die
Knopfzelle ist so schwach, dass du sie ausnahmsweise ohen Vorwiderstand
direkt an den Eingang des Optokopplers halten kannst.
In meinem oben verlinkten Buch Band 2 findest du ein kleines Kapitel
über Optokoppler.
Danke für die Hilfe!
So habe ich mir das vorgestellt.
Ich bin wie gesagt ganz am Anfang, hatte zuerst Probleme das aktuelle
Arduino Programm zum laufen zu bekommen auf meinem alten PC.
Ein extra Opptokopler ist glaube ich gar nicht nötig, weil der
Motorcontoller am Bremskontakt der eigentlich für Bremshebel mit
Hallsensoren gedacht ist schon GND, 5V und Signal hat, was direkt der
Arduino bedienen können müsste. Es soll sogar reichen Signal dort auf
GND zu legen um den Motor ein und aus zu schalten.
Mein Hauptproblem ist der Sketch der den Reedschalter auslesen soll und
dann den Motor controller an zwei festgelegten Geschwindigkeiten
schaltet.
Ab 10 kmh an.
Ab 25 kmh aus.
Manuel schrieb:> Ein extra Opptokopler ist glaube ich gar nicht nötig, weil der> Motorcontoller am Bremskontakt der eigentlich für Bremshebel mit> Hallsensoren gedacht ist schon GND, 5V und Signal hat, was direkt der> Arduino bedienen können müsste. Es soll sogar reichen Signal dort auf> GND zu legen um den Motor ein und aus zu schalten.
Und wie verhinderst du dann einen Kurzschluss, wenn der Mikrocontroller
"An" sagt und der vorhandene Schaltkontakt "Aus" sagt (oder umgekehrt)?
Möglicherweise reagiert die Motorsteuerung auch sehr empfindlich auf
Fremdspannung.
Mit einem Optokoppler bist du auf der Sicheren Seite, damit kannst du
kaum etwas kaputt machen.
> Es soll sogar reichen Signal dort auf> GND zu legen um den Motor ein und aus zu schalten.
Eben das kannst du mit einem Optokoppler einfach und sicher machen.
> Mein Hauptproblem ist der Sketch der den Reedschalter auslesen soll> und dann den Motor controller an zwei festgelegten Geschwindigkeiten> schaltet.
Der Sketch ist dein Problem? Dann lösche ihn, schon ist das Problem weg
:-)
Spass beiseite: Du musst dein Problem schon besser beschreiben, damit
man Dir helfen kann.
@stefanus ich meld mich nochmal bez Schwellwert.
Bei dieser Steuerung benötigt man mM nicht unterschiedliche Schaltungen
um einen Schwellwert.
Hier geht's um Radfahren, da ist eine genaue Geschwindigkeit am
Schwellwert gar nicht gewünscht/erforderlich. Es soll lediglich beim
"manuellen" Beschleunigen am unteren Schwellwert der Motor unterstützend
zugeschaltet werden, um weiter zu beschleunigen. Im anderen Fall, er
möchte eigentlich nicht schneller fahren; vom Motor her wäre noch weiter
Unterstützung möglich; soll die Unterstützung wegfallen. Er möchte auch
nicht konstant die Geschwindigkeit des oberen Schwellwertes fahren, sie
soll nur den Motorstrom abschalten. Er fährt also eigentlich immer im
"Abstand" zur "Schaltgeschwindigkeit".
Natürlich sollte, um das technisch korrekt zu gestalten, so eine
"Hysterese" in der Schaltung vorhanden sein. Aber für uns "Beginner"
gestaltet es sich wahrscheinlich einfacher ohne Hysterese.
Joachim H. schrieb:> @stefanus ich meld mich nochmal bez Schwellwert.> Bei dieser Steuerung benötigt man mM nicht unterschiedliche Schaltungen> um einen Schwellwert.
Wie willst du dann diese Anforderung umsetzen?:
Manuel schrieb:> Ab 10 kmh an.> Ab 25 kmh aus.
Da hat er doch zwei konkrete Schaltschwellen genannt.
Mißverständnis; es geht darum: für jeden Schwellwert je einen
Schaltpunkt "aufwärts" und einen "abwärts", so wird es doch technisch
korrekt gehandhabt?
Joachim H. schrieb:> Mißverständnis; es geht darum: für jeden Schwellwert je einen> Schaltpunkt "aufwärts" und einen "abwärts", so wird es doch technisch> korrekt gehandhabt?
Ich denke schon, ja.
Ich wollte eigentlich auch den Strom für den Arduino an den drei Adern
am Controller abgreifen und der Arduino sollte dann wie sonst der
Hallsensor im Bremsgriff schalten. Geht das nicht? Wäre das gleiche
Potenzial wollte mir mal einer einreden...Dann wäre es wohl doch sicher
das der Arduino ein Relais oder Optokoppler schaltet? Und das Relais
dann Signal und GND verbindet? Extra Strom mit 5V für den Arduino könnte
ich auch von meinem Regler für die Beleuchtung abgreifen.
Manuel schrieb:> Ich wollte eigentlich auch den Strom für den Arduino an den drei Adern> am Controller abgreifen und der Arduino sollte dann wie sonst der> Hallsensor im Bremsgriff schalten. Geht das nicht?
Ohne technische Informationen zu den Anschlüssen und Signalen des
Controllers kann man dazu nichts sagen.
Hallsensor? Diese Salamitaktik ist anstrengend. Abr auch hierzu kann ich
ohne technische Daten nichts weiter sagen.
> Dann wäre es wohl doch sicher> das der Arduino ein Relais oder Optokoppler schaltet?
Das habe ich empfohlen, unter der Annahme, dass es einfach damit getan
ist, eine Leitung auf Low (GND) zu ziehen. Aber ich habe inzwischen eher
das Gefühl, dass ihr wild ratet, anstatt euch auf Fakten und Messungen
zu stützen.
Was passiert wohl mit dem Hallsensor, wenn der einen High Pegel ausgibt,
und ein Relais oder Optokoppler dessen Ausgang mit GDN kurzschließt?
Technische Daten müssen her, am Besten Schaltungsunterlagen.
Das war ein Missverständniss.
Es gibt für Pedelecs Bremshebel die Hallsensoren verwenden. Ich habe
keine sondern nur die Eingänge dafür am Motorcontroller die ich zum
schalten verwenden will. Schaltpläne von diesen Chinacontroller habe ich
nicht.
Die Bremshebel mit drei Kabeln haben Hallsensoren und werden verbunden
mit GND , 5V und Signal.
Siehe mein Foto von der Anleitung.
Aber egal, mir geht es erst mal um den Sketch.
Wenn der Arduino schaltet wie gewünscht ist schon fast alles geschafft.
Auch wenn man dann noch ein Relais oder Optokoppler nimmt. Und eben dann
zweipolig an den Controller geht. So wie es die Anleitung auch erklärt.
Viel zu kompliziert.
Da ich ja die Geschwindigkeit nicht anzeigen möchte damit, würde auch
reichen die Drehzahl zu messen und darüber ein und aus zu schalten.
Manuel schrieb:> Viel zu kompliziert.> Da ich ja die Geschwindigkeit nicht anzeigen möchte damit, würde auch> reichen die Drehzahl zu messen und darüber ein und aus zu schalten.
Du brauchst nichtmal die Drehzahl, sondern nur die Zeitspannen zwischen
zwei Impulsen. Hast Du Dir mein halbfertiges Code-Beispiel angesehen?
Du möchtest die Geschwindigkeit nicht anzeigen, aber damit rechnen
möchtest du schon.
Wenn du darüber nachdenkst wirst du zwischen den beiden Messmethoden nur
einen minimalen Unterschied feststellen.
Ich taste mich langsam ran.
Habe das Blinkprogramm so abgeändert,
das nun eine LED am Ausgang 12 leuchtet statt an 13 zu blinken. Nun muss
ich den Arduino nur noch dazu bewegen das er das nur noch dann macht
wenn er am Eingang mit dem Reedschalter so ca. 100-300 Umdrehungen
erkennt.
Nicht lachen, ist mein erster Versuch mit so einem NANO.
Manuel schrieb:> Aber egal, mir geht es erst mal um den Sketch.
Was wäre, wenn Du Dir das gezeigte, fertige Programm einfach einmal auf
den Arduino spielst und damit arbeitest? Der zeitliche Aufwand dafür
dürfte unter fünf Minuten betragen.
Du brauchst es ja zunächt nicht zu verstehen, außer an einer Stelle in
main() eine kleine if()-Abfrage einzubauen. So könntest Du zumindest
Deine genauen Anforderungen abklären, bevor dann die ganze Geschichte
auf einen ATtiny25 'eingedampft' wird.
Zudem könntest Du dann auch erkennen, daß das Einbringen einer Hysterese
ein Klacks ist.
Vielleicht denkst Du mal darüber nach, bevor Du alles selber können
willst.
Manuel schrieb:> Aber da fehlt sicher noch einiges.
Ja sicher, ist nur ein Lösungsansatz.
> Und was heißt signed / unsigned
Steht in der Arduino Doku. Erst lesen, dann fragen.
> In grau und grün?
Was in grau und grün?
Im Lösungsansatz ist ein Teil des Textes in grün angezeigt.
Brauche ich eigentlich einen zweiten Reedschalter für den Arduino oder
kann ich den vom Fahrrad Tacho anzapfen?
Manuel schrieb:> Im Lösungsansatz ist ein Teil des Textes in grün angezeigt.
Das sind Kommentare. Jetzt ist die Zeit gekommen, wo du ein Arduino
Tutorial durcharbeitest. Ich hatte eigentlich einen anderen Start (mit
meinen Büchern) vorgeschlagen, aber du hast ja zu Arduino gewechselt.
Was auch Ok ist, aber dann musst du Dich halt damit befassen.
> Brauche ich eigentlich einen zweiten Reedschalter für den> Arduino oder kann ich den vom Fahrrad Tacho anzapfen?
Weiter oben hatte ich mit Begründung empfohlen, einen zweiten
Reedschalter anzubringen.
Es gibt doch noch den CD4046. Dem sind die kurzen Nadelimpulse vom
Reedkontakt am Eingang egal. Lediglich müssen je nach Raddurchmesser R1
und C1 auf die 8km/h angepasst werden.
Wieder ein Erfolg!
Habe jetzt einen Reedschalter am Arduino und die LED blinkt bei jeder
Magnet Annäherung auf.
Jetzt kommt das schwierige mit zählen nach Zeit ...
Es soll mit einem! Reedschalter gehen.
Notfalls einer für Tacho am Vorderrad und einer für Arduino am Hinterrad
wegen unterschiedlicher Spannung.
Da tut sich nix an der LED...
// Schubabschaltung
unsigned long time_now = 0;
int time=1;
int LED=6;
int taster=7;
int tasterstatus=0;
void setup()
{
pinMode(LED, OUTPUT);
pinMode(taster, INPUT);
}
void loop()
{
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH);
{
unsigned long diff=millis()-time;
time=millis();
if (diff<500);
{
digitalWrite(LED, HIGH);
}
digitalWrite(LED, LOW);
}
}
Bitte nenne den Sensor nicht "taster", das ist irreführend. Und benutze
die Tags zum Formatieren, siehe die Anleitung direkt über dem
Eingabefeld.
Ich sehe da mehrere Fehler:
1) Die Variable time_now wird nicht benutzt und die Variable time hat
den falschen Typ. Die Zeitberechnung funktioniert nur dann korrekt, wenn
die Variable den gleichen Typ hat, wie der Rückgabewert von millis().
2) Hinter "if (tasterstatus == HIGH)" gehört kein Semikolon, ansonsten
wird der Code-Block dahinter nämlich völlig unabhängig von der Bedingung
ausgeführt.
3) Wenn diff<500 ist schaltest du die LED an, und direkt danach
schaltest sie ohne Bedingung (also immer) direkt wieder aus.
4) Du musst nach Erkennung des Impulses noch abwarten, bis der Kontakt
wieder geöffnet wird. Erst nach dem Öffnen beginnt die nächste
Auswertung der nächsten Zeitspanne.
5) Der Sensor zieht den Eingang auf Low. Ein interner Pull-Up Widerstand
zieht ihn auf High.
Außerdem sparst du ein bisschen RAM, wenn du die Konstanten mit #define
hin schreibst. #define definiert eine simple Textersetzung im Quelltext
und belegt daher keinen Speicherplatz im (kostbaren) RAM. Noch hast du
zwar reichlich RAM, aber irgendwann in Zukunft wird Dir diese
Vorgehensweise helfen.
Konstanten schreibt man normalerweise in Grossbuchstaben, um sie
sichtbar als Konstante zu kennzeichnen. Technisch ist es egal.
1
unsignedlongtime=0;
2
3
#define LED 6
4
#define SENSOR 7;
5
6
voidsetup()
7
{
8
pinMode(LED,OUTPUT);
9
pinMode(SENSOR,INPUT_PULLUP);
10
}
11
12
voidloop()
13
{
14
// Wenn der Speuchen-Magnet am Sensor ist
15
intsensorstatus=digitalRead(SENSOR);
16
if(sensorstatus==LOW)
17
{
18
// Zeit erfassen
19
unsignedlongdiff=millis()-time;
20
time=millis();
21
22
// Wenn weniger als 500ms seit dem letzten Impuls
23
if(diff<500);
24
{
25
digitalWrite(LED,HIGH);
26
}
27
else
28
{
29
digitalWrite(LED,LOW);
30
}
31
32
// Warte, bis der Magnet wieder weg ist
33
do
34
{
35
delay(5);// Zum Entprellen
36
}
37
while(digitalRead(SENSOR)==LOW)
38
}
39
}
So müsste es gehen. Hast du Fragen zu meinen Änderungen?
Irgendwann können wir uns vielleicht mal über Multi-Tasking mit
Zustandsautomaten unterhalten, aber momentan möchte ich Dich damit nicht
überfordern.
Apropro Pullup
Bei meinem ersten Versuchsprogramm ging das nur mit einem externen
Wiederstand am Schalter?
(Das Programm wo ich den Bildschirm fotografiert habe)
Manuel schrieb:> Bei meinem ersten Versuchsprogramm ging das nur mit einem externen> Wiederstand am Schalter?
Ja, weil du den internen Pull-Up Widerstand des Mikrocontroller nicht
aktiviert hast.
Ich habe das damit probiert
pinMode(Taster, INPUT_PULLUP);
ging aber nicht.
Im letzten Sketch Vorschlag kommen viele Fehlermeldungen , die erste in
Zeile 9.
Ich glaube mein Hirn ist zu klein.
Kann mir keiner einen lauffähigen Sketch senden?
Ich könnte dann eher erkennen was ich falsch mache.
So dauert das raten noch Jahre.
Manuel schrieb:> Kann mir keiner einen lauffähigen Sketch senden?
Eigentlich sollst du die Programmiersprache selbst lernen, damit du den
Sketch auch selbst anpassen kannst.
1
unsignedlongtime=0;
2
3
#define LED 6
4
#define SENSOR 7
5
6
voidsetup()
7
{
8
pinMode(LED,OUTPUT);
9
pinMode(SENSOR,INPUT_PULLUP);
10
}
11
12
voidloop()
13
{
14
// Wenn der Speuchen-Magnet am Sensor ist
15
intsensorstatus=digitalRead(SENSOR);
16
if(sensorstatus==LOW)
17
{
18
// Zeit erfassen
19
unsignedlongdiff=millis()-time;
20
time=millis();
21
22
// Wenn weniger als 500ms seit dem letzten Impuls
23
if(diff<500)
24
{
25
digitalWrite(LED,HIGH);
26
}
27
else
28
{
29
digitalWrite(LED,LOW);
30
}
31
32
// Warte, bis der Magnet wieder weg ist
33
do
34
{
35
delay(5);// Zum Entprellen
36
}
37
while(digitalRead(SENSOR)==LOW);
38
}
39
}
Es war einfach ganz oben ein Semikolon zu viel und ganz unten eins zu
wenig. Jetzt lerne bitte die Programmiersprache. Programme schreiben
sich nicht von selbst, so wie Elektronik sich nicht von selbst
entwickelt.
Entweder lernst du es, oder bezahlst andere dafür. Aber hier für jeden
kleinen Piep nachzufragen ist langfristig der falsche Weg. Mit Arduino
ist es so einfach wie nie zuvor.
Einstiegspunkt für das Tutorial:
https://www.arduino.cc/en/Tutorial/BareMinimum
Dann: https://www.arduino.cc/en/Tutorial/BuiltInExamples
Und hier ist die Referenz-Doku die jeden einzelnen Befehl beschreibt:
https://www.arduino.cc/reference/en/
Vielen Dank !!! !!! !!!
Es funktioniert! Bei hoher Geschwindigkeit würde die Schubabschaltung
aktiv werden. Nun muss ich das nur noch anpassen das die
Schubabschaltung auch bei zu niedriger Geschwindigkeit abschaltet. Ich
werde mich reinknien.
Versprochen!
Es soll ja so sein das der Motor nur zwischen ca. 10km/h und 25km/h
läuft.
Werde den Sketch zeigen wenn ich es geschafft habe.
Dann müssen natürlich auch die Werte zur Wunschgeschwindigkeit
ausprobiert werden. Ich denke aber das ich an dem funktionierenden
Sketch besser voran kommen werde als völlig im Dunkeln zu tappen.
Was ich nur nicht verstehe ist das mein Sensor auch mit diesem Programm
nur mit externen 1 kohm Widerstand am Sensor und GND funktioniert.
Schau Dir mal diese Anleitung an, wie man Qt Creator als "besseren"
Editor für Arduino einsetzt.
http://stefanfrings.de/esp8266/index.html#qtcreator
Du musst dabei allerdings andere Verzeichnisse einstellen (da sich die
Anleitung auf das ESP8266 Plugin bezieht).
Der Compiler-Pfad ist:
Für C: c:\...\arduino-1.8.7\hardware\tools\avr\bin\avr-gcc.exe
Für C++: c:\...\arduino-1.8.7\hardware\tools\avr\bin\avr-cpp.exe
Als Library Verzeichnis brauchst du alle Verzeichnisse unter
c:\...\arduino-1.8.7\hardware\arduino\avr\libraries\...
und
c:\...\arduino-1.8.7\hardware\arduino\avr\cores\arduino
Das schöne an dem Editor ist, dass er Dir fast alle Fehler schon während
des Tippens anzeigt und meistens auch in besser verständlicher Form.
Manuel schrieb:> Was ich nur nicht verstehe ist das mein Sensor auch mit diesem Programm> nur mit externen 1 kohm Widerstand am Sensor und GND funktioniert.
Der Sensor gehört zwischen den Eingang und GND, nicht zwischen den
EIngang und VCC. Ich habe das weiter oben doch schon skizziert.
Ach Du Scheiße...
ich hatte den GND von der anderen Seite genommen,
und weil das nicht ging aus Verzweiflung 5V genommen.
Muss doch einem alten Mann gesagt werden.
Hatte mich gleich gewundert warum die LED so unterbelichtet geschaut
hat...
lach...
Dann kann ich ja den Widerstand wieder einmotten.
Echt beeindruckend wie das jetzt funktioniert.
Nochmal Danke !!!!!!
PS:
Wo würde ein Profi ansetzen um nun noch bei niedriger Geschwindigkeit
den Schub abzuschalten? Ohne die andere Funktion zu versauen?
> Wo würde ein Profi ansetzen um nun noch bei niedriger Geschwindigkeit> den Schub abzuschalten? Ohne die andere Funktion zu versauen?
Schau Dir das an:
https://www.arduino.cc/reference/en/language/structure/control-structure/else/
Und dann denke mal selber nach.
Wenn du weitere Codes von mir haben willst, dann musst du mich dafür
bezahlen. Du lässt Dich hier bedienen und den Popo pudern, ignorierst
sämtliche Hinweise auf Doku und Tutorials, dass es wirklich ärgerlich
wird.
Bei anderen Fragen helfe ich gerne weiter.
Viel Glück.
ich verstehe was Du meinst, bin auch jetzt schon Dir wirklich sehr
dankbar.
Muss mich wie gesagt erst mal damit befassen.
if ((diff<500)&&(diff>100))
das ging schon mal nicht...
Ich hatte nur ein einfaches Lehrbuch für Kinder.
Da gab es nicht mal "else"...
im Moment teste ich mit einem Magneten in der Hand
und einem Reedschalter am Arduino.
Klappt einwandfrei.
Langsam vorbei bewegen = LED aus. ( für Tempo 10-25 )
Schnell vorbei bewegen = Led an. ( für Tempo über 25 )
Fehlt nur noch:
ganz langsam vorbei bewegen = LED an. ( für Tempo unter 10 )
Manuel schrieb:> Langsam vorbei bewegen = LED aus.
Das ist der Fall >500ms
> Schnell vorbei bewegen = Led an.
Das ist der Fall 100 bis 500ms
Und dann fehlt noch noch <100ms:
Sehr schnell vorbei bewegen -> LED aus
Ich habs!!!!!
if ((diff<200)or(diff>500))
100 hat nicht gepasst für mein schwenken.
Das es "oder" statt "und" heißen muss war sogar mir klar.
Wenn ich schul wäre,
ich würde Dich küssen.
Ist das geil !!!!
Ja,
ich hatte erst im Netz was von && gefunden,
aber dann beim Testen ist mir eingefallen das "Und" ja gar nicht passt.
Also musste "oder" her, und ich dachte das Programm will, weil ja alles
englisch ist, sicher "or" und ging sofort.
Ein blindes Huhn findet manchmal auch ein Korn...
Ja, das mit dem Radumfang kenne ich vom Tacho und von diversen
Berechnungen
mit der Motordrehzahl. Es ist ein 20 Zoll Rad und der Motor hat eine
Nenndrehzahl von 300. Aber bei einem dicken Reifen und vollem Akku ist
das so knapp über 30 km/h. Deshalb die Schubabschaltung.
Beim langsam fahren ist das Problem, das sobald man die Pedale bewegt
der Motor voll anschiebt. Deshalb möchte ich das der Motor erst ab ca.
10 km/h
einsetzt. Es gibt zwar einen Stufenschalter aber das ist unpraktisch da
immer zweimal drauf zu drücken um von 3 auf 1 zu kommen und das gleiche
Spiel zurück.
Mit dem zweiten Magnetschalter werde ich wohl so machen müssen.
Die Frage ist nur noch ob ich ein Arduino Relais oder Optokoppler
brauche
oder ob der Eingang am Controller GND Signal 5 V nicht der Arduino
direkt übernehmen kann. Im Prinzip machen ja die Bremsgriffe mit 3 Kabel
und Hallsensor das Gleiche. GND und 5 V rein und GND und Signal werden
verbunden bei Hebel Betätigung. Es gibt auch Hebel mit Zwei Leitungen
und die Verbinden dann Signal und GND direkt ohne 5V.
Notfalls hätte ich für die Relais Variante noch 5V am Akku zur
Verfügung.
Hätte nie gedacht das es heute schon läuft.
Vielen Dank noch mal !!!
Manuel schrieb:> oder ob der Eingang am Controller GND Signal 5 V nicht der Arduino> direkt übernehmen kann
Frage doch nicht immer wieder!
Ich habe mehrfach zum Optokoppler geraten. Dafür habe ich eine Menge
Gründe, die du allerdings mangels Grundkenntnisse nicht verstehen wirst.
Mit Optokoppler bist du auf der sicheren Seite.
> Hätte nie gedacht das es heute schon läuft.
Jetzt siehst du, warum Dir so viele Leute zum Mikrocontroller geraten
haben. Es sollte wohl auch offensichtlich sein, dass weitere Änderungen
beim Mikrocontroller viel einfacher umzusetzen sind, als bei einer
gelöteten Schaltung.
Nach diesem ertsen Erfolgserlebnis hast du vielleicht Lust, dich mit dem
Buch (http://stefanfrings.de/mikrocontroller_buch/index.html) zu
beschäftigen. So lernst du ein bisschen Grundlagen von Elektronik und
Grundlagen der Programmierung.
Ja, ich werde mich sicher noch etwas mehr mit der Materie beschäftigen.
Nun geht es aber erstmal an den Rad Umbau.
Mein Chinamann hat nur Relais auf Platine mit Anschlüssen die der
Arduino ansteuern kann. Geht ja sicher auch.
Mit Optokopplern kenne ich mich auch nicht aus.
Manuel schrieb:> Mein Chinamann hat nur Relais auf Platine mit Anschlüssen die der> Arduino ansteuern kann.
Die meisten davon enthalten Optokoppler, die man leicht entlöten kann.
Aber Relais geht natürlich auch, solange du den Stromverbrauch nicht
minimieren willst.
> Mit Optokopplern kenne ich mich auch nicht aus.
Ist eigentlich ganz simpel:
Eingangsseitig steckt da eine Led drin, die auf einen Transistor
leuchtet und diesen damit einschaltet.
Niedriger Stromverbrauch ist immer gut, gerade bei Akkubetrieb. Aber ich
denke bei einem 600 Wattstunden Akku wird ein Relais nicht so viel
ausmachen.
Was ich wieder nicht verstehe:
Warum macht man Optokoppler mit Relais zusammen?
Das Relais trennt doch auch schon.
Elektronisch geschaltet ohne Relais, da sehe ich als Vorteil den nicht
vorhandenen Kontakt Verschleiß.
Manuel schrieb:> Warum macht man Optokoppler mit Relais zusammen?
Das versteht niemand hier. Das musst du den Chinesen fragen, der sich
das ursprünglich ausgedacht hat. Wir kennen ihn leider nicht.
> Das Relais trennt doch auch schon.
Eben
> Elektronisch geschaltet ohne Relais, da sehe ich als Vorteil den nicht> vorhandenen Kontakt Verschleiß.
Der Kontakt verschleisst nur nennenswert, wenn er überlastet wird.
Hallo,
> Manuel schrieb:> Die Frage ist nur noch ob ich ein Arduino Relais oder Optokoppler> brauche> oder ob der Eingang am Controller GND Signal 5 V nicht der Arduino> direkt übernehmen kann. Im Prinzip machen ja die Bremsgriffe mit 3 Kabel> und Hallsensor das Gleiche. GND und 5 V rein und GND und Signal werden> verbunden bei Hebel Betätigung.
Da bin ich der Meinung, dass Optokoppler oder Relais eher nicht
unbedingt nötig sind.
Da solche Schaltung mit GND üblicherweise auf Fahrzeugmasse liegt und
die Leitungen kurz sind, wird man kaum mit Störungen rechnen müssen,
welche es sonst sinnvoll machen, eine galvanische Trennung über
Optokoppler oder Relais zu realisieren.
Allerdings muß man sich darüber auch kler sein, dass Eingänge von uC
recht empfindlich gegen Überspannungen (ESD Störungen im Bordnetz) sind.
Aus diesem Grund ist es sehr zweckmäßig, uC-Pins von der peripheren
Schaötungen zu entkoppeln und gegen Überspannung und bei Ausgängen evtl.
auch gegen Kurzschluss zu schützen.
> Es gibt auch Hebel mit Zwei Leitungen> und die Verbinden dann Signal und GND direkt ohne 5V.
Das würde heißen, dass das Signal low-aktiv geschaltet werden soll.
Messe mal den Strom mit einem Multimeter, der da fließt, wenn das Signal
auf GND geklemmt wird. Vermutlich liegt der Strom nur bei 1mA oder
weniger.
Um das umzusetzen und den uC zu entkopplen eignet sich ein robuster
npn-Bipolartranssitor sicher gut.
Zwischen uc und Basis gehört ein Basisvorwiderstand.
Da sicher nur ein geringer Strom geschaltet werden muß, kann dieser rel.
hochohmig sein (z.B. 2,2...10 kOhm).
Am uC läßt sich dann der Eingang leicht mit einer Z.Diode (5,6V) oder
mit Dioden gegen GND und 5V gut schützen
-> wie Schaltung im Anhang:
* Eingang ist links, nach rechts geht es zum uC.
* links käme in dem Fall die Basis vom Transistor dran (die Pullup-R
wären dann nicht nötig).
Man kann die Entkopplung auch mit einem Optokoppler machen, allerdings
sind bei der Dimensionierung auch ein paar Sachen zu beachten.
> Notfalls hätte ich für die Relais Variante noch 5V am Akku zur> Verfügung.
Ein Relais braucht vergleichsweise viel Strom. Bei der Relaiswicklung
unbedingt die "Freilaufdiode" vorsehen. Der direkte Betrieb an einem
uC-Pin ist nicht unbedingt vorteilhaft, da wäre ein
npn-Treibertransistor auch empfehlenswert. Damit hat man dann aber in
Summe noch mehr Aufwand.
https://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern
Ein Relaiskontakt ist allerdings völlig unempfindlich gegen diverse
Störungen aus dem Bordnetz.
Diesbezüglich ist aber auch die 5V-Stromversorgung gefährdet.
Wenn diese aus einer vorhandenen Stromversorgung kommt, ist das weniger
kritisch. Dann sollte man nur aufpassen, dass die interne SV nicht durch
seinen zusätzlichen Bastelkram überlastet wird. Ein paar mA fallen
sicher immer ab, aber ein Relais mit paar 10mA könnte schon zu viel
sein.
Da sollte man sich auch mal ansehen, ob die interne SV evtl. schon sehr
heiß wird.
Gruß Öletronika
Stefanus F. schrieb:> Mit dem Transistor hast du ihn jetzt vermutlich überfordert.
Und mit dem uC hast du ihn nicht überfordert?
> Kann man machen, muss man nicht.
Klar kann man oder auch nicht.
Es gibt wie immer eine Anzahl Lösungsmöglichkeiten.
In dem Link zu der Schaltung mit Freilaufdiode ist ja die Grundschaltung
schon gegeben. Am Ende braucht es nur 2 Bauelemente (Transistor +
Basisvorwiderstand)
https://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern
Statt des Relais (und Freilaufdiode) muß doch nur noch das Schaltsignal
zwischen 5V und Kolektor geschaltet werden.
Ich meine, das wird so schon zuverlässig funktionieren.
Der Transistor selbst entkoppelt das Signal vom uC und ist an der Stelle
sicher ausreichend robust gegen alle zu erwartenden Störungen.
Offenbar ist das zu schaltenden Signal ja auch nur ein Eingang von einem
uC in der internen Steuerschaltung, also sehr wahrscheinlich ziemlich
unkritisch bezüglich Störungen.
Als Test kann man das ja mal eben anbauen und ausprobieren
-> Basiswiderstand an GND = Transistor als Schalter offen!
-> Basiswiderstand an +5V = Transistor als Schalter geschlossen!
Wenn das klappt, kann er den Basiswiderstand an das uC-Port klemmen
und fertisch!
Gruß Öletronika
Ich empfehle, dem Joachim keine weiteren Tipps mehr zu geben, denn jetzt
hat er (in Beitrag "elektronischer Stufenschalter") auch noch vor,
die Leistungssteuerung des Pedelecs zu manipulieren.
Lieber Stefan, das ist leider der größte Blödsinn, den Du gerade
geschrieben hast.
Es geht nicht um Tuning , geschweige denn Leistungssteigerung. Du hast
mein Anliegen absolut nicht begriffen. Lies bitte im anderen Faden,
meine nachgeschoben Erläuterung.
Schade, das Du Dich hier so abfällig geäußert hast.
Stefanus F. schrieb:> Der Kontakt verschleisst nur nennenswert, wenn er überlastet wird.
Dann ist die Lebenserwartung von einem 10 Ampere Relais das mit 10
Milliampere belastet wird also gut?
Manuel schrieb:> Stefanus F. schrieb:>> Der Kontakt verschleisst nur nennenswert, wenn er überlastet wird.>> Dann ist die Lebenserwartung von einem 10 Ampere Relais das mit 10> Milliampere belastet wird also gut?
Jein. Die meisten Schaltkontakte brauchen eine gewisse Mindestlast,
damit sie langfristig zuverlässig funktionieren. Größzügig
dimensionieren ist schon sinnvoll, aber man soll es auch nicht
übertreiben.
10mA bei einem 10A Relais wird in den meisten Fällen gut gehen.
Aber 0,1mA bei einem 10A Relais halte ich für bedenklich.
Leider geben die Datenblätter oft nur die maximale Belastung der
Relaiskontakte an, nicht die minimale. Das gleiche gilt auch für
Schalter und Taster.
Damit kommen wir zu einem Punkt, den ich die ganze Zeit verschwiegen
habe weil ich Dich nicht verwirren wollte: Es ist vorteilhaft,
zusätzlich zu den internen Pull-Up Widerstanden des Mikrocontrollers
noch externe hinzuzufügen, weil.
a) Weil Schaltkontakte einen gewissen minimalen Strom brauchen, um
langfristig zuverlässig zu funktionieren.
b) Weil jede Leitung auch eine Antenne ist, also empfänglich für
Funkwellen. Je geringer der Widerstand, umso mehr Strom wird abgeleitet,
as die Schaltung unempfindlicher macht.
Wenn ich keine konkreten Werte habe, lege ich den Pull-Up Widerstand
immer so aus, dass mindestens 1mA fliessen.
Ich habe noch ein Problem entdeckt.
Und zwar wenn ich es mit extra Relais und extra Stromversorgung mache,
dann ist das auch extra ein und auszuschalten was nicht so sicher ist,
weil man es vergessen kann. Ich möchte jetzt nicht fragen wie man das
auch noch automatisieren kann, weil es ja nicht noch komplizierter
werden soll. Würde dann eher einen Knoten ins Taschentuch
machen...lach...
Dann bin ich noch darauf gestoßen, das ja der Controller insgesamt 5
Hallsensoren verträgt.
Tretsensor, Gasgriff, Speedsensor und 2 !!! Bremshebel.
Und ich habe nur den Tretsensor an 5 Volt.
Dann müsste doch noch ein Arduino auch noch versorgt werden können?
Aber:
So wie ich das verstanden habe ist es normaler Weise so, das der
Hallsensor von einem normalen Bremsgriff bei Betätigung Signal und GND
verbindet.
Der Arduino kann aber nur sein eigenes Signal ausgeben, zB. für eine Led
oder ein Relais aber kann nix verbinden?
Mir hat einer was von gleichem Potential gesagt wenn beide an gleicher
Leitung hängen?
Der meinte das geht...
Würde es ja testen, aber habe Angst den Controller zu zerstören.
Bin schon kurz davor, einfach einen Schalter an die Bremsleitung zu
machen, und per Hand zu schalten.
Sorry, bin Laie auf dem Gebiet
Wegen der möglicherweise unterschiedlichen Potentiale hatte ich Dir den
Optokoppler (Relais ist auch gut) empfohlen. Du hast aber geschrieben,
dass du die Stromversorgung vom Motor-Controller verwenden wirst, dann
hast du logischerweise das gleiche Potential und auch kein Problem mit
getrenntem Aus-Schalten.
Ansonsten gefällt mir gar nicht, dass du hier so viele Annahmen
beschreibst, Schlüsse daraus ziehst und uns um Bestätigung/Korrektur
bittest. Das ist die falsche Reihenfolge. Zuerst müssen deine Annahmen
gesichert werden,
Wir kennen deinen Motorcontroller nicht, also können wir Dir auch nicht
erklären, wie er funktioniert. Im Gegensatz zu Dir, haben wir ihn auch
nicht vorliegen, um seine Eigenschaften durch Messungen und Experimente
zu ermitteln.
Du kannst das hingegen tun, hast aber anscheinend mehr Interesse daran,
das Pferd von hinten aufzuzäumen indem du zuerst die Steuerung baust um
dann im Anschluss zu hinterfragen, ob sie überhaupt passt.
> Dann müsste doch noch ein Arduino auch noch versorgt werden können?
Das kann man hoffen, aber wissen tut man es nicht. Du weisst nicht, wie
viel Strom du extern an den 5V Anschlüssen abgreifen darfst. Und du
weisst vermutlich auch noch nicht einmal, wie viel Strom deine externe
Schaltung aufnimmt.
> Würde es ja testen, aber habe Angst den Controller zu zerstören.
Durchaus berechtigt. Wenn man keine Ahnung und keine
Schaltungsunterlagen hat, besteht dieses Risiko.
Da kann man also nur experimentieren und hoffen, dass nichts kaputt
geht. Oder so wie ich Dir anfangs empfohlen hatte: Für deine eigene
Elektronik eine eigene Stromversorgung bauen, eigene Sensoren verwenden
und nur potentialfrei über Optokoppler/Relais miteinander verbinden.
Damit bist du auf der sicheren Seite.
> Der Arduino kann aber nur sein eigenes Signal ausgeben,> zB. für eine Led oder ein Relais aber kann nix verbinden?
Dazu solltest du mal lernen, wie die Ausgänge des Mikrocontrollers (bzw
CMOS IC's allgemein) aufgebaut sind. Schau Dir zum Beispiel das Bild
rechts oben auf der Seite https://en.wikipedia.org/wiki/CMOS an. Da
siehst du, dass der Chip den Ausgang wahlweise mit 5V oder mit GND
verbinden kann.
Da siehst du, dass der Chip den Ausgang wahlweise mit 5V oder mit GND
verbinden kann.
Das ist es doch was ich mir überlegt habe!
Wieder einmal Danke!!!
Da grübel ich schon lange drüber.
Dann ist es also so?
Man kann den Ausgang des Arduino mit 5V verbinden für eine LED oder
Relais.
Oder mit GND so wie es ein Hallsensor im Bremshebel macht indem er
Signal und GND verbindet.
Dann müsste es ja tatsächlich direkt gehen.
Habe auch gesehen:
Manche Zubehör Sensoren für die Controller haben auch noch eine
Kontrolle LED eingebaut. Also etwas Strom muss da schon anliegen für
Hallsensor+LED.
Nimmt den der Nano alleine
so viel mehr Strom wie eine LED?
Sorry , aber ich habe nur +und- gelernt.
Was ich nicht kapiere:
Bei meinem Testaufbau schaltet der Arduino eine LED ein, wenn ein
Magnetschalter eine gewisse Frequenz liefert. Es fließt also Strom am
Ausgang.
Aber der Controller Eingang will ja scheinbar nur verbunden werden?
Manuel schrieb:> Nimmt den der Nano alleine so viel mehr Strom wie eine LED?
Auf jeden Fall hast du in deiner Schaltung mehrere Sachen, die Strom
aufnehmen:
- Die Power LED
- Der Mikrocontroller (Stromaufnahme hängt von der Takt-Konfiguration ab
und ob du den Sleep Modus verwendest).
- Der Spannungsregler nimmt auch Strom auf, wenn du "von hinten herum"
5V anlegst
- Der USB-UART Chip nimmt auch Strom auf, wenn kein USB Kabel
angeschlossen ist
- Die Rx und Tx LEDs
- ggf. eine Status LED
- ggf. das Relais
- Und alles was du sonst noch so dran baust.
Wie viel Strom ist denn für dich "eine LED"? Da fängt die größte
Unsicherheit doch schon an!
Im Pedelec Forum meinten gerade die Experten,
der Signaleingang wäre direkt ohne Relais kein Problem aber die 5V
sollte ich von woanders her nehmen weil die Controller etwas
schwachbrüstig sind, was die 5V angeht. Nicht das es plötzlich stinkt...
Ok, ich habe ja den Step Down Wandler für meine Lampen der steht auf 5V.
Wenn ich jetzt beide Infos sicherheitshalber berücksichtige läuft es auf
die externe Stromversorgung mit Relais hinaus.
Ja mache das lieber mit Relais (oder Optokoppler). Denn wenn du
versehentlich 5V an den Motorcontroller sendest während dieser
ausgeschaltet ist, killst du ihn sonst womöglich.
Immer dran denken: Solange keine spezielle Ausnahme dokumentiert ist,
darf die Spannung an sämtlichen Pins von allen IC's nicht höher als die
Versorgungsspannung sein (und die ist in ausgeschaltetem Zustand 0
Volt).
Dann hatte ich ja Glück das nix passiert ist als ich die LED am Arduino
an 5V statt an GND hatte. Die glimmte nur dunkler und ging nicht aus.
Dann wünsche ich erst mal einen guten Rutsch!
Ich schaffe dann erst mal Platz für zwei neue Platinen am Rad. Alu kann
ich besser biegen als Arduinos programmieren.
Ich habe das System jetzt am Rad.
Es funktioniert einwandfrei.
Habe das Programm noch um eine Funktion erweitert.
Eine Kontrolle Leuchte die gegensätzlich zum angezogenen Relais
leuchtet.
Ein Problem ist mir noch auf dem Prüfstand aufgefallen was im
Fahrbetrieb vielleicht nicht so oft vorkommt.
Wenn das Rad aus dem mittleren Tempobereich schnell abgebremst wird geht
das Relais nicht in die Startposition zurück weil dann die Impulse vom
langsam drehenden Rad fehlen. Vielleicht fällt mir dazu noch was ein...
unsigned long time=0;
#define LED 6
#define SENSOR 7
void setup()
{
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
}
void loop()
{
// Wenn der Speuchen-Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == LOW)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
if ((diff<190)or(diff>800)) // Tempo 8-28 km/h
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(5); // Zum Entprellen
}
while (digitalRead(SENSOR) == LOW);
}
}
Hier mein geänderter Sketch:
Relais funktioniert.
Kontroll Lampe funktioniert.
Null Stellung noch nicht getestet.
Ist das so richtig?
// Schubabschaltung Pedelec
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == HIGH)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
if (millis()-time>3000) // Null Stellung
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == HIGH);
}
}
Du misst hier die Zeit-Differenz zwischen zwei High Impulsen und
reagierst dann dementsprechend.
Wenn das Rad plötzlich gestoppt wird, kommt kein Impuls mehr, also auch
keine Reaktion. Du müsstest außerhalb von
1
if(sensorstatus==HIGH)
2
{
3
...
4
}
den Timeout erkennen. Außerdem könnte er im HIGH Zustand hängen bleiben,
deswegen muss die while Schleife "Warte, bis der Magnet wieder weg ist"
auch einen Timeout erkennen.
Vielleicht so:
1
voidloop()
2
{
3
digitalWrite(6,LOW);// Kontroll Lampe
4
5
// Wenn der Magnet am Sensor ist
6
intsensorstatus=digitalRead(SENSOR);
7
if(sensorstatus==HIGH)
8
{
9
// Zeit erfassen
10
unsignedlongdiff=millis()-time;
11
time=millis();
12
...
13
14
// Warte, bis der Magnet wieder weg ist
15
while(digitalRead(SENSOR)==HIGH)
16
{
17
diff=millis()-time;
18
if(diff>3000)
19
{
20
// Rad wurde angehalten
21
auf_timeout_reagieren;
22
}
23
}
24
}
25
26
else// sensorstatus is LOW
27
{
28
29
// Kontrolliere, ob das Rad angehalten wurde (lange keine Impulse mehr)
30
unsignedlongdiff=millis()-time;
31
if(diff>3000)
32
{
33
// Rad wurde angehalten
34
auf_timeout_reagieren;
35
}
36
}
37
}
Die Timeout-Erkennung ist doppelt, weil je nach Position des Magneten
der Sensor entweder im HIGH oder im LOW Zustand hängen bleibt.
habe ich alles richtig eingefügt?
Und ist der Wert 3000 ok? Das habe ich von einem Tachoprogamm geborgt.
Dort gab es auch Probleme mit der Nullstellung.
Ich muss immer den Arduino im Keller ausbauen und zwei Etagen rauf
tragen zum PC. ;-)
// Schubabschaltung Pedelec
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == HIGH)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Warte, bis der Magnet wieder weg ist
while (digitalRead(SENSOR) == HIGH)
{
diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten, auf_timeout_reagieren;
}
else // sensorstatus is LOW
{
// Kontrolliere, ob das Rad angehalten wurde (lange keine
Impulse mehr)
unsigned long diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten auf_timeout_reagieren;
}
}
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == HIGH);
}
}
}
> habe ich alles richtig eingefügt?
Das erfährst du durch einen Test.
> Und ist der Wert 3000 ok?
Kommt drauf an, was du willst. 3000 bedeutet: 3 Sekunden Reaktionszeit.
> Ich muss immer den Arduino im Keller ausbauen und zwei Etagen> rauf tragen zum PC. ;-)
Baue Dir doch ein Modell.
Dein Quelltext ist auf jeden Fall total durcheinander geraten und
unvollständig. Die entsprechenden Stellen sind sogar entsprechend
kommentiert.
Kopierst du nur Sachen Zusammen ohne dabei nachzudenken? Ich habe es
doch schon vorgekaut!
ich glaube jetzt hab ich es.
// Schubabschaltung Pedelec
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == HIGH)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == HIGH);
{
diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
}
}
else // sensorstatus is LOW
{
// Kontrolliere, ob das Rad angehalten wurde (lange keine
Impulse mehr)
unsigned long diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
}
}
Das hat sich wohl beim Kopieren verschoben,
bei mir im Arduino Fenster ist alles eingerückt.
Ein Fehler wird nicht angezeigt.
Aber sind die Befehle jetzt richtig,
damit der Stillstand richtig erkannt wird?
Wenn 3000=3 Sekunden ist.
Dann wäre doch sicher auch 1000 ok?
Manuel schrieb:> Aber sind die Befehle jetzt richtig,> damit der Stillstand richtig erkannt wird?
Frage nicht so viel, probiere es aus. Das ist dein Job.
> Wenn 3000=3 Sekunden ist.> Dann wäre doch sicher auch 1000 ok?
Das kannst nur du entscheiden.
verstehe ich nicht.
{
diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
Da müsste doch was passieren,wenn keine Impulse mehr kommen?
Manuel schrieb:> Da müsste doch was passieren,wenn keine Impulse mehr kommen?
Das sehe ich auch so. Deswegen mein Hinweis zum Debugging. Füge
Textmeldungen hinzu, die den Wert der wichtigen Variablen ausgeben: time
und diff. Ich würde auch Meldungen hinzufügen, die anzeigen, ob du in
dem "if (sensorstatus == HIGH)" Block bist, oder im "else" Block.
Sorry , das ist für mich alles noch viel zu kompliziert.
Kann ich nicht einfach eine Zeile so in der Art da zufügen:
Wenn 3 Sekunden kein High am Eingang dann Ausgang Relais LOW / LED High.
Aber finde nix wie man 3 Sekunden messen und in IF einbinden kann.
Dann habe ich noch was gefunden von millis die nach einer gewissen Zeit
über laufen. Wird das bei meinem Programm auch passieren wenn es länger
läuft?
Manuel schrieb:> Kann ich nicht einfach eine Zeile so in der Art da zufügen:> Wenn 3 Sekunden kein High am Eingang dann Ausgang Relais LOW / LED High.> Aber finde nix wie man 3 Sekunden messen und in IF einbinden kann.
Genau das hast du bereits gemacht.
Manuel schrieb:> Dann habe ich noch was gefunden von millis die nach einer gewissen Zeit> über laufen. Wird das bei meinem Programm auch passieren wenn es länger> läuft?
Ja, sicher, jeder Zähler läuft irgendwann über. Aber deine Berechnung
der "diff" Werte berücksichtigt das bereits. Der Trick besteht in der
Subtraktion. Bei einem Überlauf funktioniert die Subtraktion trotzdem.
Mit einer Addition käme ein falsches Ergebnis heraus. Um das zu
verstehen, braucht man schon etwas mehr Erfahrung mit binären
Zahlensystemen und Assembler.
Was du vielleicht vermisst ist ein Betriebssystem, das ereignisgesteuert
arbeitet. Wo man für jedes Ereignis eine Reaktion programmieren kann und
sich nur wenig Gedanken um Nebenläufigkeit, Multitasking,
Warteschlangen, etc. machen muss. Das kannst du auf diesen kleinen
Mikrocontrollern aber vergessen.
Dass Arduino eine loop() vorgibt, die immer wieder durchlaufen wird,
ergibt sich aus den Fähigkeiten der Hardware. Die haben das schon genau
richtig gemacht, glaube es mir.
Softwareentwickler haben die Fähigkeit, eine Aufgabe mit den gegebenen
technischen Möglichkeiten umzusetzen. Die gleichen Leute sind oft auch
gut darin, Dinge aus Legosteinen und Metallbaukästen zu konstruieren. Es
geht immer darum, grosse Dinge aus kleinen Teilen zusammen zu setzen und
irgendwie auch klar zu kommen, wenn sie nicht exakt dem Wunsch
entsprechen.
Eigentlich funktioniert das System ja super, und vielleicht wird im
Fahrbetrieb auch nicht so schnell auf Null abgebremst wie auf dem
Prüfstand.
Aber die Funktion Nullstellung wenn das Rad 3 Sekunden steht würde ich
noch gerne da zufügen.
Was kann ich noch probieren außer:
diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
Vielleicht habe ich es auch nur in einer falschen Schleife eingefügt. Es
tut sich nix nach 3 Sekunden?
Gar nix. :-(
Manuel schrieb:> Kann es eventuell daran liegen das " diff " bei stehendem Rad gar nicht> errechnet werden kann?
Nein, denn diff ist die Zeit-Differenz und die Zeit läuft immer weiter.
Irgendwo hängt was, und diese Stelle musst du mit Debug Meldungen
finden.
Manuel schrieb:> Vielleicht habe ich es auch nur in einer falschen Schleife eingefügt. Es> tut sich nix nach 3 Sekunden?> Gar nix. :-(
Dann prüfe, was diff für Werte annimmt. Vielleicht hast du einfach
irgendwo den falschen Variablentyp gewählt.
Manuel schrieb:> Diff muss ja Werte zwischen 190 + 800 annehmen,> sonst könnte ja nicht an diesen Punkten bei Raddrehung geschaltet> werden.
Bist du der Joachim, der der extra Code für 3000ms Timeout eingebaut
hat?
Nein , ich bin der Manuel, der die Schubabschaltung sich ausgedacht hat,
aber keine Ahnung vom Arduino hat.
Der Joachim wollte nur helfen und hat hier die ersten Fragen gestellt.
Wir sind beide aus dem Pedelec Forum.
Und der Stefanus ist der Experte, der den fast fertigen Sketch geliefert
hat. Danke!!!
Der nur an einer kleinen Stelle hakt. Und ich finde immer noch keine
Lösung.
Manuel schrieb:> Und ich finde immer noch keine Lösung.
Zeige den aktuellen Sketch und die Debug-Ausgaben der Variablen.
Falls du das noch nicht gemacht hast: Dann mach, anstatt herum zu raten.
so viel Ahnung habe ich leider nicht.
Hier noch mal der Sketch, den ich jetzt verwende.
Geht einwandfrei, bis auf die Tatsache das ein schnell stoppendes Rad
nicht erkannt wird weil dann die langsamen Impulse vom Reedschalter
nicht mehr zur Verfügung stehen. Beim erneuten anfahren reicht dann eine
Umdrehung und das Relais schaltet wieder in Startposition.
Aber dann hat der Motor schon kurz Gas gegeben...
// Schubabschaltung Pedelec
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == HIGH)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == HIGH);
}
}
Das fehlt doch jetzt was, was vorher noch drin war!:
1
while(digitalRead(SENSOR)==HIGH)
2
{
3
diff=millis()-time;
4
if(diff>3000)
5
{
6
// Rad wurde angehalten
7
digitalWrite(RELAIS,LOW);
8
digitalWrite(LED,HIGH);
9
}
10
}
und:
1
else// sensorstatus is LOW
2
{
3
unsignedlongdiff=millis()-time;
4
if(diff>3000)
5
{
6
// Rad wurde angehalten
7
digitalWrite(RELAIS,LOW);
8
digitalWrite(LED,HIGH);
9
}
10
}
Wie sollen wir hier gemeinsam ein Problem analysieren, wenn du in deinem
Programm die entscheidenden Teile wieder ausbaust ohne es mitzuteilen?!
Warum hast du genau den Code wieder weg gelöscht, der genau dein Problem
lösen soll? Ich habe Dir doch sogar erklärt, was ich mir dabei gedacht
habe. Ich frage mich erneut, ob du wenigstens unsere Antworten liest?
Was denkst du warum wir hier schreiben und auf Anleitungen verweisen?
Damit die schick aussehen, oder damit sie gelesen werden? Ohne zu lernen
kann man nichts leisten!
> so viel Ahnung habe ich leider nicht.
Junge Junge, du sollst doch bloss Textmeldungen ausgeben! Das ist in
fast jeder Programmieranleitung die erste Aufgabe! Du kannst nicht
einfach diese komplexe Technik nutzen, ohne die Anleitungen durch zu
arbeiten.
Wie viel wolltest Du mir dafür eigentlich bezahlen? Die ersten 2 Stunden
sind sicher schon verbraucht - macht 120€.
Du findest diesen Kommentar sicher doof. Aber jetzt wird Dir hoffentlich
mal klar, das der Spruch "von nichts kommt nichts" richtig ist. Entweder
lernst du es selbst zu machen, oder du bezahlst andere dafür.
Wir können ja auch tauschen. Kannst du Autos reparieren? Karosserie und
gebrochene Plastikteile. Oder kannst du Laminat verlegen? Ich hätte hier
einiges zu tun, was ich nicht gut kann.
Ich weiss, du hättest gerne das gesamte Programm von mir vorgekaut, aber
das kannst du ohne Gegenleistung vergessen.
Dieser Code wird n icht das tun, was beabsichtigt war, weil das while
Kommando durch das Semikolon beendet wird. Hier wird gewartet, solange
der Sensor HIGH liefert. Erst danach, wenn er nicht mehr HIGH liefert,
wird die serielle Textausgabe gemacht.
Das Semikolon hinter while ist zu viel.
Ich schreibe Dir das, weil es mir gerade an einem Quelltext weiter oben
zufällig aufgefallen ist. Jetzt bist du aber dran. Lerne und stelle
fragen zum Lehrstoff. Du bist noch lange nicht weit genug, Steuerungen
für Fahrzeuge zu entwickeln.
viel Geld habe ich leider nicht.
Aber ich gebe gerne kostenlose handwerkliche Tipps.
Ich bin kein gelernter Handwerker, aber da bringe ich mir alles selber
bei, das ist mehr mein Hobby.
Im Pedelec Forum helfen wir ahnungslosen Anfängern auch gerne weiter.
Auch wenn die manchmal erst durch den Kakao gezogen werden müssen.
Das mit "diff 3000" habe ich entfernt,
weil es nicht funktioniert hat.
Hatte gehofft das jetzt ein anderer kopierbarer Vorschlag kommt,
der Rad Stillstand erkennt.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ich kann es nur noch einmal betonen, Deine Hilfe war wirklich super!
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Wenn es zu viel Mühe macht, dann muss es eben so bleiben wie es jetzt
läuft.
Hier noch mal der Komplette 3000ener Versuch.
Wenn ich das Simikolon weg nehme kommen Klammer Fehler?
// Schubabschaltung Pedelec
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == HIGH)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == HIGH);
{
diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
}
}
else // sensorstatus is LOW
{
// Kontrolliere, ob das Rad angehalten wurde (lange keine
Impulse mehr)
unsigned long diff=millis()-time;
if (diff>3000)
{
// Rad wurde angehalten
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
}
}
Wie war das mit dem Semikolon?
Nochmal die Frage: Liest du unsere Antworten?
Ich möchte noch etwas hinterfragen: Stimmen eigentlich deine Kommentare
im Quelltext?
1
// Wenn der Magnet am Sensor ist
2
intsensorstatus=digitalRead(SENSOR);
3
if(sensorstatus==HIGH)
Oder liefert der Sensor vielmehr einen LOW Pegel, wenn er vom Magnet
betätigt ist?
Das sind Kleinigkeiten die unwichtig erscheinen mögen, aber sie sind
sehr wichtig. Die ganze Programmlogik hängt davon ab.
Manuel schrieb:> Der Magnet macht den Reedschalter zu. ( eben gemessen )
Ist das HIGH oder LOW? Wie sieht eigentlich dein Schaltplan aus, daraus
ergibt es sich.
Welcher Schaltplan?
Ich habe einen Reedschalter von einer Alarmanlage genommen. Der
verbindet die beiden Kontakte wenn der Magnet sich annähert. Ansonsten
offen. Funktioniert am Tacho. Funktioniert am Arduino. Beim Relais habe
ich beide Möglichkeiten, angezogen offen oder zu.
Wie ist dieser Kontakt mit dem Mikrocontroller verbunden? Zeige den
Schaltplan, daraus ergibt sich, ob der geschlossene Kontakt einen HIGH
Pegel oder einen LOW Pegel liefert.
Wenn solche Basics schon unklar sind, dann kann das nichts werden.
Ich frage das nicht ohne Grund, denn in deinem Quelltext steht das:
1
pinMode(SENSOR,INPUT_PULLUP);
Demnach hast du bei geschlossenem Kontakt mit 90% Warscheinlichkeit
einen LOW Pegel. Und dann muss in deinem Programm HIGH mit LOW getauscht
werden.
Alle HIGHs und alle LOWs tauschen?
Und was war mit dem Semikolon?
Die serielle Textausgabe ist nicht von meinem Programm.
Und warum funktioniert es sonst so weit?
Wenn alles vertauscht ist?
Manuel schrieb:> Der Sensor hängt an GND und Pin10.
Dann liefert er bei Betätigung einen LOW Pegel. Du musst also beim
Auswerten des Sensorstatus überall HIGH mit LOW tauschen.
> Und was war mit dem Semikolon?
Was ich oben geschrieben habe.
> Die serielle Textausgabe ist nicht von meinem Programm.
Ich habe Dir damit einen Wink mit dem Zaunpfahl gegeben, wie man Debug
Meldungen programmiert, weil du schriebst:
> so viel Ahnung habe ich leider nicht.> Und warum funktioniert es sonst so weit?
Darauf solltest du durch Nachdenken selber kommen. Es ist ein simples
Logik-Problem.
Es geht !!!!!!!!!!!!!!
Habe nur HIGH und LOW vor den " == " gewechselt.
Schon Scheiße wenn man völlig im Dunklen tappt...
Danke !!!!!!!!!!!!!
Wahnsinn, dann hat das pendeln zwischen Keller und Computerraum gelohnt.
Sicher ein paar KG abgenommen.
Zunächst würde ich erstmal schauen, ob die vorhandene Elektronik sich
nicht so programmieren lässt.
Wenn ich das richtig verstanden habe, soll der Motor bei einer gewissen
Eigenleistung durch den Fahrer (hier 8 Km/h), einfach weggeschaltet
werden.
Vielleicht einmal den Hersteller der Steuerung anschreiben?
Das Semikolon bekomme ich ohne Fehlermeldung nicht weg. Gerade schickt
noch eine Pedelec Kollege eine kurze Version der Stillstand Abfrage und
auch das funktioniert. Auch mit Semikolon. Siehe Sketch...
Das der Magnet genau vor dem Reedkontakt zum stehen kommt und sich
keinen Millimeter mehr bewegt ist sehr unwahrscheinlich. Und selbst dann
würde das Rad ja stehen.
unsigned long time=0;
#define RELAIS 12
#define LED 8 // Kontroll Lampe
#define SENSOR 10
void setup()
{
pinMode(RELAIS, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pinMode(6, OUTPUT); // Kontroll Lampe
pinMode(8, OUTPUT); // Kontroll Lampe
}
void loop()
{
digitalWrite(6, LOW); // Kontroll Lampe
// Wenn der Magnet am Sensor ist
int sensorstatus=digitalRead(SENSOR);
if (sensorstatus == LOW)
{
// Zeit erfassen
unsigned long diff=millis()-time;
time=millis();
// Wenn weniger als 500ms seit dem letzten Impuls
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
if ((diff<190)or(diff>800))
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
else
{
digitalWrite(RELAIS, HIGH);
digitalWrite(LED, LOW); // Kontroll Lampe
}
// Warte, bis der Magnet wieder weg ist
do
{
delay(3); // Zum Entprellen
}
while (digitalRead(SENSOR) == LOW);
}
if (millis()-time>800) // Stillstand
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
Da kann dein Kollege schicken was er will guck dir endlich mal die
arduino Befehle an dann siehst du dass das hinter While falsch ist.
Mittlerweile ist es ganz schön frech, wenn man keinen der vielen Tipps
sich zu Herzen nimmt und wenigstens selbst ein bisschen Mühe reinsteckt
Bitteschön, gut vorgekaute Kost von einem wirklich genervtem Helfer. Und
jetzt lass mich damit bitte in Ruhe bis du
a) dazu bereit bist, Anleitungen zu lesen
b) Die Grundlagen der Programmiersprache gelernt hast
c) Quelltexte ordentlich formatierst, und zwar in der Arduino IDE und
hier im Forum.
1
// Schubabschaltung Pedelec
2
3
#define RELAIS 12 // Bei High geht der Motor an
4
#define LED 8 // Kontroll Lampe, bei Low leuchtet sie
5
#define SENSOR 10 // Liefert kurze Low-Impulse
6
7
// Zwischen den folgenden beiden Werten wird der Motor eingeschaltet
8
// 190 = 28 KMH - 800 = 6 KMH
9
// 200 = 25 KMH - 500 = 12 KMH
10
#define MIN_TIME 190
11
#define MAX_TIME 800
12
#define TIMEOUT 1000
13
14
// Zeitpunkt des vorherigen Impulses vom Sensor
15
unsignedlongtime=0;
16
17
18
// Motor ein schalten
19
voidmotor_ein()
20
{
21
digitalWrite(RELAIS,HIGH);
22
digitalWrite(LED,LOW);
23
}
24
25
26
// Motor aus schalten
27
voidmotor_aus()
28
{
29
digitalWrite(RELAIS,LOW);
30
digitalWrite(LED,HIGH);
31
}
32
33
// Schalte den Motor ab, wenn das Rad still steht
34
voidcheck_timeout()
35
{
36
// Kontrolliere, ob das Rad angehalten wurde (lange keine Impulse mehr)
37
unsignedlongdiff=millis()-time;
38
if(diff>TIMEOUT)
39
{
40
// Rad wurde angehalten
41
motor_aus();
42
}
43
}
44
45
46
// I/O Pins initialisieren
47
voidsetup()
48
{
49
pinMode(RELAIS,OUTPUT);
50
pinMode(SENSOR,INPUT_PULLUP);
51
pinMode(LED,OUTPUT);
52
}
53
54
55
voidloop()
56
{
57
digitalWrite(6,LOW);
58
59
// Wenn der Magnet am Sensor ist
60
if(digitalRead(SENSOR==LOW))
61
{
62
// Zeitspanne erfassen
63
unsignedlongdiff=millis()-time;
64
time=millis();
65
66
// Schalte den Motor abhängig von der Geschwindigkeit ein oder aus
67
if((diff<MIN_TIME)or(diff>MAX_TIME))
68
{
69
// zu schnell oder zu langsam
70
motor_aus();
71
}
72
else
73
{
74
// Im Zeitfenster, wo der Motor mit helfen soll
75
motor_ein();
76
}
77
78
delay(3);// Zum Entprellen
79
80
// Warte, bis der Magnet wieder weg ist
81
while(digitalRead(SENSOR)==LOW)
82
{
83
check_timeout();
84
}
85
}
86
87
else// Sensor ist LOW, der Magnet ist nicht am Sensor
Danke für diese neue aufgeräumte Version.
Wäre ja nicht nötig gewesen weil die ca. 25 Zeilen kürze Version auch
schon mit Simikolon super läuft.
while (digitalRead(SENSOR) == LOW);
}
if (millis()-time>800) // Stillstand
{
digitalWrite(RELAIS, LOW);
digitalWrite(LED, HIGH); // Kontroll Lampe
}
}
ich werde die Punke a,b und c beherzigen.
Etwas habe ich ja schon gelernt:
HIGH und LOW ist nicht das selbe.
Entschuldigung noch mal für die vielen dummen Fragen.
Als Anfänger war das eben mit den millis und Verknüpfungen
gleich etwas viel für mich.
Manuel schrieb:> Wäre ja nicht nötig gewesen weil die ca. 25 Zeilen kürze Version auch> schon mit Simikolon super läuft.
Sie funktioniert nicht, wenn der Magnet beim schnellen Anhalten vor dem
Sensor steht.
Außerdem erzeugt sie unsaubere Signale mit sehr kurzen Impulsen die du
weder sehen kannst, noch reagiert das Relais darauf. Trotzdem gewöhnen
sich Softwareentwickler an, auch solche "unwirksamen" Fehler zu
korrigieren. Denn genau solche Stellen verursachen später bei
Erweiterungen überraschende Probleme.
Ok, dann nochmal vielen Dank!
Ich war schon froh das jetzt jetzt überhaupt
3 Geschwindigkeiten und Stillstand erkannt werden.
Es ist ja nur eine Zusatzfunktion, wenn die Pedale nicht gedreht werden,
ist der Motor so wie so aus.
Sorry, da ist auch ein blöder Tippfehler drin. Schade dass der Compiler
es nicht bemerkt hat:
> if (digitalRead(SENSOR == LOW))
Muss heissen:
> if (digitalRead(SENSOR) == LOW)
Ich hätte jetzt an Deiner Stelle gesagt das war ein Test.
Lach...
Soviel habe ich jetzt nämlich schon gelernt, das auf 2x Klammer auf 2x
Klammer zu kommen muss.
Aber ich habe es auch nicht gefunden.
Kein Problem, ich werde es testen.
Manuel schrieb:> Ach nee ist ja beides Mal 2 x zu.> Bin auch schon ganz wuschig....
:-)
Ich sag ja, dass es ein blöder Fehler ist. Dabei hatte ich mich noch
bemüht, es mit allen Warnungen zu compilieren. Gegen manche Doofheit
hilft nicht einmal das.
Jetzt ging das Relais wieder aber die Kontroll LED nicht.
Aber Dein Lehrling macht Fortschritte.
Habe Fehler selber gesucht und gefunden.
Der pinMode (6, OUTPUT);
hat gefehlt.
(Ich habe die LED an 6 + 8 statt GND.)
War so eine Idee von mir, weil in der GND Klemme schon zwei Kabel
stecken.
Jetzt geht alles!
3 Geschwindigkeiten werden erkannt.
Stillstand mit Magnet am Schalter und ohne Magnet.
Super !!!
Dann könnte ich ja noch einen Pieper anbauen,
der bei verschiedenen Drehzahlen sich meldet.
Manuel schrieb:> Ich habe die LED an 6 + 8 statt GND.> War so eine Idee von mir, weil in der GND Klemme schon zwei Kabel
stecken.
Ich bin davon ausgegangen, dass die LED an Pin 6 angeschlossen ist, denn
so geht das aus deinem Quelltext hervor.
Merkst du, dass wir immer wieder auf den fehlenden Schaltplan zurück
kommen?
> Dann könnte ich ja noch einen Pieper anbauen,> der bei verschiedenen Drehzahlen sich meldet.
Bitte nicht.
Dazu müssen wir (oder ich?) das Programm nämlich nochmal komplett
umschreiben. Du kannst ja mal
https://de.wikipedia.org/wiki/Endlicher_Automat und
https://de.wikipedia.org/wiki/Multitasking lesen. Wenn du diese Artikel
beide verstanden hast und eine Vorstellung davon hast, wie das auf einem
Mikrocontroller mit den Mitteln von Arduino umgesetzt werden kann, melde
dich wieder.
Es geht auf jeden Fall und ich weiss auch wie. Aber ich habe keine Lust,
es Dir zu erklären, denn das würde eine never-ending Story.
Ich habe ja auch die Kontroll LED an 6 + 8.
Aber der pinMode (6, OUTPUT);
Text hat gefehlt beim letzten Sketch.
Dachte man könnte einen Ton einfach so wie die Kontroll LED zuschalten.
Aber wenn das zu große Umstände macht,
muss das ja nicht sein.
Habe ja die sehr helle Kontroll LED und das Relais klickt auch ziemlich
laut.
Ok, bevor das in Arbeit ausartet.
Sollte ich vielleicht erstmal das System in der Praxis testen. Aber im
Moment ist Sau Wetter.
Aber ich denke das läuft super.
Manuel schrieb:> Dann könnte ich ja noch einen Pieper anbauen,> der bei verschiedenen Drehzahlen sich meldet.
Also ich möchte so wenig wie nötig von meiner Elektronik sehen, wenn ich
sie vorher ausgiebig getestet habe.
Natürlich sind manchmal optische und akustische Signale wichtig, aber
bei dem Rad merkst du doch, ob der Motor aktiv ist. Da braucht es nicht
einmal eine LED.
Alles muss heute irgendwie ein Display haben.
Wenn das Licht an ist, brauche ich nicht noch ein Display, auf dem
steht, dass das Licht an ist.
Das Gepiepse wird den Fahrer sehr schnell wahnsinnig machen.
Dann baue lieber eine sinnvolle Überwachung für das Relais mit ein, denn
da können auch mal die Kontakte kleben oder die Spule kaputt sein.
Das Relais klicken wird reichen als Kontrolle.
Die Kontrolllampe zeigt nicht an ob der Motor läuft,
sondern wann ich im Geschwindigskeitbereich bin das beim treten der
Motor zugeschaltet werden würde oder eben nicht.
Ein Kumpel aus dem Pedelec Forum meint:
Normalerweise hängt man einen Impulsgeber an einen Interrupt.
Warum haben "Wir" das nicht so gemacht?
Wäre dann ein zusätzlicher Pieper einfacher zu integrieren?
Manuel schrieb:> Normalerweise hängt man einen Impulsgeber an einen Interrupt.
Kann man machen, muss man nicht.
> Warum haben "Wir" das nicht so gemacht?
Weil das Programm dann komplexer geworden wäre.
> Wäre dann ein zusätzlicher Pieper einfacher zu integrieren?
Nein
Noch komplexer wollen wir ja nicht.
;-)
Ich werde vielleicht mal in diesen Sketch versuchen
einen Ton zu integrierten. Kann man ja wieder löschen wenn es nicht
funktioniert...
// Zwischen den folgenden beiden Werten wird der Motor eingeschaltet
// 190 = 28 KMH - 800 = 6 KMH
// 200 = 25 KMH - 500 = 12 KMH
#define MIN_TIME 190
#define MAX_TIME 800
#define MIN_TIME 200
#define MAX_TIME 500
Ich habe mal wieder eine Frage.
Im Moment programiere ich das immer um,
wenn ich mal die Schaltpunkte verändern möchte.
Gerne würde ich das ändern der Werte noch mit einem Schalter oder Taster
lösen.
Kann ich bei #define mit einer If Abfrage des Tasters dazwischen gehen?
Na, bin ich ja mal gespannt.
Ich bau dir was, wenn Du magst. Im Abo: 300€ im Monat. Vierteljährlich
kündbar.
Im Ernst. Ich finds dreist und unangemessen, wie du die
Hilfsbereitschaft anderer stapazierst.
Ich hatte den Thread hier eben erst mitbekommen.
Statt die Referenz mal aufzurufen, um eigenes Interesse zu
manifestieren, schriebst du, es ginge schlieslich bei anderen auch "mit
semikolon".
das haben dann andere gemacht, ohne dass es Erwähnung fand.
Beitrag "Re: Suche Baustein, der in Abhängigkeit von Zeit (Frequenz) schaltet"
Interesse am eigenen Projekt sollte sich nicht auf das Interesse am
eigenen Vorteil beschränken...
1
// Syntax
2
3
do{
4
// statement block
5
}while(condition);
6
7
// Parameters
8
9
// condition: a boolean expression that evaluates to true or false.
Sorry äxl,
das war kein Jobangebot.
Auch keine suche nach einem Oberlehrer.
Es war einfach eine Frage an Leute die sich auf dem Gebiet besser
auskennen als ich.
So wie ich auch Anfängern in anderen Foren mit Fragen helfe, wo ich mehr
Wissen habe,
ohne mir das bezahlen zu lassen.
Ich hoffe Du bist noch sehr jung,
dann wirst Du auch noch lernen,
das man Geld nicht essen kann...