Show Posts
Pages: 1 2 [3] 4 5 ... 220
31  International / Deutsch / Re: Schrittmotor mit Endschalter anhalten on: September 27, 2014, 08:21:10 am
Hab mir mal die Stepper Library von Adafruit heruntergeladen und bisschen herumexperimentiert, allerdings komm ich nicht wirklich auf einen grünen Zweig, da ich lediglich die Schrittanzahl angeben kann, nicht aber "verfahre bis Kontakt".

Für Dein Vorhaben benötigst Du die passende Stepper-Library, die den Schrittmotor ansteuert, ohne die IDE zu blockieren, bis die Zielposition erreicht ist.

Mit blockierenden Libraries kannst Du tatsächlich nur:
1. einige Schritte machen
2. prüfen ob Endbedingung oder Stopbedingung erreicht ist
3. Wenn nein, weiter mit 1.

Eine Stepper-Library, die Step-Befehle ohne das Programm zu blockieren im Hintergrund ausführen kann, ist meines Erachtens nach die "AccelStepper"-Library. Und zu Deinem Anwendungsfall gibt es für die Library sogar ein "Quckstop" Beispiel:
http://www.airspayce.com/mikem/arduino/AccelStepper/Quickstop_8pde-example.html#a6

D.h. Du kannst dann dem Stepper das Ziel vorgeben, das er ansteuern soll, dieses steuert die Library dann im Hintergrund interruptgesteuert an, und im laufenden Programm kannst Du beliebige Dinge machen, z.B. die tatsächliche Position abfragen, oder auch die Position eines Endschalters abfragen, und Du kannst dann jederzeit während des laufenden Fahrvorgangs über die beiden Befehle
Code:
  stepper.stop(); // Stop as fast as possible: sets new target
  stepper.runToPosition();
die aktuelle Position als neue Zielposition des Fahrvorgangs vorgeben und einen Nothalt mit Schnellbremsung durchführen.
32  International / Deutsch / Re: Atmel Studio 6.2 : UTFT.h nicht gefunden on: September 27, 2014, 08:02:20 am
Kann mir einer einen Tipp geben?

Versuche mal:
Code:
#include "UTFT.h"
33  International / Deutsch / Re: [Vorschlag "sticky"] Sicherheitshinweise on: September 27, 2014, 07:14:41 am
bitte sachliche Diskussion dazu

So wie ich das sehe, haben Sicherheitshinweise in Sachen "Netzspannung" und "Brandgefahr" konkret nichts mit "Arduino" zu tun. Mit keinem originalen Arduino-Board, mit keinem Bauteil aus dem Arduino-Starterkit und auch mit keinem Programmbeispiel aus der Software-IDE.

Arduino-Boards werden mit 5 Volt (oder 3.3 Volt) betrieben. Man kann zwar externe Netzteile bis 12 Volt anschließen, aber bei handelsüblichen Netzteilen sind die Sicherheitshinweise auf einem Beipackzettel dem Netzteil beigefügt.

Arduino-Boards haben auch keine austauschbaren Glas-Schmelzsicherungen, die man gegen den falschen Sicherungstyp auswechseln könnte, sondern auf Arduino-Boards ist eine "resettable Polyfuse" verbaut, die oberhalb 500 mA den Stromfluss sperrt und die sich automatisch zurücksetzt, wenn man das Board eine Weile vom Strom trennt.

Dies hier ist ein Arduino-Forum. Allgemeine Tipps zu Drittanbieter-Hardware, die man auf irgendeine Weise an einen Arduino anschließen kann, gehören dort hin, wo diese Drittanbieter-Hardware in einem Thread besprochen wird, aber nicht "sticky" ins Forum.

Das wäre ja so, als würde im "Chefkoch"-Forum, wo Leute über Kochrezepte diskutieren, als erstes "sticky" Hinweise im Forum auftauchen würden zu Pilzvergiftungen, Salmonellengefahr, Toxoplasmose, Ernussallergie und was weiß ich, nur weil es die allgemeine Gefahr gibt, dass man giftige Lebensmittel, falsch gelagerte Lebensmittel oder für bestimmte Personen ungeeignete Lebensmittel in einem Rezept verarbeiten könnte.

Solche Warnhinweise sind dort angebracht, wo sie konkret notwendig sind. Also bei einem Rezept im Chefkoch-Forum vielleicht bei einem Rezept mit Erdnüssen "für Erdnuss-Allergiker nicht geeignet". Und bei einem Thread im Arduino-Forum dort, wo konkret eine Schaltung mit netzspannungsführenden Komponenten beschrieben wird.

Arduino-Boards an sich haben keine generelle Stromschlag- oder Brandgefahr und sind ungefährlich.

Und während "Sticky" Einträge im Forum nur Platz auf der ersten Seite des Forums in Anspruch nehmen, der dann zur Darstellung aktueller Threads fehlt, gibt es ja durchaus auch hier die Möglichkeit, eigene Tutorials online zur Verfügung zu stellen, nämlich im deutschsprachigen Teil des Playgrounds:
http://playground.arduino.cc/Deutsch/HomePage
Der landessprachliche Teil des Playgrounds scheint aber wohl nur wenig genutzt zu werden.

34  International / Deutsch / Re: Empfangener hex-String in ASCII umwandleln on: September 26, 2014, 03:26:10 pm
Ich stelle mir das so vor, buffer[4] + buffer[5] zusammenfassen und mit Serial.write ausgeben. Muss ich aber wohl noch ein "0x" voranstellen, damit die beiden Werte als Hex-Wert erkannt werden? Jemand eine Idee um das elegant zu lösen?
Ziel ist es später, die Daten im lesbaren Format über ein LCD auszugeben.

Decodierung des codierten Strings "an Ort und Stelle" unter Zerstörung des ursprünglichen (codierten) Strings:
Code:
void decodeString(char* input)
{
  int i;
  for (i=0;i<strlen(input);i=i+2)
  {
    char c=input[i];
    if (c>='A') input[i/2]=16*(10+c-'A'); else input[i/2]=16*(c-'0');
    c=input[i+1];
    if (c>='A') input[i/2]+=(10+c-'A'); else input[i/2]+=(c-'0');
  }
  input[i/2]='\0';
}

void setup() {
  char input[]="FL022020202053544552454F20202020";
  Serial.begin(9600);
  decodeString(&input[4]); // input ab 4. Zeichen decodieren
  Serial.println(&input[4]);
}

void loop()
{}

Der String wird ab der vierten Stelle decodiert, und genau dort beginnt auch der decodierte String.
Vorteil: Kein zusätzlicher RAM-Verbrauch für den decodierten String.

Denkbar wäre natürlich auch eine Funktion, die den decodierten String in einem anderen char-Array ausgibt, so dass der codierte String auch noch nach der Decodierung verfügbar ist.
35  International / Deutsch / Re: ImpulsGeber mit millis() on: September 26, 2014, 01:42:43 pm
so- jetzt habe ich mich wohl wieder beruhigt.

Na bravo!

jurs hat leider im ersten Post überlesen, das ich kein delay() im Sketch
haben möchte. Sein Sketch funktioniert etwas widerwillig, aber es geht-
eben nur mit delay().

Ach was, hier und da eine kleine Änderung und das delay ist weg.

Code:
// Blinker mit einstellbarer Periodendauer by 'jurs' for German Arduino-Forum

#define LED 13

void setup() {
  Serial.begin(9600); 
  pinMode(LED,OUTPUT);
}

boolean takt(unsigned int taktDauer)
// liefert true falls seit dem letzten Aufruf ein neuer Takt begonnen hat
// Parameter taktDauer muss größer als 0 sein!
{
  static unsigned long prevMillis;
  if (taktDauer==0) // Sonderfall taktDauer==0 behandeln
  {
    prevMillis=millis();
    return true;
  }
  boolean result=false;
  while( millis() - prevMillis >= taktDauer){
    prevMillis += taktDauer;
    result=true;
  }
  return result;
}

unsigned int dauer;
unsigned long taktBeginn;
void loop()
{
  dauer=analogRead(A0)*4; // Dauer mit Poti setzen zwischen 0 und 4*1023= 4092 ms
  if (takt(dauer)) taktBeginn=millis(); // ein neuer Takt beginnt
  if ((millis()-taktBeginn)<30) // in den ersten 30 ms des neuen Taktes
    digitalWrite(LED,HIGH);
  else
    digitalWrite(LED,LOW);
}
36  International / Deutsch / Re: ImpulsGeber mit millis() on: September 26, 2014, 05:34:53 am
ich möchte keine überlappenden Impulse. Entweder eine HighFlanke von 30ms ODER
eine HighFlanke von 50ms.
Die LowFlanke soll "frei" veränderbar sein.

OK, wenn Dich ein delay(30) oder delay(50) im Programmablauf nicht weiter stört und nur ein Vorgang zu timen ist, kannst Du es auch mit delay machen. In dem Fall sogar mit fast derselben Art der Taktgenerierrung, zu der ich heute bereits einmal ein Beispiel gepostet hatte.

Hier dann angepaßt auf Deinen Anwendungsfall:
Code:
// Funktionen im Takt abarbeiten, Demo by 'jurs' for German Arduino-Forum
void setup() {
  Serial.begin(9600);  
}

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

boolean shortImpulse=true;
unsigned int dauer=3000;
void loop()
{
  dauer=analogRead(A0)*60; // Dauer mit Poti setzen zwischen 0 und 60*1023=61380 ms
  if (takt(dauer))
  {
    shortImpulse=!shortImpulse; // Impulse wechseln ab
    if (shortImpulse)
    {
      Serial.println("30");
      delay(30);
    }
    else
    {
      Serial.println("50");
      delay(50);
    }
  }  
}

Der Beispielcode gibt nur etwas auf Serial aus.
Wenn Du Pins vor dem delay auf einen Wert und nach dem delay auf einen anderen Wert setzen möchtest, kannst Du das vor/nach dem delay leicht einfügen.

Beim "ODER" wußte ich nicht, wonach Du entscheiden möchtest, ob ein 30 oder 50 ms delay kommen soll, ich habe es daher mal auf "immer abwechselnd" eingestellt.

Wenn ich Dich richtig verstanden habe, dann blokiert "dalay()" also auch hier?

Ja natürlich: delay blockiert den Programmablauf immer, wenn es ausgeführt wird.
Und jede Art "busy waiting" mit while-Schleifen blockiert den Programmablauf ebenfalls.
37  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.
38  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
}
39  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.
40  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.
41  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?
42  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)
43  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!
44  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.

45  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);
Pages: 1 2 [3] 4 5 ... 220