nRF24L01 mehrere Variablen?
Hallo,
wollte fragen wie man mehrere Variablen an einen nRF2401L schicken kann. Uns war möchte ich ein ferngesteuertes Boot bauen, aber da ich einen Motor und einen Servo habe, brauche ich auch 2 Potentiometer welche an A5 und A4 angeschlossen sind.
Problem: Ich habe beide angeschlossen, aber wenn ich sie mit dem Befehl(siehe Anhang) an den nRF sende bekomme ich am Reciver eine Variable welche beide Werte abwechselnd ausgibt. -> ich bräuchte aber 2 Variablen z.B _servoData und _motorData da ich den servo so ansteuere: servo.write(_data). <- Das geht aber nicht, da _data beide Potentiometer ausgibt also immer z.B (siehe unten)
Und jetzt wollte ich fragen ob man das irgendwie in 2 Variablen machen kann?
Danke im Vorraus!
Serial Monitor von _data
93
255
93
255
93
255
Befehl:
PS: Verwende 2 Arduino UNOs
1 Antwort
Brauchst du die volle Auflösung von 8 bit ? Wenn du auch mit 7 auskommen könntest, könntest du das letzte Bit für _servoData immer 0 senden und das letzte Bit von _motorData immer 1. Dann kannst du beim Senden "&_servoData & 0xFE" und "&_motorData | 1", um die Bits passend zu setzen. Im Empfänger braucht es dann nur ein "if (_data & 1) motor.write(_data) else servo.write(_data);".
Wenn du die volle Auflösung von 8 bit brauchst, musst du 3 Bytes senden und ein bisschen Bits schieben. Dann eben z.b. die ersten 2 Bit als Kennzeichnung und restlichen 6 Bit als Nutzdaten. Bleiben 2 Bit unbenutzt. Also z.b.
Byte 1: 0 0 s7 s6 s5 s4 s3 s2
Byte 2: 0 1 s1 s0 m7 m6 m5 m4
Byte 3: 1 0 m3 m2 m1 m0 0 0
byte tosend[2];
tosend[0] = servo>>2;
tosend[1] = 0x40 + ((servo & 0x3) <<4 ) + (motor>>4)
tosend[2] = 0x80 + (motor & 0xf) << 2;
Wenn du dann byteweise (e) emfängst, musst du prüfen und mitzählen, ob du alles empfangen hast (complete):
byte complete=0, servov=0, motorv=0;
while(recv(&e)) {
if ((e&0xc0)==0) { servov = (servov & 0x3) | (e>>2);complete = complete | 1; }
if ((e&0xc0)==0x40) { servov = (servov & 0xfc) | ((e>>4) & 0x3);motorv = (motorv & 0xf) | (e<<4); complete = complete | 2; }
if ((e&0xc0)==0x80) { motorv = (motorv & 0xf0) | ((e>>2) & 0xf);complete = complete | 4; }
if (complete==7) { complete=0;servo.write(servo,write(servov); motor.write(motorv); }
}
PS: Der Code ist nicht ausprobiert und nur so ungefähr. & = Bitweises UND, | = Bitweises ODER, << Schieben nach links, >> Schieben nach rechts.
Okay vielen Dank probiers heute dann auch gleich aus. Und ich glaube ich komme mit den 7 bytes völlig aus