Arduino a bezdrátový přenos s CC1101
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.
Program - vysílač
#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.
Program - přijímač
#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.
Aktualizace 14.5.2019
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.
Vytvořeno: 2017-10-06 21:17:18
Změněno: 2019-05-14 22:04:30
Pavel
2021-03-22 21:34:16
Dobrý den, ano stačí použít jinou knihovnu, doporučuji CC1101_RF, je to dopracovaný klon původní knihovny. Jen je potřeba mít moduly na stejném kmitočtu. Obvod CC1101 je konfigurovatelný v širokém rozsahu kmitočtů, výkonů a dalších pracovních režimů. Funkční knihovna zde https://github.com/pkarsy/CC1101_RF
Martin
2021-03-16 12:44:45
Dobrý den, podarilo se nekomu rozchodit komunikaci starych CC1101 a novych CC1101 jak je psano v aktualizaci k 14.5.2019? Dekuji
Šrajla
2020-04-11 16:20:57
Tak vyřešeno:
string retezec = ((char*)packet.data);
int distance = retezec.substring(1).toInt();
Šrajla
2020-04-11 09:58:31
Dobrý den. Program funguje perfektně. Jen nevím jak zpracovat přijatá data. Jak mám rozumět zápisu Serial.println((const char *) packet.data)? Jde přijatá data zkopírovat do nějaké proměnné a dále zpracovávat? Děkuji.
Zadan
2019-12-03 21:16:27
Děkuji za odpověď. Potřebuji příjem na 868MHz. Použiju převodník úrovní. Mohu připojit dutinku 5V arduina uno na HV vstup převodníku úrovní, a dutinku 3,3V arduina na LV vstup převodníku a dále také na VCC modulu CC1101 a ostatní signály na HV1-4 na straně arduina a LV1-4 na straně CC1101 ?
Děkuji
Autor
2019-12-03 19:39:17
Doporucuji spise prejit na niceRF, ktere zvladata 3.3 i 5V. Pokud chcete zustat u CC1101 tak pouzijte prevodnik urovni: https://arduino-shop.cz/arduino/1481-iic-i2c-5v-na-3-3v-obousmerny-prevodnik-logicke-urovne.html.
Zadan
2019-12-01 18:27:49
Děkuji za odpověď. Já s arduinem začínám, takže jsem to, bohužel, vyzkoušel a zřejmě jsem poslal modulek do křemíkového nebe.
Ještě mi, prosím, osvětlete, jak tedy postupovat, pokud budu napájet Uno nebo Nano pomocí 3,3V (přes jack?) a připojím přes USB k počítači kvůli serial monitoru, a tudíž tímto připojím 5V k napájení arduina.
Omlouvám se za stupidní otázku.
Autor
2019-11-29 23:01:12
CC1101 jede na napeti 1.8 az 3.6V, arduino pouzivam na napeti 3.3V / 8MHz.
Takze to je v poradku. Nezkousel jsem to pripojit na arduino 5V.
Zadan
2019-11-29 22:57:09
Dobrý den, neměly by se přizpůsobit napěťové úrovně na SPI ?
Zadan
2019-11-29 22:56:52
Dobrý den, neměly by se přizpůsobit napěťové úrovně na SPI ?
Autor
2019-09-01 19:07:40
Dobrý den
Myslím, že o podobném chování jsem už někde četl. Tam chyba byla ve špatně připájené anténě a tím se dramaticky zmenšil dosah. Což by odpovídalo těm 20cm. Teď všude dávám niceRF a s dosahem jsem spokojen.
Nicméně i CC1101 by mělo v pohodě dosáhnout na 50m i přes zeď.
JS
2019-09-01 18:35:16
Dobrý den, použil jsem váš kód a komunikaci rozchodil, ale funguje bohužel jen asi na 20 cm. Mám 3 CC1101 moduly se SMA anténou. Prostřídal jsem je, ale výsledek je vždy stejný. 433 MHz mi nefunguje vůbec. Zkoušel jsem i různá napájení, nemělo to žádný vliv. Neměl by jste nějaký tip, v čem by mohl být problém? Děkuji
Buchar
2018-01-04 12:44:21
Dobrý den. Prosím Vás byl by jste ochotný poskytnout Váš mail. Potřeboval bych se Vás na něco neveřejně dotázat ohledně CC1101. Můj mail je bigosi*zavin*seznam*teckacezetko . Děkuju.
vkt
2017-10-22 19:03:07
http://www.electrodragon.com/w/CC1101
http://www.ti.com/lit/ds/symlink/cc1101.pdf
Napsat komentář