5 min read

Arduino Uygulamaları-16 POV Led Yapımı

Arduino Uygulamaları-16 POV Led Yapımı

Merhabalar bugün POV Uygulaması ile yazı yazdırmayı göreceğiz. POV uygulamalarında Hall Sensörü sayesinde mekanizmamızın 1 turda geçen süresini hesaplayıp 360 a bölerek ledlerin ne zaman açılıp kapanacağını belirleyip görebileceğimiz yazı veya bir masaüstü saat oluşturabiliriz.

POV pervanesi tam bir tur attığı için 360'a bölüyoruz. Devremizde Arduino Nano kullanıyoruz ve nano sayesinde istediğimiz yazıyı burada görebiliyoruz. İnsan gözünün görüntüyü yakalama hızı burda biroptik ilüzyon görevi görerek sanki duruyormuş gibi bunu algılar.

-->Devrenin Malzemeleri

  1. Arduino Nano
  2. A3144 Hall Sensörü
  3. Lipo Batarya 7.4V 2S 450mAh
  4. 11 Adet 100 Ohm - 1 Adet 1K Direnç
  5. 8 Adet Yeşil - 2 Adet Kırmızı - 1 Adet Mavi Led
  6. 1 Adet Kayar Switch
  7. 1 Adet DC Motor

Burada Kodlama ve kontrol organı olarak Arduino kartını kullanacağız. Hall sensörü tabana yerleştireceğimiz mıknatıs sayesinde tur sayısını belirleyip açıyı hesaplayacağız. LiPo Pilimizi devreyi beslemek için kullanırken 11 adet Led'imiz burada görebileceğimiz yazıyı yakmakta kullanılacak. DC Motor sabit bir hızda sistemi döndüreceği Arduino ile kontrol edilmesede olacaktır.


-->Devrenin Kodlaması

int text_ok=0;
int a[] = {126, 144, 144, 144, 126};
int b[] = {254, 146, 146, 146, 108};
int c[] = {254, 130, 130, 130, 130};
int d[] = {254, 130, 130, 130, 124};
int e[] = {254, 146, 146, 146, 146};
int f[] = {254, 144, 144, 144, 128};
int g[] = {124, 130, 138, 138, 76};
int h[] = {254, 16, 16, 16, 254};
int i[] = {130, 250, 130};
int j[] = {12, 2, 2, 2, 252};
int k[] = {254, 16, 40, 68, 130};
int l[] = {254, 2, 2, 2, 2};
int m[] = {254, 64, 32, 64, 254};
int n[] = {254, 32, 16, 8, 254};
int o[] = {124, 130, 130, 130, 124};
int p[] = {254, 136, 136, 136, 112};
int q[] = {124, 130, 138, 134, 126};
int r[] = {254, 144, 152, 148, 98};
int s[] = {100, 146, 146, 146, 76};
int t[] = {128, 128, 254, 128, 128};
int u[] = {252, 2, 2, 2, 252};
int v[] = {248, 4, 2, 4, 248};
int w[] = {254, 4, 8, 4, 254};
int x[] = {198, 40, 16, 40, 198};
int y[] = {224, 16, 14, 16, 224};
int z[] = {134, 138, 146, 162, 194};

int eos[] = {0, 3, 2,0};
int excl[] = {0, 250, 0};
int ques[] = {64, 128, 138, 144, 96};

float delayTime=1;

unsigned long currentMillis, elapsed_loop_counter, previousMillis;
unsigned long counter_1, current_count;

//Dönme hızını saymak için kesinti değişkenleri.
//Giriş sinyalinin önceki değerini saklamak için 4 değişken oluşturuyoruz
byte last_IN_state; //Burada önceki durumu dijital pin 13'te saklıyoruz
float one_rot_time=0; //Burada tam dönüş süresini saklıyoruz
float time_per_deg=0; //Burada bir derecelik dönüş yapmak için gereken süreyi saklıyoruz

void setup() {
PCICR |= (1 << PCIE0); //PCMSK0 taramasını etkinleştir
PCMSK0 |= (1 << PCINT5); //Pin D13'te pin durumu kesintisini etkinleştir

//Output pins register configuration
DDRD |= B11111100; //2 den 7 ye kadarı output ayarla
DDRB |= B00011111; //8 den 12 ye kadarı output ayarla
DDRB &= B11011111; //13 input
PORTD &= B00000011; //2 den 7 ye kadarı LOW
PORTB &= B00000000; //8 dn 13 e kadarı LOW
}

void draw_a_line(int this_line){
int now_line;
now_line = this_line;
if (now_line>=128){PORTD |= B00100000; now_line-=128;} else {PORTD &= B11011111;}
if (now_line>=64) {PORTD |= B01000000; now_line-=64;} else {PORTD &= B10111111;}
if (now_line>=32) {PORTD |= B10000000; now_line-=32;} else {PORTD &= B01111111;}
if (now_line>=16) {PORTB |= B00000001; now_line-=16;} else {PORTB &= B11111110;}
if (now_line>=8) {PORTB |= B00000010; now_line-=8;} else {PORTB &= B11111101;}
if (now_line>=4) {PORTB |= B00000100; now_line-=4;} else {PORTB &= B11111011;}
if (now_line>=2) {PORTB |= B00001000; now_line-=2;} else {PORTB &= B11110111;}
if (now_line>=1) {PORTB |= B00010000; now_line-=1;} else {PORTB &= B11101111;}
}

void displayChar(char cr, float line_delay){
if (cr == 'a'){for (int i = 0; i <5; i++){draw_a_line(a[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'b'){for (int i = 0; i <5; i++){draw_a_line(b[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'c'){for (int i = 0; i <5; i++){draw_a_line(c[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'd'){for (int i = 0; i <5; i++){draw_a_line(d[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'e'){for (int i = 0; i <5; i++){draw_a_line(e[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'f'){for (int i = 0; i <5; i++){draw_a_line(f[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'g'){for (int i = 0; i <5; i++){draw_a_line(g[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'h'){for (int i = 0; i <5; i++){draw_a_line(h[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'i'){for (int itr = 0; itr <3; itr++){draw_a_line(i[itr]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'j'){for (int i = 0; i <5; i++){draw_a_line(j[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'k'){for (int i = 0; i <5; i++){draw_a_line(k[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'l'){for (int i = 0; i <5; i++){draw_a_line(l[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'm'){for (int i = 0; i <5; i++){draw_a_line(m[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'n'){for (int i = 0; i <5; i++){draw_a_line(n[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'o'){for (int i = 0; i <5; i++){draw_a_line(o[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'p'){for (int i = 0; i <5; i++){draw_a_line(p[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'q'){for (int i = 0; i <5; i++){draw_a_line(q[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'r'){for (int i = 0; i <5; i++){draw_a_line(r[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 's'){for (int i = 0; i <5; i++){draw_a_line(s[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 't'){for (int i = 0; i <5; i++){draw_a_line(t[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'u'){for (int i = 0; i <5; i++){draw_a_line(u[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'v'){for (int i = 0; i <5; i++){draw_a_line(v[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'w'){for (int i = 0; i <5; i++){draw_a_line(w[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'x'){for (int i = 0; i <5; i++){draw_a_line(x[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'y'){for (int i = 0; i <5; i++){draw_a_line(y[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'z'){for (int i = 0; i <5; i++){draw_a_line(z[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '!'){for (int i = 0; i <3; i++){draw_a_line(excl[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '?'){for (int i = 0; i <5; i++){draw_a_line(ques[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '.'){for (int i = 0; i <4; i++){draw_a_line(eos[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
delayMicroseconds(line_delay*2);
}

void displayString(char* s, float line_delay){
for (int i = 0; i<=strlen(s); i++){
displayChar(s[i],line_delay);
}
}

void loop() {

currentMillis = micros();
elapsed_loop_counter = currentMillis - previousMillis;
delayTime = time_per_deg*3.5; //harflerin her satırı için 2 derece istiyoruz

if((elapsed_loop_counter >= time_per_deg*(216)) && (elapsed_loop_counter < time_per_deg*(217)) && text_ok)
{
displayString("electronoobs",delayTime);

text_ok=0;
}
}

ISR(PCINT0_vect){
//İlk önce micros() fonksiyonunu kullanarak mevcut sayım değerini mikro saniye cinsinden alıyoruz.

current_count = micros();
///////////////////////////////////////Channel 1
if(PINB & B00100000){ //Pin durum kaydı ile bir AND yaparız, pin 8'in HIGH olup olmadığını doğrularız
if(last_IN_state == 0){ //Son durum 0 ise, durum değişikliğimiz var...
last_IN_state = 1; //Bir sonraki döngü için mevcut durumu son duruma kaydedin
counter_1 = current_count; //Counter_1'i geçerli değere ayarlayın.
}
}
else if(last_IN_state == 1){ //Pim 8 LOW ve son durum HIGH ise, durum değişikliğimiz olur
last_IN_state = 0; //Bir sonraki döngü için mevcut durumu son duruma kaydedin
one_rot_time = current_count - counter_1; //Saat farkını biz yaratıyoruz. Channel 1, current_time - timer_1.
time_per_deg = one_rot_time/360.0;
previousMillis = micros();
text_ok=1;
}

}