Moin moin! ich habe ein Problem mit dem seriellen Monitor. An meinem PC möchte ich die eingehenden analog und digital Eingänge meines Arduino Uno auslesen. Bei den digitalen Werten funktioniert das auch problemlos. An den analogen Eingängen A0-A2 ist jeweils ein 10k Ohm Poti angeschlossen. Diese funktionieren in der zu steuernden Anwendung auch einwandfrei. Nur werden im seriellen Monitor Werte angezeigt, die so nicht stimmen können. Diese Werte schwanken auch und gehen mal gegen "0" und mal gegen "1024". Im Mittel sind sie so bei ~"500". An den AI's A3 und A4 sind Schalter mit Pull-Down Widerstand angeschlossen. Theoretisch müsste der Wert bei Schalter offen ja "0" (=0V) sein und bei geschlossen "1024" (=5V). Doch bei Schalter offen sind beide Werte ~"500". Und jetzt das merkwürdige. Schließe ich den Schalter A3, geht sein Wert auf 0, schließe ich den Schalter A4, geht sein Wert auf 1024. Die Schalter/Potis haben keine Wirkung untereinander, deswegen schließe ich Kurz/Querschlüsse aus. Verdrahtungsfehler sind quasi ausgeschlossen. Könnt ihr mir da weiterhelfen? Bin über jeden Tipp dankbar. Viele Grüße Ron
AVCC mit Filter angeschlossen? Interne Ref genutzt? Kondensator an Aref? Quelle niederohmig genug? Frager schrieb: > Zeig Dein Programm. mindestens noch das Schaltbild und die Verdrahtung.
:
Bearbeitet durch User
Den Code findet ihr im Anhang. Ich bin noch nicht all zu lange beim Thema Arduino dabei. Im Job programmiere ich S7. Die Merker im letzten Teil werden noch nicht verwendet. Später sollen die Schalter S4 und S5 diese Merker, in Abhängigkeit verschiedener Bedingungen setzen/rücksetzen. Mit AVCC ist die Versorgungsspannung für den Arduino gemeint? Diese kommt von einem 12V Schaltnetzteil. Einen kompletten Schaltplan kann ich euch nicht bieten. Habe den Teil für die Analogeingabe eben mal skizziert (Sorry das es nicht ordentlich ist :D ).
Ron B., was die anderen Helfer, dir mitteilen möchten ist, wenn deine Hardware nicht korrekt ist - und dir wie hier dargestellt - unbekannt ist, dann kannst Du nicht logisch vorgehen. Er muss deine Hardware korrekt konfiguriert und der AVR µC richtig beschaltet sein. Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen wir weiter.
Karl M. schrieb: > Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die > Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen > wir weiter. Und dann misst Du die Spannungen direkt an den Eingangspins. Danach sehen wir weiter. kjghkfysd
Karl M. schrieb: > Ron B., > > was die anderen Helfer, dir mitteilen möchten ist, wenn deine Hardware > nicht korrekt ist > Er muss deine Hardware korrekt konfiguriert und der AVR µC richtig > beschaltet sein. > > Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die > Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen > wir weiter. Das ist ein Arduino, der ist korrekt beschaltet. Ron, lies Dir alles zur Funktion Analogread und ihren Parametern durch und sieh Dir dann nochmals Deine seriellen Ausgaben an.
Das hier
1 | int _S1_Value = 0; |
2 | //...
|
3 | Serial.print("Poti 1 "); |
4 | Serial.println(analogRead(_S1_Value)); |
5 | //... ^^^^^^^^^
|
6 | _S1_Value = analogRead(S1); |
..kann nicht tun. Sieht für mich wie ein Copy&Paste Fehler aus.
Danke für die Antworten! Ich will mich hier nicht als Trottel darstellen, aber was sollte ich an der Hardware von meinem Arduino groß ändern? Der ist nach Standard bestückt und die Versorgung die er benötigt bekommt er, außer AREF. Dafür soll der DEFAULT Wert genommen werden. Das Auslesen funktioniert in einem anderen Sketch (der nur das Poti ausliest) problemlos (Baudrate war identisch). Deswegen denke ich, dass der Fehler im Programm liegt. Die Spannungen habe ich an jedem PIN geprüft, alles wie erwartet ohne Fehler oder Auffälligkeiten. @Jim Meba Der Befehl
1 | Serial.print("Poti 1 "); |
ist meines Wissens nach nur einfacher Text, der nix mit den Variablen zu tun hat. Das soll nur zur Übersichtlichkeit im seriellen Monitor beitragen.
Ron B. schrieb: > Doch bei Schalter offen sind beide Werte ~"500". Die Beschreibung ist für mich etwas wirr, aber lässt mich nicht an eine korrekte Verdrahtung glauben. Herumhampelnde A/D-Werte können auch aus einer unsauberen Versorgungsspannung resultieren - versorge den Kram mal mit einer Batterie und einem 7805! In Zeile 87 Serial.println(analogRead(_S1_Value)); gibst Du einen Wert aus, obwohl dieser erst in Line 117 _S1_Value = analogRead(S1); gelesen wird. Die "{}" in Zeilen 70 und 106 / 109 und 123 erschließen sich mir auch nicht so ganz. Zumindest meckert die Arduino IDE nicht.
Jim M. schrieb: > Das hierint _S1_Value = 0; > //... > Serial.print("Poti 1 "); > Serial.println(analogRead(_S1_Value)); > //... ^^^^^^^^^ > _S1_Value = analogRead(S1); > > ..kann nicht tun. Sieht für mich wie ein Copy&Paste Fehler aus. Genau! Damit muss da Mist raus kommen. --------- Und die beiden Taster/Schalter an den Analogpins muss man auch nicht analog auslesen! Das geht digital besser und viel schneller
Die AI's für die Schalter nutze ich nur, weil ich keine DI's mehr frei habe. Einen 7805 besitze ich leider (noch) nicht. Hab den µC jetzt nur über USB angeschlossen und die Antriebe abgeklemmt. Die Qualität der USB Spannung sollte doch ausreichen. Habe ich da einen Logikfehler drin? Der Wert von Pin A1 wird auf _S1_Value geschrieben. Damit rechnet der µC und von _S1_Value liest der Serielle Monitor den Wert und stellt ihn dar (So meine Logik). Die unnötigen Klammern habe ich entfernt und das Lesen der Eingänge vor das Lesen durch den Seriellen Monitor geschrieben.
1 | _Achse_A_0_Value = digitalRead(Achse_A_0); |
2 | _Achse_A_1_Value = digitalRead(Achse_A_1); |
3 | _Achse_B_0_Value = digitalRead(Achse_B_0); |
4 | _Achse_B_1_Value = digitalRead(Achse_B_1); |
5 | _Achse_C_0_Value = digitalRead(Achse_C_0); |
6 | _Achse_C_1_Value = digitalRead(Achse_C_1); |
7 | _S1_Value = analogRead(S1); |
8 | _S2_Value = analogRead(S2); |
9 | _S3_Value = analogRead(S3); |
10 | _S4_Value = analogRead(S4); |
11 | _S5_Value = analogRead(S5); |
12 | |
13 | |
14 | Serial.print("Achse_A_0 "); |
15 | Serial.println(digitalRead(Achse_A_0)); |
16 | Serial.print("Achse_A_1 "); |
17 | Serial.println(digitalRead(Achse_A_1)); |
18 | Serial.print("Achse_B_0 "); |
19 | Serial.println(digitalRead(Achse_B_0)); |
20 | Serial.print("Achse_B_1 "); |
21 | Serial.println(digitalRead(Achse_B_1)); |
22 | Serial.print("Achse_C_0 "); |
23 | Serial.println(digitalRead(Achse_C_0)); |
24 | Serial.print("Achse_C_1 "); |
25 | Serial.println(digitalRead(Achse_C_1)); |
26 | |
27 | |
28 | Serial.print("Poti 1 "); |
29 | Serial.println(analogRead(_S1_Value)); |
30 | Serial.print("Poti 2 "); |
31 | Serial.println(analogRead(_S2_Value)); |
32 | Serial.print("Poti 3 "); |
33 | Serial.println(analogRead(_S3_Value)); |
34 | Serial.print("Poti 4 "); |
35 | Serial.println(analogRead(_S4_Value)); |
36 | Serial.print("Poti 5 "); |
37 | Serial.println(analogRead(_S5_Value)); |
38 | Serial.print("Merker 1 "); |
39 | Serial.println(digitalRead(Merker_1)); |
40 | Serial.print("Merker 2 "); |
41 | Serial.println(digitalRead(Merker_2)); |
Ich kanns nur nochmal wiederholen im Arduino müssen die Werte richtig verarbeitet werden. Sonst würde die Anlage (bis auf die beiden Taster) nicht funktionieren.
Hi Klar kann Das klappen - zumindest bei den Achsen, da die Werte oben nur ausgegeben werden. Die Zeilen Serial.println(analogRead(_S1_Value)); und _S1_Value = analogRead(S1); ergeben für mich, gerade in dieser Reihenfolge, keinen Sinn. Auch würde ich den 2.ten Block vor den jetzt ersten Block setzen und im 'Anzeigeblock' (also jetzt 1.ten, dann aber 2.ten) die Werte der gesetzten Variablen ausgeben. So haben Programm und Nutzer zumindest die gleichen Informationen. Denke, das 'analogRead(_S1_Value)' versucht, den Analog-Input mit der Nummer '_S1_Value' (den enthaltenen Wert) auszulesen - wäre Das so eine Möglichkeit? MfG
Ron B. schrieb: > Die AI's für die Schalter nutze ich nur, weil ich keine DI's mehr frei > habe Du kannst die Analogen Pins wie die Digitalen benutzen! Aber wenn du das nicht willst, dann soll mir das auch egal sein. Ron B. schrieb: > Ich kanns nur nochmal wiederholen im Arduino müssen die Werte richtig > verarbeitet werden. Sonst würde die Anlage (bis auf die beiden Taster) > nicht funktionieren. Und wie können immer wieder sagen: Du baust bei der Ausgabe Mist! Und dir ist die Stelle gezeigt worden. Jetzt mittlerweile 5 Mal, oder so.
Arduino F. schrieb: > Und die beiden Taster/Schalter an den Analogpins muss man auch nicht > analog auslesen! > Das geht digital besser und viel schneller Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit "(digitalRead(x))" lesen? ====== Ron B. schrieb: > Habe ich da einen Logikfehler drin? Ja, der Wald ist vor lauter Bäumen nicht mehr zu sehen :-) Gehe mal durch, welche Werte die Variable "_S1_Value" annimmt: Erstmal ist er Null, dann kommt also bei Serial.println(analogRead(0)); der Wert von Port 0. Weiter hinten wird mit _S1_Value = analogRead(S1); auf irgend_einen Wert gesetzt, den Du einliest. Bei der nächsten Runde liest Du dann Analogport 1023 oder 815 oder was immer da zufällig gekommen ist.
Manfred schrieb: > Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit > "(digitalRead(x))" lesen? Ja sicherlich.... Zumindest A0 bis A5. Evtl vorhandene A6 und A7 sind beim 328 rein Analog.
So, jetzt ist auch bei mir der Knoten geplatzt. Dass ich die AI's auch als DI's wusste ich noch nicht. Guter Tipp. Jetzt läuft es und ich bekomme meine Werte Top angezeigt. Danke für eure Geduld und die Unterstützung. Ein tolles Forum habt ihr hier. :)
Ron B. schrieb: > So, jetzt ist auch bei mir der Knoten geplatzt. Dass ich die AI's auch > als DI's wusste ich noch nicht. Deine Serial.print für die Potis dürften noch immer zufallsbedingt sein, das hat mit analog- / digital-Read nichts zu tun. ---------- Arduino F. schrieb: > Manfred schrieb: >> Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit >> "(digitalRead(x))" lesen? > Ja sicherlich.... > Zumindest A0 bis A5. > > Evtl vorhandene A6 und A7 sind beim 328 rein Analog. Danke!
Der Code für das Lesen der Potis sieht jetzt so aus:
1 | Serial.print("Poti 1 "); |
2 | Serial.println(analogRead(S1)); |
damit funktioniert es. Ich werde noch die _SX_Value durch SX ersetzen. So wie es jetzt ist, hab ichs "doppeltgemoppelt".
Ron B. schrieb: > Der Code für das Lesen der Potis sieht jetzt so aus: > Serial.print("Poti 1 "); > Serial.println(analogRead(S1)); > > damit funktioniert es. Ich werde noch die _SX_Value durch SX ersetzen. > So wie es jetzt ist, hab ichs "doppeltgemoppelt". Geschmackssache, ich würde in Serial.print garnicht analog lesen, sondern einfach nur _S1_Value ausgeben - das ist dann der Wert, der zuletzt verarbeitet wurde.
Hi Dito Das doppelte Analog_Read braucht doppelt Zeit und ob der Dir angezeigte Wert nur auch mit dem intern zur Berechnung/Entscheidungsfindung überein steht, auf einem gaaanz anderem Blatt. Beim Einlesen in eine Variabel hast Du die Ausgabe schneller (da hier nicht erneut eingelesen/gewandelt wird) und auch die Gleiche, wie der µC selber für die Entscheidung nimmt. Darin sehe ich durchaus Vorteile, gerade, wenn man z.B. die Grenzwerte abstecken möchte. MfG
Patrick J. schrieb: > Das doppelte Analog_Read braucht doppelt Zeit .. die er zur Genüge haben dürfte, aus Sicht des µC ist die Mechanik dahinter unendlich langsam. Im Gegenteil: Muß die loop mit delay(1) in affenartiger Geschwindigkeit im Kreise laufen? Die größte Bremse werden die seriellen Ausgaben sein. Ich sollte mal messen, ob sowas Auswirkungen auf die Stromaufnahme hat. > und ob der Dir angezeigte > Wert nur auch mit dem intern zur Berechnung/Entscheidungsfindung überein > steht, auf einem gaaanz anderem Blatt. Genau das war mein Ansatz!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.