pcbway

Güneş takibi ?

Başlatan eski klasör, 30 Temmuz 2012, 15:13:34

eski klasör

30 Temmuz 2012, 15:13:34 Son düzenlenme: 30 Temmuz 2012, 15:33:04 eski klasör
Arkadaşlar güneş paneli ile elektrik üretimi yapıyorum (evde kendi capımda devrelerim için) fakat tam verim alamıyorum. Projeyi ilerletip güneşi takip eden bir sistem yapmaya karar verdim (pic ile). Pic programlamaya yeni başladım (   http://www.altaskitap.com/CCS-C-Ile-PIC-Programlama,PR-37.html   bu kitap ile )

İnternette biraz araştırma yaptım ve bu (  http://www.instructables.com/id/Arduino-Solar-Tracker/   ) projeyi buldum ama değişik bir sistemle yapılmış gibi geldi :) .

Bu sistemi step motor kullanarak pic ile nasıl uygularım yardımcı olursanız sevinirim.

( yazılımdaki kodlar kolay anlaşılması icin acıklanarak yapılırsa yeni öğrenen biri (benim gibi) icin iyi olacağı kanatindeyim.

yazici67

PIC programlamada biraz kendinizi ilerletirseniz kendi programınızıda yazabilirsiniz.Zaten internetteki proje de çok zor değil.
Mantığını anlatayım:
+ şeklindeki çubuğun 4 köşesinde birer tane LDR var.(LDR = Işık şiddetiyle direnci genellikle azalan devre elemanı)
Amaç 4 LDR yi de aynı güneş seviyesine ayarlamak.Yani mesela üstteki LDRler çok ışık algıladı alttakiler az ışık algıladı.Sistem paneli ışık seviyeleri dengelenene kadar yukarı kaldırır.Eğer solda ışık fazla ise sola vb. hareket eder.
2 LDR ve tek step motorla veya 4 LDR ve iki step motorla projeyi gerçekleştirebilirsiniz...

eski klasör

Kitaptan biraz araştırma yaptım ADC yöntemi ile uygulanıyor galiba;

analog değer 5 v a yakın olduğunda yani güneşi tam gördüğünde dijital değeri 255 e yakın bir değer cıkıyor
yanılmıyorsam 

eğer adc 175 ile 255 arasında ise şunu yap 1 ile 174 değeri arasında ise şunu yap gibi bir yöntem gibi geldi

her ldr icin bu şekilde bir kodlama

sonuctada step yada servo motor kontrol etiketi  (sağ, sol, yukarı, aşağı)   gibi
 

Mİ ?   (tabi daha koda dökemiyorum :D )

yazici67

Evet yöntem aynen bu şekilde.Yalnız sayısal değerler biraz hatalı.Kullanacağınız PIC\'in büyük ihtimal dahili ADC modülü vardır aynı zamanda bu modüller multiplex modda kullanılır.Yani tek adc modülüyle sırasıyla 8-10 kanalı tek tek okuyabilirsiniz.Ve büyük ihtimalle bu ADC\'ler 10-bit çözünürlüktedir.İşte değerler burada ortaya çıkıyor.10-bit ADC den 0 - 1023 aralığında değer okunur.Hesapları buna göre yaparsın.Yalnız arada kararlı konum değerini unutmuşsunuz.Yani LDR den ölçülen değer için örnek tablo şöyle olmalı:
0-400 -> Işık Zayıf
400-600 -> Işık uygun
600-1000 -> Işık fazla.
Bu tabloyu uygulayabilmek için maksimum ışıkta tam 5 volt okumanız gerekir.Ancak güneş herzaman aynı parlaklıkta olmayabilir.Bu nedenle değerleri sabit değil karşılaştırmalı yapmalısınız.Şekil üzerinden
( + = ışık yüksek  |  - = orta ışık | 0 = az ışık )
+  |  +
====
0  |  0  => Güneş kuzey yönde, motorlar yukarı hareket ederek ışığı ortalayacak...
==============
+  |  0
====
+  |  0  => Güneş batıda, motorlar sola.
Gibi... Ve motorlar her adım hareket ettiğinde değerler tekrar kontrol edilecek taaki tablo aşağıdaki gibi olana kadar :
-   |   -
====
-   |   -

Olayı en basit mantığıyla anlatmaya çalıştım.Gerisini kodla halledeceksiniz..

eski klasör

31 Temmuz 2012, 12:02:47 #4 Son düzenlenme: 31 Temmuz 2012, 12:05:22 eski klasör
Son yazdığınız yazıyı görmemiştim ama bu şekilde gibi mi olacak

 (ccs c,  basic pro ve türkce karışık)


1  I  2
-------                  şeklide  4 adet ldrmiz olsun
3  I  4


değişkenler tanımlanıp;




kontrol:

if  1 ve 2 nin değeri  3 ve 4 den büyükse  then aşağı
else if 3 ve 4 ün değeri 1 ve 2 den büyükse then yukarı
else if 1 ve 3 ün değeri 2 ve 4 den büyükse then sola
else if 2 ve 4 ün değeri 1 ve 3 den büyükse then sağa

goto kontrol


aşağı:
1 nolu motoru belirli bir derece döndür
goto kontrol

yukarı:
1 nolu motoru belirli bir derece döndür
goto kontrol


sağa:
2 nolu motoru belirli bir derece döndür
goto kontrol

sola:
2 nolu motoru belirli bir derece döndür
goto kontrol


gibi olabilirmi?


Mustafacan

ben güneş takip sistemini 16f877 ile yaptım. 2yıldır çalışıyor. ancak ldr değilde küçük maximum 2.5 v veren güneş pilcikleri kullandım.   2 kanaldan adc okuttum.  picin 2 bacağınada röle taktım.
sağdaki pil çok güneş görüyorsa picin bir bacağı soldaki pil çok güneş görüyorsa diğer bacak on oluyor
röleyi sürüyor. röle ilede motoru sürüyorsun hepsi bu. motora ister 12v kullan ,ister 220 kullan arada röle var.
picin avantajı  opamplı sisteme göre enerji tüketiminin az olmasıdır.

Mustafacan

sanırım böle bir ifade lazım sana...  birde dosya ekinde isisteki şemada sağda bulunan transistör grunun yerine röle takarak kullanabilrisn.

If ADC_KANAL1>ADC_KANAL2 Then
     High MOTORKUZEY
     EndIf
     
     If ADC_KANAL1<ADC_KANAL2 Then
     High MOTORGUNEY
     EndIf
     
     If ADC_KANAL1=ADC_KANAL2 Then
     Low MOTORKUZEY
     Low MOTORGUNEY
     EndIf
         
     
     If ADC_KANAL3>ADC_KANAL4 Then
     High MOTORDOGU
     EndIf
     
     If ADC_KANAL3<ADC_KANAL4 Then
     High MOTORBATI
     EndIf
     
     If ADC_KANAL3=ADC_KANAL4 Then
     Low MOTORDOGU
     Low MOTORBATI
     EndIf
   

yazici67

@Mustafacan evet kısmen böyle ama biraz daha koda dökülmesi lazım.
@eski_klasör yaptığın tabloda sadece yukarıyla aşağı ters olmuş.Üstteki LDR lere fazla ışık geliyorsa cisim yukarı hareket etmeli...

Mustafacan

yukardaki formül zaten 2 eksen için
motordoğu
motor batı
motorgüney
motorkuzey

eski klasör

03 Ağustos 2012, 12:54:47 #9 Son düzenlenme: 03 Ağustos 2012, 12:59:48 eski klasör
 Yeniden \"Merhaba\".
   
    * ldr1  *
     *     *
      *   *
       * *
  ldr3 * * ldr4
       * *
      *   *
     *     *
    * ldr2  *



Dizilimi kare yarine baklava dilimi olacak şeklide değiştirdim. tabi acılar eşit olacak yani karenin merkezden 45 derece döndürülmüş hali
 kare olduğunda biraz daha zor olacak gibi geldi bu şekilde daha kolay
diğerinde  1 2 yi  3 ve 4 le karşılaştırıyorduk  burada 1 i 2 ile karşılaştırıyoruz.


programa gelirsek ccs i anladığım kadarıyla (askeriyede kitapla öğrenmeye çalışıyorum burada öğranince evde hayata gecireceğim(şafak 110:D 03-08-2012 ))

#include <16f877.h>

#device ADC=10

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=20000000) //ne kadar cok olursa işlemler o kadar hızlı olur deniyor 20Mhz iyi gibi geldi :D

#use fast_io(a)  //Hangi pinleri tam olarak kullanacağıma karar vermedim o yüzen hepsi çıkış veya giriş olabilir...
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#INT_AD
 
 void ADC_kesmesi ( )
{
 
  output_toggle(pin_  ) //kesme meydanageldiğinde led yanıp sönecek  ama hangi led alduğuna  gene karar vermedim
}


unsigned long int ldr1
unsigned long int ldr2   // ldr leri tanıtmak icin   (işaretsiz 16 bitlik tam sayı tipinde değişkenler tanımlanıyor)
unsigned long int ldr3   // heralde bu şekilde olması lazım hata olursa düzeltin lütfen
unsigned long int ldr4


// ana program denen yer tam ccs i cözemedim

void main ( )

setup_psp(PSP_DISABLED)
setup_timer_1(T1_DISABLED)
setup_timer_2(T2_DISABLED)
setup_CCP1(CCP_OFF)
setup_CCP2(CCP_OFF)

set_tris_ () //girişlerçıkışlar belirleniyor

setup_adc(adc_clock_div_32)
setup_adc_ports_(ALL_ANALOG) // bu 2 kodun ne işe yaradığını çözemedim 32 falan fazla olursamı iyi az olursamı ?


enable_interrupts(INT_AD) // AD CEVRİMİ BİTİ KESMESİ    yazmam gerekiyor galiba bunuda
enable_interrupts(GLOBAL) //Tüm kesmeleri aktif et



//geldik işin en civicvli kısmına :)  iplerin koptuğu yer sacmalaya bilirim kusura bakmayın :D


cevir:

set_adc_chanel(0)
delay_us(20)
ldr1=read_adc();
delay_us(20)

set_adc_chanel(1)
delay_us(20)
ldr2=read_adc();
delay_us(20)

set_adc_chanel(2)
delay_us(20)
ldr3=read_adc();
delay_us(20)

set_adc_chanel(3)
delay_us(20)
ldr4=read_adc();
delay_us(20)

goto kontrol


kontrol:

 if (ldr1>ldr2)
{
goto yukarı
}

    esle if (ldr1<ldr2)
{
goto asagı
}
       else if (ldr3>ldr4) 
{
goto sola
}
          else if (ldr3<ldr4)
{
goto saga
}
              esle if (ldr1==ldr2==ldr3==ldr4)
{
goto cevir
}



yukarı:
//donanıma göre acı veya adım değerleri
goto cevir

asagı:
//donanıma göre acı veya adım değerleri
goto cevir

saga:
//donanıma göre acı veya adım değerleri
goto cevir

sola:
//donanıma göre acı veya adım değerleri
goto cevir


@yazici67 modumuzun dediği yönteme gelirsek

0 il 399 arası düşük dedim
400 ile 700 arasına iyi dedim
701 ile 1023 arasına fazla dedim      programda tanıtmamış olabilirim tanıtamadım yöntemi bilmiyorum

değerlerini aldım

1 LSb = 0.0048828125 volt   a tekabul ediyor
bu hesapla aşağıdaki tablo oluşuyor



değer          *****analog*******=************dijital*****

   0           0,0048828125  volt        0000000000        az
 399           1,9482421875  volt        0110001111
 
 400           1,953125      volt        0110010000        iyi
 700           3,41796875    volt        1010111100
 
 701           0,4228515625  volt        1010111101        cok 
1023           4,9951171875  volt        1111111111


bunu modumuzun dediği yöntemle nasıl yaparım

çünkü benim yaptığımda değerler tamamen eşit olması gerekiyor  ki bu cok küçük bir ihtimal 
bu yüzdende devre eşitliği sağlamak için devamlı motorlara sinyal göndermek zorunda kalacak
buda enerji sarfiyatınıarttırır.


Mesela devre ideal acıyı oluşturduğunda (88 89 90 91 92 gibi)
düşük güç moduna gecse  1 yada 2 dk sonra (veya daha farklı bir zaman 1 2 dk yı tahmini söylüyorum)
tekrar değerler ölçümü yapsa gene ideal acı oluştuğunda düşük güç moduna gecse gibi...

 



yazici67

03 Ağustos 2012, 14:33:18 #10 Son düzenlenme: 03 Ağustos 2012, 14:33:49 yazici67
Kodlar biraz Basic\'e kaçmış.Birde noktalı virgüller eksik kalmış.Kodları biraz daha CCS ye benzetirsek:
#include <16f877.h>

#device ADC=10

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)  // Fazla zorlamaya gerek yok :) 4 MHz yeterli...

// Pinleri ana fonksiyonda da tanımlayabiliriz...

// Long 64-bit lik değişken bize işaresiz short ( veya int16 ) yeter
unsigned int16 ldr1, ldr2, ldr3, ldr4;

void LDR_GirdiOku()
{
    delay_us(20);
    set_adc_channel(0);
    ldr1 = read_adc();

    delay_us(20);
    set_adc_channel(1);
    ldr2 = read_adc();

    delay_us(20);
    set_adc_channel(2);
    ldr3 = read_adc();

    delay_us(20);
    set_adc_channel(3);
    ldr4 = read_adc();

    delay_us(4);
}

void YukariMotorAdimla()
{
}

void AsagiMotorAdimla()
{
}

void SolaMotorAdimla()
{
}

void SagaMotorAdimla()
{
}

void MotorYonlendir()
{
    if(ldr1 > ldr2)
   {
       if((ldr1 - ldr2) > 20)
           YukariMotorAdimla();
   }
   else if((ldr2 - ldr1) > 20)
           AsagiMotorAdimla();


    if(ldr3 > ldr4)
   {
       if((ldr3 - ldr4) > 20)
           SolaMotorAdimla();
   }
   else if((ldr4 - ldr3) > 20)
           SagaMotorAdimla();
}

// C dilinde program ana ( main ) fonksiyonundan başlar.

void main ( )
{
    setup_psp(PSP_DISABLED);     // PSP donanımı kapalı
    setup_timer_1(T1_DISABLED); // 1 nolu sayıcı (Timer) kapalı
    setup_timer_2(T2_DISABLED); // 2 nolu sayıcı kapalı
    setup_CCP1(CCP_OFF);            // CCP ( yakala-karşılaştır-pwm ) modülü 1 kapalı
    setup_CCP2(CCP_OFF);            // CCP ( yakala-karşılaştır-pwm ) modülü 2 kapalı

    set_tris_a(0x00);                         // Yazmacın her biti bir pini temsil ediyor.İlgili pin 0 ise çıkış, 1 ise giriş.
    ...  // Diğer port tanımları

    // Çıkış olarak tanımladığın pinleri temizlemelisin
   output_a(0x00);
   ...

    setup_adc(adc_clock_div_32);       // Bu kod ADC çevrimi için frekansı belirliyor.
    // ADC Saati için sistem saati 32 ye bölünecek -> 4.000.000 / 32 = 125 kHz yaklaşık.Bizim için yeterli

    setup_adc_ports_(ALL_ANALOG) // Pinlerde AN ile başlayan tüm pinler analog giriş olacak

    // Okumaları fonksiyona atalım.
    while(1)
    {
         LDR_GirdiOku();
         MotorYonlendir();
    }
}

Baklava dilimi daha uygun oldu.Motorun tipini belirlemediğin için adimla() fonksiyonlarını boş bıraktım.Led yakma kısmınıda orada yapacağız.LDR ler için bir miktar tolerans bıraktım.20  tolerans yaklaşık 100mV a geliyor.Uygun bir aralık olur.Ayrıca o 0-399 vs. leri burada kullanmamıza gerek yok.O değerleri ışık miktarını elde etmek için kullanabilirsin.Burada sadece karşılaştırmamız yeter.Akış diyagramında:
ldr1 , ldr2 den büyükse ve aralarındaki fark 20 den büyükse motor yukarı,
ldr1 , ldr2 den küçükse ve aralarındaki fark 20 den büyükse motor aşağı,
ldr3 , ldr4 den büyükse ve aralarındaki fark 20 den büyükse motor sola,
ldr3 , ldr4 den küçükse ve aralarındaki fark 20 den büyükse motor sağa dönecek.
Eğer fark değerleri toleranstan fazla değilse zaten herhangi bir işlem yapılmayacak.Yalnız ldr kısmının ağır olmaması gerekiyor yada arada bir dişli takımı olmalı ki motor bırakınca geri kaçmasın...

eski klasör

03 Ağustos 2012, 15:14:38 #11 Son düzenlenme: 03 Ağustos 2012, 15:15:48 eski klasör
Kodların basic e benzemesi yaklaşık 3 4 yıldır basit olarak basic le calışıyorum be acıkcası  basic hicde basit değil c bana daha kolay geldi. Yada belki kitap anlatım farkındanda olabilir.

Ldr li kısım fazla ağır olmayacak zaten ldr yi güneş panelinin üzerine monte edeceğim
kullanacağım motorlar ve dişliler de güneş panelinin ağırlığına göre olacak.

Bu koda gerekli düzenlemeyi yapıp pic e attığımda sorunsuz calışacak mıdır?

32 yi düşürdüğümüzde programda hız farkı mı olacaktır dönüşümde cevirimde

yazici67

Kodlarda motorlar için belirttiğim MotorAsagiYukari,Sola,Saga fonksiyonları doldurmalısın.Artık step motor mu kullanacaksın yoksa normal motor mu motorun hızı ne kadar olacak, step motorsa adımı kaç derece olacak vs. vs... Kullanacağınız motoru belirlerseniz gerisini hallederiz... 32 yi düşürmeye gerek yok bu haliyle zaten yeterince hızlı.Devrenin tepki hızı motorada bağlı olarak 0.2 milisaniye olacak ki gayet yeterli bir hız...

Mustafacan

hassaiyet ölçümünü 0-10 yada 0-15 arası yapmanızı tavsiye ederim. aksi halde motor ileri geri yapıp durur.

yani karanlık 0  en aydınlık 10 olur.

0dan 3e kadar motor hareket etmesin. çünkü 3te güneş yok gibidir. sabah ve akşam gündoğumu gün batımıdır.

yazici67

@Mustafacan arkadaşım bu projede kontrol mantığı biraz daha farklı.4 tane LDR var ve bu LDR lerin karşılaştırılmasıyla güneşin konumu belirleniyor.Mesela soldaki ldrlerden 700 ölçüldü, sağdakilerden 300 ölçüldü, demekki güneş solda.Motor 1 adım sola hareket ediyor.Sonra tekrar kontrol ediyor.Atıyorum değerler solda 600, sağda 400 oluyor.Böyle devam ediyor taa ki ldr ler arasın fark tolerans değerine düşene kadar...

eski klasör

06 Ağustos 2012, 10:09:08 #15 Son düzenlenme: 06 Ağustos 2012, 10:29:44 eski klasör
Şu şekilde 2 step motor için;

 Step/Tur: 200
Step açısı: 1.8
Flanj: 60 x 60 mm
İzolasyon sınıfı: B 130 C
Çalışma sıcaklığı: -20  +50 C
Maksimum Sıcaklık: Max 80 C
Ortam Sıcaklığı: -20 C~ + 50 C
Akım/Faz: 2.8 A
Direnç/Faz: 1.5 ohm
Indüktans: 6.8 mH
Rotor ataleti: 840 gcm 2
Tutma Torku: 3 Nm
Tel Sayısı: 8
Ağırlık: 1.4 kg
Uzunluk: 88 mm

veya

 Bu Hibrit bipolar step motor 0.9 ° step açısına (400 step/devir) sahiptir.Motoru tek kutuplu ya da iki kutuplu olarak kullanabilirsiniz.  Her faz 3Voltta 1,7A akım çetmekte, 4.8 kg-cm tork sağlamaktadır.

# Adım Açısı (derece): 0.9
#     2-fazlı
#     Besleme:3V
#     Anma Akımı: 1.7A/Phase
#     Şaft Çapı: 5mm
#     Taşıma Torku: 4.8Kg.cm
#     NEMA 17 form faktörü

Devrenin kendi kendini idare edebilecek ( 2 birim üretiyorsa 1 birimi kendine  1 birimi depoya gibi) şekilde enerji üretimini uygun akü ve güneş paneli ile nasıl sağlarız.
Jel akü düşünüyorum ama hangisi uygun olur bilmiyorum güneş panelinin boyutunda kararsızım.


step motorun güçünü bilmiyorum 125 tl lik bir step motor
step motorun dişli sistemine bağlantısı ekteki gibi olacak.



Mustafacan

Alıntı yapılan: yazici67 - 05 Ağustos 2012, 16:30:55@Mustafacan arkadaşım bu projede kontrol mantığı biraz daha farklı.4 tane LDR var ve bu LDR lerin karşılaştırılmasıyla güneşin konumu belirleniyor.Mesela soldaki ldrlerden 700 ölçüldü, sağdakilerden 300 ölçüldü, demekki güneş solda.Motor 1 adım sola hareket ediyor.Sonra tekrar kontrol ediyor.Atıyorum değerler solda 600, sağda 400 oluyor.Böyle devam ediyor taa ki ldr ler arasın fark tolerans değerine düşene kadar...

tamam işte aynı mantık. ancak demek istediğimi hesaplamada 700-300 olmasın   7-3 olsun
600-400 olmasın      6-4 olsun...


yazici67

06 Ağustos 2012, 14:17:11 #17 Son düzenlenme: 06 Ağustos 2012, 14:17:50 yazici67
Demek istiyorum ki bizim programda 700-300 ler kullanılmıyor...O değerler LDR den okunanlar ve sadece kendi  aralarında karşılaştırılıyor...

Mustafacan

Alıntı yapılan: yazici67 - 06 Ağustos 2012, 14:17:11Demek istiyorum ki bizim programda 700-300 ler kullanılmıyor...O değerler LDR den okunanlar ve sadece kendi  aralarında karşılaştırılıyor...
tamam anladım bende demek istiyorumki.
16f877 proton derleyici
çanak anten motoru
ve 2 adet 1.5 v luk güneş pili ile bu sistemi yaptım 3 yıldırda çatıda çalışıyor. 2 ay bu sistemi iyileştirmeye çalıştım.
 sadece önerilerde bulunuyorum.
sensörler arasındaki farkları  ince ince hesaplama kaba hesaplar yaptır. yoksa dansöz bir takip sistemi çıkar karşına ...

yazici67

Tamam kardeşim ben senin sistem çalışmıyor demedim ki.Biz farklı yaptık dedim.Ayrıca bu sistemdeki tolerans değeri olan 20/1024 değeri o \"dansöz\" olayını engellemek için zaten.Sistem zaten o kadar ince ince hesaplamıyor.Yani iki LDR den okunan değer arasındaki fark 20/1024 * 5000 = ~100 mV olana kadar sistem harekete geçmiyor.Harekete geçtiğinde sadece bir adım hareket ediyor ve tekrar kontrol ediyor.Kararlı konuma geçinceye kadar adım adım hareket ediyor...

leah

arkadaslar merhaba bu yıl ki bitirme ödevimiz bu konu uzerine ve biz akış diyagramında bazı problemler yasıyoruz. LDR'leri panelin dört bir kösesine yerlestireceğiz ve toplayarak karsılastırıp bu karsılastırmaya göre sağa-sola veya kuzey-güney doğrultusunda döndürmeye calıscaz. Yalnız 2 motor kullanacağımız için ilk basta hangi yöne ayarlıycaz bunu bilmiyoruz yanı programda  bunu nasıl belirticez? birde LDR değerlerini okuyarak motorun hangi durumda duracağını kontrol eden bi akış olusturamadık. yardımcı olabilirmisiniz?