ATmega8 ESP8266 WIFI Robot Car Controlado por Smartphone

Olá,

conforme o prometido neste artigo, alterou-se o Atmega128 para ATmega8 simplificando o Robot Car, reduzindo o espaço ocupado pelo kit , no entanto o uso deste microcontrolador em alternativa ao ATMega128 AVR Development Board, apresentou uma limitação relativa ao baudrate de comunicação entre o ESP8266 e o ATmega8.

O baudrate utilizado no projecto anterior era de 115200bps, no entanto com o ATmega8 a Fosc. 8Mhz, tal não foi conseguido devido aos erros de comunicação.

O ideal sería utilizar um cristal externo de 14,76Mhz, o que não é fácil de encontrar, no entanto nas tabelas abaixo, poderão ver as diferenças entre 8Mhz e o Cristal mais comum ( 16 Mhz ).

Baudrate 8Mhz

Baudrate 16Mhz

A alternativa que contornou este obstáculo foi mudar a comunicação do ESP8266 +ATmega para 19200bps, suficiente para o controlo do carro.
Importante é verificarem as ligações do projecto:

ATmega8 Conexões

Tudo o resto se mantém intacto, não há grandes alterações ao Projecto Anterior ATmega128.

Coloco o código e em breve será apresentado o video do funcionamento.

/*
* Atmega8-RobotCar.c
*
* Created: 04-04-2018
* Author : Norlinux
* http://www.microelectronic.pt
* https://www.facebook.com/MundoDosMicrocontroladores/
* Released under GPLv3.
* Please refer to LICENSE file for licensing information.
* which can be found at http://www.gnu.org/licenses/gpl.txt
*/
#define F_CPU 8000000UL /* Define CPU Frequency e.g. here its int. 8MHz */
#include
#include <avr/io.h>
#include
#include /* Include standard IO library */
#include /* Include string library */
#include /* Include standard library */
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "SimpleUART.h" /* Include UART header file */
int main(void)
{
//Inicialização de comunicação USART
USART_Init(Baud_19200);
//USARTInit1(Baud_57600);
//USART_Init(Baud_9600); // Only for Proteus Test
//Inicialização das configurações dos Motores
Motor_Init();
//Inicialização da estrutura dos motores
motor_dc motor={0,0,0,0,Frente,Frente,0,0};
//Vector com os valores de SetPoint Pre-defenidos 8 bits
int Duty[7]={-Maximo,-Medio,-Minimo,0,Minimo,Medio,Maximo}; // este vector tem como zero o Duty[3]
int* Motor_Duty = &Duty[Range];
// Variaveis para uso geral
int IncUpDown=0,IncL=0,IncR=0,ValorSP_Esq=0,ValorSP_Dir=0,Flag_Change=0,STOP=0;
// Variavel de envio carateres pela transmissão USART
char msg[6];
while (1)
{
if (STOP==Sim) // Motor Parado
{
motor.Start=Nao;
Stop_Engine();
}
else // Motor em funcionamento
{
motor.Start=Sim;
motor_control_dir(&motor);
motor_control_esq(&motor);
}
if (Flag)
{
switch (NumberReceived)
{
case espUP: //1 botão Frente
if (STOP==Sim)
{break;}
else{
motor.sentido_dir=Frente;
motor.sentido_esq=Frente;
Speed_UP(&IncUpDown,Range);
ValorSP_Esq=Motor_Duty[IncUpDown];
ValorSP_Dir=ValorSP_Esq;
_delay_us(Range);
sprintf(msg,"E%i",ValorSP_Esq);
send_message(msg);
motor.Set_P_dir=ValorSP_Esq;
motor.Set_P_esq=ValorSP_Dir;
Flag=0; // Flag que permite saber qual o estado do buffer USART
Flag_Change=Nao; // Flag de mudança de direcção / Encravamento
break;}
case espDOWN: //2 Botão Traz
if (STOP==Sim)
{break;}
else{
Speed_Down(&IncUpDown,Range);
motor.sentido_dir=Traz;
motor.sentido_esq=Traz;
ValorSP_Dir=Motor_Duty[IncUpDown];
ValorSP_Esq=ValorSP_Dir;
_delay_us(Range);
sprintf(msg,"D%i",ValorSP_Dir);
send_message(msg);
motor.Set_P_dir=ValorSP_Dir;
motor.Set_P_esq=ValorSP_Esq;
Flag=Nao;
Flag_Change=Nao;
break;}
case espRIGHT: // 3 Botão Direita
if (STOP==Sim)
{break;}
else
{
if (motor.sentido_dir==Frente && motor.sentido_esq==Frente)
{
if (Flag_Change==Nao)
{
IncR=IncUpDown;
Speed_Down(&IncR,Range);
Flag_Change=Sim;
}
else
{
Speed_Down(&IncR,Range);
}
ValorSP_Dir=Motor_Duty[IncR];
}
else {
if (Flag_Change==Nao)
{
IncR=IncUpDown;
Speed_UP(&IncR,Range);
Flag_Change=Sim;
}
else
{
Speed_UP(&IncR,Range);
}
ValorSP_Dir=Motor_Duty[IncR];
}
_delay_us(Range);
sprintf(msg,"D%i",ValorSP_Dir);
send_message(msg);
motor.Set_P_dir=ValorSP_Dir;
Flag=Nao;
break;}
case espLEFT: // 4 Esquerda
if (STOP==Sim)
{break;}
else
{
if (motor.sentido_dir==Frente && motor.sentido_esq==Frente)
{
if (Flag_Change==Nao)
{
IncL=IncUpDown;
Speed_Down(&IncL,Range);
Flag_Change=Sim;
}
else
{
Speed_Down(&IncL,Range);
}
ValorSP_Esq=Motor_Duty[IncL];
}
else {
if (Flag_Change==Nao)
{
IncL=IncUpDown;
Speed_UP(&IncL,Range);
Flag_Change=Sim;
}
else
{
Speed_UP(&IncL,Range);
}
ValorSP_Dir=Motor_Duty[IncL];
}
_delay_us(Range);
sprintf(msg,"E%i",ValorSP_Esq);
send_message(msg);
motor.Set_P_esq=ValorSP_Esq;
Flag=0;
break;}
case espON: //5 Arranque/Liga
motor.Start=Sim;
Start_Engine(Frente);
Flag=Nao;
STOP=Nao;
break;
case espOFF: // 0 Paragem / Desliga
STOP=Sim;
Flag=Nao;
break;
}
}
}
}

ESP8266+L293D

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s