VLCinstruct

Leren van elkaar

Anders

Glow in the POV

Inleiding

Het klinkt vrij simpel: maak een project met een arduino. Tenminste, dat dacht ik. Maar er komt erg veel bij kijken. Onze opdracht was een project maken met de arduino, en het zelf programmeren. Het mocht van alles zijn. Ik heb toen gekozen om een POV wand te maken. Dit is een bord waar LEDjes opzitten die knipperen. Als je met het bord gaat zwaaien, zie je een tekst verschijnen. Ik vond dit een super gaaf project en ben het gaan proberen. Voor het project heb ik de site instructables gebruikt.

Hoe werkt het?

POV wand staat voor Persistence of Vision. Of te wel een optische illusie waarbij meerdere afbeeldingen samen worden gevoegd en als 1 afbeelding gezien word door het menselijk brein. Denk maar aan een ventilator. Meerdere bladen bewegen snel achter elkaar, en we zien een doorzichtige cirkel. Maar dat is het eigenlijk helemaal niet! Maar waarom zien we dat eigenlijk?

Het oog heeft een bepaalde tijd nodig om de informatie uit een afbeelding op te pikken. Die tijd is ongeveer een tiende seconde. Als de afbeelding sneller voorbij gaat dan dat, pakt het oog de informatie niet goed op. Bij een ventilator bewegen de bladen sneller dan een tiende van een seconde. Daardoor voegt het oog de onvolledige informatie van de bladen die bewegen als een afbeelding samen. Daardoor zien we dus die cirkel. Vroeger werd dit ook bij tekenfilms gebruikt. Meerdere afbeeldingen werden snel achter elkaar afgespeeld, waardoor het leek alsof de afbeeldingen bewogen.

Zo werkt de POV wand dus ook. De lichtjes knipperen te snel voor je brein om de informatie te verwerken. Dus worden de knipperende lichtjes als een geheel gezien. Daardoor zien we een tekst verschijnen. Hiervoor gebruiken we een schema waarmee we de plaats van de knipperende lichtjes kunnen bepalen. Die ziet er ongeveer zo uit:

Bij dit project hebben we 7 LEDjes. Een letter is dus 7 LEDjes lang en 5 LEDjes breed. Cijfer 1 staat voor aan, cijfer 0 staat voor uit. Als de LEDjes dan gaan knipperen, gaan ze 5 keer aan of uit. Hierdoor ontstaat een letter. Dat zien we hier:

We kunnen met deze manier alle letters van het alfabet maken. Nu we meer snappen over hoe de POV wand werkt, gaan we nu praten over wat we er voor nodig hebben.

Benodigdheden

Voor het de officiële POV wand  van instuctables hebben we het volgende nodig:

  • 7 LEDS ( maakt niet uit welke kleur)
  • 7 weerstanden van 220 ohm
  • Arduino UNO bord
  • Breadbord
  • 9V batterij met batterij houder
  • 1 kabelbinder
  • 8 Arduino draadjes
  • Nietjes

Ik heb het iets anders aangepakt, omdat in mijn instantie ik gebruik heb gemaakt van een glow in the dark pijp en een platen speler. Dit leg ik later uit. Zelf heb ik ook geen nietjes, kabelbinder, batterij en Breadbord gebruikt. Dit waren mijn benodigdheden:

  • Arduino UNO
  • 7 weerstanden van 220 ohm
  • 7 elektronica draadjes
  • LED board
  • 7 LEDS ( blacklight)
  • Platenspeler
  • Pvc pijp
  • Glow in the dark verf
  • Soldeer tin
  • Soldeerbout

Natuurlijk hebben we ook nog de code nodig. Die zag er als volgt uit:

Written by Ahmad Saeed on 22 August 2015




 This code is capable of displaying the following characters;

 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ .-_!%&#$,()@?

*/




//////////////////// Message to Customize  ///////////////////

#define msgLength 11                                       ///

String msgBody = "Ahmad Saeed";                            ///

//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////


#define delayInChar 3

#define delayBetweenChar 5

#define LED1 1

#define LED2 2

#define LED3 3

#define LED4 4

#define LED5 5

#define LED6 6

#define LED7 7


byte msgCode[(5 * msgLength) + 10];

boolean pintState;

int columnNum = -1;

String charToWrite;


void setup() {

  msgBody.toUpperCase();

  pinMode(LED1, OUTPUT);

  pinMode(LED2, OUTPUT);

  pinMode(LED3, OUTPUT);

  pinMode(LED4, OUTPUT);

  pinMode(LED5, OUTPUT);

  pinMode(LED6, OUTPUT);

  pinMode(LED7, OUTPUT);

}


void loop() {

//// Convert all text to binary array ////////////////////////

  if ( columnNum == -1 ) // This block needs to be done once//

  {                                                        //

    for (int c = 0; c < (msgBody.length()); c++)  {         //

      //Separate the following character                    //

      charToWrite = msgBody.substring(c, c + 1);            //

      //Send the separated characted to addChar function    //

      addChar(charToWrite);                                 //

    }                                                      //

      //Add a little space after each character             //

    addChar(" ");                                           //

    addChar(" ");                                           //

  }                                                         // 

//////////////////////////////////////////////////////////////




//// Display the binary arrays after all characters are coded //

  for (int c = 0; c < (sizeof(msgCode)); c++)  {              //

    pintState = (msgCode[c] / B1000000) % B10;                //

    digitalWrite(LED1, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B100000) % B10;                 //

    digitalWrite(LED2, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B10000) % B10;                  //

    digitalWrite(LED3, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B1000) % B10;                   //

    digitalWrite(LED4, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B100) % B10;                    //

    digitalWrite(LED5, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B10) % B10;                     //

    digitalWrite(LED6, pintState);                            //

                                                             //

    pintState = msgCode[c] % B10;;                            //

    digitalWrite(LED7, pintState);                            //

                                                             //

    delay(delayInChar);                                       //

    // if the character is finished, take a longer off period //

    if ((c + 1) % 5 == 0 ) {                                  //

      digitalWrite(LED1, LOW);                                //

      digitalWrite(LED2, LOW);                                //

      digitalWrite(LED3, LOW);                                //

      digitalWrite(LED4, LOW);                                //

      digitalWrite(LED5, LOW);                                //

      digitalWrite(LED6, LOW);                                //

      digitalWrite(LED7, LOW);                                //

      delay(delayBetweenChar);                                //

    }                                                        //

  }                                                           //

                                                             //

////////////////////////////////////////////////////////////////

}    

void loop() {

//// Convert all text to binary array ////////////////////////

  if ( columnNum == -1 ) // This block needs to be done once//

  {                                                        //

    for (int c = 0; c < (msgBody.length()); c++)  {         //

      //Separate the following character                    //

      charToWrite = msgBody.substring(c, c + 1);            //

      //Send the separated characted to addChar function    //

      addChar(charToWrite);                                 //

    }                                                      //

      //Add a little space after each character             //

    addChar(" ");                                           //

    addChar(" ");                                           //

  }                                                        // 

//////////////////////////////////////////////////////////////




//// Display the binary arrays after all characters are coded //

  for (int c = 0; c < (sizeof(msgCode)); c++)  {              //

    pintState = (msgCode[c] / B1000000) % B10;                //

    digitalWrite(LED1, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B100000) % B10;                 //

    digitalWrite(LED2, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B10000) % B10;                  //

    digitalWrite(LED3, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B1000) % B10;                   //

    digitalWrite(LED4, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B100) % B10;                    //

    digitalWrite(LED5, pintState);                            //

                                                             //

    pintState = (msgCode[c] / B10) % B10;                     //

    digitalWrite(LED6, pintState);                            //

                                                             //

    pintState = msgCode[c] % B10;;                            //

    digitalWrite(LED7, pintState);                            //

                                                             //

    delay(delayInChar);                                       //

    // if the character is finished, take a longer off period //

    if ((c + 1) % 5 == 0 ) {                                  //

      digitalWrite(LED1, LOW);                                //

      digitalWrite(LED2, LOW);                                //

      digitalWrite(LED3, LOW);                                //

      digitalWrite(LED4, LOW);                                //

      digitalWrite(LED5, LOW);                                //

      digitalWrite(LED6, LOW);                                //

      digitalWrite(LED7, LOW);                                //

      delay(delayBetweenChar);                                //

    }                                                        //

  }                                                          //

                                                             //

////////////////////////////////////////////////////////////////

}    

pintState = msgCode[c] % B10;;                            //

    digitalWrite(LED7, pintState);                            //

                                                             //

    delay(delayInChar);                                       //

    // if the character is finished, take a longer off period //

    if ((c + 1) % 5 == 0 ) {                                  //

      digitalWrite(LED1, LOW);                                //

      digitalWrite(LED2, LOW);                                //

      digitalWrite(LED3, LOW);                                //

      digitalWrite(LED4, LOW);                                //

      digitalWrite(LED5, LOW);                                //

      digitalWrite(LED6, LOW);                                //

      digitalWrite(LED7, LOW);                                //

      delay(delayBetweenChar);                                //

    }                                                        //

  }                                                          //

                                                             //

////////////////////////////////////////////////////////////////

}    

Hierbij komt nog het letter deel, maar dat heb ik er maar uitgelaten. Dit kunnen we namelijk aanpassen. Nu gaan we naar het leukste deel: het maken van de POV wand.

 

De instructie en het proces

De officiële uitwerking ziet er als volgt uit:

  

Het nadeel hiervan vond ik dat als je ging zwaaien met de POV wand, dat alle snoertjes dan losschoten. Daarom heb ik besloten om het te gaan solderen.  

Bij het solderen ging er bij mij het een en ander fout. Ik had de plus en de min omgedraaid. Hierdoor komen de letters in spiegelbeeld te staan. Dit is niet handig en ook niet echt te verhelpen. Ik zou dus alles doen om deze fout niet te maken. Ook gingen bij mij de LEDjes steeds stuk, omdat ik of de LEDjes in verband bracht met de soldeerbout of de weerstanden niet goed verbonden had. Uiteindelijk heeft onze THOA mij hiermee geholpen en de LEDjes zelf gesoldeerd. Na het velen solderen konden we eindelijk kijken of de code het deed op mijn gesoldeerde plaatje. Dit ging helaas niet helemaal zoals verwacht. De code klopte telkens niet en was te snel.

Tussen het programmeren door heb ik ook nog een platen speler weer laten werken en een pvc buis met glow in the dark verf geverfd. Deze buis moest op het midden van de platen speler.

Uiteindelijk zijn we er achter gekomen waarom de code niet klopte. De platen speler draaide te snel en de glow in the dark verf brande te lang na. We hebben in de code toen de lichtintensiteit en de snelheid van de LEDjes aangepast. Dit kon door de delayinchar en de delaybetweenchar aan te passen( zie blad hierboven aangegeven met groen) de orinele code had hier 3 en 5. Ik heb dit aangepast naar 12 en 20. Dit werkte het beste voor mij.

 Vanaf dit moment werkte de POV wand feilloos, en alle teksten konden worden gedisplayd. Je kon de tekst veranderen door string msgBody aan te passen( aangegeven met blauw).

Het eindresultaat

Het eindresultaat werkt perfect. De tekst is goed te lezen en de LEDjes branden precies lang genoeg. Ik ben er heel erg blij mee. De tekst is niet goed te zien op de foto, maar in het echt was hij duidelijk te zien.

Serena

Geef een reactie

Thema door Nand Homan en Jeroen van Diepen

Hey, wij gebruiken Cookie's. Hiermee zorgen wij ervoor dat onze site werkt zoals hij bedoeld is. Ons cookie's hebben alleen maar goede bedoelingen, wij gebruiken ze zo minimaal mogelijk. We gebruiken ze niet voor onderzoeken, alleen voor het draaien van de site zelf.

Dus willen jullie Cookie's? Cookie policy