Skocz do zawartości

[C] Bluetooth HC-05 - brak kontaktu z procesorem.


Pomocna odpowiedź

Napisano

Witam. Przymierzam się do budowy robota sterowanego przez Bluetooth. Jako procesor wybrałem ATmegę 8 taktowaną wewnętrznym zegarem 1MHz, a jako moduł łączności HC-05. Przy połączeniu tablet/komputer <-> HC-05, na jego pinie STATE pojawia się stan wysoki, a czerwona dioda mruga z mniejszą częstotliwością, lecz procesor nie wysyła znaku "a" do czego został zaprogramowany. Proszę o wyrozumiałość, gdyż dopiero od tygodnia uczę się C. Poniżej zamieszczam kod programu:

#include <avr/io.h>

volatile unsigned char data = 97;

//////////////////////////////////////////
//	USART_Init - inicjalizacja USARTU	//
//////////////////////////////////////////

void USART_Init(void) 
{
/*
	USART w trybie asynchronicznym;
	1 bit stopu; 8 bitow danych; double-speed;
	baudrate - 9600;
*/
DDRD |= (1<<DDD1);
UBRRH = 0;
UBRRL = 12;
UCSRA = (1<<U2X);
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE);
UCSRC = (1<<UCSZ0) | (1<<UCSZ1);
}

//////////////////////////////////////////////////////
//	USART_Transmit - transmisja danych przez USART	//
//////////////////////////////////////////////////////

void USART_Transmit(data)
{
while (!( UCSRA & (1<<UDRE)));
UDR = data;
}

//////////////////////////////////////////////////////
//	USART_Receive - odbieranie danych przez USART	//
//////////////////////////////////////////////////////

unsigned char USART_Receive(void)
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}

int main(void){
USART_Init();
while(1){
	USART_Transmit(98);
}
}

Z twojego opisu do końca nie rozumiem co chcesz zrobić, masz zamiar sterować robotem poprzez moduł bluetooth. Zatem będziesz chciał wysyłać odpowiednie ciągi znaków, ze swojego telefonu do modułu Bluetooth, który następnie przekaże je odpowiednio do procesora poprzez USART'a, twój aktualny program docelowo ma przesłać jakiś ciąg znaków do modułu zatem w jaki sposób chcesz sprawdzić by to działało poprawnie?

Jeśli dioda na HC-05 miga z mniejszą częstotliwością oznacza to, że urządzenie jest połączone z telefonem o ile dobrze pamiętam, bo chyba tak było gdy bawiłem się tym modułem.

W jaki sposób podłączyłeś moduł do procka?

Jesteś pewien że ustawiłeś właściwą prędkość transmisji?

U mnie to wyglądało np tak:

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

część funkcji:
UBRRH = (BAUD_PRESCALE>>8);
UBRRL = BAUD_PRESCALE;

Druga sprawa, skoro korzystasz ze zmiennej globalnej do pobrania wartości do wysłania,
zrobił bym to w ten sposób:

USART_Transmit(98); zmień na
USART_Transmit(); 

void USART_Transmit(data) możesz zmienić na:
void USART_Transmit() 

Moja rada, stwórz prostą aplikację dzięki której połączysz się z modułem poprzez telefon, i ustaw by była wysyłana np wartość 1, w programie procka zrób, że jeśli odbierzesz wartość 1 to zaświeci ci się jakaś dioda, dzięki temu będziesz pewien, ze transmisja działa poprawnie.

Moje rady mogą być nie najlepsze ponieważ sam nie jestem w tej dziedzinie ekspertem,
jak czegoś nie zrozumiałeś pytaj.

Pozdrawiam

Na początku chcę opanować wysyłanie, a potem odbieranie danych.Zmieniłem kod zgodnie z Twoimi wskazówkami i nie zauważyłem żadnej zmiany. Jeśli chodzi o połączenia to wygląda to tak:

Atmega RX HC05 TX

Atmega TX HC05 RX

Moduł Bluetooth zasilany jest napięciem 5v (na płytce widnieje napis informujący o zakresie 3.3v-6v ). Testowałem kilka programów, jedyny poprawnie wysyłającym dane (lecz ich nie odbierający) znajduje się na tej stronie

EDIT: zły adres linku

No dobra chcesz opanować wysyłanie, ale żeby sprawdzić czy wysyłanie działa musisz te dane gdzieś odbierać by sprawdzić czy wszystko jest zrobione poprawnie. Pytanie czy chcesz zrobić wysyłanie z procesora na zewnątrz, czy z zewnątrz do procesora.

Jeśli chcesz wysyłać dane z procesora poprzez moduł, to musisz je gdzieś odebrać np w telefonie, inaczej nie wiem w jaki sposób chcesz sprawdzić działanie układu.

Chyba się nie zrozumieliśmy 🙂 Ten program ma na celu wysyłanie danych i odbieranie ich na innym urządzeniu np. komputerze. Ja robię to przez aplikację Bluetooth SPP (terminal bluetootha) na tablecie.

"he frequency range depends on the sound card, but 20-20000Hz should be possible with all modern cards."

20 kHz to dość bardzo mało, ja i tak polecam 24MHz Saleae.

Co prawda tylko 1/0 ale niezastąpione do analizy zasadniczo czegokolwiek cyfrowego (no może oscyloskop byłby czasem lepszy).

Mam 4 te moduły zakupione z różnych źródeł w różnym czasie i u mnie w każdym po połączeniu dioda świeci na stałe.

Proponuję jednaj jak radzą koledzy robić odwrotnie. Ściągnij dowolną aplikację lub napisz własną która będzie wysyłać znaki a w procku znaki odbieraj.

A jeszcze lepiej na początek to moduł podłącz przez dowolnego coma do kompa i na min patrz co się dzieje i czy dane idą.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...