Iklan sponsor

Minggu, 04 November 2018

Automatic monorail control

Artikel ini pernah ikut lomba arduino Distrelec dan mendapat juara 3.
automatic monorail control

sebelumnya kita sudah memiliki kotak pengangkut robot. Robot ini berfungsi untuk mengantarkan kotak ke masing-masing stasiun yang telah ditentukan berdasarkan kertas di dalam kotak. untuk mengirim kotak ke tujuan, operator harus menekan tombol berdasarkan data di kertas. tetapi pada kenyataannya, operator sering salah menekan tombol dan akhirnya kotak dikirim ke tujuan yang salah. jadi kami memodifikasi tombol ini menggunakan arduino uno.
Sekarang operator tidak perlu lagi menekan tombol untuk mengirim kotak, tetapi cukup pindai barcode yang ada di kertas dan program akan secara otomatis mengarahkan kotak ke tujuan yang tepat. sehingga operator dapat menghemat waktu dan mengurangi kesalahan manusia.








Arduino code :

#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h> //library for I2C LCD 16x2

/* A5 => SCL, A4 => SDA */
/* monorail control program
/* Modified 10/05/2018 by M. Ambar Farid
/*-----( Declare Constants )-----*/
#define R1 2
#define R2 3
#define R3 4
#define R4 5
#define R5 6
#define R6 7
#define R7 8
#define R8 9
#define WD 10

/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

void setup() {
  // initialization only for one time
  
  //initialization serial
  //initialization pin output digital relay and watchdog
  pinMode(R1, OUTPUT);
  digitalWrite(R1,HIGH);
  
  pinMode(R2, OUTPUT);
  digitalWrite(R2,HIGH);
  
  pinMode(R3, OUTPUT);
  digitalWrite(R3,HIGH);
  
  pinMode(R4, OUTPUT);
  digitalWrite(R4,HIGH);
  
  pinMode(R5, OUTPUT);
  digitalWrite(R5,HIGH);
  
  pinMode(R6, OUTPUT);
  digitalWrite(R6,HIGH);
  
  pinMode(R7, OUTPUT);
  digitalWrite(R7,HIGH);
  
  pinMode(R8, OUTPUT);
  digitalWrite(R8,HIGH);
  
  pinMode(WD, OUTPUT);   //output for watchdog
  
  lcd.begin(16,2);   // initialization lcd 16x2
  Serial.begin(9600); //initialization serial
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("MONORAIL CONTROL");
  lcd.setCursor(3,1);
  lcd.print("Powered By:");
  delayActive(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("M.A.Farid");
  lcd.setCursor(0,1);
  
}

void loop() {
 
  if(Serial.available()) {
    char inChar = (char)Serial.read();
    lcd.setCursor(2,1);
    lcd.print("STATION   ON");
    lcd.setCursor(10,1);
    switch(inChar) {
      case '1':
        lcd.write(inChar);
        digitalWrite(R1,LOW);
        delayActive(400);
        digitalWrite(R1,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '2':
        lcd.write(inChar);
        digitalWrite(R2,LOW);
        delayActive(400);
        digitalWrite(R2,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '3':
        lcd.write(inChar);
        digitalWrite(R3,LOW);
        delayActive(400);
        digitalWrite(R3,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '4':
        lcd.write(inChar);
        digitalWrite(R4,LOW);
        delayActive(400);
        digitalWrite(R4,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '5':
        lcd.clear();
        lcd.setCursor(2,0);
        lcd.write("NON STATION !");
        digitalWrite(R5,LOW);
        lcd.setCursor(2,1);
        lcd.write("GET OUT BOX");
        delayActive(1000);
        lcd.setCursor(2,1);
        lcd.write("FROM CONVEYOR");
        delayActive(2000);
        digitalWrite(R5,HIGH);
        break;
        
      case '6':
        lcd.write(inChar);
        digitalWrite(R6,LOW);
        delayActive(400);
        digitalWrite(R6,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '7':
        lcd.write(inChar);
        digitalWrite(R7,LOW);
        delayActive(400);
        digitalWrite(R7,HIGH);
        delay(200);
        digitalWrite(R8,LOW);
        delayActive(400);
        digitalWrite(R8,HIGH);
        break;
        
      case '8':
        lcd.write(inChar);
        digitalWrite(R8,LOW);
        delayActive(1000);
        digitalWrite(R8,HIGH);
        break;
        
      default:
        break;
      }
    lcd.setCursor(0,1);
    lcd.print("               ");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SYSTEM READY");
  }
  watchdogTrigger();
}

void delayActive(int millisecond) {
    
   if(millisecond<100){
      watchdogTrigger(); 
   } else {
      while (1) {
        watchdogTrigger();
        if (millisecond > 1000){
          delay(900);
          millisecond -= 1000;
        } else {
          delay(millisecond);
          break;
        }
      }
   }
}
void watchdogTrigger(){
  
  digitalWrite(WD,HIGH);
  delay(50);
  digitalWrite(WD,LOW); 
  delay(50); 
}