freakone | strona domowa

freakone.pl

10 Sierpnia

Obsługa modułu RFM70 za pomocą mikrokontrolerów AVR

Moduł RFM70 zamówiłem ze względu na cenę - 12 złotych 8 złotych na transreciver to naprawdę mało. Niestety przed zakupem nie spojrzałem do datasheeta (a może i stety, wtedy bym go zapewne nie kupił :)) - tak fatalnie napisanej dokumentacji nie widziałem nigdy.

Nie było by w tym nic złego ale fakt, że biblioteka do obsługi modułu, którą zaraz przedstawię ma ponad 600 linii kodu (same definicje komend, adresów i nie wiadomo czego jeszcze zajmują około 200) skutecznie zniechęciła mnie do napisania jej samemu od podstaw.
Z pomocą wujka google udało mi się znaleźć kilka gotowców żadnego jednak nie udało mi się uruchomić. Na stronie voti.nl odnalazłem implementację obsługi modułu w C - wersja pod Arduino była zaprojektowana dla mikrokontrolera Atmega 128, wystarczyło ją przerobić – wyrzucić te wszystkie funkcje wysokiego poziomu z Arduino IDE. Pracę zacząłem, jednak w trakcie natknąłem na stronę, której autor już dokonał tego co ja chciałem zrobić. Po małych przeróbkach RFM ruszył bez problemów.

Przerobiłem bibliotekę na bardziej user-friendly oraz uporządkowałem i częściowo okomentowałem cały kod. Teraz wystarczy odwiedzić plik rfm70-config.h oraz opcjonalnie uart.h i dokonać konfiguracji. RFM70 powinien ruszyć od strzała :)
Biblioteka posiada zaimplementowaną diodę informacyjną - mruga gdy dane są wysyłane lub odbierane. Gdy moduł RFM nie zostanie poprawnie zainicjalizowany dioda mruga w nieskończoność wedle schematu 10100011. W pliku rfm70-config.h możemy włączyć tryb debugu - komunikaty przesyłane są przez port szeregowy (zaimplemetowałem 3, można dodać więcej).

Układy testowe zmontowałem na AVRach Atmega8 (odbiornik) i Atmega16 (nadajnik), moc nadawania została ustawiona na maksymalną, mikrokontrolery były taktowane wewnętrzym zegarem 8MHz. Pobór prądu nadajnika to około 6.4 mA, odbiornika około 26 mA. Pakiet miał długość 5 bajtów, wysyłany co 20ms.

Zasięg testowałem zarówno na otwartym terenie (po około 30 metrach zaczęły się sporadyczne dropy pakietów przy poruszaniu, po 40 przy bezruchu), jak i w domu (nadajnik umieszczony na piętrze, po zejściu na parter i przejściu przez 3 pomieszczenia stracił sygnał).


Kod obsługujący bibliotekę jest banalny.

Przykład odbiornika:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

#include "rfm70.h"	

int main()
{
	uint8_t test[]={'t', 'e', 's', 't','y'};	
	initRFM(); //inicjalizacja RFM70
	
	setModeTX(); //tryb nadawania
	setChannel(8); // kanał 8
	setPower(3); // maksymalna moc (0: -10dBm | 1: -5dBm | 2: 0dBm | 3: 5dBm)
	
	while (1)
	{	
		sendPayload(test, 5, 0); //tablica, dlugosc, 0 - bez potwierdzenia | 1 - z potwierdzeniem
		_delay_ms(20);	
	}
}

Przykład nadajnika:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

#include "rfm70.h"	

int main()
{
	uint8_t bufor[32];	
	initRFM(); //inicjalizacja RFM70
	
	setModeRX(); //tryb odbioru
	setChannel(8); // kanał 8
	
	while (1)
	{	
		if (receivePayload(bufor)) // odbieramy dane i przesyłamy je dalej za pomocą uarta
		{
			uart_puts((char*)bufor);
			uart_puts("\n");
		}	
	}
}

Pobierz bibliotekę modułu RFM70 dla mikrokontrolerów AVR