aku dan tubes interface ♥

Udah akhir semester 5 lagi nih, tugas besar, laporan kerja praktek, proposal tugas akhir, yang semangat aja deh jadi mahasiswa tingkat akhir D3 Metrologi dan Instrumentasi. Ini nih tugas besar mata kuliah interface, bikin komunikasi serial pakai protokol modbus. Jadi kelompok 7 yang terdiri dari Syafri Firmansyah, Bias Malta Lungidta Putri, Nina Amila Hasna, Riski Hadi, dan Sri Fahmi Faila tentunya (saya 😀 ) bikin program penghitung putaran. Sistem ini terdiri dari potensiometer yang digunakan untuk mengatur tegangan masukan untuk memutar motor (fan), jumlah putaran fan itu dideteksi oleh optocoupler.  Untuk akuisisi data digunakan mikrontroler Arduino dan software Processing. O, ya di Arduino juga dihitung CRC buat ngecek data serial yang dikirim, nah di Processing dibuktikan kalau data yang dikirim itu benar. Nih script di software Arduino:

int potensio = A0;
int fan = 9;
int optocoupler = 2;
int tegangan;
int putaran;
const int header = ‘:’;
char function[3]=”01″;
char address[3]=”08″;
int jumlah_putaran = 0;
long actionTime;
int ts=3000;
int dig=0;
unsigned long a, b, c, d, x, n, crc, data, z;
void setup(){
  Serial.begin(9600);
  pinMode(potensio, INPUT);
  pinMode(fan, OUTPUT);
  pinMode(optocoupler, INPUT);
  actionTime = millis()+ ts;
}
void loop(){
  tegangan = analogRead(potensio);
  tegangan = map (tegangan, 0, 1023, 0, 255);
  analogWrite(fan, tegangan);
  putaran = digitalRead(optocoupler);
  if (putaran != dig) {
        if (putaran == HIGH) {
           jumlah_putaran++;
    }
  }
  dig=putaran;
  long ms = millis();
  if(ms >=actionTime){
    unsigned long polynom = 98309;
    Serial.write(header);
    Serial.print(address);
    Serial.print(function);
    Serial.print(jumlah_putaran);
    a = (unsigned long) jumlah_putaran/10;
    b = (unsigned long) jumlah_putaran%10;
    c = a + 48;
    d = b + 48;
    data = ((unsigned long) c << 8) ^ ((unsigned long) d);
    data = data << 16;
    crc = data;
    polynom = polynom<<15;
    int counter = 31;
    int l=0;
    for (l; l<=15; l++){
      if (bitRead(crc,counter) == 1 && bitRead(polynom,counter) == 1){
        crc=crc^polynom;
        polynom = polynom>>1;}
      else {
        polynom = polynom>>1;
      }
      counter–;
    }
   Serial.println(crc, HEX);
    jumlah_putaran = 0;
    actionTime = actionTime + ts;
   }
}
Dan ini script di Processing-nya :
import processing.serial.*;
PFont myfont;
Serial myPort;
String inString;
int putaran,asd;
long data, CRC;
void setup(){
  size (1000, 350);
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil(‘\n’);
    myfont = createFont (“Arial”,24);
}
void draw(){
    background (125);
  PFont TempusSansITC;
  PFont BodoniMT;
  TempusSansITC = loadFont(“TempusSansITC-48.vlw”);
  textFont(TempusSansITC, 35);
  fill(34, 56, 78);
  text(“Program Penghitung Jumlah Putaran dengan Optocoupler”, 85, 35);
  BodoniMT = loadFont(“BodoniMT-Bold-48.vlw”);
  textFont(BodoniMT, 20);
  fill(100, 200, 55);
  text(“Data Serial”, 455, 80);
  stroke(100, 102, 150);
  rect (300, 90, 400, 50);
  text(“Jumlah Putaran”, 15, 200);
  rect(165,175, 100, 40);
  text(“Check CRC”, 15,250);
  rect(165, 225, 100, 40);
  fill(0);
  text(inString,445,125);
  text(putaran,170,203);
  asd=int(CRC);
  text(CRC, 170, 253);
}
void serialEvent(Serial myPort) {
      inString = myPort.readStringUntil(‘\n’);
   if (inString!=null){
     noStroke(); 
     fill(255);
     fill(0);     
   }
     String val = inString.substring(5, 7);
     String crc = inString.substring(7, 11); //A0A0
     int valDEC = int(val);
     long crcDEC = unhex(crc);
     long a = valDEC/10;
     long b = valDEC%10;
     long c = a+48;
     long d = b+48;
     putaran = valDEC;
     data = c<<8^d;
     CRC = cekcrc(data, crcDEC);
}
  long cekcrc(  long data,   long remind)
{
  data = data << 16;
    long datad = data + remind;
    long polinom = 98309;
 polinom = polinom<<15;  // 1100000000000010100000000000000
  int n=31;
  for(n=31;n>=16;n–){
  if (bitRead(polinom,n)==1 && bitRead(datad,n)==1){
               datad=datad^polinom;
               polinom = polinom >>1;
               }
  if (bitRead(polinom,n)==1 && bitRead(datad,n)==0){
               polinom= polinom >>1;
               } 
  }
  return datad;
}
long bitRead(long b, int bitPos)
{
  long x = b & (1<<bitPos);
  return x == 0 ? 0 : 1;
}
Nah, pengerjaan tugas besar ini dibantu banyak pihak. So, mau mengucapkan terimakasih buat Fauzan Nur Karim, Ferlin Lintang Gumilar, Fahmy Munawar Cholil, dan R.
Masih butuh penyempurnaan buat protokol modbus, CRC, source codenya tapi semoga bermanfaat 🙂
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s