This is an old revision of the document!


POV Display

Introducere

Student: Tudurean George-Alexandru
Grupa: 336CC

Scurta prezentare:

  • ce face: un display circular ce se bazeaza pe efectul POV (Persistence of Vision)
  • ce scop are: scopul de a afisa diferite imagini prin intermediul unei benzi de led-uri
  • de unde mi-a venit o asemenea idee: ideea a pornit de la display-ul POV cilindric din cladirea campus (e in laboratorul de electronica, la etajul 3) si mi s-a parut interesant ca imaginile afisate erau dragute (cred ca era sigla facultatii daca nu ma insel) dar in acelasi timp pare ceva dispozitiv in care sa iti tai mainile
  • de ce e util: nu stiu sincer de ce sau daca e util, e mai mult cool decat util.

Descriere generală

😈 Pentru un efect de lunga durata/permanent a fenomenului POV te poti uita la soare pentru cateva minute

Disclaimer: nu sunt responsabil pentru daunele provocate de glumele mele

Functionalitate:

  • display-ul se foloseste de o banda de led-uri de 50 de cm avand 144leds/m / 2 = 72 de led-uri si de efectul POV (imaginile raman pe retina si dupa disparitia lor)
  • un motor DC invarte o tija de plastic pe care este lipita banda de led-uri pentru redarea imaginilor
  • imaginile ce se doresc a fi redate se vor trimite catre esp32 cu ajutorul modulului de wifi al acestuia

Schema bloc:

Hardware Design

Lista de piese:

  • Espressif ESP32-S3-DevKitC-1-N8R8
  • motor DC: 424-1/19-MOTOR-KIT Digilent
  • LED strip: Adafruit dotstar cu led-uri SK9822, 0.5m 144leds/m density
  • tija de plastic pe care sa fie lipite led-urile
  • level shifter 3V - 5V pentru LED strip
  • baterie 5V pentru microcontroller si LED strip
  • baterie 9V pentru motor
  • senzor Hall switch

Schema electrica:

Test initial:

Software Design

  • IDE folosit: VSCode + extensie pt esp32, ArduinoIDE si PlatformIO + ESP-IDF (da, mi-am pierdut mintile)
  • libs: Adafruit SDFormat, FatFS, PovLibrary, FastLED, WiFi (daca facea tot ce voiam eu, dar mna, am folosit doar Adafruit Dotstar pentru demo)
  • algoritmi si structuri: Considerand ca biblioteca Adafruit Dotstar interfateaza banda de led-uri si ca biblioteca pov interfateaza display-ul pov in sine, am folosit de metode din aceste doua biblioteci pentru a realiza proiectul (biblioteca pov e un gunoi ordinar, la fel ca toate celelalte, am facut code review la toate bibliotecile, crapa tot, absolut oribil :(((((((((((((((((((((((((((((( )
  • nu am ce surse si functii sa pun, doar am pus cap la cap bibliotecile folosite → de fapt am un gunoi pt demo:
#include <Adafruit_DotStar.h>
#include <Arduino.h>
// Because conditional #includes don't work w/Arduino sketches...
#include <SPI.h> // COMMENT OUT THIS LINE FOR GEMMA OR TRINKET
// #include <avr/power.h> // ENABLE THIS LINE FOR GEMMA OR TRINKET

#define NUMPIXELS 72 // Number of LEDs in strip

// Here's how to control the LEDs from any two pins:
#define TRIGGERPIN 9
#define DATAPIN 10
#define CLOCKPIN 11
Adafruit_DotStar strip(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);

int head = 0, tail = -20; // Index of first 'on' and 'off' pixels
uint32_t movingColor = 0x00FFFF, color = 0xFF00FF; // purple and cyan

void setup()
{

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L)
  clock_prescale_set(clock_div_1); // Enable 16 MHz on Trinket
#endif

  Serial.begin(115200); // For debugging
  Serial.println("DotStar Simple");

  strip.begin(); // Initialize pins for output
  strip.show();  // Turn all LEDs off ASAP

  for (int i = 0; i < NUMPIXELS; i++)
  {                                // Loop thru all pixels in strip...
    strip.setPixelColor(i, color); //  Set pixel's color (in RAM)
  }

  strip.setBrightness(255); // Max brightness
  strip.show(); //  Update strip to match
}

bool direction = true;
int trigger = HIGH;
int lastTrigger = HIGH;
void loop()
{
  lastTrigger = digitalRead(TRIGGERPIN);

  strip.setPixelColor(head, movingColor);
  strip.setPixelColor(tail, color);

  // move a "snake" of pixels along the strip up to the middle
  if (trigger == HIGH && lastTrigger == LOW)
  {
    if (++head >= NUMPIXELS)
    {
      head = 0;
    }
    if (++tail >= NUMPIXELS)
    {
      tail = 0;
    }
    strip.setPixelColor(head, movingColor);
    strip.setPixelColor(tail, color);
    {
      if (direction)
      { // going to the edge
        if (tail >= 0)
        {
          strip.setPixelColor(tail, color);
        }
        strip.setPixelColor(head, movingColor);
        if (++head > NUMPIXELS / 2 - 1)
        {
          direction = false;
          --head;
        }
        else
        {
          ++tail;
        }
      }
      else
      { // going to the middle
        strip.setPixelColor(head, color);
        strip.setPixelColor(tail, movingColor);
        if (--tail < 0)
        {
          direction = true;
          ++tail;
        }
        else
        {
          --head;
        }
      }
    }

    trigger = lastTrigger; // update trigger

    strip.show(); // Update strip with new contents
  }
}

Rezultate Obţinute

WIP

Concluzii

Ma urasc, motiv pentru care am ales proiectul asta! :)

Download

Jurnal

Bibliografie/Resurse

  • proiecte de pe hackster
  • un chinez tare priceput la electronica de pe youtube
  • oameni random care au facut chestii de genul pe youtube
  • o sa pun linkuri concrete in etapele urmatoare

Export to PDF

pm/prj2023/apredescu/pov_display.1685467903.txt.gz · Last modified: 2023/05/30 20:31 by george.tudurean
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0