Hallo zusammen,
Ich suche gerade verzweifelt nach einem Weg, mit dem ATtiny Infrarot-Signale zu empfangen.
Mit dem Aduino klappt es schon, die einzige Library mit der ich zurecht komme funktioniert aber für den ATtiny nicht.
#include <IRremote.h>
IRrecv irrecv(2);
decode_results results;
int LEDwert;
void setup()
{
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.print(results.value, HEX);
Serial.print(" ");
Serial.println(results.value);
if (results.value==0x89866C49){LEDwert++;}
if (results.value==0x6183EEB8){LEDwert--;}
LEDwert = constrain(LEDwert, 0, 255);
analogWrite(9, LEDwert);
irrecv.resume();
}
}
Das Programm verändert die Helligkeit einer LED beim drücken einer Taste auf der Fernbedienung.
Und das ist eigentlich auch alles was ich vom ATtiny möchte.
So weit ich das gelesen habe liegt das Problem beim Timer0.
Es gibt sogar eine Anleitung wie man die Library umschreibt:
Aber wie stellt man das an?
Ich nutze auch nur den Arduino als ISP.
Das Problem liegt nicht beim Timer 0, sondern Timer 2, der bei der IRremote-Bibliothek verwendet wird. Timer 2 gibt es bei den Tinies nicht, also muss die Library umgeschrieben werden.
Auf der von Dir verlinkten Seite ist das GitHub-Repository verlinkt, das den veränderten Code enthält. Wenn Du den in Dein libraries-Verzeichnis packst, solltest Du Deinen Code kompilieren können, allerdings heisst die Bibliothek nicht mehr IRremote.h, sondern irrecv.h, das Interface ist nicht mehr objektorientiert, sondern plain C. All das ist notwendig, um Platz zu sparen, damit der knappe Speicher des Tiny 4313 (4k) genügt. Der ATtiny85 hat zwar 8k Flash, aber willst Du deswegen die Library nochmals umschreiben? Freu Dich, dass Du etwas mehr eigenen Code beisteuern kannst.
Das Programm verändert die Helligkeit einer LED beim drücken einer Taste auf der Fernbedienung.
... plus gibt es den Wert auf der seriellen Schnittstelle aus. Nimm das noch heraus, sonst kriegst Du mangels USART auf dem Tiny Probleme.
Den veränderten Code habe ich schon gefunden und zu den libraries hinzugefügt.
Nur beim Benutzen der neuen library werden Fehler ausgegeben, weil der Compiler die Anweisungen nicht mehr erkennt.
Gibt es denn keine einfache Möglichkeit die library Arduino-Code-tauglich zu machen?
Falls es doch noch jemanden interessiert:
Ich habe herausgefunden wie es geht, auch mit 0 Hintergrundwissen im Programmierbereich.
Es gibt da einen alternativen Weg vom Nutzer "pmalmsten": http://arduino.cc/forum/index.php/topic,17965.0.html
Demnach musste ich nur den Code anpassen und tada! Der ATtiny läuft problemlos und der Code braucht nur 1,6k.
Bittesehr:
int ir_pin = 2; //Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 1; //"Ready to Receive" flag, not needed but nice
int debug = 1; //Serial connection must be started to debug
int start_bit = 2000; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
int LEDwert;
void setup() {
pinMode(led_pin, OUTPUT); //This shows when we're ready to receive
pinMode(ir_pin, INPUT);
digitalWrite(led_pin, LOW); //not ready yet
//Serial.begin(9600);
digitalWrite(0, HIGH);
}
void loop() {
int key = getIRKey(); //Fetch the key
if (key != -1) {
//Serial.print("Key Recieved: ");
//Serial.println(key);
if (key < 755 && key > 750){LEDwert++;}
if (key < 2805 && key > 2795){LEDwert--;}
}
analogWrite(0, constrain(LEDwert, 0, 255));
}
int getIRKey() {
int data[12];
digitalWrite(led_pin, HIGH); //Ok, i'm ready to recieve
while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
}
data[0] = pulseIn(ir_pin, LOW); //Start measuring bits, I only want low pulses
data[1] = pulseIn(ir_pin, LOW);
data[2] = pulseIn(ir_pin, LOW);
data[3] = pulseIn(ir_pin, LOW);
data[4] = pulseIn(ir_pin, LOW);
data[5] = pulseIn(ir_pin, LOW);
data[6] = pulseIn(ir_pin, LOW);
data[7] = pulseIn(ir_pin, LOW);
data[8] = pulseIn(ir_pin, LOW);
data[9] = pulseIn(ir_pin, LOW);
data[10] = pulseIn(ir_pin, LOW);
data[11] = pulseIn(ir_pin, LOW);
digitalWrite(led_pin, LOW);
if(debug == 1) {
//Serial.println("-----");
}
for(int i=0;i<=11;i++) { //Parse them
if (debug == 1) {
//Serial.println(data[i]);
}
if(data[i] > bin_1) { //is it a 1?
data[i] = 1;
} else {
if(data[i] > bin_0) { //is it a 0?
data[i] = 0;
} else {
data[i] = 2; //Flag the data as invalid; I don't know what it is!
}
}
}
for(int i=0;i<=11;i++) { //Pre-check data for errors
if(data[i] > 1) {
return -1; //Return -1 on invalid data
}
}
int result = 0;
int seed = 1;
for(int i=11;i>=0;i--) { //Convert bits to integer
if(data[i] == 1) {
result += seed;
}
seed = seed * 2;
}
return result; //Return key number
}
Man kann da natürlich noch eine Menge rauskürzen in Sachen Debug. Aber ich bin froh dass es läuft, auch ohne C und Librarys.