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);
}
}