воскресенье, 21 октября 2012 г.

Продолжаем подключать хлам - LED модуль с DVDшки, или TM1628

В продолжение темы, как можно подключать всякое к BlockDuino без паяльника.
Попался мне в руки сломанный DVD плеер и оттуда, не долго раздумывая, была выковыряна платка с LED экранчиком, тремя кнопками и IR (ненужный бонус). На борту обнаружена микросхема TM1628.
DVD LED модуль с TM1628


В и-нете ни толкового даташита, ни реализованных примеров я не нашел, но зато встретилась библиотека его старшего брата: TM1638.

От платы идут шесть проводов:
  1. +5V
  2. IR
  3. VSTB
  4. VSCK
  5. VSDA
  6. GND
Так как на шлейфе висит разъем "мама", я взял пять стандартных проводов для прототипирования "папа-папа" и подключил к BlockDuino.
  • VSTB (strob) - в D7;
  • VSCK (clock) - в D8;
  • VSDA (data) - в D9;
  • Ну и питание соответственно;
DVD LED модуль с TM1628 подключенный к BlockDuino (arduino)

 Запустив пример с библиотеки TM1638 получил какой-то результат, какой-то - потому как зажглись кое-какие светодиоды, но все это нечитаемо. Но по крайней мере, проверил работоспособность модуля.
Для дальнейшей проверки набросал простенький код:

// Testing sketch for DVD module with TM1628 IC
// Written by Vasyl Yudin, public domain
// www.blockduino.org

const int dataPin = 9;   // VDIO
const int clockPin = 8;  // VCLK
const int strobePin = 7; // VSTR

const int intensity = 2; // яркость 0-7

unsigned char displ[14]={0x08,0x00,0x80,0x00,0xb5,0x00,0xaf,0x00,0xbd,0x00,0x01,0x00,0xb1,0x00};// b_duino
unsigned char s_addr[8] ={0x03,0x0b,0x0d,0x07,0x05,0x09,0x0d,0x01};
unsigned char s_byte[8] ={0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01};

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(strobePin, OUTPUT);

  digitalWrite(strobePin, HIGH);
  digitalWrite(clockPin, HIGH);

  t_sendCommand(0x40);
  t_sendCommand(0x88 | min(7, intensity));

  digitalWrite(strobePin, LOW);
  t_send(0xC0);
  for (int i = 0; i < 16; i++) {
    t_send(0x00);
  }
  digitalWrite(strobePin, HIGH);
  
// show on display: b_duino
    for (int i=0; i<14; i++) {
    t_sendData(i, displ[i]);
    delay(200);
  }
  delay(3000);
}

void loop() {
  for (int i=0;i<8;i++){
    t_sendData(s_addr[i], s_byte[i]);
    delay(125);
    t_sendData(s_addr[i], 0x00);
  }  
}

//custom functions
void updateLEDs() {
   for (int i=0; i<14; i++) {
    t_sendData(i, displ[i]);
  }
}

void t_sendCommand(byte cmd)
{
  digitalWrite(strobePin, LOW);
  t_send(cmd);
  digitalWrite(strobePin, HIGH);
}

void t_sendData(byte address, byte data)
{
  t_sendCommand(0x44);
  digitalWrite(strobePin, LOW);
  t_send(0xC0 | address);
  t_send(data);
  digitalWrite(strobePin, HIGH);
}

void t_send(byte data)
{
  for (int i = 0; i < 8; i++) {
    digitalWrite(clockPin, LOW);
    digitalWrite(dataPin, data & 1 ? HIGH : LOW);
    data >>= 1;
    digitalWrite(clockPin, HIGH);
  }
}
//зы: Переписал код для самостоятельной работы, без библиотек

Но надеюсь, на этом не остановлюсь, в планах написать библиотеку конкретно под этот модуль, так как на просторах нашей страны остались бесхозными тысячи китайских DVD плееров с очень полезным девайсом на борту. ;)