Arduino und keinen Schimmer

Seiten: 1 | 2 | 3 | 4 | 5 | 6 | (7) | 8 | 9
Zurück zur Startseite

zellkern

10.04.13 19:39

Heut sind die Relaismodule ins Haus geflattert.
Um den Preis bekomm ich wohl nicht mal die Bauteile,die drauf sind.
Was mich aber ärgert ist,dass die Relais schalten,wenn die Eingänge auf dem shield LOW sind.
Auf HIGH sind die Relais aus.
Das ist doch genau falschrum...grübel.
Wozu baut man so nen Mist.
Diese Relaisshields scheinen alle so gebaut zu sein.
Bin ich zu doof,oder was hats da?

http://www.ebay.de/itm/Neu-2-Channel-Kanal-5V-Relais-Relay-Module-Modul-fur-Arduino-DSP-AVR-PIC-ARM-/320855071713?pt=DE_Haus_Garten_Heimwerker_Sicherheitstechnik&hash=item4ab473dbe1

ferdimh

10.04.13 19:47

"So einen Mist" baut man zum einen aus historischen Gründen und zum anderen, damit ein Eingang mit Pullup nicht versehentlich das Relais schaltet.
Grundsätzlich denkt man bei 5V-Logik immer "active low", außer es gibt einen guten Grund, was anderes zu tun.
Warum man per Optokoppler auf die gleichen +5V gehen muss, erschließt sich mir aber auch nicht.

zellkern

10.04.13 20:23

Also,da bin ich wohl echt zu doof...oder zu praktisch denkend dafür.
Wenn ich will,dass was passiert..sagen wir mal "Licht an",dann lass ich den pinport auf HIGH gehen.
Also er schickt 5 Volt raus.
Und die 5 Volt schalten dann per Optokoppler das Lastrelais.
Das wär für mich logisch.
Andernfalls verbrat ich na ne Menge standby Energie,wenn die Relais AN sind,wenn NICHTS passieren soll.
Jetzt kann ich den ganzen Sketch umstricken oder den Ausgang über nen Transistor invertieren...je nach dem,was schneller geht.
Tsss,in Zukunft bau ich mir meine Relaismodule wieder selber.^^



ozonisator

10.04.13 20:34

damit ein Eingang mit Pullup nicht versehentlich das Relais schaltet

Das ist der Knackpunt. "Pullups" sind nix weiter als Widerstände, die Eingänge auf einen definierten Pegel, also "An" ziehen.
Ob du jetzt einen Pin auf Low oder High ziehst beim "durchschalten" ist vollkommen Banane.


Zuletzt bearbeitet: 10.04.13 20:38 von ozonisator

zellkern

10.04.13 20:50

Es verkompliziert einfach nur den Sketch und ist wieder ne Fehlerquelle mehr für den Ungeübten.
Also,ihr könnt sagen was ihr wollt,für mich ist das befremdlich,wenn ich die Steuerspannung auf 0 gebe,um etwas EIN zu schalten.
Na toll,aus historischen Gründen wird im 21 igsten Jahrhundert eine einfache Relaisplatiene (aus meiner Sicht)falsch gebaut.
Werd morgen mal schaun,obs da nicht ne Möglichkeit gibt,an den Optokopplern was umzu frickeln,damits richtig rum läuft.

ohu

10.04.13 21:01

Frickel lieber nicht rum, sondern gewöhn dich dran, dass LOW = Aktiv. Den Sketch umbauen ist ja nun wirklich kein Ding. Einfach die Wörter LOW und HIGH austauschen.

Macht auch einiges einfacher - z.b. wenn du Taster an Eingänge baust, musst du sie nur an den allgegenwärtigen LOW klemmen. Das Verwenden eines Transistors zum Schalten höherer Lasten mit höherer/eigener Versorgungsspannung (bei gemeinsamen GND) ist ganz banal gemacht. usw. usf.



zellkern

10.04.13 21:22

Ich hab die gesamte "Hardware"..das Bedienteil mit Tastern,kontroll LEDs und all dem Kram schon fertig aufgebaut und verlötet.
(auf "Handbetrieb" ist der Arduino aus,um Energie zu sparen)
Jetzt noch mal alles umwursteln,so dass die Taster den GND schalten..usw,ist mir anhand des komplexen Aufbaues jetzt echt zu blöd.
Einfach den sketch umschreiben reicht da nicht...leider..
Naja,bin auch selber Schuld,weil ich mir den Schaltplan des Relaisshieldes beim Bestellen nicht angeschaut hab.
Der ganze Aufbau funktioniert auch so,wie er jetzt ist,nur eben mit dem einen Dilemma,dass die Relais jetzt eben Saft ziehen,wenn nix geschehen soll.
Hab einfach die NC Kontakte verwendet.
Fürs nächste mal bin ich zumindest gewarnt.


zellkern

11.04.13 17:06

Sooo muss das.
NOCH ist der Mensch der Herr über die Maschine.



zellkern

25.04.13 11:41

Hy,Leute.
Hab mal wieder ne Frage,wo ich irgendwie nicht weiterkomme.
Ok,vlt bin ich auch etwas zu faul zum rumtüfteln...ich gebs zu.
Also..es geht mal wieder um die Sonnennachführung.
Diese läuft bestens und absolut störungsfrei,jedoch arbeitet der Tracker ständig.
Das heisst,wenn sich wegen einer Wolke der Himmel verdunkelt,sucht sich der Tracker den neuen "hellsten Punkt".
So rudert das gute Teil Tagsüber oftmals hin und her.
Die Hysterese grösser einzustellen bringt nichts,da er dann an bewölkten Tagen nicht nachfährt.
Mein Plan:
Ich lasse dem Arduino sein Programm nur alle 10 Minuten oder so durchlaufen.
Es sollte also eine Pausezeit zwischen den "Messungen" geben.

Nun hab ich schon delayzeiten an allen möglichen Stellen probiert.
Gleich nach void loop,dann nach den analog read Befehlen und auch mal nur ganz am Ende des Sketches... usw..
Irgendwie komm ich aber nicht auf das gewünschte Ergebnis.
Hat vlt mal Jemand Rat?

Hier der sketch,so wie er jetzt super funktioniert:

// Sonnennachführung eine Achse //
// pin 2 = Relais Motor nach West drehen //
// pin 4 = Relais Motor nach Ost drehen //
// Endschalter am Getriebe schalten die Masse der Relais ab //
// Analog 0 = Mittelabgriff Spannungsteiler aus 2 LDRs....2 Stück 3,3 k und Poti 1 k dazwischen //
// Analog 1 = Mittelabgriff Spannungsteiler LDR + Poti 12K = zurück nach Ost //

int west = 2; // Relais West //
int ost = 4; // Relais Ost//
int pin = A0; // Analogeingang A 0 //
int abend = A1; // Analogeingang A 1 Abends zurück nach Osten wenn LDR dunkel//
int value;

void setup ()
{
pinMode (west, OUTPUT); // definiert west als Ausgang //
pinMode (ost, OUTPUT); // definiert ost als Ausgang //

}

void loop ()
{
value = analogRead (abend); // liest A1 ein //
if (value < 260) { // je höher der Wert,umso früher gehts zurück nach Ost //
digitalWrite ( west, LOW );
digitalWrite ( ost, HIGH ); // fährt zurück nach ost //

}

else {
value = analogRead (pin); // liest A0 ein //

if (value > 518 ){ // wenn Wert höher als... Motor Richtung west//
digitalWrite ( west, HIGH );
digitalWrite ( ost, LOW );
}

value = analogRead (pin); // wenn Wert kleiner als 512 Motor stop //
if (value < 512 ){
digitalWrite ( west, LOW );
}

value = analogRead (pin); // liest A0 ein //

if (value < 506 ){ // wenn Wert kleiner als ... Motor Richtung ost //
digitalWrite ( ost, HIGH );
digitalWrite ( west, LOW );
}

value = analogRead (pin); // wenn Wert grösser als 512 Motor stop //
if (value > 512 ){
digitalWrite (ost, LOW );
}

}
}



Virtex7

25.04.13 12:25

hab jetzt das Sketch nicht gelesen, weil mir Arduino Syntax
zuwieder ist, aber will noch eine Lanze für ActiveHIGH brechen:

wenn die Steuerspannung ausfällt oder die Leitung zum Atmel bricht,
geht bei diesem Aufbau das ganze AN und irgendwas rödelt los.
das ist für sicherheitskritische Sachen poop.

bei meinem Garagentor hatte ich genau das Problem. Wenn die
Atmel-Steuerplatine Sääft bekommt und der Türöffner schon welchen
hat, ging das Tor los.
Scheiße wenn jemand oder ein Auto druntersteht.

Wenn das so gebaut ist, muss auf jeden Fall ein Schutz gegen
Drahtbruch oder Verschwinden der Steuerung dazu...

fiete

25.04.13 13:55

Mhmm, also wenn man

delay(x)

am Ende (Void loop) einfügt, macht der x Zeit nichts.

x ist bei Arduino in Millisekunden, also musst du für 10 Minuten 600.000 einfügen.

Sollte eigentlich funktionieren!

Edit: 600.000 natürlich ohne Punkt, diente nur der Übersicht!




Zuletzt bearbeitet: 25.04.13 14:02 von fiete

zellkern

25.04.13 19:58

Ich habs mit ner delayzeit gleich nach void loop probiert und auch ganz zum Schluss des sketches,weil es mir da am logischsten schien.
So läuft er aber beim nachsetzen aber nicht mehr kurz für ne Sekunde oder so,bis die Position wieder stimmt...sondern eben für die besagte delayzeit.
Soll heissen,er fährt komplett an ein Ende,dann ist erja zu weit gefahren und korrigiert seine Fehlstellung erneut nach ablauf des delay.
Er fährt also non stop komplett zwischen den Endschaltern hin und her.
Soweit war ich schon.
Ist ein Schuss in den Ofen.
Tja und wie gesagt,die Sache mit der Steuerspannung hab ich durch umfrickeln der Relaisplatine kurzerhand gelöst.
Steuerspannung AN heisst Relais AN....so wie das sons auch überall üblich ist.
So ist mir das am liebsten.
Aber kann ja jeder handhaben wie er will.
NOCH gibt es ja keine Hobbybastlervorschriften der EU-Diktatur diesbezüglich.

fiete

25.04.13 22:31

Ahhhh, ok. Ich erkenne, glaube ich, das Problem. Dein Programm läuft häufiger durch? Also ist deine Steuerung quasi eine iterative Annäherung?

Edit: Nach erneutem durchdenken auf dem stillen Örtchen, habe ich nun dein Programmablauf endlich verstanden *schäm*
Und ein Lösungsansatz schwebt mir auch schon vor. Aber bis das Spruchreif ist, muss ich mich nochmal in Falten legen.


Zuletzt bearbeitet: 25.04.13 22:35 von fiete

andreas6

25.04.13 22:54

Hallo,

zur Beruhigung solcher Vorgänge ist Oversampling das Stichwort. Man kann das digital quasi beliebig weit treiben. Jedes digitale Messgerät benutzt so ein Verfahren, um ablesbare Messwerte aus beliebig wackligen Eingangswerten zu erhalten. Für die einfache Ausführung am Controller addiert man dazu eine große Menge an Messwerten zu einem Wert und verschiebt dann das Ergebnis entsprechend der Menge der Messwerte um die passende Bitanzahl nach unten bzw. nach rechts. Das ergibt einen Mittelwert, der sich je nach Anzahl der Messwerte nur sehr langsam ändert. Kurzzeitige Ausreißer haben dann so gut wie keinen Einfluss mehr auf das Ergebnis. Der Controller muss dabei nicht warten, sondern ermittelt weiter mit aller Kraft ständig die Messwerte.

MfG. Andreas

fiete

25.04.13 23:14

Ok,

ich versuche mal einen neuen Vorschlag:

Ich nehme mal an, eine Nachstellung dauert vll 30 Sekunden. Das bedeutet, der Programmablauf muss für 30 Sekunden durchlaufen und dann für 10 Minuten pausieren.

Dann könnte man als erstes eine if/else Abfrage einschieben, die die Zeiten überprüft.

<pseudocode>
zähle Zeit hoch;

if (Zeit<30 sek)
Führe (dein) Programm aus

else (Zeit < 30 sek && Zeit < 10 min)
mache nix
</pseudocode>

Beim Arduino wird man mit der Funktion millis() zum Ziel kommen. Diese zählt ganz stumpf Millisekunden hoch.
Damit hat man dann seine Zeit (zeit=millis();) und kann diese schön in der if/else Abfrage vergleichen.

noch zwei Sachen:
millis() wird echt groß mit der Zeit. Ein int wird da nicht reichen. Nimm alles >long

Am Ende musst du millis() wieder reseten, damit der Spaß wieder von vorne losgehen kann.

Ich hoffe erstmal geholfen zu haben. Mein Gehirn ist leider schon im Standby. Ich bekomme leider keinen funktionierenden Code mehr aufs Papier.

Grüße
Fiete




Zurück zur Startseite
Seiten: 1 | 2 | 3 | 4 | 5 | 6 | (7) | 8 | 9