Forum

Einloggen | Registrieren | RSS  

Sel(R)

E-Mail

Radebeul,
12.07.2016,
12:00
(editiert von Sel
am 12.07.2016 um 12:07)
 

Arduino, nur ne kleine Frage wegen Programmierung (Elektronik)

Hallo,

sitze grade (weil ich ja keine Ahnung habe) über der Suche nach Programmschnippseln für meinen Arduino Uno.

Mein Ziel ist es mittels einem 12stufigen Drehschalter genau 16 Relais nach meinem Wunsch anzusteuern (und diese "Schaltung" per Programm auch ab und zu ändern zu können). Also z.B. Schaltstellung 1 und Relais 2/3/8 zieht an, Schaltstellung 2 und Relais 1/5/6/9 zieht an, so im Prinzip. Dazu habe ich eine China-Relaisplatine, die Eingänge mit Optokopplern, danach Treiber, dann die Relais. Die Sache ist rein statisch, also so wie der Schalter steht, so bleiben die Relais an, keine "Blinkschaltung" oder andere Eingangskomponenten.

Mir ist klar das der Arduino nicht unendlich viele Ein- und Ausgänge hat, insofern wirds nicht ganz einfach. Dazu kommt die Entprellung des Drehschalters. Der Schalter selbst brückt nie nebeneinander liegende Kontakte, das wird mechanisch unterbunden.

Da ich das selbst programmieren möchte nützt mir ein fertiges Programm nichts. Aber ich könnte mir das aus einzelnen Programmteilen zusammenbauen. Also Entprellung, Umschaltung der Ausgänge, Nutzen der begrenzten Anzahl der Ein- und Ausgänge und Umschaltung derselben.

Wo kann ich suchen? Vielleicht habe ich eben nur die falschen Suchbegriffe...

LG Sel

Blubblubb

12.07.2016,
12:11

@ Sel

Arduino, nur ne kleine Frage

» Hallo,
»
» sitze grade (weil ich ja keine Ahnung habe) über der Suche nach
» Programmschnippseln für meinen Arduino Uno.
»
» Mein Ziel ist es mittels einem 12stufigen Drehschalter genau 16 Relais nach
» meinem Wunsch anzusteuern (und diese "Schaltung" per Programm auch ab und
» zu ändern zu können). Also z.B. Schaltstellung 1 und Relais 2/3/8 zieht an,
» Schaltstellung 2 und Relais 1/5/6/9 zieht an, so im Prinzip. Dazu habe ich
» eine China-Relaisplatine, die Eingänge mit Optokopplern, danach Treiber,
» dann die Relais. Die Sache ist rein statisch, also so wie der Schalter
» steht, so bleiben die Relais an, keine "Blinkschaltung" oder andere
» Eingangskomponenten.
»
» Mir ist klar das der Arduino nicht unendlich viele Ein- und Ausgänge hat,
» insofern wirds nicht ganz einfach. Dazu kommt die Entprellung des
» Drehschalters. Der Schalter selbst brückt nie nebeneinander liegende
» Kontakte, das wird mechanisch unterbunden.
»
» Da ich das selbst programmieren möchte nützt mir ein fertiges Programm
» nichts. Aber ich könnte mir das aus einzelnen Teilen zusammenbauen. Also
» Entprellung, Umschaltung der Ausgänge, Nutzen der begrenzten Anzahl der
» Ein- und Ausgänge und Umschaltung derselben.
»
» Wo kann ich suchen? Vielleicht habe ich eben nur die falschen
» Suchbegriffe...
»
» LG Sel

Gibt es eine Schaltstellung "0", sodass alle Ports weggeschaltet sind? Falls nein, braucht es kein Entprellen.

Die Ausgänge können mit einem PCF8574 erweitert werden, dazu gibts auch die Code-Schnippsel. Einfach "Arduino PCF8574" googlen. Der funktioniert über I²C und braucht für alle Ausgänge nur zwei Leitungen ==> Die anderen Pins wären für die Eingänge da. Reicht das?

Entprellen: http://www.scynd.de/tutorials/arduino-tutorials/1-taster/1-2-taster-entprellt.html

geralds(R)

Homepage E-Mail

Wien, AT,
12.07.2016,
12:27
(editiert von geralds
am 12.07.2016 um 12:28)


@ Sel

Drehschalter -> ADC -> SRegister -> Treiber

» Hallo,
»
» sitze grade (weil ich ja keine Ahnung habe) über der Suche nach
» Programmschnippseln für meinen Arduino Uno.
»
» Mein Ziel ist es mittels einem 12stufigen Drehschalter genau 16 Relais nach
» meinem Wunsch anzusteuern (und diese "Schaltung" per Programm auch ab und
» zu ändern zu können). Also z.B. Schaltstellung 1 und Relais 2/3/8 zieht an,
» Schaltstellung 2 und Relais 1/5/6/9 zieht an, so im Prinzip. Dazu habe ich
» eine China-Relaisplatine, die Eingänge mit Optokopplern, danach Treiber,
» dann die Relais. Die Sache ist rein statisch, also so wie der Schalter
» steht, so bleiben die Relais an, keine "Blinkschaltung" oder andere
» Eingangskomponenten.
»
» Mir ist klar das der Arduino nicht unendlich viele Ein- und Ausgänge hat,
» insofern wirds nicht ganz einfach. Dazu kommt die Entprellung des
» Drehschalters. Der Schalter selbst brückt nie nebeneinander liegende
» Kontakte, das wird mechanisch unterbunden.
»
» Da ich das selbst programmieren möchte nützt mir ein fertiges Programm
» nichts. Aber ich könnte mir das aus einzelnen Teilen zusammenbauen. Also
» Entprellung, Umschaltung der Ausgänge, Nutzen der begrenzten Anzahl der
» Ein- und Ausgänge und Umschaltung derselben.
»
» Wo kann ich suchen? Vielleicht habe ich eben nur die falschen
» Suchbegriffe...
»
» LG Sel

---
Hi,

Vorschlag:
Den Drehschalter mit einer R_Leiter ausstatten, als Spannungsteiler-leiter. (Poti-Betrieb, halt mit Fixwerten)
Diese führst zum ADC_Eingang des UNO.

Dann am Treiber-Ausgang nimmst ein Schieberegister zB 74xx595 (2Stk), oder 74xx4094 und
schiebst die Daten seriell durch, zum Schluss machst mit Enable dessen Ausgänge aktiv.
http://www.elektronik-kompendium.de/forum/upload/20160712121014.pdf
http://www.ti.com/lit/ds/symlink/cd74hc595.pdf

An den 595er /4094/ sind noch die Treiber ULN2803 für die Relais dran.
http://www.ti.com/lit/ds/symlink/uln2803a.pdf

Grüße
Gerald
---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

Sel(R)

E-Mail

Radebeul,
12.07.2016,
12:35

@ Blubblubb

Arduino, nur ne kleine Frage

» Gibt es eine Schaltstellung "0", sodass alle Ports weggeschaltet sind?
» Falls nein, braucht es kein Entprellen.

Nein, es gibt keine solche Schaltstellung. Also ok.

» Die Ausgänge können mit einem PCF8574 erweitert werden, dazu gibts auch die
» Code-Schnippsel. Einfach "Arduino PCF8574" googlen. Der funktioniert über
» I²C und braucht für alle Ausgänge nur zwei Leitungen ==> Die anderen Pins
» wären für die Eingänge da. Reicht das?
»
» Entprellen:
» http://www.scynd.de/tutorials/arduino-tutorials/1-taster/1-2-taster-entprellt.html

Super, danke. Das hilft weiter!

LG Sel

Blubblubb

12.07.2016,
12:37

@ Sel

Arduino, nur ne kleine Frage

» » Gibt es eine Schaltstellung "0", sodass alle Ports weggeschaltet sind?
» » Falls nein, braucht es kein Entprellen.
»
» Nein, es gibt keine solche Schaltstellung. Also ok.
»

Dann einfach den letzten gültigen Wert, also ein Pin gesetzt, als gültig behalten, bis ein anderer gültiger kommt. Dann darf der rumprellen was er will.

»
» Super, danke. Das hilft weiter!
»
Gern

gast

12.07.2016,
12:38

@ Sel

Arduino, nur ne kleine Frage wegen Programmierung

» Mir ist klar das der Arduino nicht unendlich viele Ein- und Ausgänge hat,
» insofern wirds nicht ganz einfach. Dazu kommt die Entprellung des
» Drehschalters.

Softwarefunktion "debounce"

» Also Entprellung, Umschaltung der Ausgänge, Nutzen der begrenzten Anzahl

auch die Analogeingänge können als Digital Ausgänge genutzt werden.
(.....nur wenn du die nicht brauchst)

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

» der Ein- und Ausgänge und Umschaltung derselben.
»
» Wo kann ich suchen? Vielleicht habe ich eben nur die falschen
» Suchbegriffe...
»
» LG Sel
»

Ich würde aber noch mal 5 Euro opfern und das einen Nano machen lassen.
Eingang als 4 bit BCD um 16 Relais anzusteuern
(kostet dich beim UNO 4 Ausgänge)
Ausgang 1-13 + 3 Analog als Ausgang
Also die "Aufteilung" bcd nach Relais einen eigenen µC machen lassen.
Klar statt BCD ginge auch seriell die beiden verbinden aber das musst du dir dann erlernen.
Der Nano kommt direkt huckepack auf die Relaisplatine.

Eine Möglichkeit von vielen.....

Sel(R)

E-Mail

Radebeul,
12.07.2016,
12:39

@ geralds

Drehschalter -> ADC -> SRegister -> Treiber

» Vorschlag:
» Den Drehschalter mit einer R_Leiter ausstatten, als Spannungsteiler-leiter.
» (Poti-Betrieb, halt mit Fixwerten)
» Diese führst zum ADC_Eingang des UNO.

Das ist auch eine Idee :-)
Denn dann habe ich genug Ausgänge am Arduino frei und ich kann die Platine (Bild) direkt dranbauen.

LG Sel

Sel(R)

E-Mail

Radebeul,
12.07.2016,
12:41

@ gast

Danke für alle Ideen!!!! :-)

» Ich würde aber noch mal 5 Euro opfern und das einen Nano machen lassen.
» Eingang als 4 bit BCD um 16 Relais anzusteuern
» (kostet dich beim UNO 4 Ausgänge)
» Ausgang 1-13 + 3 Analog als Ausgang
» Also die "Aufteilung" bcd nach Relais einen eigenen µC machen lassen.
» Klar statt BCD ginge auch seriell die beiden verbinden aber das musst du
» dir dann erlernen.
» Der Nano kommt direkt huckepack auf die Relaisplatine.
»
» Eine Möglichkeit von vielen.....

Auch noch eine Idee. Kann ja auch 2 Nano nehmen... Oder eben irgendwie anders.

Danke!

LG Sel

gast

12.07.2016,
15:12

@ geralds

Drehschalter -> ADC -> SRegister -> Treiber

»
» An den 595er /4094/ sind noch die Treiber ULN2803 für die Relais dran.
» http://www.ti.com/lit/ds/symlink/uln2803a.pdf
»
» Grüße
» Gerald
» ---
Warum?
Auf der Relaisplatine sind doch schon Treiber drauf.

geralds(R)

Homepage E-Mail

Wien, AT,
12.07.2016,
16:35

@ gast

Drehschalter -> ADC -> SRegister -> Treiber

» »
» » An den 595er /4094/ sind noch die Treiber ULN2803 für die Relais dran.
» » http://www.ti.com/lit/ds/symlink/uln2803a.pdf
» »
» » Grüße
» » Gerald
» » ---
» Warum?
» Auf der Relaisplatine sind doch schon Treiber drauf.

---
Nun, während ich meinen Vorschlag schrieb hat Sel
seine Anfrage wohl mit dem Bild vervollständigt.
War gleichzeitiges Geschehen...
Ja, ist für seine Anwendung nicht nötig.
- falls ein Mitleser ein ähnliches Projekt hat, jedoch
keinen Treiber, dann braucht er diese ULN sehr wohl...
ok,ok,ok,....

Gerald
---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

bastelix(R)

12.07.2016,
20:34

@ Sel

Drehschalter -> ADC -> SRegister -> Treiber

» » Vorschlag:
» » Den Drehschalter mit einer R_Leiter ausstatten, als
» Spannungsteiler-leiter.
» » (Poti-Betrieb, halt mit Fixwerten)
» » Diese führst zum ADC_Eingang des UNO.
»
» Das ist auch eine Idee :-)
» Denn dann habe ich genug Ausgänge am Arduino frei und ich kann die Platine
» (Bild) direkt dranbauen.
»
» LG Sel

Du brauchst aber noch einen Multiplexer, z.B. das vorgeschlagene Schieberegister, da du die Analog-Pins nur als GPIO-Pins nutzen kannst wenn du den ADC gar nicht verwendest. (Sagt zumindest die Doku: https://www.arduino.cc/en/Tutorial/AnalogInputPins)

geralds(R)

Homepage E-Mail

Wien, AT,
12.07.2016,
22:55
(editiert von geralds
am 12.07.2016 um 22:57)


@ bastelix

Drehschalter -> ADC -> SRegister -> Treiber

---
»
» Du brauchst aber noch einen Multiplexer, z.B. das vorgeschlagene
» Schieberegister, da du die Analog-Pins nur als GPIO-Pins nutzen kannst wenn
» du den ADC gar nicht verwendest. (Sagt zumindest die Doku:
» https://www.arduino.cc/en/Tutorial/AnalogInputPins)

---
Ähm,,, das verstehe ich jetzt nicht ganz.

Man kann den Port per Sperrdiode, bzw R entkoppeln.
Es wäre zB auch möglich "digi" zu nutzen, indem man AD volles Rohr, oder gar nix anbietet - also 5V oder 0V,
diese dann umlegt.

Aber ich denke, Sel will mal den einen Pin als ADC_Eingang fix lassen.

Sicher, man muss halt einiges mehr beachten, will man den Pin komplexer verwenden.
Ein Mux muss es nicht gleich sein.

Grüße
Gerald
---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

bastelix(R)

13.07.2016,
00:18

@ geralds

Drehschalter -> ADC -> SRegister -> Treiber

» » Du brauchst aber noch einen Multiplexer, z.B. das vorgeschlagene
» » Schieberegister, da du die Analog-Pins nur als GPIO-Pins nutzen kannst
» wenn
» » du den ADC gar nicht verwendest. (Sagt zumindest die Doku:
» » https://www.arduino.cc/en/Tutorial/AnalogInputPins)
» Ähm,,, das verstehe ich jetzt nicht ganz.

Ich auch nicht mehr :-D

"Consequently, if a user needs more general purpose input output pins, and all the analog pins are not in use, the analog pins may be used for GPIO."
Verstehe ich so: Wenn *kein* Analog-Pin verwendet wird, kann man die Analog-Pins als GPIO verwenden (also digital).

Ich hab dann mal nen simplen Testaufbau gemacht (zwar mit einem Arduino Nano, aber auch ein ATmega328):
A0 als digitalOutput: A0 -> Vorwiderstand -> LED -> GND
Spannungsteiler: +5V -> LDR -> 10k -> GND
A1 greift zwischen LDR und 10k ab

Der Code schaltet A0 alle 500ms zwischen HIGH und LOW um, nach jedem umschalten wird A1 gemessen. So auf die schnelle sehen die Messwerte plausibel aus (mit den Messwerten vom Multimeter verglichen) und die LED blinkt gemütlich vor sich hin. Anscheinend kann man die Analog-Pins pro Pin als Digital- oder Analog-Pin verwenden, statt wie aufgrund der Doku angenommen, alle oder keinen.

» Man kann den Port per Sperrdiode, bzw R entkoppeln.
» Es wäre zB auch möglich "digi" zu nutzen, indem man AD volles Rohr, oder
» gar nix anbietet - also 5V oder 0V, diese dann umlegt.
Die Analog-Pins sollten sich eigentlich wie Digital-Pins verhalten wenn man den pinMode entsprechend setzt, so verstehe ich die Doku und zumindest für Output bestätigt das mein Test (wenigstens deckt sich in dem Punkt die Realität mit meinem Verständnis der Doku :-D )

» Aber ich denke, Sel will mal den einen Pin als ADC_Eingang fix lassen.
Denke ich auch. Ich bin halt davon ausgegangen, dass man die Analog-Pins nur entweder komplett analog oder komplett digital betreiben kann. Ist aber nicht so, anscheinend kann man das pro Pin festlegen (zumindest bei den getesteten Pins A0 und A1, aber wahrscheinlich gilt das dann für alle Analog-Pins)

» Sicher, man muss halt einiges mehr beachten, will man den Pin komplexer verwenden.
» Ein Mux muss es nicht gleich sein.
»
» Grüße
» Gerald
» ---

Sel(R)

E-Mail

Radebeul,
13.07.2016,
20:14
(editiert von Sel
am 14.07.2016 um 08:18)


@ geralds

Drehschalter -> ADC -> SRegister -> Treiber

» Nun, während ich meinen Vorschlag schrieb hat Sel
» seine Anfrage wohl mit dem Bild vervollständigt.
» War gleichzeitiges Geschehen...
» Ja, ist für seine Anwendung nicht nötig.
» - falls ein Mitleser ein ähnliches Projekt hat, jedoch
» keinen Treiber, dann braucht er diese ULN sehr wohl...
» ok,ok,ok,....

Ja entschuldige bitte, meine Schuld diese Verwirrung.

Ich habe inzwischen rumgesucht, der Drehschalter wird durch zwei Taster ersetzt. Also für "rauf" und "runter", immer einen Schritt. Macht 2 Eingänge am Arduino. Die 16 Relais belegen 16 Ausgänge. Dann sind wirklich nur noch 2 Pins frei für Signale. Da ich als Anzeige eine 2stellige LED-Anzeige verwenden will, die bis 1 bis 26 anzeigen muß, brauche ich 3 Pins. Also bleibt mir eigentlich nur noch die Möglichkeit die Ausgabe über I2C zu machen, dann kann ich sogar eine 2zeilige LCD-Anzeige anschließen. Doch das wird immens Aufwand. Oder ich verwende für die Taster die analoge Variante (+5V oder +2,5V oder 0V) und habe damit auch meine Tasterfunktionen. Dann sind die 3 Pins für die Anzeige frei (BCD).

Wird noch viel Hirnschmalz reingehen, ich und programmieren :-(

LG Sel

BernhardB(R)

Berlin,
13.07.2016,
21:56
(editiert von BernhardB
am 13.07.2016 um 22:01)


@ Sel

Drehschalter -> ADC -> SRegister -> Treiber

Hi,

falls Du immer noch nicht genügend verwirrt bist, noch eine Idee:

Relais- Modul über einen MCP23017 anschließen (16 Ausgangspins mit einem IC, zur Programmierung steht z.B. die Wire.h- Bibliothek zur Verfügung) und die dann freigewordenen Arduino- Pins für die LCD- Ansteuerung nutzen (auch dafür gibt's eine Bibliothek, die LiquidCrystal.h).

Für den MCP23017 gibt's auch eine Anleitung auf Deutsch (die nutzt noch eine andere Bibliothek).
(http://www.arduino-projekte.de/index.php?n=83)

Viele Wege führen zum Erfolg!

Gruß
Bernhard

Edit: Dreckfehler korrigiert

bastelix(R)

13.07.2016,
22:59

@ BernhardB

Drehschalter -> ADC -> SRegister -> Treiber

» Relais- Modul über einen MCP23017 anschließen
MCP23017 (und MCP23S17) - mal kurz ins Datenblatt geschaut - Schönes Teil, sehr schönes Teil. Ich glaub die Bestell ich mir. Ich weiß zwar noch nicht wofür, aber ich brauchen die unbedingt :-)

Btw. Datenblatt: http://www.reichelt.de/index.html?&ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A200%252FDS_MCP23017.pdf