Kinematik Invers Untuk Pergerakan Kaki Robot Hexapod 3 Sendi
June 27, 2012 16 Comments
Berikut adalah simulasi menggunakan software Freecad dan bahasa pemrograman python.
File simulasi dapat didownload pada link dibawah ini.
January 22, 2012 Leave a comment
Pertama-tama buatlah sebuah project baru.
Lalu pada bagian Program.cs masukan kode berikut.
using System; using System.Collections.Generic; using System.Text; using System.IO.Ports; namespace SerialTest { class Program { static void Main(string[] args) { string[] names = SerialPort.GetPortNames(); Console.WriteLine("Serial ports:"); foreach (string name in names) Console.WriteLine(name); Console.Write("Choose one:"); SerialPort p = new SerialPort(Console.ReadLine()); p.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived); p.Open(); string line; do { line = Console.ReadLine(); p.Write(line); } while (line != "quit"); p.Close(); } static void p_DataReceived(object sender, SerialDataReceivedEventArgs e) { Console.WriteLine( (sender as SerialPort).ReadExisting()); } } }
Setelah itu, jangan lupa save program yang sudah dibuat. Run program (F5). Program bisa dicoba berkomunikasi dengan Hyperterminal atau aplikasi serial port lainnya dengan bantuan VSPE (Virtual Serial Port Emulator) yang bisa di download di http://www.eterlogic.com/downloads/SetupVSPE.zip
Pada program yang sudah dibuat tadi, setelah dijalankan, untuk memilih COM, langsung saja diketik nama COM nya. Misal COM5. Untuk mengirim data, tekan enter. Untuk keluar dari program, ketik “quit” lalu tekan enter.
VSPE (Virtual Serial Port Emulator).
Tampilan program.
___________________________
Daftar Pustaka
http://balau82.wordpress.com/2009/04/18/simplest-serial-port-terminal-in-csharp/
October 20, 2011 1 Comment
Saya sempat mencoba untuk menginstall VS2010 Express di Windows 7, tp gagal terus. Dicari di forum2 ada yang saranin buat install terlebih dahulu Framework.NET 4. Akan tetapi, saya coba, keluar error message HRESULT:0xc8000222. Berikut solusinya yang saya dapatkan dari googling2.
sebelum instalasi lakukan pengaturan seperti dibawah ini:
Nah, setelah pengaturan diatas selesai lakukanlah instalasi Framework.NET 4 dengan cara seperti biasa.
______________________________________
Sumber:
http://salingkasih.info/2011/08/cara-install-framework-net-4-error-hresult-0xc8000222/
April 2, 2011 5 Comments
Deskripsi Umum
Sharp GP2D12 adalah sensor jarak analog yang menggunakan infrared untuk mendeteksi jarak antara 10 cm sampai 80 cm. GP2D12 mengeluarkan output voltase non-linear dalam hubungannya dengan jarak objek dari sensor dan menggunakan interface analog to digital converter (ADC).
Bentuk Fisik
Spesifikasi Teknis
• Range:10 to 80cm
• Update frequency / period:25Hz / 40ms
• Direction of the measured distance:Very directional, due to the IR LED
• Max admissible angle on flat surface:> 40°
• Power supply voltage:4.5 to 5.5V
• Noise on the analog output:< 200mV
• Mean consumption:35mA
• Peak consumption:about 200mA
Kelemahan
• Respon 40ms
• Error bila Jarak<10cm dan pada Cermin
• Hanya dapat mengukur <80cm
Kelebihan
• Dapat mengukur jarak pada bidang miring
• Sudut pengukuran sempit
• Sangat direktif
Berikut hubungan antara jarak deteksi objek terhadap output analog sensor.
Ada banyak cara tentunya untuk mencari persamaan dari kurva diatas untuk menentukan jarak dari nilai analog sensor tersebut. Salah satunya dengan cara sampling data dan kemudian menentukan persamaan dari kurva respon voltage terhadap jarak objek. Berikut percobaan yang saya lakukan dengan contoh sampel kurva respon di atas dengan menggunakan excel.
10 |
2.4 |
15 |
1.8 |
20 |
1.4 |
25 |
1.1 |
30 |
1 |
35 |
0.86 |
40 |
0.78 |
45 |
0.7 |
50 |
0.63 |
55 |
0.6 |
60 |
0.55 |
65 |
0.5 |
70 |
0.48 |
75 |
0.43 |
80 |
0.41 |
jarak |
volt |
persamaan yang mendekati adalah y = 17.6951x^-0.8519 atau y = 17.6951/x^0.8519
jika x^0.8519 susah direpresentasikan dalam bahasa programming, maka kita cari nilai yang mendekati dari x^0.8519
10 |
7.11E+00 |
15 |
1.00E+01 |
20 |
1.28E+01 |
25 |
1.55E+01 |
30 |
1.81E+01 |
35 |
2.07E+01 |
40 |
2.32E+01 |
45 |
2.56E+01 |
50 |
2.80E+01 |
55 |
3.04E+01 |
60 |
3.27E+01 |
65 |
3.50E+01 |
70 |
3.73E+01 |
75 |
3.96E+01 |
80 |
4.18E+01 |
jarak |
jarak^0.67 |
persamaan linier yang mendekati jarak^0.8519 adalah 0.4918jarak + 3.0641
jadi persamaan yang kita dapat adalah volt=17.6951/(0.4918jarak + 3.0641)
Berikut adalah tabel pengecekan dari persamaan di atas.
10 |
2.2168477 |
15 |
1.69475438 |
20 |
1.37170254 |
25 |
1.15209224 |
30 |
0.99309691 |
35 |
0.87266424 |
40 |
0.77828212 |
45 |
0.70232307 |
50 |
0.63987257 |
55 |
0.58762133 |
60 |
0.54325942 |
65 |
0.50512545 |
70 |
0.47199394 |
75 |
0.44294114 |
80 |
0.41725755 |
jarak |
volt |
Berikut adalah tabel hasil perbandingan persentase error antara data sampel dan data dari persamaan.
Hasil |
Data awal |
Selisih |
Persentase Error |
|
|
10 |
2.2168477 |
2.4 |
0.183152 |
7.631346 |
% |
15 |
1.69475438 |
1.8 |
0.105246 |
5.846979 |
% |
20 |
1.37170254 |
1.4 |
0.028297 |
2.021247 |
% |
25 |
1.15209224 |
1.1 |
-0.05209 |
4.735659 |
% |
30 |
0.99309691 |
1 |
0.006903 |
0.690309 |
% |
35 |
0.87266424 |
0.86 |
-0.01266 |
1.472586 |
% |
40 |
0.77828212 |
0.78 |
0.001718 |
0.220242 |
% |
45 |
0.70232307 |
0.7 |
-0.00232 |
0.331867 |
% |
50 |
0.63987257 |
0.63 |
-0.00987 |
1.567074 |
% |
55 |
0.58762133 |
0.6 |
0.012379 |
2.063111 |
% |
60 |
0.54325942 |
0.55 |
0.006741 |
1.225561 |
% |
65 |
0.50512545 |
0.5 |
-0.00513 |
1.025089 |
% |
70 |
0.47199394 |
0.48 |
0.008006 |
1.667929 |
% |
75 |
0.44294114 |
0.43 |
-0.01294 |
3.009568 |
% |
80 |
0.41725755 |
0.41 |
-0.00726 |
1.770135 |
% |
jarak |
volt |
volt |
|
|
|
Berikut hasil akhir persamaan yang didapatkan.
(17.6951/volt) = 0.4918jarak + 3.0641
(17.6951/volt) – 3.0641 = 0.4918jarak
jarak= (35.9803/volt) – 6.2304
jika dalam 8-bit adc, maka nilai adc (misal referensi voltage 5 volt) harus dikonversi ke volt, volt = adc*(5/255)
jarak= (35.9803/(adc*(5/255))) – 6.2304
jarak= (1834.9953/adc) – 6.2304
berikut file excel dari uraian perhitungan di atas. wangready.wordpress.com–gp2d12.
Kode dalam CodeVision AVR
Berikut contoh program dengan menggunakan mikrokontroler ATMega8535, xtal=11.059200 MHz, pin ADC untuk sensor = PINA0, PORT LCD = PORTD. Atau bisa download dalam bentuk CVAVR project berikut. http://www.mediafire.com/file/ogus3zlhpp9um28/GP2D12.rar
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 4/2/2011
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega8535
Program type : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega8535.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x60
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
unsigned char gp2d12()
{
unsigned char jarak;
jarak = (unsigned char)((1854.9953/(float)read_adc(0)) – 6.2304); //read_adc(0) membaca nilai analog dari PINA0
//nilai ADC sudah dikonversi dengan mengalikan konstanta yang dibagi dengan perbandingan konversi ADC return jarak;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned char kata[16];
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 691.200 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTD Bit 0
// RD – PORTD Bit 1
// EN – PORTD Bit 2
// D4 – PORTD Bit 4
// D5 – PORTD Bit 5
// D6 – PORTD Bit 6
// D7 – PORTD Bit 7
// Characters/line: 16
lcd_init(16);
while (1)
{
// Place your code here
sprintf(kata,”jarak=%d”,gp2d12());//menyusun karakter dengan menggunakan fungsi sprinf
lcd_clear(); //membersihkan layar LCD
lcd_gotoxy(0,0); //mengatur kursor LCD menuju koordinat 0,0
lcd_puts(kata); //mengirim data LCD
delay_ms(300); //delay agar perubahan dari lcd_clear tidak terlalu cepat
}
}
——————————————————————————————————————-
Daftar Pustaka
-Datasheet Sharp GP2D12
-Materi KRI-KRCI Bandung (Oktober 2008)
10 |
2.4 |
15 |
1.8 |
20 |
1.4 |
25 |
1.1 |
30 |
1 |
35 |
0.86 |
40 |
0.78 |
45 |
0.7 |
50 |
0.63 |
55 |
0.6 |
60 |
0.55 |
65 |
0.5 |
70 |
0.48 |
75 |
0.43 |
80 |
0.41 |
jarak |
volt |
March 22, 2011 60 Comments
Pendahuluan
Program yang akan dibahas terdiri dari dua bagian, yaitu:
1. Server, sebagai server yang mana semua client akan mengirim pesan ke computer yang ada aplikasi ini dan mem-broadcast semua pesan ke client.
2. Client, aplikasi yang dipakai oleh user untuk melakukan chat yang akan terhubung ke server.
Membuat Server
Pertama bukalah aplikasi Visual Studio C# 2010. Lalu pilih new project. Kemudian pilih Console Application dan berilah nama project chat_server pada bagian bawah form, lalu klik OK.
Setelah itu cobalah masukan kode di bawah ini.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
const int portNo = 500;
static void Main(string[] args)
{
//==================================================================
//Mendapatkan Local Machine’s Host Name & IPAddress
//==================================================================
String strHostName = “”;
if (args.Length == 0)
{
// Mendapatkan Ip address dari local machine…
// Pertama cari host name dari local machine.
strHostName = Dns.GetHostName();
Console.WriteLine(“Local Machine’s Host Name: ” + strHostName);
}
else
{
strHostName = args[0];
}
IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine(“IP Address {0}: {1} “, i, addr[i].ToString());
}
//===================================================================
System.Net.IPAddress localAdd = System.Net.IPAddress.Parse(addr[0].ToString());
TcpListener listener = new TcpListener(localAdd, portNo);
listener.Start();
while (true)
{
ChatClient user = new
ChatClient(listener.AcceptTcpClient());
}
}
}
}
Setelah itu, buat class baru dengan nama “ChatClient” dengan cara klik kanan pada nama project seperti di bawah ini.
Setelah itu, akan muncul form berikut.
Pilih Class dan jangan lupa beri nama “ChatClient” pada bagian bawah form dan klik Add. Setelah itu coba masukan kode seperti di bawah ini.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Collections;
namespace ConsoleApplication1
{
class ChatClient
{
//—berisi daftar semua client—
public static Hashtable AllClients = new Hashtable();
//—informasi tentang client—
private TcpClient _client;
private string _clientIP;
private string _clientNick;
//—digunakan untuk mengirim/menerima data—
private byte[] data;
//—apakah nickname sudah dikirim—
private bool ReceiveNick = true;
public ChatClient(TcpClient client)
{
_client = client;
//—mendapatkan client IP address—
_clientIP = client.Client.RemoteEndPoint.ToString();
//—menambahkan client saat ini ke hash table—
AllClients.Add(_clientIP, this);
//—memulai membaca data dari client pada
// thread terpisah—
data = new byte[_client.ReceiveBufferSize];
client.GetStream().BeginRead(data, 0,
System.Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);
}
public void ReceiveMessage(IAsyncResult ar)
{
//—membaca dari client—
int bytesRead;
try
{
lock (_client.GetStream())
{
bytesRead = _client.GetStream().EndRead(ar);
}
//—client tidak tersambung—
if (bytesRead < 1)
{
AllClients.Remove(_clientIP);
Broadcast(_clientNick + ” has left the chat.”);
return;
}
else
{
//—mendapat pesan yang telah dikirim—
string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
//—client mengirimkan nicknamenya—
if (ReceiveNick)
{
_clientNick = messageReceived;
//—memberitahu semua client memasuki
// chat—
Broadcast(_clientNick + ” has joined the chat.”);
ReceiveNick = false;
}
else
{
//—memberikan pesan pada semuanya—
Broadcast(_clientNick + “>” + messageReceived);
}
}
//—melanjutkan membaca dari client—
lock (_client.GetStream())
{
_client.GetStream().BeginRead(data, 0,
System.Convert.ToInt32(_client.ReceiveBufferSize),ReceiveMessage,null);
}
}
catch (Exception ex)
{
AllClients.Remove(_clientIP);
Broadcast(_clientNick + ” has left the chat.”);
}
}
public void SendMessage(string message)
{
try
{
//—mengirim text—
System.Net.Sockets.NetworkStream ns;
lock (_client.GetStream())
{
ns = _client.GetStream();
}
byte[] bytesToSend =
System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesToSend, 0, bytesToSend.Length);
ns.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void Broadcast(string message)
{
//—log secara lokal—
Console.WriteLine(message);
foreach (DictionaryEntry c in AllClients)
{
//—memberi pesan pada semua user—
((ChatClient)(c.Value)).SendMessage(
message + Environment.NewLine);
}
}
}
}
Membuat Client
Buatlah project baru dan pilih template Windows Form Application dan berilah nama project tersebut dengan nama “chat” pada bagian bawah form lalu klik OK. Setelah itu, buatlah form seperti pada gambar di bawah ini.
Setelah itu coba buatlah kode seperti di bawah ini.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
const int portNo = 500;
TcpClient client;
byte[] data;
public Form1()
{
InitializeComponent();
}
private void btnSignIn_Click(object sender, EventArgs e)
{
if (btnSignIn.Text == “Sign In”)
{
try
{
//—menghubungkan ke server—
client = new TcpClient();
client.Connect(IPServer.Text, portNo);
data = new byte[client.ReceiveBufferSize];
//—membaca dari server—
SendMessage(txtNick.Text);
client.GetStream().BeginRead(data, 0,
System.Convert.ToInt32(
client.ReceiveBufferSize),
ReceiveMessage, null);
btnSignIn.Text = “Sign Out”;
btnSend.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
//—disconnect dari server—
Disconnect();
btnSignIn.Text = “Sign In”;
btnSend.Enabled = false;
}
}
private void btnSend_Click(object sender, EventArgs e)
{
SendMessage(txtMessage.Text);
txtMessage.Clear();
}
public void SendMessage(string message)
{
try
{
//—mengirim pesan ke server—
NetworkStream ns = client.GetStream();
byte[] data =
System.Text.Encoding.ASCII.GetBytes(message);
//—mengirim text—
ns.Write(data, 0, data.Length);
ns.Flush();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
public void ReceiveMessage(IAsyncResult ar)
{
try
{
int bytesRead;
//—membaca data dari server—
bytesRead = client.GetStream().EndRead(ar);
if (bytesRead < 1)
{
return;
}
else
{
//—memanggil delegate untuk menampilkan
// data yang diterima—
object[] para = {System.Text.Encoding.ASCII.GetString(data, 0, bytesRead) };
this.Invoke(new delUpdateHistory(UpdateHistory),
para);
}
//—melanjutkan membaca…—
client.GetStream().BeginRead(data, 0,
System.Convert.ToInt32(client.ReceiveBufferSize),
ReceiveMessage, null);
}
catch (Exception ex)
{
//—abaikan error, dibuang ketika pengguna sign off—
}
}
//—delegate dan subroutine untuk mengupdate TextBox control—
public delegate void delUpdateHistory(string str);
public void UpdateHistory(string str)
{
txtMessageHistory.AppendText(str);
}
public void Disconnect()
{
try
{
//—Disconnect dari server—
client.GetStream().Close();
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void Form_Closing(object sender,FormClosingEventArgs e)
{
Disconnect();
}
}
}
Setelah itu, double clik pada Form1.Designer.cs dan tambahkan kode seperti di bawah ini.
private void InitializeComponent()
{
…
this.FormClosing += new
System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);
}
Setelah kedua aplikasi diatas (chat server dan client) sudah selesai dibuat, maka program bisa langsung dites pada komputer yang berbeda atau pada satu komputer. Akan tetapi, jika menggunakan satu komputer, aturlah IP address yang diakses oleh client adalah “127.0.0.1” (computer’s loopback address).
————————————————————————————————————-
Daftar Pustaka
http://www.codeproject.com/KB/cs/network.aspx
Lee, Wei-Meng[2007].”Practical .NET 2.0 Networking Projects”. Apress, New York, USA.
March 9, 2011 33 Comments
Sumber:
http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html
http://en.wikipedia.org/wiki/I%C2%B2C
SPC Motor Controller Manual Guide.
Help — CodeVisionAVR.
I2C (Inter-Integrated Circuit) (umumnya disebut sebagai “two-wire interface”). Berikut konfigurasi dari sistem I2C.
Berikut timing diagram dari komunikasi I2C.
Pada komunikasi I2C terdapat perangkat master dan slave. Master adalah perangkat yang mengatur jalur clock SCL. Sedangkan slave adalah perangkat yang merespon perintah master. Slave tidak dapat mengirim sinyal untuk dapat mentransfer data pada jalur I2C, hanya master yang dapat melakukannya.Dimungkinkan untuk memiliki banyak master, tapi hal tersebut tidak biasa.
Berikut adalah timing diagram dari sebuah master yang ingin meminta data yang terdiri dari dua sekuen khusus yang ditetapkan untuk I2C yaitu Start dan Stop.
Data terdiri dari 8 bit dan menjadi 9 bit dengan bit terakhir adalah ACK. ACK adalah sinyal yang dikirim oleh sinyal penerima. Jika perangkat penerima mengirim kembali bit low ACK, karena sudah menerima data dan berarti siap menerima data selanjutnya. Jika sinyal ACK yang dikirim adalah high maka perangkat tersebut tidak dapat menerima data lebih lanjut dan master harus menghentikan transfer dengan mengirim Stop sequence.
Standar kecepatan clock (SCL) untuk I2C bisa mencapai 100KHz. Philips sebagai perusahaan yang memperkenalkan pertamakali I2C mendefinisikan beberapa tingkatan kecepatan: Fast mode, bisa mencapai 400KHz dan High Speed mode yang mencapai 3.4MHz. Untuk beberapa aplikasi pada perangkat yang sederhana tampaknya 100KHz sudah cukup.
Semua pengalamatan I2C terdiri dari 7bit atau 10bit. Penggunaan pengalamatan 10bit jarang. Biasanya yang banyak digunakan adalah pengalamatan 7bit. Berarti kita bisa mempunyai 128 perangkat yang akan tersambung ke bus, dari 0 sampai 127. Seperti pada gambar di atas yang terdiri dari 9bit terdapat R/W sebagai bit pengatur apakah maksud dari master adalah untuk write/menulis (nilai R/W bit = 0) data atau read/membaca (nilai R/W bit = 1) data dari slave. Pada intinya data yang dikirim adalah 8bit dengan LSB adalah R/W bit.
Berikut contoh kode untuk master yang saya dapatkan dari http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html jika ingin membuat kode sendiri. Contoh di bawah ini untuk mikrokontroler PIC akan tetapi tampaknya bisa digunakan untuk mikrokontroler lainnya yang mempunyai format pemograman yang sama.
#define SCL TRISB4 // I2C bus
#define SDA TRISB1 //
#define SCL_IN RB4 //
#define SDA_IN RB1 //
To initialize the ports set the output resisters to 0 and the tristate registers to 1 which disables the outputs and allows them to be pulled high by the resistors.
SDA = SCL = 1;
SCL_IN = SDA_IN = 0;
We use a small delay routine between SDA and SCL changes to give a clear sequence on the I2C bus. This is nothing more than a subroutine call and return.
void i2c_dly(void)
{
}
The following 4 functions provide the primitive start, stop, read and write sequences. All I2C transactions can be built up from these.
void i2c_start(void)
{
SDA = 1; // i2c start bit sequence
i2c_dly();
SCL = 1;
i2c_dly();
SDA = 0;
i2c_dly();
SCL = 0;
i2c_dly();
}
void i2c_stop(void)
{
SDA = 0; // i2c stop bit sequence
i2c_dly();
SCL = 1;
i2c_dly();
SDA = 1;
i2c_dly();
}
unsigned char i2c_rx(char ack)
{
char x, d=0;
SDA = 1;
for(x=0; x<8; x++) {
d <<= 1;
do {
SCL = 1;
}
while(SCL_IN==0); // wait for any SCL clock stretching
i2c_dly();
if(SDA_IN) d |= 1;
SCL = 0;
}
if(ack) SDA = 0;
else SDA = 1;
SCL = 1;
i2c_dly(); // send (N)ACK bit
SCL = 0;
SDA = 1;
return d;
}
bit i2c_tx(unsigned char d)
{
char x;
static bit b;
for(x=8; x; x–) {
if(d&0x80) SDA = 1;
else SDA = 0;
SCL = 1;
d <<= 1;
SCL = 0;
}
SDA = 1;
SCL = 1;
i2c_dly();
b = SDA_IN; // possible ACK bit
SCL = 0;
return b;
}
The 4 primitive functions above can easily be put together to form complete I2C transactions. Here’s and example to start an SRF08 ranging in cm:
i2c_start(); // send start sequence
i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear
i2c_tx(0x00); // SRF08 command register address
i2c_tx(0x51); // command to start ranging in cm
i2c_stop(); // send stop sequence
Now after waiting 65mS for the ranging to complete (I’ve left that to you) the following example shows how to read the light sensor value from register 1 and the range result from registers 2 & 3.
i2c_start(); // send start sequence
i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear
i2c_tx(0x01); // SRF08 light sensor register address
i2c_start(); // send a restart sequence
i2c_tx(0xE1); // SRF08 I2C address with R/W bit set
lightsensor = i2c_rx(1); // get light sensor and send acknowledge. Internal register address will increment automatically.
rangehigh = i2c_rx(1); // get the high byte of the range and send acknowledge.
rangelow = i2c_rx(0); // get low byte of the range – note we don’t acknowledge the last byte.
i2c_stop(); // send stop sequence
I2C pada CodeVisionAVR
Create New Project
Klik OK.
Jika ada pertanyaan “Do you want to use the CodeWizardAVR?”, klik Yes. Lalu pilih type dari avr yang digunakan dan klik OK. Setelah itu, aturlah konfigurasi dari mikrokontroler yang digunakan. Lalu klik pada menu I2C untuk mengatur fitur I2C yang akan digunakan. Cobalah konfigurasi seperti gambar di bawah ini.
Setelah itu “Generate, Save and Exit” yang dipilih pada menubar CodeWizardAVR – Program. Jika pada CVAVR versi lama, hal itu terdapat pada menubar file.
Setelah setting dari CodeWizardAVR selesai, maka program sudah mulai bisa diedit.
Berikut sintax Master yang bisa digunakan untuk berkomunikasi dengan perangkat Slave pada komunikasi I2C.
//mengirim data I2C
i2c_start();
i2c_write(Device_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10ms delay untuk memastikan proses pengiriman data sudah selesai */
delay_ms(10);
-Device_ADDRESS adalah alamat dari perangkat slave I2C.
-address adalah alamat dari register yang akan dituliskan data.
-data 8-bits.
//menerima data I2C
i2c_start();
i2c_write(Device_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(Device_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
-Device_ADDRESS adalah alamat dari perangkat slave I2C.
-address adalah alamat dari register yang akan diakses.
-i2c_write(Device_ADDRESS | 1); Bit terakhir di or dengan 1 yang hasilnya pasti bit terakhir 1 berarti perintah menulis.
-data 8-bits dari slave dimasukan ke variable data.
Biasanya format pengiriman data I2C tergantung pada perangkat yang diakses yang dijelaskan terlebih dahulu pada datasheet.
Berikut contoh komunikasi I2C pada SPC MOTOR CONTROLLER.
i2c_start(); // Start Condition
i2c_write(0xE0); // Tulis ke modul SPC MOTOR CONTROLLER
i2c_write(0x0E); // Perintah “Set PWM”
i2c_write(0x01); // Untuk Motor DC ke-2
i2c_write(128); // Level PWM
i2c_stop(); // Stop Condition
delay_us(10); // delay 10 us
i2c_start(); // Start Condition
i2c_write(0xE1); // Baca ke modul SPC MOTOR CONTROLLER
temp1 = i2c_read(0);// Data Acknowledgement
i2c_stop(); // Stop Condition
___________________________________________________________
Berikut website yang membahas tentang I2C:
https://ccrma.stanford.edu/courses/250a-fall-2003/docs/avrlib-new/i2c_8c.html
http://www.engineersgarage.com/embedded/avr-microcontroller-projects/atmega32-twi-two-wire-interface