ich habe mir eine RC Fernsteuerung gebastelt mit modularen Aufbau. Diese ist z.B. hier in einen meiner Posts zu sehen (Link). Nun habe ich die Module (Hälften) durch zwei Joysticks ersetzt. Diese haben einen Button (Joystick drücken). Durch den Aufbau (Module) ergibt sich, dass die Komponenten mit die analogen Eingänge verbunden sind.
Wenn ich nun den Taster (Joystick) drücke, erhalte ich am analogen Eingang 0. Sonst verschiedenen Werte. Mir ist bekannt, dass ich die analogen Eingänge auch als digitale Eingänge (ebenso INPUT_PULLUP für Taster) konfigurieren könnte.
Meine Frage ist: wenn der Arduino (Nano) bei gedrückter Taste (quasi Kurzschluss) 0 statt 1023 ausliest, und bisher nicht durchgebrannt ist, kann ich dann davon ausgehen, dass analoge Eingänge implizit einen internen Pull-Up haben, da es das gleiche Verhalten zeigt, wie am digitalen Eingang mit INPUT_PULLUP?
Das Bezugspotential ist GND.
Wenn der analoge Eingang beim drücken der Taste auf dem ADC 0 ausgibt, schaltet die Taste nach GND.
Wenn Du die Taste loslässt, fängt der Eingang alles ein.
Durch die interne Beschaltung liegt auf dem Kanal immer irgendwas an, wenn Du mit offenem Ende arbeitest.
Das ist unabhängig daon, ob da ein PULLUP angebaut ist oder nicht.
Mit analogen Eingängen kannst du Spannungen messen.
Wenn nichts angeschlossen ist, floatet der Eingang und zeigt evtl. Mist an.
Legst du den Eingang auf GND, dann misst er 0 Volt.
Das stört mich nicht, solang er bei gedrückter Taste 0 ausgibt (was auch passiert). Ich habe nur Angst, dass ich einen Kurzschluss verursache und auf Dauer den MC schade. Oder kann das der ADC verkraften, weil das seine Natur ist (er mit sowas umgehen können muss)? Moment… ich muss mal was probieren (die Idee kam mir leider erst jetzt)…
Da hast du wohl recht Mein Idee war jetzt, dass ich das mal messe. Tatsächlich schaltet das Joystickmodul (also die Platine für meine Hall-Effekt-Joysticks) zwischen GND und SW und nicht zwischen 5V und SW. Mmh… keine Ahnung, wie ich da auf etwas anderes gekommen bin. Details siehe auch hier (Link)
Das ist unschön Lösen könnte ich das vermutlich nur, indem ich den analog Pin als INPUT_PULLUP definieren würde und als Digital-Pin auslese (also via digitalRead), oder?
Aktuell evtl. nicht.
Nur kann es passieren, dass der Pin beim floaten auch 0Volt misst und dann hast du ein Problem. Daher sollte der Pin mittels Widerstand auf HIGH (Pullup) gesetzt werden.
Nun frage ich mich, warum ich das nicht einfach tue und ob das nicht den gleichen (oder mindestens ähnlichen) Effekt hätte, wie die Idee von @my_xy_projekt mit dem Widerstand zwischen 5V und SW.
Ja… ich habe das am WE angefangen umzuprogrammieren. Da ich hier wie gesagt verschiedene Module unterstütze (ich kann die RC-Hälften tauschen und über einen Drehgeber die Kombination auswählen) muss ich mir Konfigurationen vorhalten.
Die Darstellung der Konfigurationen auf dem oLED habe ich unglücklich gelöst. Dazu verwende ich Bitmaps. Das will ich zwar ändern, löst aber nicht grundlegend das Speicherproblem. Ich bekomme Warnmeldungen.
Für das oLED habe ich nur eine Lib gefunden, die vernünftig arbeitet. Diese braucht aber einen Datenpuffer (außer für Text). Selbst wenn ich den Controller direkt zeichne (ohne Datenpuffer - dazu habe ich mir am WE quasi eine eigene Lib geschrieben) wird dann die Darstellung zu langsam.
In Summe komme ich auf zahlreiche Anpassungen, welche die Funktionalität (zumindest temporär) gefährden. Da ich die Fernsteuerung bereits in mehreren Anwendungen verwende, ist mir das aktuell zu riskant.
Aber ich arbeite dran. Ursprünglich war das auch alles etwas einfacher gedacht. Ich hätte nicht erwartet, dass das im Laufe der Zeit so wachsen wird. Vielleicht auch deshalb, weil ich dachte, dass es nicht so gut funktioniert. Gab ja auch einige Hürden zu nehmen. Siehe dazu meine anderen Posts und zahlreichen Fragen, bei denen ihr mir fast immer gut helfen konntet.
Man muß die Messung des Zustandes der Digitalen Pins und der Analogen außeinanderhalten.
Ich erkenne da einen Arduino NANO (Nachbau) mit einem ATmega328 in SMD Gehäuse mit ESP8266 Modul. Ich beziehe mich jetzt auf den ATmega328
Pins, die als digitale Eingangspins benutzt werden (D0 bis D19 bzw D0 bis D13 und A0 bis A5 ) :
Ist die Eingangsspannung in einem bestimmten Bereich ( 0 bis 0,3 * Vcc bzw 0,6 bis 1*Vcc) so wird der Pin als LOW bzw HIGH gelesen (Vcc ist die Versorgungsspannung).
Jedes Pin hat eine separate Eingangsschaltung und wird nicht von den anderen Pins beeinflußt.
Ist ein Pin nicht beschaltet, so können elektromagnetische Störungen den Zustand des Eingangs zufällig definieren. Also nie, wenn der Eingang mit einem Schalter/Taster/Kontakt oder einem Transistor auf GND oder Versorgungsspannung geschaltet wird, ohne Pullup / Pulldown Widerstand verwenden.
Eingänge die mit GND ODER Versorgungsspannung von einem Ausgang einer anderen Schaltung versorgt werden, brauchen keinen Pullup/Pulldown Widerstand.
Der Atmega hat nur einen AD-Wandler um mehrere analoge Eingänge zu haben besitzt er einen Multiplexer der die Eingänge A0 bis A7 und auch intern die Versorgungsspannung, die Referenzspannung und ein Thermometer auf den AD schaltet. Der AD Wandler hat einen kleinen Kondensator, der die zu messende Spannung speichert, da die Wandlung in mehreren Schritten nacheinander gemacht wird. Ist nun ein analoger Eingang nicht beschaltet so wird der interne Kondensator nicht geladen bzw entladen und die Messung bekommt einen ähnlichen Wert wie die vorherige Messung. So kann man, je nach Meßreihenfolge bzw analoger Spannung an den anderen analogen Pins verschiedene Meßwerte an einem analogen Eingang erhalten. Das alles macht den Eingang nicht kaputt aber man erhält problematische weil unsinnige Werte.
Da die analoge Messung relativ lange dauert ( ca 8ms) ist ein digitaler Eingang bei einem digitalen Signal sinnvoll.
Vielen Dank für die Details zum internen Verhalten. Das erklärt einiges zu der Beeinflussung der Eingänge untereinander. Ich meine solche Phänomene auch schon beobachtet zu haben
Frage mich woher ihr diese ganzen Details wisst. Ich lese nun schon viel (verstehe nicht alles) aber solche Dinge findet man nirgends. Vermutlich seid ihr alle studierte Elektrotechniker und könnt Schaltpläne lesen und verstehen
Nun… ich habe es auf digitalRead und INPUT_PULLUP umgebaut. Komischerweise war das nun doch kein großer Aufwand. Vermutlich hatte ich am WE mal wieder ein Brett vorm Kopf.
Darüber hinaus konnte ich die Ausgabe erheblich optimieren (bzgl. der Geschwindigkeit). Hier war eine Logik in einer Schleife, die dort nicht hingehört hat. Peinlich… oder nennen wir es Schusselei.
Dann habe ich gestern noch eine Schwachstelle entdeckt. Ich habe mich immer über einen leichten Versatz (Latenz) zwischen Controllersignal und Reaktion des zu steuernden Objekts gewundert. Ist nun auch gelöst.
Gestern war ein guter Tag. Nochmals Danke für Eure Hilfe