About

Ahmad Edi Saputra

Wednesday, September 23, 2015

WinAVR GPIO (menulis library seperti arduino) ATMega32

GPIO sebenarnya merupakan dasar yang simple dari sebuah mikrokontroler, pengaksesan GPIO bisa dibilang seperti "hello world!"-nya setiap bahasa pemrograman. Dengan arti lain, setidaknya kita harus mengenal GPIO untuk mulai bermain dengan mikrokontroler. Pengaksesan GPIO sendiri cukup mudah, misalnya pada ATMega32 hanya perlu mengatur pin sebagai input atau output dan menulis logika pada pin IO tersebut dengan DDRx = 0xFF untuk output atau DDRx=0x00 sebagai input, PORTx=0xFF(5V) untuk logika tinggi atau PORTx=0x00 untuk logika rendah(0V).  lalu bagaimana agar pemrograman kita dapat terkesan lebih profesional dan dapat digunakan kembali dilain waktu? bagaimana jika kita tidak ingat perbedaan DDRx dan PORTx?

Logika dasarnya register DDRx, PORTx, dan PINx juga memiliki alamat register, jadi inilah yang seharusnya kita simpan kedalam library yang akan kita buat. berikut ini contoh register ATMega32
Selanjutnya karena ATMega32 memiliki 32 pin IO maka buatlah kedalam sebuah array yang setiap 8 byte menyimpan alamat registernya. untuk lebih mudahnya, susun sesuai dengan mapping IO ATMega32 (DIP Package) sehingga akan berurutan PORTB, PORTD, PORTC, PORTA. sehingga array untuk register DDR akan menjadi 
const uint8_t DDRx[32]={
0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, //DDRB
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, //DDRD
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, //DDRC
0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,//DDRA
};
const uint8_t PORTx[32]={
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,//PORTB
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,//PORTD
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,//PORTC
0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B,//PORTA
};
 Setelah mendapatkan array dari register, dua fungsi yang harus di ketahui yaitu _BV(x) dan _SFR_IO8(registerAddress), dua fungsi ini biasanya dipakai pada macro sbi(register,bit) dan cbi(register,bit). oleh karena itu fungsi yang akan dibuat kurang lebih akan sama dengan sbi dan cbi. berikut fungsi pinMode(pinNumber,modePin).

#define INPUT 0
#define OUTPUT 1
#define INPUT_PULLUP
void pinMode(uint8_t pin, uint8_t mode){
uint8_t num_pin = pin%8;
if(mode==OUTPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))|=_BV(num_pin);
}else if(mode==INPUT){
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
}else{
_SFR_BYTE(_SFR_IO8(DDRx[pin]))&=~(_BV(num_pin));
_SFR_BYTE(_SFR_IO8(PORTx[pin]))|=_BV(num_pin);
}
}

Saturday, September 12, 2015

Arduino dan sensor PIR (Passive Infra Red)

Hampir semua benda yang memiliki suhu diatas nol mutlak (absolute zero) memancarkan energi panas dalam bentuk radiasi gelombang infrared sehingga mata manusia tidak dapat melihat secara langsung. Oleh karena itu digunakan sebuah sensor PIR atau passive infrared. Disebut passive karena sensor ini hanya mendeteksi pancaran infrared yang ada disekitarnya tanpa memancarkan radiasi apapun. Sensor ini cukup mudah ditemukan karena sifatnya yang murah, ukuran kecil, dan hemat daya.

Berikut ini merupakan bagian-bagian dari sensor PIR

Gambar tersebut menunjukan terdapat 3 konektor yang siap disambungkan dengan perangkat lain, 2 diantaranya adalah VCC dan Ground yang mana adalah positif dan negatif power suply untuk sensor, sensor ini bekerja pada tegangan 3-5VDC. 1 pin yang terletak ditengah merupakan output dari sensor. output sensor ini merupakan data digital yang akan bernilai HIGH jika mendeteksi pergerakan objek dan bernilai LOW jika tidak ada objek yang terdeteksi.

Untuk menguji kinerja Sensor ini, kita gunakan alat bantu untuk mengujinya yaitu Arduino board. pin output dari sensor, akan disambung dengan pin no 7 pada board Arduino. berikut ini program untuk pengujianya

void setup() {
  // put your setup code here, to run once:
    pinMode(7,INPUT_PULLUP);
    Serial.begin(9600);
    pinMode(13,OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
    if(digitalRead(7)==LOW){
        digitalWrite(13,LOW);
    }else{
        digitalWrite(13,HIGH);
    }
}

jika ada pergerakan disekitar sensor maka LED user pada board arduino akan menyala dan jika tidak akan tetap mati. Selamat mencoba

Thursday, June 25, 2015

WIN AVR Getting started

WIN AVR merupakan IDE gratis dengan compiler open source GCC sehingga banyak yang menyebut AVR GCC. Tentu kita semua mengenal Arduino yang sedang populer dikalangan pengembang mikrokontroler saat ini. IDE Arduino yang digunakan untuk pengembangan program Arduino juga menggunakan compiler GCC untuk itu, mari kita memulai project baru dengan compiler GCC namun dengan bahasa yang lebih rendah. bahasa yang lebih rendah disini adalah bahasa yang semakin dekat dengan bahasa mesin, biasanya semakin rendah sebuah bahasa pemrograman hasil eksekusi programnya akan lebih optimal

Untuk dapat menggunakan IDE WIN AVR download disini kemudian install. setelah terinstall dengan baik, buka programmer notepad

 sehingga terlihat gambar berikut ini
bagian dengan nomor 1 merupakan project tree yang memuat file-file didalam project yang sedang dibuka.
bagian nomor 2 merupakan source editor atau tempat untuk mengedit program
bagian nomor 3 merupakan bagian notifikasi saat proses kompilasi

untuk membuat project baru klik File->new->project lalu beri nama dan simpan pada direktori yang mudah diingat lihat gambar 1 (bawah)


setelah itu, buat source codenya dengan klik File->new->C/C++ simpan pada direktori yang sama dengan project. untuk pertama kalinya buatlah source code dengan ekstensi .c untuk bhasa C dan .cpp untuk bahasa C++. liat gambar 2(bawah)

selanjutnya buka program untuk membuat makefile yang digunakan untuk memberi informasi tentang mikrokontroler kepada kompiler. carannya klik pada MFile[WinAVR] pada startmenu.

setelah terbuka ada beberapa pengaturan yang harus dikerjakan seperti nama main file, besar clock, dan lainya langsung saja dari makefile klik enable editing

cari dan ganti sesuai dengan mikrokontroler yang digunakan misalnya mikrokontroler yang digunakan adalah ATMega32 dengan clock 12MHz maka MCU name harus atmega32

# MCU name
MCU = atmega32


# Processor frequency.
#     This will define a symbol, F_CPU, in all source code files equal to the 
#     processor frequency. You can then use this symbol in your source code to 
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
#     automatically to create a 32-bit value in your source code.
#     Typical values are:
#         F_CPU =  3686400
#         F_CPU =  4000000
#         F_CPU =  7372800
#         F_CPU =  8000000
#         F_CPU = 11059200
#         F_CPU = 14745600
#         F_CPU = 16000000
#         F_CPU = 18432000
#         F_CPU = 20000000
F_CPU = 12000000


# Output format. (can be srec, ihex, binary)
FORMAT = ihex

#nama source code yang berisi fungsi main
# Target file name (without extension).
TARGET = main


# Object files directory
#     To put object files in current directory, use a dot (.), do NOT make
#     this an empty or blank macro!
OBJDIR = .


#ganti dengan .cpp jika ingin menggunakan bahasa C++
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c


setelah pengaturan selesai, save as di direktori yang sama dengan projek dan main file tanpa diganti nama langsung klik save

lalu pada programmer notepad klik tools->[WinAVR]Make All, jika sukses maka akan muncul warning "Program exit code : 0"

Monday, January 19, 2015

Arduino dan RTC DS1307 di Proteus

RTC DS1307 merupakan salah satu jenis RTC yang banyak dijumpai di Indonesia, khususnya jogja:).
RTC ini dapat diakses menggunakan Arduino melalui interface I2C. apa itu I2C? lihat DISINI

Singkat cerita, karena I2C merupakan jalur yang bisa dimanfaatkan untuk banyak slave ada kasus dimana beberapa librari Arduino yang menggunakan Wire.h (library I2C arduino) mengalami crash. sehingga alangkah baiknya untuk menulis sendiri biar enak dan dijamin tidak crash. hehe

Langsung saja keproteusnya


berikut ini contoh program untuk membaca data dari RTC, untuk nulisnya nyusul

#include <Wire.h>

void setup(){
      Serial.begin(9600);
      Wire.begin();
}
void loop(){
      bacaWaktu();
      delay(1000);
void bacaWaktu(){
      Wire.beginTransmission(0x68);
      Wire.write(0x00);
      Wire.endTransmission();
      Wire.requestFrom(0x68,7);
      int data[7];
      for(byte i=0;i<7;i++){
          data[i]=Wire.read();
      }
      for(byte i=0;i<7;i++){
          byte temp = ((data[i]/16)*10)+(data[i]%16);
          Serial.print(temp);
          Serial.print(" ");
      }
      Serial.println();
}

I2C (Inter Intgrated Circuit)

I2C merupakan komunikasi serial dua kabel yang menggunakan SDA sebagai jalur data dan SCL sebagai jalur clock. pada komunikasi ini, clock untuk mengirimkan data bersumber dari master atau host. host lah yang mengatur jalanya aliran data baik mengirim maupun menerima data sampai memilih slave yang akan berkomunikasi dengan host. Karena I2C merupakan komunikasi antar IC maka komunikasi ini mampu digunakan untuk beberapa IC seperti terlihat pada gambar dibawah ini.
SDA dan SCL merupakan pin open drain/kolektor sehingga membutuhkan pull-up agar sinyal dapat dihasilkan dengan baik. keuntungan dari sistem pull-up adalah hanya tinggal mengganti VCC pada pull-up untuk menghasilkan level sinyal yang berbeda.

Agar host (misalnya Device1) mampu menunjuk slave yang akan diajak berkomunikasi, maka masing-masing slave memiliki slave address. slave address ini harus ditunjuk pertamakali sebelum pertukaran data dilakukan. setelah slave addres ditunjuk. misalnya Device2, maka slave lain akan mengabaikan data apapun yang diterimanya.


Frame data pada pengiriman data I2C dapat dilihat pada gambar diatas. pertama-tama, I2C host mengirim sinyal start ataupun repeat start jika start gagal. setelah sinyal start berhasil dikirim, host mengirim addres untuk menunjuk slave. addres slave ini hanya 7 bit MSB tetapi dalam pengirimanya address menjadi 8-bit karena memiliki 1-bit kondisi komunikasi yaitu untuk read (bit 0 = 1) atau write (bit 0 = 0). setelah penunjukan slave address berhasil, slave akan mengirim ACK(ACKnowledge) dan host hanya bisa menerima/ mengirim data setelah ACK ini diterima.  selanjutnya host siap mengirim data.

berikut ini sinyal start dan stop dari I2C
sinyal start ditandai dengan transisi turun pin SDA saat pin SCL masih tinggi sedangkan sinyal stop ditandai dengan transisi naik pin SDA saat SCL masih tinggi. hal ini terjadi karena pada dasarnya SCL merupakan clock yang akan naik dan segera turun setelah sampling selesai sementara SDA hanya akan bertransisi saat sampling sudah selesai atau SCL rendah.

Tuesday, January 13, 2015

Arduino dengan ATMega32

Pada kesempatan kali ini, kita akan membahas cara membuat board arduino sendiri dengan ATMega32. sementara, kita tidak memakai bootloadernya dulu. pada banyak kasus, semua berjalan lancar.

Arduino IDE pada dasarnya memiliki kesamaan dengan WINAVR2000, mulai dari makefile sampai library. pada makefile Arduino, penentuan chip, besarnya clock yang digunakan sampai fusebit yang dipakai dilakukan pada file "board.txt". Untuk itu, langkah pertama untuk membuat Arduino dengan ATMega32 hanyalah dengan mengedit file tersebut. File tersebut terletak pada \..\Arduino\hardware\arduino



lalu paste code dibawah ini tepat di tempat paling bawah lalu simpan perubahan.

##############################################################

mega32-16.name=ATmega32-External 16mhz
mega32-16.build.mcu=atmega32
mega32-16.build.f_cpu=16000000L
mega32-16.build.core=arduino:arduino
mega32-16.build.variant=mega32
mega32-16.upload.maximum_size=3200
mega32-16.bootloader.low_fuses=0xEF
mega32-16.bootloader.high_fuses=0x89
mega32-16.bootloader.extended_fuses=0xFD

##############################################################
langkah selanjutnya adalah definisi pin I/O, timer, dan lainya. Buat folder baru di \..\Arduino\hardware\arduino dengan nama mega32


paste file pin_arduino.h didalam folder mega32 tersebut. file tersebut dapat didownload DISINI

Langkah selanjutnya, restart IDE arduino jika sedang dibuka. lalu ganti board seperti biasa maka akan muncul seperti gambar berikut

kita sudah siap meprogramnya sesuai dengan deskripsi PIN dibawah ini. misalnya pin digital dimulai dari 0 sampai 23. sehingga untuk mengakses PORTC7(D23) maka hanya perlu

pinMode(23,OUTPUT)


Sunday, January 11, 2015

membuat line follower dengan kendali PID



bagaimana videonya? hehe itu waktu masih jaman suka mainan robot kira-kira 2 tahun yang lalu...

baiklah sobat toluent yang ingin membuat LF atau Line Follwer dengan kendali PID. Hal pertama adalah dengan membuat hardware LF-nya terlebih dahulu.

pada dasarnya kendali PID hanya mengolah error atau galat yang didapat dan mengatur kecepatan aktuator agar error menurun sampai errornya hilang. untuk membuat error dari sensor LF akan kita bahas nanti sekarang hanya perhitunganya kecilya saja. ya, perhitungan diskrit sederhana dari PID

Proporsional= error *KP
Integral=error*KI
Derivatif=rate*KD


Driver H-bridge dengan MOSFET POWER IRF

MOSFET merupakan jenis transistor efek medan karena memanfaatkan medan listrik untuk membuka dan menutup kanal penghantarnya. transistor jenis mosfet ini memiliki 3 pin yaitu G atau GATE, D atau DRAIN, dan S atau SOURCE. MOSFET mengalirkan arus dari drain ke source sehingga arus aktif mosfet biasa disebut IDS, sehingga memungkinkan adanya IDS negatif

Mosfet power IRF (internal rectifier) merupakan jenis transistor efek medan yang sudah terdapat penyearah didalamnya (lebih tepatnya semacam freewheeling) dan cocok digunakan untuk elektronika daya besar. Mosfet yang akan digunakan adalah mosfer jenis IRF9540 (P-channel MOSFET) dan IRF540 (N-channel MOSFET)

MOSFET channel N dan P memiliki kinerja yang komplement. MOSFER N akan aktif jika VGS tidak sama dengan nol atau sebesar 10V untuk IRF540 sedangkan untuk MOSFET P aktif saat VGS sama dengan -10V (IDS channel P biasanya negatif).


dari gambar diatas, VGS MOSFET IRF9530 mendapat tegangan VGS negatif (VGS=VG-VS) karena G tersambung dengan ground sedangkan S tersambung dengan VCC sehingga arus IDS mengalir (IDS= negatif, jadi arus dari S ke D). untuk MOSFET IRF540 karena G tersambung dengan GROUND maka VGS=0 sehingga MOSFET tidak aktif, tidak ada IDS.

untuk lebih jelasnya tentang sistem kerja H-bridge silahkan klik disini

Friday, January 9, 2015

Driver motor H-bridge

Assalamualaikum sahabat toluent yang ingin mengembangkan diri dibidang elektronika, kali ini kita akan mengulas tentang driver motor H-bridge atau sering juga disebut dengan driver jembatan H karena bentuknya yang memiliki dua buah lengan dan satu jembatan sehingga serupa dengan huruf H. driver ini banyak digunakan untuk mengendalikan arah putaran motor DC bahkan sampai ada yang menggunakanya sebagai inverter (pengubah DC ke AC).

Cara kerja driver ini dapat dilihat pada gambar dibawah ini
Kali ini kita hanya akan mengulas tentang cara kerja driver H-bridge untuk motor DC dimana motor DC hanya memerlukan perubahan polaritas untuk dapat merubah arah putaranya. perubahan polaritas ini jugalah yang mendasari sistem kerja inverter. untuk dapat merubah polaritas dengan sistem elektronik, sangat mudah jika menggunakan driver H-bridge. H-bridge dapat dirangkai dengan mosfet sebagai pengganti saklarnya karena mosfet mampu menghantarkan arus yang besar dan memiliki frekuensi penyaklaran yang besar.

Untuk membuat motor diam, artinya tidak ada arus yang mengalir melewati motor (gambar1) dapat terjadi saat keempat saklar (a, b, c, dan d) terbuka sehingga tidak ada arus yang mengalir dari VCC (+) ke GND (-).

Untuk membuat putaran kearah kanan (searah jarum jam) maka dapat dilihat pada gambar 2 dimana polaritas lilitan motor yang tersambung dengan saklar a memiliki potensial yang lebih tinggi dibandingkan dengan potensial lilitan yang tersambung dengan saklar b. Hal ini terjadi karena saklar a sehingga tersambung dengan VCC dan saklar c membuka sehingga tidak terjadi short-circuit. saat yang bersamaan saklar b membuka sehingga tidak mendapat potensial tinggi dan saklar b tertutup sehingga mendapat potensial rendah. sehingga arus akan mengalir melalui saklar a dan saklar d. begitu juga dengan gambar 3

secara elektronik, driver motor H-bridge dapat di rangkai seperti gambar berikut

Thursday, January 1, 2015

Membuat pergeseran bit untuk Arduino pada Running Text

Baiklah sahabat toluent yang bersemangat membangun wawasan elektronikanya, kali ini kita akan membahas tentang algoritma pergeseran bit dari ASCII pada Running Text/Moving sign/display LED DOT Matrik.

Running text yang menggunakan sistem scan kolom membutuhkan nilai perhitungan dari ASCII data yang akan ditampilkan. Misalnya data yang akan ditampilkan adalah "toluent", jika diubah ke data ASCII akan menjadi array heksa 0x74,0x6F,0x6C,0x75,0x65,0x6E,0x74. untuk lebih jelasnya tentang ASCII lihat di SINI. Nilai tersebut akan di hitung dengan sebuah algoritma yang masing-masing nilai array akan menunjuk indek tertentu dan lima indeks setelahnya (untuk DOT Matrik 5x7).

Untuk dapat memahami algoritma perhitunganya, mari kita simak bahwa ASCII yang unsigned dari 0-255. Huruf 'a' sampai 'z' diwakili dengan ASCII 0x61 sampai 0x7A. Angka ini masih tidak akan dimengerti oleh LED DOT matrik kita, dengan artian tidak bisa langsung diproses begitu saja. Karena DOT matrik yang digunakan 5x7 maka satu ASCII harus dikali dengan 5 untuk mengakses indeksnya
lihat di cara pembuatan karakter DOT matriks.