TinyWireM und IrRemote - Probleme mit den Empfangenen Daten

Hallo zusammen

Für ein aktuelles Projekt wollte ich einen AtTiny85 als Master verwenden der die IR Signale einer Fernbedienung per I2C an einen Arduino Slave sendet.

Da ich im fertigen Projekt alle 6 PWM Pins eines Arduino Nano verwenden möchte und es deswegen mit den Timern zwischen Arduino PWM und IrRemote Library zu problemen kommt muss ich die signale der Fernbedienung über einen zweiten Microcontroller (AtTiny85) an den Nano senden.

Als I2C Testaufbau verwende ich jetzt erstmal einen UNO als Slave und den Tiny als Master um zu testen ob das mit der kommunikation zwischen den beiden geräten klappt.

Wenn ich jetzt aber den Master Scetch auf den Tiny und den SLave Scetch auf den UNO schreibe bekomme ich immer verschiedene werte vom Tiny gesendet beim drücken der Taste 1 auf der Fernbedienung.

AtTiny85 Master Code

#include <TinyWireM.h>
#include <IRremote.h>

#define TARGET_ADDR   69

int RECV_PIN = 1;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  irrecv.enableIRIn(); // Start the receiver
  TinyWireM.begin();
}

void loop() {
  if (irrecv.decode(&results)) {  
  TinyWireM.beginTransmission(69);
  requestEvent();    
  TinyWireM.endTransmission();
  irrecv.resume(); // Receive the next value
  }
  
  delay(500);  
}

void requestEvent()
{
unsigned long bigNum = results.value;
byte myArray[4];

myArray[0] = (bigNum >> 24) & 0xFF;
myArray[1] = (bigNum >> 16) & 0xFF;
myArray[2] = (bigNum >> 8) & 0xFF;
myArray[3] = bigNum & 0xFF;
 
TinyWireM.send(myArray, 4);
}

Arduino UNO Slave Code

#include <Wire.h>;
#define DEVICE_ID 69

unsigned long bigNum; 
byte a,b,c,d;


void setup()
{
Wire.begin(DEVICE_ID);
Wire.onReceive(data);
Serial.begin(9600);
}
 
void loop(){
  
Serial.println("Waiting...");
delay(500);

}


void data(int howMany) {
     
while (Wire.available() > 0) { 
      a = Wire.read();
      b = Wire.read();
      c = Wire.read();
      d = Wire.read();
      
bigNum = a;
bigNum = (bigNum << 8) | b;
bigNum = (bigNum << 8) | c;
bigNum = (bigNum << 8) | d;
Serial.println(bigNum, HEX);
Serial.println(bigNum, DEC);
  }
}

Wenn ich jetzt aber im AtTiny Code - results.value in 1234567890 änder und dann im Loop nur

  TinyWireM.beginTransmission(69);
  requestEvent();    
  TinyWireM.endTransmission();
  delay(500);

drin steht bekomme ich genau die Zahl ausgegeben die ich bei results.value geändert habe :astonished: (in diesem fall 1234567890).

Vielleicht kann mir ja einer dabei helfen :slight_smile:

Schau mal hier, da habe ich ein entsprechendes Modul vorgestellt. Zwar als Slave, aber das solltest du auch hinbekommen. Und der I2C-Master hat keine I2C-Adresse.

Hi

Was gibt denn Deine Fernbedienung an Zeichen/Codes aus? Vll. ist genau DAS Das, was die FB raus gibt.

Um Das zu verifizieren, wäre ein weiterer Arduino hilfreich, der bekannte Daten versendet - nur mit wirklich bekannten Daten kann man eine Übertragung verifizieren.

MfG

PS:Klick ist wohl gemeint (eine Seite davor)

postmaster-ino: PS:Klick ist wohl gemeint (eine Seite davor)

Ne..ne, ist der erste Beitrag nur mit UART. Der Post#314 zeigt dann den mit I2C und Sketch und Schaltbild.

Werde doch wohl meinen Beitrag kennen. ;) ;)

Danke für die Antworten :)

HotSystems: Schau mal hier, da habe ich ein entsprechendes Modul vorgestellt. Zwar als Slave, aber das solltest du auch hinbekommen. Und der I2C-Master hat keine I2C-Adresse.

So in etwa hatte ich das auch schon Programmiert, habe halt alle Ir Codes mit dem UNO ausgelesen und im AtTiny definiert. Der AtTiny empfängt aber immer unterschiedliche Daten beim wiederholten drücken einer Taste auf der Fernbedienung. Wenn ich die Daten nur mit dem UNO auslese und am Seriellen Monitor ausgebe bekomme ich immer den selben Wert angezeigt. Und mein Master hat keine Adresse, oder was meist du?

postmaster-ino: Hi

Was gibt denn Deine Fernbedienung an Zeichen/Codes aus? Vll. ist genau DAS Das, was die FB raus gibt.

Um Das zu verifizieren, wäre ein weiterer Arduino hilfreich, der bekannte Daten versendet - nur mit wirklich bekannten Daten kann man eine Übertragung verifizieren.

MfG

Die Daten die mir die Fernbedienung Liefert sind bekannt und immer identisch wenn ich sie nur mit dem UNO auslese aber mit dem Tiny klappt es nicht.

Die Daten die ich vom Tiny empfange sind immer unterschiedlich, also wenn ich taste 1 drücke kommt zb 123456 aber wenn ich Taste 1 danach nochmal drücke kommt zb 684531.

Ok...das mit der Master-Adresse hatte ich falsch gesehen. Mein Fehler.

Das der ATtiny immer andere IR-Code sieht, kann ich nicht nachvollziehen. Das habe ich bisher noch nicht gehabt.

Welche Taktfrequenz hast du auf dem Tiny ?

Edit: Ich befürchte, du hast die Anweisung "irrecv.resume();" falsch platziert.

Die Schleife mit while (wire.available() > 0) ist irgendwie unlogisch. Was passiert denn, wenn nur 3 oder 5 Bytes verfügbar sind? Wenn die Übertragung einmal aus dem Tritt gekommen ist, kommt nichts brauchbares mehr an.

HotSystems:
Welche Taktfrequenz hast du auf dem Tiny ?

Habs mit 16 ,8 und 1 MHz getestet wobei bei 1 MHz nichts durchkam. Das lag aber eventuell an einem zu hohen delay.

DrDiettrich:
Die Schleife mit while (wire.available() > 0) ist irgendwie unlogisch. Was passiert denn, wenn nur 3 oder 5 Bytes verfügbar sind? Wenn die Übertragung einmal aus dem Tritt gekommen ist, kommt nichts brauchbares mehr an.

Also das sind die Werte die ich von meiner Fernbedienung habe

long T1 = 0x97E681 ; 
long T2 = 0x96169E ;  
long T3 = 0x9516AE ;   
long T4 = 0x97168E ;   
long T5 = 0x9496B6 ;   
long T6 = 0x969696 ; 
long T7 = 0x9596A6 ;  
long T8 = 0x979686 ;  
long T9 = 0x9456BA ;
long T0 = 0x96569A ;
long r = 0x9406BF ; 
long g = 0x96069F ;  
long b = 0x9506AF ;  
long w = 0x97068F ; 
long pwr = 0x9416BE ;
long rUp = 0x9436BC ;
long rDwn = 0x96369C ;
long gUp = 0x97368C ; 
long gDwn = 0x95C6A3 ; 
long bUp = 0x9426BD ;  
long bDwn = 0x9446BB ; 
long up = 0x95B6A4 ; 
long dwn = 0x97B684;
long left = 0x96369C;
long right = 0x9536AC;
long ok = 0x95D6A2 ;

Sind alle im bereich von ~ 9,9 Millionen also ja eine long Variable

Achso und das im code (wire.available() > 0) steht hat den grund das ich nicht so viel erfahrung mit dem Programmieren habe. Aus einem Tutorial habe ich dan diesen Codeschnipsel eingefügt. Da der Code ja ansich funktioniert wenn ich nur eine klar definierte long Variable sende dachte ich das ist so richtig ;)

Inzwischen kommt mir so vieles verdächtig vor, da sollte es am besten sein, komplett nochmal von vorn anzufangen.

Ich hatte doch schon geschrieben, dein Problem liegt vermutlich an der Anweisung "irrecv.resume();" Setze die doch mal ans Ende deiner Funktion "requestEvent()".

HotSystems: Ich hatte doch schon geschrieben, dein Problem liegt vermutlich an der Anweisung "irrecv.resume();" Setze die doch mal ans Ende deiner Funktion "requestEvent()".

Hey HotSystems

Ich hatte deinen beitrag gelesen aber gestern abend keine lust mehr zu testen. Habe es aber jetzt am ende von meiner Funktion eingefügt und bekomme immer noch unterschiedliche werte :(

Dann habe ich keine Idee weiter. Außer wie DrDiettrich schon schrieb, von vorne anfangen und neu aufbauen und evtl. doch mal drüber nachdenken, ob es als Slave besser funktioniert

Ich werde mal noch ein bissl nachforschen und sollte es doch so klappen wie ich mir das vorstelle melde ich mich nochmal.

Trotzdem vielen dank für eure hilfe :)

Da ich gerade wieder mal an meiner LED-Lichterkette bastle, die auf ähnliche Weise angesteuert wird (hier nur Nano als Master Attiny85 als Slave) habe ich kurzer Hand deine beiden Sketche ausprobiert da die Hardware greifbar wahr. Denn Fehler wie von Dir beschrieben konnte ich nicht reproduzieren aber es trat auf das ich nur 2,3 manchmal auch 4oder 5 mal Werte am Nano empfing.
Daraufhin habe ich das delay im Attiny Sketch entfernt und seitdem läuft alles verlässlich.
Verwendet habe ich als Slave einen Nano ,Master einen Attiny und als IR-Empfänger einen TSOP 1838.

Gruß Thorsten

Hallo Thorsten

Danke für deinen Test. Aber wenn es bei dir funktioniert habe ich wohl etwas vergessen. Wie ist der AtTiny und IR-Empfänger denn bei dir angeschlossen? Also hast du bei dir auch Pullup widerstände auf SDA und SCL? Hast du bei deinem IR-Empfänger einen Kondensator und/oder Widerstand verbaut?

j0k3r187:
Hallo Thorsten

Danke für deinen Test. Aber wenn es bei dir funktioniert habe ich wohl etwas vergessen.

Hast du denn das “delay(500);” entfernt, wie Thorsten schrieb ?

Das habe ich eben direkt getestet, aber auch ohne delay bekomme ich keine gleichen werte.

Ich habe 5,1 k Widerstände verbaut. Welchen IR Empfänger benutzt du auch einen 1838?

Ich benutzte einen 4838 und 4,7k Pullup.