This is an old revision of the document!


Persistence of Vision

Autor: Varga Raimond
Grupa: 335CA

Introducere

Proiectul consta in realizarea un POV ce va afișa un text sub forma unei imagini aparent statice.
Textul va putea fi setat prin Bluetooth.
Efectul creat este unul foarte interesant, led-urile rotindu-se cu o viteza suficient de mare, incat
ochiul uman nu le mai percepe individual, acesta observand doar o imagine sau o animatie.

Descriere generală

Partea principala a proiectului o reprezinta banda de led-uri, ce se va roti cu ajutorul unui motor DC.
Pentru a sincroniza aprinderea led-urilor in asa fel incat sa obtin un efect de imagine statica, voi folosi
un senzor Hall si un magnet mic lipit pe placa. Pentru ca placa Arduino se va roti cu led-urile, o voi alimenta
cu ajutorul unei baterii lipite tot pe placa. In final, voi adauga un modul Bluetooth, pentru a putea seta textul
afisat de POV de pe laptop sau telefon.

Hardware Design

Lista componente:

  • Arduino UNO
  • Modul Bluetooth HC-05
  • 8 led-uri
  • 8 rezistente
  • Fire
  • Pini tata
  • Baterie 9V
  • Senzor Hall effect
  • Magnet
  • Placa prototipare cablaj
  • Ventilator 220V
  • Un switch pentru baterie
  • Placa pe care voi monta - carton si lemn
  • Suruburi pentru prinderea placii Arduino
  • Pistol lipit, letcon

Software Design

Am scris codul in Arduino IDE. Literele afisate sunt reprezentate prin vectori de 30 de elemente. Acestea reprezinta modul de aprindere a
ledurilor, fiecare grup de 8 numere constintuind o linie. Pentru ca ventilatorul se invarte in sens trigonometric,
vectorii incep de la finalul fiecarei litere.

  1. setup(): functia initializeaza pinii de iesire pentru leduri si de intrare pentru senzorul de effect Hall. De asemenea, stabileste textul afisat initial si activeaza interfata seriala, pentru a comunica cu modulul Bluetooth.
  2. printLetter(): afiseaza, pe rand, grupurile de cate 8 numere(leduri) pentru a scrie litera curenta;
  3. chooseLetter(): un switch care recunoaste litera ce trebuie afisata si transmite mai departe acest lucru;
  4. displayString(): parcurge textul curent de la final (din cauza tipului de rotatie) si trimite fiecare litera spre a fi afisata;
  5. loop(): functia verifica daca s-a primit un nou text prin Bluetooth, pentru a-l schimba pe cel curent si incepe afisarea textului, de fiecare data cand senzorul de effect Hall ajunge la magnet, activandu-se.

Cod arduino

Cod arduino

byte _[] = {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0};
byte A[] = {1,1,1,1,1,1,1,1, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 1,1,1,1,1,1,1,1};
byte B[] = {0,1,1,1,0,1,1,0, 1,0,0,0,1,0,0,1, 1,0,0,0,1,0,0,1, 1,0,0,0,1,0,0,1, 1,1,1,1,1,1,1,1};
byte C[] = {1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 0,1,0,0,0,0,1,0, 0,0,1,1,1,1,0,0};
byte D[] = {0,0,1,1,1,1,0,0, 0,1,0,0,0,0,1,0, 1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1};
byte E[] = {1,0,0,0,1,0,0,1, 1,0,0,0,1,0,0,1, 1,0,0,0,1,0,0,1, 1,0,0,0,1,0,0,1, 1,1,1,1,1,1,1,1};
byte F[] = {0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 1,1,1,1,1,1,1,1};
byte G[] = {0,1,1,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0};
byte H[] = {1,1,1,1,1,1,1,1, 0,0,0,1,0,0,0,0, 0,0,0,1,0,0,0,0, 0,0,0,1,0,0,0,0, 1,1,1,1,1,1,1,1};
byte I[] = {1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1};
byte J[] = {0,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 1,0,0,1,0,0,0,0, 0,1,1,0,0,0,0,0};
byte K[] = {1,0,0,0,0,0,0,1, 0,1,0,0,0,0,1,0, 0,0,1,0,0,1,0,0, 0,0,0,1,1,0,0,0, 1,1,1,1,1,1,1,1};
byte L[] = {1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1};
byte M[] = {1,1,1,1,1,1,1,1, 0,0,0,0,0,0,1,0, 0,0,0,0,0,1,0,0, 0,0,0,0,0,0,1,0, 1,1,1,1,1,1,1,1};
byte N[] = {1,1,1,1,1,1,1,1, 0,0,1,0,0,0,0,0, 0,0,0,1,1,0,0,0, 0,0,0,0,0,1,0,0, 1,1,1,1,1,1,1,1};
byte O[] = {0,1,1,1,1,1,1,0, 1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,1, 0,1,1,1,1,1,1,0};
byte P[] = {0,0,0,0,0,1,1,0, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 0,0,0,0,1,0,0,1, 1,1,1,1,1,1,1,1};
byte Q[] = {1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,0, 1,0,1,0,0,0,0,1, 1,0,0,0,0,0,0,1, 0,1,1,1,1,1,1,0};
byte R[] = {1,0,0,0,0,1,1,0, 0,1,0,0,1,0,0,1, 0,0,1,0,1,0,0,1, 0,0,0,1,1,0,0,1, 1,1,1,1,1,1,1,1};
byte S[] = {0,1,1,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,0,1,1,1,0};
byte T[] = {0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,1};
byte U[] = {0,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1};
byte V[] = {0,0,1,1,1,1,1,1, 0,1,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0, 0,0,1,1,1,1,1,1};
byte W[] = {1,1,1,1,1,1,1,1, 0,1,0,0,0,0,0,0, 0,0,1,0,0,0,0,0, 0,1,0,0,0,0,0,0, 1,1,1,1,1,1,1,1};
byte X[] = {1,1,0,0,0,0,1,1, 0,0,1,0,0,1,0,0, 0,0,0,1,1,0,0,0, 0,0,1,0,0,1,0,0, 1,1,0,0,0,0,1,1};
byte Y[] = {0,0,0,0,0,0,1,1, 0,0,0,0,0,1,0,0, 1,1,1,1,1,0,0,0, 0,0,0,0,0,1,0,0, 0,0,0,0,0,0,1,1};
byte Z[] = {1,0,0,0,0,0,1,1, 1,0,0,0,0,1,0,1, 1,0,0,0,1,0,0,1, 1,0,0,1,0,0,0,1, 1,1,1,0,0,0,0,1};
String str, newStr;

int letterSpace = 5;
int i;
float delayTime=1;
int state = 500;


void setup() {
  Serial.begin(9600);
  for (i = 2; i < 10 ; i++ ) {
    pinMode(i, OUTPUT); // leduri
  }
  pinMode(A0, INPUT_PULLUP); // senzor efect Hall

  // text initial de afisat
  str = String("HELLO");
}

void printLetter(byte letter[]) {
  int y = 0;
  // afisez pe rand fiecare linie din litera
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, letter[y]);
  }
  delay(delayTime);
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, letter[y + 8]);
  }
  delay(delayTime);
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, letter[y + 16]);
  }
  delay(delayTime);
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, letter[y + 24]);
  }
  delay(delayTime);
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, letter[y + 32]);
  }
  delay(delayTime);
  // dezactivez ledurile pentru a avea spatiu intre litere
  for (y = 0; y < 8; y++) {
    digitalWrite(y + 2, 0);
  }
  delay(letterSpace);
}

void chooseLetter(char letter) {
  // identific litera curenta
  switch (letter) {
    case 'A':
      printLetter(A);
      break;
    case 'B':
      printLetter(B);
      break;
    case 'C':
      printLetter(C);
      break;
    case 'D':
      printLetter(D);
      break;
    case 'E':
      printLetter(E);
      break;
    case 'F':
      printLetter(F);
      break;
    case 'G':
      printLetter(G);
      break;
    case 'H':
      printLetter(H);
      break;
    case 'I':
      printLetter(I);
      break;
    case 'J':
      printLetter(J);
      break;
    case 'K':
      printLetter(K);
      break;
    case 'L':
      printLetter(L);
      break;
    case 'M':
      printLetter(M);
      break;
    case 'N':
      printLetter(N);
      break;
    case 'O':
      printLetter(O);
      break;
    case 'P':
      printLetter(P);
      break;
    case 'Q':
      printLetter(Q);
      break;
    case 'R':
      printLetter(R);
      break;
    case 'S':
      printLetter(S);
      break;
    case 'T':
      printLetter(T);
      break;
    case 'U':
      printLetter(U);
      break;
    case 'V':
      printLetter(V);
      break;
    case 'W':
      printLetter(W);
      break;
    case 'X':
      printLetter(X);
      break;
    case 'Y':
      printLetter(Y);
      break;
    case 'Z':
      printLetter(Z);
      break;
    default:
      printLetter(_);
      break;
  }
}

void displayString(String s) {
  for (i = str.length() - 1; i >= 0; i--) {
    chooseLetter(str[i]);
  }
}

void loop() {
  if (Serial.available() > 0) {
    newStr = Serial.readString();
    if (newStr != "\n") {
      str = String(newStr);
    }
  }
  state = analogRead(A0);
  if (state < 538) {
    displayString(str);
  } else {
    state = analogRead(A0);
  }
}

Rezultate obtinute

Concluzii

Download

Jurnal

25.04.2021 : Alegere tema, completare introducere, schema initiala si componente necesare.
25.05.2021 : Modifcare lista componente, adaugare schema Eagle, completat Software Design.

Bibliografie/Resurse

pm/prj2021/alazar/persistence-of-vision.1621960683.txt.gz · Last modified: 2021/05/25 19:38 by raimond.varga
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