O Robô Paulinho foi criado pelos alunos do Colégio Poeta Manuel Bandeira, sua estrutura física é de peças de computador quebrado e suas rodas são CDs. O mecanismo que faz seu movimento são dois motores servos hackeados, a decisão de escolher o motor servo veio por facilitar o uso de um motor continuo já com um jogo de engrenagens interna ao qual é feita sua caixa de redução.
O Paulinho usa o protocolo de comunicação PSIU para se comunicar com as pessoas, segue o código de firmware

/******************************************************************                          PSIU PROTOCOL
 * Copyright (C) Ricardo Mariz and Robolivre.org 2012  * This is a free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. *  * PSIU PROTOOCOL is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License along * with this program.  If not, see <http://www.gnu.org/licenses/>. *                          * data:  02/03/2012 * Projeto realizado com fundos do Conselho Nacional de Desenvolvimento Científico e Tecnológico (CNPQ)                                                       Alguns exemplos de comandos que irao funcionar nessa versao:
MNERIM 034 parafrente 100 PC 02123MNERIM 032 paratras 100 PC 01919MNERIM 035 giradireita 100 PC 02217MNERIM 036 giraesquerda 100 PC 02338MNERIM 035 quantoscomandos PC 02514MNERIM 034 exibecomando 1 PC 02225?? 029 qualseunome PC 01755
******************************************************************/
#include   
Servo servo01, servo02;
char nome[] = "PAULINHO";char caractere, checkSum[6], tamanho[4], bufferComando[20], bufferParametro[20], remetente[20];int contByte = 0, soma = 0;long icheckSum;  
//VARIAVEIS AUXILIARESint validouComando = 0, comandoOk = 0 , criaRemetente = 0;int qntInt, qntFloat, qntChar, numComando;int perguntaNome = 0;int posicao = 0;

//PONTEIROS PARA A CRIACAO DOS VETORES COM OS PARAMETROS DOS COMANDOSint *parametroInt;float *parametroFloat;char *parametroChar;

//DEFINE QUANTIDADE DE COMANDOS DO MICROCONTROLADOR#define qntComandos 8
//ESTRUTURA DE COMANDO
struct{  char nome[15];  int parametro1, parametro2, parametro3;
} comando[qntComandos]; //Vetor com a quantidade de comandos.


void setup(){  
Serial.begin(9600);  
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4, OUTPUT);  
pinMode(5, OUTPUT);    //LISTA DE COMANDOS PREVIAMENTE DECLARADOS    
//Aqui eh declarado os comandos que o microcontrolador aceitara.    
strcpy(comando[0].nome , "parafrente");  
comando[0].parametro1 = 1;  
comando[0].parametro2 = 0;  
comando[0].parametro3 = 0;    
strcpy(comando[1].nome , "paratras");  
comando[1].parametro1 = 1;  
comando[1].parametro2 = 0;  
comando[1].parametro3 = 0;       
strcpy(comando[2].nome , "giradireita");  
comando[2].parametro1 = 1;  
comando[2].parametro2 = 0;  
comando[2].parametro3 = 0;        
strcpy(comando[3].nome , "giraesquerda");  
comando[3].parametro1 = 1;  
comando[3].parametro2 = 0;  
comando[3].parametro3 = 0;    
strcpy(comando[4].nome , "quantoscomandos");  
comando[4].parametro1 = 0;  
comando[4].parametro2 = 0;  
comando[4].parametro3 = 0;    
strcpy(comando[5].nome , "exibecomando");  
comando[5].parametro1 = 1;  
comando[5].parametro2 = 0;  
comando[5].parametro3 = 0;      
strcpy(comando[6].nome, "qualseunome");  
comando[6].parametro1 = 0;  
comando[6].parametro2 = 0;  
comando[6].parametro3 = 0;    
servo01.attach(9);  
servo02.attach(3);}


void loop(){  
servo01.write(111);  
servo02.write(106);  
if ( verificarComando() == 1 )   {    
processaComando(bufferComando, parametroInt, parametroFloat, parametroChar);     
zerarVariaveis();      
}  
}



int verificarComando(){
 while (Serial.available() > 0) {
   caractere = Serial.read();   //NOME, OS PRIMEIROS BYTES     
if(posicao == 0)   {           
if ( ((nome[contByte] == caractere) || (caractere == '?')) && (caractere != 32))     {       
contByte++; // Se o caractere vindo da Serial for igual ao caractere do nome o contador (contByte) eh  incrementado em 1.     
}else  if (caractere == 32)     {       
posicao = 1;       
contByte = 0;        
}     
soma = soma + caractere;         
}          // BYTES DE TAMANHO     else if (posicao == 1)    {     
if(caractere != 32)     {      
tamanho[contByte] = caractere;      
contByte++;     
}     else     {      
posicao = 2;      
contByte = 0;     
}     
soma = soma + caractere;   
}                     //BYTES DE COMANDO       
else if(posicao == 2) //VERIFICA SE O BYTE EH DE COMANDO   {        
if (validouComando == 0) //Verifica se ja validou o comando     {             
if (caractere != 32) //32 = Espaco no ASCII       {           
bufferComando[contByte] = caractere;           
contByte++;         
}             else //Se o caractere for espaco, o nome do comando ja esta no buffer.       {         
int i;                  
for(i = 0; i < qntComandos; i++) //Aqui usamos a variavel qntComandos declarada no comeco do programa para checar os comandos existentes.         {           
if(!strcmp(bufferComando, comando[i].nome))   //Compara a string no buffer com a lista dos comandos definidos, se bater ele aloca dinamicamente variaveis para os parametros.           
{             //Aloca dinamicamente espaco para colocar os parametros dos comandos             
// e valida o comando.             
parametroInt = (int*)malloc(comando[i].parametro1 * sizeof(int));              
qntInt = comando[i].parametro1; 
//Pega a quantidade parametros inteiro da funcao                          
parametroFloat = (float*)malloc(comando[i].parametro2 * sizeof(float));             
qntFloat = comando[i].parametro2;//Pega a quantidade de parametros float da funcao.                          parametroChar = (char*)malloc(comando[i].parametro3 * sizeof(char));             
qntChar = comando[i].parametro3; //Idem aos de cima.                          
comandoOk = 1; //O comando eh valido             
numComando = i; //Guarda o numero do comando definido na lista de comandos.                            }              }                  
if(comandoOk) //Se o comando for valido continua com a verificacao.         {           
validouComando = 1; // Comando valido.           
contByte = 0;                      
if ( ( qntInt == 0) && ( qntFloat == 0) && (qntChar == 0) ) // SE EXISTIR PARAMETROS PARA SEREM LIDOS, O COMANDO NAO TA OK!           {             
posicao = 3;           
}                              
}                  else //Se o comando nao for OK zeraremos as variaveis de soma e contagem de byte para iniciar de novo o processo.         
{           
soma = 0;           
contByte = 0;            
limpabuffer(bufferComando);                     
}       
}    
        }        else if (validouComando == 1) //Se o comando ja foi validado, pegaremos os parametros    
{
      if (caractere != 32) //32 = CARACTERE "ESPACO" no ASCII       {           
bufferParametro[contByte] = caractere;           
contByte++;  
     }              
else //Se o caractere eh 32 (espaco), ja esta armazenado no bufferParametro o valor do parametro. Armazenaremos nos vetores correspondente.       {         
if (qntInt > 0) //Checa a quantidade de inteiros que a funcao ainda tem para receber.    
     {           
parametroInt[comando[numComando].parametro1 - qntInt] = atoi(bufferParametro);           
qntInt--; //Subtrai quando o parametro for adicionado ao vetor.
         }                  
else if (qntFloat > 0) //Checa a quantidade de float que a funcao ainda tem para receber.         {           parametroFloat[comando[numComando].parametro2 - qntFloat] = atof(bufferParametro);           qntFloat--;         }                  else if (qntChar > 0) //Checa a quantidade de float que a funcao ainda tem para receber. 
        {           
parametroChar[comando[numComando].parametro3 - qntChar] = bufferParametro[comando[numComando].parametro3 - qntChar];
           qntChar--;
         }                         
//Se acabou os parametros, prossegue na mensagem.                 
if( (qntInt == 0) && (qntFloat == 0) && (qntChar == 0))   //Checa se nao falta mais parametros a ser guardados.                
{             
validouComando = 0; //Espera o proximo comando no proximo frame.            
comandoOk = 1;            
posicao = 3;        
    }
           contByte = 0;           
//limpabuffer(bufferParametro);    //**NAO SEI A UTILIDADE DISSO AINDA.  
                         }              
  }   
 soma = soma + caractere;               
}      
//REMETENTE          
else if (posicao == 3)  {    
if(caractere != 32){      
remetente[contByte] = caractere;      
contByte++;    
}        else{      
posicao = 4;      
contByte = 0;  
  }    soma = soma + caractere; 
       }              
//5 BYTES DE CHECKSUM      
else if (posicao == 4)   {      
checkSum[contByte] = caractere;          
contByte++;             
// CHECAGEM FINAL COM O CHECKSUM       
if (contByte == 5)      {       
icheckSum = atol(checkSum);                
if (icheckSum == soma)  //SE O CHECKSUM BATER MANDAMOS O NOME DA FUNCAO E SEUS PARAMETROS      {            
return 1;      
}      else      {         
Serial.println("CHECKSUM NAO BATEU!");         
zerarVariaveis();         
return 0;      }                                      
   }            
 }      
 }                
}    
void processaComando ( char* comandoRecebido, int* parametroInt, float* parametroFloat, char* parametroChar){  
char resposta[20];    
if (!(strcmp(comandoRecebido,"parafrente")))   {     
servo01.write(10);     
servo02.write(180);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);                  
}     else if (!(strcmp(comandoRecebido,"paratras")))   {     
servo01.write(180);     
servo02.write(10);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);  
 }      else if (!(strcmp(comandoRecebido,"giradireita")))   {     
servo01.write(10);     
servo02.write(10);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);  
}   else if (!(strcmp(comandoRecebido,"giraesquerda")))   {     
servo01.write(180);     
servo02.write(180);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");          
enviarMensagem(remetente, comandoRecebido, resposta); 
  }      else if (!(strcmp(comandoRecebido,"quantoscomandos")))   {     
char* resposta = "";     
itoa(qntComandos, resposta, 10);      
enviarMensagem(remetente, comandoRecebido, resposta); 
       }       else if (!(strcmp(comandoRecebido,"exibecomando")))   {     
char resposta[30];     
char aux[2];     
int qntInt, qntFloat, qntChar;     
        strcpy(resposta, comando[parametroInt[0] - 1].nome);         
qntInt = comando[parametroInt[0] -1].parametro1;     
qntFloat = comando[parametroInt[0] -1].parametro2;     
qntChar = comando[parametroInt[0] -1].parametro3;  
     itoa(qntInt, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);
     itoa(qntFloat, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);                  
itoa(qntChar, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);          
enviarMensagem(remetente, comandoRecebido, resposta);    }       
else if (!(strcmp(comandoRecebido,"qualseunome")))   {     enviarMensagem(remetente, comandoRecebido, NULL);  
 } 
}
void enviarMensagem(char* remetente, char* comando, char* resposta){  
int soma = 0, i;  
int itamanho = 3 + 5 + 1; // 3 BYTES DO TAMANHO, 5 BYTES DO CHECKSUM, 1 BYTE DE ESPAÇO  
char tamanho[3], nomeAux[20];  
strcpy(nomeAux, nome);  
if (resposta != NULL) 
strcat(resposta," ");  
strcat(comando," ");  
strcat(remetente," ");  
strcat(nomeAux," ");    
itamanho = itamanho + strlen(remetente) + strlen(comando) + strlen(resposta) + strlen(nomeAux);  
itoa(itamanho, tamanho, 10);      
for (i = 0; i < strlen(remetente); i++)  {    
soma = soma +  remetente[i];  
}    
for (i = 0; i < strlen(comando); i++)  {    
soma = soma + comando[i]; 
 }      
for (i = 0; i < strlen(resposta); i++)  {    
soma = soma + resposta[i]; 
 }      
for (i = 0; i < strlen(nomeAux); i++)  {    
soma = soma + nomeAux[i]; 
 }      
for (i = 0; i < strlen(tamanho); i++)  {    
soma = soma + tamanho[i]; 
 }   
    Serial.print(remetente);  
if ( strlen(tamanho) < 3)  {    
Serial.print("0");    soma += 48;  
}  Serial.print(tamanho);  
Serial.print(" ");  
soma += 32;  
Serial.print(comando);  
if (resposta != NULL) Serial.print(resposta);  
Serial.print(nomeAux);  
if(soma < 10000) Serial.print("0");  
Serial.println(soma);  }
//Funcao para limpar os buffers. (Avaliarei depois a eficiencia disso)  
void limpabuffer(char buffer[20]){ int i;  for (i = 0; i < 20; i++) {  
buffer[i] = NULL; 
}
}

void  zerarVariaveis(){         //Apos executar o comando zera todos os valores e comeca tudo de novo.      
 soma = 0;       
contByte = 0;        
validouComando = 0;       
limpabuffer(bufferComando);       
limpabuffer(bufferParametro);       
limpabuffer(remetente);       
comandoOk = 0;       
criaRemetente = 0;       
perguntaNome = 0;       
posicao = 0;            
}



Estrutura Física do Paulinho 
Servo servo01, servo02;
char nome[] = "PAULINHO";char caractere, checkSum[6], tamanho[4], bufferComando[20], bufferParametro[20], remetente[20];int contByte = 0, soma = 0;long icheckSum;  
//VARIAVEIS AUXILIARESint validouComando = 0, comandoOk = 0 , criaRemetente = 0;int qntInt, qntFloat, qntChar, numComando;int perguntaNome = 0;int posicao = 0;
//PONTEIROS PARA A CRIACAO DOS VETORES COM OS PARAMETROS DOS COMANDOSint *parametroInt;float *parametroFloat;char *parametroChar;
//DEFINE QUANTIDADE DE COMANDOS DO MICROCONTROLADOR#define qntComandos 8
//ESTRUTURA DE COMANDO
struct{  char nome[15];  int parametro1, parametro2, parametro3;
} comando[qntComandos]; //Vetor com a quantidade de comandos.

void setup(){  
Serial.begin(9600);  
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4, OUTPUT);  
pinMode(5, OUTPUT);    //LISTA DE COMANDOS PREVIAMENTE DECLARADOS    
//Aqui eh declarado os comandos que o microcontrolador aceitara.    
strcpy(comando[0].nome , "parafrente");  
comando[0].parametro1 = 1;  
comando[0].parametro2 = 0;  
comando[0].parametro3 = 0;    
strcpy(comando[1].nome , "paratras");  
comando[1].parametro1 = 1;  
comando[1].parametro2 = 0;  
comando[1].parametro3 = 0;       
strcpy(comando[2].nome , "giradireita");  
comando[2].parametro1 = 1;  
comando[2].parametro2 = 0;  
comando[2].parametro3 = 0;        
strcpy(comando[3].nome , "giraesquerda");  
comando[3].parametro1 = 1;  
comando[3].parametro2 = 0;  
comando[3].parametro3 = 0;    
strcpy(comando[4].nome , "quantoscomandos");  
comando[4].parametro1 = 0;  
comando[4].parametro2 = 0;  
comando[4].parametro3 = 0;    
strcpy(comando[5].nome , "exibecomando");  
comando[5].parametro1 = 1;  
comando[5].parametro2 = 0;  
comando[5].parametro3 = 0;      
strcpy(comando[6].nome, "qualseunome");  
comando[6].parametro1 = 0;  
comando[6].parametro2 = 0;  
comando[6].parametro3 = 0;    
servo01.attach(9);  
servo02.attach(3);}

void loop(){  
servo01.write(111);  
servo02.write(106);  
if ( verificarComando() == 1 )   {    
processaComando(bufferComando, parametroInt, parametroFloat, parametroChar);     
zerarVariaveis();      
}  
}


int verificarComando(){
 while (Serial.available() > 0) {
   caractere = Serial.read();   //NOME, OS PRIMEIROS BYTES     
if(posicao == 0)   {           
if ( ((nome[contByte] == caractere) || (caractere == '?')) && (caractere != 32))     {       
contByte++; // Se o caractere vindo da Serial for igual ao caractere do nome o contador (contByte) eh  incrementado em 1.     
}else  if (caractere == 32)     {       
posicao = 1;       
contByte = 0;        
}     
soma = soma + caractere;         
}          // BYTES DE TAMANHO     else if (posicao == 1)    {     
if(caractere != 32)     {      
tamanho[contByte] = caractere;      
contByte++;     
}     else     {      
posicao = 2;      
contByte = 0;     
}     
soma = soma + caractere;   
}                     //BYTES DE COMANDO       
else if(posicao == 2) //VERIFICA SE O BYTE EH DE COMANDO   {        
if (validouComando == 0) //Verifica se ja validou o comando     {             
if (caractere != 32) //32 = Espaco no ASCII       {           
bufferComando[contByte] = caractere;           
contByte++;         
}             else //Se o caractere for espaco, o nome do comando ja esta no buffer.       {         
int i;                  
for(i = 0; i < qntComandos; i++) //Aqui usamos a variavel qntComandos declarada no comeco do programa para checar os comandos existentes.         {           
if(!strcmp(bufferComando, comando[i].nome))   //Compara a string no buffer com a lista dos comandos definidos, se bater ele aloca dinamicamente variaveis para os parametros.           
{             //Aloca dinamicamente espaco para colocar os parametros dos comandos             
// e valida o comando.             
parametroInt = (int*)malloc(comando[i].parametro1 * sizeof(int));              
qntInt = comando[i].parametro1; 
//Pega a quantidade parametros inteiro da funcao                          
parametroFloat = (float*)malloc(comando[i].parametro2 * sizeof(float));             
qntFloat = comando[i].parametro2;//Pega a quantidade de parametros float da funcao.                          parametroChar = (char*)malloc(comando[i].parametro3 * sizeof(char));             
qntChar = comando[i].parametro3; //Idem aos de cima.                          
comandoOk = 1; //O comando eh valido             
numComando = i; //Guarda o numero do comando definido na lista de comandos.                            }              }                  
if(comandoOk) //Se o comando for valido continua com a verificacao.         {           
validouComando = 1; // Comando valido.           
contByte = 0;                      
if ( ( qntInt == 0) && ( qntFloat == 0) && (qntChar == 0) ) // SE EXISTIR PARAMETROS PARA SEREM LIDOS, O COMANDO NAO TA OK!           {             
posicao = 3;           
}                              
}                  else //Se o comando nao for OK zeraremos as variaveis de soma e contagem de byte para iniciar de novo o processo.         
{           
soma = 0;           
contByte = 0;            
limpabuffer(bufferComando);                     
}       
}    
        }        else if (validouComando == 1) //Se o comando ja foi validado, pegaremos os parametros    
{
      if (caractere != 32) //32 = CARACTERE "ESPACO" no ASCII       {           
bufferParametro[contByte] = caractere;           
contByte++;  
     }              
else //Se o caractere eh 32 (espaco), ja esta armazenado no bufferParametro o valor do parametro. Armazenaremos nos vetores correspondente.       {         
if (qntInt > 0) //Checa a quantidade de inteiros que a funcao ainda tem para receber.    
     {           
parametroInt[comando[numComando].parametro1 - qntInt] = atoi(bufferParametro);           
qntInt--; //Subtrai quando o parametro for adicionado ao vetor.
         }                  
else if (qntFloat > 0) //Checa a quantidade de float que a funcao ainda tem para receber.         {           parametroFloat[comando[numComando].parametro2 - qntFloat] = atof(bufferParametro);           qntFloat--;         }                  else if (qntChar > 0) //Checa a quantidade de float que a funcao ainda tem para receber. 
        {           
parametroChar[comando[numComando].parametro3 - qntChar] = bufferParametro[comando[numComando].parametro3 - qntChar];
           qntChar--;
         }                         
//Se acabou os parametros, prossegue na mensagem.                 
if( (qntInt == 0) && (qntFloat == 0) && (qntChar == 0))   //Checa se nao falta mais parametros a ser guardados.                
{             
validouComando = 0; //Espera o proximo comando no proximo frame.            
comandoOk = 1;            
posicao = 3;        
    }
           contByte = 0;           
//limpabuffer(bufferParametro);    //**NAO SEI A UTILIDADE DISSO AINDA.  
                         }              
  }   
 soma = soma + caractere;               
}      
//REMETENTE          
else if (posicao == 3)  {    
if(caractere != 32){      
remetente[contByte] = caractere;      
contByte++;    
}        else{      
posicao = 4;      
contByte = 0;  
  }    soma = soma + caractere; 
       }              
//5 BYTES DE CHECKSUM      
else if (posicao == 4)   {      
checkSum[contByte] = caractere;          
contByte++;             
// CHECAGEM FINAL COM O CHECKSUM       
if (contByte == 5)      {       
icheckSum = atol(checkSum);                
if (icheckSum == soma)  //SE O CHECKSUM BATER MANDAMOS O NOME DA FUNCAO E SEUS PARAMETROS      {            
return 1;      
}      else      {         
Serial.println("CHECKSUM NAO BATEU!");         
zerarVariaveis();         
return 0;      }                                      
   }            
 }      
 }                
}    
void processaComando ( char* comandoRecebido, int* parametroInt, float* parametroFloat, char* parametroChar){  
char resposta[20];    
if (!(strcmp(comandoRecebido,"parafrente")))   {     
servo01.write(10);     
servo02.write(180);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);                  
}     else if (!(strcmp(comandoRecebido,"paratras")))   {     
servo01.write(180);     
servo02.write(10);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);  
 }      else if (!(strcmp(comandoRecebido,"giradireita")))   {     
servo01.write(10);     
servo02.write(10);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");     
enviarMensagem(remetente, comandoRecebido, resposta);  
}   else if (!(strcmp(comandoRecebido,"giraesquerda")))   {     
servo01.write(180);     
servo02.write(180);     
delay(parametroInt[0]*10);     
servo01.write(111);     
servo02.write(106);          
strcpy(resposta, "sucesso");          
enviarMensagem(remetente, comandoRecebido, resposta); 
  }      else if (!(strcmp(comandoRecebido,"quantoscomandos")))   {     
char* resposta = "";     
itoa(qntComandos, resposta, 10);      
enviarMensagem(remetente, comandoRecebido, resposta); 
       }       else if (!(strcmp(comandoRecebido,"exibecomando")))   {     
char resposta[30];     
char aux[2];     
int qntInt, qntFloat, qntChar;     
        strcpy(resposta, comando[parametroInt[0] - 1].nome);         
qntInt = comando[parametroInt[0] -1].parametro1;     
qntFloat = comando[parametroInt[0] -1].parametro2;     
qntChar = comando[parametroInt[0] -1].parametro3;  
     itoa(qntInt, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);
     itoa(qntFloat, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);                  
itoa(qntChar, aux, 10);     
strcat(resposta, " ");     
strcat(resposta, aux);          
enviarMensagem(remetente, comandoRecebido, resposta);    }       
else if (!(strcmp(comandoRecebido,"qualseunome")))   {     enviarMensagem(remetente, comandoRecebido, NULL);  
 } 
}
void enviarMensagem(char* remetente, char* comando, char* resposta){  
int soma = 0, i;  
int itamanho = 3 + 5 + 1; // 3 BYTES DO TAMANHO, 5 BYTES DO CHECKSUM, 1 BYTE DE ESPAÇO  
char tamanho[3], nomeAux[20];  
strcpy(nomeAux, nome);  
if (resposta != NULL) 
strcat(resposta," ");  
strcat(comando," ");  
strcat(remetente," ");  
strcat(nomeAux," ");    
itamanho = itamanho + strlen(remetente) + strlen(comando) + strlen(resposta) + strlen(nomeAux);  
itoa(itamanho, tamanho, 10);      
for (i = 0; i < strlen(remetente); i++)  {    
soma = soma +  remetente[i];  
}    
for (i = 0; i < strlen(comando); i++)  {    
soma = soma + comando[i]; 
 }      
for (i = 0; i < strlen(resposta); i++)  {    
soma = soma + resposta[i]; 
 }      
for (i = 0; i < strlen(nomeAux); i++)  {    
soma = soma + nomeAux[i]; 
 }      
for (i = 0; i < strlen(tamanho); i++)  {    
soma = soma + tamanho[i]; 
 }   
    Serial.print(remetente);  
if ( strlen(tamanho) < 3)  {    
Serial.print("0");    soma += 48;  
}  Serial.print(tamanho);  
Serial.print(" ");  
soma += 32;  
Serial.print(comando);  
if (resposta != NULL) Serial.print(resposta);  
Serial.print(nomeAux);  
if(soma < 10000) Serial.print("0");  
Serial.println(soma);  }
//Funcao para limpar os buffers. (Avaliarei depois a eficiencia disso)  
void limpabuffer(char buffer[20]){ int i;  for (i = 0; i < 20; i++) {  
buffer[i] = NULL; 
}
}
void  zerarVariaveis(){         //Apos executar o comando zera todos os valores e comeca tudo de novo.      
 soma = 0;       
contByte = 0;        
validouComando = 0;       
limpabuffer(bufferComando);       
limpabuffer(bufferParametro);       
limpabuffer(remetente);       
comandoOk = 0;       
criaRemetente = 0;       
perguntaNome = 0;       
posicao = 0;            
}



Estrutura Física do Paulinho 


O Paulinho é divido principalmente em 4 partes, sendo elas: 
- Plataforma Superior (onde foi usado uma placa de nylon cortada e com alguns furos.)
       *Dimensões (10 cm X 8 cm) e com 4 furos posicionados à 3 cm da borda de maior comprimento, e a 1 cm da borda de menor comprimento, os furos estão espaçados de aproximadamente 2 cm.

S1THRPd.jpg


- Plataforma Inferior (também feita de nylon)
        *Dimensões (15 cm x 4 cm) com 8 furos,sendo os mais externos, dispostos à 1 cm da borda de maior comprimento e a 1 cm da borda de menor comprimento, e os mais internos, estão espaçados de 3 cm.

Z4vJYAT.jpg


- Suportes Laterais dos Servos Motores
    Possui formado parecido com um 'L', foi feita utilizando-se de placas de metal reciclado do CD-ROM, e com as dimensões descritas pelas imagem abaixo.
   Obs.: Os furos para a fixação do servo motor nos suportes, irá depender to tamanho do servo que está sendo utilizado, no nosso, caso usamos o Mini Servo 9G, mas você pode utilizar outros modelos, apenas tomando cuidado para fazer os furos na posição em que o seu motor seja bem fixado.

k5p35bB.jpg

 Suporte Lateral visto de outros ângulos: 

NFY8xaD.jpg

VLlirDF.jpg

-Fixador do Suporte Lateral
     Feito do mesmo material dos Suportes Laterais, os fixadores (como o próprio nome já diz) , auxilia na melhor fixação dos motores nas plataformas Superior e Inferior. O fixador é um retângulo metálico, com as dimensões de 1,5 cm X 5 cm , com furos á 0,5 cm da maior borda e a 0,5 cm da menor borda.

DaRfTT8.jpg


Montagem das Peças 

PASSO 1: 

Colocamos os parafusos maiores na plataforma superior do paulinho.
peslB67.jpg

PASSO 2 :

Fixamos as porcas para fixar a plataforma superior.
hhuIXqN.jpg

3 - PASSO: 


Colocamos mais 4 porcas na outra extremidade dos outros parafusos, mas não enroscamos até o final, pois elas servirão para colocar o suporte inferior do Paulinho.
SkPFzFt.jpg


PASSO 4:

Colocamos a plataforma inferior, e com mais 4 outras porcas fixamos ela.
Z7r5fJB.jpg


Abaixo, temos uma foto de como deve ficar as plataformas depois de serem unidas.


4ccO2Mf.jpg

PASSO 5:

Na plataforma superior do Paulinho, colocamos o Arduino, e analisando ele, podemos perceber que ele tem algumas aberturas que servem para serem parafusadas no robô, nesse caso, famos fixar o arduino no Paulinho usando parafusos bem pequenos. xcoqmdO.jpg


PASSO 6:

Após fixado o arduino, vamos agora prender os Suportes Laterais dos Servor Motores que devem ficar como na foto abaixo. 

WBqXJl7.jpg


PASSO 7:

Agora, com muito cuidado, colocamos os Servo Motores, que nesse caso, como dito anteriormente, foram os mini servos 9G e prendemos os servo motores no suporte com parafusos.

zQ9k5CW.jpg


m4OBPL6.jpg


Segue abaixo mais algumas imagens de como prender os Servos colocando o fixador de suporte lateral.

lFzXAeg.jpg

vX7sIkF.jpg



Atividades recentes