Show Posts
Pages: 1 ... 30 31 [32] 33 34 ... 78
466  International / Deutsch / Re: Pillenbox on: January 24, 2014, 08:03:27 am
Nimm einen Piezo Summer - keinen Lautsprecher.
Die geben bei Versorgung mit Spannung einen Festen Ton von sich.
Die kannst du direkt aus dem Arduino Pin betreiben, wenn  es eine 5V Variante ist.

Die kosten so wenig, dass die Ebay-Chinesen sie nur im 5er Pack anbieten:
Ebay piezo summer  5V
467  International / Deutsch / Re: Gepulste Spannung messen on: January 24, 2014, 07:58:12 am
Ich hatte es irgendwo weiter oben schonmal erwähnt: Induktivitäten gibt es überall.
Jede Leitung ist eine Induktivität (unter anderm), die Wendel deiner lampe ist eine Induktivität, etc.

Die hast du immer und überall.
Im konkreten Fall werden diese Peaks auch durch die Schottkydiode geklemmt. Allerdings empfehle ich dir, nach dem Widerstand noch einen 1nF auf Masse zu legen, um ganz schnelle Pulse zu glätten.

Quote
Und wenn du die schnelle ADC implementierung nimmst, dann solltest du den Widerstand auf 1k runternehmen.
Ok, gut zu wissen. Muss mich mit der ganzen Schaltungstechnik nochmal anständig auseinandersetzen.

Das geht schon recht tief rein.
Im Datenblatt wird empfohlen, am ADC Quellenwiderstände kleiner=10k zu verwenden, damit der der Kondensator des µC internen Sample&Hold Gliedes schnell genug umgeladen werden kann. Da jetzt die Samplezeit verkürzt wird, sollte auch der Widerstand verkleinert werden. Ausserdem passt das dann gut zu dem 1nF  zum Glätten.
468  International / Deutsch / Re: Gepulste Spannung messen on: January 24, 2014, 06:44:11 am
In diesem Thread http://forum.arduino.cc/index.php?topic=6549.0 ist beschrieben, wie du die analogRead() Laufzeit auf 16µs drücken kannst. In Reply Nr.5 ist ein komplettes Beispielprogramm zum Austesten.

Wenn du dann anstelle von analogRead() noch die direkte Portmanipulation nimmst, kommst sogar auf 13µs runter.

Falls du nun den Uno nimmst, wird die Schottky-Diode nicht auf die 3.3V sondern auf die 5V gelegt.
Und wenn du die schnelle ADC implementierung nimmst, dann solltest du den Widerstand auf 1k runternehmen.
(Die 12V bleiben, oder?)
469  International / Deutsch / Re: Gepulste Spannung messen on: January 24, 2014, 04:43:26 am
Die 12V Eingangsspannug, die du zitierst, beziehen sich auf die Versorgungsspannung des Arduino Boards, also auf die VIN!

Zu den maximalen Spannungen an den Pins  empfehle ich dir die Lektüre des Datenblattes des Prozessors.
DA heisst es unter 46.1 Absolute Maximum ratings:
"Voltage on Input Pins with Respect to Ground...... ..............................-0.3V to + 4.0V"


Vielleicht solltest du deine ersten Versuche doch lieber mal mit einem Uno machen?
die sind billiger und robuster.
Und wenn du merkst, dass die AD-Messzeiten zu lange sind, sonst aber alles funktioniert, kannst du ja immer noch auf den Due wechseln.
470  International / Deutsch / Re: Gepulste Spannung messen on: January 24, 2014, 03:25:26 am
Wenn nun also der FET sperrt, liegen am ADC Ucc + Uf an, richtig?
Richtig.

... und der Emitter an Masse des Arduinos angeschlossen wird.
Bitte Nicht!  Andersrum!

Der Stromkreis, in dem die Fetten Ampere fließen, muß ins sich geschlossen sein, so das der starke Strom gut fliessen kann. Mit dicken, kurzen Leitungen. Also IGBT, Last, Netzteil und FET-Treiber sind für sich eine Einheit.
Daran wird dann von aussen der Arduino angeschlossen, über dessen Leitungen nur mA fliessen.
Da die GND-Leitung des Arduino den Nullpunkt der Spannungsmessung liefert, muß der GND möglichst nah am Emitter (Source) angeschlossen werden. (ist zwar elektrisch auch "Masse" aber an einer Kontaktstelle können leicht mal ein paar 100mV abfallen, die dann die Messung verfälschen. Deswegen ist es wichtig wo genau die Arduinomasse hängt.)
471  International / Deutsch / Re: if Anweisung Abfrage on: January 24, 2014, 02:52:34 am
Mit der Abfrage
"If (second() == wert){
  // Aktion ausführen
}" wirst du die Aktion eine Sekunde lang immer wieder ausführen (der Arduino ist schnell!)

Du mußt noch dafür sorgen, dann die Aktion jeweils nur einmal ausgeführt wird.
Code:
static boolean RunAction = true;
if (second() == wert){
 if(RunAction){
  // Aktion ausführen
  RunAction = false;
 }
} else {
  RunAction = true;
}

472  International / Deutsch / Re: Gepulste Spannung messen on: January 24, 2014, 02:42:11 am
Ich habe weiter darüber nachgedacht, wie ich den Due ADC Eingang vor Überspannung schützen kann.
Jemand aus UK gab mir folgenden Hinweis:
Quote
If you are using the arduino, how are you protecting it from the 12V when the part is off? I suppose a RC circuit with a diode clamp may be enough.

Ok, jetzt kommt nochmal eine neue Seite auf. Dein Eingangspsot ließ mich vermuten, dass die Hardware steht und du ausreichend erfahrungen damit hast, und du nur SW Unterstützung brauchst.

Deine Schaltung sieht in etwa so aus?

Und du möchtest, wenn ich das richtig verstanden habe, die Drain-Soure bzw Kollektor-Emitterspannung messen.
Das Problem ist nun: wenn der IGBT sperrt, dann hast du am Kollektor 12V anliegen!

Daher ist es zwingend notwendig diese Spannung zu begrenzen.
Am besten so: Vom Kollektor kommend, einen Widerstand 10k zum AD-Eingang. Vom AD-Eingang eine Schottky-Diode (BAT43, BAT54 o.ä.) auf die 3.3V (Kathode an die 3.3V),
Die Diode verhindert, dass die Spannung am AD über ca. 3.6V ansteigt. Damit ist der AD geschützt.
(Vorsicht: Solange die Spannung am AD-Pin über der Versorgungsspannung liegt, kann die Messung an anderen AD-Pins verfälscht werden!)

Ausserdem ist auf eine korrekte Masseführung zu achten. Masse vom Arduino sollte möglichst nah am Emitter des zu messenden IGBTs angeschlossen sein.
473  International / Deutsch / Re: Frage zur Motorsteuerung on: January 23, 2014, 07:36:17 am
ich bin mir nicht sicher, ob es damit nicht Probleme gibt:
Code:
void Motorprogramm1() ...
static boolean Motorprogramm1;

Ich würde der Variablen einen anderen Namen geben, als der Funktion. Z.B.
static boolean Motorprogramm1_running; oder
static boolean Mprog1runs;

MIt der Zeile
" static unsigned long StartMillis = millis();"
weisst du genau einmal, beim ersten Aufruf der Funktion, den aktuellen millis() Wert der Variablen Startmillis zu.

Überlege dir doch mal (mal ganz ohne Code): Die Variable Startmillis soll die Zeit enthalten, bei der die Motoren gestartet sind.
Wann werden die Motoren gestartet?  Wenn du auf den Taster drückst! (Die Eingeweihten mögen mir verzeihen, der Motor wird natürlich erst gestartet, wenn die Pins gesetzt werden, aber in Anbetracht der Zeiten um die es hier geht, ist diese kleine Unschärfe zu vernachlässigen)
Deshalb würde ich das setzen der Startzeit in der Tasterauswertung setzen.
Code:
  if (digitalRead(Taster1) && !Mprog2runs) { //wenn Taster1 gedrückt wurde und keine Aktion2 läuft,
    Mprog1runs= true; // dann  Aktion1 setzen.
  }
  if (digitalRead(Taster2) && !Mprog1runs) { //wenn Taster2 gedrückt wurde und keine Aktion1 läuft,
    Mprog2runs= true; // dann  Aktion2 setzen.
  }

474  International / Deutsch / Re: Schneerobi on: January 23, 2014, 05:02:06 am
Schau dir mal die grossen "Schneeschieber", die im Winter rumfahren.
Die Funktionsweise ist immer so, dass der Schnee mit Schwung auf die Seite befördert wird.
Das passiert entweder dadurch, dass die Schneepflüge so schnell fahren, dass der Schnee durch die Krümmung der Pflugschar beschleunigt auf die Seite geschleudert wird, oder direkt durch Fräsen.

Die kleineren Schneeräumtraktoren haben inzwischen meist einen rotierenden Besen, der das übernimmt.
Wann hast du das letzte Mal von Hand schnee geräumt?
Vielleicht gibts ja in diesem Winter doch noch Schnee, dann kannst du ja nochmal probieren, welche Kräfte du brauchst, um eine vollte Schneeschaufel zu schieben.

Aber, um auf das Arduino spezifische zurückzukommen: Klar kann der Arduino das!
475  International / Deutsch / Re: Frage zur Motorsteuerung on: January 22, 2014, 02:01:31 pm
Der Funktionsname ohne Klammern wird eventuell als Adresse der Funktion interpretiert. Dieser ist ungleich 0 und damit "true". 100%ig sicher bin ich mir da aber nicht.
Danke für die Erläuterung, das macht Sinn.
Es ging aber hier garnicht um einen Funktionspointer, sondern nur um die Frage, warum ein Schreibfehler keinen Compilererror auslöst.

Aber nun: back to Topic
476  International / Deutsch / Re: Frage zur Motorsteuerung on: January 22, 2014, 01:44:51 pm
Quote
Und dann kannst du nicht eine Funktion wie eine boolsche Variable behandeln:
" if (TasterStatus1 && !Motorprogramm2)" funktioniert nicht.

Code:
if (TasterStatus1 && !Motorprogramm2() )
könnte aber funktionieren.
Funktioniert nicht.
Zu einen von der Syntax: nur wenn du die Funktion als boolean deklarierst, akzeptiert das der Compiler, zum anderen funktionell: Die Funktion würde an dieser Stelle ausgeführt werden, was aber nicht gewünscht ist.


Edit: Spannende Sache.
Michael, du hat in deinem Zitat natürlich die Klammern nach der Funktion nachgezogen.
Dann meckert der Compiler. Wenn man die Klammern weglässt, also
Code:
if (TasterStatus1 && !Motorprogramm2)
Dann wird das compiliert!

Testsketch:
Code:
void test(){}

void setup(){
  Serial.begin(57600);
  if (test) Serial.println("true");
  else Serial.println("false"); 
}
void loop(){}
Das läuft, obwohl "test" als Variable nirgends deklariert ist.  smiley-eek-blue
(gibt übrigens true zurück.)

@ papla: auch wenn der Compiler nicht meckert: Funktionen müssen immer mit Klammern aufgerufen werden.
also: loop(), millis() und auch Motorprogramm1()


477  International / Deutsch / Re: Frage zur Motorsteuerung on: January 22, 2014, 12:16:03 pm
Wird schon besser!
Sogar schon mit Funktionen! Sehr gut!

Funktionieren würde es noch nicht....

Aber wenn ich ein Programm schreiben muß auch immer wieder testen...

also, was mir auffiel:
"if(time<dauer1)"  das funktioniert so nicht.
Du mußt, wie in deinen vorangegangenen Beispielen, die die Startzeit merken (z.B. beim Drücken des Tasters) und dann immer die Differenz zwischen Startzeit und time mit Dauer vergleichen. Also:
"if(time-Startzeit > dauer)"

Und dann kannst du nicht eine Funktion wie eine boolsche Variable behandeln:
" if (TasterStatus1 && !Motorprogramm2)" funktioniert nicht.
Du mußt schon, wie in meinem Beispiel eine eigene Statusvariable (Flag) erzeugen ("boolean Aktion1 = false;") die du bei Tastendruck setzt, und unten, abhängig von der Statusvariablen die Motorfunktion aufrufen. (und nach ablauf wieder rücksetzen).


Nochwas, aber das ist nur Kosmetik:
Deine beiden Funktionen machen ja das gleiche.
Du kannst auch nur eine Funktion deklarieren, der du die Dauern übergibst:
Code:
void Motorprogramm(long Dauer1, long Dauer2){
und dann so aufrufen:
Code:
Motorprogramm(5000,3000); // Programm1
void Motorprogramm(3000,3000)  // Programm2
478  International / Deutsch / Re: 3D Drucker Druckraum on: January 22, 2014, 09:33:11 am
Endschalter?
479  International / Deutsch / Re: Frage zur Motorsteuerung on: January 22, 2014, 09:30:48 am
Ich würde den Code anders aufteilen.

in jeder Loop zuerst die Taster lesen:
Code:
  if (digitalRead(Taster1) && !Aktion2) { //wenn Taster1 gedrückt wurde und keine Aktion2 läuft,
    Aktion1 = true; // dann  Aktion1 setzen.
  }
  if (digitalRead(Taster2) && !Aktion1) { //wenn Taster2 gedrückt wurde und keine Aktion1 läuft,
    Aktion2 = true; // dann  Aktion2 setzen.
  }

Dann hast du beide Taster abgefragt. Entprellen brauchst du nicht, weil beim ersten erkennen von HIGH wird bereits die Aktion gesetzt, die ausgeführt werden soll.  Und mit der verundung  "&& !Aktionx" erreichst du, dass ein Tastendruck erst wieder ausgewertet wird, wenn die andere Aktion abgelaufen ist.

Und dann führst du deine Aktionen aus:
Code:
  if (Aktion1) {        
    if(millis() - StartMillis < dauer1){         
      ...  // Motor ansteuern
    }else {   
      ...  // Motor abstellen
      Aktion1 = false;  // Wenn Zeit abgelaufen, Aktion1 beenden.
    }
  }

Das gleiche natürlich nochmal mit Aktion2. Ich habe es jetzt stark verkürzt dargestellt, aber das ist besser um erstmal eine Struktur reinzukriegen.

Am besten setzt du dich eh erstmal hin und schreibst dir mit Pseudocode eine Struktur auf.
Eben mit Pseudobefehlen wie "Motoran", "Motoraus", if (Zeitabgelaufen) etc.  Du kannst dich dabei durchaus an dem orientieren was du machen müßtest, wenn du das von hand machen solltest.
(Solche Pseudobefehle wie "Motoran" kann man dann später auch gut in Funktionen umwandeln!)

Es ist aber generell schwierig, vor allem als Anfänger, einen Code "trocken" zu schreiben.
Code schreiben ist das eine.
Herausfinden warum er nicht funktioniert (und er wird nicht auf Anhieb funktionieren!) das Andere.

Zum debuggen (also sehen, was der Controller wirklich macht, bietet es sich an über Serial.print() entsprechende Statusmeldungen auf dem Monitor auszugeben.

Also zum Beispiel, um mein oben angegebenes Beispiel zur Tasterabfrage zu kontrollieren:
Code:
  if (digitalRead(Taster1) && !Aktion2) { //wenn Taster1 gedrückt wurde und keine Aktion2 läuft,
    Aktion1 = true; // dann  Aktion1 setzen.
    Serial.println("  Taster 1 gedrueckt.")
  }
  if (digitalRead(Taster2) && !Aktion1) { //wenn Taster2 gedrückt wurde und keine Aktion1 läuft,
    Aktion2 = true; // dann  Aktion2 setzen.
    Serial.println("  Taster 2 gedrueckt.")
  }
480  International / Deutsch / Re: Frage zur Motorsteuerung on: January 22, 2014, 04:36:03 am
Ein Flag setzen bedeutet einfach sich was in einer Variablen merken.

z.B. so:
Code:
  TasterStatus1 = digitalRead(Taster1); //Auslesen ob Taster1 High ist
  if (TasterStatus1 == HIGH && !Aktion2) { //wenn Taster gedrückt wurde und keine Aktion2 läuft,
    Aktion1 = true; // dann in Aktion1 merken.
  }
 
  if (Aktion1) {         //wenn Taster gedrückt wurde, dann
    long dauer1 = 5000; //Motor1 soll 5sek laufen
    unsigned long currentMillis1 = millis(); //Merke aktuelle Zeitdauer = currentMillis1
    if(currentMillis1 - previousMillis1 < dauer1){  //Wenn Aktuelle Zeitdauer - vergangene Zeitdauer < 5sek dann Motoren laufen lassen
      ...  // Motor ansteuern
    }
    Aktion1 = false;
  }

Die Variablen Aktion1 und Aktion2 mußt du im Kopf als boolean deklarieren.
Ich würde auch andere Variablen z.B. dauer1 etc im Kopf deklarieren, und zwar als
"const unsigned long dauer1 = 5000;"
dann hast du alle Zeiten, die du evtl ändern möchtest an einer Stelle und mußt nicht suchen.
Pages: 1 ... 30 31 [32] 33 34 ... 78