I recently ordered two UNO Wifi Rev 2 boards for a home project.
Unfortunately, there are -apparently- a lot of differences between the classic UNO and the UNO Wifi Rev2.
My technical abilities are limited, but from what I gathered here, is that the ATMEGA4809 infrastructure is completely different from the UNO infrastructure (despite the same name).
Therefor, any library that works with registers or timers will have difficulty compiling.
As expected, using the IRLib2 library (RawRecv library example) with the Rev2 board selected resulted in a huge amount of errors:
In file included from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:14:0:
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp: In member function 'void IRsendBase::enableIROut(uint8_t)':
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:294:34: error: 'TIMSK2' was not declared in this scope
#define IR_RECV_DISABLE_INTR (TIMSK2 = 0)
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:77:2: note: in expansion of macro 'IR_RECV_DISABLE_INTR'
IR_RECV_DISABLE_INTR; //Timer2 Overflow Interrupt
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:201:3: error: 'TCCR2A' was not declared in this scope
TCCR2A = _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); \
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:80:2: note: in expansion of macro 'IR_SEND_CONFIG_KHZ'
IR_SEND_CONFIG_KHZ(khz);
^
In file included from c:\users\xxxxxx\documents\arduinodata\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\include\avr\io.h:99:0,
from c:\users\xxxxxx\documents\arduinodata\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\include\avr\pgmspace.h:90,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/String.h:30,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Print.h:24,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Stream.h:25,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Client.h:22,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/ArduinoAPI.h:29,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/Arduino.h:23,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibProtocols.h:12,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.h:16,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:13:
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:201:16: error: 'WGM20' was not declared in this scope
TCCR2A = _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); \
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:80:2: note: in expansion of macro 'IR_SEND_CONFIG_KHZ'
IR_SEND_CONFIG_KHZ(khz);
^
In file included from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:14:0:
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:201:25: error: 'TCCR2B' was not declared in this scope
TCCR2A = _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); \
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:80:2: note: in expansion of macro 'IR_SEND_CONFIG_KHZ'
IR_SEND_CONFIG_KHZ(khz);
^
In file included from c:\users\xxxxxx\documents\arduinodata\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\include\avr\io.h:99:0,
from c:\users\xxxxxx\documents\arduinodata\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\include\avr\pgmspace.h:90,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/String.h:30,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Print.h:24,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Stream.h:25,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/Client.h:22,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/api/ArduinoAPI.h:29,
from C:\Users\xxxxxx\Documents\ArduinoData\packages\arduino\hardware\megaavr\1.6.24\cores\arduino/Arduino.h:23,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibProtocols.h:12,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.h:16,
from C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:13:
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:201:38: error: 'WGM22' was not declared in this scope
TCCR2A = _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); \
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:80:2: note: in expansion of macro 'IR_SEND_CONFIG_KHZ'
IR_SEND_CONFIG_KHZ(khz);
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:201:51: error: 'CS20' was not declared in this scope
TCCR2A = _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); \
^
C:\Users\xxxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:80:2: note: in expansion of macro 'IR_SEND_CONFIG_KHZ'
IR_SEND_CONFIG_KHZ(khz);
etc...etc...
Upon inspection, I found a possibility to use "bit banging" to circumvent the built-in hardware detection in IRLibHardware.h:
/* If you want to use bit-bang PWM output, you should un-comment the line below.
* The definition must include the pin number for bit-bang output. This could be any
* available digital output pin. It need not be a designated PWM pin.
* NOTE: By un-commenting this line, you are forcing the library to ignore
* hardware detection and timer specifications above. The bit-bang frequency
* code is not as accurate as using a hardware timer but it is more flexible and
* less hardware platform dependent.
*/
#define IR_SEND_BIT_BANG 5 //Be sure to set this pin number if you un-comment
This resulted in significantly less error messages:
In file included from C:\Users\xxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:14:0:
C:\Users\xxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp: In member function 'void IRsendBase::enableIROut(uint8_t)':
C:\Users\xxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibHardware.h:294:34: error: 'TIMSK2' was not declared in this scope
#define IR_RECV_DISABLE_INTR (TIMSK2 = 0)
^
C:\Users\xxxxx\Documents\Arduino\libraries\IRLibProtocols\IRLibSendBase.cpp:77:2: note: in expansion of macro 'IR_RECV_DISABLE_INTR'
IR_RECV_DISABLE_INTR; //Timer2 Overflow Interrupt
^
exit status 1
Error compiling for board Arduino Uno WiFi Rev2.
Unfortunately, I cannot seem to find a way to fix this last error.
If anyone could shed some light on this case, or know an infrared library that does work with the Rev2, it would be greatly appreciated.