Go Down

Topic: "Copiare" un segnale dati. (Read 2 times) previous topic - next topic

Guglio

Ciao a tutti, ho un telecomando per comandare alcuni relè remoti che al momento sto cercando di comandare con diversi otpoisolatori.
Il funzionamento del telecomando è alquanto cervellotico perchè funziona per combinazioni di diversi fili e non sembra il classico "pin messo a GND".

Quindi pensavo di aggirare il problema alla radice: visto che nel telecomando sono segnati i pin VCC, GND, e DATA del modulo TX, se saldo due fili al gnd e data c'è modo di riuscire a campionare il segnale di ogni pulsante e riprodurlo?

Il telecomando è alimentato a 9 volt e il modulo TX ha il VCC in serie con un piccolo led quindi immagino che anche il segnale data sia > 5volt.
Posso campionarlo con un software per il pc? (collegando il data al microfono?)
Come faccio a fare l'output dell' onda? Basta misurare la distanza fra i diversi impulsi?

Grazie ;)
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

dr4gone

perchè non te ne costrusci uno tu con un microcontrollore?

Io in teoria ho intenzione di fare la stessa cosa...
prendi un atmega lo programmi e lo metti su una basetta standalone, aggiungi il quarzo e i condensatori, una batteria piccola per l'alimentazione e dei bottoni da collegare ai pin del microcontrollore. Dopo con un modulo RF TX trasmetti all'arduino o a quello che devi trasmettere un comando alla pressione di ogni pulsante,,, Il ricevitore riceve, e in base a quello che riceve aziona i vari relè..

Non ti va bene una cosa del genere?

Guglio

Ma devo prima cercare di capire che impulso manda il telecomando al tx..
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

dr4gone

#3
Mar 15, 2011, 08:19 am Last Edit: Mar 15, 2011, 08:21 am by dr4gone Reason: 1
non credo di arrivarci..

Se il telecomando te lo fai tu, e il ricevitore lo fai tu.. sei tu che decidi cosa il telecomando manda e quindi riceve...

Ad esempio.. Se tu dici al microcontrollore sul telecomando: alla pressione del bottone1 , scrivi sul PIN del trasmettitore una stringa con newsoftserial, e quindi con il myserialprint verrà ricevuta dall'altro microcontrollore e decodificata per azionare quello che ti serve..

In toeria è molto semplice, e decidi tu cosaa trasmattere.
Il problema è che questa per ora è solo teoria perchè ancora i moduli RF a distanza di 20 giorni non mi sono arrivati per fare le prove.

Guglio

Sì ma le riceventi sono già fatte, confezionate e funzionanti.
Dovrei cambiare tutta l'elettronica delle RX visto che sono fatte con integrati ricoperti dalla classica pallina nera di resina!

Io devo capire come clonare il segnale che modula l'integrato del telecomando che viene mandato al TX (che è sempre presente nel telecomando ed è facilmente estraibile)
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

dr4gone

ok allora informaci dei progressi fatti :D

Io no nappena arrivano i miei modulini farò altrettanto

Michele Menniti


Sì ma le riceventi sono già fatte, confezionate e funzionanti.
Dovrei cambiare tutta l'elettronica delle RX visto che sono fatte con integrati ricoperti dalla classica pallina nera di resina!

Io devo capire come clonare il segnale che modula l'integrato del telecomando che viene mandato al TX (che è sempre presente nel telecomando ed è facilmente estraibile)

Ciao,
se il segnale esce su un uno filo "data" probabilmente sarà un treno di impulsi; concettualmente ti dovrebbe bastare applicarlo ad un pin digitale (o forse sul seriale) dell'Arduino e leggere la sequenza di stati high e low, non credo che un telecomando invii segnali ad una velocità superiore ai tempi di lettura di Arduino. Questa è l'idea, io me la cavo di più con l'elettronica che con la programmazione, essendo alle prime armi, ma ci sono tanti bravi che certamente ti posteranno un codice di partenza, senza prenderti per i fondelli...
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

il metodo esposto da menniti è valido, basta attaccare il data ad un pin e poi usare pulseIn() per sapere la durata del segnale alto/basso.
Se poi la durate risulta > 100microsec allora puoi attaccare data ad un pin analogico e usare analogread() per essere sicuro che  l'output sia digitale e non analogico.

Il codice in entrambi i casi è semplicissimo, nel loop fai una lettura, serial.println() e fine :-)

tra l'altro con questo codice  puoi "catturare" i vari codici del telecomando in base al tasto premuto.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Guglio

Una cosa del genere?

Code: [Select]

void setup()
{
 pinMode(pin, 7);
Serial.begin(9600);
}

void loop()
{
unsigned long duration;
Serial.print("Loop ");
Serial.println(millis());
duration = pulseIn(7, HIGH);
Serial.println(duration);
}



Al momento non riesco a provarlo perchè non ho la punta del saldatore  :smiley-mr-green: :smiley-mr-green: rimando a domani
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Michele Menniti

#9
Mar 15, 2011, 04:49 pm Last Edit: Mar 15, 2011, 04:51 pm by menniti Reason: 1
Quote

Una cosa del genere?

Code: [Select]

void setup()
{
  pinMode(pin, 7);
Serial.begin(9600);
}




Forse è:
Code: [Select]

int pin = 7;               

void setup()
{
  pinMode(pin, INPUT);
...........
}

ma potrei sbagliarmi :~
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Guglio

Ok, ho usato questo codice:


Code: [Select]

void setup()
{
  pinMode(7, INPUT);
Serial.begin(9600);
}

void loop()
{
unsigned long duration;
Serial.print("Millis: ");
Serial.print(millis());
Serial.print(" pulse: ");
duration = pulseIn(7, HIGH);
Serial.println(duration);
}



Ed ho campionato lo stesso tasto 3 volte e mi saltano fuori 3 cose diverse....

Code: [Select]

Millis: 2184 pulse: 669
Millis: 2239 pulse: 722
Millis: 2266 pulse: 675
Millis: 2362 pulse: 722
Millis: 2388 pulse: 676
Millis: 2484 pulse: 727



Millis: 5782 pulse: 669
Millis: 6304 pulse: 722
Millis: 6331 pulse: 669
Millis: 6427 pulse: 722
Millis: 6454 pulse: 669
Millis: 6549 pulse: 722
Millis: 6576 pulse: 669
Millis: 6671 pulse: 722



Millis: 9970 pulse: 674
Millis: 10542 pulse: 729
Millis: 10568 pulse: 675
Millis: 10664 pulse: 728
Millis: 10691 pulse: 669
Millis: 10786 pulse: 721
Millis: 10814 pulse: 676
Millis: 10909 pulse: 729
Millis: 10936 pulse: 675
Millis: 11031 pulse: 728
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Guglio

Ho cambiato script...
sto provando con:

Code: [Select]

void setup()
{
pinMode(7, INPUT);
Serial.begin(9600);
}


void loop()
{
unsigned long high;
unsigned long low;

high = pulseIn(7, HIGH);
low = pulseIn(7, LOW);

Serial.print("HIGH: ");
Serial.print(high);
Serial.print("    LOW: ");
Serial.println(low);
}



E ho come risultato con lo stesso bottone questo:

Code: [Select]

HIGH: 669    LOW: 643
HIGH: 721    LOW: 642
HIGH: 668    LOW: 649
HIGH: 722    LOW: 649
HIGH: 669    LOW: 642
HIGH: 721    LOW: 643


HIGH: 669    LOW: 649
HIGH: 722    LOW: 649
HIGH: 668    LOW: 648
HIGH: 722    LOW: 648
HIGH: 669    LOW: 642
HIGH: 722    LOW: 643


HIGH: 668    LOW: 642
HIGH: 722    LOW: 642
HIGH: 669    LOW: 642
HIGH: 722    LOW: 642
HIGH: 674    LOW: 642
HIGH: 722    LOW: 642






Quindi sto provando questo script:

Code: [Select]

void setup()
{
pinMode(7, OUTPUT);

}
void loop()
{
 
  /*
HIGH: 668    LOW: 642
HIGH: 722    LOW: 642
HIGH: 669    LOW: 642
HIGH: 722    LOW: 642
HIGH: 674    LOW: 642
HIGH: 722    LOW: 642
*/

digitalWrite(7,HIGH);
delayMicroseconds(668);
digitalWrite(7,LOW);
delayMicroseconds(642);


digitalWrite(7,HIGH);
delayMicroseconds(722);
digitalWrite(7,LOW);
delayMicroseconds(642);

digitalWrite(7,HIGH);
delayMicroseconds(669);
digitalWrite(7,LOW);
delayMicroseconds(642);

digitalWrite(7,HIGH);
delayMicroseconds(722);
digitalWrite(7,LOW);
delayMicroseconds(642);

digitalWrite(7,HIGH);
delayMicroseconds(674);
digitalWrite(7,LOW);
delayMicroseconds(642);

digitalWrite(7,HIGH);
delayMicroseconds(722);
digitalWrite(7,LOW);
delayMicroseconds(642);
delay(2000);

}



Senza risultati.
Il led del telecomando lampeggia molto più velocemente rispetto a quando premo normalmente un bottone..
Significa che c'è qualche tempo sballato ma non so dove!!

Idee?
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

lesto

1. stai lavorando in microsecondi, le serial ti rallentano troppo. campiona in un array più valori e a fine campionamento stampale.
2. qual'è il campionamento senza tasti premuti, con tasto premuto e con altro tasto premuto
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

jumpjack


Posso campionarlo con un software per il pc? (collegando il data al microfono?)

Credo si possa fare, se sei sicuro che il voltaggio massimo non frigga tutto...
http://jumpjack.wordpress.com/2008/05/20/worlds-cheapest-remote-control-replicator-just-1/

Usa Audacity 1.2 per campionare:; le versioni successive non mostrano i millisecondi.
http://audacity.sourceforge.net/

Guglio

Ciao Jumpjack, se uso il tuo metodo poi devo trascrivere manualmente i valori nel codice dell'arduino o utilizzare un pc per comandare la scheda.


Ho usato il codice trovato qua per campionare il segnale: http://www.ladyada.net/learn/sensors/ir.html

Ho come risultato
Code: [Select]


Ready to decode IR!



Received:

OFF ON

0 usec, 17572 usec
660 usec, 1280 usec
720 usec, 640 usec
1360 usec, 1300 usec
720 usec, 1300 usec
700 usec, 640 usec
1360 usec, 640 usec
1360 usec, 660 usec
1360 usec, 640 usec
1380 usec, 640 usec
1360 usec, 640 usec
1380 usec, 640 usec
1360 usec, 640 usec
1360 usec, 1300 usec
720 usec, 640 usec
1360 usec, 640 usec
1360 usec, 1300 usec
740 usec, 640 usec
1360 usec, 640 usec
1360 usec, 1300 usec
720 usec, 1280 usec
680 usec, 13404 usec
660 usec, 1300 usec
700 usec, 640 usec
1380 usec, 1280 usec
720 usec, 1300 usec
700 usec, 640 usec
1380 usec, 620 usec
1380 usec, 640 usec
1360 usec, 640 usec
1400 usec, 620 usec
1380 usec, 640 usec
1360 usec, 640 usec
1360 usec, 640 usec
1380 usec, 1280 usec
720 usec, 640 usec
1360 usec, 640 usec
1380 usec, 1280 usec
740 usec, 640 usec
1360 usec, 640 usec
1380 usec, 1280 usec
720 usec, 1300 usec
660 usec, 13364 usec
660 usec, 1300 usec
700 usec, 640 usec
1380 usec, 1280 usec
720 usec, 1300 usec
700 usec, 640 usec
1380 usec, 620 usec
1380 usec, 640 usec
1360 usec, 640 usec
1400 usec, 620 usec
1380 usec, 620 usec
1380 usec, 640 usec
1360 usec, 640 usec
1380 usec, 1280 usec
720 usec, 640 usec
1360 usec, 640 usec
1360 usec, 1300 usec
740 usec, 640 usec
1360 usec, 640 usec
1380 usec, 1280 usec
720 usec, 1300 usec




Solo che se provo a portare ad high e low il pin data con quei valori non funge.. (Ho fatto fare il pharse dell' output della seriale da uno script quindi dubito che ci possano essere valori sballati)
Code: [Select]

int IRledPin = 13;
void setup(){
  pinMode(IRledPin, OUTPUT);     
}

void loop() {
digitalWrite(IRledPin, LOW);
delayMicroseconds(0);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(17572);
digitalWrite(IRledPin, LOW);
delayMicroseconds(660);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(700);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(660);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(740);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(680);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(13404);
digitalWrite(IRledPin, LOW);
delayMicroseconds(660);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(700);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(700);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(620);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1400);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(620);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(740);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(660);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(13364);
digitalWrite(IRledPin, LOW);
delayMicroseconds(660);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(700);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(700);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(620);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1400);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(620);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(620);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);
digitalWrite(IRledPin, LOW);
delayMicroseconds(740);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1360);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(640);
digitalWrite(IRledPin, LOW);
delayMicroseconds(1380);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1280);
digitalWrite(IRledPin, LOW);
delayMicroseconds(720);
digitalWrite(IRledPin, HIGH);
delayMicroseconds(1300);         
digitalWrite(IRledPin, LOW);   ///// RIPORTO IL VALORE DEL PIN A LOW
delay(2000);
}
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Go Up