Visualizzazione post con etichetta CC1101. Mostra tutti i post
Visualizzazione post con etichetta CC1101. Mostra tutti i post

martedì 6 febbraio 2024

RF1100-232 USB

 Il piano originale era...usare CC1101 come su Flipper Zero con un dispositivo già pronto ma a basso costo..

La scelta e' caduta su qesto



In linea di principio doveva diventare il clone di Yard Stick One (a meno di 1/10 del prezzo) magari appoggiandosi su RFQuack o cc1101-tools

L'esecuzione e' stata pessima...ma andiamo con ordine

La scheda mi e' arrivata da Aliexpress senza uno straccio di istruzioni d'uso ed anche la pagina del venditore non mi era di aiuto. Collegando il dispositivo vedevo un convertitore seriale-TTL CP2012 ma inviando dati sulla /dev/ttyUSB0 nessuna risposta e tanto meno segni dal led integrato

Aprendo il case si vedono i chip CP2012, un ATMega48PA ed il CC1101 quindi dalla USB si invia comandi all'ATMega che li reinvia al CC1101 tramite SPI....tranne per il fatto  che il microcontrollore non ha un booloader Arduino (c'e' da dire che ci sono le piazzole per saldare i connettori di MISO/MOSI e SCLK quindi non tutto e' perduto per la programmabilita')








ho trovato questo vecchio link che spiega come inviare le impostazioni di trasmissione  

http://www.yesyes.info/index.php/electronics/rf1100-232-rf-433mhz-transceiver-module/

in pratica sembra che questi dispositivi non siano nati per sniffare traffico ma solo per comunicare in modo seriale..in pratica si puo' impostare il canale, la potenza e poco piu' ... niente modulazione per esempio

Frugando su GitHub ho trovato questo link

https://github.com/acontini/CC1101_USB

Avvertenza...nel rar c'e' un eseguibile windows che virustotale segnala come virus...io sono su Linux ..ci sono alcuni documenti tra cui un eseguibile in C che sembra il firmware del ATMega48PA

Nel pacchetto c'e' anche un PDF di documentazione con la mail dell'assistenza tecnica...ho provato a contattarla ma la mail e' tornata indietro...adesso il dominio sembra appartenere ad una ditta che produce occhiali (maledizione)

La scheda viene inizializzata in 9600, canale 0, massima potenza ed ID 1. Dopo di cio' c'e' un loop infinito in  cui i bytes del buffer di trasmissione vengono mandati al CC1101 con un carattere di SYNC alla fine

#include <reg52.h>
#include <intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
sfr WDT_CONTR =0Xe1; //watchdog
sbit KEY1 =P3^6; //Key1 uguale al bit 6 porta 3
sbit KEY2 =P3^7;
sbit led =P2^5;
sbit led3=P2^0;
sbit led2=P2^1;
sbit led1=P2^2;
sbit led0=P2^3;
INT8U TxBuf[4];
INT8U send_f;
//when i=100. delay=1.5ms
static void delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
}
void UART_init()
{
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
//IE =0x90;
TR1 = 1; /* Timer 1 run */
ET1 =0;
ES=1;
PS=1;
EA =1;
}
void Sendchar(unsigned char c)
{
SBUF=c;
while(TI==0);
TI=0;
}
void print_string(unsigned char* p)
{
while(*p !='\0')
{
Sendchar(*p++);
}
}
//--------------------------------------------------------------------------------------------------
// com_interrup()
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
if(RI) {
RI=0;
TxBuf[2]=SBUF;
send_f=1;
send_f=1;
led=1;
}
}
void main(void)
{
INT8U leng =0;
INT8U i,k=0;
INT8U RxBuf[4]={0};
INT8U rxcount;
INT8U TxBuf[30];
led=1;
rxcount=0xff;
TxBuf[2]=2;
TxBuf[3]=0;
UART_init();
P0=0x00;
led1=0;
for(i=0; i<30; i++)
{
TxBuf[i]=i;
}
Sendchar(0xA3); //Comandi set serial port baud rate
Sendchar(0x3A);
Sendchar(0x02); //Imposta la baudrate a 9600 (1:4800,2:9600, 3:19200)
delay(6000);
Sendchar(0xA7); //Set Channel
Sendchar(0x7A);
Sendchar(0x00); //Setta canale 0 (da 00 a 255)
delay(6000);
Sendchar(0xAB); //Set TX Power
Sendchar(0xBA);
Sendchar(0x0A); //0A :10DBM (valori permessi 00,05,07,0A)
delay(6000);
Sendchar(0xA9); //Set Module ID
Sendchar(0x9A);
Sendchar(0x00); //
Sendchar(0x01); //Due bytes : da 0 a 65535
delay(6000);
delay(6000);
// WDT_CONTR=0x3c;
while(1) //loop
{
WDT_CONTR=0x3c;
if(KEY1==0)
{
delay(10);
while(!KEY1)
{
delay(10);
}
led1=0;
print_string("abcdefghijklmnopqrstuvwxyzABCD");
led1=1;
delay(750);
for(i=0;i<23;i++)
{
Sendchar(TxBuf[i]);
}
delay(750); .
Sendchar(0x66); //carattere di SYNC
}
delay(450);
led1=1;
delay(100);
}
}

Per la configurazione vera e propria della radio ci sono indicazioni in
ma non sono riuscito a trovare il modo di far passare i comandi dalla USB verso il CC1101

per esempio nella libreria si trova per cambiare il numero di canale si usa la funzione
setChannel che scrive nel registro 0x0A il valore del canale scelto
i parametri per la configurazione visti qui sono invece 0xA7
#define CC1101_CHANNR       0x0A        // Channel number

void ELECHOUSE_CC1101::setChannel(byte ch){
chan = ch;
SpiWriteReg(CC1101_CHANNR,   chan);
}

 void ELECHOUSE_CC1101::SpiWriteReg(byte addr, byte value)
{
  SpiStart();
  digitalWrite(SS_PIN, LOW);
  while(digitalRead(MISO_PIN));
  SPI.transfer(addr);
  SPI.transfer(value);
  digitalWrite(SS_PIN, HIGH);
  SpiEnd();
}

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


mercoledì 1 gennaio 2014

CC1101 su Arduino

Mi e' stata prestata questa coppia di trasmettitori/ricevitori basati su chip Texas CC1101.
Questo componente promette bene perche' sulla scheda tecnica e' riportato un range di trasmissione di 300-500 metri in aria libera


I collegamenti sono a 7 fili (a destra i pin del CC1101,a sinistra i pin dell'Arduino)

GND / GND
VCC / VCC (3.3V)
CSN / D10
MOSI /D11
MISO / D12
SCK / D13
GD0 / D2

E' riportato che il componente lavori sia con le librerie di PanStamp che ElecHouse
Dalle mie prove (fatte su una Debian Box con l'ultima IDE di Arduino) non sono riuscito a compilare gli esempi di PanStamp (sembra a causa di un variabile definita in un header che non viene gestita dal compilatore, commentando la definizione di questa variabile relativa al risparmio energetico, lo sketch si compila ma non funziona)

Usando invece gli esempi della libreria ElecHouse tutto si compila correttamente ma da un paio di prove non sono mai riuscito a superare i 25 m di distanza di trasmissione in aria libera (a 25 m i pacchetti arrivano completi, da 25 a 30 m di distanza arrivano corrotti, oltre i 30 metri non arriva niente).
Sicuramente e' un mio errore perche' le librerie Pamstamp permettono di definire il livello di potenza della trasmissione (cosa che sembra assente in ElecHouse)

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata