18 JANUARI 2016
SMART KONTRAKAN MEKATRONIKA
Merangkai Komunikasi |
Semester 5
Assalamualaikum sahabat, semester ini udah mau berlalu nah kali ini kami di kasih project untuk satu kelas yaitu tugas UAS Interface, dimana kami harus menggunakan komunikasi menggunakan I2C, RS485 dan SPI dengan menggunakan minimal 3 Slave dan 1 Master.
Nah, berikut ini hasil dari perjuangan begadang selama 4 Hari dari jumat-Senin (03:00) WIB, walaupun masih ada kekurangan semoga bisa jadi referensi untuk teman-teman.
---------------------------------------------------------------------------------------------------------------------
Dalam Project ini kami menggunkan 3 Jenis Komunikasi yang menggunakan 3 Slave ,jadi untuk setiap slave memiliki komunikasi yang berbeda-beda, dan memiliki 1 Master.Gambarannya seperti ini ;
untuk komunikasi I2C dan RS485 kami gunakan untuk pembacaan nilai sensor , sedangkan untuk SPI digunakan untuk mengirimkan data yang telah di dikirim ke master dan data tersebut di kirimkan ke PC untuk diparsing dan kirimkan kembali ke master dan master mengirimkan kembali ke slave (aktuator ) dengan menggunakan komunikasi SPI.
Design Room |
Pembagian Kerja |
Logika Slave1 dan Slave 2 terhadap Slave 3 |
Master (Dionisius)
Slave 1 (I2C)
//Port 4 Slave
#include<Wire.h>
void setup(){
Wire.begin(2);
Wire.onRequest(requestEvent);
}
void loop(){
delay (100);
}
void requestEvent() {
// unsigned int dataADC =analogRead(A0);
// unsigned int dataADC1 =analogRead(A1);
// unsigned int dataADC2 =analogRead(A2);
unsigned int dataADC1 =analogRead(A0);
unsigned int dataADC2 =analogRead(A1);
unsigned int dataADC3 =analogRead(A2);
unsigned int dataADC4 =analogRead(A3);
unsigned int dataADC5 =analogRead(A4);
unsigned int dataADC6 =digitalRead(2);
unsigned char dataI2C[12];
dataI2C[0]=lowByte(dataADC1);
dataI2C[1]=highByte(dataADC1);
dataI2C[2]=lowByte(dataADC2);
dataI2C[3]=highByte(dataADC2);
dataI2C[4]=lowByte(dataADC3);
dataI2C[5]=highByte(dataADC3);
dataI2C[6]=lowByte(dataADC4);
dataI2C[7]=highByte(dataADC4);
dataI2C[8]=lowByte(dataADC5);
dataI2C[9]=highByte(dataADC5);
dataI2C[10]=lowByte(dataADC6);
dataI2C[11]=highByte(dataADC6);
Wire.write(dataI2C,12);
//Wire.write("123vnb12gj3423");
}
Slave 2(RS485)
//Slave Kirim Data
#include <SoftwareSerial.h>
SoftwareSerial RS485Serial(5, 6); //RX =10 TX = 11
int data1, data2, data3, data4, data5, data6;
const int pingPin = 7;
void setup() {
// put your setup code here, to run once:
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
RS485Serial.begin(9600);
//Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
long duration, cm;
int s;
data1 = analogRead(A0);//RANGE MAX 255
data2 = analogRead(A1);//RANGE MAX 255
data3 = analogRead(A2);//RANGE MAX 255
data4 = analogRead(A3);
//data5 = 55;
data6 = analogRead(A5)/4;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
// convert the time into a distance
cm = microsecondsToCentimeters(duration);
data5 = cm;
// Serial.print(data1);
// Serial.print("\t");
// Serial.print(data2);
// Serial.print("\t");
// Serial.print(data3);
// Serial.print("\t");
// Serial.print(data4);
// Serial.print("\t");
// Serial.print(data6);
// Serial.print("\n");
digitalWrite(3, HIGH); //Set DE RE Transmit Data
RS485Serial.write(data1);
RS485Serial.write(data2);
RS485Serial.write(data3);
RS485Serial.write(data4);
RS485Serial.write(data5);
RS485Serial.write(data6);
delay(100);
}
long microsecondsToCentimeters(long microseconds) {
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
PC (Krismametra)
Tampilan C# |
Data yang dikirim Maser to PC |
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;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string[] nama_port = System.IO.Ports.SerialPort.GetPortNames(); //mendapatkan nama port dalam bentuk array
comport.Items.AddRange(nama_port); //menambahkan item array nama port pada combo box1
//menambahkan item pada combo box2
Baudrate.Items.Add("300");
Baudrate.Items.Add("1200");
Baudrate.Items.Add("4600");
Baudrate.Items.Add("9600");
Baudrate.Items.Add("19200");
Baudrate.Items.Add("57600");
Baudrate.Items.Add("115200");
//menampilkan tanggal dan waktu pada form1
label3.Text = DateTime.Now.ToLongDateString();
label4.Text = DateTime.Now.ToShortTimeString();
}
//daftar variabel yang digunakan
string datamasuk;
double slave2_photodioda, slave2_photodioda1, slave2_photodioda2, slave2_lmtswtch, slave2_ldr, slave2_ping, slave1_photodioda, slave1_photodioda1, slave1_ldr, slave1_ldr1, slave1_lm35, slave1_gas;
int slave3_akuatormotor, slave3_akuatorled, slave3_akuatorled1, slave3_akuatorled2, slave3_akuatorbzr1, slave3_akuatorbzr;
private void connect_Click(object sender, EventArgs e)
{
if (connect.Text == "CONNECT")
{
try
{
serialPort1.PortName = (comport.SelectedItem).ToString(); //mengambil nama string dari combo box1 yang dipilih
serialPort1.BaudRate = Convert.ToInt32(Baudrate.SelectedItem); // mengambil nilai baudrate dari combo box2 yang dipilih
serialPort1.Open(); //srialport1 buka
timer1.Enabled = true; //aktifkan fungsi timer1
connect.Text = "DISCONNECT"; //tulisan di button diganti menjadi DISCONNECT
}
catch
{
MessageBox.Show("Program gagal merespon");
this.Close();
}
}
else if (connect.Text == "DISCONNECT")
{
try
{
serialPort1.Close(); //serialport1 ditutup
timer1.Enabled = false; //timer1 dinon-aktifkan
connect.Text = "CONNECT"; //tulisan di button diganti menjadi CONNECT
}
catch
{
MessageBox.Show("Program gagal merespon");
this.Close();
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
datamasuk = serialPort1.ReadLine(); //membaca data yang masuk di serialport1
string[] dat = datamasuk.Split(','); //data diparsing sesuai koma
if (dat.Length == 14) //jika panjang data array 14
{
if (dat[0].CompareTo("AA") == 0) //header
{
dat[13] = "BB"; //tail
if (dat[0] == "AA" && dat[13] == "BB")//jika header dan tail sesuai
{
//Simpan data ke variabel sensor
slave1_photodioda = Convert.ToDouble(dat[1]); // variabel untuk menampung data sensor photodioda pada slave 1
slave1_photodioda1 = Convert.ToDouble(dat[2]); // variabel untuk menampung data sensor photodioda1 pada slave 1
slave1_ldr = Convert.ToDouble(dat[3]); // variabel untuk menampung data sensor ldr pada slave 1
slave1_ldr1 = Convert.ToDouble(dat[4]); // variabel untuk menampung data sensor ldr1 pada slave 1
slave1_lm35 = Convert.ToDouble(dat[5]); // variabel untuk menampung data sensor lm35 pada slave 1
slave1_gas = Convert.ToDouble(dat[6]); // variabel untuk menampung data sensor gas pada slave 1
slave2_photodioda = Convert.ToDouble(dat[7]); // variabel untuk menampung data sensor photodioda pada slave 2
slave2_photodioda1 = Convert.ToDouble(dat[8]); // variabel untuk menampung data sensor photodioda1 pada slave 2
slave2_photodioda2 = Convert.ToDouble(dat[9]); // variabel untuk menampung data sensor photodioda2 pada slave 2
slave2_ldr = Convert.ToDouble(dat[10]); // variabel untuk menampung data sensor ldr pada slave 2
slave2_ping = Convert.ToDouble(dat[11]); // variabel untuk menampung data sensor ping pada slave 2
slave2_lmtswtch = Convert.ToDouble(dat[12]); // variabel untuk menampung data sensor limit switch pada slave 2
//tampilkan data sensor pada textbox
//data-data di SLAVE 1 (I2C)
textBox1.Text = dat[1]; //data1
textBox2.Text = dat[2]; //data2
textBox3.Text = dat[3]; //data3
textBox4.Text = dat[4]; //data4
textBox5.Text = dat[5]; //data5
textBox6.Text = dat[6]; //data6
//data-data di SLAVE2 (RS485)
textBox7.Text = dat[7]; //data7
textBox8.Text = dat[8]; //data8
textBox9.Text = dat[9]; //data9
textBox13.Text = dat[10]; //data10
textBox11.Text = dat[11]; //data11
textBox10.Text = dat[12]; //data12
}
}
}
//DATA UNTUK AKUATOR
//AKUATOR 1 BUZZER
if (slave2_photodioda <= 20 || slave1_photodioda <= 100)
{
slave3_akuatorbzr = 1;
}
else
{
slave3_akuatorbzr = 0;
}
//AKUATOR 2 LED
if (slave2_photodioda1 <= 20 && slave1_photodioda1 <= 100)
{
slave3_akuatorled = 1;
}
else
{
slave3_akuatorled = 0;
}
//AKUATOR 3 LED 1
if (slave2_photodioda2 <= 20 || slave1_ldr >= 700)
{
slave3_akuatorled1 = 1;
}
else
{
slave3_akuatorled1 = 0;
}
//AKUATOR 4 LED 2
if (slave2_ldr >= 100 && slave1_ldr1 >= 700)
{
slave3_akuatorled2 = 1;
}
else
{
slave3_akuatorled2 = 0;
}
//AKUATOR 5 MOTOR
if (slave2_ping <= 5 || slave1_lm35 >= 50)
{
slave3_akuatormotor = 1;
}
else
{
slave3_akuatormotor = 0;
}
//AKUATOR 6 BUZZER 1
if (slave1_gas == 0)
{
slave3_akuatorbzr1 = 1;
}
else if ( slave2_lmtswtch ==255 || slave1_gas == 1 )
{
slave3_akuatorbzr1 = 0;
}
//MENGIRIM DATA AKUATOR KE MASTER
serialPort1.Write('~' + slave3_akuatorbzr.ToString() + '!' + slave3_akuatorled.ToString() + '@' + slave3_akuatorled1.ToString() + '#' + slave3_akuatorled2.ToString()
+ '$' + slave3_akuatormotor.ToString() + '%' + slave3_akuatorbzr1.ToString() + '^' + "\n");
//tess mengirim data
richTextBox1.Text = '~' + slave3_akuatorbzr.ToString() + '!' + slave3_akuatorled.ToString() + '@' + slave3_akuatorled1.ToString() + '#' + slave3_akuatorled2.ToString()
+ '$' + slave3_akuatormotor.ToString() + '%' + slave3_akuatorbzr1.ToString() + '^' + "\n";
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
serialPort1.Close(); //serialport1 ditutup
timer1.Enabled = false; //timer1 di non-aktifkan
}
}
}
Comments
Post a Comment