Laman

Senin, 27 Januari 2014

LM35 + LDR dengan ATtiny85 + Arduino UNO

ATtiny85 mempunyai 8 buah pin. 2 pin sebagai VCC-GND, 1 pin berfungsi sebagai reset. Berarti ada sisa 5 buah pin yang bisa dimanfaatkan sebagai input-output. Pada posting sebelumnya aku udah membuat interfacing dengan LCD karakter menggunakan 3 buah pin saja. Sehingga jika kita menggunakan LCD karakter, kita masih mempunyai 2 sisa pin yang bisa di manfaatkan untuk macam-macam. Nah sekarang aku memanfaatkannya untuk membaca sensor LM35 dan juga LDR sekaligus.

Posisi pin pada ATtiny85

Untuk memasukkan program ke ATtiny85, seperti biasa kita memanfaatkan board Arduino UNO sebagai ISP seperti postingan ini. Kode yang kita masukkan ke ATtiny85 seperti di bawah ini. Untuk library LiquidCrystal595.h dapat di sedot disini.
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(0,1,2);     // data, enable, clock

int pinSuhu = 3, pinLDR = 2;
float suhu = 0;
long a = 0, b;

void setup() {
    lcd.begin(16,2);
    lcd.setCursor(0,0);
    lcd.print("Suhu: ");
    lcd.setCursor(0,1);
    lcd.print("LDR : ");
}

void loop() {
  a = analogRead(pinSuhu);
  suhu = (5.0*a*100.0/1024.0);
 
  lcd.setCursor(6,0);
  lcd.print((long)suhu);
  lcd.print(" C  ");
  delay(500);
  
  b = analogRead(pinLDR);
  lcd.setCursor(6,1);
  lcd.print((long)b);
  lcd.print("   ");
  
  delay(500);
}
Setelah dimasukin program, kita rangkai ATtiny85-nya seperti ini


Rangkaiannya akan terhubung ke LCD dengan 3 wire. Kalau bingung gimana rangkaiannya, nih aku ada rangkaian yang ku gambar di eagle.


Driver LCD 3 wire dengan shift register 74HC595 (setelah dicetak)

Kalo ada tugas-tugas kuliah, menggunakan ATtiny85 cocok digunakan untuk projek-projek kecil-kecilan seperti ini. Biasanya sih 1 atau 2 inputan dengan output berupa LCD karakter sudah mencukupi. Ukuran rangkaian akan lebih ringkas dan murah.


Semoga dapat bermanfaat ~

Sabtu, 25 Januari 2014

Running LED dengan ATtiny85 dan Arduino UNO

Arduino lagi. Referensi dari sini. Kali ini aku memfungsikan arduino sebagai ISP yang nantinya akan bertindak sebagai downloader untuk memasukkan program ke ATtiny85. Pertama-tama kita atur dulu Arduino UNO sebagai ISP. Kita upload kode untuk 'Arduino ISP' ke Arduino UNO (atau apapun yang kita pakai) seperti mengupload program biasa dengan mengambil dari file --> Examples --> Arduino ISP.


Nah sekarang Arduino sudah berfungsi sebagai ISP. Karena di IDE tidak terdapat board untuk ATtiny85, maka kita download dulu disini. Kita ekstrak ZIP yang sudah di download. Di dalamnya nanti terdapat folder attiny-master. Didalam folder attiny-master terdapat folder attiny. Nah folder attiny inilah yang kita kopikan ke C:/Arduino/hardware. Tergantung letak Arduino nya, yang penting kita menyimpannya di dalam folder 'hardware'. Pastikan ATtiny85 sudah terbaca oleh IDE seperti gambar ini.


Untuk pengaturan dasar, jangan lupa kedua hal ini. Tools --> Programmer --> Arduino as ISP. Lalu Tools --> Board --> ATtiny85 (internal 1MHz clock). Lalu kita buat kode program sederhana seperti ini.
int led1=0, led2=1, led3=2, led4=3, led5=4;

void setup() {                
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}
void loop() {
  digitalWrite(led1, HIGH);delay(50);              
  digitalWrite(led1, LOW); delay(50);
  digitalWrite(led2, HIGH);delay(50);              
  digitalWrite(led2, LOW); delay(50);
  digitalWrite(led3, HIGH);delay(50);              
  digitalWrite(led3, LOW); delay(50);
  digitalWrite(led4, HIGH);delay(50);              
  digitalWrite(led4, LOW); delay(50);
  digitalWrite(led5, HIGH);delay(50);              
  digitalWrite(led5, LOW); delay(50);  
}
Untuk rangkaian downloader-nya (memasukkan kode ke ATtiny85) kita atur seperti ini (klik gambar untuk memperbesar).


Setelah ATtiny85 dimasukkan program, kita atur rangkaiannya seperti ini.

Dan ini hasil running LED nya.

Jumat, 24 Januari 2014

LCD 3 pin dengan Arduino UNO


Alhamdulillah pesanan arduino udah datang. Ada mainan baru nih buat ngisi waktu kosong (soalnya Jumat-Minggu libur hehe). Setelah berkedip-kedipan dengan LED pada pin13, langsung aja aku nyoba rangkaian lain. Aku pun mencoba rangkaian interfacing LCD dengan menggunakan 3 wire yang ada di sini, padahal biasanya membutuhkan 6 wire minimal. Rangkaian ini dibantu oleh shift register 74HC595. Check it out.

Sekalian belajar ngegambar rangkaian di fritzing hehe

Untuk contoh kode programnya di arduino seperti ini.
#include <liquidcrystal595.h>

LiquidCrystal595 lcd(0,1,2);     // data, enable, clock

void setup() {
    lcd.begin(16,2);

    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("LCD MEMAKAI");
    lcd.setCursor(5,1);
    lcd.print("3 PIN");
}

void loop() {
}

Untuk library LiquidCrystal595.h dapat di download disini. Hasilnya pun seperti ini.


Ohiya kiriman downloader juga baru datang. Ini kiriman gratis dari seorang master baik hati yang memberikan gambar rangkaian di grup fb 'arduino indonesia'. Siapa yang bisa mengetahui dimana letak kesalahan rangkaiannya, bakal dikirimin downloader ATtiny2313 ini hehe. Udah tinggal solder dan pakai karena sudah ditanam firmware-nya. Kalau ada waktu luang lagi ngoprek ini lah, soalnya masih ada usbasp downloder ATmega8.


Semoga bermanfaat ~

Jumat, 17 Januari 2014

Interfacing keypad 3X4 dengan ATmega16


Rangkaian simulasi proteus


Kode programnya
#include "mega16.h"
#include "stdio.h"
#include "delay.h"
#include "lcd.h"

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include "lcd.h"

int n=-1;
char string[16];
char angka;

void scanning(char a, char b, char c, char d){                  
PORTD=a;
delay_us(100);
if(PIND.2==0)
{angka=b;n++;delay_ms(111);}
else if(PIND.1==0)
{angka=c;n++;delay_ms(111);}
else if(PIND.0==0)              
{angka=d;n++;delay_ms(111);}
if(n>16){n=0;
lcd_clear();}
}

void main(void)
{
DDRD=0b01111000;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
while (1)
      {
        scanning(191,1,2,3);
        scanning(223,4,5,6);
        scanning(239,7,8,9);
        scanning(247,'*',0,'#'); 
        
        lcd_gotoxy(0,0);
        lcd_putsf("  LCD KARAKTER ");
        
        if(angka >= 0 && angka <= 9){
        lcd_gotoxy(n,1);
        sprintf(string, "%i", angka);
        lcd_puts(string);
        } else {
        lcd_gotoxy(n,1);
        sprintf(string, "%c", angka);
        lcd_puts(string);}
      }
}

Di program ada kode.
        scanning(191,1,2,3);
        scanning(223,4,5,6);
        scanning(239,7,8,9);
        scanning(247,'*',0,'#');

Disini aku membuat fungsi sendiri untuk scanning tiap baris agar kodenya sedikit. Aku menggunakan PORTD untuk keypadnya. PIND.0-2 aku gunakan sebagai kolom, sedangkan PORTD.3-6 aku gunakan sebagai baris. Maksud dari 191 adalah decimal dari bilangan biner 10111111 yang berturut-turut adalah nilai port nomor 7 sampai 0. Maksudnya kita men-scan baris pertama (PORTD.6=0). Nah saat PORTD.6 nol, kita gunakan berbagai kondisi untuk mencocokkan tombol mana yang ditekan yang bergantung pada kolom mana yang bernilai 0.  Nah tiga angka setelah angka '191' merupakan akibat bila salah satu kolom terpenuhi kondisinya. Jika tidak ada penekanan tombol maka dia akan berlanjut ke scanning baris kedua, yaitu 223 (PORTD.5=0). Begitu seterusnya scanning berlangsung dengan sangat cepat.
        if(angka >= 0 && angka <= 9){
        lcd_gotoxy(n,1);
        sprintf(string, "%i", angka);
        lcd_puts(string);
        } else {
        lcd_gotoxy(n,1);
        sprintf(string, "%c", angka);
        lcd_puts(string);}

Ini merupakan sintaks untuk menampilkan karakter ke LCD. Ada dua macam sintaks yaitu untuk karakter angka dan karakter bebas. Untuk angka (berjenis integer) maka kita memanggilnya dengan '%i' dan untuk karakter bebas (berjenis character) kita gunakan '%c'. Koordinat 'n' hanya untuk menggeser posisi karakter selanjutnya yang mana setiap karakter yang muncul akan menyebabkan n bertambah satu. Sehingga karakter yang baru, akan muncul disebelahnya.


Untuk simulasi di proteus dan kode program di CVAVR bisa di ambil disini

Password: abcde

Rabu, 15 Januari 2014

Menggunakan ping))) secara akurat dengan atmega16

Kali ini kita akan membahas penggunaan sensor ping))). Sensor ping))) adalah sensor yang berguna untuk mengukur jarak dengan memanfaatkan sinyal ultrasonik berfrekuensi (mungkin) 40 kHz. Sinyal ini  akan dipancarkan ping)))  dan dipantulkan benda didepannya. Waktu yang diperlukan sinyal tersebut untuk kembali di baca oleh ping)))  dapat kita konversi menjadi jarak antara sensor ping)))  terhadap benda yang ada didepannya. Untuk dapat mengakses ping))), begini caranya.

1. Pin diatur sebagai output
2. Kita kasih sinyal low selama 2 us (terserah, yang penting sinyal highnya 5 us)
3. Kita kasih sinyal high  selama 5 us
4. Pin kita atur jadi input
5. ping))) memancarkan ultrasonik dan pencacahan dimulai
5. Saat memancarkan ultrasonik, ping))) akan mengeluarkan sinyal high
6. Saat pantulan kembali lagi, ping))) akan bersinyal low
7. Saat pantulan terbaca, kita langsung kembalikan nilai bacaan timer ke fungsi utama.

Berikut gambaran rangkaian sederhananya.



Kode programnya
#include "mega16.h"
#include "delay.h"
#include "stdio.h"

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include "lcd .h"

unsigned int cycle;
int i;
char yeah[33];
float siklus,waktutempuh;   //detik
float xtall=12000000; //xtal yang digunakan
float bunyi=3434;     //cepat rambat bunyi di udara, 344 m/s
float prescaller=64;     //prescaller yang di pilih
float jarak;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
cycle++;
}
      
unsigned int ping(void){
      DDRB.0 = 1;
      PORTB.0 = 0;
      delay_us(2);
      PORTB.0=1;
      delay_us(5);
      PORTB.0 = 0;
      DDRB.0 = 0;
      while(PINB.0==0){}
      TCNT0 = 0x00;           
      cycle = 0;
      while(PINB.0==1){}
      return (cycle * 256 + TCNT0);
      }

void main(void)
{   
TIMSK = 0x01;
TCCR0 = 0x03;
ACSR=0x80;
SFIOR=0x00;

lcd_init(16);
#asm("sei")
while (1)
      {
      i=ping();
      
      siklus=(float)prescaller/xtall;
      waktutempuh=(float)siklus*i/2;      
      jarak=(float)waktutempuh*340*1000;
      
      lcd_gotoxy(0,0);
      lcd_putsf("   UKUR JARAK   ");
      lcd_gotoxy(0,1);
      sprintf(yeah,"  %f mm  ",jarak);
      lcd_puts(yeah);

      delay_ms(400);                                                                    
      }
}

Disini aku menggunakan timer 0. Pada timer 0, maksimal intervalnya sampai dengan 256. Prescaler (pembagi) yang aku gunakan 64, sehingga TCCR0=0x03 (lihat datasheet). Nah dengan begitu aku mendapatkan frekuensi dari clock tersebut sebesar xtall dibagi prescaler (12MHz/64) yaitu sebesar 187.500 Hz. Untuk mengetahui periodanya, tinggal kiba bagi oleh satu (T = 1/f) sehingga kita dapatkan perioda untuk satu siklus adalah 0.000005333 detik untuk satu siklus. Maksudnya, kan timer satu mencacah dari 0-255, nah tiap cacahan dari 0 ke 1, atau dari 1 ke 2 memerlukan waktu sebanyak perioda.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
cycle++;
}
Kode diatas maksudnya sebagai overflow. Maksudnya, kan timer 0 hanya dapat menghitung sampai 255 (oleh TCNT0). Sehingga ketika sampai 255 dia akan mengulang lagi dari nol. Nah agar sebagai pertanda dia telah menyelesaikan sampai cacahan ke 255, maka kita tandai dengan naiknya nilai cycle sebanyak satu. sehingga dengan begitu timer satu seolah-olah dapat mencacah sampai ratusan ribu (mungkin). Untuk mengetahui berapa total cacahan, kita tinggal masukan kode ini.
return (cycle * 256 + TCNT0);
Nah sekarang kita udah tahu banyak cacahan. Sekarang kita hitung berapa waktu yang diperlukan sinyal tersebut untuk mengenai objek dan kembali lagi. Yaitu dengan mengalikan jumlah cacahan (i) dengan waktu yang diperlukan untuk satu cacahan (siklus). Itu kan waktu bolak-balik sinyal. Untuk mengetahui waktu yang diperlukan dari ping))) ke benda tinggal di bagi 2.
siklus=(float)prescaller/xtall;
waktutempuh=(float)siklus*i/2;
Untuk mengetahui jarak tinggal kita kalikan dengan kecepatan bunyi (s = v . t). Kecepatan bunyinya kita asumsikan saja 340 m/s. Nah, kita telah dapatkan jarak dalam satuan meter. Biar nggak ribet, kalikan aja dengan 1000 biar pengukuran dalam satuan milimeter.
jarak=(float)340*waktutempuh*1000;
Ohiya satu lagi yang penting. Biar presisi, jangan lupa kasih pengaturan di CVAVR-nya dengan cara memilih menu di bagian atas. Project > Configure > C Compiler > Code Generation. Lalu Pada bagian (s)printf Features: pilih bagian yang 'float, width, precision'. Lalu oke. Ini hasil nya.


Untuk program CVAVR lengkapnya dapat didownload disini

Sabtu, 11 Januari 2014

Getting started with mbed LPC1768

Liburan ini pingin belajar mbed. Bukan beli, tapi minjam punya unit. Maklum harganya itu hehe. Mbed LPC1768 menggunakan 100MHz ARM dengan memori SRAM 64 kB dan memori flash 512 kB. Kelebihan dari mbed ini adalah cara masukin programnya yang tinggal drag-and-drop atau seperti transfer data ke flashdisk biasa. Tanpa downloader khusus, tanpa instal compiler lagi. Dia juga menyediakan compiler online di http://mbed.org . Disitu sudah banyak contoh projek dan juga library untuk banyak perangkat. Selain itu kita juga bisa import kode dari situs tersebut ke compiler keil uvision 5.



Kali ini aku akan mencoba running led pada board mbed. Board mbed telah menyediakan led SMD sebanyak empat buah. Ini lah led yang akan kita program.

Cara membuatnya.

1.  Buka http://mbed.org
Kalau belum buat akun silahkan dulu dibuat akunnya. Jika sudah, maka pilih platform yang kita gunakan. Disini aku gunakan mbed LPC1768. Lalu pilih 'compiler' disudut kanan atas.


2.  Buat program
Setelah itu create new program dengan cara 'new' lalu pilih 'new program'. Disitu telah ada template hello world yang berisikan kode untuk blinking led (kalo belum ada tinggal import programs).

Buat program baru dan beri nama
Pilih program yang telah kita beri nama dan klik ganda pada main.cpp

Maka akan tampak kode seperti gambar diatas

Kita edit seperti kode dibawah ini
#include "mbed.h"

DigitalOut a (LED1), b (LED2), c (LED3), d (LED4); // deklarasi nama untuk LED

int main() {
while(1) {
    a = 1;      // LED1 hidup
    wait(0.05); // selama 0.05 detik
    a = 0;      // LED1 mati   
    wait(0.05); // selama 0.05 detik
    b = 1;
    wait(0.05);
    b = 0;
    wait(0.05);
    c = 1;
    wait(0.05);
    c = 0;
    wait(0.05);
    d = 1;
    wait(0.05);
    d = 0;
    wait(0.05);      
    }
}

Setelah itu program kita compile dan otomatis akan terdownload ke komputer. Program yang tersimpan ini bertipe file binary.


3. Masukkan program
Pergi ke folder tempat kita menyimpan file tersebut dan kirimkan ke mbed dengan 'send to' ataupun copy-paste seperti mindahin data flashdisk. Lalu tekan tombol di mbed, dan running led pun selesai.

Simpan file-nya

Kirim ke mbed
Programnya sangat sederhana, hanya kumpulan dari hidup-mati LED dengan jeda tertentu. Kemudahan mbed ini juga bisa kita rasakan saat ingin memprogram bermacam-macam sensor. Kita tinggal ambil library-nya dari situs mbed dan meng-import-nya. Bisa langsung ke file binary maupun dalam bentuk keil uvision 5 agar dapat di program secara offline.


Kamis, 09 Januari 2014

Membuat PCB step by step

Liburan ngga ada kerjaan, jadilah aku membuat PCB. Lagian bosen juga asal butuh PCB selalu mesan. Selain harga lebih mahal, waktu pembuatannya juga lama, bisa menunggu waktu 1-2 hari. Kalau kita buat sendiri, palingan hanya butuh 1 jam. Check it out !

Bahan-bahan membuat PCB di list di bawah ini:
1.  FeCl3
2.  Bros kawat untuk panci (bisa diganti dengan kertas amplas yang paling halus)
3.  Gambar rangkaian di plastik mika
4.  Setrika
5.  Bor kecil
6.  Spidol permanen
7.  Thinner (opsional)
8.  Pilox clear/transparan (optional)
9.  Papan PCB polos (yaiyalah)

Cara membuat :
1.  Sediakan gambar rangkaian diplastik mika
Jadi, rangkaian PCB yang sudah kita desain, kita print dikertas biasa. Nah rangkaian itu kita fotokopikan ke tukang fotokopi. Bilang aja fotokopinya diatas plastik mika.

2.  Haluskan PCB polos
PCB polos biasanya banyak terdapat kotoran oksidasi. Walaupun tidak, kita tetap mesti melicinkan permukaannya dengan cara menggosok dengan bros kawat. Digosok terus sampai mengkilap. Setelah mengkilap cuci dengan sabun, dan jangan disentuh lagi permukaannya dengan tangan. Nanti minyak dari tangan berbekas di PCB dan bercap sidik jari dan ini dapat mengganggu transfer gambar dari mika ke lapisan tembaga. Kalau ngga ada bros kawat, gunakan amplas yang paling halus.

Perbedaan sebelum digosok dengan setelah.


3.  Transfer gambar rangkaian
Setrika diatur pada tingkat panas ‘wool’. Lalu gambar rangkaian tersebut ditempelkan ke lapisan tembaga dan disetrika sambil ditekan sekitar selama setengah sampai 1 menit. Kalau kelamaan gambar rangkaian akan meluber, kalau terlalu cepat dan tidak merata gambar rangkaian tidak merekat semua. Harus pas. Setelah itu dinginkan lalu cabut plastik mikanya perlahan. Kalau ada jalur yang kurang jelas atau terputus, sambung manual aja pakai spidol snowman permanen yang ukuran kecil. Sebenarnya bisa juga plastik mika digantikan dengan kertas HVS biasa, tapi butuh waktu 10 menitan untuk transfer gambar rangkaiannya.

Setelah mika lengket ke tembaga, lapisi mika degan kertas, biar aman aja.
Hasil transfer dengan kertas HVS biasa. Hasil ternyata rapi juga.
Hasil transfer dengan mika. Masih perlu diperjelas lagi dengan spidol.

4.  Larutkan FeCl3 + air
Takarannya sesuai feeling aja hehe. Semakin banyak FeCl3 maka larutnya tembaga akan semakin cepat. Kalau bisa secukupnya saja, karena FeCl3 ini bersifat racun, sehingga kelimpahan FeCl3 sedikit ketika tembaga telah larut semua. Larutkan PCB-nya sambil di goyang-goyang wadahnya biar cepat larutnya.

Jangan pakai sendok logam agar tidak larut.

5. Keringkan PCB
Angkat PCB dari wadah larutan FeCl3 dan keringkan dengan tisue. Kalau dicuci dengan air, airnya akan ke selokan dan meracuni ekosistem di selokan hehe. Karena FeCl3 ini limbah bahaya. Tisue nya dibuang ditempat seharusnya, dan sisa FeCl3 di olah lagi biar ngga bahaya (kalau mau googling aja caranya). PCB yang sudah kering dicuci bersih.

Setelah kering dan dicuci bersih.


6.  Finishing
Ambil thinner lalu lap toner yang masih menutupi PCB. Kalau tidak ada thinner, digosok aja pakai kertas sampai hitamnya hilang. Lalu kita bor bagian lubang PCB dengan bor PCB atau bor kecil lain. Setelah itu, untuk memperindah PCB tambahkan silksc reen. Caranya sama dengan saat mencetak gambar rangkaian, yaitu gambar silkscreen yang telah di print (dengan efek mirror biar ngga kebalik), kita fotokopi di mika dan kita setrika di PCB bagian atas untuk memberikan keterangan komponen. Kalau udah di rangkai komponenya, kita semprot bagian bawah PCB (yang ada tembaganya) dengan pilox transparan.

PCB dibor
Penambahan silkscreen

Selesai . .