Potřebujete-li propojit několik arduín bezdrátově, tak můžete použít například tyto moduly na 433MHz:
Tyto moduly jsou sice hojně používané ale já nemám s nima moc dobrou zkušenost. I na malé vzdálenosti jsem
měl docela velkou chybovost a signál se prostě často nedostal z vysílače do přijímače.
Proto jsem si objednal moduly s čipem CC1101 za cenu asi 2.5 €. A velice příjemně mě překvapil dosah a
kvalita přenosu.
Tento mnou objednaný modul pracuje na frekvenci 868MHz a je dodáván rovnou i s anténou. Je nutné samozřejmně
objednat alespoň dva moduly aby si s tím mohl človek začít hrát. Bohužel rozteč pinů není ve standartní velikosti,
takže na modul nelze připájet "hřebínek" a vložit ho do nepájivého kontaktního pole.
Modul komunikuje přes SPI a zapojení (ze strany součástek) je toto:
K arduinu PRO mini připojíme vývody takto:
| VCC | + 3.3V |
| GND | - 3.3V |
| CSN | 10 |
| SI | 11 |
| SO | 12 |
| SCLK | 13 |
| GD0 | 2 |
Je nutné si připojit dvě arduina s dvěma moduly, aby jsem mohli vyzkoušet přenos. Pro ovládání modulu s CC1101 použijeme knihovnu cc1101.zip.
#include <Arduino.h>
#include <cc1101.h>
#include <ccpacket.h>
CC1101 radio;
byte syncWord[2] = {199, 10};
unsigned long lastSend = 0;
unsigned int sendDelay = 10000;
void setup()
{
Serial.begin(9600);
radio.init();
radio.setSyncWord(syncWord);
radio.setCarrierFreq(CFREQ_868);
radio.disableAddressCheck();
radio.setTxPowerAmp(PA_LongDistance);
Serial.println(F("CC1101 radio initialized."));
}
int p=0;
char str[20];
void loop()
{
unsigned long now = millis();
if (now > lastSend + sendDelay)
{
lastSend = now;
sprintf(str,"Ahoj %d",p++);
CCPACKET packet;
packet.length = strlen(str);
strncpy((char *) packet.data, str, packet.length);
radio.sendData(packet);
Serial.print("Sent packet: ");
Serial.println(str);
}
}
Program každých 10 sekund odešle řetězec "Ahoj {cislo}". Pole syncWord[2] definuje čísla podle kterých se
spáruje přijímač s vysílačem.
#include <Arduino.h>
#include <cc1101.h>
#include <ccpacket.h>
#define CC1101Interrupt 0
#define CC1101_GDO0 2
CC1101 radio;
byte syncWord[2] = {199, 10};
bool packetWaiting;
void messageReceived() {
packetWaiting = true;
}
void setup()
{
Serial.begin(9600);
radio.init();
radio.setSyncWord(syncWord);
radio.setCarrierFreq(CFREQ_868);
radio.disableAddressCheck();
radio.setTxPowerAmp(PA_LongDistance);
attachInterrupt(CC1101Interrupt, messageReceived, FALLING);
}
void loop()
{
if (packetWaiting)
{
detachInterrupt(CC1101Interrupt);
packetWaiting = false;
CCPACKET packet;
if (radio.receiveData(&packet) > 0) {
if (!packet.crc_ok) {
Serial.println(F("crc not ok"));
}
if (packet.crc_ok && packet.length > 0)
{
Serial.print(F("data: "));
packet.data[packet.length]=0;
Serial.println((const char *) packet.data);
}
}
attachInterrupt(CC1101Interrupt, messageReceived, FALLING);
}
}
Program do konzole vypisuje to co přijme od vysílače.
Teď jsem bohužel zjistil docela nemylou skutečnost a to, že nově objednané CC1101 z aliexpresu nejsou kompatibilní se starými CC1101 a tedy nemůžou s nimi komunikovat.
Přejdu tedy asi na moduly s čipy STX882 a SRX882 někdy označované jako niceRF.