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.

SmartCar
/*
 * 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 <inttypes.h>
#include <avr/io.h>
#include <math.h>
#include <stdio.h>					/* Include standard IO library */
#include <string.h>					/* Include string library */
#include <stdlib.h>					/* 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 uma resposta

Your email address will not be published.

www.000webhost.com