Skriv en mening, tryck Enter och den visas på CD-Skivan med Stroboskop.
Kanske vill du kombinera detta experiment med
en realtidsklocka och du kan visa tiden.
Temperatur, Fuktmätare, barometer...
Kopplings har en självhäftande kudde under
som jag klistrat i centrum av fläkten.
Var noggran så du får den i centrum.
Har dragit ut en del stift från en stiftlist.
Fyra stift går ner i kopplingsplattan, lätt att byta skivan.
Stiftlistens ytterkanter är limmade mot CD-skivan med superlim
Varning låt limmet torka innan du startar skivan.
Min bildskärm har prickar av superlim.
Akta också dina ögon.
Index skivan är utklippt från baksidan av ett block.
och limmad med superlim.
Skivan snurrar motsols.
När index passerat läsgaffel med ca 1 till 2 cm,
då ska lysdioden vara övanför 'A'
Lysdioden är en 10mm klar vit.
Den stora linsen ger mycket bra ljusbild.
Jag vet, grymt. Skruv in i kopplingsdäckets hål.
Postit lappen ger skugga från 700 lysdioder som vi har i taket.
Fläkten har en egen strömförsörjning.
Med en spänning från 3.5 till 5 Volt snurrade fläkten 10-15 varv per sekund
Alla bilder går att klicka på för att visas som stora.
Denna finns att ladda ner, längst ner på sidan i pspimage-format
Corel PaintShop Pro X3
/*
Experiment med Arduino Uno R3
och en läs-gaffel för att tända och släcka en lysdiod
synkroniserat, som en Stroboskop.
http://sv.wikipedia.org/wiki/Stroboskop
VIKTIGT!!
Ladda programmet till UNO-kortet innan du kopplar lysdioden.
Lysdioden är kopplad utan motstånd, för att den ska lysa starkare.
lysdioden får ca: 2% av en PWM som ström försörjning.
Detta gör att det går med överspänning.
http://sv.wikipedia.org/wiki/PWM
En aktiv läs-gaffel.
Koppla Uno GND till modul GND
Koppla Uno 5V till modul VCC
Koppla Uno 2 till modul D0 eller modul A0
En Lysdiod.
Anod till 5V
Katod till Uno 4
När jag provade detta kom det någon typ av störning
från D0, vilket resulterade i räknefel.
Detta räknefel försvann när jag kopplat ett RC-filter efter D0.
RC-Filtrets komponenter: 10 Kohm motstånd och 500 pF kondensator
Detta fel gäller inte A0-utgången, som fungerade felfritt i detta experiment.
ps. Provade mot en bordsfläkt, störningarna från fläkten låste Uno-kortet
*/
#define pinneGaffel 2
#define pinneLED 4
#define VisaTid 1500 // 1500=1,5 Sekunder Visas varje tecken
unsigned long SenasteGaffelTid;
unsigned long NuGaffelTid;
unsigned long UppdateraTid;
unsigned long MellanTid;
unsigned long IndexLangd;
boolean Index;
unsigned long VisaNr;
unsigned long Mening[150];//Meningen kan max var 150 tecken, ändra om du vill
int MeningPekare;
//Det är ca 10 enheter mellan varje tecken
//Justera här om om tecknet inte visas i centrum.
// ABCDEFGHI
//JKLMNOPQRS
//TUVWXYZÅÄÖ
//!?-/.,(MELLANSLAG)
unsigned long TeckenPlats[40] = {
0, 8, 18, 29, 40, 50, 60, 70, 80, 90,
100, 110, 120, 130, 140, 150, 160, 170, 181, 192,
202, 212, 222, 233, 244, 255, 265, 277, 287, 298,
307, 316, 323, 330, 336, 343, 353
};
void setup() {
Serial.begin(9600);
MeningPekare = 0;
VisaNr = 0;
pinMode(pinneGaffel, INPUT_PULLUP);
pinMode(pinneLED, OUTPUT);
digitalWrite(pinneLED, HIGH);
//Denna startar ett avbrott om signal kommer från läs-gaffel
attachInterrupt(0, Gaffel, RISING);
SenasteGaffelTid = micros();
UppdateraTid = millis() + VisaTid;
}
void loop() {
if(Index){
//Denna gör en fördröjning mellan läs-gaffel och att lysdioden tänds.
for (int i=0; i <= Mening[VisaNr]; i++){
delayMicroseconds(IndexLangd);
}
//Tänder lysdioden och låter den lysa i 100 miljondels sekund
digitalWrite(pinneLED, LOW);
delayMicroseconds(100); //Denna kan andra värden, prova om du vill. (PWM-tid)
digitalWrite(pinneLED, HIGH);
Index = false; //Redo för nästa avläsning från läs-gaffel.
}
if(millis() > UppdateraTid){
UppdateraTid = millis() + VisaTid; //Uppdatera värden var x:de sekund
if(Mening[VisaNr] == 0){
VisaNr = 0;
//Mening[0] = 0; //Ha med denna om meningen inte ska repetera.
}else{
VisaNr = VisaNr + 1;
}
}
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
if(inChar == '\n'){//Return(Ny rad)
Serial.print("ok: ");Serial.println(MeningPekare);
Mening[MeningPekare] = 0;
MeningPekare = 0;
UppdateraTid = millis() + VisaTid; //Set till att första tecknet visas i tre sekunder
}else{
int Plats = GetTeckenPlats(inChar);
if(Plats != -1){
Mening[MeningPekare] = (unsigned long)Plats; //Lägg till tecknet i meningen.
MeningPekare++;
}else{
//Tecknet finns inte med på CD-Skivan.
//Visar denna 'Tecken ej med: 13' så är det en del av Return.
Serial.print("Tecken ej med: ");Serial.println((int)inChar);
}
}
}
}
//Avbrottsrutin(Interrupt)
void Gaffel() {
//Spara senaste tiden som förgående tid, för att mäta till nästa signal
SenasteGaffelTid = NuGaffelTid;
NuGaffelTid = micros();
MellanTid = NuGaffelTid - SenasteGaffelTid; //MellanTid är ett varv på CD-Skivan.
IndexLangd = MellanTid / 480; //Dela ett varv med 480(ca: 48 tecken på CD-Skivan.)
Index = true;
}
//
//Denna funktion tar emot ASCII-tecknet som skickas till Uno kortet
//från datorn, och returnerar vilket tecken som ska visas CD-skivan.
//Returnerar -1 om inte tecknet är med på CD-skivan.
int GetTeckenPlats(char c){
if(c >= 'a' && c <= 'z'){
return TeckenPlats[c-96];
}
if(c >= 'A' && c <= 'Z'){
return TeckenPlats[c-64];
}
if(c == -59 || c == -27){//Åå
return TeckenPlats[27];
}
if(c == -60 || c == -28){//Ää
return TeckenPlats[28];
}
if(c == -42 || c == -10){//Öö
return TeckenPlats[29];
}
if(c == ' '){
return TeckenPlats[36];
}
if(c == '!'){
return TeckenPlats[30];
}
if(c == '?'){
return TeckenPlats[31];
}
if(c == '-'){
return TeckenPlats[32];
}
if(c == '/'){
return TeckenPlats[33];
}
if(c == '.'){
return TeckenPlats[34];
}
if(c == ','){
return TeckenPlats[35];
}
return -1;
}