Go Down

Topic: moduli rf 433  (Read 3803 times) previous topic - next topic

Gianluca9779

Salve a tutti
vi pregherei di aiutarmi nel riuscire a modulare ciò che ricevo rimappato per 0,255 in modo da aumentare l'intensità del led..
ma ciò non funziona poichè si accende solo a 255 come mai dove sbaglio ecco i codici


RX
#include <VirtualWire.h>
int Lettura;
unsigned long Tmemoria;
int led =  10;
int Letturadef;

int fadeAmount = 5;   
void setup() {
Serial.begin(9600) ;
 pinMode(led, OUTPUT);

vw_set_rx_pin(2);


vw_setup(2000);
vw_rx_start();
}


void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Lettura = (int(buf[1]<<8)+buf[0]);
}

Letturadef = map(Lettura,0,1023,0,255);
analogWrite(led, Letturadef);



Serial.print("Lettura= ");
Serial.println(Letturadef);




}






TX

#include <VirtualWire.h>

void setup() {
vw_set_tx_pin(2);
vw_setup(2000);
}

void loop() {

int Lettura =map (analogRead(A0),510,1023,0,1023);
/* si possono inviare soltanto valori compresi tra
  0 e 255 per tanto bisogna dividere la variabile in 2 parti
 trasformare quindi in byte----> trasmettere---->
 riconvertire...
 char msg[2] è una variabile di tipo vettore
 
*/
byte Lettura1 = Lettura&0xFF;
byte Lettura2=(Lettura&0xFF00)>>8;
char msg[2] = {Lettura1,Lettura2};
digitalWrite(13, HIGH);
vw_send((uint8_t *)msg, 2 );
vw_wait_tx();
digitalWrite(13, LOW);

}

nid69ita

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
my name is IGOR, not AIGOR

Gianluca9779

Ora riesco a mandare i valori usando questo codice però non riesco a modulare l'intensità del led qualcuno a qualche idea ??

Code: [Select]

//tx

#include <VirtualWire.h>
int Letturadef;
int Lettura;
void setup() {
 Serial.begin(9600);
vw_set_tx_pin(2);
vw_setup(2000);
}

void loop() {

Lettura =map (analogRead(A0),510,1023,0,1023);
Letturadef = map(Lettura,0,1023,0,255);

byte Lettura1 = Letturadef&0xFF;
byte Lettura2=(Letturadef&0xFF00)>>8;
char msg[2] = {Lettura1,Lettura2};
digitalWrite(13, HIGH);
vw_send((uint8_t *)msg, 2 );
vw_wait_tx();
digitalWrite(13, LOW);
delay (200);
Serial.print("Lettura= ");
Serial.println(Letturadef);
}


per ricevere

Code: [Select]


#include <VirtualWire.h>
int Lettura;
unsigned long Tmemoria;
int led =  10;   
void setup() {
Serial.begin(9600) ;
pinMode(led, OUTPUT);
vw_set_rx_pin(2);
vw_setup(2000);
vw_rx_start();
}
void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Lettura = (int(buf[1]<<8)+buf[0]);
}
analogWrite(led, Lettura);
Serial.print("Lettura= ");
Serial.println(Lettura);
delay(200);
}


Gianluca9779

Ho sbagliato qualcosa nella funzione map ???

nid69ita

#5
Jul 08, 2015, 11:39 am Last Edit: Jul 08, 2015, 11:44 am by nid69ita
Direi che qualcosa nella logica non è giusto.
Se il trasmittente riporta i valori tra 0-1023 a valori tra 0-255, a che serve spedire 2 byte ?

Il rx riceve il valore corretto ? Hai verificato su Monitor Seriale ?

Quando trasmetti, perchè usi 2 map ?
Code: [Select]
Lettura = map(analogRead(A0),510,1023,0,1023);
Letturadef = map(Lettura,0,1023,0,255);

Basta una sola map:
Code: [Select]
Letturadef = map(analogRead(A0),0,1023,0,255);
Per "costringere" un valore in un range 510->1023 esiste la constrain()
https://www.arduino.cc/en/Reference/Constrain
my name is IGOR, not AIGOR

Gianluca9779

Uso due map perché il mio joystick quando parte dal centro non mi da 0 ma 512 e quindi mi serve il primo map per farmi risultare il centro 0 e il secondo per gestire i valori da 255 a 0 a - 255
ho provato a mandare una sola variabile ma mi sfalsa i valori..

Gianluca9779

Poi i valori li ricevo completamente giusti sia quelli che invio corrispondono a quelli che ricevo..
Il led invece si accende solo a 255 a 254 è spento..

nid69ita

Quale scheda Arduino ?  Come hai collegato il led ?
my name is IGOR, not AIGOR

Gianluca9779

Allora utilizzo arduino uno per ricevere i dati e ho collegato al Pin 10 il led essendo un Pin pwm e per trasmettere utilizzo una scheda arduino nano

nid69ita

Led normale ? Di che colore ? sul pin nessuna resistenza ? 
my name is IGOR, not AIGOR

Gianluca9779

il led è normalissimo di colore verde con nessuna resistenza attaccata...

eseguendo passo passo istruzione per istruzione il problema nasce sia dal trasmettitore che dal ricevitore infatti le funzioni che lo fanno impestare sono

Code: [Select]


vw_setup(1000);//
vw_send((uint8_t *)msg, 1 );
vw_wait_tx(); //



Appena le introduco funziona tutto male..

nid69ita

#12
Jul 09, 2015, 09:28 am Last Edit: Jul 09, 2015, 09:38 am by nid69ita
1. MAI mettere un led senza resistenza.
I led a secondo del colore e dei Volt DEVONO avere una resistenza adeguata al massimo numero di mA che sopportano, di solito 20mA sono il max.
Per un led verde e i 5V di Arduino metti una R da 180ohm
Ti allego tabella volt/led/resistenze

2. potrebbe essere che quella libreria lavora con uno dei timer interni.
I pin quando in PWM lavorano associati ai timer. Prova ad esempio ad usare un altro pin, esempio il 3

http://www.airspayce.com/mikem/arduino/VirtualWire/
Qui dice: "Caution: ATTiny85 has only 2 timers, one (timer 0) usually used for millis() and one (timer 1) for PWM analog outputs. The VirtualWire library, when built for ATTiny85, takes over timer 0, which prevents use of millis() etc but does permit analog outputs."

Ma anche Arduino Uno ha solo 4 timer.
http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/
my name is IGOR, not AIGOR

Gianluca9779

Appena arrivo a casa ti saprò dire grazie mille :)

Gianluca9779

Allora ho buone notizie e cattive notizie il pin 3 è quello giusto quindi per modulare il segnale bisogna connetterlo li..
invece la cattiva e che come muovo il potenziometro si blocca la ricezione..

Go Up