TM1628 LED Driver entegresi ile denemeler

Sercan

--
Katılım
17 Mart 2019
Mesajlar
4,956
Özellikle eski DVD, VCD ya da uydu alıcılarının ön PCB'sinde bolca bulunan TM1628 entegresi çok sık karşıma çıkıyor. Son olarak elime DVD parçaları geçti ve içinde TM1628 ile sürülen bir 7 segment vardı. Bu entegre hem 7-segment sürebiliyor hem de bir diğer güzel yanı 16 taneye kadar bağımsız buton destekliyor. Yani mikrodenetleyinin sadece 3 dijital portu ile dışarı bilgi vernek ve 16 taneye kadar input almak mümkün. Yani küçük mikrodenetleyiclerde kullanmak için çok avantajlı. Bende SMP-060.PCB kod ile üretilmiş bir PCB ve 4 butonlu tuş takımı bulunuyor.

20230426_152536.jpg
20230426_152441.jpg
20230426_152455.jpg


Göstergeyi Arduino Nano ile deneysel olarak çalıştırmaya karar verdim.

İnternette yaptığım araştırmalarda birkaç siteye denk geldim. Birinci sırada çıkan onetransistor.eu adlı siteyi okuduğumda, sayfada ifade edilen kütüphanenin, belirli bir ekrana göre atanmış adresler olduğunu bu sebeple kendi ekranında çalışmadığını anlatıyor. Kendisi bu kütüphaneyi düzenlemiş ama verdiği github adresine erişilemiyor. Neyse bu kütüphanenin benim ekranla da çalışmayabileceğini anladım. Öyle de oldu zaten.

Arduino IDE içinde kütüphane araması yaptığınızda TM16XX isimli bir başka kütüphane bulmak da mümkün. Bu kütüphane ise sanıyorum TM16 serisindeki birden fazla entegreyi, aşağıdaki gibi (TM1638) hazır modüllerle sürmekte kullanılıyor. Ben bu kütüphaneyi hiç denemedim.

71WuPaLBN4L._AC_UF894,1000_QL80_.jpg



Neyse onetransistor.eu sitesinde kendi ekranında çalışmadığını söylediği Vasyl Yudin tarafından geliştirilen TM1628 kütüphensi üzerinden ilerlemeye karar verdim. Kütüphanedeki adresleri bulup, bendeki ekrana göre düzenledim. Yaptığım şey adresleri bulup ilgili dizileri buna göre düzenlemekti. Olurda elinize bendeki gibi bir PCB geçer ve kullanmak isterseniz, düzenlediğim kütüphaneye forklayıp kendi düzenlediğim github adresimden erişebilirsiniz. Bu kütüphaneyi Arduino IDE'nin Library klasörüne koymanız yeterli.

Henüz butonları bağlamadım, dolayısıyla sadece 7 segment ve ekrandaki yardımcı LED'leri kontrol ediyorum.

Vakit bulduğumda butonların olduğu PCB'yi de bağlayıp, onları deneyeceğim. Son olarak PCB üzerinde bulunan IR alıcıyı da aktifleştirip, belirli bir kumandadan gelen komutlara göre işleyeceğim.




Yukarıdaki videoda çalışan kod:
#include <TM1628.h>
// define - data pin D9, clock pin D8 and strobe pin D7
TM1628 dvdLED(9, 8, 7);
byte intensity = 0;
int initLED = 0;

void setup() {
  Serial.begin(9600);
  dvdLED.begin(ON, 7);
}

void loop() {

  // ilk açılışta bütün karakterleri ve LED'leri aç
  dvdLED.setTime(8, 88, 88);
  for (initLED = 0; initLED < 17; initLED++) {
    dvdLED.setLEDon(initLED);
  }
  delay(1000);

  // parlaklığı 0'dan 7'e güncelle
  if (intensity == 0) {
    for (intensity; intensity <= 7; intensity++) {
      dvdLED.begin(ON, intensity);
      delay(1000);
    }
  }

  // Ekranı temizle
  dvdLED.clear();
  delay(1000);

  // Disk LED'lerini 3 defa aç-kapat
  for (int i = 0; i < 3; i++) {
    dvdLED.setDisc(true);
    delay(300);
    dvdLED.setDisc(false);
    delay(300);
  }

  // Disk dönme efektini 6 tur uygula
  for (int tur = 0; tur < 6; tur++) {
    for (int discAddress = 4; discAddress < 7; discAddress++) {
      dvdLED.setLEDon(discAddress);
      dvdLED.setLEDon(discAddress + 3);
      delay(180);
      dvdLED.setLEDoff(discAddress);
      dvdLED.setLEDoff(discAddress + 3);
      delay(20);
    }
  }
  delay(500);

  // İlkel bir kronometre başlat
  for (int saat = 0; saat <= 24; saat++) {
    for (int dakika = 0; dakika <= 60; dakika++) {
      for (int saniye = 0; saniye <= 60; saniye++) {
        dvdLED.setTime(0, dakika, saniye);
        dvdLED.setLEDoff(0x0B);
        delay(493);
        dvdLED.setLEDon(0x0B);
        delay(493);
        Serial.println(saniye);
      }
    }
  }
}

/* sequence of LEDs:
  LED_DVD 0x00
  LED_PLY 0x01
  LED_PAU 0x02
  LED_CD_ 0x03
  LED_DC1 0x04
  LED_DC2 0x05
  LED_DC3 0x06
  LED_DC4 0x07
  LED_DC5 0x08
  LED_DC6 0x09
  LED_CL1 0x0A
  LED_CL2 0x0B
  LED_VCD 0x0C
  LED_DTS 0x0D
  LED_DDD 0x0E
*/
 

Ekler

  • TM1628english.pdf
    412.9 KB · Görüntüleme: 93
Hakkaten hap gibi entegre o. Aliexpress'teki birçok cihazın içinden de çıkıyor.

Yalnız probları breadboard'a dürtmüşsün, breadboard kontaktlarına çok zarar verir o, sonra temassızlık sorunları yaşarsın.
 
Yalnız probları breadboard'a dürtmüşsün, breadboard kontaktlarına çok zarar verir o, sonra temassızlık sorunları yaşarsın.
Haklısın, aslında kablolara doğrudan probun yaylı kancasnı bağlıyordum ama birbirine temas sorunu olabilir diye öyle dandik bir iş yaptım. Senin ölçü aleti probuna yaptığın gibi düzgün bir çözüm uygulamalıyım.
 
Haklısın, aslında kablolara doğrudan probun yaylı kancasnı bağlıyordum ama birbirine temas sorunu olabilir diye öyle dandik bir iş yaptım. Senin ölçü aleti probuna yaptığın gibi düzgün bir çözüm uygulamalıyım.
Igne uclu prob aldim dun. Daha once dupont ve krokodil bagladigim kabloyu tutturuyordum proba ama ince probda gerekiyordu. Kendi yaptigim problari da pek gozum tutmadi, hazirini aldim. Sanirim onlar breadboard icinde uygun olacak. Bu sekilde cozulebilir bu sorun. Gelince denerim.
 
Doğrudan ucunda Dupont olan kablo da olur eğer yeterince sıkı geçiyorsa. Proba göre değişir.

IMG_20230502_155713.jpg
 
Igne uclu prob aldim dun. Daha once dupont ve krokodil bagladigim kabloyu tutturuyordum proba ama ince probda gerekiyordu. Kendi yaptigim problari da pek gozum tutmadi, hazirini aldim. Sanirim onlar breadboard icinde uygun olacak. Bu sekilde cozulebilir bu sorun. Gelince denerim.

Sadece probun ucunun çapı değil sorun. Probu breadboard'daki deliğe dürtünce arkadaki kablo probu kaldıraç gibi kanırtıyor. Bu da kontaktların birbirinden ayrılmasına sebep oluyor.

Eğer tam olarak breadboard deliklerine uygun bir prob bulduysan, bir tane de prob tutucu bir örümcek yapabilirsin belki

1683032549836.png
 
Bena göre dupont kullanmak iyi bir çözüm. Şimdi baktım da probun ucu konik ama yarıya kadar rahatlıkla giriyor. Tam sonuna kadar ittirmeden rahatlıkla kullanılabilir. Bende hazırda bir sürü dupont kablo var, gerekirse özel olarak da üretebilirim.

20230502_160341.jpg
20230502_161030.jpg
 
Sadece probun ucunun çapı değil sorun. Probu breadboard'daki deliğe dürtünce arkadaki kablo probu kaldıraç gibi kanırtıyor. Bu da kontaktların birbirinden ayrılmasına sebep oluyor.

Eğer tam olarak breadboard deliklerine uygun bir prob bulduysan, bir tane de prob tutucu bir örümcek yapabilirsin belki

23566 eklentisine bak
Iyi fikirmis. 3D yazicim yok. Onu da soyle cozerim. Elimde cok onceden aldigim ama kullanmadigim elbise askilari var, 1 cm x 30 cm boru seklinde. Onlardan uygun boyutlarda keser seramik hamuruyla birlestiririm. Hareketli kisimlari delip civata - somunla tutturursam gorseldeki kadar estetik olmasa da ise yarar bir sey cikar sanirim.
 
Probu tutturmak icin de eski marker kalemlerin kapaklarindan keserim. O sekilde olur tutturucu kisim. Taban icinde cok ucuza aldigim bir tane pilates matı vardı, ondan kesip kullaniyorum. 170 cm - 80 cm. yariya gelmedi daha. Her seyin altina yapistirdim bir de :D Kaymaz taban vb icin ideal bir sey.
 
PCB üzerinde bulunan IR alıcıyı da aktifleştirip, belirli bir kumandadan gelen komutlara göre işleyeceğim.

İlk gönderide bahsettiğim, yukarıdaki denemeyi bugün yaptım.

Aşağıda göreceğiniz gibi lazım olur diye birçok kumandayı saklamıştım. Test için -özel bir sebep olmadan- Pioneer kumandayı kullanmaya karar verdim.

20230506_143803.jpg


Projeyi genişletmeden önce kumanda ve alıcının fiziksel olarak doğru çalıştığından emin olmak istedim.

Kumandayı doğrulamak için cep telefonu kamerasını kullandım. Eğer kızılötesi filtre yoksa, kameralar kumandaların yaydığı IR ışığı görüntüleyebiliyor.

Alıcı tarafında ise kablolara erişimim olduğu için osiloskop ile bir sinyal ulaşıp ulaşmadığından emin oldum.

ScreenImg.png


İkisinin de çalıştığını doğruladıktan sonra kodlamaya başladım. Önce kumandanın tuşlarından ulaşan değerleri kaydettim. Sonra bunları switch case içinde işledim. Sonrası ihtiyaç ve hayal gücünüze kalıyor.

Ben burada ekran parlaklık değerini ayarlamakla birlikte DVD-CD-VCD, dts-ddd ve Play-Pause seçimi ile 0-99 arasında ses ayarını ekrana yazdırdım. Bir de koşul ekledim. DVD-CD-VCD tercihi değiştirilirse Play-Pause her ne durumda olursa olsun Pause konumuna geçiyor.

Kod:
IR Alıcı:
#include <IRremote.h>
#include <TM1628.h>
int intensity = 0;
int initClockLED = 0;
int Volume = 0;
unsigned long lastCommandTime = millis();
int sourcesInit = 0;
unsigned char sources[] = { 0x00, 0x03, 0x0C };
int playPauseInit = 0;
unsigned char playPause[] = { 0x01, 0x02 };
int functionsInit = 0;
unsigned char functions[] = { 0x0D, 0x0E };
// define - data pin D9, clock pin D8 and strobe pin D7
TM1628 dvdLED(9, 8, 7);
#define IR_RECEIVE_PIN 10
// Pioneer Remote Control
#define VOLUME_PLUS 10
#define VOLUME_MINUS 11
#define ATT 12
#define AUDIO 13
#define BAND_ESC 18
#define FUNCTION 103  //25-103
#define DSIP 109      //25--109
#define SRC 26
#define UP 64
#define DOWN 65
#define LEFT 66
#define RIGHT 67
#define PAUSE 88

void setup() {
  Serial.begin(9600);
  dvdLED.begin(ON, intensity);
  IrReceiver.begin(IR_RECEIVE_PIN);
  dvdLED.setLEDon(0X02);  // Pause On
  dvdLED.setLEDon(0x0D);  // dts On

  dvdLED.setSeg(3, (Volume / 10));
  dvdLED.setSeg(4, (Volume % 10));
  dvdLED.update();
}

void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.resume();
    int command = IrReceiver.decodedIRData.command;
    Serial.println(command);
    switch (command) {
      case VOLUME_PLUS:
        {
          Serial.println("VOLUME_PLUS");
          Volume++;
          Volume = min(Volume, 99);
          dvdLED.setSeg(3, (Volume / 10));
          dvdLED.setSeg(4, (Volume % 10));
          dvdLED.update();
          break;
        }
      case VOLUME_MINUS:
        {
          Serial.println("VOLUME_MINUS");
          Volume--;
          Volume = max(Volume, 0);
          dvdLED.setSeg(3, (Volume / 10));
          dvdLED.setSeg(4, (Volume % 10));
          dvdLED.update();
          break;
        }
      case BAND_ESC:
        {
          Serial.println("BAND_ESC");
          break;
        }
      case ATT:
        {
          Serial.println("ATT");
          break;
        }
      case UP:
        {
          Serial.println("UP");
          intensity++;
          intensity = min(intensity, 7);
          dvdLED.begin(ON, intensity);
          break;
        }
      case DOWN:
        {
          Serial.println("DOWN");
          intensity--;
          intensity = max(intensity, 0);
          dvdLED.begin(ON, intensity);
          break;
        }
      case LEFT:
        {
          Serial.println("LEFT");
          break;
        }
      case RIGHT:
        {
          Serial.println("RIGHT");
          break;
        }
      case FUNCTION:
        {
          if (waitBeforeNext()) {
            dvdLED.setLEDoff(functions[functionsInit]);
            (functionsInit == (sizeof(functions) - 1)) ? functionsInit = 0 : functionsInit++;
            dvdLED.setLEDon(functions[functionsInit]);
            Serial.println("FUNCTION");
          }
          break;
        }
      case AUDIO:
        {
          Serial.println("AUDIO");
          break;
        }
      case SRC:
        {
          if (waitBeforeNext()) {
            dvdLED.setLEDoff(sources[sourcesInit]);
            (sourcesInit == (sizeof(sources) - 1)) ? sourcesInit = 0 : sourcesInit++;
            dvdLED.setLEDon(sources[sourcesInit]);
            dvdLED.setLEDoff(0X01);
            dvdLED.setLEDon(0X02);
            Serial.println("SRC");
          }
          break;
        }
      case PAUSE:
        {
          if (waitBeforeNext()) {
            dvdLED.setLEDoff(playPause[playPauseInit]);
            (playPauseInit == (sizeof(playPause) - 1)) ? playPauseInit = 0 : playPauseInit++;
            dvdLED.setLEDon(playPause[playPauseInit]);
            Serial.println("PAUSE");
          }
          break;
        }
      case DSIP:
        {
          Serial.println("DSIP");
          break;
        }
      default:
        {
          Serial.println("Button not recognized");
        }
    }
  }

}
bool waitBeforeNext() {
  if (millis() - lastCommandTime > 300) {
    lastCommandTime = millis();
    return true;
  }
  return false;
}
/* sequence of LEDs:
  LED_DVD 0x00
  LED_PLY 0x01
  LED_PAU 0x02
  LED_CD_ 0x03
  LED_DC1 0x04
  LED_DC2 0x05
  LED_DC3 0x06
  LED_DC4 0x07
  LED_DC5 0x08
  LED_DC6 0x09
  LED_CL1 0x0A
  LED_CL2 0x0B
  LED_VCD 0x0C
  LED_DTS 0x0D
  LED_DDD 0x0E
*/

/* Pioneer Remote Control
  Volume -  11
  Volume +  10
  Band/ESC  18
  ATT       12
  Up        64
  Down      65
  Left      66
  Right     67
  Function  25->103
  Audio     13
  SRC       26
  Pause     88
  DSIP      25->109
*/


Ve son halinin videosu.

 

Çevrimiçi personel

Forum istatistikleri

Konular
5,847
Mesajlar
99,734
Üyeler
2,482
Son üye
ilker29

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top