Show Posts
Pages: 1 [2] 3 4 ... 219
16  International / Deutsch / Re: ImpulsGeber mit millis() on: September 26, 2014, 04:40:43 am
Ich versuche gerade mir einen Impulsgeber zu programmieren- mit millis().
Die High/Flanke soll eine Länge von 30ms oder 50ms haben.
Die Länge der Low/Flanke soll veränderbar über ein Poti sein. "intervall"
So sieht es aus und funktioniert, gefällt mir aber noch nicht so richtig:

Vor allem wird es mit "delay" niemals richtig funktionieren, wenn Du mehr als einen Impuls auf diese Weise programmieren möchtest.

Schon bei zwei Impulsen mit verschiedener Taktrate bkommst Du bei Blockierung mit "delay" überhaupt keine "überlappenden Impulse" hin, also dass z.B. ein 50ms Impuls startet während ein 30ms Impuls aktiv ist oder umgekehrt.

Das muss komplett ohne delay programmiert werden.
Und auch ohne jegliche andere Form von "busy waiting" in einer while-Schleife.
17  International / Deutsch / Re: Feste Zeit für PID Regler on: September 26, 2014, 04:31:38 am
Schade auch, dass man keinen fertigen sketch mit 2 oder 3 funktionierenden Zeitscheiben (ohne Lib) für den Arduino findet. 

Das hat denselben Grund, warum Du im Supermarkt keine fertigen Spiegeleier mit Speck oder Rührei mit Schnittlauch fertig gebraten im Regal stehen siehst: Du kannst es Dir aus den Zutaten in fünf Minuten selbermachen!

Codebeispiel:
Code:
// Funktionen im Takt abarbeiten, Demo by 'jurs' for German Arduino-Forum
void setup() {
  Serial.begin(9600); 
}

boolean halbSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 500){
    prevMillis += 500;
    result=true;
  }
  return result;
}

boolean dreiSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 3000){
    prevMillis += 3000;
    result=true;
  }
  return result;
}

boolean vierdreiviertelSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
{
  static unsigned long prevMillis;
  boolean result=false;
  while( millis() - prevMillis >= 4750){
    prevMillis += 4750;
    result=true;
  }
  return result;
}


void loop()
{
  if (halbSekundenTakt())
  {
    Serial.print("1/2 sec Tick ");
    Serial.println(millis());
  } 
  if (dreiSekundenTakt())
  {
    Serial.print("Jetzt sind 3 Sekunden um! ");
    Serial.println(millis());
  } 
  if (vierdreiviertelSekundenTakt())
  {
    Serial.print("Jetzt sind 4,75 Sekunden um! ");
    Serial.println(millis());
  } 
  // Rest des loop-Codes hier
}
18  International / Deutsch / Re: Seriell vs. W5100 vs. W5200 on: September 25, 2014, 12:50:29 pm
Wenn ich es richtig mitgekriegt habe, werden eine Handvoll Zeichen übertragen:
6 Zeichen brauchen selbst bei 9600 Baud nur 6 ms, bei 115200 sind es weniger als 1 ms.

Ganz so schnell geht es nicht, denn die USB-Seriell-Wandlung verursacht schon eine kleine Latenzzeit, die es bei der Kommunikation "echter" serieller Schnittstellen untereinander nicht gibt. Allerdings liegt die durch die USB-Wandlung begingte Latenzzeit nur bei wenigen Millisekunden.

Ich habe es gerade mal mit einem Arduino UNO, 115200 Baud und einem Windows-7 PC getestet:
Zeit starten, Uno sendet 4 Bytes zum PC, PC sendet 15 Bytes zurück, Zeit stoppen.

Das dauert insgesamt ca. 4 bis 8 Millisekunden, Werte schwankend.
19  International / Deutsch / Re: WS2812B verrecken wie die Fliegen... on: September 25, 2014, 05:37:10 am
Gut, in dem Fall sollte man die Spannung des Datenpins begrenzen, mir selbst sind die LEDs aber an der gleichen Spannungsquelle verstorben.

Schutzbeschaltung aus Reply #1 nicht verwendet?
Länge der Zuleitung?

Wenn zwei Leiter parallel verlaufen (z.B. die Stromleitung und die Datenleitung zu den LEDs) und in einem Leiter eine starke und plötzliche Stromänderung auftritt (z.B. LEDs an/aus), dann tritt in dem parallel verlaufenden Leiter eine Induktionsspannung auf. Zum Beispiel eine Induktionsspannung in der Datenleitung aufgrund der Stromänderung in der Stromleitung.

Mikrocontroller reagieren aber extrem allergisch, wenn die Spannung an einem Datenpin höher wird als die VCC-Versorgungsspannung des Controllers. Da machen WS2812 Controller keine Ausnahme.

Ich bin nur ein Softwaremensch und kenne mich mit Hardware und ESD- und EMV-Schutzmaßnahmen nur recht grob aus, aber ich würde lieber die in Reply #1 verlinkte Schutzbeschaltung aus Widerstand und Diode dicht vor die erste LED setzen als mich ständig mit durchgebrannten WS2812 Controllern an der ersten LED-Position herumzuärgern.
20  International / Deutsch / Re: WS2812B verrecken wie die Fliegen... on: September 25, 2014, 04:11:41 am
Ich tippe mal auf Spannungsspitzen in der Datenleitung.
Wo könnten die denn herkommen?

Die Spannung für die Datenleitung kommt von Deinem Arduino, die Spannung für die WS2812-VCC kommt von einem anderen Netzteil? Dann können sich die Spannungen unterscheiden.

Wie hoch ist denn konkret die Spannung
- am Arduino-Ausgang?
- am LED-Netzteil?

Darüber hinaus:
Wie lang ist die Leitung zwischen Arduino-Ausgang und LED-Matrix?
Mit wie viel Strom wird die Matrix angesteuert?
Wie viele Einspeisepunkte für die LEDs gibt es, also nach jeder wievielten LED speist das LED-Netzteil ein?
21  International / Deutsch / Re: WS2812B verrecken wie die Fliegen... on: September 25, 2014, 03:44:17 am
Ideen, was da schief laeuft?

Ich tippe mal auf Spannungsspitzen in der Datenleitung.

In dieser Schutzbeschaltung ist noch eine Diode enthalten:
http://www.corbinstreehouse.com/blog/wp-content/uploads/2014/03/Screen-Shot-2014-03-12-at-6.41.55-PM.png
(Diode mit dieser Schutzbeschaltung nicht am Arduino, sondern dicht vor der ersten LED platzieren)
22  International / Deutsch / Re: Keine Kommunikation mit RTC-Modul on: September 24, 2014, 01:58:37 pm
Wenn ich die Module (immer nur eins) an meinen Arduino Mega 2560 so anschließe, wie man es auf den diversen Bildern sieht (GND an GND, VCC an 5V, SDA an AnalogIn4, SCL an AnalogIn5, wie z. B. hier

Falsch verkabelt!

Der I2C-Bus am UNO ist A4 und A5, aber am MEGA sind es andere Pins!

Welche das sind, erkennst Du auf einem MEGA-Board an der Pin-Beschriftung SDA und SCL!
23  International / Deutsch / Re: Programmoptimierung: SRAM sparen on: September 24, 2014, 05:47:15 am
In meinem Programm verwende ich sehr oft das ASCII-Zeichen 59 (Semikolon). Nun würde mich mal interessieren, welches der 3 Testprogrammen am effektivsten und RAM-schonenden ist.

Wenn Du ein char ausgeben möchtest, gibt man normalerweise keinen String (doppelte Hochkommas) aus, sondern ein einzelnes char-Zeichen (einfache Hochkommas):
Code:
client.print(';');

Ansonsten ist es bei stets derselben Stringkonstante so ziemlich gehupft wie gesprungen:
Code:
client.print(";");
Das ist eine Stringkonstante von 2 Bytes, und die belegt 2 Bytes RAM, egal ob Du sie im Programm einmal oder 100 mal ausgibst, dafür sorgt der Compiler, wenn Du identische Stringkonstanten mehrfach verwendest.

24  International / Deutsch / Re: HIGH/LOW ändern sich beliebig ohne Tasterbenutzung on: September 23, 2014, 10:26:41 am
ganz genau!

Willst Du eine unendlich lange Zeile auf Serial erzeugen?
Wer scrollt denn so weit rechts rüber, dass er die Ausgabe dort noch sehen kann?

Mach doch wenigstens am Ende einen Zeilenvorschub (println = "print line"):
Code:
Serial.println(c);
25  International / Deutsch / Re: Ungenauigkeiten beim DS3231 on: September 23, 2014, 10:21:01 am
Code:
void setup()
  {
  clock.begin();
  Serial.begin(9600);  
  clock.setDateTime(__DATE__, __TIME__);

Falls das mit Deiner Library so funktioniert wie Du es da hingeschrieben hast:
An der Stelle im Setup stellst Du die Uhrzeit auf die Zeit und das Datum, an dem Du den Sketch auf Deinem PC kompiliert hast.

D.h. bei jedem Reset oder Neustart des Programms wird die Uhrzeit auf exakt diesen Zeitpunkt eingestellt.

Spielst Du das Programm 5 Minuten nach dem Kompilieren auf den Controller ==> Uhr geht 5 Minuten nach.

Machst Du nach nochmal 10 Minuten einen Reset ==> Uhr geht dann schon 15 Minuten nach,

Und kommt nach einer Woche ein Stromausfall und der Controller startet danach neu, dann geht die Uhr eine Woche nach.

Findest Du es so günstig, die Uhrzeit bei jedem Neustart des Controllers auf den Zeitpunkt zurückzusetzen, an dem das Programm auf dem PC zusammenkompiliert wurde?

Im Normalfall würdest Du wohl das Programm so kompilieren, hochladen und laufen lassen.
==> Zeit wird aktuell gestellt
Dann die Zeile "clock.setDateTime(__DATE__, __TIME__);" im Quellcode auskommentieren
Und dann das Programm nochmals hochladen, so dass die Uhr danach nicht ständig bei jedem Reset neu gestellt wird.
26  International / Deutsch / Re: HIGH/LOW ändern sich beliebig ohne Tasterbenutzung on: September 23, 2014, 10:09:37 am
EDIT: bei geschlossener Arduino.exe funktionierts, wie es soll - bei geöffneter nicht

Als extreme Merkwürdigkeit an Deinem Code fällt mir nur auf, dass Du offenbar versuchst das Backlight zu steuern noch bevor das Display initialisiert wurde:
Code:
 lcd.backlight();
  lcd.begin(16,2);      

Das würde ich ggf. mal in der Reihenfolge vertauschen.

Alles andere sieht nur normal merkwürdig aus und sollte vom Prinzip her funktionieren.

Extrem merkwürdig klingt aber diese Beschreibung von Dir:
Schließe ich den SerialMonitor, so springt mein LCD - diesmal 5 Sekunden - wieder auf 000.
Öffne ich ihn wieder, erhalte ich kontinuierlich mein gewünschtes 111 zurück.

Das ist insofern merkwürdig als ein Arduino-Board beim Upload einen automatischen Reset ausführt, d.h. wenn Du den seriellen Monitor schließt und wieder öffnet, macht das Programm einen Reset, und dann sollte die Anzeige wieder so sein als wenn noch gar keine Tasten gedrückt worden wären, also 000 und nicht 111.

Kann es vielleicht sein, dass
a) Dein Board gar keinen automatischen Reset durchführt?
b) Dein Board einen ganz anderen Sketch enthält als Du meinst und der Upload auf das Board fehlschlägt?
c) oder gar, dass Du zwei Arduino-Boards an zwei verschiedenen seriellen Schnittstellen an Deinem PC angeschlossen hast, und während Du beabsichtigst, auf den einen Arduino hochzuladen, machst Du den Upload tatsächlich auf den zweiten angeschlossenen Arduino?


27  International / Deutsch / Re: Stepper-Servo ansteuern on: September 23, 2014, 08:46:24 am
Ist das normal oder? Oder muss ich noch was an meiner Software ändern nicht dass er mir kaputt geht smiley-sad

Schau ins Datenblatt des Schrittmotors, da steht drin, was er an Strom bei wieviel Spannung ziehen darf!

Ein Schrittmotor wird stets mit vollem Strom angesteuert, egal ob er steht oder ob er dreht. Und jeder Motor, der mit seiner vollen Nennleistung angesteuert wird, wird schon mehr als handwarm.

Mit Deiner "release()" Funktion schaltest Du den Strom zwar ab, aber dann schlackert der Motor auch frei herum und macht ganz bestimmt keine präzisen Steuerschritte, wenn Du danach wieder Strom draufgibst. Für eine schrittgenaue Steuerung darfst Du den Strom nicht zwischendurch abschalten, sonst verliert der Motor seine Step-Position extrem leicht.

Eine Zeitanzeige mit Schrittmotoren, die Zeiger bewegen, wird daher eine ziemlich stromfressende Angelegenheit und verschafft Deiner Stromrechnung einen Push nach oben.

Etwas kühler kannst Du den Stepmotor ggf. mit der Ansteuerung "SINGLE" statt "DOUBLE" ansteuern, ich glaube dann wird immer nur eine Spulenwindung unter Strom gehalten. Aber dazu müßte man mal in Deine Library reinschauen und auch den Motortreiber kennen, ob das wirklich so ist. Oder mal den tatsächlich gezogenen Strom des Motortreibers bei unterschiedlicher Ansteuerung SINGLE/DOUBLE messen. Mit der Ansteuerung, die weniger Strom zieht, bleibt der Motor dann kühler.
28  International / Deutsch / Re: HIGH/LOW ändern sich beliebig ohne Tasterbenutzung on: September 23, 2014, 07:51:00 am
Selbst für den Konditional-Operator ist das sehr, sehr unschön gelöst. Mit dem kann man nämlich direkt Zuweisungen machen:
Code:
a = (a == 0) ? 1 : 0;

Wenn schon auf diese Art, dann schreibt man es wohl eher so:
Code:
a=a?0:1;
29  International / Deutsch / Re: Stepper-Servo ansteuern on: September 23, 2014, 06:50:55 am
Deswegen sollte er die Schritte daher feiner machen. Aber irgendwie komme ich nicht weiter smiley-sad Habe ich hier was entscheidendes vergessen?

Wenn Du in großen Zeitabständen stets ein halbes Dutzend Schritte auf einmal machst, machst Du natürlich keine feinen Schritte:
Code:
myMotor->step(6, 1, INTERLEAVE);
Dann ruckt der Zeiger: Lange warten, 6 Schritte auf einmal, lange warten, 6 Schritte auf einmal.

Eine Feinsteuerung machst Du, indem Du in gleichmäßigen Zeitabständen jeweils EINEN einzigen Schritt machst.
Kurz warten, ein Schritt, kurz Warten, ein Schritt, kurz Warten, ein Schritt. So wird im Feinantrieb ruckfrei gesteuert.

Und meinen Hinweis auf das merkwürdige "myMotor->release();" im Code, und dass damit der Motor frei herumschlackern kann und Du damit keine präzise Steuerung hinbekommen kannst, hast Du irgendwie nicht verstanden oder es ist Dir egal, dass der Motor zwischen den angesteuerten Schritten im quasi "Freilauf" machen kann was er möchte?
30  International / Deutsch / Re: HIGH/LOW ändern sich beliebig ohne Tasterbenutzung on: September 23, 2014, 05:35:58 am
a==0?a=1:a=0;

Wer hilft mir bei dieser Syntax auf die Sprünge?

Das ist quasi:
Code:
if (a==0) a=1; else a=0;

Von dem, was er da machen möchte, würde ich aber schreiben:
Code:
a=!a;
Pages: 1 [2] 3 4 ... 219