Escolar Documentos
Profissional Documentos
Cultura Documentos
CAMPUS LUZERNA
CURSO SUPERIOR EM ENGENHARIA DE CONTROLE E AUTOMAÇÃO
CASSIANO RICHTER
MAURICIO BONADIMAN
Luzerna – SC
2018
RESUMO
HISTÓRICO
Função Linear: a saída do neurônio é igual a zero, quando seu valor for negativo e 1
quando seu valor for positivo. Segundo a equação:
Função em Rampa:
Função Degrau:
Feito isto, partiu-se para a etapa de validação do código e verificação da rede neural
para saber se a quantidade de treinamento submetida a rede foi suficiente. O trecho de código
desenvolvido para isso pode ser verificado a seguir.
Nesse pequeno algoritmo, os desenvolvedores podem digitar valores simulando os
valores que seriam entregues pelos sensores do carrinho seguidor de linha. Dessa forma, a
partir da tabela de combinações possíveis (figura 4), é possível verificar se as saídas calculadas
pela rede estão de acordo com as saídas programadas.
Feito isto, tendo em vista que a rede neural desenvolvida foi bem treinada e atende ao
requisitos propostos inicialmente, partiu-se para a etapa de transferência do algoritmo e
valores obtidos no treinamento para o algoritmo que será implementado no seguidor de linha.
CONCLUSÂO
Após a implementação do algoritmo no seguidor de linha, testes foram feitos e após
alguns ajustes, o carro finalmente conseguiu realizar o percurso interno e externo da pista. Um
dos problemas interessantes de se relatar que foi encontrado durante a aplicação da rede
neural, acorreu devido ao treinamento exagerado da rede.
Isso ocorreu porque a rede foi treinada tantas vezes com as mesmas amostras que
apenas conseguia compreender e calcular a ação correta quando está estava muito próxima
dos valores de treinamento (entradas de 0, 0,5 e 1). Ou seja, quando as entradas obtinham
valores intermediários (0,3 e 0,7, por exemplo), a rede não compreendia o que estava
acontecendo e não respondia de forma adequada.
CÓDIGO FONTE
double somaNeuronioCamadaOculta[numeroNeuroniosCamadaOculta];
double somaNeuronioCamadaSaida[numeroSaidas];
double saidaNeuronioCamadaOculta[numeroNeuroniosCamadaOculta];
double saidaNeuronioSaida[numeroSaidas];
double entradas[numeroEntradas];
somatorio=somatorio+(entradas[contEntradas]*pesosCamadaOculta[contEntradas][contNeuro
nios]);
}
// soma a entrada de limiar do neurônio
somatorio=somatorio+pesosLimiarCamadaOculta[contNeuronios];
somatorio=somatorio+(saidaNeuronioCamadaOculta[contSinapses]*pesosCamadaSaida[contSi
napses][contSaidas]);
}
// soma a entrada de limiar do neurônio
somatorio=somatorio+pesosLimiarCamadaSaida[contSaidas];
void setup() {
pinMode(motor1a, OUTPUT); // motor direita
pinMode(motor1b, OUTPUT); // motor direita
pinMode(motor2a, OUTPUT); // motor esquerda
pinMode(motor2b, OUTPUT); // motor esquerda
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, LOW);
Serial.begin(9600);
void loop() {
sensorValue1 = analogRead(analogInPin1); // sensor da direita
sensorValue2 = analogRead(analogInPin2); // sensor do meio 1
sensorValue3 = analogRead(analogInPin3); // sensor do meio 2
sensorValue4 = analogRead(analogInPin4); // sensor da esquerda
/*
Serial.print("Esquerda: ");
Serial.print(sensorValue4/550);
Serial.print(" Meio: ");
Serial.print(((sensorValue3+sensorValue2)/2)/550);
Serial.print(" Direita: ");
Serial.println(sensorValue1/550);
*/
sensorValue3 = (sensorValue3+sensorValue2)/2;
entradas[0]= sensorValue4/700;
entradas[1]= sensorValue3/700;
entradas[2]= sensorValue1/700;
calculaSaidaCamadaOculta();
calculaSaidaCamadaSaida();
/*
analogWrite(motor1b, (int)(saidaNeuronioSaida[1]*255.0));
analogWrite(motor2b, (int)(saidaNeuronioSaida[0]*255.0));
*/
// VIRAR MUITO ESQUERDA
if ((saidaNeuronioSaida[0]<0.4)&&(saidaNeuronioSaida[1]>0.9)){
analogWrite(motor1b, 255);
analogWrite(motor1a, LOW);
analogWrite(motor2b, LOW);
analogWrite(motor2a, 200);
}
// VIRAR ESQUERDA
if
((saidaNeuronioSaida[0]>=0.4)&&(saidaNeuronioSaida[0]<=0.6)&&(saidaNeuronioSaida[1]>=0.
9)&&(saidaNeuronioSaida[1]<=1)){
analogWrite(motor1b, 255);
analogWrite(motor1a, LOW);
analogWrite(motor2b, LOW);
analogWrite(motor2a, LOW);
}
// IR PARA FRENTE
if ((saidaNeuronioSaida[0]>=0.9)&&(saidaNeuronioSaida[1]>=0.9)){
analogWrite(motor1b, 255);
analogWrite(motor1a, LOW);
analogWrite(motor2b, 255);
analogWrite(motor2a, LOW);
}
// VIRAR DIREITA
if
((saidaNeuronioSaida[1]>=0.4)&&(saidaNeuronioSaida[1]<=0.6)&&(saidaNeuronioSaida[0]>=0.
9)&&(saidaNeuronioSaida[0]<=1)){
analogWrite(motor1b, LOW);
analogWrite(motor1a, LOW);
analogWrite(motor2b, 255);
analogWrite(motor2a, LOW);
}
// VIRAR MUITO DIREITA
if ((saidaNeuronioSaida[1]<0.4)&&(saidaNeuronioSaida[0]>0.9)){
analogWrite(motor1b, LOW);
analogWrite(motor1a, 200);
analogWrite(motor2b, 255);
analogWrite(motor2a, LOW);
}
/*
Serial.print("Esquerda: ");
Serial.print(saidaNeuronioSaida[1]);
Serial.print(" Direita: ");
Serial.print(saidaNeuronioSaida[0]);
Serial.print(" In1: : ");
Serial.print(entradas[0]);
Serial.print(" In2: ");
Serial.print(entradas[1]);
Serial.print(" In3: ");
Serial.println(entradas[2]);
*/
}