Estimasi Pemodelan Sistem Kontrol Kecepatan Motor DC

A. Bentuk fungsi transfer kecepatan motor DC

Pertama kita cari bentuk fungsi transfer dari motor DC [1]. didapat perhitungan fungsi transfer kecepatan motor DC sebagai berikut.

Dapat dilihat dari persamaan di atas bahwa motor DC mempunyai sistem orde 2. Sistem orde 2 sendiri mempunyai struktur sebagai berikut [2].

Jika saya sederhanakan, maka saya medapat bentuk sebgai berikut.

Sementara, berdasarkan bentuk respon step dan lokasi pole-zero, sistem dibagi beberapa klasifikasi[3].

Maka, dari data di atas bisa kita dapatkan bahwa.

1. omega-n = sqrt(20.02) = 4.47

2. zeta = 12/2/4.47 = 1.34

3. Sistem overdamped. Untuk menghitung settling time overdamped sistem[4]

ts = 3.91/p1 = 3.91/2 ≈ 2

Dari Kesimpulan di atas mari kita coba membuat estimasi dari sebuah motor DC + encoder yang akan kita kontrol dengan sebuah mikrokontroler.

B. Membuat estimasi model

Pertama kita coba tes step respon dari motor DC ini. Time step menggunakan 60ms dengan alasan bahwa proses kalkulasi PID dan trasmit data serial nanti membutuhkan sekitar 60ms. Kita coba berikan step input dengan nilai 100 PWM. Nilai kecepatan yang terbaca akan dikonversi ke rad/s. Dimana untuk satu putaran motor sama dengan 100 step. Jadi, kecepatan(rad/s) = step_encoder_terbaca/0.06/100.

ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {//fungsi membaca variable dari interrupt
    encPosRead = encPos;    
  }
  deltaPos = encPosRead - prevEncPosRead;
  prevEncPosRead = encPosRead;
  
  //encoder pada motor ini, satu putaran 360 derajat didapatkan 100 step
  //jadi kecepatan motor dihitung dalam rotasi/detik
  speedMotor = (float)deltaPos/dt/100;//menghitung kecepatan 

Berikut respon step hasil pengukuran.

Dari data tersebut, dapat dilihat bahwa settling time berada di 180 ms. Maka, sekarang kita coba estimasi model orde-2 dari motor DC tersebut. Saya ambil nilai zeta dari motor DC ini 1.01 dengan asumsi bahwa motor DC ini lebih responsif dari contoh model di atas. Dengan mengatur nilai omega-n dan menjaga nilai settling time, maka kita akan dapatkan sistem yang kita coba untuk perkirakan.

Saya coba simulasikan, sehingga didapat step respon sebagai berikut.

Nilai final input step saya masukan 5.67 sesuai dengan data di pengukuran tadi. Nilai gain saya set 1 karena sudah sesuai dengan grafik step respon data pengukuran tadi.

C. Pengujian Hasil Estimasi

Untuk menguji model apakah sudah sesuai dengan motor DC asli, maka saya coba membuat kontrol kecepatan motor DC dengan kontrol PI[5] lalu membandingkan step response keduanya.

Tes 1

Tes 2

Tes 3

Tes 4

Tes 5

Dilihat dari hasil tes di atas, maka saya kira estimasi pemodelan dari motor DC mendekati aslinya.

D. Lampiran

D.1. Tes motor, perbandingan PWM terhadap kecepatan

rad/spwm
00
05
010
015
020
0.1725
030
0.1735
140
1.6745
2.1750
2.555
3.1760
3.565
4.1770
4.6775
4.8380
5.1785
5.6790
695
6.33100
6.67105
7.17110
7.5115
7.83120
8.17125
8.5130
8.67135
9.17140
9.33145
9.5150
10.17155
10.33160
10.67165
10.83170
11.17175
11.5180
12185
12190
12.33195
12.67200
12.83205
13.5210
13.33215
13.5220
14225
14.17230
14.33235
14.83240
14.67245
15250
15.33255

D.2. Code

#include <util/atomic.h> // For the ATOMIC_BLOCK macro
//motor directory
#define CW  0
#define CCW 1
 
//motor control pin
#define motorDirPin 7
#define motorPWMPin 9
#define enablePin 8
 
//encoder pin
#define encoderPinA 2
#define encoderPinB 4
 
//encoder var
volatile int encPos = 0; //variable fungsi interrupt
int encPosRead = 0;
int prevEncPosRead;

//variable pengukur kecepatan
int deltaPos;
float targetSpeed;
float speedMotor;
 
//PID control
float Kp          = 0.3;
float Ki          = 10;
float Kd          = 0;

//variable rumus PID
float   error;
float   errortmin1;
float   integral;
float   derivative;
float   dt = 0.060; //second
int     dtMillis = dt*1000; //milisecond
float   control;
long int currTime;
long int prevTime;
long int delTime;

//variable pengaturan PWM motor
float velocity;
int   PWMvelocity;
int   dirMotor = 0;

//mode program
char modeProg;
 
//fungsi external interrupt encoder
void doEncoderA()
{
  digitalRead(encoderPinB)?encPos++:encPos--;
}

void setup()
{
  //setup interrupt
    pinMode(encoderPinA, INPUT_PULLUP);
    pinMode(encoderPinB, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA,RISING);
   
    //setup motor driver
    pinMode(motorDirPin, OUTPUT);
    pinMode(enablePin, OUTPUT);
    digitalWrite(enablePin, HIGH);
   
    Serial.begin(9600); //setting serial
    analogReadResolution(8); //setting adc 8bit
    digitalWrite(motorDirPin, CW); //set arah motor default

    modeProg = 0; //pilih mode cek speed 1, run 0
    //========Mode cek speed==============
    if(modeProg)
    { 
      for(int j=0;j<=255;j+=5)
      {
        PWMvelocity = j; //test perbandingan speed dan PWM
        prevTime = millis();       
        analogWrite(motorPWMPin, PWMvelocity);        
          
        do 
        { 
          currTime = millis();
          delTime = currTime-prevTime;
        }while(delTime<dtMillis);
       
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {//fungsi membaca variable dari interrupt
          encPosRead = encPos;
          encPos = 0;    
        }
        deltaPos = encPosRead - prevEncPosRead;
        prevEncPosRead = 0;
        
        //encoder pada motor ini, satu putaran 360 derajat didapatkan 100 step
        //kecepatan motor dihitung dalam 60 ms, satuan rad/s
        speedMotor = (float)deltaPos/dt/100;//menghitung kecepatan 
        digitalWrite(motorDirPin, CW);
        analogWrite(motorPWMPin, 0);  
        
        //Serial.print("raw_speed:");
        Serial.println(speedMotor);
        
        //pengendalian agar nilai dt sama tiap cycle
        //tidak menggunakana delay       
        do 
        {
          currTime = millis();
          delTime = currTime-prevTime;
        }while(delTime<1500);
      }     
      while(1);
    }
}

void loop()
{
  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {//fungsi membaca variable dari interrupt
    encPosRead = encPos;    
  }
  deltaPos = encPosRead - prevEncPosRead;
  prevEncPosRead = encPosRead;
  
  //encoder pada motor ini, satu putaran 360 derajat didapatkan 100 step
  //jadi kecepatan motor dihitung dalam rotasi/detik
  speedMotor = (float)deltaPos/dt/100;//menghitung kecepatan  

  //max adc 255, nilai tengah 0, set kecepatan dari -125 CCW samapi 125 CW  
  targetSpeed = ((float)analogRead(A0)-125)/10;//dijadikan skala -12.5 sampai 12.5   

  //PID
  error   = targetSpeed - speedMotor;
  integral += dt*error; 
  derivative = (error - errortmin1)/dt;
  control = (Kp*error) + (Ki*integral) + (Kd*derivative);
  
  //pengaturan PWM
  //konversi dari kecepatan rad/sec ke PWM berdasarkan mode cek speed
  velocity = (control*14.891)+12.135;
  PWMvelocity = min(max(velocity, -255), 255);
  if(PWMvelocity >= 0)
  {
      digitalWrite(motorDirPin, CW);
      analogWrite(motorPWMPin, PWMvelocity); 
  }
  else
  {
      digitalWrite(motorDirPin, CCW);
      analogWrite(motorPWMPin, 255+PWMvelocity);
  }  

  //===========Serial: ploter
  Serial.print("nol:");
  Serial.print(0);//titik tengah 0
  Serial.print(" ");
  Serial.print("target_speed:");
  Serial.print(targetSpeed);
  Serial.print(" ");
  Serial.print("speedMotor:");
  Serial.println(speedMotor); //plot data  

  //pengendalian agar nilai dt sama tiap cycle
  //tidak menggunakana delay
  //berdasarkan pengukuran, setiap serial print memakan waktu 5ms
  //anggap saja kita mengambil dt aman di 60ms
  do 
  {
    currTime = millis();
    delTime = currTime-prevTime;
  }while(delTime<dtMillis);

  prevTime = currTime;
  errortmin1 = error;
}

Kontrol Kecepatan Motor DC Encoder Menggunakan PID

#include <util/atomic.h> // For the ATOMIC_BLOCK macro
//motor directory
#define CW  0
#define CCW 1
 
//motor control pin
#define motorDirPin 7
#define motorPWMPin 9
#define enablePin 8
 
//encoder pin
#define encoderPinA 2
#define encoderPinB 4
 
//encoder var
volatile int encPos = 0; //variable fungsi interrupt
int encPosRead = 0;
int prevEncPosRead;

//variable pengukur kecepatan
int deltaPos;
float targetSpeed;
float speedMotor;
 
//PID control
float Kp          = 0.3;
float Ki          = 10;
float Kd          = 0;

//variable rumus PID
float   error;
float   errortmin1;
float   integral;
float   derivative;
float   dt = 0.060; //second
int     dtMillis = dt*1000; //milisecond
float   control;
long int currTime;
long int prevTime;
long int delTime;

//variable pengaturan PWM motor
float velocity;
int   PWMvelocity;
int   dirMotor = 0;

//mode program
char modeProg;
 
//fungsi external interrupt encoder
void doEncoderA()
{
  digitalRead(encoderPinB)?encPos++:encPos--;
}

void setup()
{
  //setup interrupt
    pinMode(encoderPinA, INPUT_PULLUP);
    pinMode(encoderPinB, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA,RISING);
   
    //setup motor driver
    pinMode(motorDirPin, OUTPUT);
    pinMode(enablePin, OUTPUT);
    digitalWrite(enablePin, HIGH);
   
    Serial.begin(9600); //setting serial
    analogReadResolution(8); //setting adc 8bit
    digitalWrite(motorDirPin, CW); //set arah motor default

    modeProg = 0; //pilih mode cek speed 1, run 0
    //========Mode cek speed==============
    if(modeProg)
    { 
      for(int j=0;j<=255;j+=5)
      {
        PWMvelocity = j; //test perbandingan speed dan PWM
        prevTime = millis();       
        analogWrite(motorPWMPin, PWMvelocity);        
          
        do 
        { 
          currTime = millis();
          delTime = currTime-prevTime;
        }while(delTime<dtMillis);
       
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {//fungsi membaca variable dari interrupt
          encPosRead = encPos;
          encPos = 0;    
        }
        deltaPos = encPosRead - prevEncPosRead;
        prevEncPosRead = 0;
        
        //encoder pada motor ini, satu putaran 360 derajat didapatkan 100 step
        //kecepatan motor dihitung dalam 60 ms, satuan rad/s
        speedMotor = (float)deltaPos/dt/100;//menghitung kecepatan 
        digitalWrite(motorDirPin, CW);
        analogWrite(motorPWMPin, 0);  
        
        //Serial.print("raw_speed:");
        Serial.println(speedMotor);
        
        //pengendalian agar nilai dt sama tiap cycle
        //tidak menggunakana delay       
        do 
        {
          currTime = millis();
          delTime = currTime-prevTime;
        }while(delTime<1500);
      }     
      while(1);
    }
}

void loop()
{
  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {//fungsi membaca variable dari interrupt
    encPosRead = encPos;    
  }
  deltaPos = encPosRead - prevEncPosRead;
  prevEncPosRead = encPosRead;
  
  //encoder pada motor ini, satu putaran 360 derajat didapatkan 100 step
  //jadi kecepatan motor dihitung dalam rotasi/detik
  speedMotor = (float)deltaPos/dt/100;//menghitung kecepatan  

  //max adc 255, nilai tengah 0, set kecepatan dari -125 CCW samapi 125 CW  
  targetSpeed = ((float)analogRead(A0)-125)/10;//dijadikan skala -12.5 sampai 12.5   

  //PID
  error   = targetSpeed - speedMotor;
  integral += dt*error; 
  derivative = (error - errortmin1)/dt;
  control = (Kp*error) + (Ki*integral) + (Kd*derivative);
  
  //pengaturan PWM
  //konversi dari kecepatan rad/sec ke PWM berdasarkan mode cek speed
  velocity = (control*14.891)+12.135;
  PWMvelocity = min(max(velocity, -255), 255);
  if(PWMvelocity >= 0)
  {
      digitalWrite(motorDirPin, CW);
      analogWrite(motorPWMPin, PWMvelocity); 
  }
  else
  {
      digitalWrite(motorDirPin, CCW);
      analogWrite(motorPWMPin, 255+PWMvelocity);
  }  

  //===========Serial: ploter
  Serial.print("nol:");
  Serial.print(0);//titik tengah 0
  Serial.print(" ");
  Serial.print("target_speed:");
  Serial.print(targetSpeed);
  Serial.print(" ");
  Serial.print("speedMotor:");
  Serial.println(speedMotor); //plot data  

  //pengendalian agar nilai dt sama tiap cycle
  //tidak menggunakana delay
  //berdasarkan pengukuran, setiap serial print memakan waktu 5ms
  //anggap saja kita mengambil dt aman di 60ms
  do 
  {
    currTime = millis();
    delTime = currTime-prevTime;
  }while(delTime<dtMillis);

  prevTime = currTime;
  errortmin1 = error;
}

TV LG Super Slim 21 Inch Gambar Blur Efek Dari Emisi CRT Lemah

Masih lanjutan dari video sebelumnya. Saya sedang belajar mengoprek TV tabung. TV ini waktu pertama kali saya buka, terlihat bekas servisan dengan kondisi flyback seperti tidak ori/sudah diganti, sekring tidak terpasang dijumper resistor tahu. Setelah saya cek, ternyata banyak kerusakannya. Saya pasang kembali sekring, ganti banyak elco dan capasitor millar juga. Ganti transistor horizontal yang putus, serta IC vertikal yang rusak. FBT juga saya ganti dengan nomor FBT yang sama dengan yang terpasang sebelumnya yaitu tipe 25-N1651.

Setelah itu, saya test dan TV berhasil menyala beberapa saat, kemudian mati dengan kondisi tengangan 26V IC vertikal over sampai sekitar 32V dan layar gelap dengan garis di tengah. Saya coba otak atik lagi, alhasil filamen tabung menyala seperti terbakar api.

Setelah saya cek ini itu, saya kira FBT rusak dan tidak cocok. Setelah saya cek nama pin FBT di PCB, saya putuskan ganti dengan tipe BSC 25-N0363. Saya ganti juga IC vertikalnya dan TV berhasil menyala akan tetapi gambar blur. Saya coba ganti soket CRT sampai 2 kali ternyata tetap blur.

Saya juga coba naikan tegangan heater dengan mencopot salah satu kaki resistor heater lalu melilitkan jalurnya ke ferrit FBT, tapi tetap gambar blur. Setelah mencari beberapa referensi saya dapat sebuah video dengan kasus yang sama.

Disana disebutkan kemungkinan emisi dari tabung sudah lemah. Untuk mengakalinya, jalur pin heater CRT diputus agar tidak tersambung ke circuit mesin TV dengan cara jalur dikerik pakai pisau cutter pada PCB soket CRT. Lalu heater disuntik tegangan antara 6-9V DC. Saya coba mengikutinya dengan membuat sumber DC tersebut dari lilitan di ferit FBT sebanyak 3 lilitan + dioda penyearah + adjustable regulator menggunakan IC 7805 + resistor heater yang saya cabut dari PCB mesin TV. Kira-kira rangkaiannya sebagai berikut.

Setelah saya coba, ternyata berhasil. Saya set regulator di tegangan sekitar 8V DC. Akan tetapi, saya khawatir tegangan terlalu tinggi, jadi saya set di tegangan sekitar 7,3V DC dengan konsekuensi pada saat pertama menyala TV sedikit blur, baru setelah sekitar 10 detik gambar TV menjadi jelas.

TV LG Super Slim 21 Inch Sudut Layar Melengkung

Saat ini saya sedang belajar otodidak untuk memperbaiki TV tabung. Kerusakan yang saya tangani sekarang adalah sudut layar TV melengkung. Setelah mempelajari dari beberapa referensi, ternyata penyebabnya adalah kemungkinan magnet kalibrasi layar yang menempel pada tabung sudah lemah. Maka dari itu, saya tempelkan tambahan magnet pada belakang tabung. Atur posisi penempelan magnet agar layar kotak sempurna. Pada dua vidio dari luar negeri, disarankan menggunakan magnet berbentuk kotak agar dapat dengan mudah mengatur polarisasi magnet. Atau, disarankan juga menggunakan magnet tape. Magnet tape sendiri biasanya dijual di toko online untuk menempel barang-barang kecil. Kalau saya sendiri pakai magnet mainan yang saya beli dari toko mainan dekat rumah.

Redmi 2 Model 2014811 MIUI 9 Sinyal Muncul Tapi Tidak Bisa Nelpon/Internet (SIM Indosat)

Kendala pada servisan Redmi 2 Model 2014811 yang saya tangani adalah sinyal muncul tapi tidak bisa melakukan panggilan/internet. OS sudah diupdate ke MIUI 9. Setelah saya cek IMEI dengan *#06#, IMEI muncul. Akan tetapi setelah saya cek di web https://imei.kemenperin.go.id/ ternyata IMEI tidak terdaftar. Itu artinya kemungkinan HP akan diblok untuk melakukan panggilan telpon/internet.

Dalam artikel https://www.foldertips.com/android/mengenal-kode-ekor-redmi-2-prime/ bahkan disebutkan bahwa beberapa HP redmi 2 ini memang tidak diperuntukan untuk pasar Indonesia. Tapi beberapa tipe dipasarkan di Indonesia. Akibatnya, HP tidak support untuk jaringan di Indonesia. Terkadang dimodifikasi dengan diisi ROM tipe lain agar bisa jalan.

Setelah beberapa hari saya oprek dengan menggunakan kartu Indosat Ooredoo, saya coba untuk mengganti setingan APN. Kondisi yang saya dapat dengan mengganti APN yang sudah ada/bawaan adalah:

  1. Jika pakai APN ISAT BB INTERNET indosat3g: bisa nelpon/cek pulsa. Tapi tidak bisa internet/data
  2. Jika pakai APN ISAT WAP indosatgprs: bisa internet/data, Tapi tidak bisa nelpon/cek pulsa.

Pikir saya, ini berarti harus cari setingan APN baru yang bisa untuk keduanya, nelpon dan internet/data. Akhirnya, saya coba pakai/tambahkan APN baru, yaitu APN Indosat 4G yang saya dapat dari https://jalantikus.com/telko/setting-apn-indosat/ dengan detail sebagai berikut.

FormatSetting APN Indosat 4G
NameINDOSAT
APNinternet
ProxyNot set
PortNot set
UsernameNot set
PasswordNot set
MMS proxyNot set
MMS portNot set
MCC510
MNC01
Authentication typeNot set
APN typedefault,supl
APN protocolipv4
APN roaming protocolipv4

Dengan APN di atas, HP Redmi 2 Model 2014811 MIUI 9 dengan IMEI tidak terdaftar, dan memakai kartu Indosat Ooredoo bisa kembali menelpon, cek pulsa, dan internet/data.

Kasus Pada Redmi 2 2014812

Sedangkan pada hp redmi 2 model 2014812, kartu yang bisa menelpon/cek pulsa dan internet/data adalah kartu Telkomsel.

Simulasi Robot 6-Axis di Freecad | Robot Workbech

Freecad adalah sebuah aplikasi open source untuk membuat model 3D. Tetapi, ternyata tidak hanya membuat model 3D saja, kita juga bisa membuat simulasi 3D dengan software ini. Yaitu workbench robot yang bisa membuat simulasi robot industri 6-axis dari merek Kuka.

Ada beberapa pilihan robot yang bisa disimulasikan.

Akan tetapi, saya rasa workbench ini masih dalam tahap pengembangan karena beberapa fitur GUI tidak merespon. Untuk akses simulasi, script-nya tidak lengkap, masih TBD.

Dan juga, dalam mengoperasikannya sulit jika dibandingkan dengan software simulasi robot seperti ABB Robot Studio. Ya, tentu saja ABB Robot Studio itu berbayar, dan yang ini hanya sebatas workbench pada software open source. Akan tetapi, untuk sebuah simulasi sederhana yang tidak membutuhkan ketelitian, software ini cukup membantu.

Akhirnya, saya coba membuat sebuah simulasi sederhana dimana robot berperan untuk load/unload benda pada sebuah mesin CNC. Semua ukuran model 3D ini hanya berdasarkan perkiraan saja, bukan bedasarkan ukuran sebenarnya karenya saya memang niatnya hanya ingin mencoba fitur workbench robot ini.

Bagi yang ingin mencobanya, berikut saya share file simulasi yang telah saya buat.

Memperbaiki RAM Rusak 

Kali ini saya memperbaiki laptop yang tidak bisa menyala alias blank. Kecurigaan saya adalah bisa jadi RAM nya rusak. Lalu, saya cek dengan menggunakan RAM lain yg masih bagus ternyata laptop bisa menyala. Lalu untuk memperbaiki RAM yg rusak tadi dengan merehotnya. Biasanya untuk merehot digunakan solder uap. Karena saya tidak punya, saya akan merehotnya menggunakan oven. mari kita cobaaa. Pertama copot stiker RAM yang berbahan plastik. Lalu bungkus RAM menggunakan alumunium foil. Kedua masukan ke dalam oven dan atur timer kira saja agar RAM bisa cukup panas tapi jangan sampain gosong. Ketiga tempel kembali stiker RAM lalu pasang RAM dan coba. Jika RAM berhasil diperbaiki, maka laptop akan menyala kembali. Salah satu cara memperbaiki board PCB adalah menggunakan teknik rehot atau memanaskan ulang sambungan timah dan IC. Me-rehot dilakukan untuk memastikan solderan IC menempel dengan baik. Biasanya menggunakan solder uap. Tapi, karena saya tidak punya, jadi saya pakai oven.

Tape Head Unit Avanza 2010 Merek JVC Tidak Keluar Suara

Kali ini saya sedang memperbaiki tape mobil avanza 2010 yang tidak keluar suara. Pertama, kecurigaan saya terletak pada 2 buah IC, yaitu IC Audio processor TDA7419 dan IC Audio Amplifier TB2926HQ. Kemudian, saya cek keluaran dari TDA7419 dengan menyambung line out dari tape ke speaker aktif. Ternyata keluar suara. Berarti IC Audio Amplifier yang rusak. Saya ganti dengan tipe yang lain yang lebih murah, yaitu TDA7388. Saya cek juga instalasi speaker di mobil dan memastikan bahwa jalur speaker mempunyai impedance sekitar 4 Ohm.

Cara Masuk Service Mode TV Samsung Menggunakan Remote Dari HP Android (HARUS ADA INFRARED-NYA)

Beberapa waktu yang lalu saya mencoba memperbaiki TV tabung yang rusak di rumah. Alhasil, setelah saya cek, ternyata flyback-nya rusak dan ada retak sedikit. Saya teringat bahwa beberapa waktu yang lalu saat hujan lebat dan banyak petir, TV tetangga juga ada yang rusak. Mungkin TV saya juga rusak gara-gara petir waktu itu.

Saya coba ganti flyback FQH21A004 bawaan dengan tipe lain karena lebih murah. Saya ganti dengan tipe BSC25-0217G dengan harga Rp. 55,000 di toko online. Setelah saya pasang, ternyata gambar yang ditampilkan pada layar menjadi lebih lebar dari biasanya. Logo TV pun hampir tertutupi. Nah, untuk mensetting agar gambar sesuai dengan ukuran layar, maka saya perlu mengaturnya lewat service mode.

Untuk masuk service mode pada TV Samsung ini, perlu menggunakan remote. Akan tetapi remote aslinya sudah lama hilang. Jadi saya coba pakai remote universal tapi tidak bisa. Akhirnya, karena HP saya ada infrared untuk remote (Redmi Note 4), maka saya coba cari aplikasi remote khusus untuk TV samsung dan dapatlah aplikasi yang cocok di link berikut https://play.google.com/store/apps/details?id=in.remote.www.samsungtvremote

Kontrol Posisi Motor DC Input Keypad

Berikut adalah contoh kontrol posisi motor DC dengan input dari keypad. Untuk memasukan posisi maka harus menekan *. Setelah itu memasukan angka posisi lalu tekan #. Maka motor akan bergerak ke posisi yang diinginkan. Sayangnya, simulasi di tinkercad tidak bisa menjalankan simulasi ini mungkin terlalu berat sehingga motor nge-hang.

Klik link project tinkercad.

#include <Keypad.h>
/*=================
	Keypad Init
===================*/
const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad

//keymap defines the key pressed according to the row and columns just as appears on the keypad
char keymap[numRows][numCols]= 
{
{'1', '2', '3', 'A'}, 
{'4', '5', '6', 'B'}, 
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

//Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {11,12,A5,A4}; //Rows 0 to 3
byte colPins[numCols] = {A3,A2,A1,A0}; //Columns 0 to 3

//initializes an instance of the Keypad class
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
String inputString;
/*======================
	Motor Controll Init
========================*/
//motor directory
#define CW 	0
#define CCW 1

// motor control pin
#define 	motorDirPin  7
#define 	motorPWMPin  9
#define 	EnablePin 	 8

// encoder pin
#define 	encoderPinA  2
#define 	encoderPinB  4

//encoder var
int	encoderPos 			= 0;

// PID control
float 	Kp 				= 3.2;
int 	targetPos		= 0;
int 	error;
int 	control;
int 	velocity;

void doEncoderA()
{  	
  digitalRead(encoderPinB)?encoderPos--:encoderPos++;
}

void setup()
{  
  //setup interrupt
  pinMode(encoderPinA, INPUT_PULLUP);
  pinMode(encoderPinB, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA, RISING);
 
  //setup motor driver
  pinMode		(motorDirPin, 	OUTPUT);
  pinMode		(EnablePin, 	OUTPUT);
  digitalWrite	(EnablePin, 	HIGH);
   
  Serial.begin(9600);
}

void loop()
{  	
    error 		= targetPos - encoderPos;
  	control 	= (Kp*error);
  
    velocity = min(max(control,-255), 255);
  	if(velocity>=0)
    {
        digitalWrite(motorDirPin, CW);
  		analogWrite(motorPWMPin, velocity);
  	}
  	else 
  	{
        digitalWrite(motorDirPin, CCW);  		
  		analogWrite(motorPWMPin,(255+velocity));
  	} 
  	Serial.println(encoderPos);
  	delay(10); //time delay untuk kontrol motor
  
  	char keypressed = myKeypad.getKey();
	if (keypressed == '*')
  	{
      	Serial.print("Masukan Input Motor: ");
      	while(1) //loop selama belum enter #
        {
        	char keypressed = myKeypad.getKey();
          	delay(100); //anti bounching keypad delay
          	if (keypressed >= '0' && keypressed <= '9') // only act on numeric keys
            {   
              	Serial.print(keypressed);
      			inputString += keypressed;       // append new character to input string
    		}
          	else if (keypressed == '#') break;
        }
        targetPos = inputString.toInt(); // YOU GOT AN INTEGER NUMBER
        inputString = "";                // clear input
		Serial.println("");
      	Serial.print("Berputar ke posisi ");
      	Serial.println(targetPos);
	}
}