Pages in this project


Arduino

O Arduino é um microcontrolador de alto nível muito utilizado devido a sua facilidade já que é programado em C e C++ ao invés de Assembly, que é uma linguagem de baixo nível que era utilizada previamente em outros microcontroladores.

A principal vantagem da utilização de um microcontrolador é poder controlar com maior facilidade outros dispositivos como motores e LED's já que é possível controlar diretamente o nível elétrico de um pino de entrada ou saída do controlador.

Android

Android é um sistema operacional bastante conhecido desenvolvido pela Google para dispositivos móveis utilizando um núcleo Linux. Por ter se tornado bastante conhecido e utilizado, foram desenvolvidos para ele diversos aplicativos ( a maioria em java) para concorrer com o iOS, SO da Apple.

Versões
  • 1.5: Cupcake (Abril de 2009, com a última revisão oficial a maio de 2010)
  • 1.6: Donut (Setembro de 2009, com a ultima revisão oficial a maio de 2010)
  • 2.0 - 2.1: Eclair (Janeiro de 2010, com a última revisão oficial a maio de 2010)
  • 2.2: FroYo (Frozen Yogurt - Maio de 2010, com a última revisão oficial a julho de 2011)
  • 2.3: Gingerbread (versão lançada a 6 de dezembro de 2010)
  • 3.0 - 3.2: Honeycomb (Lançada especialmente para tablets em Janeiro de 2011)
  • 4.0: Ice Cream Sandwich (Anunciada oficialmente em 19 de outubro de 2011)
  • 4.1 - 4.2 - 4.3: Jelly Bean (Versão principal, lançada em 27 de junho de 2012, com atualização recebida em 24 de julho de 2013) 4.4: KitKat (última versão lançada em 31 de outubro de 2013 junto com o novo smartphone do Google Nexus 5)

Normalmente é utilizado para o desenvolvimento de aplicativos para esta plataforma a IDE eclipse com a necessidade do ADT (Android Development Tools) e JDK (Java Development Kit).

O Eclipse gera automaticamente um código XML que será utilizado para criar a interface gráfica da aplicação.

Bluetooth

A comunicação Bluetooth é uma comunicação sem fio de curto alcance que permite a transferência de dados e arquivos diretamente entre dois dispositivos compatíveis com a tecnologia. Apesar do seu curto alcance, seu alto consumo e sua velocidade de transferência relativamente baixa, seu desempenho é satisfatório devido à sua facilidade de utilização.

O Bluetooth é dividido em 3 classes, sendo separado pela potência e pelo alcance. A classe mais utilizada em usos domésticos é a classe 2 ( até 10 metros)

HC-05

O HC-05 é um módulo bluetooth que permite a comunicação entre um dispositivo bluetooth e um dispositivo que não tenha comunicação bluetooth mas tenha comunicação serial, o que aumenta significativamente a utilidade da comunicação bluetooth.

O Software

O Aplicativo desenvolvido pelo grupo é dividido em duas partes. Se tratando de um "carro" controlado pelo Arduino, controlado remotamente por um dispositivo Android através de uma conexão bluetooth.

O Aplicativo foi desenvolvido usando como alvo a versão 4.1.2 do Android.


ic_launcher.png
Android



screenshot4321.png
Pressionando os botões da matriz de botões localizadas na metade superior da tela, é possível criar uma rota que será seguida pelo robô. Quando estiver satisfeito com o trajeto criado, pressione o botão Start e o aplicativo estabelecerá uma comunicação bluetooth com o robô por meio do módulo HC-05. Após estabelecida a conexão ele começará a enviar os comandos para o Arduino.

package ishizaki.apps.arduinoMaze;
 
import com.example.arduinomaze.R;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
 
public class MainActivity extends Activity implements OnClickListener{
 
    /*
     * 1 - cima
     * 2 - baixo
     * 3 - direita
     * 4 - esquerda
     */
 
    int[][] myInput    = new int[4][4];
    int[][] myOutput   = new int[4][4];
    int[][] current    = new int[4][4];
    int[][] myImage    = new int[5][5];
 
    ImageButton[][] myButton = new ImageButton[4][4];
    Button startButton = (Button) findViewById(R.id.startButton);
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myImage[0][0] = 0;
        myImage[0][1] = 0;
        myImage[0][2] = 0;
        myImage[0][3] = 0;
        myImage[0][4] = 0;
        myImage[1][0] = 0;
        myImage[1][1] = 0;
        myImage[1][2] = 1;
        myImage[1][3] = 2;
        myImage[1][4] = 3;
        myImage[2][0] = 0;
        myImage[2][1] = 4;
        myImage[2][2] = 0;
        myImage[2][3] = 5;
        myImage[2][4] = 6;
        myImage[3][0] = 0;
        myImage[3][1] = 7;
        myImage[3][2] = 8;
        myImage[3][3] = 0;
        myImage[3][4] = 9;
        myImage[4][0] = 0;
        myImage[4][1] = 10;
        myImage[4][2] = 11;
        myImage[4][3] = 12;
        myImage[4][4] = 0;
        myButton[0][0] = (ImageButton) findViewById(R.id.imageButton1);
        myButton[0][0].setOnClickListener(this);
        myButton[0][1] = (ImageButton) findViewById(R.id.imageButton2);
        myButton[0][1].setOnClickListener(this);
        myButton[0][2] = (ImageButton) findViewById(R.id.imageButton3);
        myButton[0][2].setOnClickListener(this);
        myButton[0][3] = (ImageButton) findViewById(R.id.imageButton4);
        myButton[0][3].setOnClickListener(this);
        myButton[1][0] = (ImageButton) findViewById(R.id.imageButton5);
        myButton[1][0].setOnClickListener(this);
        myButton[1][1] = (ImageButton) findViewById(R.id.imageButton6);
        myButton[1][1].setOnClickListener(this);
        myButton[1][2] = (ImageButton) findViewById(R.id.imageButton7);
        myButton[1][2].setOnClickListener(this);
        myButton[1][3] = (ImageButton) findViewById(R.id.imageButton8);
        myButton[1][3].setOnClickListener(this);
        myButton[2][0] = (ImageButton) findViewById(R.id.imageButton9);
        myButton[2][0].setOnClickListener(this);
        myButton[2][1] = (ImageButton) findViewById(R.id.imageButton10);
        myButton[2][1].setOnClickListener(this);
        myButton[2][2] = (ImageButton) findViewById(R.id.imageButton11);
        myButton[2][2].setOnClickListener(this);
        myButton[2][3] = (ImageButton) findViewById(R.id.imageButton12);
        myButton[2][3].setOnClickListener(this);
        myButton[3][0] = (ImageButton) findViewById(R.id.imageButton13);
        myButton[3][0].setOnClickListener(this);
        myButton[3][1] = (ImageButton) findViewById(R.id.imageButton14);
        myButton[3][1].setOnClickListener(this);
        myButton[3][2] = (ImageButton) findViewById(R.id.imageButton15);
        myButton[3][2].setOnClickListener(this);
        myButton[3][3] = (ImageButton) findViewById(R.id.imageButton16);
        myButton[3][3].setOnClickListener(this);
        setContentView(R.layout.activity_main);
 
 
    }
 
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
 
 
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        ImageButton incomingButton = (ImageButton) v;
        Button incomingButton2 = (Button) v;
        int x = 0;
        int y = 0;
 
 
        if(incomingButton2 == startButton)
        {
            send();
        }
        for(x = 0; x < 3; x++)
        {
            for(y = 0; y < 3; y++)
            {
                if(myButton[x][y] == incomingButton)
                {
                    current[x][y]++;
                    switch(current[x][y])
                    {
                    case 1:
                        myButton[x][y].setImageResource(R.drawable.baixo_cima);
                        break;
                    case 2:
                        myButton[x][y].setImageResource(R.drawable.baixo_direita);
                        break;
                    case 3:
                        myButton[x][y].setImageResource(R.drawable.esquerda_baixo);
                        break;
                    case 4:
                        myButton[x][y].setImageResource(R.drawable.esquerda_cima);
                        break;
                    case 5:
                        myButton[x][y].setImageResource(R.drawable.cima_direita);
                        break;
                    case 6:
                        myButton[x][y].setImageResource(R.drawable.esquerda_direita);
                        break;
                    }
                }
            }
        }
 
    }
 
    void send()
    {
        int[] mySendList = new int[32];
        int acabou = 0;
        int x = 0;
        int y = 0;
        int i = 0;
 
        for(x = 0; x < 4; x++)
        {
            for(y = 0; y < 4; y++)
            {
                current[x][y] = myImage[myInput[x][y]][myOutput[x][y]];
            }
        }
 
        do
        {
            switch(current[x][y])
            {
            case 1:
                mySendList[i] = 9;
                i++;
                break;
            case 2:
                mySendList[i] = 15;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 3:
                mySendList[i] = 13;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 4:
                mySendList[i] = 9;
                i++;
                break;
            case 5:
                mySendList[i] = 13;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 6:
                mySendList[i] = 15;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 7:
                mySendList[i] = 13;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 8:
                mySendList[i] = 15;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 9:
                mySendList[i] = 9;
                i++;
                break;
            case 10:
                mySendList[i] = 15;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 11:
                mySendList[i] = 13;
                i++;
                mySendList[i] = 9;
                i++;
                break;
            case 12:
                mySendList[i] = 9;
                i++;
                break;
 
            }
            if(myOutput[x][y] == 1)
            {
                x++;
            }
            else if(myOutput[x][y] == 2)
            {
                x--;
            }
            else if(myOutput[x][y] == 3)
            {
                y++;
            }
            else if(myOutput[x][y] == 3)
            {
                y--;
            }
        }while(x != 0 && y != 1);
    }
 
 
}
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
 
        android:text="Start" />
 
    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="60dp"/>
 
    <ImageButton
        android:id="@+id/imageButton2"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignTop="@+id/imageButton1"
        android:layout_toRightOf="@+id/imageButton1" />
 
    <ImageButton
        android:id="@+id/imageButton3"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignTop="@+id/imageButton2"
        android:layout_toRightOf="@+id/imageButton2" />
 
    <ImageButton
        android:id="@+id/imageButton4"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignTop="@+id/imageButton3"
        android:layout_toRightOf="@+id/imageButton3" />
 
    <ImageButton
        android:id="@+id/imageButton5"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton1"
        android:layout_below="@+id/imageButton1" />
 
    <ImageButton
        android:id="@+id/imageButton6"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton2"
        android:layout_alignTop="@+id/imageButton5" />
 
    <ImageButton
        android:id="@+id/imageButton7"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignTop="@+id/imageButton6"
        android:layout_toLeftOf="@+id/imageButton4" />
 
    <ImageButton
        android:id="@+id/imageButton8"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton4"
        android:layout_alignTop="@+id/imageButton7" />
 
    <ImageButton
        android:id="@+id/imageButton9"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton5"
        android:layout_below="@+id/imageButton5" />
 
    <ImageButton
        android:id="@+id/imageButton10"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton6"
        android:layout_alignTop="@+id/imageButton9" />
 
    <ImageButton
        android:id="@+id/imageButton11"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignTop="@+id/imageButton10"
        android:layout_toRightOf="@+id/imageButton10" />
 
    <ImageButton
        android:id="@+id/imageButton12"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton8"
        android:layout_alignTop="@+id/imageButton11" />
 
    <ImageButton
        android:id="@+id/imageButton13"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton9"
        android:layout_below="@+id/imageButton9" />
 
    <ImageButton
        android:id="@+id/imageButton14"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton10"
        android:layout_alignTop="@+id/imageButton13" />
 
    <ImageButton
        android:id="@+id/imageButton15"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton11"
        android:layout_alignTop="@+id/imageButton14" />
 
    <ImageButton
        android:id="@+id/imageButton16"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignLeft="@+id/imageButton12"
        android:layout_alignTop="@+id/imageButton15" />
 
</RelativeLayout>
 

Arduino

Após receber os comandos do dispositivo Android, o Arduino irá processar os dados e ligar o motor de acordo com a sequencia determinada pelo aplicativo.

#include <SoftwareSerial.h>
#include <stdlib.h>
#include <Arduino.h>
 
char incomingByte;
int timer    = 100;
int rotation = 90;
int move     = 30;
 
void setup()
{
    Serial.begin(9600);
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
/**
*2, 3, 4, 5: motor do lado direito
*6, 7, 8, 9: motor do lado esquerdo
**/
 
}
 
void moveForward()
{
    int i;
    for(i = 0; i < move; i ++)
    {
        digitalWrite(2,HIGH);
        digitalWrite(6,HIGH);
        delay(timer);
        digitalWrite(3,HIGH);
        digitalWrite(7,HIGH);
        delay(timer);
        digitalWrite(2,LOW);
        digitalWrite(6,LOW);
        delay(timer);
        digitalWrite(4,HIGH);
        digitalWrite(8,HIGH);
        delay(timer);
        digitalWrite(3,LOW);
        digitalWrite(7,LOW);
        delay(timer);
        digitalWrite(5,HIGH);
        digitalWrite(9,HIGH);
        delay(timer);
        digitalWrite(4,LOW);
        digitalWrite(8,LOW);
        delay(timer);
        digitalWrite(2,HIGH);
        digitalWrite(6,HIGH);
        delay(timer);
        digitalWrite(5,LOW);
        digitalWrite(9,LOW);
        delay(timer);
    }
}
 
void moveBackward()
{
    digitalWrite(5,HIGH);
    digitalWrite(9,HIGH);
    delay(timer);
    digitalWrite(4,HIGH);
    digitalWrite(8,HIGH);
    delay(timer);
    digitalWrite(5,LOW);
    digitalWrite(9,LOW);
    delay(timer);
    digitalWrite(3,HIGH);
    digitalWrite(7,HIGH);
    delay(timer);
    digitalWrite(4,LOW);
    digitalWrite(8,LOW);
    delay(timer);
    digitalWrite(2,HIGH);
    digitalWrite(6,HIGH);
    delay(timer);
    digitalWrite(3,LOW);
    digitalWrite(7,LOW);
    delay(timer);
    digitalWrite(5,HIGH);
    digitalWrite(9,HIGH);
    delay(timer);
    digitalWrite(2,LOW);
    digitalWrite(6,LOW);
    delay(timer);
}
 
void turnRight()
{
    int i;
    for(i = 0; i < rotation; i++)
    {
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        delay(timer);
        digitalWrite(4,HIGH);
        digitalWrite(7,HIGH);
        delay(timer);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        delay(timer);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        delay(timer);
        digitalWrite(4,LOW);
        digitalWrite(7,LOW);
        delay(timer);
        digitalWrite(2,HIGH);
        digitalWrite(9,HIGH);
        delay(timer);
        digitalWrite(3,LOW);
        digitalWrite(8,LOW);
        delay(timer);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        delay(timer);
        digitalWrite(2,LOW);
        digitalWrite(9,LOW);
        delay(timer);
    }
}
 
void turnLeft()
{
    int i;
    for(i = 0; i < rotation; i++)
    {
        digitalWrite(2,HIGH);
        digitalWrite(9,HIGH);
        delay(timer);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        delay(timer);
        digitalWrite(2,LOW);
        digitalWrite(9,LOW);
        delay(timer);
        digitalWrite(4,HIGH);
        digitalWrite(7,HIGH);
        delay(timer);
        digitalWrite(3,LOW);
        digitalWrite(8,LOW);
        delay(timer);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        delay(timer);
        digitalWrite(4,LOW);
        digitalWrite(7,LOW);
        delay(timer);
        digitalWrite(2,HIGH);
        digitalWrite(9,HIGH);
        delay(timer);
        digitalWrite(5,LOW);
        digitalWrite(6,LOW);
        delay(timer);
    }
}
 
void loop()
{
/**
*00: Forward
*01: Backward
*10: Right
*11: Left
**/
    if(Serial.available()>0)
    {
        incomingByte = Serial.read();
        if(incomingByte != 0)
        {
            if(incomingByte == 9)
            {
                moveForward();
            }
            else if(incomingByte == 11)
            {
                moveBackWard();
            }
            else if(incomingByte == 13)
            {
                turnRight();
            }
            else if(incomingByte == 15)
            {
                turnLeft();
            }
        }
    }
}
 

Dificuldades e soluções

No desenvolvimento desse projeto, tivemos diversas dificuldades (infelizmente não conseguimos solucionar todas elas), dentre elas, os principais problemas foram com o desenvolvimento dos softwares tanto com o android quanto com o arduino. Tivemos um grande problema com o aplicativo android que apesar de ter conseguido compilar e instalar no meu dispositivo móvel, eu não consegui fazer com que os botões respondessem adequadamente. Com o arduino tivemos um pequeno problema, mas foi rapidamente resolvido se tratando apenas de um pequeno erro de sintaxe (caixa baixa). Outro grande problema que tivemos foi a falta de tempo livre para a execução do projeto e a dificuldade de reunir o grupo fora do período de aula.

Também tivemos um problema com um módulo de controle do motor, que apresentou um defeito de última hora, não dando tempo de consertá-lo. Mesmo com uma entrada de 10V em sua saída não havia tensão, não sendo possível ativar o motor.
...