Skocz do zawartości

Dobór technologii mierzenia odległości pomiędzy dwoma mikrokontrolerami


Pomocna odpowiedź

Czyli breloczki itag jako beacony + esp32 do mierzenia siły sygnału BLE. Muszę poszukać informację jak to zrobić ale już wiem czego szukać 😁 dziękuję, zaraz zamówię komponenty i jak dojdą wezmę się za pisanie kodu i testowanie 😊

13 minut temu, kostuch napisał:

Jak zrobisz aplikację, żeby pikało/błyskało albo zminiejszało mu jakiś "licznik zdrowia" przy określonym RSSI, to gracz będzie wiedział że musi sp...adać 😉

To urządzenie na zawodniku też musi wtedy skanować. Tak nawiasem, 22 mA (przy aku 4 V) pasywne skanowanie z pełnym wypełnieniem na Pico W.

2 godziny temu, SheepHunter napisał:

Czyli breloczki itag jako beacony + esp32 do mierzenia siły sygnału BLE. Muszę poszukać informację jak to zrobić ale już wiem czego szukać 😁 dziękuję, zaraz zamówię komponenty i jak dojdą wezmę się za pisanie kodu i testowanie 😊

Może być też esp32-C3. Jest na "kanapkach" w formacie modułu esp-12F jeżeli nie potrzeba wszystkich nóżek. Łatwiejsze do lutowania.

No i testować możesz fizycznie bez itaga. Esp może działać też jako beacon.

Może jest coś tańszego niż breloczki. Może być cokolwiek BLE, np klikacz do robienia selfie, jakaś opaska czy co tam teraz jest w modzie.

nie robiłem nigdy nic z BLE dlatego zapytam: 
będzie się dało te itagi między sobą rozróżnić czy każdy będzie widoczny tak samo ? nie będą mi wprowadzać zakłóceń inne urządzenia które będą mieć ze sobą gracze ? (chociażby jakieś bransoletki ,piloty, breloczki itp. właśnie)

(edytowany)
2 godziny temu, SheepHunter napisał:

nie będą mi wprowadzać zakłóceń inne urządzenia które będą mieć ze sobą gracze

Urządzenia połączone nie będą kolidowały z beaconami - inne kanały. Rozgłaszanie odbywa się na kanałach 37, 38, 39, połączenia 0 - 36 i tam skakają po kanałach, więc tutaj kolizje mogą się zdarzyć, zarówno jak i inne rozgłaszające urządzenia BLE i nie wszystkie pakiety dojdą. Filtrowanie sprzętowe może być ciekawą opcją, żeby radio nie wzbudzało kodu z innych odebranych beaconów. Co do WiFi 2,4 to rozgłaszanie wykorzystuje pasma częstotliwości niepokrywające się z WiFi.

Ostatecznie, można by pokusić się o "zrównoważenie" pasma "sieci", jak w sieci komórkowej i sąsiadujące komórki (hotspoty) miałyby niepokrywające się częstotliwości, ale nie ma większego problemu z rozgłaszaniem tylko np. na 37 kanale, ale skanowanie na jednym kanale to nRF (poza egzotykami jakimiś) co mi wiadomo da radę tylko, więc to tylko teoretyzowanie połączone z idealizowaniem.

Edytowano przez matsobdev
12 godzin temu, matsobdev napisał:

Urządzenia połączone nie będą kolidowały z beaconami - inne kanały. Rozgłaszanie odbywa się na kanałach 37, 38, 39, połączenia 0 - 36 i tam skakają po kanałach, więc tutaj kolizje mogą się zdarzyć, zarówno jak i inne rozgłaszające urządzenia BLE i nie wszystkie pakiety dojdą. Filtrowanie sprzętowe może być ciekawą opcją, żeby radio nie wzbudzało kodu z innych odebranych beaconów. Co do WiFi 2,4 to rozgłaszanie wykorzystuje pasma częstotliwości niepokrywające się z WiFi.

Ostatecznie, można by pokusić się o "zrównoważenie" pasma "sieci", jak w sieci komórkowej i sąsiadujące komórki (hotspoty) miałyby niepokrywające się częstotliwości, ale nie ma większego problemu z rozgłaszaniem tylko np. na 37 kanale, ale skanowanie na jednym kanale to nRF (poza egzotykami jakimiś) co mi wiadomo da radę tylko, więc to tylko teoretyzowanie połączone z idealizowaniem.

i rozumiem, że mam umieścić dużo urządzeń które będzie się rozgłaszać i mierzyć siłę ich sygnału?

Każdy serwer BLE (itag, opaska, itd) ma unikalny adres sprzętowy, więc jak będziesz miał ich listę, to resztę śmieci odfiltrujesz po stronie klienta (esp).

Niektórym urządzeniom można nadać własną nazwę, żeby było przyjemniej, np "Straszna nora smoka" 😉

 

Taki np standardowy callback wyzwalany po znalezieniu jakiegoś BLE:

const char* tagAddress = "ff:ff:10:0f:7c:1e"; //iTAG MAC
.
.
.
  

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
	void onResult(BLEAdvertisedDevice advertisedDevice)
	{
		//printf("Device found: %s\n", advertisedDevice.toString().c_str());
		char devAddress[18];
		snprintf(devAddress, 18, advertisedDevice.getAddress().toString().c_str());

		if (!strcasecmp(devAddress, tagAddress)) // Czy znalezione BLE to nasz itag?
		{
			BLEDevice::getScan()->stop();
			printf("OK - %s\n", advertisedDevice.toString().c_str());
			advDevice = new BLEAdvertisedDevice(advertisedDevice);
		}
	}
};

 

Rada:

Użyj stosu NimBLE. Zaoszczędzisz sporo pamięci.

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...