Post

ÇİNLİLƏRİ NECƏ “HACK” ETDİM?!

Verilən sifarişə görə, Çindən gətiriləcək reklam skrollerlərinə özümüzün hazırlayacağımız sistemi (cihazı) inteqrasiya etmək lazım idi. Həmişəki kimi çox geniş araşdırmağa vaxtımız olmadığı üçün iş gözümüzə asan göründü və üzərinə “balıklama atladıq” 🙂 . İşin içinə girdikcə gördüm ki, elə də asan deyilmiş. Yenə özümü ağır yükün altına atmışdım.

 

Lakin, olan olmuşdu və söz ağızdan çıxmışdı. Getdikcə iş elə çətinləşrdi ki, hər gün işdən biraz daha soyuyurdum. Artıq işi görməmək üçün özümə başqa işlər taparaq vaxtı uzadırdım. Amma digər tərəfdən beynimin bir küncündə məsələnin həll yollarını daim düşünürdüm. Apardığım uğursuz təcrübələri yeri gəldikcə qeyd edəcəm amma bu məqalədə əsasən nəticəyə doğru gedən düzgün yolu sizlərlə paylaşmaq istəyirəm. İlk iş scrollerin bütün hissələrini analiz edərək elektrik sxemini çıxarmaq oldu:

photo_2019-02-23_13-23-34

Daha sonra bizə (yəni elektronika mühəndislərinə) aid olan hissələri (main controller, tənzimləmələri etmək üçün pult, BLDC motorlar və s.) söküb incələməyə başladım. Qərar verdim ki, sistemə müdaxilə etmək üçün ən uyğun yer elə idarəetmə pultunun qoşulduğu port olacaq (RS232 portu).

IMG_20190409_170807 - Copy

proxy.duckduckgo.comStandart RS232 protunun pin diaqramı şəkildəki kimidir. Lakin çinlilər bu standartda dəyişiklik etmişdilər. Bizə lazım olan RX və TX pinlərinin yeri standartdan fərqli idi. Bu pinlərin yerini təyin etmək o qədər də çətin olmadı. Pultu main controllerə qoşdum və komanda göndərməyə başladım. Bu əsnada pultun RS232 portuna lehimlədiyim naqilləri osilloqraf ilə yoxladım və şəkildəki formada rəqəmsal siqnalları müşahidə etdim.

NewFile1Bu siqnalları yalnız RX və ya TX xəttlərində görmək mümkündür. Siqnalı müşahidə etsəm də onu osilloqrafda  ölçmək elə də asan deyil. Bunun üçün bizə “Logic Analyzer” lazımdır. İşlətdiyim Logic Analyzer haqqında daha ətraflı öyrənmək üçün bu keçiddən istifadə edə bilərsiniz. Mənim analiz cihazım (əsasən belə olur) maksimum 5 V səviyyəsində olan siqnalları ölçə bilir. Standart RS232 də isə siqnallar -10 V +10 V arasında dəyişir. RS232 haqqında daha ətraflı öyrənmək üçün bu keçiddən istifadə edə bilərsiniz. Bu problemin həll yolu MAX232 çevircisidir. proxy.duckduckgo.comQoşulma sxemi şəkildəki kimidir. Bu sxemi qurdum və pult ilə main controller arasında olan RS232 xəttinə paralel qoşdum. TTL LEVEL tərəfini Logic Analyzerimə qoşdum və məlumatları oxumağa başladım. Analyzerin ekran görüntüsünü aşağıda paylaşıram: Cl

Siqnalın daha yaxın görüntüsü və bit uzunluğunu (duty cycle) aşağıdakı şəkildə görə bilərsiniz.

Untitled

Bitin uzunluğu 53 us-dir. Bu uzunluq UART protokolunda 19200 baud sürətinə uyğun gəlir.  Bunu ən asan yoxlamaq üçün arduinoda Serial.begin(19200); yazıb Serial.print(“Hello”); komandası ilə məlumat göndərirsiniz və arduinonun TX xəttindəki siqnalı analyzer ilə oxuyursuz. Bu şəkildə bit uzunluqlarının eyni olduğunu görə bilərsiniz. Daha sonra MAX232 nin TTL tərəfini aşağıdakına bənzər şəkildə USB UART converterə birləşdiririk:usb-uart - CopyBundan sonra RealTerm terminal proqramı vasitəsilə göndərilən məlumatı həm hex. həm də bin. şəklində oxuya bilərik. Aşağıdakı videoda həm RealTerm proqramının həm də osilloqrafda MAX232 vasitəsilə çevrilmiş siqnalın görüntülərini görə bilərsiniz:

 

 

Oxuduğum məlumatların bir hissəsini sizinlə paylaşıram:

UP Motor komandası:
Binary:
11110101 00000101 00000001 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111010
Hexadecimal:
F5 05 01 FF FF FF FF FF FF FF FF FF FF FF FF FA

Down Motor komandası:
Binary:
11110101 00000101 00000010 11111111 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111010
Hexadecimal:
F5 05 02 FF FF FF FF FF FF FF FF FF FF FF FF FA

Növbəti addımda isə pultu çıxarırıq və pultun qoşulduğu yerdən eyni bit paketini main controllerə göndəririk. Bu arada onu da qeyd edim ki, pultdan məlumat RS232 ilə gəlir və main cntrollerin daxilində də MAX232-ni əvəz edən SP232 mikrosxemi var. Bu mikrosxemin işi RS232 ilə gələn məlumatı main controllerin içində olan mikrokontrollerə TTL UART ilə ötürməkdir. Komputerdən məlumatı FTDI ilə (USB UART converter) göndərəcəm və FTDI da voltaj səviyyəsi 5 V olduğu üçün arada heç bir çevirici olmadan məlumatı mikrokontrollerə birbaşa ötürə bilərəm. Bunun üçün SP232 nin MCU-a qoşulduğu pinləri də axtarıb tapdıq. Aşağıdakı videoda məlumatın komputerdən sscom32E terminal proqramı ilə gönərilərək motorların hərəkət etdirilməsini görə bilərsiz.

 

 

Daha sonra yuxarıdakı bit paketlərini arduino nano ilə göndərərək pultu imitasiya etdim. Kodlar və video ilə aşağıda tanış ola bilərsiniz:

/*
 * Elgun Hasanov 10.04.2019
 * MAIN CODE
 * 
 */
const int up_button = 10;
const int down_button = 11;

void setup() {
  Serial.begin(19200);
  pinMode(up_button, INPUT);
  pinMode(down_button, INPUT);
}
void loop() {
if(digitalRead(up_button) == 1)
{
  up_motor();
  }
  else if(digitalRead(down_button) == 1)
  {
    down_motor();
    }
}
void up_motor()
{
  byte message[] = {0xF5, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA };
  Serial.write(message, sizeof(message));
  delay(50);
}
void down_motor()
{
  byte message[] = {0xF5, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA };
  Serial.write(message, sizeof(message));
  delay(50);
}