Forum: Mikrocontroller und Digitale Elektronik variabel 12-24V für Arduino Interrupt verwenden


von Thomas S. (thomasbommel)


Lesenswert?

Hallo, ich habe folgendes Problem:

Ich entwickle/bastle/baue gerade ein Projekt mit dem Arduino und möchte 
einen Interrupt verwenden, dieser Interrupt kommt von einer 
Lichtschranke, die mit 10-30V arbeitet.
Bisher habe ich die Lichtschranke mit 12V betrieben und für den 
Interrupt einfach einen Spannungsteiler (10/6.8 Kiloohm) verwendet, 
funktioniert soweit auch problemlos.

Nun möchte ich aber das ganze Projekt so gestalten, dass ich es mit 12 
oder 24V betreiben kann.

Von dieser Spannung aus würde ich über so ein kleines "buck converter" 
Modul die 5V für den Arduino erzeugen.. hier schonmal die Frage: geht 
sich das mit so einem kleinen Modul von der Leistung her aus, oder wird 
das zu schwach?

https://www.amazon.de/WINOMO-1-23-30V-DC-Einstellbare-Spannung-Konverter/dp/B01B7EEWGK/ref=sr_1_3?ie=UTF8&qid=1505679764&sr=8-3&keywords=step+down

am Arduino hängt noch ein LCD Display(glaube um die 50mA), ein GPS Modul 
(ca. 20mA) und ein Relay(ca. 50mA).

-------------------------------------------------
Nun die zweite Frage
Kann ich, um den Interrupt für den Arduino zu erzeugen (also von 12-24V 
auf 5V) einen Optokoppler verwenden ...oder einen LM7805.. oder gibt es 
da eine 'Standardlösung')
eine eventuelle kleine Verzögerung <10ms ist egal

Ich hatte mir schonmal überlegt einfach einen 'variablen 
Spannungsteiler' mit einem Schalter zu basteln.. nur ist mir das zu 
gefährlich da das Projekt auch andere Leute verwenden werden.

Auch hatte ich mal überlegt, die 12-24V gleich beim Eingang mit einem 
Buck Converter Modul auf 10V zu bringen, dann aufteilen zwischen 
Lichtschranke und Arduino, fixer Spannungsteiler für den Interrupt... 
wäre dies die bessere Lösung?

PS. ich bin weit entfernt von fortgeschritten in dem Gebiet,daher bitte 
um Nachsicht

Danke im Vorraus,
   Thomas

von Danish B. (danishbelal)


Lesenswert?

Wie wäre es mit einem Serienwiderstand und den int. Schutzdioden zu 
clampen?

von Thomas S. (thomasbommel)


Lesenswert?

kannst du mir das bitte etwas genauer erklären, bzw. gibt es da im 
Internet etwas zum nachlesen? ... habe schon irgendwo gelesen dass man 
die Spannung mit Dioden begrenzen kann, nur weiß ich leider nicht genau 
wie, bzw. nicht genau nach was ich suchen muss.

von HildeK (Gast)


Lesenswert?

Thomas S. schrieb:
> kannst du mir das bitte etwas genauer erklären,

Als ESD-Schutz sind bei den IC-Eingängen zu VCC (und zu GND) Dioden 
verbaut. Die kann man zweckentfremden, wenn man den Strom durch einen 
Vorwiderstand begrenzt leiten sie bei höheren Eingangssignalen den Strom 
zu VCC ab.
Leider sind diese Dioden selten spezifiziert, einige mA gehen aber fast 
immer.
Nimm doch einfach deinen 12V Spannungsteiler und bau selber eine 
Schottky-Diode zur Arduino-VCC dazu. Jetzt muss nur noch dein oberer 
Teilerwiderstand den Strom aushalten (bei 24V sind es (24V-5V)/10k, kein 
Problem). Der Stromverbrauch der Arduino-Schaltung muss aber höher sein, 
als diese 1.9mA!
Auch eine 5.1V Z-Diode parallel zum unteren Teilerwiderstand ist ein 
andere Alternative - ein 7805 jedoch eher nicht.

von Stefan F. (Gast)


Lesenswert?

Diese Frage wird hier gefühlt jede Woche erneut gestellt. Offensichtlich 
ist es zu schwierig, die Antworten bzw. Artikel per Suchfunktion wieder 
zu finden.

Ich habe den Artikel selbst nicht mehr wieder gefunden, bin aber 
ziemlich sicher, daß wir dazu mal was hatten. Wer weiss, wie der Artikel 
hiess?

von Peter D. (peda)


Lesenswert?


von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Versorgung: Wenn der Konverter den benötigten Strom bei den gewünschten 
Eingangsspannungen liefern kann, ja klar.

Interrupt: Nimm einen Vorwiderstand und eine Z-Diode. Billig, einfach, 
...

von HildeK (Gast)


Lesenswert?

Norbert schrieb:
> Nimm einen Vorwiderstand und eine Z-Diode. Billig, einfach,
... und die Zeichnung ...
R1=2k2? Fast 10mA würde ich der Signalquelle nicht abverlangen wollen, 
kann die das überhaupt?

HildeK schrieb:
> Auch eine 5.1V Z-Diode parallel zum unteren Teilerwiderstand

Ich wollte den unteren Teilerwiderstand absichtlich mit drin haben, weil 
damit auch der LOW-Pegel (wie groß ist der max. bei dem vorhandenen 
Signal?) geringer wird. LOW-Störabstand.
Sollte der zuverlässig <0.8V sein, braucht man den natürlich nicht.

von Norbert (Gast)


Lesenswert?

HildeK schrieb:
> Norbert schrieb:
>> Nimm einen Vorwiderstand und eine Z-Diode. Billig, einfach,
> ... und die Zeichnung ...
> R1=2k2? Fast 10mA würde ich der Signalquelle nicht abverlangen wollen,
> kann die das überhaupt?

Ich weiß das nicht, sag du es mir ;-)

Da wir beide nur vermuten können, hab' ich hier einfach nur einen 
unspektakulären Schätzwert genommen.

von Stefan F. (Gast)


Lesenswert?

Und schon sind wir schon wieder dabei, Lösungsvorschläge zu posten, ohne 
zu wissen, ob sie überhaupt geeignet sind.

Egal ob Zenerdiode, Spannungsteiler, Optokoppler, Transistor (oder was 
auch immer). Es kommt immer auch auf die Signalquelle an und die 
erwarteten Störungen, die man bei der gelegenheit auch gleich mit 
lsowerden möchte.

Darüber sollten wir zuerst diskutieren.

Ansosten: Ich kann auch mit einer Boeing Zigaretten kaufen gehen. 
Funktioniert ganz bestimmt - ist trotzdem keine kluge Idee.

von Norbert (Gast)


Lesenswert?

Nun, zum aktuellen Stand der Dinge/Informationen ist die 
Aufgabenstellung gelöst. <-PUNKT.

Warum sollten wir über andere Dinge diskutieren?

Wenn/falls irgendwann später Innenwiderstand, Strombegrenzung, 
Flankensteilheit, usw. eingebracht werden, kann sich das ändern.

von Thomas Sallaberger (Gast)


Lesenswert?

Danke schonmal an alle für die vielen Ideen!

.. wäre es die bessere (oder zumindest eine sinnvolle) Lösung die 12-24V 
immer auf 10V zu bringen (also gleich am Eingang) und dann je ein Kabel 
zu Lichtschranke und Arduino (mit 5V buck converter davor)?

und dann ein Spannungsteiler für die 10 zu 5V für den Interrupt

Ps. heute abend poste ich hier einen Link zum Datenblatt der 
Lichtschranke, habe ich leider gerade nicht zur Hand

von Manfred (Gast)


Lesenswert?

> Norbert schrieb:
> Nimm einen Vorwiderstand und eine Z-Diode. Billig, einfach,

Alles Kasperei: Einen NPN-Transistor BC_irgendweas mit 12k-Widerstand 
vor der Basis, fertig. Ob der nun ein oder zwei Basisstrom bekommt, ist 
egal und man hat ihn sowieso in der Schublade.

Ob er Interrupt bei high oder low stattfindet, macht die Software.

von Brain 2.0 (Gast)


Lesenswert?

Und ich frage mich, wozu überhaupt einen Interrupt ?

von Thoma Sallaberger (Gast)


Lesenswert?

da ich im Interrupt ein boolean-flag setzen muss, und der normale loop 
dafür zu langsam ist

von Norbert (Gast)


Lesenswert?

Manfred schrieb:
>> Norbert schrieb:
>> Nimm einen Vorwiderstand und eine Z-Diode. Billig, einfach,
>
> Alles Kasperei: Einen NPN-Transistor BC_irgendweas mit 12k-Widerstand
> vor der Basis, fertig. Ob der nun ein oder zwei Basisstrom bekommt, ist
> egal und man hat ihn sowieso in der Schublade.
>
> Ob er Interrupt bei high oder low stattfindet, macht die Software.

Na endlich einer der wirklich Ahnung hat und uns allen zeigt wie's auf 
die einzig richtige Art gemacht wird.

von Brain 2.0 (Gast)


Lesenswert?

Thoma Sallaberger schrieb:
> da ich im Interrupt ein boolean-flag setzen muss, und der normale
> loop dafür zu langsam ist

Wieso ist die Loop zu langsam ? Und was ist bei dir die "normale Loop" ?
Da du uns deinen Sketch nicht zeigst, können wir dir auch nicht helfen.
Was macht denn deine Loop so langsam ?

von Thomas S. (thomasbommel)



Lesenswert?

Meinen loop muss es schaffen ~2 mal in der Sekunde 'abzuwerfen', 
außerdem brauche ich den Interrupt, da die Köder nur sehr sehr kurz die 
Lichtschranke aktivieren.

kurze Erklärung drumherum
Es geht darum, das aus einem Flugzeug Köder abgeworfen werden (Hardware 
dazu bereits vorhanden, funktioniert tadellos), dies geschieht bei 
Fluggeschwindigkeit 180km/h, die Genauigkeit soll +/-5m betragen
Der Abstand soll mit 2 Schaltern einstellbar sein.
Auf dem LCD Display sollen gewünschte (noch nicht fixe Daten) 
dargestellt werden, wsl. der Abstand, die Uhrzeit, irgend sowas.

Bei jedem Abwurf sollen die Daten auf einer SD Karte gespeichert werden.

PS. das ganze funktioniert im 'Autotest' (man hat nicht immer ein 
Flugzeug parat) schon sehr gut, bei gleichbleibender Geschwindigkeit 
+-1m
Beim Beschleunigen z.b. werden die Abstände zu lang, was jedoch beim 
Flugzeug kein Problem sein wird, da dieses nicht so schnell 
beschleunigen kann.

Ich habe nun einen Screenshot aus Fritzing, einen Schaltplan, und den 
Sketch (ich weiß, derzeit noch sehr sehr hässlich, aber funktioniert) 
hinzugefügt.

Hier der Link zur Lichtschranke

http://at.rs-online.com/web/p/optische-naherungsschalter/3146036/

von Stefan F. (Gast)


Lesenswert?

> Meinen loop muss es schaffen ~2 mal in der Sekunde 'abzuwerfen',

In zwei Sekunden führt ein durchscnnittlicher Mikrocontroller 20 bis 200 
Millionen Befehle aus. Das ist quasi eine Ewigkeit.

Wenn du mit einem derart entspanntem Timin schon Probleme hast, muss ein 
ganz gravierender Designfehler im Programm vorliegen. Wenn du das nicht 
in Ordnung bringst, wird jede Erweiterung warscheinlich zu neuen 
Problemen führen.

Lies dich mal zum Thema Zustandsautomat ein. Zum Beispiel indem du mit 
dem ersten Kapitel auf dieser Seite beginnst: 
http://stefanfrings.de/net_io/protosockets.html

von Thomas Sallaberger (Gast)


Lesenswert?

Das der Arduino grundsätzlich die Berechnung leicht schafft ist mir 
bewusst, nur braucht der LCD soweit ich es im Kopf habe nach jedem 
Update ein delay,
und wenn blöderweise genau in der Zeit ein Köder die Lichtschranke 
auslöst dann wird dieser übersehen, oder liege ich da falsch?

Ich könnte natürlich z.B. mit einem Attiny die Lichtschranke überwachen, 
möchte aber lieber alles mit dem Arduino machen.

von Simpel (Gast)


Lesenswert?

"...nur braucht der LCD soweit ich es im Kopf habe nach jedem
Update ein delay,..."


Da wird der Hase im Pfeffer liegen.

Ein Delay kann man erzeugen, indem man zigtausendmal im Kreis springt 
(Wait-Funktion) und sonst nix tut... quasi Rechenzeit vergeudet. Das 
wendet man nur an, wenn Zeit keine Rolle spielt, oder man schnell 
provisorisch etwas austesten will.

Eine andere Möglichkeit ist, einen Task (z.B. LCD) nur bei jedem n_ten 
Programm-Durchlauf zu aktivieren (Bypass-Methode), damit ein Modul 
zwischenzeitlich seine geforderten Pausen hat. Dadurch steht die 
Rechenzeit den anderen Programmteilen zur Verfügung. Das ist angesagt, 
wenn das Delay zeitlich unkritisch ist und eine gewisse Varianz 
desselben unerheblich ist.

Die dritte, zeitlich präzise Methode, ist, den timing-relevanten Teil 
per Timer-Interrupt, oder Polling eines Timer-Flags einzubinden. Damit 
wird weder kostbare Prozesszeit "verwartet", noch muss man durch 
veränderliche Laufzeiten eine Varianz (Auslösung u. Dauer) des Delays in 
Kauf nehmen.

Ersetze alle Delays, die nach der ersten Methode arbeiten, durch solche, 
die die Rechenpower freigeben, dann hast du neben dieser Popelaufgabe 
der Dosierung noch jede Menge Zeit, um noch nebenher z.B. Statistik auf 
dem Display anzuzeigen, etc...

von Thoma Sallaberger (Gast)


Lesenswert?

achso danke für den Tipp!... ich hatte da wohl einen Fehler in meiner 
Überlegung und dachte man muss ein 'normales' delay verwenden

von Stefan F. (Gast)


Lesenswert?

Die kommunikation mit dem Display darf beliebig verzögert werden.
Die Erfassung des Köders möchtest du aber möglichst ohne Verzögerung.

Für sowas würden Interrupts erfunden. Jetzt musst du dir nur noch 
überlegen, wer hier wen unterbrechen soll. Du schaffst das!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.