RSS

Arsip Kategori: Arduino

Pengendali Fan Dengan PWM


Penggemar audio rumahan tentu tidak ingin amplifier mereka memakai fan/kipas karena suara fan akan mengganggu kenikmatan menikmati musik. Namun jika memakai amplifier berdaya besar atau amplifier kelas A, mau tidak mau harus memakai fan. Untuk amplifier kelas AB, saat volume pelan tentu pendingin amplifier suhunya masih rendah sehingga fan tidak dibutuhkan. Saat suhu pendingin sudah mulai hangat baru kita ingin menghidupkan fan. Agar proses tersebut berjalan otomatis, maka diperlukan pengendali fan yang bisa dikontrol oleh suhu pendingin.

Saya ingin mensimulasikan pengendali fan yang sederhana, memakai komponen yang umum dan murah. Setelah saya cari-cari di internet, maka ketemu link ini. Saya modifikasi dengan sensor suhu sederhana memakai transistor, sehingga rangkaiannya menjadi seperti ini.

PWM Fan Controller

Cara kerjanya sederhana. Op-amp IC1A dan IC1B adalah rangkaian penghasil sinyal segitiga dengan frekuensi 140 Hz. Keluaran IC1B (kaki 7) seperti ini:

Swatooth

Op-amp IC1C adalah comparator yang membandingkan tegangan kaki 10 dan 9 sehingga keluarannya menjadi high (12V) atau low (0V). Karena yang dibandingkan adalah sinyal segitiga dengan sinyal yang lain, maka hasilnya adalah sinyal Pulse Width Modulation (PWM) atau sinyal yang memiliki lebar pulsa yang bervariasi tergantung besarnya tegangan pada kaki 9. Contoh bentuk gelombang kaki 8 saat suhunya 50 derajat Celsius adalah sebagai berikut:

50Derajat_PWM

Transistor Q1 sebagai sensur suhu, memanfaatkan koefisien suhu tegangan basis – emitor sebesar -2,2mV/ᵒC. Tegangan kolektor Q1 dari suhu 25 – 75 ᵒC adalah sebagai berikut:

Sensor Suhu

Tegangan sensor suhu ini di buffer oleh op-amp IC1D. Keluaran IC1C menggendalikan transistor Q2 yang mampu mengeluarkan arus sampai 5A.

Konstruksi

Transistor Q1 ditempel ke pendingin dengan mica agar kolektornya tidak terhubungsingkat dengan pendingin. Antara Q1, mica, dan pendingin diberi pasta pendingin (silicon grease). Lalu atur R8 agar fan mulai berputar pada suhu 45 ᵒC.

Pada simulasi digunakan nilai R7 + R8 sebesar 22K ohm untuk mendapatkan duty cycle 0 – 100 % pada suhu 47 – 60 ᵒC. Makin besar nilai R7 + R8 makin tinggi suhu saat fan mulai berputar.

Iklan
 
2 Komentar

Ditulis oleh pada 23 November 2014 in Arduino

 

Tag: , , ,

Video Led Matrix Dengan Arduino


Ini adalah Led Matrix yang saya buat dengan menggunakan board arduino buatan sendiri. Micocontrollernya memakai ATMega32A yang sebagian cara modifikasinya agar bisa dipakai dengan software arduino ada di artikel sebelumnya.

Video Led Matrix1

Video Led Matrix2

Video Led Matrix3

Modul Led Matrix memakai modul DMD kompatibel.

Led Controller1

Led Controller2

 
7 Komentar

Ditulis oleh pada 13 November 2014 in Arduino

 

Tag:

Data String di EEPROM


Untuk menyimpan data string di EEPROM pada platform Arduino, caranya sangat sederhana, yaitu:

#include <EEPROM.h>

#include <avr/pgmspace.h>

//data string yang disimpan pada memori FLASH

prog_char text1[] PROGMEM = “INI DATA STRING YANG DISIMPAN”;

//variable untuk menyimpan string

char text2[64];        

//variable untuk counter

int num;  

//variable untuk jumlah karakter

int length;                                    

 

//copy data string dari memori FLASH ke RAM

strcpy_P(text2,  (char*) text1);

//variable num diisi alamat awal EEPROM, misalnya 6

num = 6;

length = 30;

//tulis banyaknya karakter ke EEPROM

EEPROM.write(num++, length);

//tulis data string

for (int i=num;i < (num + length);i++)

  {

    EEPROM.write(i, (int) text2[i-num]);

  }

Sedangkan untuk membaca kembali data string tersebut dari EEPROM, adalah sebagai berikut:

#include <EEPROM.h>

#include <avr/pgmspace.h>

//variable untuk menyimpan string

char text2[64];        

//variable untuk counter

int num;  

//variable untuk jumlah karakter

int length;                                    

 

//asumsi EEPROM tersebut sudah ditulis dgn program di atas

//variable num diisi alamat awal EEPROM

num = 6;

//baca jumlah karakter dari string

length = EEPROM.read(num);

num++;

//baca data string dari EEPROM ke RAM

 for (int i=num;i<(num+length);i++)

  {

    text2[i-num] = (char) EEPROM.read(i);

  }

 

Semoga trik singkat ini bermanfaat.

 
Tinggalkan komentar

Ditulis oleh pada 20 Agustus 2014 in Arduino, Uncategorized

 

Tag: ,

Transistor Tester Dengan Arduino


Kebetulan saya punya board Arduino nganggur. Iseng-iseng saya bikin transistor tester untuk mengukur hFE dan VBE. Tidak terlalu presisi tapi cukup untuk mengetahui transistor masih bagus atau tidak, juga bisa untuk hFE matching. Matching transistor ini bisa cukup presisi karena semua transistor diukur dalam kondisi yang sama.

Gambar rangkaiannya ada di bawah ini:

transistor tester ver2.sch

Colector dan Emitor dihubungkan ke output digital arduino. Kalau transistor jenis NPN colector High dan emitor Low, sebaliknya jika transistor PNP. Kemudian tegangan basis diatur dengan output PWM yang difilter orde satu agar didapatkan tegangan DC, kemudian di buffer dengan op-amp. Menurut datasheet dari Atmel, setiap output digital maksimum bisa mengeluarkan (source) atau membenamkan (sink) arus sebesar 40mA. Jadi usahakan arus colector tidak melebihi 40mA.

Cara kerjanya adalah sebagai berikut:

1. Untuk transistor NPN

– Colector = HIGH (tidak bisa 5V tapi sekitar 4,6 – 4,8V, untuk lebih jelasnya baca datasheet microcontroller nya)

– Emitor = LOW (tidak bisa 0V tapi sekitar 0,2V, untuk jelasnya baca datasheet microcontroller nya)

– Output PWM dimulai dari duty – cycle 0 lalu dinaikkan sampai tegangan pada R3 sesuai dengan yang kita inginkan.

2. Untuk transistor PNP

– Colector = LOW (tidak bisa 0V tapi sekitar 0,2V, untuk jelasnya baca datasheet microcontroller nya)

– Emitor = HIGH (tidak bisa 5V tapi sekitar 4,6 – 4,8V, untuk lebih jelasnya baca datasheet microcontroller nya)

– Output PWM dimulai dari duty – cycle 255 lalu diturunkan sampai tegangan pada R3 sesuai dengan yang kita inginkan.

Pembacaan ADC dilakukan beberapa kali kemudian dicari rata-ratanya. Contohnya sudah ada di IDE ardunio pada sketch Smoothing. Pada program saya pengukuran dilakukan sebanyak 256x. Ini untuk menghindari pengukuran yang salah karena adanya noise.

Kemudian kita cari besarnya arus colector yaitu perbedaan tegangan R3 dibagi nilai R3. Arus basis besarnya sama dengan perbedaan tegangan R2 dibagi dengan nilai R2. Baik arus colector dan basis tipe datanya harus double.

hFE = arus colector dibagi arus basis

VBE = tegangan pada basis (NPN) atau 5V-tegangan pada basis (PNP)

Program bisa dikembangkan lebih lanjut menjadi kurva tracer. Sedangkan rangkaian untuk pengukurannya bisa juga dikembangkan agar pengukurannya lebih presisi dengan memakai relay untuk memilih tegangan 5V atau 0V pada colector dan emitor. Kemudian tegangan pada kedua ujung resistor R2 dan R3 diberi buffer pakai op-amp presisi dengan input JFET sehingga arus yang masuk ke input op-amp bisa diabaikan.

 
Tinggalkan komentar

Ditulis oleh pada 13 Desember 2013 in Arduino, Uncategorized

 

Tag: , , ,

Arduino Code, Optimalisasi VS Generalisasi


Pada Arduino ekosistem, keunggulan utamanya adalah kemudahan penggunaannya. Hal ini disebabkan code-codenya ditulis untuk menyembunyikan kerumitan hardware dari microcontroller yang digunakan. Code-code dibuat general (umum), sehingga bisa dipakai untuk tipe microcontroller yang berbeda, walaupun masih satu keluarga yaitu microcontroller AVR dari Atmel.

Code-code general ini membuat microcontroller lebih lama dalam mengerjakan suatu perintah. Contohnya: digitalWrite(pin, mode) yang source codenya ada di file Folder_instalasi_arduino\hardware\arduino\cores\arduino\wiring_digital.c. Jauh lebih cepat jika kita mengakses register microcontrollernya secara langsung. Misalnya: sbi(PORTG,7) artinya PORTG7 = HIGH. Namun dengan mengakses langsung register microcontroller, kita susah membuat code menjadi general karena belum tentu microcontroller lain memiliki register PORTG. Dan kita tidak bisa memakai mapping I/O dari arduino.

Dalam situasi tertentu dibutuhkan optimalisasi code-code agar microcontroller menjalankan code-code tersebut lebih cepat. Misalnya untuk menangani kejadian yang terjadi sangat singkat dan butuh respon yang cepat. Umumnya pada rutin interrupt atau deteksi sinyal yang lebar pulsanya sempit atau sinyal keluaran yang lebar pulsanya sempit, dan sebagainya. Jika dalam cara-cara “biasa”, arduino kita kurang responsif atau kurang cepat kita bisa melakukan optimalisasi code tentu dengan pengorbanan yang saya sebutkan tadi. Selain dengan cara mengakses register secara langsung, optimalisasi bisa dilakukan dengan menggabungkan bahasa assembler ke C/C++.

Jika Anda banyak menemukan situasi yang membutuhkan optimalisasi code, ada baiknya Anda beralih ke WinAVR atau AtmelStudio. Untuk produksi masal juga perlu dipertimbangkan penggunaan WinAVR atau AtmelStudio, sehingga Anda bisa memakai microcontroller yang lebih murah (Flash memorinya lebih kecil). Namun jika dengan cara-cara optimalisasi bahkan dengan penggunaan bahasa assembler secara keseluruhan masih kurang cepat, itu tandanya Anda membutuhkan microcontroller yang lebih cepat. Microcontroller 32 bit umumnya sudah cukup murah dari produsennya, namun karena kurang populer di Indonesia maka harganya menjadi tinggi.

 
Tinggalkan komentar

Ditulis oleh pada 6 Desember 2013 in Arduino, Uncategorized

 

Tag:

Komunikasi Arduino Dengan PC Memakai TCP/IP


Arduino Ethernet memiliki chip ethernet W5100 dari wiznet yang bisa dipakai untuk komunikasi lewat ethernet. Bisa juga arduino sheild ethernet yang juga memiliki chip W5100.

Arduino ethernet bisa kita gunakan untuk komunikasi dengan PC memakai TCP/IP. Cukup modifikasi contoh sketch Ethernet yaitu “Chat Server”. Arduino ethernet menjadi server TCP/IP dan PC menjadi client TCP/IP. Protocol komunikasi bisa kita bikin sendiri.

Contoh program arduino:

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network.
// gateway and subnet are optional:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac address
IPAddress ip(192,168,1, 3);  // IP address
IPAddress gateway(192,168,1, 1); //IP gateway
IPAddress subnet(255, 255, 255, 0); //IP Subnet

EthernetServer server(7119); //port server
EthernetClient client;   //variable untuk client object

void setup()
{

// initialize the ethernet device
   Ethernet.begin(mac, ip, gateway, subnet);
   // start listening for clients
   server.begin();

//inisialisasi yang lainnya di sini
}

void loop()
{

client = server.available();   //periksa apakah ada

//object client yang terhubung

if (client.available() > 0)  //apakah client mengirim data
    {

//check data yang dikirim oleh client misalnya: a = client.read();

//lalu respon jika diperlukan misalnya: client.print(a);

}

}

Pastikan pada program utama tidak ada bagian program yang menunggu tanpa timeout, karena pemeriksaan ada koneksi dari client dilakukan dengan looping di program utama. Jika ada bagian di program utama yang menunggu terlalu lama, maka koneksi dari client kemungkinan akan gagal. Usahakan respon kepada client secepat-cepatnya.

Pada PC bisa memakai Visual Studio Express yang gratis. Contohnya:

Dim IP As String

Dim data = New [Byte](2) {}

        Try
            If Not (client Is Nothing) Then
                client.Close()
            End If

            client = New TcpClient(IP, 7119)  ‘clent connect
            client.ReceiveTimeout = 1000
            data(0) = AscW(“U”) 
            Dim stream As NetworkStream = client.GetStream()
            attempt = 0
            Do
                stream.Write(data, 0, 1) ‘send U
                Dim bytes As Int32 = 0
                data(0) = 0
                bytes = stream.Read(data, 0, data.Length)
                attempt = attempt + 1
                If attempt = 200 Then Exit Do
            Loop While data(0) <> AscW(“U”)
            If data(0) = AscW(“U”) Then
                connected = True
            Else
                MsgBox(“Tidak ada respondari Arduino!”)
            End If
        Catch ex As Exception
            MsgBox(“Terjadi kesalahan saat menghubungi Arduino!”)
        End Try

Contoh-contoh di atas hanya bagian dari program yang sudah diujikan. Hanya diambil sebagian untuk menjelaskan prinsip kerjanya.

 
Tinggalkan komentar

Ditulis oleh pada 28 November 2013 in Arduino, Uncategorized

 

Tag: ,

Prinsip Kerja Scanning Dispaly LED


Untuk menampilkan display LED baik seven segment maupun Led matrix, caranya dengan menggunakan timer untuk meng-update/refresh display. Agar tidak terjadi fliker atau kedipan, maka frekuensi scanning tiap Led sedikitnya 50 Hz.

Contoh scanning Led pada arduino menggunakan Timer1. Library Timer1 bisa dicari diinternet atau bisa di download di bawah ini.

TimerOne (ganti file extention menjadi zip).

Extraxt TimerOne.zip ke folder “C:\Users\User_Name\Documents\Arduino\libraries“. Setelah program Arduino dibuka kembali, library tersebut bisa digunakan.

#include <TimerOne.h>

void scan_display()

{

// program untuk menscan display ada di sini

}

void setup()

{

Timer1.initialize( 5000 );    //scan setiap 5 ms      

Timer1.attachInterrupt( scan_display); //arahkan interrupt Timer1

//untuk menjalankan program scan_display()

}

void loop()

{

//program utama ada di sini

}

 
Tinggalkan komentar

Ditulis oleh pada 28 November 2013 in Arduino, Uncategorized

 

Tag: ,

 
%d blogger menyukai ini: