Blog převážně jednočipový

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
CSN10
SI11
SO12
SCLK13
GD02

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
Š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ář