ENCICLOPÉDIA DE RÁDIO ELETRÔNICA E ENGENHARIA ELÉTRICA Robô simples. Enciclopédia de rádio eletrônica e engenharia elétrica Enciclopédia de eletrônica de rádio e engenharia elétrica / Equipamento de controle de rádio Este artigo apresenta um diagrama de um "robô" simples. Ele vai até a luz e, se não houver fonte de luz, o modo "Pesquisa gratuita" é ativado, ou seja. o robô irá dirigir e, em caso de colisão, dirija e dê meia-volta. O coração do robô é um microcontrolador ATMEL: AT90S2313, mas você pode usar qualquer outro desta empresa, este microcontrolador tem 2kb de memória para o programa, 15 portas de entrada/saída, potência disponível - 4-6V. Os motores serão controlados por um "driver do motor" - um microcircuito L293D (o analógico doméstico é o KR1128KT4A). Como sensor, decidiu-se usar fotoresistores SF3-1. O robô consiste em dois motores. Aqui está como eles funcionarão para determinadas ações:
Elementos de rádio usados no circuito: Microcontrolador AT90S2313 Microcircuito L293D (analógico doméstico - KR1128KT4A) 2 fotoresistores SF3-1 Quartzo a 4MHz Capacitores 22-24pF Estabilizador 7805 (ou KREN5A) Resistor de 100 ohms (opcional) Dois motores Power Vbat - 4 pilhas AA ou 1 coroa (9V) Fonte de alimentação Vm - 1 coroa (9V) Após a montagem do circuito, é necessário baixar o programa para o microcontrolador e o robô está pronto: /************************************************* **** *** Tipo de chip: AT90S2313 Frequência do relógio: 4,000000 MHz Modelo de memória: Tiny Tamanho da SRAM externa: 0 Tamanho da pilha de dados: 32 ************************************************** ***** **/#include <90s2313.h> #incluir #incluir // atribuição de definições para a conveniência de trabalhar com periféricos #define FORA DA PORTAB #define MOTOR_F 7 #define MOTOR_B 6 #define TURN_R 5 #define TURN_L 4 #define EM PIND #define LUZ_R 0 #define LUZ_L 1 #define BUMPER_F 2 #define BUMPER_B 3 // Possíveis modos de condução enumeração {STOP, F, FR, FL, B, BR, BL}; // ------------------------------------------------ ------------------------------ // Atraso t x 10ms // ------------------------------------------------ ------------------------------ void Delay_10ms(char t não assinado) {char eu; for(i=0;i // tabela de probabilidade para escolher a direção do movimento // com base na direção atual do movimento char unsigned p[7][7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100}; // direção atual do movimento caractere não assinado this_move; // ------------------------------------------------ ------------------------------ // Ligue a combinação de motores para movimento em uma determinada direção // ------------------------------------------------ ------------------------------ void go(direção de caracteres não assinados){ mudar (direção) { caso PARAR: FORA.MOTOR_F=0; FORA.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; caso F: FORA.MOTOR_F=1; FORA.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; caso FR: FORA.MOTOR_F=1; FORA.MOTOR_B=0; OUT.TURN_R=1; OUT.TURN_L=0; break; caso FL: FORA.MOTOR_F=1; FORA.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=1; break; caso B: FORA.MOTOR_F=0; FORA.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=0; break; caso BR: FORA.MOTOR_F=0; FORA.MOTOR_B=1; OUT.TURN_R=1; OUT.TURN_L=0; break; caso BL: FORA.MOTOR_F=0; FORA.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=1; break; } } // ------------------------------------------------ ------------------------------ // Selecionando a direção do movimento na próxima etapa de acordo com a tabela de probabilidade // ------------------------------------------------ ------------------------------ char unsigned next_move(void){ charpp não assinado, i; pp = rand()/327; // obtém um número aleatório 0..99 for (i=0;i<7;i++){ // procurando uma correspondência na tabela de probabilidade if (p[this_move][i] > pp) break; } este_movimento = i; // escreve a nova direção recebida como a atual retorno(i); } // ------------------------------------------------ ------------------------------ // Tratamento da interrupção do pára-choque dianteiro (INT0 = PD2) // ------------------------------------------------ ------------------------------ interrupção [EXT_INT0] void ext_int0_isr(void) { if(this_move==FR) vai(BL); if(this_move==FL) vai(BR); caso contrário vá(B); Delay_10ms(250); // partida dentro de 2.5 x 2 seg Atraso_10ms(250); este_movimento=B; } // ------------------------------------------------ ------------------------------ // Manipulação da interrupção do para-choque traseiro (INT1 = PD3) // ------------------------------------------------ ------------------------------ interrupção [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) go(FL); if(this_move==BL) vai(FR); senão vá(F); Delay_10ms(250); // partida dentro de 2.5 x 2 seg Atraso_10ms(250); este_movimento=F; } // ------------------------------------------------ ------------------------------ // "Caminhada aleatória" // ------------------------------------------------ ------------------------------ passeio de char não assinado(void){ // este loop organiza "free roam" while // nenhum sinal de nenhum dos sensores de luz while((IN.LIGHT_R) && (IN.LIGHT_L)){ go(next_move()); // obtém a próxima direção do movimento e Delay_10ms(250); // movendo nesta direção 2.5 seg } // este loop organiza o movimento para a luz enquanto // há um sinal de pelo menos um dos sensores de luz enquanto((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); senão if(IN.LIGHT_R==0) go(FR); senão if(IN.LIGHT_L==0) go(FL); } retorno (0); } // ------------------------------------------------ ------------------------------ // Programa principal // ------------------------------------------------ ------------------------------ void main (void) { DDRB=0xff; // atribui todas as linhas da porta B à saída PORTB = 0x00; // e defini-los baixos DDRD=0x00; // atribui todas as linhas da porta D à entrada PORTD=0xff; // conecta resistores de carga internos // Inicialização de interrupção(ões) externa(s) // INT0: Ligado // Modo INT0: Falling Edge // INT1: Ligado // Modo INT1: Falling Edge GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // ativa as interrupções #asm("sei") // inicia o loop principal while(1) andar(); } Baixe o programa, arquivo de firmware e diagrama do robô no formato sPlan Publicação: cxem.net Veja outros artigos seção Equipamento de controle de rádio. Leia e escreva útil comentários sobre este artigo. Últimas notícias de ciência e tecnologia, nova eletrônica: A existência de uma regra de entropia para o emaranhamento quântico foi comprovada
09.05.2024 Mini ar condicionado Sony Reon Pocket 5
09.05.2024 Energia do espaço para Starship
08.05.2024
Outras notícias interessantes: ▪ Placa-mãe Supermicro A1SA7-2750F tem 17 portas SATA ▪ Fone de ouvido estéreo sem fio PHILIPS OM6777 ▪ Consumo de energia reduzido do núcleo gráfico Feed de notícias de ciência e tecnologia, nova eletrônica
Materiais interessantes da Biblioteca Técnica Gratuita: ▪ seção do site Suas histórias. Seleção de artigos ▪ artigo Prevenção da dependência de substâncias psicoativas. Noções básicas de uma vida segura ▪ artigo De onde veio o sorvete? Resposta detalhada ▪ artigo Erva-doce de frutos pequenos. Lendas, cultivo, métodos de aplicação ▪ artigo Classificação dos intercomunicadores. Enciclopédia de rádio eletrônica e engenharia elétrica ▪ artigo Previsão de carta incrível. Segredo do Foco
Deixe seu comentário neste artigo: Todos os idiomas desta página Página principal | Biblioteca | Artigos | Mapa do Site | Revisões do site www.diagrama.com.ua |