Overview

Setelah berhasil dengan tutorial sebelumnya yaitu Kontrol Robot Dengan SmartPhone selanjutnya akan mencoba menggunakan sensor accelerometer untuk mengontrol  robot dengan software yang ada pada smartphone. Untuk rangkaian dan board masih sama seperti yang ditutorial biasanya. Yang membedakan yaitu program pada aplikasi smartphone dan program pada arduino tentunya. Alur dari program yaitu smartphone akan mengambil data dari sensor accelerometer kemudian akan dikirim ke arduino dengan bluetooth. Kemudian modul bluetooth hc05 akan mengubah data yang dikirim dari smartphone ke dalam data serial. 

Part

Schematic

Schematic Controll Robot Using SmartPhone

Step by Step

  1. Setelah merangkai seluruh komponen baik mekanik dan board dari bluebot langsung masukkan program berikut.

    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(2, 3); // RX, TX
    
    #define button1 13
    #define button2 12
    #define pwmOne  5
    #define inAOne  4
    #define inBOne  9
    #define pwmTwo  6
    #define inATwo  8
    #define inBTwo  7
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(button1, INPUT_PULLUP);
      pinMode(button2, INPUT_PULLUP);  
      pinMode(pwmOne, OUTPUT);
      pinMode(inAOne, OUTPUT);
      pinMode(inBOne, OUTPUT);
      pinMode(pwmTwo, OUTPUT);
      pinMode(inATwo, OUTPUT);
      pinMode(inBTwo, OUTPUT);
    
      Serial.begin(9600);
      mySerial.begin(38400);
    }
    char readSerial[100];
    int countSerial=0;
    boolean ending = false;
    boolean findMinusValue = false;
    char minusX,minusX2,minusY,minusY2,valX,valY;
    int realValX, realValY, pwm;
    void loop() {
      if(mySerial.available())
      {
        readSerial[countSerial] = mySerial.read();
        if(readSerial[countSerial] == '*' )
        {
          ending = true;
        }
        countSerial++;
      }
      while(ending == true)
      {
        for(int i=0; i<countSerial; i++)
        {
          if(readSerial[i] == '#')
          {
            minusX = readSerial[i+1];
            minusX2 = readSerial[i+2];
          }
          if(readSerial[i] == ',')
          {
            minusY = readSerial[i+1];
            minusY2 = readSerial[i+2];
          }
          if(readSerial[i] == '*')
          {
            ending = false;  
            findMinusValue = true;
          }
        }
      }
      while(findMinusValue == true)
      {
        if(minusX == '-')
        {
          valX = minusX2;
          realValX = int(valX);
          realValX -= 48;
          realValX = 0-realValX;
        }
        else
        {
          valX = minusX;
          realValX = int(valX);
          realValX -= 48;
        }
        
        if(minusY == '-')
        {
          valY = minusY2;
          realValY = int(valY);
          realValY -= 48;
          realValY = 0-realValY;
        }
        else
        {
          valY = minusY;
          realValY = int(valY);
          realValY -= 48;
        }
    
        pwm = realValX*10;
        if(pwm>=75)
        {
          pwm = 75;
        }
        if(pwm<=0)
        {
          pwm = 0;
        }
    
        int pwmLeft = 50-pwm;
        int pwmRight = 50+pwm;
    
        if(pwmLeft>70)
        {
          pwmLeft = 70;
        }
        if(pwmLeft<=0)
        {
          pwmLeft = 0;
        }
        if(pwmRight>70)
        {
          pwmRight = 70;
        }
        if(pwmRight<=0)
        {
          pwmRight = 0;
        }
        
        if(realValY > 2)
        {
          reverse(pwmLeft, pwmRight);
        }
        else if (realValY < -2)
        {
          forward(pwmLeft, pwmRight);
        }
        else
        {
          stopRun();
        }
        Serial.println(pwm);
        countSerial = 0;
        findMinusValue = false;
      }
      
    }
    
    void forward(int valLeft, int valRight)
    {
      digitalWrite(inAOne, LOW);
      digitalWrite(inBOne, HIGH);
      analogWrite(pwmOne, valLeft);
      digitalWrite(inATwo, HIGH);
      digitalWrite(inBTwo, LOW);
      analogWrite(pwmTwo, valRight);
    }
    void reverse(int valLeft, int valRight)
    {
      digitalWrite(inAOne, HIGH);
      digitalWrite(inBOne, LOW);
      analogWrite(pwmOne, valLeft);
      digitalWrite(inATwo, LOW);
      digitalWrite(inBTwo, HIGH);
      analogWrite(pwmTwo, valRight);
    }
    
    void stopRun()
    {
       digitalWrite(inAOne, HIGH);
      digitalWrite(inBOne, HIGH);
      analogWrite(pwmOne, 0);
      digitalWrite(inATwo, HIGH);
      digitalWrite(inBTwo, HIGH);
      analogWrite(pwmTwo, 0);
    }
    penjelasan dari program:
    Nilai Accelerometer yang dikirimi smartphone akan menjadi inputan bluebot. Untuk nilai accelerometer
    X digunakan untuk mengatur kecepatan motor kanan dan kiri, sedangkan nilai accelerometer
    Y digunakan untuk mengatur maju dan mundur dari mmotor bluebot.
  2. Buatlah program apk menggunakan app inventor 2, adapun tampilan dari apk seperti berikut. tampilan apk dari kontrol robot dengan accelerometer smartphone

  3. Dan berikut block dari apk tersebut.
    block app inventor
    block app inventor accelerometer
    block app inventor accelerometer

Video