Estoy usando ATmega8A-PU microcontrolador AVR y módulo bluetooth HC-05 en una placa de pruebas.
Lo que estoy haciendo aquí es conectarse al módulo BT desde mi teléfono móvil y cambiar el estado del LED mediante el envío de comandos al microcontrolador.
Pero el problema es que, al enviar un personaje al microcontrolador a través del módulo BT, no recibiré el mismo personaje y el LED no se activará.
Conecté el módulo BT y el LED al microcontrolador mediante los siguientes esquemas:
Loquehiceaquí:
- VCCconectado&LospinesGNDcorrectamente.
- conectóelpinTXdelmóduloBTalpinRXdelmicrocontrolador.
- bajóelvoltajedelpinTXdelmicrocontroladorde+5va+3.3v,yloconectéalpinRXdelmóduloBT(técnicadedivisióndevoltajeV2=R2xV1/(R1+R2))yaqueestepinoperasoloen3.3v.
- conectóunLEDde5mmalpinPB0delmicrocontrolador.
Asíquesupongoquelapartedehardwareestáconfiguradacorrectamenteynohayningúnproblemaaquí,yaqueelmóduloBTyelLEDfuncionanperfectamente.
CompilomisprogramasenLinux,plataformaUbuntu16.04porelcompiladoravr-gcc.
TambiénutilizounprogramadorAVRUSBaspparacargararchivoshexenelmicrocontrolador.
EstablecílavelocidadenbaudiosdelmóduloBTigualaladelmicrocontrolador,paraquepuedanhablarentresíalamismafrecuencia.
LavelocidaddetransmisiónpredeterminadadeATmega8Aes9600.
LavelocidadenbaudiosdelmóduloBTes38400pordefecto,peroparaquefuncioneconelmicrocontrolador,loconfiguroen9600medianteloscomandosAT(AT+UART=9600,0,0)usandolaplataformaArduino.(Talvezestocauseelproblemaquevoyaexplicar).
Debotenerencuentaquenopuedoconfigurarlavelocidadenbaudiosdelmicrocontroladoren38400,yaqueelcompiladoradviertequelavelocidadenbaudiosesmayorquelapermitida.esporesoquecambiélavelocidadenbaudiosdelmóduloBT.
Finalmente,compiléelsiguientecódigoylosubíalmicrocontrolador:
#defineF_CPU1000000UL#defineFOSC1843200//ClockSpeed#defineBAUD9600#defineMYUBRRFOSC/16/BAUD-1#definebitset(bit)(1<<(bit))#defineis_set(sfr,port)(((sfr)&bitset((port))))#defineis_dead(sfr,port)(!is_set((sfr),(port)))#definewait_to_set(sfr,port)do{}while(is_dead((sfr),(port)))#definewait_to_die(sfr,port)do{}while(is_set((sfr),(port)))#include<avr/io.h>#include<util/setbaud.h>voidUSART_Init(constuint8_tubrr){UCSRA|=(1<<U2X);UCSRB=(1<<RXEN)|(1<<TXEN);UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0);UBRRH=(ubrr>>8);UBRRL=ubrr;}voidUSART_Flush(){unsignedchardummy;while(UCSRA&(1<<RXC))dummy+=UDR;}voidUSART_Transmit(constunsignedchardata){/*Waitforemptytransmitbuffer*/while(!(UCSRA&(1<<UDRE)));/*Putdataintobuffer,sendsthedata*/UDR=data;}uint8_tUSART_Receive(){/*Waitfordatatobereceived*/while(!(UCSRA&(1<<RXC)));/*Getandreturnreceiveddatafrombuffer*/returnUDR;}inlinevoidLED_poweron(){PORTB|=(1<<PB0);}inlinevoidLED_poweroff(){PORTB&=~(1<<PB0);}intmain(){USART_Init(MYUBRR);//setupserialconnectionDDRB=0xff;//setupLEDDDRPORTB=0;//poweroffLEDatthebeginningwhile(1){constuint8_tbyte=USART_Receive();//receivedataUSART_Flush();//flushUDRtodropuselessdataif(byte==2)LED_poweron();elseif(byte==1)LED_poweroff();USART_Transmit(byte);//senddatabacktosender}return0;}
Elcódigoessimple.
inicializalaconexiónserialyrecibedatosdelmóduloBT.silosdatoscontienenelnúmero2,elLEDseencenderá,sielnúmero1,elLEDseapagaráycualquierotrovalorseignorará,yfinalmenteelvalorsetransmitiránuevamentealremitente.
Compiloysuboestecódigoconlossiguientescomandos:
avr-gcc-Os-Wall-mmcu=atmega8a-oserial.oserial.cavr-objcopy-j.textserial.oserial.hex2>/dev/nullavrdude-pm8-cusbasp-b9600-Uflash:w:serial.hex
Elcódigosecargacorrectamenteynoapareceráningúnerror.
avrdude:warning:cannotsetsckperiod.pleasecheckforusbaspfirmwareupdate.avrdude:AVRdeviceinitializedandreadytoacceptinstructionsReading|##################################################|100%0.01savrdude:Devicesignature=0x1e9307(probablym8)avrdude:NOTE:"flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "serial.hex"
avrdude: input file serial.hex auto detected as ELF
avrdude: writing flash (146 bytes):
Writing | ################################################## | 100% 0.12s
avrdude: 146 bytes of flash written
avrdude: verifying flash memory against serial.hex:
avrdude: load data flash data from input file serial.hex:
avrdude: input file serial.hex auto detected as ELF
avrdude: input file serial.hex contains 146 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.11s
avrdude: verifying ...
avrdude: 146 bytes of flash verified
avrdude: safemode: Fuses OK (E:FF, H:D9, L:E1)
avrdude done. Thank you.
Utilizo Terminal Bluetooth Serie Android Aplicación para conectar al módulo BT desde mi teléfono.
El problema se produce justo aquí, cuando envío una cadena al módulo BT, envía de vuelta los caracteres que no son ASCII y el LED no cambia.
La parte impar es que me di cuenta de que cuando la función USART_Receive recibe 1 byte, itera 4 veces y recibe 4 bytes en su lugar.
Encontré esto configurando el LED para que parpadee cada vez que esa función recibe un byte.
Expliqué todo en detalle, ¿por qué no estoy recibiendo el mismo carácter que estoy enviando al módulo de BT?
¿Se trata del momento? ¿Tasas de baudios mal configuradas?
¡No tengo idea de lo que está pasando!
EDITAR: puede encontrar este proyecto aquí