Guten Abend,
ich plane mithilfe eines Attiny45/85 ein Relais über IR zu steuern.
Zum Einsatz kommt ein 38kHz Empfänger.
Zu Testzwecken habe ich auf einem Arduino Uno bereits ein paar Tests
durchgeführt. Zum Einsatz kamen dabei die IRremote.h und tiny_IRremote.h
Library, welche auch einwandfrei funktioniert.
Möchte ich dasselbe auf dem Attiny probieren, funktioniert garnichts
mehr.
Ich hab dafür alle Methoden probiert, die im Internet standen, sprich
verschieden Libraries für Attiny installiert, verschiedene
Taktfrequenzen, verschiedene Pinbelegungen, verschiedene Spannungslevel
usw.
Haupstächlich habe ich mich auf diese Tutorials konzentriert:
https://www.instructables.com/Attiny-IR-library/https://www.instructables.com/Attiny-IR-library/
(Test-)Sketches habe ich u.A. folgende verwendet:
1
#include"IRremote.h"
2
3
intreceiver=0;// Signal Pin of IR receiver to Arduino Digital Pin 11
4
5
/*-----( Declare objects )-----*/
6
IRrecvirrecv(receiver);// create instance of 'irrecv'
7
decode_resultsresults;// create instance of 'decode_results'
8
9
/*-----( Function )-----*/
10
voidtranslateIR()// takes action based on IR code received
11
12
// describing Remote IR codes
13
14
{
15
16
switch(results.value)
17
18
{
19
case0xFFA25D:digitalWrite(4,HIGH);
20
break;
21
case0xFFE21D:digitalWrite(4,LOW);
22
break;
23
24
default:
25
{
26
27
}
28
29
}// End Case
30
31
delay(500);// Do not get immediate repeat
32
33
34
}//END translateIR
35
voidsetup()/*----( SETUP: RUNS ONCE )----*/
36
{
37
pinMode(4,OUTPUT);
38
pinMode(2,INPUT);
39
40
irrecv.enableIRIn();// Start the receiver
41
42
}/*--(end setup )---*/
43
44
45
voidloop()/*----( LOOP: RUNS CONSTANTLY )----*/
46
{
47
if(irrecv.decode(&results))// have we received an IR signal?
48
49
{
50
translateIR();
51
irrecv.resume();// receive the next value
52
}
53
}/* --(end main loop )-- */
Und
1
#include<IRremote.h>
2
3
intRECV_PIN=0;
4
intled1=1;
5
intled2=4;
6
7
intstate[]={0,0,0};
8
9
#define code1 0xFFA25D // Button 1 Code
10
#define code2 0xFFE21D // Button 2 Code
11
12
13
IRrecvirrecv(RECV_PIN);
14
15
decode_resultsresults;
16
17
voidsetup()
18
{
19
irrecv.enableIRIn();
20
pinMode(led1,OUTPUT);
21
pinMode(led2,OUTPUT);
22
23
}
24
25
voidloop(){
26
if(irrecv.decode(&results)){
27
unsignedintvalue=results.value;
28
switch(value){
29
casecode1:
30
if(state[1]==1){// if first led is on then
31
digitalWrite(led1,LOW);// turn it off when button is pressed
32
state[1]=0;// and set its state as off
33
}else{// else if first led is off
34
digitalWrite(led1,HIGH);// turn it on when the button is pressed
35
state[1]=1;// and set its state as on
36
}
37
break;
38
39
}
40
irrecv.resume();
41
}
42
}
Ich bin echt schon am verzweifeln und wäre so dankbar, wenn mir da
jemand weiterhelfen könnte...
[ Weiß nicht ob das relevant ist aber beim IR-Pin messe ich (leider ohne
Oszilloskop) bei VCC=5V ohne Signal 5V und bei anliegendem Signal ca
4-4,7V ]
Lukas G. schrieb:> int receiver = 0; // Signal Pin of IR receiver to Arduino Digital Pin 11
Ich bin sicher kein Arduino Spezi, aber war das nicht so, das die Ports
für PortA von 0-7 gingen? Da der Tiny nur PortB hat, könnte für PB0 also
eine andere (wie z.B. 8) Zahl stehen.
Aber wie dem auch sei, du suchst sicher IRMP:
https://www.mikrocontroller.net/articles/IRMP
IRMP ist eine robuste Lösung, um alle möglichen IR Fernbedienungen zu
empfangen. Das Gegenstück heisst IRSND und ist genauso zuverlässig.
Um Platz zu sparen, kompilierst du nur das Protokoll, das du brauchst.
Ausserdem läuft es bestens auf einem Tiny45/85, wie ich dir aus eigener
Erfahrung sagen kann.
Lukas G. schrieb:> [ Weiß nicht ob das relevant ist aber beim IR-Pin messe ich (leider ohne> Oszilloskop) bei VCC=5V ohne Signal 5V und bei anliegendem Signal ca> 4-4,7V ]
Das Multimeter misst einen Mittelwert, d.h. das Absinken der Spannung
bei anliegendem Signal verrät dir wahrscheinlich, dass das Signal
zeitweise auf L-Pegel liegt.
Für Probleme rein digitaler Natur brauchst du nicht unbedingt ein Oszi.
Ein Logikanalysator kann gerade bei Datenübertragung und Timingfrage
fast noch besser helfen. Mit den kleinen 8-Kanal LA für unter 10..15 €
kommt man oft recht weit.
Bei so einem Tiny 25..85 halte ich C für Overkill, aber das ist nur
meine MEINUNG.
Du benutzt eine IR-Library, der man doch bestimmt mitteilen muss,
wo das IR-Signal reinkommt wie die IR-Codes aussehen.
Diese Zeilen könnten dem Compiler sagen, was IN, was OUT sein soll,
obwohl es mich wundert, woher der Compiler wissen soll, ob PortA, PortB,
oder PortC gemeint sind.
>> pinMode(4,OUTPUT); Relais???>> pinMode(2,INPUT); IR-Receiver???
aber weiß das damit auch deine IR-Library??
>> case 0xFFA25D: digitalWrite(4,HIGH);
Soll das die Relais-Ausgabe sein?
Woher kennst du ohne Oszi den IR-Code?
Fang doch mal damit an, der IR-Library den Anschluss des IR-Receivers
mitzuteilen - und lass eine LED z.B. an PortB-0 aufleuchten, wenn grad
was empfangen wurde.
Kuno schrieb:> aber weiß das damit auch deine IR-Library??
Muss sie wissen, sonst würde es am UNO auch nicht funktionieren
Kuno schrieb:> Woher kennst du ohne Oszi den IR-Code?
Gibt ja diverse NEC Decoder Sketches, die mir dann den HEX Code
rausspucken
Ich hab mir jetzt die IRMP-Library angeschaut mit dem darin enthaltenen
Beispielsketch 'MinimalReceiver' der ja speziell für Attinys geeignet zu
sein scheint.
Ich versteh jetzt nicht ganz wie ich damit umgehen soll. In Zeile 72
kann ich ja meinen eigenen Code einfügen. Aber was soll der jetzt alles
beinhalten wenn ich als Beispielcode den erstangeführten Sketch in der
Fragestellung hernehme?
1
/*
2
* MinimalReceiver.cpp
3
*
4
* Small memory footprint and no timer usage!
5
*
6
* Receives IR protocol data of NEC protocol using pin change interrupts.
7
* On complete received IR command the function handleReceivedIRData(uint16_t aAddress, uint8_t aCommand, bool isRepetition)
8
* is called in Interrupt context but with interrupts being enabled to enable use of delay() etc.
9
* !!!!!!!!!!!!!!!!!!!!!!
10
* Functions called in interrupt context should be running as short as possible,
11
* so if you require longer action, save the data (address + command) and handle it in the main loop.
12
* !!!!!!!!!!!!!!!!!!!!!
13
*
14
*
15
* Copyright (C) 2020-2021 Armin Joachimsmeyer
16
* armin.joachimsmeyer@gmail.com
17
*
18
* This file is part of IRMP https://github.com/ukw100/IRMP.
19
* This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
20
*
21
* IRMP is free software: you can redistribute it and/or modify
22
* it under the terms of the GNU General Public License as published by
23
* the Free Software Foundation, either version 3 of the License, or
24
* (at your option) any later version.
25
*
26
* This program is distributed in the hope that it will be useful,
27
* but WITHOUT ANY WARRANTY; without even the implied warranty of
28
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29
* GNU General Public License for more details.
30
*
31
* You should have received a copy of the GNU General Public License
32
* along with this program. If not, see <http://www.gnu.org/licenses/gpl.html>.
1. Nimm die standard IRremote library und nicht irgendwelche
abgehangenen Zips aus dubiosen Quellen.
2. Im IRMP Beispiel schalte dein Relay einfach da, wo jetzt die serielle
Ausgabe steht Zeile 94 ff. und fertig. Und der Loop langweilt sich eben!
So jetzt hab ich den SimpleReceiver Sketch von IRMP genommen, die
Definitionen für die anderen Boards rausgenommen und zuerst über den UNO
probiert, da hats funktioniert, dann hab ich den exakt gleichen Code auf
den Attiny geladen, mit den richtigen Pinbelegungen und es funktioniert
wieder nicht...
Hier mal der Code:
1
#include<Arduino.h>
2
3
4
#include"PinDefinitionsAndMore.h"
5
#include<irmpSelectMain15Protocols.h> // This enables 15 main protocols
Wie ich oben schon mal sagte, liegt es mit Sicherheit an den Nummern,
die Arduino statt anständiger Portbezeichnungen benutzt. Wie z.B. kommt
man darauf, das Nummer 11 der Port A3 sein soll?
Der Tiny hat nur PortB 0 - 4 (5 nicht benutzen) und darauf muss man die
Software einstellen. Normalerweise macht man das in der irmpconfig.h,
aber bei dem Arduino Kram kann ich es dir nicht sagen. Finde das heraus
und alles wird spielen. Lass dir am besten seriell auch mal die Adresse
deiner Fernbedienung sagen.
Lukas G. schrieb:> die> Definitionen für die anderen Boards rausgenommen und zuerst über den UNO> probiert, da hats funktioniert, dann hab ich den exakt gleichen Code auf> den Attiny geladen
Rausnehmen ist normalerweise nicht nötig, denn das erkennt IRMP von
alleine. Für den Tiny45/85 wird bei IRMP Timer 1 benutzt, aber der ist,
soweit ich weiss beim Arduino Zeug mit dem millis() besetzt. Das wird
IRMP für Arduino aber wissen. Lass also die Defintionen drin, damit IRMP
das Setup hinbekommt.
Stefan ⛄ F. schrieb:> Das steht in einer Header Datei vom verwendete Arduino Core.
Schönen Dank auch. So eine Hürde hätte ich ja nicht erwartet. Was soll
das wohl?
Denke bitte dran, den Tiny auf 8Mhz zu fusen, also die CKDIV/8 Fuse zu
löschen. Der IRQ für IRMP feuert pro Sekunde 15000 mal, profitiert also
von den 8MHz Tiny Takt.
Lukas G. schrieb:> # define IRMP_PORT_LETTER PB4> # define IRMP_BIT_NUMBER 6
Du bist ja ein Spassvogel. Als Port Letter sollte da nur ein B stehen
und Port B6 gibt es beim Tiny gar nicht, denn der hat nur Port B0 bis
PortB4 (PortB5 ist der Reset pin und ein Sonderfall.
Stell das mal auf die richtigen Sachen um - also z.B. auf
IRMP_BIT_NUMBER 4.
Hast du den Tiny richtig gefused und nicht bloß dein Compilat da
reingespielt? Die Fuse für den berüchtigten 1:8 Teiler gibts auch beim
Tiny. Wenn der auf Werkseinstellung mit 1 statt 8 MHz läuft,
funktionieren deine Timings für IR nicht.
Matthias S. schrieb:> So eine Hürde hätte ich ja nicht erwartet. Was soll> das wohl?
Das ist keine Hürde, sondern gibt dem Hersteller eines Boardes die
Möglichkeit, die externen Pins fortlaufend durch zu nummerieren. Das ist
halt Arduino Standard.
Hab ich schon erwähnt das ich Libs hasse, die den Port in der Lib selbst
haben, und nicht in der INI bzw. den Aufruf.
Würde so nebenbei die Libs besser und den Code viel kürzer machen.
Gerald B. schrieb:> Hast du den Tiny richtig gefused und nicht bloß dein Compilat da> reingespielt?
Reicht es aus, in der Arduino IDE die Clockspeed auf 8MHz zu setzen oder
muss man da wieder irgendwo was separat umstellen?
Diese Einstellung der Arduino IDE ist mir neu, ich habe das über eXtreme
Burner und einen USBasp gemacht. eXtrme Burner ist wie ein Hex Editor
aufgebaut und hat einen Reiter für Flash, einen fürs EEPROM und einen
für die Fuses.
Keine Ahnung, wie man in der IDE die dort eingestellten Werte überträgt.
Versuch's man mit dem Button "Burn Bootloader". Bei den Megas werden ja
neben dem Bootloader so auch die Fuses gesetzt.
Lukas G. schrieb:> Reicht es aus, in der Arduino IDE die Clockspeed auf 8MHz zu setzen oder> muss man da wieder irgendwo was separat umstellen?
Nein, dort musst du einstellen, mit welcher Frequenz dein
Mikrocontroller wirklich getaktet wird. Es verändert aber nicht dessen
Taktfrequenz.
Ich habe bei der IDE mit diverses Chips bei 8 Mhz Einstellung Probleme.
Wenn ich den auf 1 mhz stelle rennt der wie eine 1.
@To
Lade dir die Atiny-85 Libs nach. Stelle dann deinen Chip ein, Stelle
danach dein USBasp als Programmierer ein.
Klicke danach im Menü auf "Hochladen mit Progammer" NICHT Hochladen
anklicken !!!
Dann sollte das Prg. problemlos auf die Atiny's geladen werden.
Jedenfalls mache ich das so.
Schlaumaier schrieb:> Ich habe bei der IDE mit diverses Chips bei 8 Mhz Einstellung Probleme.> Wenn ich den auf 1 mhz stelle rennt der wie eine 1.
und quatscht mal wieder gerührten Blödsinn. Ein Uno läuft sogar mit
16MHz und kann auch aus der IDE programmiert werden.
Matthias S. schrieb:> und quatscht mal wieder gerührten Blödsinn. Ein Uno läuft sogar mit> 16MHz und kann auch aus der IDE programmiert werden.
Ich habe außer Blinki NIE was auf einen UNO aufgespielt.
Meine Lieblinge sind Nanos-Clones aus China für ca. 1.50 Euro das Stück
mit gelötete Pin-Leisten. Und bei den habe ich halt das Problem.
Da die Hektik aber mehr Strom frisst, reicht mir 1 Mhz völlig aus. Wenn
man ergo Probleme hat mit den Teil dann einfach mal ein Gang runter
schalten.
Und damit das auch klar ist. Die Problem fangen schon beim Hochladen an.
Die IDE bricht nämlich mit einen Fehler ab wenn ich meine Nanos mit 8
MHZ Einstellung füttere. Bei 1 MHZ klappt das alles prima.
Und das sind Erfahrungswerte. Keine Theoretischer Mist, von "kann er ,
sollte klappen".
Und da ich mit den Nanos keine Bitcoins schürfe, bin ich so zufrieden.
Schlaumaier schrieb:> Und damit das auch klar ist. Die Problem fangen schon beim Hochladen an.> Die IDE bricht nämlich mit einen Fehler ab wenn ich meine Nanos mit 8> MHZ Einstellung füttere. Bei 1 MHZ klappt das alles prima.
Irgendwas läuft da bei dir grob falsch. Ich hatte das Problem noch nie
und ich wüsste auch nicht, welche Probleme dabei auftreten könnten,
außer zu lange Kabel.
20cm sind üblich, 30cm sind aber noch OK.
Stefan ⛄ F. schrieb:> ich wüsste auch nicht, welche Probleme dabei auftreten könnten,> außer zu lange Kabel.
auch Wusb oder USB/Ethernet Server ohne langes Kabel können Probleme
machen
Ich musste alle meine nano mit einem modifizierten Optiboot
programmieren, 115k schaffen alle nicht mit den genannten Verbindungen,
da muss das Kabel nicht mal lang sein!
38.4/57.6 k war OK
Gerald B. schrieb:> Versuch's man mit dem Button "Burn Bootloader". Bei den Megas werden ja> neben dem Bootloader so auch die Fuses gesetzt.
Richtig!
So geht es.
Joachim B. schrieb:> Ich musste alle meine nano mit einem modifizierten Optiboot> programmieren, 115k schaffen alle nicht mit den genannten Verbindungen,> da muss das Kabel nicht mal lang sein!
Irrational!
Was hat die Baudrate mit der Länge des USB Kabels zu tun?
Antwort: Nichts!
Stefan ⛄ F. schrieb:> Bitte aufwachen! Es geht um die Taktfrequenz des AVR und sein ISP> Interface.
Je selbstsicherer du tust, desto weniger hast du kapiert.
Re: IR Empfänger mit Attiny85/45 funktioniert nie
von Lukas G. (luke21) 13.12.2021 17:05
Angehängte Dateien:
preview image for Screenshot__1_.png
Es geht um die Einstellung auf diesen Foto. !!!!
DA muss ich immer 1 MHZ einstellen.
Da der serial-Monitor langsam seien soll, habe ich den IM CODE auf
19.200 eingestellt. Dann kann ich i.d.R. locker mitlesen.
Was die Kabellänge angeht. Es ist ein gutes Kabel und ca. 1 m lang.
Stromversorgung durch eine externe aktiven HUB.
Lukas G. schrieb:> Ich hab dafür alle Methoden probiert, die im Internet standen, sprich> verschieden Libraries für Attiny installiert, verschiedene> Taktfrequenzen, verschiedene Pinbelegungen, verschiedene Spannungslevel> usw.
Dies ist mal wieder ein Beitrag, bei dem mir recht unfreundlich zumute
wird. Anstatt ein wenig zu lesen, dann zu verstehen, wie das IR-Zeugs
funktioniert und dann sein eigenes Zeugs zu konstruieren, wird hier
jegliche Sachkenntnis peinlichst vermieden und stattdessen "alle
Methoden, die im Internet standen" durchprobiert.
Tja, dir kann ich nur sagen, daß du zu allererst versuchen solltest, ein
Pin deines µC so als Eingang zu konfiurieren, daß du es vom Programm her
abfragen kannst und obendrein einen Interrupt auf beide Flanken
bekommst. Dann überlege dir irgend ein sinnvolles Kommandosystem oder
benutze eines der bekannten Systeme wie das von Philips, NEC oder so und
schreibe danach deine ISR selber. So wie ich das sehe, benötigst du dazu
noch einen Timer, mit dem du die Zeit seit dem letzten Zustandswechsel
deines Empfangssignales messen kannst.
Wenn du das hingekriegt hast, können wir weiter sehen.
W.S.
Kleiner Hinweis am Rande :;)
Ich habe mal wegen einer IR-Diode (Sender) 3 Std. nach den Fehler
gesucht.
Bis ich festgestellt habe, das die Chinesen die Diode falsch auf die
Mini-Platinchen gelötet haben und die Pin-Beschriftung nicht mit den
Beinchen der Diode übereinstimmte.
Da ich sowas immer im 10er Pack bestellt habe, habe ich ne andere Diode
angeschlossen (vorher geprüft) und die funktionierte 1a. Nach weiterer
Prüfung habe ich festgestellt das von den 10er Pack 3 falsch angelötet
waren.
Also es wäre keine schlechte Idee sich mal das Datenblatt der Diode
anzusehen. Egal ob Sender o. Empfänger ;)
Ach und halte mal dein Handy an die Diode wenn sie SENDEN soll. Dann
muss da ein roter flackernder Punkt zu sehen sein. !! Wenn du den Punkt
siehst, aber nix passiert dann sendest du den falschen Code.
Dann lädst du einfach ein fertiges Prg. IR-Erkennungsprogramm in den
Chip. Baust die passende EMPFÄNGER-Diode (38 k in den Fall) dran (selber
PIN) und löst die ECHTE Fernbedienung aus. Dann bekommst du MEIST das
Protokoll + richtigen Code angezeigt.
Viel Glück.
EAF schrieb:> Was hat die Baudrate mit der Länge des USB Kabels zu tun?> Antwort: Nichts!
du verstehst es nicht, kein Problem.
Baudrate <-> Takt <-> Bootloadereinstellung (Optiboot) <-> Wusb steht
alles in einer Beziehung
Das darfst du gerne bestreiten!
Joachim B. schrieb:> viel Unsinn
Das Problem des TO hat nicht mit
1. Bootloader
2. WUSB
3. Kabellängen
4. Baudrate
5. Nanos
zu tun.
Da bleibt dann die Frage "Wer?" hier irgendwas nicht versteht schon gar
nicht mehr offen.
Oder willst du diesen Thread auch wieder mit deinem Sermon kapern?
Lukas G. schrieb:> Reicht es aus, in der Arduino IDE die Clockspeed auf 8MHz zu setzen oder> muss man da wieder irgendwo was separat umstellen?
Den Clock Prescaler kann man im Programm umstellen.
Also per Fuse, oder im Programm.
EAF schrieb:> Das Problem des TO hat nicht mit
habe ich auch nicht behauptet, nur das dir Leseverständnis fehlt!
Stefan ⛄ F. schrieb:> ich wüsste auch nicht, welche Probleme dabei auftreten könnten,> außer zu lange Kabel.
selbst mit kurzen Kabeln kann es Probleme geben, was ich beweisen kann!
Diskutiere nie mit ........