Show Posts
Pages: 1 ... 84 85 [86] 87 88 ... 190
1276  International / Deutsch / Re: Steinhart-hart oder standard-ntc-formel? on: October 15, 2013, 03:19:01 am
Macht es auf Grund der Genauigkeit vll trotzdem Sinn, die Steinhart-Hart-Gleichung zu verwenden?

Oder ergibt es aufgrund der Genauigkeit (der Arduino ADC hat nur 10-Bit Auflösung) nicht sogar viel mehr Sinn, einen digitalen Temperatursensor mit beispielsweise 12-bit interner Auflösung zu verwenden, wenn man auf mehr Genauigkeit Wert legt?
1277  International / Deutsch / Re: Servo Zittern in Verbindung mit anderen Librarys on: October 14, 2013, 11:43:23 am
Ich habe die Servo-lib die in der IDE mitgeliefert wurde;
die hier: http://arduino.cc/en/Reference/Servo

Ah, moderne Zeiten, mitgelieferte Servo-Library!

Ja, die basiert auf Interrupts. Frißt Interrupt-Zeitscheiben weg, frißt PWM-Pins weg und begrenzt die maximal ansteuerbare Servoanzahl. Irgendwie ist nicht alles besser was neuer ist.

Jedenfalls Servo-Interrupts beißen sich in dem Fall mindestens mit Serial-Interrupts, wenn Du z.B. Debug-Ausgaben auf Serial sendest. Das kann ggf. das exakte Timing nachteilig beeinflussen, wenn z.B. noch ungesendete Zeichen im seriellen Sendepuffer sind während dann der interruptgesteuerte automatische Servo-Refresh zuschlägt. Dann kann (Serial-)Interrupt auf (Servo-)Interrupt treffen und ein Interrupt muss warten, bis der andere beendet ist, bevor er zum Zuge kommt.

Eine Möglichkeit wäre, Serial auf einer anderen, höheren Baudrate laufen zu lassen.
Wenn Du Serial jetzt auf 9600 laufen hast, z.B. mal Serial auf 115200 ausprobieren.
Änderung?

Die andere Sache ist die: Bei so einem Regler brauchst Du Serial doch nur für Debug-Ausgaben während der Programmentwicklung, oder und sonst für nichts anderes? Dann wäre eine andere Möglichkeit, per bedingter Kompilierung den Quellcode zur Kompilierung von zwei verschiedenen Versionen vorzusehen:
- Debug-Version zur Programmentwicklung mit Debug-Ausgaben auf Serial.
- Final-Version zum Einsetzen ohne Serial
Weißt Du, wie Du "bedingte Kompilierung" nutzen kannst, um komfortabel dieselbe Quellcodeversion zu nutzen? Also um aus demselben Quellcode einen Sketch mit Serial-Debugausgaben und einen Sketch ohne Serial-Ausgaben erzeugen zu können?

mir scheint, die im Playground ist älter.

Älter muß nicht in jedem Fall schlechter sein. Die ältere Version knabbert z.B. keine PWM-Pins weg und ist auch in der Servoanzahl nicht limitiert.

Meine loop() läuft ohne delays.
Im Schnitt habe ich 400µs Loop wiederholrate, wenn eine der Zeitscheiben aufgerufen wird, können das aber auch 6-8ms werden.
Bei besonders Zeitaufwändigen Aktionen, wie z.B. wenn das Display komplett neu geschrieben wird, oder die SD-Karte gesteckt wird, können es auch mal 30ms sein. Aber das sind nicht die Zustände, die mir Probleme machen.

Das hört sich völlig einwandfrei für die Nutzung der alten Servo-Library an. Die refresh-Aufrufe sollen regelmäßig in Abständen von max. 20 ms erfolgen und höchstens 50 ms nicht überschreiten.

Vielleicht würde ich das mit den Änderungen an "Serial" (höhere Baudrate, Debug- und Final-Version) zuerst ausprobieren, damit Du die mitgelieferte Servo-Lib ggf. weiternutzen kannst. So ganz ohne Not braucht man auf mitgelieferte Libs ja vielleicht auch nicht verzichten.
1278  International / Deutsch / Re: Servo Zittern in Verbindung mit anderen Librarys on: October 14, 2013, 10:56:19 am
nein, in der Servo.lib gibt es kein Refresh.

Welche Library meinst Du?
Nicht diese hier: http://playground.arduino.cc/ComponentLib/servo
???

Bei der heißt es "you must call the SoftwareServo::refresh() method at least once every 50ms or so to keep your servos updating".

Also verwendest Du wohl eine andere Library.
Welche Servo-Library verwendest Du?

Und wenn Du mal nicht die bisher verwendete nutzt, sondern die oben verlinkte und in der loop "refresh" für die Servos verwendest?

Du hast doch die loop-Funktion auf hoher Drehzahl und ohne delay laufen? Oder vielleicht nicht?
1279  International / Deutsch / Re: Servo Zittern in Verbindung mit anderen Librarys on: October 14, 2013, 10:31:23 am
wenn Terwi daran schon verzweifelt, was soll dann ich erst machen!  smiley-sad-blue

Am besten erstmal eine Diagnose des Problems.

Ich kenne mich mit Servos und der Servo-Library am Arduino zwar eher theoretisch aus als dass ich damit schon viel realisiert hätte, aber ich habe gesehen, dass es eine "write" Funktion zum Setzen des Sollwertes gibt und eine "refresh" Funktion zum Halten des gesetzten Werts, die in der Loop regelmäßig und oft genug aufgerufen werden muss.

Fragen:

1. Wie oft bzw. in welchen Zeitabständen greift in Deinem Sketch denn die Regelung ein und wie oft werden mit "servo1.write(value);" neue Sollwerte gesetzt?

2. Erfolgen die Aufrufe von "SoftwareServo::refresh();" in der loop oft genug, also mindestens alle 20 Millisekunden?

Könnte es sein, dass Du da bereits einen Bock geschossen hast?

Wenn nein und Du auch keine zeitkritischen Aktionen am Laufen hast, könnte man vielleicht die Interrupts blockieren, während die refresh-Funktion läuft.

Erste Idee: Während des Servo-refresh-Aufrufs mal testweise die Interrupts komplett zu blockieren.

noInterrupts();
SoftwareServo::refresh();
interrupts();

Ändert sich dann etwas am Servo-Zittern mit blockierten Interrupts während des Servo-refresh?
Zerreißt es laufende Ausgaben auf Serial? Funktioniert irgendwas nicht mehr?
1280  International / Deutsch / Re: MIT ARDUINO MACHBAR / SINNVOLL? on: October 14, 2013, 10:20:36 am
Ist das machbar und nicht allzu schwer?

Ja, das ist machbar.

Wie schwierig das wird, das hängt davon ab, mit welchen Spannungen und Strömen Deine Drähte erwärmt werden sollen. Und ob eine "Regelung" notwendig ist oder ob beispielsweise an den Drähten nur eine Stromversorgung ein und aus geschaltet werden muß, mit der simplen Logik "einschalten = Drähte werden warm" und "ausschalten = Drähte werden kalt". Wenn es so wäre, wäre das am einfachsten.
1281  International / Deutsch / Re: Tasten über Interrupt und "Drückdauer" on: October 14, 2013, 06:33:25 am
Jau, das war es .... Nun funz't es ....

Na bravo!

Ich denke, Du hast schon an mir gezweifelt - vielen Dank für Deinen unermüdlichen Einsatz.
Der Hinweis mit dem DUE-Board war dann ja doch nicht so ganz verkehrt.

Ja, zeitweise schon. Aber dass der DUE doch so große Unterschiede zu den Standard-Arduinos aufweist, wenn man "nur" die Befehle der Arduino-Software verwendet, war mir vollkommen neu. Z.B. dass Pins nach dem Setzen auf OUTPUT im setup() HIGH statt LOW sind, oder dass man den Zustand von als OUTPUT gesetzten Pins nur dann sicher abfragen kann, wenn der Ausgang vorher einmal explizit als INPUT gesetzt war. Na ja, hinterher ist man schlauer.

Jetzt werde ich  mich noch etwas mit dem "&variable" (Pointer) beschäftigen, damit dann alles sitzt.   

Du meinst mit dem &-Adressoperator bei den Parametern in den Funktionsdeklarationen?

Der Unterschied ist der:
Wenn die Variablen "normal" deklariert sind, sind sie "call-by-value", die Funktion erhält eine Kopie der originalen Variablen übergeben. Die Funktion kann innerhalb der Funktion diese Variablen ändern, aber an der Stelle wo die Funktion aufgerufen wurde, wird das Original des Parameters NICHT geändert. Es wird ja in der Funktion tatsächlich mit einer Kopie des Parameters gearbeitet und nicht mit dem Original-Parameter.

Wenn die Variable in der Parameterliste mit dem &-Adressoperator deklariert ist, ist es "call-by-reference". Die Funktion bekommt dann keine Kopie des Parameters übergeben, sondern einen Referenz-Verweis auf den originalen Parameter.  Wenn dieser Parameter innerhalb der Funktion verändert wird, wird der tatsächliche originale Parameter gleichzeitig an der Stelle geändert, von wo aus der Funktionsaufruf mit diesem Parameter erfolgte. Das benutzt man für Parameter "die innerhalb einer Funktion von der Funktion änderbar" sein sollen.

Da ich ja auch die Byte-Schieberei bislang  vermieden habe  smiley-roll-blue muss ich noch einmal fragen:
Wenn ich einByte abfrage, dann wird mir immer ein "0b" mitgeliefert?

Nein, es wird nichts "geliefert". Eine Zahl ist eine Zahl und kann auf verschiedene Arten dargestellt werden. Man kann z.B. eine Zahl als normale Dezimalzahl schreiben:
byte zahl=255;
Oder dieselbe Zahl als Hexedezimalzahl:
byte zahl=0xFF;
Oder dieselbe Zahl als Binärzahl:
byte zahl=0b11111111;

Das "0b" ist ein Präfix (quasi "Vorsilbe") und bedeutet, dass die nachfolgende Zahl als Binärzahl interpretiert werden soll.
Also genau so wie das Präfix "0x" bedeutet, dass die nachfolgende Zahl als Hexadezimalzahl interpretiert werden soll.

Es handelt sich als nur um einen Hinweis für den Compiler: Steht eine Zahl ohne Präfix da, soll er sie als Dezimalzahl behandeln, mit Präfix "0x" vor der Zahl als Hexadezimalzahl und mit Präfix "0b" als Binärzahl.

Die Darstellung als Binärzahl im Quelltext habe ich nur gewählt, weil man bei dieser Darstellung sehr gut die gesetzten und nicht gesetzten Bits in der Zahl erkennen kann.

1282  International / Deutsch / Re: Tasten über Interrupt und "Drückdauer" on: October 14, 2013, 05:22:14 am
Die LEDs sind die ganze Zeit AN.
Direkt mit Start AN und nach 10 Sekunden auch noch AN.
Also scheint es so, dass die LEDs mit der Initalisierung direkt ein HIGH bekommen.

OK, also macht der DUE einiges anders, denn alle übrigen Arduinos sind nach dem Starten LOW an den Pins.

Ich habe Deinen Test-Sketch geändert und aus dem HIGH ein LOW gemacht. Folge: Nach10 Sekunden schalten sich die LEDs auch AUS.
 
Ich habe jetzt im BLINKER Sketch diese beiden Zeilen im void setup() eingefügt:
  digitalWrite( BLINKPINLEFT, LOW);
  digitalWrite( BLINKPINRIGHT, LOW);
Nun bleiben beide LEDs beim Start aus. Die linke LED funktioniert mit der Linken-, der Warn- und der Stopp-Taste wie gewünscht.

Das hört sich schon mal besser an als vorher.

Da die Betaversion der Arduino-Softare für den DUE immer noch einige Bugs enthält (und gerade deshalb noch "BETA" ist), mußt Du bei Verwendung des DUE offenbar einige Bugs umschiffen. Ein Bug der DUE-BETA-Version betrifft auch den von mir geposteten Sketch und ist hier mit Workaround beschrieben:
http://forum.arduino.cc/index.php?topic=185291.0

Man kann offenbar den Status von als OUTPUT gesetzten Pins beim DUE nur dann zuverlässig auslesen, wenn der Pin vorher einmal als INPUT gesetzt war.

Mein Vorschlag wäre also, den im Link genannten Workaround zu verwenden, in der setup-Funktion die Ausgänge erstmal auf INPUT und danach erst auf OUTPUT und dann am Ende nochmal LOW, damit die Ausgänge LOW und die LEDs bei Programmstart aus sind:

Code:
void setup()
{
#ifdef DEBUG 
  Serial.begin(9600);
#endif
  pinMode(BUTTONLEFT, INPUTTYPE);
  pinMode(BUTTONRIGHT, INPUTTYPE);
  pinMode(BUTTONSTOP, INPUTTYPE);
  pinMode(BUTTONWARN, INPUTTYPE);
  // Die beiden LED-Pins auf digitalen Output schalten
  pinMode(BLINKPINLEFT, INPUT);
  pinMode(BLINKPINLEFT, OUTPUT);
  digitalWrite(BLINKPINLEFT, LOW);
  pinMode(BLINKPINRIGHT, INPUT);
  pinMode(BLINKPINRIGHT, OUTPUT);
  digitalWrite(BLINKPINRIGHT, LOW);
}

Irgendwelche Änderungen im Ablauf?
1283  International / Deutsch / Re: Zeitschaltuhr Relais RTC1307 on: October 14, 2013, 03:46:25 am
Relais4 war an DigitalPin13 angeschlossen, und der wird irgendwie beim starten vom Bootloader angesprochen.

Ja, dafür ist der Bootloader verantwortlich, der läßt die Pin-13 LED blinken.

Da ich aber am UNO nicht mehr DigitalPins zur Verfügung hatte blieb mir nichts anderes übrig wie Den Mega2650 zu benutzen.

Dass Du die Analog-Pins bei Bedarf alle wie sie da sind auch wie Digital-Pins ansprechen könntest und ein UNO damit bis zu 20 digitale Ein-/Ausgänge zur Verfügung hat,, ist Dir aber schon klar?

Beim UNO gilt:
A0= D14
A1= D15
A2= D16
A3= D17
A4= D18
A5= D19

Ob der Arduino bei Dir in einer Schaltung 14 digitale und 6 analoge I/O hat, oder ob er nur 20 digitale Pins hat, das kannst Du Dir selbst aussuchen. Also spräche überhaupt nichts gegen:
pinMode(17,OUTPUT);
digitalWrite(17,HIGH);
auf einem UNO, wenn Du A3/D17 als digitalen Ausgang ansprechen wolltest.
1284  International / Deutsch / Re: Tasten über Interrupt und "Drückdauer" on: October 13, 2013, 03:34:19 pm
Sorry, aber es muss was anderes sein.

Verwendest Du ein Due-Board?  

Ich habe noch nie einen DUE gehabt, zum Testen habe ich einen UNO und einen MEGA.

Lasse bei Dir mal folgenden Test-Sketch laufen:
Code:
#define LAMPELINKS 22
#define LAMPERECHTS 23

void setup() {
  Serial.begin(9600);
  pinMode(LAMPELINKS,OUTPUT);  
  pinMode(LAMPERECHTS,OUTPUT);  
  Serial.println("Sketch gestartet.");
  delay(10000);
  Serial.println("Nach 10 Sekunden:");
  digitalWrite(LAMPELINKS,HIGH);  
  digitalWrite(LAMPERECHTS,HIGH);  
}

void loop() {
}

Pin-Nummern für die beiden LEDs ggf.  anpassen.

Nachdem die Meldung "Sketch gestartet" im seriellen Monitor angezeigt wird: Sind Deine LEDs dann an oder aus?

Und 10 Sekunden danach: Sind Deine LEDs dann an oder aus?
1285  International / Deutsch / Re: Serial Read on: October 13, 2013, 03:08:40 pm
Hallo! Ich wollte fragen ob mir jemand sagen kann wie ich mit Serial Read folgendes ausleen kann und dieses dann beim komma splitten kann und 2 port je nach dem vorstehenden unter nach dem kommastehenden wert ein/ausschalten kann.
die "nachricht" soll so aussehen: 1,1 oder 1,0 oder 0,1 oder 0,0

Wie werden die Nachrichten konkret gesendet, hast Du vielleicht irgendwelche Informationen zum Übertragungsprotokoll vergessen mitzuteilen?

Mal angenommen, diese vier Nachrichten kommen direkt hintereinander an, kommt dann sowas:
1,11,00,10,0
Die Nachrichten ohne Trennzeichen und ohne Pausen zwischen den Nachrichten hintereinander weg???

Oder sind die Nachrichten vielleicht irgendwie getrennt, z.B. mit einem Zeilenende-Trennzeichen (CR, LF oder CRLF) nach jeder Nachricht (z.B. beim Senden über den seriellen Monitor)?

Oder sind die Nachrichten wenn nicht mit einem Trennzeichen getrennt, dann vielleicht mit einem Timeout (kurze Sendepause zwischen zwei Nachrichten) getrennt?
1286  International / Deutsch / Re: Brauche Hilfe on: October 13, 2013, 11:51:15 am
ich würde eigentlich gerne die Sekunden auf 3 siebensegment Anzeigen runterzählen lassen
kannst du mir möglicherweiße eine Art Muster zeigen welches ich dann anschließend in mein programm übertragen kann

Nein, das könnte ich nicht. Denn soll ich Dir mal was verraten:
Ich habe noch nie etwas mit Arduino und Siebensegmentanzeigen gebastelt.

Wenn ich was anzuzeigen habe, dann verwende ich eigentlich immer 1602 LCD-Displays.

habe nur noch bis Freitag den 18.10. Zeit diese Aufgabe zu lösen weil ich dieses Programm Samstag an einem Kickertunier brauche

Oh, oh. Am besten schon mal eine Handstoppuhr für das Turnier heraussuchen ...
1287  International / Deutsch / Re: LED-Animation ohne delay.. der blanke Horror on: October 13, 2013, 09:42:11 am
oder besteht da ein schwerwiegender Denkfehler meinerseits?

Ja, Denkfehler.

Der Denkfehler bezieht sich offenbar auf die abweichende Initialisierung von "static" Variablen.

Wenn Du eine "initialisierte static Variable" in einer Funktion hast, z.B.:
static unsigned long lastRuntime=0;
dann wird die Initialisierung genau EINMAL BEIM PROGRAMMSTART ausgeführt, danach nie wieder.
Im übrigen - und wie bereits mehrfach erwähnt - behält eine static Variable immer ihren Inhalt zwischen den Funktionsaufrufen. D.h. wenn die Funktion beendet ist und irgendwann wieder aufgerufen wird, hat die Variable denselben Inhalt wie zu dem Zeitpunkt als die Funktion vorher beendet wurde.

Wenn Du eine "normale initialisierte Variable" als lokale Variable in einer Funktion hast, z.B.:
unsigned long lastRuntime=0;
dann wird diese Variable BEI JEDEM FUNKTIONSAUFRUF neu initialisiert.
1288  International / Deutsch / Re: LED-Animation ohne delay.. der blanke Horror on: October 13, 2013, 08:58:16 am
Wenn ich in Deinem Code das static weglassen würde, hätte dies keinerlei Auswirkungen auf den Programmablauf, oder?

Nein, das "static" in meinem Code kannst Du nicht weglassen.

"static" ist notwendig für Variablen, die
- lokal innerhalb einer Funktion deklariert sind und
- zwischen verschiedenen Funktionsaufrufen den Variableninhalt beibehalten sollen

Wenn das "static" bei lokalen Variablen fehlt, haben lokale Variablen beim Aufruf der Funktion einen "unbestimmten Inhalt" von zufälligen Speicherstellen aus dem RAM. Das kann bei einer schnell nacheinander aufgerufenen Funktion zwar (mehr oder weniger zufällig) dann auch der Speicherinhalt vom vorherigen Funktionsaufruf sein, aber das ist nicht sichergestellt.

Das "static" wegzulassen, wenn die Variableninhalte lokaler Variablen zwischen Funktionsaufrufen erhalten bleiben sollen, ist ein Programmfehler. Selbst wenn das Programm in manchen Fällen trotz Programmfehler richtig zu funktionieren scheint.

Wo Du das "static" immer weglassen kannst: Bei der Deklaration von globalen Variablen "oben im Programm", also Variablendeklarationen außerhalb von Funktionen.
1289  International / Deutsch / Re: Brauche Hilfe on: October 13, 2013, 07:52:45 am
allerding weiß ich immernoch nicht wie ein Timer programmiert wird

Den eigentlichen Hardware-Timer brauchst Du nicht programmieren, der wird über die Funktion "millis()" schon von der Arduino-Software bereitgestellt, d.h. Du brauchst den Timer eigentlich nur mit der millis() Funktion abfragen.

Dieser Timer zählt (so gut wie) im Millisekundentakt hoch, also genau auf ca. 1 bis 2 tausendstel Sekunden, das sollte als Genauigkeit reichen, oder?

Den Stand des Timers kannst Du jederzeit im Programm an eine "unsigned long" Variable zuweisen:
unsigned long milliCount=millis();

Und wieviel Zeit seit der letzten Zuweisung vergangen ist, kannst Du später über eine Differenzbildung ermitteln:
unsigned long milliDifferenz= millis()-milliCount;

Und auftretende Zeitdifferenzen ziehst Du dann vom Anfangsstand ab, den Du dazu am besten auch im Millisekunden zählst. Also 5 Minuten sind 5*60=300 Sekunden = 300000 Millisekunden.insgesamt sind zu zählen, bis die Zeit abgelaufen ist.

du hast erwähnt dass man das mit den Led´s kürzer bzw eleganter schreiben kann
-und wie?
 

Am elegantesten in einer Schleife, wenn die Button-Pins nicht einzeln deklariert sind, sondern in einem Array:

Für Testcode, bei dem ich zum Testen überhaupt keine LEDs benötige, würde ich schreiben:
Code:
byte leds[]={2,3,4,5,6}; // Byte-Array mit den LED-Pins

void showLEDs(byte anzahl)
{
  for (int i=0;i<sizeof(leds);i++) // Alle LEDs nacheinander abarbeiten
  {
    if (anzahl>i)
    {
      digitalWrite(leds[i],HIGH);
      Serial.print("1");
    }
    else 
    {
      digitalWrite(leds[i],LOW);
      Serial.print("0");
    }
  }
  Serial.println();
}

Dann werden einerseits alle LED-Pins in einer Schleife gesetzt und andererseits erscheint als Ausgabe der LED-Status auch auf dem seriellen Monitor. Wie gesagt, zum Testen von Code brauche ich dann gar keine LEDs, weil ich auf dem seriellen Monitor sehe, wie die fünf LEDs mit ihrem aktuellen Status "0" oder "1" angezeigt werden.
1290  International / Deutsch / Re: Sainsmart Mega und Tiny RTC keine Funktion on: October 13, 2013, 06:46:37 am
Ich habe GND an GND, VCC an +5V, SDA an D20 und SCL an D21 angeschlossen und
mehrere Beispielsketche ausprobiert, bspw:

Das ist die richtige Verkabelung für ein MEGA Board.

Zusätzliche PullUp-Widerstände sind nicht notwendig, da das RTC Tiny Modul solche auf der Platine hat.

Was Du mal prüfen kannst:
- Akku /Batterie vom Modul entnehmen und neu einsetzen ==> Batterie eingerastet?

Überhaupt: Hat Deine Platine einen Akku (LIR 2032) oder eine Batterie (CR2032) eingesetzt?

Probiere auch mal mit meinem RTC-Testsketch für DS1307 und DS3231, den ich zuletzt gestern in diesem Beiträg gepostet hatte:
http://forum.arduino.cc//index.php?topic=192740.msg1426044#msg1426044

Versuche mit diesem Sketch, einmal Datum und Zeit über den seriellen Monitor zu setzen!

Pages: 1 ... 84 85 [86] 87 88 ... 190