3 Temmuz 2018 Salı

Analog ve Dijital Dimmerleri inceleyelim.

Farkında olmasak da dimmerleri hayatımızın birçok noktasında kullanıyoruz.

Birkaç örnek verecek olursak çamaşır makinasının tambur hızını ayarlayan sistem, mutfak robotu, mikser, çırpıcı gibi araçların devir hızını ayarlayan sistem, aspiratör hızını ayarlayan sistem  olarak örnek verebiliriz.

Dimm etmeyi kısmak olarak tanımlayabiliriz.

Şimdi dimmerlerin nasıl çalıştığını anlamaya çalışalım.
Bilindiği gibi şehir şebekesi sinus dalga formundadır. Ülkelere göre voltaj, frekans değişse de dalga formu olarak sinus dalga formundadır.

Dimmer yapımında, sinus dalga formunun sıfır noktasını kestiği noktalardan  faydalanılır.
Çalışma sistemine göre dimmerleri ikiye ayırıp çalışma sistemlerini incelemeye başlayalım.

1) Analog dimmer:
Temel yapı itibariyle bir ayarlı direnç, kondansatör, diyak ve triyaktan oluşan bir sistemdir.

Google aramasında stalls.co sitesinde bulduğum dimmer devresi.


Çalışma sistemi olarak her bir alternansı inceleyelim. Alternansın pozitif kısmında C kondansatörü R direnci üzerinden şarj olur. C kondansatörü üzerindeki gerilim 33 volta ulaşınca diyak açılır ve üzerinden geçen akım triyakı tetikler. Triyak iletime geçer ve lamba enerjilenerek ışık vermeye başlar. Bu sırada triyak tetiklendiği için C kondansatörü R direnci üzerinden boşalmaya başlar.

Alternans sıfır noktasını geçip negatif kısmında aynı olay tekrarlanır ve triyak tekrar tetiklenerek bu alternansta da lambanın ışık vermesini sağlar.

Burada kısma işlemi nerede yapılıyor sorusunun cevabı: C kondansatörünün 33 volta kadar şarj olma süresidir.

C kondasötünün dolma süresi T=R x C olarak hesaplanır.
C farad, R Ohm birimindendir. Kondansatörün giriş geriliminin %63üne kadar dolma süresini verir.
Burada alternansın tepe değerinin 220 x 1,41 şeklinde hesaplarsak 314 değerini buluruz. 33 Voltta bu değerin yaklaşık %10'udur.

R direncinin değeri değiştirilerek C kondansatörünün 33 volta kadar şarj olma süresi değiştirilir ve böylece her alternansta belirli bir süre lambanın açık kalması sağlanır.

Yeri gelmişken açıklayalım Dimmer devreleri ile TV, CD-DVD player, SMPS  gibi cihazları kullanamazsınız. Dimmer devreleri ile en uygun olarak ısıtıcı gibi rezistif yükleri ve çok uygun olmasa da motorlar gibi endüktif yükleri kontrol edebilirsiniz. 

Lambanın üzerinde düşen zaman voltaj grafiğini inceleyelim.

(http://www.ecmweb.com web sitesinden yüklenmiştir.)

Buradaki mavi alan lambanın çalıştığı süredir. Eğer R direnci üzerinden C kondansatörünün dolma süresi uzarsa diyak ve triyak tetiklenmesi gecikecek ve mavi kısmın alanı azalacaktır. Bu da lambanın üzerinden akım geçme süresi azalacaktır. Bu da lambanın açık kalma süresini azaltacak ve parlaklığı azalacaktır. 


2) Dijital Dimmer:

Dijital dimmerde ise tetiklenme zamanı R ve C tarafından değil mikroişlemci tarafından  belirlenir. Tabi ki burada kondansatör direnç diyak üçlüsü olmadığı için alternans değişimini işlemciye hatırlatan bir devreye ihtiyacımız var. 

http://fidenetgaraj.blogspot.com/2018/06/zero-crossing-detector-sfr-noktas-gecis.html yazısında bahsetmiştik.

Devrenin çalışmasına bakacak olursak: Alternans geçişinde R5 direnci üzerindeki voltaj transistörü iletime geçirecek değere ulaşınca zincirleme olarak Q3 transistörü iletime geçer. Trg üzerindeki sinyal 0 seviyesine düşer. Bu da işlemciyi tetikler. 

Triyak devresinden bahsedecek olursak:

transistör, Triyak sürmek ve yalıtım sağlamak için MOC3021 ve Triyak var.
R direncine işlemci üzerinden voltaj uygulanınca led iletime geçer, triyak sürücü tetiklenir ve triyak tetiklenir. Yük enerjilenir.

Bu süreçte işlemci içinde olması gereken süreçleri ve kodları inceleyelim.

Sıfır Noktası Dedktörü (ZCD) tetik verince işlemci Alternansın sıfır noktasını geçtiği konusunda uyarılır. Bu noktada işlemci triyakı tetikleyeceği zaman için saymaya başlar. Bu sayma işlemi için timer kullanır. 

Küçük bir hesap yapalım.

Ülkemizde 220AC 50Hertz  gerilim kullanılmakta. 50Hz demek saniyede 50 defa hem pozitif hem negatif alternansı gördüğümüz anlamına gelir. Bu da 100 defa sıfır noktası geçişi anlamına gelir. 
Her alternansta dimm yapmak istediğimiz yüzde kadar bu süreyi bölmemiz gerekir. Her bir alternansı 100e bölecek olursak Timerımız her saniyede 100(saniyedeki geçiş) x 100(alternansdaki dimm maiktarımız) = 10.000 kadar sayması gerekir. 

Bunun için PIC mikroişlemci için 32Mhz de CCS C için 

setup_timer2(TMR_INTERNAL | TMR_DIV_BY_8, 199);  

ile ayarımız yapıyoruz.
Bu sayede Pic MCU saniyede 10.000 defa kesme oluşturuyor.

#INT_TIMER2
void  timer2_isr(void) 
{
  dimmCounter++;
  if (parentDimm==1)  //Eğer aprentDimm açık ise normal dimm yap yoksa triyakları kapat.
  {
      //triacları kontrol rutini
      //----------------- TRIAC1 ------------------------------------------
      if((dimm1Val>0)&&(enableDimm1==1)) //enable edilmediyse triac'ı açma
      {
         if((dimmCounter>dimm1Val)&&(dimmCounter<(dimm1Val+counterOnVal)))
         {
            hi_x(triac1);
         }
      }
      //triac'ı kapat
      if(dimmCounter>(dimm1Val+counterOnVal))
      {
         lo_x(triac1);
      }
     
     
      
  }
  else
  {
     lo_x(triac1);      //Eğer parentDimm kapalı ise triacları kapat
     lo_x(triac2);
  }
}

Burada timer kesmeye her girişinde dimmCounter değeri 1 artar.
dimm1Val  ve enableDimm değişkenlerinden sonra bahsedicem.

dimmCounter değeri dimm etmek istediğimiz değerden büyükse triyak açılır ve counterOnVal süresi kadar (burada 5 kesme) açık kal. Sonra kapat.

 if((dimmCounter>dimm1Val)&&(dimmCounter<(dimm1Val+counterOnVal)))
         {
            hi_x(triac1);
         }
      }
      //triac'ı kapat
      if(dimmCounter>(dimm1Val+counterOnVal))
      {
         lo_x(triac1);
      }

Buradaki dimm1Val değeri değiştirilerek triyakın açılma süresi değiştirilir. Bu da dimm değerinin değiştirilmesi anlamına gelir.  Burada alternans değişiminde bu işlemi tekrarlamak için ZCD tarafından tetiklenen bir external interrupt kullanılır.
#INT_EXT2
void  ext2_isr(void) 
{
   dimmCounter=0;
}

dimmCounter değeri sadece belirli aralıklarda açıldığı için bunu her alternansta sıfırlamak gerekir.

dimm1Val ve enableDimm değişkenleri zamanlama ayarını değiştirmeden triyakın açılmasını engellemek için tanımlanan değişkenlerdir. Bu değişkenlerin kullanılma sebebi işlemci Seri port gibi başka bir interrupta girildiği zaman triacın açık kalmasını engellemektir.

Motor kontrol ettiğinizi düşünün. Eğer triac açılır ve seri porttan uzun bir veri alınırsa veri alma işlemi bitene kadar motorunuz son sürat çalışmaya başlar bu da kontrolü kaybetmeniz anlamına gelir. Böyle bir durumdan kaçınmak için kontrol değişkenleri kullanmak zorundayız.

Faydalı oması umuduyla...


1 Temmuz 2018 Pazar

Basit Bileşenlerle İşlevsel Araçlar Yapalım.

Tek başına çalışan kişiler genelde yardımcı araçları çok kullanırlar. Birşeyi kesip biçerken, yapıştırınken, lehimlerken yardımcı bir el her zaman işimizi kolaylaştırır. Ama bir yardımcınız yoksa iş üzerinde size yardım edecek cihazlar edinirsiniz.


Bistüri yapalım.

Gerekli malzemeler:

M2.5 somun ve vida
Kalemtraş
5mm çapında alüminyum boru.

Öncelikle alüminyum boruyu mengene vasıtasıyla şekillendirelim.





Tornavida ile kalemtraşın kesici kısmını sökelim.


Tekrar mengeneyi kullanarak; bıçağı, tatlı-sert girecek şekilde şekillendirelim. 
Metrik 2.5 tığ ile vida deliği açalım.

Sonra hepsini birleştirelim.


Elinizde 5mm boru yok ise aynı bistüriyi farklı malzemelerle yapabiliriz. 



Gerekli malzemeler:

Panelli PCB kenarlarında bulunan 5mm feeder.
0.5mm saç levha
M2.5 vida-somun
Teneke makası
Mengene
Pense vb.

Önce saç levhayı kesip şekillendirelim.





Sonra vida deliği açalım.

Malzemelerimiz
Toplayalım


Bıçak ve Pcb feederı yan yana koyup mengene ile tatlı sert hareket edecek kadar sıkıp sonra vidalayalım.


Sessiz Uşak Yapalım:

Gerekli Malzemeler:

Kışkaç yada krokodil
Daralan Makaron
M3 Vida-Somun
Havşa Yatak Açma Aparatı
Aliminyum tabanlık ve kol için 1cm genişlikte parça


Kışkaç tuttuğum malzemeyi çizmesin diye kıskaç uçlarına daralan makaron ile kapladım.

Kıskaç yada krokodili aliminyum parçaya vidalayalım. 

Sonra bunu tabanlığı hazırlayıp vidalayalım.


Havşa aparatı ile havşa başlı vidanın oturması için yatak açalım.


Sonra diğer parça ile birleştirelim.

Sonra kullanalım.

Özellikle SMD malzeme lehimleme-sökme işlemlerinde bir elde cımbız diğer elde sıcak hava tabancası olunca PCB tutacak bir yardımcı lazım oluyor.

Faydalı olması umuduyla...

19 Haziran 2018 Salı

Masaüstü Dijital Saat Yapalım.

Kendi yaptığım cihazların çalışmasını görmeyi ve kullanmayı seviyorum. Şimdi de telefon, bilgisayar ve duvarda saat olmasına karşın kendime çalışma masasında kullanacağım  bir saat yapmayı istiyorum.
Sadece saat olarak tasarlamaya başladım ama şu da olsun bu da olsun derken proje sadece saat olmaktan çıktı. PCB tasarlarken aşağıdaki özellikleri ekledim. Aslında saatten çok hava tahmin istasyonuna döndü diyebilirim.

PCB tasarımda eklenen donanımlar:
* DS1307 saat çipi
* 24C64 eeprom
* SHT11 Nem ve Sıcaklı Sensörü
* DS18B20 sıcaklık sensörü
* LDR yada Foto Diyotla ışık seviyesi ölçümü
* HMTRP - XBee kablosuz bağlantısı için port
* Buzzer
* 5 adet button
* USB bağlantısı
* 4*20karakter LCD
* 18 Adet GPIO içeren soket


PCB çizim işlemi bittikten sonra PCBWAY ile iletişime geçtim. PCB üretimi 5$ tuttu. Diğer PCBlerle beraber kargosu 17$ tuttu. Adetli üretim için yerli PCB üreticileri ile iletişime geçilmesini tavsiye ederim ama numune üretimi için hızı ve fiyatlandırması açısından PCBWAY'i tek geçerim.

Her pcb toplama yazımda ister istemez PCBWAY'den bahsediyorum çünkü pcb üretimi konusunda yazı, video başına bonus veriyor. Omega2+ konulu yazı için pcb maliyeti kadar bonus verdi. Eğer bu yazılardan birine daha bonus verirse bir sonraki 3-4 pcbnin üretimi ve kargosu bedavaya gelecek. Yalan yok :)

Dijital Saat Projesi'nde yukarıda bahsettiğim donanımların hepsini devreye alıp ortam hakkında nem, sıcaklık, ışık seviyesi bilgilerini hem okuyup hem de RF ile bir merkeze aktarmayı ve bilgisayarda log tutmayı planlıyorum. 18 adet GPIO soketini de biraz bunun için yerleştirdim. Soket sayesinde Dijital Saat I2C, SPI, UART, IO, CANBUS iletişimi kurabilecek kapasiteye sahip. Başka bir devreyi kontrol etmek yada uzaktan kontrol sağlamak için başka projelerle birleştirilebilir. Bu sayede bir PCB ile birden çok proje çıkartılabilir. Benim gibi hobi amaçlı elektronikle uğraşanlar için bu iyi bir özellik.

Kartta hem DS18B20 hem de SHT11  bulunması mantıklı gelmeyebilir. Bu yerleşimin amacı elimde elimde 1 adet bulunan SHT11 in pahalı olması. Yaklaşık 12$ + KDV. Amaç elimdekini kullandıktan sonra daha sonra kullanacağım pcblerde DS18B20 ile devam etmek. Hem malzeme değerlenecek hem de her kart için yüksek fiyatlı malzeme alınmamış olacak.


Krem lehim ve SMD malzeme dizimi


Fırınlama


Soketler ve DIP kılıf Malzeme Lehimleme İşlemleri



Yükseltme ayağı ve LCD Ekran Montajı








Şimdilik sadece montaja ait görüntüler var. Programlama safhasına geçince hem açıklama hem de kodları paylaşmaya çalışacağım. 

MC60 GSM / GNSS PCB ve Malzeme Listesi, OMEGA2+ Geliştirme Kartı ve Malzeme Listesi ve Dijital Saat Projesi PCB ve Malzeme Listesini  buradan paylaşmayı düşünüyorum. Aynı şekilde PCBWAY üzerinden kartları anonim üretime de açmak niyetindeyim. Maksat ihtiyacı olan kullansın. 

  Faydalı olması umuduyla...



18 Haziran 2018 Pazartesi

Python GPS verisi işleme uygulaması yapalım.

Omega2+ ile yazılım geliştirme bordunun üretimini ve seri port, veritabanı uygulamalarını daha önceki yazılarımda anlatmıştım.
Şimdi de Omega2+ üzerinde Python ile Gps verisi işleme kısmını anlatmaya çalışacağım. Burada GSM/GNSS destekli modül kullandığım için GPS/Glonass verileri  komut gönderince gelecek. Normalde seri porta bir GPS alıcısı bağladığınız zaman 1PPS yani saniyede 1  defa GPS/Glonass verisini gönderecektir. GSM modülle veri alıyorsanız GPS konumu için komut gönderin, GPS alıcısından veri alıyorsanız sadece seri portu kontrol edin.


Yazılım geliştirmek için Quectel MC60 modülü kullanıyorum. GSM modül üzerinden GPS verisi alıp işleme olayına başlayalım.



Seri porta veri yazmak için bir fonksiyon tanımladım.

def seriPortYaz(veri,bekle=1,bildir=""):

 ser.write(veri.encode('utf-8'))

 sayac=0

 while(ser.in_waiting==0) and  (sayac<bekle):

  sleep(0.1)

  sayac+=1

 if (sayac>bekle):

  print("Cevap yok: {}...\r\n".format(veri))  


  if bildir!="":

  print("SER: {}\r\n".format(bildir))



 temp=ser.read(ser.in_waiting)

 gsmRespText=temp.decode('utf-8')

 print("Ser Read: {}\r\n".format(gsmRespText))



Burada veri bekle ve bildir parametreleri var.

veri; seri porta yazılacak komutu,

bekle; komut için beklenecek timeout süresini,

bildir ise komut ile ilgili python etkileşimli kabuğuna bildirim yapılmasını sağlıyor. bekle ve bildir default parametre aldığı için fonksiyonun kullanımı esnasında pas geçilebilir.



while döngüsü ile komut gsm modüle gönderildikten sonra seri porta veri gelene kadar yada timeout olana kadar beklenmesi sağlanıyor.

Eğer veri gelirse döngüden çıkıyor.

Gelen veriyi temp değişkenine alıp decode işlemi uyguluyor. decode önemli çünkü yapılmayınca \r (return) \n (new line) karakterleri ascii formatta değil normal yazı olarak çıkıyor ve bunlarla işlem yapılması zorlaşıyor.



Komut göndermek için bir fonksiyon daha tanımladım.



def atGonder(komut):

    if "AT+QGNSSRD" in komut:

  gelen=seriPortYaz(komut,30,komut)

  # gelen veri GNSS verisi ise

  if "+QGNSSRD:" in gelen:

   

   global latitude

   global longitude

   global rakim

   global yon

   global kms

   global knots

   global uydu

   global gnssTarihSaatListe

   global gnssTarih

   global gnssSaat

   global longitudeGo

   global latitudeGo

   

   

   GNSSListe=gelen.split()

   #print("GNSS: {}\r\n".format(GNSSListe))

   for i in GNSSListe:

    if "VTG" in i:

     VTGListe=i.split(",")

     print("liste: {}\r\n".format(VTGListe))

    if "RMC" in i:

     RMCListe=i.split(",")

     print("liste: {}\r\n".format(RMCListe))

    if "GSA" in i:

     GSAListe=i.split(",")

     print("liste: {}\r\n".format(GSAListe))

    if "GLL" in i:

     GLLListe=i.split(",")

     print("liste: {}\r\n".format(GLLListe))

    if "GSV" in i:

     GSVListe=i.split(",")

     print("liste: {}\r\n".format(GSVListe))

    if "GGA" in i:

     GGAListe=i.split(",")

     print("liste: {}\r\n".format(GGAListe))

   #RMCListe[3] elamanın uzunluğu 3 ten büyükse öyle işlem yap

   if len(RMCListe[3])>3:

    latitude.clear()

    latitude.append(RMCListe[3])

    latitude.append(RMCListe[4])

    longitude.clear()

    longitude.append(RMCListe[5])

    longitude.append(RMCListe[6])

    print("latitude: {} ; longitude: {}\r\n".format(latitude, longitude))

    

    longDeg=longitude[0][:3]

    longMn=longitude[0][3:5]

    longSec=longitude[0][6:8]

    longMs=longitude[0][8:10]

    

    latDeg=latitude[0][:2]

    latMn=latitude[0][2:4]

    latSec=latitude[0][5:7]

    latMs=latitude[0][7:9]

    

    print("degrees: deg:{} mn:{} sec:{} ms:{}\r\n".format(longDeg,longMn,longSec,longMs))

    print("degrees: deg:{} mn:{} sec:{} ms:{}\r\n".format(latDeg,latMn,latSec,latMs))

    

    longStr=longMn+"."+longSec+longMs

    longitudeGo=float(longStr)

    longitudeGo=longitudeGo/60

    longitudeGo=longitudeGo+int(longDeg)

    

    latStr=latMn+"."+latSec+latMs

    latitudeGo=float(latStr)

    latitudeGo=latitudeGo/60

    latitudeGo=latitudeGo+int(latDeg)

    

    

    print("longitudeGo:{}\r\n".format(longitudeGo))

    print("latitudeGo:{}\r\n".format(latitudeGo))

    

    

    

    yon=float(RMCListe[8])

    knot=float(RMCListe[7]) # knot cinsinden hız

    kms=float(VTGListe[7]) # km/s cinsinden hız

    rakim=float(GGAListe[9])

    print("hız: {:.2f} knots, {:.2f} km/s, yon: {:.2f} derece, rakım: {:.2f} mt\r\n".format(knot,kms,yon,rakim))

    gnssSaat=(RMCListe[1].split("."))[0]

    print("gnssSaat: {}\r\n".format(gnssSaat))

    gnssTarih=RMCListe[9]

    

    gnssTarihSaatListe.clear()

    gnssTarihSaatListe.append(gnssTarih[4:6])

    gnssTarihSaatListe.append(gnssTarih[2:4])

    gnssTarihSaatListe.append(gnssTarih[:2])

    gnssTarihSaatListe.append(gnssSaat[:2])

    gnssTarihSaatListe.append(gnssSaat[2:4])

    gnssTarihSaatListe.append(gnssSaat[4:6])

    

    print("gnssTarihSaatListe: {}\r\n".format(gnssTarihSaatListe))


else:  # eğer komut yukardaki komutlardan biri değilse normal işleme devam et   

  gelen=seriPortYaz(komut,3,komut)



Burada

atGonder("AT+QGNSSC=1\r") #GNSS Power On

atGonder("AT+QGNSSCMD=0\r")   #GNSS NMEA Tipi



komutları ile MC60 modülün GNSS'yi aktif ettim ve GPS verisi tipini en çok kullanılan standartlardan biri olan NMEA olarak seçtim.



Yukarıda fonksiyon içinde eğer gelen komut  AT+QGNSSRD ise şartı var. Eğer komut AT+QGNSSRD ise seri porta bu komutu verdikten sonra gelen cevabı alıp parçalamaya başlıyor. Yazımıza konu olan kısım da aslında burası.



global olarak tanımlamanın sebebi fonksiyon içinde tanımlanan değişkenlerin ana program bloğunda, ana blokta tanımlanan değişkenlerinde fonksiyon içinde çalışmaması.



Yani fonksiyon içinde tanımladığım a=5 bütün program genelinde geçerli değil. Aynı şekilde program başında tanımladığım a=3 fonksiyon içinde geçerli değil. Global ile bu sorunu aşıyorum.



GSM modüll değil de GPS ile veri alanlar komut gönderme yapısı ile ilgili işlemleri atlayabilirler.



GPS / GNSS verisi yaklaşık olarak aşağıdaki gibi bir cümledir:


$GPRMC,000009.800,V,,,,,0.00,0.00,060180,,,N*43

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

$GPGGA,000010.800,,,,,0,0,,,M,,M,,*41

$GPGSA,A,1,,,,,,,,,,,,,,,*1E

$GPRMC,000010.800,V,,,,,0.00,0.00,060180,,,N*4B

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

$GPGGA,000011.800,,,,,0,0,,,M,,M,,*40

$GPGSA,A,1,,,,,,,,,,,,,,,*1E

$GPRMC,000011.800,V,,,,,0.00,0.00,060180,,,N*4A

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

$GPGGA,000012.800,,,,,0,0,,,M,,M,,*43

$GPGSA,A,1,,,,,,,,,,,,,,,*1E

$GPGSV,1,1,00*79


GPRMC: minimum gerekli GPS verisi bilgisi

GPVTG: hareket bilgisi

GPGSA: Uydu bilgilerini içermektedir.


Bizim için enlem, boylam, saat, tarih, hız, yön ve rakım bilgileri yeterli olacaktır.

Saat konusunda da saatin Greenwich saati olduğunu belirteyim. Local saat değil. Bu yüzden saati kullanırken yerel saat eklemesini varsa gün / ay hatta yıl düzeltmesi yapılması gerektiğini belirteyim.


Python ile çalışmanın en sevdiğim taraflarında biri listeler. Veriyi alıp a.split(",") virgüllerinden ayırıp listeye ekle gibi basit bir  komutla bütün işi sizin yerinize hallediyor. 

Burada da yaptığımız iş bu. 


$GPRMC,194530.000,A,3051.8007,N,10035.9989,W,1.49,111.67,310714,,,A*74


gelen veriyi \r\n karakterlerinden bölüp listeye attık.


GNSSListe=gelen.split()


sonra GNSSListe içindeki her bir eleman için döngü kurduk.


for i in GNSSListe:


eğer cümle RMC içeriyorsa;


if "RMC" in i:

    RMCListe=i.split(",")

    print("liste: {}\r\n".format(RMCListe))


RMCListe adında bir birlisteye içeriği virgüllerle böl.


Sonra Listenin birinci elemanı saat, ikinci elamanı enlem, boylam, hız, yön, rakım vs sırasıyla değişkenlere alıp işi bitiriyoruz. 


Listenin hangi elemanı hangi değeri tutuyor kodlara bakarak anlaşılabilir.


longDeg=longitude[0][:3]

    longMn=longitude[0][3:5]

    longSec=longitude[0][6:8]

    longMs=longitude[0][8:10]

    

    latDeg=latitude[0][:2]

    latMn=latitude[0][2:4]

    latSec=latitude[0][5:7]

    latMs=latitude[0][7:9]

    

    print("degrees: deg:{} mn:{} sec:{} ms:{}\r\n".format(longDeg,longMn,longSec,longMs))

    print("degrees: deg:{} mn:{} sec:{} ms:{}\r\n".format(latDeg,latMn,latSec,latMs))

    

    longStr=longMn+"."+longSec+longMs

    longitudeGo=float(longStr)

    longitudeGo=longitudeGo/60

    longitudeGo=longitudeGo+int(longDeg)

    

    latStr=latMn+"."+latSec+latMs

    latitudeGo=float(latStr)

    latitudeGo=latitudeGo/60

    latitudeGo=latitudeGo+int(latDeg)



Yukarıdaki satırlarda klasik GPS cümlesi ile google maps'ın kullandığı GPS sistemi arasında 60lık sistem 100lük sistem çevrimi var.

Olay şu:

 3051.8007 koordinatları google maps sistemine çevrilirken 30 derece sabit kalıyor. 51.8007 kısmı alınıp 60'a bölünüyor. Sonra 30 ile toplanıyor. Sonuç 30,863345 çıkıyor.


Buradan sonra GPS  / GNSS verilerini istediğiniz şekilde kullanabilirsiniz.


Faydalı olması umuduyla...


12 Haziran 2018 Salı

Dual Dimmer SMD Reflow (Çift Dimmerli SMD Fırın) Yapalım. PART 1

NOT: Bu yazı

PART 1 Elektronik kısımın montajı,
PART 2 Mekanik kısmın oluşturulması
PART 3 Yazılım Geliştirme

olarak 3 ana başlıkta incelenecektir.

Daha önce SMD malzemeleri lehimlemek için halihazırda da kullandığım SMD fırını yaptım. Kullanışlı oldu ama malzeme sadece alttan ısıtıldığı için üstten sıcak hava tabancası ile hem ısıtma hem de sıcaklık takibi yapmak gerekiyordu.

Bunu bir adım öteye taşıyıp hem kendimi geliştirmek hem de diğer projelerin üretiminde kullanmak için Dual Dimmer SMD Reflow projesine hazırlanmaya başladım.

Projede aşağıdaki hedeflere ulaşmayı planlıyorum.

1) Bağımsız olarak hem alttan hem de üstten ve alt - üst beraber ısıtma yapabilmek.
2) Dimmer fonksiyonu ile önce SMD malzemeleri 110°C kadar ön ısıtma yapıp sonra 200-230°C çıkarıp fırınlamak.
3) Çift PT100  sensorle ısıtma işini otomatik yaptırmak.
4) Proses başlangıcı, durumu ve değerleri LCD ekrandan takip etmek.
5) Butonlarla menü, ısıtma, süre ayarları yapıp profil olarak kaydetmek.
6) RF modül ile bilgisayardan kumanda / takip / kontrol etmek

Devrede LCD hariç 4 ayrı pcb var.
Bunlar:
1) Zero Crossing Detector (Bir önceki yazıya konu olan Sıfır Geçiş Dedektörü - ZCD)
2) XBee kılıfında HMTRP-433 modülü
3) MCU bordu
4) Dimmer Bordu

PCB çizimi bittikten sonra üretim için PCBWAY ile temasa geçtim. 30 Mayıs'ta verdiğim sipariş 11 Haziran'da PTT aracılığıyla elime geçti.
Pcblerin üretim kalitesi ve fiyatlandırması gerçekten çok iyi.

XBee-HMTRP shiled, MCU Bordu, Dimmer Bordu ve diğer bir yazımda üretimini anlatacağım Masaüstü Dijital Saat pcbleri toplamda kargo dahil 35$ tuttu.

4 PCB 5er $, 17$ kargo, 3$ Aliexpress komisyonu ve 5$ PCBWAY üyelik indirimi ile toplam 35$ ödedim.
Driver bordu 1.6mm kalınlıkta olduğu için kargo fazla tutmasın diye 5 adet sipariş ettim. Sadece 5 adetlik azalma kargoya 4$ olarak yansıdı. Buradan PCBWAY üreticilerine de teşekür etmek istiyorum.
Thanks a lot for your high quality and fast pcb production and shipping.

 






Pcblere krem lehim çekip malzeme dizmekle işe başladım.



Header lehimlerinden sonra XBee - HMTRP Shield artık hazır. Bu modülü hem USB - XBee Shield ile kullanmak hem de kendi devremde ister orjinal Xbee ister HMTRP modül kullanabilmek için tasarladım.

En üstteki parça USB-XBee çeviriciye takılmış hali.

Sonra Dimmer Bordum Krem lehim ve üretim aşamaları var.


Röle, Triyak, Konnektör, Buzzer, Sigorta, Optokuplor vs montajı





MCU bordu için krem lehim ve diğer dizgi aşamaları...





MCU bordunda işlemci olarak dspic33fj128MC804 kullandım. Belki bu proje için fazla özellikli bir işlemci gibi gelebilir ama elimde birkaç tane vardı. Yemeği elde malzeme ile yapmak istedim. Fırsat bulunca yazılımını da geliştirmeye başlayacağım. Onu da başka bir yazıda işleyip paylaşacağım. 


Sonra bordları vidalar ve daha önce bahsettiğim yükseltme ayakları ile toparladım.







Fırın rezistansı olarak aslında en uygun olanı düzgün ısı akışı özelliğinden dolayı Seramik rezistans. Türkiye'de birçok malzemeyi bulmakta güçlük yaşadığımız gibi seramik rezistansların uygun boyut ve güçte tipini bulmakta da zorluk yaşıyoruz. Birkaç yerden fiyat araştırması yapınca ortalama 200Tl/Adet gibi fiyatla karşılaştım. Aliexpresste 240*120mm boyutlarında 300-400Watt modelleri var. Onlardan kullanmak istiyorum. tanesi 15-20$ civarinda. Şimdilik daha önceki SMD fırında da kullandığım 1,5KW Infaruj UFO rezistansından 2 tane kullanmayı planlıyorum.

Mekanik işçiliği ve ürün yazılımının geliştirilmesini hem zamana yaymak hem de ayrı bir yazıya konu etmek istiyorum. Hatta yazılım geliştirma kısmı bittikten sonra picproje.org forumundaki  @elektroemre'nin panelduino projesinde yaptığı gibi hem PCBWAYde pcbyi paylaşıma açmayı hem de kodları burayı yükleyip isteyenlerin kullanımına açmayı planlıyorum.

Umarım faydalı olur.