Rotation erkennen

!! Weil ich die dann außerhalb der Funktion nicht überschreiben kann? denn die ist da ja nicht mehr Deklariert?

Frage selbst beantwortet.
Versuche halt mal von außen auf die Variable zu greifen.

BTW:

Du kannst mit statics z.b auch sowas machen:

static unsigned long last_int= wert;

Wie bei globalen Variabeln

Das wird aber nur einmal beim ersten Aufruf der Funktion (d.h. beim Anlegen der Variablen) ausgeführt. Danach nicht mehr. Ist also nur eine einmalige Initialisierung.

Das wird noch was mit dir Muecke. Findet Fehler in Gunterb's Code :sunglasses:

Was aber noch keinen gestört hat:

volatile unsigned long drehdauer wird, während sie zwei mal in print verwendet wird, eventuell mehrfach geändert.
Dadurch passen nicht nur die zwei ausgegebenen Werte nicht zusammen, sondern die können sogar ganz unsinnig werden, da eine long Variable (4 byte) in 4 Schritten gelesen wird.

volatile unsigned long drehdauer;
void loop () {
  unsigned long tempdrehdauer;
  noInterrupts();
  tempdrehdauer = drehdauer;
  interrupts();
  Serial.print ( 60000 / tempdrehdauer); Serial println ( " RPM");
}

LED Pin 13, die leuchtet immer :frowning:

Erstmal sollte state kein int sein, sondern ein boolean. Dann gilt nämlich das obige Problem nicht.
Zweitens siehst du die Led nur bis ca 600 RPM blinken. Bis 2000 evtl. noch flimmern.

Ist auch die Frage, wie schnell loop() ist, bei deinen vielen Ausgaben mit 115200 Bd.
Mehr als max. einmal je Interrupt ist eigentlich zu viel, oder ?
Was ist, wenn du statt "state" einen Merker "neuerInterrupt" setzt, den in loop abfragst, und nur dann
die Led toggelst, eine Ausgabezeile produzierst (und den Merker wieder löschst) ?

Michael, du hast natürlich recht.

Aber sowohl die Serielle Ausgabe als auch die "blinkende" LED dienen ja nur als "Debugger". Quasi um zu sehen, was der ISR so treibt. In einer fertigen Version wird beides nicht mehr nötig sein.

wow, hier steigt ja eine Party, muss mich erst mal durch alles durcharbeiten dann melde ich mich wider.

@Michael: das nehme ich mal als Kompliment :grin:

michael_x:
Das wird noch was mit dir Muecke. Findet Fehler in Gunterb's Code :sunglasses:

@rudirabbit: ja manchmal beantworte ich meine Fragen selbst, bzw. ich versuche es, da denke ich dann Laut :grin:, nihct immer ist das was ich denke auch richtig oder nur zum teil richtig, da ich mit dem Programmiren und er Hardware so meine "Verständigungs-" Schwierigkeiten habe dachte ich ich bringe die Frage und Antwort mal mit ein. :wink:

@Michael: wenn ich deinen Code richtig interpretiere schaltest du die interrups aus liest den Wert der Interrups ein und Speicherst Ihn aber in einen anderen Variablen ab.
Machst dann die Interrups wider an und berechnest die RPM und gibst diese aus?

so kann sich das Programm nicht beim Rechnen verschlucken wenn der Inerrup sich wehrend dessen verändert.

Wie ist das wenn der Wert in der zeit sich aber verändern würde, das würde das bekommt dann der Arduino nicht mit, sprich in dem Fall würde mir ein Signal verloren gehen?

guntherb, hat jedoch recht das die Ausgabe (Text & LED) nur für mich da ist das ich auch was sehe, ist etwas Langweilig den Sensor auszulösen und nichts zu sehen ob es geht oder nicht :wink:

So dann ist das schnelle erkennen nun geschafft, dann mache ich mich mal dran 16 LED`s mit einer extra Stromversorgung zu versehen und dann über den Arduino anzusteuern.

wenn ich das habe, kommt die nächste Hürde :slight_smile:

Danke schon mal.

so ich habe nun mir Gedanken gemacht wie ich 16 LED`an einem Uno anschließen könnte.

Jedoch habe ich da noch Probleme:

  1. ich habe den zweiten (74HC595N) nicht richtig angeschlossen
    ich wies das man zwei miteinander verbinden kann, wies aber nicht
    wie ich das machen muss.

  2. ich habe keinen Plan wo ich die 6V an Arduino Schaltbild anschließen muss.
    in natura würde ich einen Kleien Stecker machen und das in die Schwarze
    Buchse stecken :smiley:

Bauteile die ich verwenden würde:

  • Arduino UNO
  • U1 - U2 ==> 74HC595N
  • C1 - C2 ==> 100N Keramik
  • Q1 - Q16 ==> BC327-40
  • R1 - R16 ==> 150 Ω
  • LED1 - LED 16 ==> Weise LED`s
  • VCC ==> 4 x 1,5V Batterie

ich habe die Fritzing Datei mit angehängt:


Bildschirmfoto 2015-04-28 um 22.07.54.png

EDIT: ich glaube ich wies jetzt wie ich die beiden "74HC595N" miteinander verbinden muss.


Bildschirmfoto 2015-04-29 um 00.06.16.png

Fritzing Datei: LED-Rotation-Bild_2.fzz.zip

LED-Rotation-Bild.fzz.zip (24.4 KB)

LED-Rotation-Bild_2.fzz.zip (24.6 KB)

noInterrupts() bzw. interrupts()
verhindern nur, dass in der Zwischenzeit loop() durch einen Interrupt unterbrochen wird. Solange sind dann auch volatile Variable eingefroren. Diese zwei Funktionen sind übrigens Makros, die in Wirklichkeit nur einen Prozessortakt lang brauchen, da sollte man nicht am falschen Ende sparen :wink:

Wie ist das wenn der Wert in der zeit sich aber verändern würde, das würde das bekommt dann der Arduino nicht mit, sprich in dem Fall würde mir ein Signal verloren gehen?

Dass ein Interrupt evtl. nicht sofort, sondern erst kurz später ausgeführt wird (z.B. wegen eines anderen Interrupt) kommt vor und macht nichts, wenn die Verzögerung so kurz ist, dass höchstens ein Auslöser-Ereignis für den Interrupt wartet.

Muecke:
So dann ist das schnelle erkennen nun geschafft, dann mache ich mich mal dran 16 LED`s mit einer extra Stromversorgung zu versehen und dann über den Arduino anzusteuern.

Hast du andere POV Projekte schon mal angesehen?
Die machen die Stromversorgung meist mit Schleifringen.

guntherb:
Hast du andere POV Projekte schon mal angesehen?
Die machen die Stromversorgung meist mit Schleifringen.

ich habe mir das schon das ein oder andere mal angeschaut, leider hatte ich bisher noch keins gefunden in dem ich den exakten Aufbau gefunden habe wie die das machen, hatte bisher nur so fertige teile gefunden :-(.

bei mir ist das zwar eine Fahrrad Felge jedoch ist die nicht am Fahrrad sonder ist Mobil, soll bedeuten das ich dich in der Hand habe bzw. einen Stab an dem die Felge befestigt ist.

unter dem Begriff "POV" findet man richtig viel, Danke.

Was ich nur nicht ganz verstehe die haben oft die LEDs direkt am Arduino angeschlossen, ich für meinen teil habe da einen Transistor zwischen geschaltet um eventuelle Höhere Ströme verwirklichen zu können, denn je nach der RPM Leuchtet so eine LED ja nur verdammt kurz auf, und wird somit nicht Ihre volle Leichtkraft entwickeln können, daher dachte ich das ich mit 20mA anfange und wenn ich merke das die zu schwach sind, dann mich steigern könnte nach oben, natürlich muss man dann auch einen Sicherung in den Code einbauen das erst ab einer bestimmten Drehzahl die LEDs eingeschaltet werden dürfen.

Was sagt Ihr denn zu meinem versuch die LED?s zu verkabeln? (habe mir überlegt das noch zu erweitern auf ca. 30 LED`s)

Hallo Mücke,

Die zweite Version ist eher richtig, in den ersten IC werden die Daten in Pin14 reingeschoben und kommen nach 9 Takten am Pin 9 raus und das wird wieder in Pin14 von IC 2 reingeschoben.

In beiden Schaltbildern fehlt jedoch eine Verbindung der Emitter der Transistoren zu VCC, so wird keine Led leuchten.

PS: So schnell mal einen fehlerfreien Code zu posten ohne es selbst zu testen ist gar nicht so einfach. Jurs ist da der Meister aller Klassen.
Oft übersieht man einfach mal was, oder macht einen Denkfehler.
guntherb hat immer kompetente Antworten, im Automotive Hardwarebereich sowieso, aber auch Tip's bei der Softwareentwicklung. (Linerare Interpolation v.s. Polynome beim Erfassen "krummer" Funktionen)

Denke das soll mal gesagt werden.

he he, stimmt die Leitung zum VCC habe ich schon wider vergessen, die verschwindet immer mal wider, warum keine Ahnung, ist jetzt wider drin.

Ich kann so jetzt auch 4 von den IC`s hintereinander schalten?

Das bedeutet für mich, ich habe nur 3 Leitungen am Arduino Blockiert kann aber extrem viel LED`s ansprechen so.

He he, das finde ich cool.

Dann muss ich mich mal dran machen und das zusammen bauen.
Irgend wie fehlt mir ein Steckbrett, das finde ich nicht mehr ;(

ps. das mit dem Code ist immer so eine Sache ja leider, du hast aber Recht Jurs ist das spitze drin,
Jurs ist einer der ersten gewesen mit dem ich Kontakt hatte als ich den Arduino hatte, hat mir die Steuerung für die TaT Fotos geschrieben, mit der Arbeite ich heute noch ich mache nur das Turm herum das was einfach ist, udn das ist für mich schon schwer ;-(, naja, jetzt muss ich das mal zusammen bauen das ich die LED`s ansprechen kann dann muss ich das mal etwas testen und herumspielen damit, dann sieht man weiter.

Wenn ich was zusammen gebaut bekommen habe melde ich mich wider.


Bildschirmfoto 2015-04-29 um 19.57.08.png

EDIT: das mit dem 100N Keramik stimmt aber? der wird benötigt zum Glätteten der Signale das keine Störungen auftreten.

LED-Rotation-Bild_2.fzz.zip (25.4 KB)

das mit dem 100N Keramik stimmt aber? der wird benötigt zum Glätteten der Signale das keine Störungen auftreten.

Jepp, frage mal Eisebaer :slight_smile:

rudirabbit:
guntherb hat immer kompetente Antworten, im Automotive Hardwarebereich sowieso, aber auch Tip's bei der Softwareentwicklung. (Linerare Interpolation v.s. Polynome beim Erfassen "krummer" Funktionen)

Denke das soll mal gesagt werden.

Danke für die Fürsprache, aber ich fühlte mich nicht angegriffen.
Menschen machen Fehler, das ist so.

(Nur Jurs macht keine :slight_smile: )

ich von meiner Seite muss das auch mal los werden

IHR SEIT ALLE SPITZE

Und Ihr helft mir immer so extrem viel, Danke dafür.

guntherb:
Danke für die Fürsprache, aber ich fühlte mich nicht angegriffen.

Du warst nie angegriffen, das meinte ich auch nicht.

Aber etwas positives zu Posten an Leute die wirklich Ahnung haben, ist ab zu besser als Karma++
Denn das motiviert, und diese Leute lesen im Forum eher die (dummen) Fragen. :wink: :wink: :wink:

habe am WE die LED`s und co. zusammen gelötet, (man ist das Hässlich bei mir geworden)

Also ich dann 30 LEDs zusammen hatte mit allem darum und dran, musste ich feststellen das manche LEDs auch Ohne die GND Leitung leuchten können, ich glaube da ist der Transistor zu Heiß geworden, ...

Naja, und manche LED`s gehen auch gar nicht. sch**** jetzt habe ich mir ein Paar Steckbretter bestellt, auf den ich das testen werde, ... ist glaube ich besser.

Bin also noch dran.

So ich habe jetzt 8LED`s auf zwei Steckbretter aufgebaut. :grin:
ich mag die Stechbretter ja echt doch dafür ist das irgend wie ein Krampf.


8_LED.jpg (284 KB)

Ich habe mir jetzt verschiedene Codes angeschaut um die LEDs anzusprechen,
die Klappen auch alle.

Die haben alle in einem Array pro Zeile immer 8 Zahlen drin stehen und schalten dann
die LED`s damit an und aus.

Ich komme da nicht so ganz klar damit, ... :cry:

Würde gerne ganz langsam von vorne und ganz klein anfangen.

Was ich verstanden habe ist das ich durch einfaches Ein und Ausschalten der Pins hier nicht weit komme, denn ich habe 8 LEDs an 3 Pins. also muss das etwas anders gehen.

habe auch verstanden das wenn einen "Code" an den IC senden muss und der das dann umsetzt.
Doch das Senden des Codes ist mir schleierhaft. :cry:

Hat mir jemand da was Leicht verdauliches? und kleines?
mit dem ich anfangen kann das zu verstehen und mich dann steigern kann?

EDIT: habe z.B. den Code Hier --> doch ich verstehe nicht was die Funktion macht. ich verstehe da nicht mal Bahnhof, denn da wüste ich wo der Anfang und das Ende ist, das habe ich hier noch nicht mal gefunden.

const int latchPin = 8;                                    // 74 HC 595 --> PIN 12 
const int clockPin = 12;                                   // 74 HC 595 --> PIN 11 
const int dataPin = 11;                                    // 74 HC 595 --> PIN 14 

char vals [8][8] =                                         // Array wann welche LED an bzw. aus sein soll
{
  {'0','1','2','3','4','5','6','0'},
  {'4','2','2','3','5','7','0','3'},
  {'0','5','4','0','2','2','3','6'},
  {'2','7','2','6','6','4','1','4'},
  {'7','4','5','5','6','3','0','3'},
  {'3','3','5','7','7','1','4','3'},
  {'6','2','7','1','0','6','4','2'},
  {'5','1','3','0','0','5','7','6'}
};

void setup() 
{
  pinMode(latchPin, OUTPUT);                               //  Arduino Pin als Ausgang definiren  
  pinMode(dataPin, OUTPUT);                                //  Arduino Pin als Ausgang definiren   
  pinMode(clockPin, OUTPUT);                               //  Arduino Pin als Ausgang definiren  
}

void loop()
{
 for(int i = 0; i < 8;i++)                                 // Array Ebene 1 Hochzehlen 
 {
  for(int j=0; j< 8; j++)                                  // Array Ebene 2 Hochzehlen 
  {
   registerWrite(vals[i][j], HIGH);                        // Fungzions aufruf fue Array  und Signal auf HIGH 
   delay(100);                                             // pause fue 100 ms 
  }  // END FOR 
 }   // END For 
}    // End LOOP 

void registerWrite(char pin, int whichState)               // Fungzion ?? keinen plan was da pasirt. 
 {
  int bitToSet = pin - 48;
  byte bitsToSend = 0;
  digitalWrite(latchPin, LOW);                                 // IC PIN 12 (latchPin) auf LOW setzen
  bitWrite(bitsToSend, bitToSet, whichState);                  // Schreibt ein Bit einer numerischen Variable   ** Was auch immer das heisen mag
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);           // ja ne ist klar, --> http://www.arduino.cc/de/pmwiki.php?n=Reference/shiftOut
  digitalWrite(latchPin, HIGH);                                // IC PIN 12 (latchPin) auf HIGH setzen
 }