Moinsen,
seit dem ich das Arduino Uno Board habe mache ich vielerlei Blödsinn
damit.
Z.B.: http://www.youtube.com/watch?v=-ixVwQksBXQ
Nerdish halt :)
Problem: Wie bekomme ich es rein rechnerisch hin, dass die Spalten immer
annähernd gleich breit sind egal wie schnell sich das Rad dreht, sodass
die Gesamtlänge der Schrift sich im Grund nicht verändert?
Ich habe lange nachgedacht aber keine Lösung gefunden. Hier der Code:
Marco De8msh schrieb:> Problem: Wie bekomme ich es rein rechnerisch hin, dass die Spalten immer> annähernd gleich breit sind egal wie schnell sich das Rad dreht, sodass> die Gesamtlänge der Schrift sich im Grund nicht verändert?>> Ich habe lange nachgedacht aber keine Lösung gefunden.
Das wird so auch nichts.
Du brauchst zusätzlich noch einen Sensor, der auslöst, wenn der Arduino
bei jeder Umdrehung immer wieder in der gleichen Position ist.
Damit misst du die Zeit, die eine Umdrehung braucht.
Und mit dieser Zeit kannst du dann ausrechnen, wie lange jede 'Spalte'
leuchten muss, wenn du in einer kompletten Umdrehung x Spalten
unterbringen willst.
Hi,
ich habe einen Sensor: auf der anderen Seite ist ein Magnet:
pinMode(buttonPin, INPUT);
Klar. Sonst würde die Schrift noch nicht mal bei "Null" beginnen. Der
Linke PAC zeigt sozusagen den Startpunkt.
Marco De8msh schrieb:> Hi,>> ich habe einen Sensor: auf der anderen Seite ist ein Magnet:>> pinMode(buttonPin, INPUT);>> Klar. Sonst würde die Schrift noch nicht mal bei "Null" beginnen.
Aber du wertest ihn nicht aus um die Drehzahl des Rades festzustellen.
Du brauchst ein Zeitmanagement!
Auch wenn du dich bis jetzt erfolgreich davor 'gedrückt' hast, ohne
Timer und Interrupts kommst du jetzt nicht mehr weiter.
Und die delays ... vergiss sie am besten gleich wieder. Das führt zu
nichts.
Ok, dann raus mit den Karten: wo fange ich an?
Ich habe das Board erst sehr sehr kurz. Wie implementiere ich einen
Timer oder ähnliches? Es steckt der ATMEGA328 drinnen.
Ich hatte auch schon das Gefühl, der hier eine Grenze im Hardcode
steckt.
Hallo,
man kann natuerlich auch warte anpassen.
Dazu muss man aber die Zeit messen koennen, die eine Umlauf des Rades
dauert.
Also einen Timer laufen lassen, den passend auslesen ( Interrupt vom
Schalter )und wieder auf 0 zuruecksetzen.
Wenn sich die Drehzahl verdoppelt halbiert sich warte in etwa.
1
for (int i=stelle; i <= stelle+134; i++){
2
3
digitalWrite(10, ledChar1[i]);
4
digitalWrite(9, ledChar2[i]);
5
digitalWrite(8, ledChar3[i]);
6
digitalWrite(7, ledChar4[i]);
7
digitalWrite(6, ledChar5[i]);
8
digitalWrite(4, ledChar6[i]);
9
digitalWrite(5, ledChar7[i]);
10
11
12
delayMicroseconds(warte);
13
}
Ein einzelner Schleifendurchlauf dauert zum Beispiel 1000 mueS. Dann
sind es 150 fuer die Anzeige und 850 fuer das warten.
Bei doppelter Drehzahl muesste ein Durchlauf 500 mueS dauern.Dies
entspricht einem Wert fuer warte von 350.
Sei warte =850 fuer eine Umlaufzeit T0 (=1/f ) von 1 U/s die Du mit
deinem Markierungsschalter messen kannst.
Wenn die Drehzahl nun auf T=0.5 U/s steigt ergibt sich fuer warte 350.
Wie zu rechnen?
Dein TGesamt ist T*Faktor , dann uebrstreichen die Led immer den
selben Bogen/Winkel
Dann ist warte ist Tgesamt-150
Der Faktor ist mit den angegebenen Werten 1000 [mueS * s]
Tgesamt = 1000 * 1 U/s
Bei T = 0,5 U/s
Tgesamt = 1000 * 0,5 U/s = 500
Wenn man den Timer geschickt einstellt ( prescale ) , braucht man diesen
Faktor auch nicht, sondern kann direkt Timerwert-150 rechnen
Oder wie hier:
http://www.freeduino.de/forum/software/fahrradtacho-programmlogik-richtig
ms abfragen
Mich wundert, dass das überhaupt funktioniert.
Sehe ich das richtig, dass du sieben Arrays mit etwa 135 Elementen vom
Datentyp int hast, um Nullen und Einsen zu speichern? Ein int ist zwei
Byte gross => 7 x 135 x 2 = 1890 Byte
..und dein µC hat "nur" 2KByte RAM...
Der Datentyp char wäre besser, oder?
Ok ok, Leute. Ich haue nochmal Grips in die Kiste und melde mich mit
einem neuen Ansatz. Der Erste klappt ja, aber ist zu starr. Ich kann ja
auch keinen Strings definieren usw. Also: l8er.