132.07+Race+home+page

Pages in this project

 * Arduino
 * Android
 * Bluetooth
 * O Software
 * Dificuldades e soluções

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.



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.

code 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); }

}

code code 































<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>

code

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.

code
 * 1) include <SoftwareSerial.h>
 * 2) include <stdlib.h>
 * 3) 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 { /**   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; }       }    } }
 * 00: Forward
 * 01: Backward
 * 10: Right
 * 11: Left

code

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. ...