domenica 5 gennaio 2014

Texas CC1101 su Arduino con libreria Panstamp

Dopo lo scarso successo della precedente prova e stimolato da un commento ho riprovato ad usare il modulo Texas CC1101 con le librerie Panstamp

Viste le modeste dimensioni delle scritte sul circuito riporto la pedinatura del modulo CC1101 (non l'integrato ma tutto il modulo) in modo da rendere piu' semplici i collegamenti

I collegamenti con Arduino sono
GND / GND
VCC / VCC (3.3V)
CSN / D10
MOSI /D11
MISO / D12
SCK / D13
GD0 / D2

Le prove sono state effettuate con la IDE 1.5.5 su Windows
E' stato seguito l'esempio riportato a questo link (Erwan's Blog) e la libreria associata  (grazie per l'aiuto)
Il primo tentativo e' miseramente fallito perche' ho modificato il programma cambiando il settaggio del baudrate dello sketch originale (da 38400 a 19200). Questa modifica la avevo effettuata perche' nel Monitor Seriale di Arduino non e' prevista la velocita' di 38400....questa insignificante modifica rendeva non funzionante lo sketch (lo ho scoperto dopo un paio di giorni e quasi per caso

Riportati gli sketch all'origine mi sono adattato a monitorare la seriale via Minicom con il comando

minicom -D /dev/ttyACM0 -b 38400

in questo modo la trasmissione e ricezione funzionano correttamente. Ma quale e' la massima distanza di trasmissione con questa libreria??
Dopo varie prove, anche invertendo le schede Arduino che fungono da trasmettitore e ricevitore oppure invertendo le antenne, il risultato e' stato identico alla prova precedente con una portata di circa 25 metri (l'RSSI parte da un valore di circa 78 con le antenne praticamente attaccate e scende a circa 100 alla massima distanza)

Viste le esperienze di altre persone che hanno mostrato trasmissioni con una distanza di oltre 200 metri mi sta venendo il dubbio che il problema sia hardware

Emettitore
-------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

CC1101 cc1101;

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 7

// counter to get increment in each loop
byte counter;
byte b;
byte syncWord = 199;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();

// reset the counter
counter=0;
Serial.println(" initializing… ");
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck();
//cc1101.setTxPowerAmp(PA_LowPower);

delay(1000);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

Serial.println(" device initialized ");
//Serial.println(" done ");
}

void send_data() {
CCPACKET data;
data.length=10;
byte blinkCount=counter++;
data.data[0]=5;
data.data[1]=blinkCount;data.data[2]=0;
data.data[3]=1;data.data[4]=0;
//cc1101.flushTxFifo ();
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);
if(cc1101.sendData(data)){
Serial.print(blinkCount,HEX);
Serial.println( " sent ok :)  ");
blinker();
}else{
Serial.println(" sent failed :( " );
blinker();
blinker();
}
}

void loop()
{
send_data();
delay(4000);
}
-------------------------------------

Ricevitore
--------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 4

// The connection to the hardware chip CC1101 the RF Chip
CC1101 cc1101;

byte b;
byte i;
byte syncWord = 199;
long counter=0;
byte chan=0;

// a flag that a wireless packet has been received
boolean packetAvailable = false;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

/* Handle interrupt from CC1101 (INT0) gdo0 on pin2 */
void cc1101signalsInterrupt(void){
// set the flag that a package is available
packetAvailable = true;
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck(); //if not specified, will only display " packet received "
//cc1101.setTxPowerAmp(PA_LowPower);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

attachInterrupt(0, cc1101signalsInterrupt, FALLING);

Serial.println(" device initialized ");
}

void ReadLQI()
{
byte lqi=0;
byte value=0;
lqi=(cc1101.readReg(CC1101_LQI, CC1101_STATUS_REGISTER));
value = 0x3F - (lqi & 0x3F);
//value = 0x3F – (lqi & 0x3F);
Serial.print(" CC1101_LQI " );
Serial.println(value);
}

void ReadRSSI()
{
byte rssi=0;
byte value=0;

rssi=(cc1101.readReg(CC1101_RSSI, CC1101_STATUS_REGISTER));

if (rssi >= 128)
{
value = 255 -rssi;
//value = 255 – rssi;
value /= 2;
value += 74;
}
else
{
value = rssi/2;
value += 74;
}
Serial.print(" CC1101_RSSI " );
Serial.println(value);
}

void loop()
{
if(packetAvailable){
Serial.println(" packet received ");
// Disable wireless reception interrupt
detachInterrupt(0);

ReadRSSI();
ReadLQI();
// clear the flag
packetAvailable = false;

CCPACKET packet;

if(cc1101.receiveData(&packet) > 0){
if(!packet.crc_ok) {
Serial.println(" crc not ok ");
}

if(packet.length > 0){
Serial.print(" packet: len " );
Serial.print(packet.length);
Serial.print( " data: " );
for(int j=0; j<packet.length; j++){
Serial.print(packet.data[j],HEX);
Serial.print( " " );
}
Serial.println(" . ");
}
}
// Enable wireless reception interrupt
attachInterrupt(0, cc1101signalsInterrupt, FALLING);
}
}


4 commenti:

  1. Molto interessante grazie....
    Io ho appena realizzato un commutatore d'antenna wireless con due moduletti (TX e RX) che mi permettono, oltre che a commutare il relè desiderato, anche di ottenere una risposta sul TX se l'operazione ha avuto buon esito(altrimenti magari si andava in trasmissione senza nessuna antenna collegata....) https://www.youtube.com/watch?v=4niN4iiDtfs .
    Questi moduli però mi piacciono di più in quanto si possono fare regolazioni serie .
    Ti chiedo una grande cortesia.... potresti indicarmi uno sketch in cui premendo un pulsante sul TX si accenda un led sull'RX? Proprio ridotto all'osso.
    Se ti serve il mio sketch del commutatore che usa VirtualWire fammelo sapere.
    Grazie mille
    Lanfranco IZ3ZLU

    RispondiElimina
    Risposte
    1. Spiacente ma non ho piu' la disponibilita' del componente (era in prestito da un amico) e quindi non posso esserle utile
      Luca

      Elimina
  2. P.S.
    Per il problema distanza coperta....
    Nel modulo TX che sto usando io avevo lo stesso problema... poi ho visto sul datasheet che può essere alimentato tra i 5 e i 12 V aumentando di conseguenza la portata... non so in questi da te utilizzati... ma ci guardo.
    Grazie

    RispondiElimina
  3. Nessun problema. Grazie lo stesso.
    Lanfranco

    RispondiElimina

Frane da drone con rete UNET

Alla ricerca di immagini di training gia' pronte per reti neurali mi sono imbattuto nel CAS Landslide Database (scaricabile da  https://...