Hallo
Obwohl mein eigenes Projektor-Projekt im Moment eingemottet ist habe ich mal einen kleinen Test mit dem asuro gemacht:
Bild hier
Der Laserpointer (6€ beim C) ersetzt die FrontLED. Da mein Laser bereits einen 33Ohm-Widerstand eingebaut hat (kann man dann bequem mit 5V/18mA betreiben) habe ich den Vorwiderstand der LED überbrückt (R9 220R). Nun kann ich den Laser mit der asuro-Library schalten. Gepulste 18mA sind für den Mega8 unbedenklich.
Als Synchronisationssensor verwende ich die Liniensensoren. Bei einem direkten Treffer mit dem Laserstrahl (keine Ahnung ob das den Sensoren schadet!) liest LineData() Werte von über 1000 ein. Da der Pegel an den Pins (PC2+PC3) ab ca. 400-500 als High erkannt wird (ausprobiert) verzichte ich auf eine analoge Auswertung und prüfe einfach, ob einer der Pegel High ist:
while(!(PINC & (1<<PC3 | 1<<PC2)));
Diese Schleife wird solange ausgeführt bis der Laserstahl einen der beiden Sensoren trifft. Da zwischen Bild und Sensor ein kleiner Abstand sein soll, wird dann der Laser kurz ausgeschaltet. Nach dieser kurzen Wartezeit werden die 16 Bit des Bitmusters von MSB nach LSB über den Laser rausgeblitzt. Anschliessend folgt nochmals eine kurze Dunkelphase am Zeilenende bevor der Laser erneut eingeschaltet wird. Nun wird das Bitmuster neu gesetzt und der Ablauf startet erneut mit "Warten auf Laser trifft Sensor":
Code:
// Vorstudie zu einem asuro-gesteuerten Laserprojektor 8.10.08 mic
#include "asuro.h"
int main(void)
{
unsigned char bit; // Zähler für die einzelnen Bits
unsigned int j, bitmuster; // Hilfvariable, 16 Bit Muster
Init (); // Initialisieren nie vergessen!
for(j=100; j-- >0; Sleep(36)); // Kurz warten
FrontLED(ON); // Laser einschalten
StatusLED(RED); // besser zuviel als zuwenig kommentieren
bitmuster=0b1100110010101010; // Startbitmuster festlegen
while(1) // ausführen bis die Akkus leer sind
{
while(!(PINC & (1<<PC3 | 1<<PC2))); // Warten auf Startimpuls Liniensensoren
FrontLED(OFF); // Laser kurz ausblenden (Zeilenanfang)
for(j=50; j-- >0; Sleep(36));
bit=15; // 16 Bits werden ausgegeben, MSB zuerst
do // also muss der Rotor clockwise drehen
{ // Bitmuster blinken
if(bitmuster & 1<<bit) FrontLED(ON); // Bit gesetzt/nicht gesetzt?
else FrontLED(OFF); // Laser entsprechend setzen
Sleep(20); // Diese Zeit bestimmt die Bitlänge!
}while(bit--); // Abbrechen nach Bit0
FrontLED(OFF); // Laser kurz ausblenden (Zeilenende)
for(j=200; j-- >0; Sleep(36));
//bitmuster++; // Neues Bitmuster setzen
FrontLED(ON); // Laser ein für Warten auf Zeilenanfang
}
}
Benutzer der orginalen CD-Library müssen die 36 in den Sleep()-Befehlen nach 72 ändern, bzw. die Scheifen anpassen.
Das sieht dann so aus:
Bild hier
http://www.youtube.com/watch?v=ehH0vq82tig
Bild hier
Ein Ausschnitt aus dem Video (ca. 7.Sek) zeigt deutlich das Bitmuster :)
Leider ist das Video nicht sehr beeindruckend. Es fehlt natürlich noch die konstante Drehzahl des Rotors, die Ausgabe mehrerer Zeilen und der Bitmustergenerator, aber man kann stellenweise erkennen wie es aussehen soll. Es gibt noch viel zu erforschen.
Gruß
mic
Lesezeichen