Translate

Cara Membuat Alat Kendali Motor DC Dengan PID Control

Cara Membuat Alat Kendali Motor DC Dengan PID Control


           Di malam setengan sore ini saya akan menjelaskan mengenai bagaimana cara mengakses motor DC menggunakan PID kontrol, jadi set poin yang diinginkan adalah berupa RPM (rotasi per menit), bisa juga berupa parameter lain, disini saya menggunakan motor DC maksimal 1000 Rpm dan optocoupler untuk decodernya, kemudian driver motor yang dipakai adalah L293 yang murah meriah namun powerful dalam aksinya. Untuk lebih jelasnya berikut skema dan programnya.



a. Minimm System





b.  Motor DC 1000 Rpm





c. Optocoupler Module






d, Driver L293






e. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

'setting pwm
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down
Config Timer0 = Timer , Prescale = 256

Dim Kp As Single
Dim Ki As Single
Dim Kd As Single
Dim Setpoint As Single
Dim P As Single
Dim Pi As Single
Dim Pid As Single
Dim I As Single
Dim D As Single
Dim Error As Single
Dim Errorx As Single
Dim Sum_err As Single

Ddrb.0 = 1
Ddrb.1 = 1

Cls
Cursor Off

'=========== set counter ==========

Ch Alias Pind.2

Config Pind.2 = Output
Config Ch = Input
Config Int0 = Falling

Const Debouncetime = 1

Dim Wtime As Byte
Dim Encounter As Integer
Dim Rpm As Integer
Dim Detak As Byte
Dim Detik1 As Integer
Dim Detik As Byte

Set Ch

On Int0 Getencoder
On Ovf0 Int_timer0

Wtime = 100
Encounter = 0

Enable Interrupts
Enable Int0
Enable Timer0

'=================================
Kp = 0.9                                                    ' Proportional factor
Ki = 0.1                                                    ' Integration factor
Kd = 1.9                                                    ' derrivative factor

Setpoint = 700

Do

Portb.0 = 0
Portb.1 = 1

Error = Setpoint - Rpm

P = Error * Kp

Sum_err = Error + Errorx
I = Ki * Sum_err

D = Error - Errorx

Pi = P + I
Pid = Pi + D
Pid = Pid / 10

If Pid > 255 Then
Pid = 255
End If

Pwm1a = Pid

Upperline
Lcd "Lubang = " ; Encounter ; "  " ; Detik

Lowerline
Lcd "RPM = " ; Rpm ; "  " ; Pid

Print Rpm

Errorx = Error

Loop

Getencoder:
  Waitms Debouncetime
  If Ch = 0 Then
     Incr Encounter

  End If
  Gifr = 64
Return

Int_timer0:
Incr Detak

If Detak > 0 Then
Detak = 0
Incr Detik1
End If

'nilai 197 adalah nilai counter untuk mencapai satu detik

If Detik1 > 197 Then
Detik1 = 0

Incr Detik

'mengubah ke RPM
'dikalikan 60 untuk mendapatkan nilai per menit
'dibagi 20 yaitu lubang encoder yang dipakai

Rpm = Encounter * 60
Rpm = Rpm / 10
Encounter = 0

End If

Return




f. VIDEO HASILNYA










Cara mengakses Motor Stepper Torsi Besar Menggunakan Driver L298

Cara mengakses Motor Stepper Torsi Besar Menggunakan Driver L298


            Kali ini, di sore yang mendung saya akan menjelaskan mengenai bagaimana cara mengakses motor stepper torsi besar dengan driver L298, perlu diketahui bahwa untuk mengendalikan putaran motor stepper yang harus diperhatikan adalah arus konsumsinya, pada contoh ini stepper motor yang digunakan memiliki arus 0.8 A sehingga dibutuhkan motor driver yang tepat, salah satu driver yang cocok adalah L298, karena bisa nge-drive motor sampai 2A. kemudian supply yang dipakai adalah 12 v dengan arus 5 Amper, mikrokontroller yang digunakan adalah ATMega16, untuk lebih jelasnya berikut penjelasan skema dan programnya.



a. Minimum System





b. Motor Stepper 5 Kg





c. Driver L298


 * NOTE:
- EN1 dan EN2 di hubungkan ke VCC
- Perhatikan warna kabel stepper dan pemasanganya di driver




d. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Cls
Cursor Off

Ddrb.0 = 1
Ddrb.1 = 1
Ddrb.2 = 1
Ddrb.3 = 1

Do

'arah CCW
Portb = &B00001000
Waitms 5

Portb = &B00000100
Waitms 5

Portb = &B00000010
Waitms 5

Portb = &B00000001
Waitms 5

'arah CW
'Portb = &B0000001
'Waitms 5

'Portb = &B0000010
'Waitms 5

'Portb = &B0000100
'Waitms 5

'Portb = &B0001000
'Waitms 5

Loop





e. VIDEO HASILNYA













Cara Mengakses Motor Stepper Torsi Besar Menggunakan Mikrokontroller

Cara Mengakses Motor Stepper Torsi Besar Menggunakan Mikrokontroller


            Malam ini saya akan menjelaskan mengenai bagaimana cara megakses motor stepper dengan torsi yang besar, pada contoh saya menggunakan motor stepper dengan torsi 5 Kg dan Arus 0.8A, sehingga harus diperlukan motor driver yang sesuai agar motor stepper bisa berjalan lancar, karena motor stepper ini membutuhkan torsi yang besar maka arus juga akan besar, maka diperlukanlah supply yang memadai, disini saya menggunakan supply 12 volt 5 amper switching. Kemudian driver stepper yang digunakan adalah EasyDriver Stepper, untuk lebih jelasnya berikut skema dan programnya.



a.Minimum System 





b. Motor Stepper 5 Kg





c. Modul EasyDriver Stepper






d. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Cls
Cursor Off

Dim A As Integer
Dim B As Integer
Dim X As Integer

'dir
Ddrd.7 = 1

'step
Ddrd.6 = 1

Arah Alias Portd.7
Gerak Alias Portd.6

'untuk mengatur arah putaran stepper CW atau CCW
Arah = 0

'untuk mengatur waktu step stepper
Gerak = 1

Do

Locate 1 , 1
Lcd "Stepper Test"

Gerak = 1
Waitms 1

Gerak = 0
Waitms 1
Loop





e. VIDEO HASILNYA











Modul dan Sensor Gesture Tangan APDS 9960

Modul dan Sensor Gesture Tangan APDS 9960

Mau Beli ??
Harga = Rp. 875.000,00


             Kali ini saya mau menjelaskan mengenai modul baru keluaran september yaitu Y-GESTURE APDS yang mana memiliki fitur utama pendeteksi gerakan tangan, spesifikasi gerakan tangan yang dideteksi yaitu ada enam arah, ke atas, bawah, kiri, kanan, jauh dan dekat. Modul ini menggunakan mikrokontroller ATMEGA328 sebagai penerjemah output sensor APDS 9960, sehingga keluaran dari modul ini adalah data serial berupa tulisan UP-DOWN-LEFT-RIGHT-NEAR-FAR dan juga ada LED yang akan menyala mewakili dari gerakan tangan yang terdeteksi. Untuk aplikasinya yaitu untuk kontrol slide presentasi menggunakan gesture tangan, kontrol robot atau berkaki, pengatur arah gerak motor servo, pengatur arah gerak motor DC dan lainnya.   



 a. Skema Hardware






 b. Sensor APDS 9960






 c. Program Y-GESTURE APDS

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

int merah1 = 10;
int merah2 = 12;
int kuning = 8;
int hijau = 9;
int biru = 11;
int putih = 13;


void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, OUTPUT);
 
  // Set interrupt pin as input
  pinMode(APDS9960_INT, INPUT);

  // Initialize Serial port
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("Y-GESTURE APDS - GestureTest"));
  Serial.println(F("--------------------------------"));
 
  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }
 
 //  Start running the APDS-9960 gesture sensor engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(A0, HIGH);
      
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        digitalWrite(8, HIGH);
        digitalWrite(9, LOW);
        digitalWrite(10, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(A0, HIGH);
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(10, LOW);
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(A0, HIGH);
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        digitalWrite(11, LOW);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
        digitalWrite(A0, HIGH);
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(12, LOW);
        digitalWrite(13, HIGH);
        digitalWrite(A0, LOW);
        break;
      case DIR_FAR:
        Serial.println("FAR");
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(10, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, LOW);
        digitalWrite(A0, HIGH);
        break;
      default:
        Serial.println("NONE");
    }
  }
}





 d. VIDEO HASILNYA











Membuat Alat kontrol Motor Brushless Dengan LM35 dan PIR sensor

Membuat Alat kontrol Motor Brushless Dengan LM35 dan PIR sensor


               Kali ini saya akan menjelaskan mengenai bagaimana cara membuat alat kendali suhu ruangan menggunakan kipas DC brushless dan sensor suhu LM35, prinsip kerjanya yaitu jika terdeteksi ada manusia didalam ruangan / ada gerakan didalam ruangan maka kipas akan aktif, kecepatan kipas jika suhu yang terdeteksi kurang dari 27 maka kipas akan berputar lambat namun jika yang terdeteksi suhunya diatas 27 maka kipas akan berputar kencang, ada 2 cara untuk kendali dc brushless yaitu pertama dengan menggunakan variabel tegangan / supply motor yang berbeda misal kipas dc 12 v, maka untuk kecepatan lambat berikan tegangan 5v, untuk kecepatan penuh beri tegangan 12v, untuk cara kedua yaitu dengan sistem on / off, jadi kipas akan di on kan beberapa milidetik kemudian dimatikan beberapa milidetik sehingga terlihat kipas berputar lambat, untuk lebih jelasnya berikut penjelasan program dan skemanya. 



a. Minimum System






b. Kipas DC Brushless






c. Sensor LM35 dan PIR







d. Transistor 2N3055






e. Program BAscom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Ddrd.7 = 1
Ddrd.6 = 1

Dim Adclm35 As Word
Dim Adcpir As Word
Dim Suhu As Single
Dim Datsuhu As String * 5
Cls
Cursor Off

Start Adc

Portd.7 = 0

Main:

Do

Adclm35 = Getadc(7)
Adcpir = Getadc(6)

Suhu = Adclm35 * 5
Suhu = Suhu / 1023
Suhu = Suhu * 100

Datsuhu = Fusing(suhu , "#.##")

Upperline
Lcd "Suhu = " ; Datsuhu

If Adcpir > 100 Then

Lowerline
Lcd "Pir = ON"
Else

Lowerline
Lcd "Pir = OFF"
End If

If Adcpir > 100 And Suhu > 27 Then
'Kencang
Portd.7 = 1
Elseif Adcpir > 100 And Suhu < 27 Then
'Lambat
Portd.7 = 1
Waitms 500
Portd.7 = 0
Waitms 500
Elseif Adcpir < 100 And Suhu < 27 Then
Portd.7 = 0
Elseif Adcpir < 100 And Suhu > 27 Then
Portd.7 = 0
End If

Waitms 200
Cls
Loop





f. VIDEO HASILNYA













Cara Menyimpan Data Dari MCU Ke USB Flashdisk Menggunakan Vinculum VNC1L USB host controller (Data Logger)

Cara Menyimpan Data Dari MCU Ke USB Flashdisk Menggunakan Vinculum VNC1L USB Host Controller (Data Logger)


             Tengah malam yang sunyi dan menyejukkan jiwa, kali ini saya akan menjelaskan mengenai bagaimana cara mengakses device VINCULUM VNC1L USB Host Controller dengan menggunakan mikrokontroller ATMega16 dengan Crystal 12Mhz dan bahasa Bascom AVR, memang bagi kaum awam akan terasa sulit namun saya akan berusaha menjelaskannya sedetail mungkin sehingga bisa dicerna oleh siapa saja, Alat yang akan dibuat kali ini yaitu terdapat sebuah tombol yang akan memerintahkan mikrokontroller untuk menyimpan data ke Flashdisk, kalau biasanya penyimpanan / data logger menggunakan SD card, sekarang bisa menggunakan Flashdisk. Spesifikasi Flashdisk yang dipakai yaitu FAT32 dengan ukuran 4GB. data yang akan ditampung oleh flashdisk bisa diatur melalui file todo.txt, pada contoh data yang tersimpan adalah 6 x 8 data, bisa saja dirubah menjadi 1 x 1 atau 2 x 2 juga bisa, tergantung kebutuhan. yang harus diperhatikan pada alat ini yaitu  bagaimana memasukkan firmware Vinculum dan bagaimana cara mengakses file todo.txt. Berikut adalah program, skema dan langkah-langkahnya.


1. Siapkan modul berikut

- Minimum System ATMega16, Crystal 12Mhz





- Serial Modul RS232





 - Vinculum Module





2. Siapkan sebuah Flashdisk lalu format dengan FAT32
3. Download Software Firmware di link berikut LINK 
4. Masukkan file berikut ke flashdisk






5. Install dengan klik dua kali VncFwMod.exe dari drive komputer
6. Cari file VDAPFUL_V03_68.ROM yang tadi dimasukkan ke Flashdisk











7. Firmware telah siap digunakan
8. Buat file.txt dengan nama "todo.txt" didalam flash disk lalu isikan seperti berikut



9. Jika sudah maka akan tampak seperti berikut (isi file dalam flashdisk)



10. Kemudian flashdisk siap digunakan

11. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000
$baud = 9600

Open "comd.7:9600,8,n,1" For Output As #1
Open "comc.7:9600,8,n,1" For Input As #2

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Cls
Cursor Off

Ddrb.0 = 0
Portb.0 = 1

Const Max_line_number = 15

Print "Ready"

Dim I As Byte
Dim Ending_loop As Byte
Dim Usb_stick_present As Byte

Dim N As Integer
Dim Ad As Integer

Dim Samples As Word
Dim Delayms As Word
Dim Channels As Word

Dim Inp_str(max_line_number) As String * 26
Dim Command_str As String * 20
Dim Vinc_str As String * 20
Dim S As String * 80
Dim S_length As Byte


Start Adc
Echo Off

Main:
Cls
Do

Command_str = ""
 Gosub Execute_command

Ad = Getadc(7)
Upperline
Lcd "adc = " ; Ad

If Pinb.0 = 0 Then
 Gosub Commands
End If

 If Usb_stick_present = 1 Then
 Print "USB stick connected"
 Lowerline
 Lcd "CONNECTED"
 Wait 1
 Else
 Print "USB stick not connected"
 Lowerline
 Lcd "DISCONNECTED"
 End If

 Wait 5

 Cls

Loop

Close #2
Close #1

End



Commands:
Cls
Upperline
Lcd "saving..... !!!"
Lowerline
Lcd "CONNECTED"
Wait 3

Print #1 , "Rd todo.txt" ; Chr(13) ;
Input #2 , Samples
Get #2 , I
Input #2 , Delayms
Get #2 , I
Input #2 , Channels
Get #2 , I
Input #2 , Vinc_str


Print Vinc_str ; " (file was read) " ; Samples ; " " ; Delayms ; " " ; Channels
Decr Channels

'samples = jumlah baris
'channel = panjang data tiap baris

' open the file log.txt
Print #1 , "OPW log.txt" ; Chr(13);
Input #2 , Vinc_str
Print Vinc_str ; " (file was opened)"

'write data to file
For N = 1 To Samples

S = ""
 For I = 0 To Channels
      Ad = Getadc(7)
      S = S + Str(ad)

 If I < Channels Then S = S + Chr(32) Else S = S + Chr(13) + Chr(10)

 Next I
   S_length = Len(s)
 Print "Data " ; N ; ": " ; S ; S_length

 Print #1 , "WRF " ; Str(s_length) ; Chr(13) ; S;
 Input #2 , Vinc_str
 Print Vinc_str ; " (data line was sent)"

 Waitms Delayms

Next N

' close file
Print #1 , "CLF log.txt" ; Chr(13);
Input #2 , Vinc_str
Print Vinc_str ; " (file was closed)"


' diplay DIRECTORY on USB stick
Command_str = "DIR"
Gosub Execute_command

' diplay USB stick information
'Command_str = "IDD"
'Gosub Execute_command

' display firmware version of Vinculum
'Command_str = "FWV"
'Gosub Execute_command

Goto Main

Return


Execute_command:
I = 0
Ending_loop = 0
Print #1 , Command_str ; Chr(13);
Do
 Incr I
 Input #2 , Inp_str(i)
 If Inp_str(i) = "D:\>" Then Set Ending_loop
 If Inp_str(i) = "No Disk" Then Set Ending_loop
 If Inp_str(i) = "Bad Command" Then Set Ending_loop
Loop Until Ending_loop = 1

Print
Reset Usb_stick_present
For I = 1 To Max_line_number
 If Inp_str(i) <> "" Then
 If Inp_str(i) = "D:\>" Then Set Usb_stick_present

 Print Inp_str(i)
 End If
   Inp_str(i) = ""
Next I

Return




12. Skema Pemasangan Hardware




13. Jika berhasil maka hasilnya akan seperti berikut (contoh)






14. VIDEO HASILNYA










 

Cara Mengakses Sensor Hall Effect

Cara Mengakses Sensor Hall Effect


         Pada jam saiki saya akan menjelaskan mengenai bagaimana cara mengakses sensor Hall Effect dengan menggunakan microcontroller, kegunaan dari sensor hall effect ini sangat banyak biasanya diaplikasikan di water flow meter yang mana antara sensor dengan baling2 pemutar tidaklah terhubung, jadi biarpun magnet terkena air, rangkaian hall effect tidak akan terkena air karena letaknya yang terpisah namun saling berkomunikasi melalui dinding plastik, itu adalah salah satu contoh aplikasinya, masih banyak lagi jika ingin dikembangkan. Untuk lebih jelasnya berikut skema dan programnya.



a. Minimum System




b. Sensor Hall Effect







c. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Dataadc As Word

Ddrb.0 = 1

Cls
Cursor Off

Start Adc

Do

Dataadc = Getadc(7)

Upperline
Lcd "ADC = " ; Dataadc

Waitms 200
Cls

If Dataadc > 146 Then
Portb.0 = 1
Else
Portb.0 = 0
End If

Loop
'------------------------ end




d. VIDEO HASILNYA