If you already have an Arduino, I would stick with that -- it's going to be a lot more understandable than the Raspberry Pi, which is essentially a little desktop running Linux in a very small form factor.
Whereas with the Arduino, the whole system is simple enough one can get their head around it.
You didn't say which Arduino you have, but in any case you should find out which ATmega processor is on your board and then download the datasheet for it. Don't download just the summary, download the full datasheet will be several hundred pages long. For example, here is the datasheet for the ATmega328, which is the microcontroller used in the Arduino Uno.
While not necessary for programming the Arduino in its Sketch version of C++ (I suspect few Arduino owners have taken the trouble to download the datasheet, or even know one exists), reading through it you will get an idea of what is inside the microcontroller.
A microcontroller like the ATmega is much more than just a CPU -- it has programmable flash memory, RAM, EEPROM, a lot of I/O including parallel ports, serial interfaces (UARTS, SPI, I2C), and a ADC (analog to digital converter), and timers. There will be a separate section in the datasheet for each of these topics.
Don't expect to understand everything -- or even very much at all to begin with. However being a high-level language programmer, you will probably be interested in the various internal registers including the 32 general purpose registers and how they are used, the various addressing modes (there are several, some quite complex), and what the instruction set looks like.
For example, there is an addressing mode -- "indirect data memory addressing with post-increment" -- that allows a C++ reference like *x++ to be implemented in one instruction.
If you have never done assembly language programming, looking at the registers, instruction set, and addressing modes will give you a feel for what it is going on inside at that level.
Then take a lot at all of the sections describing I/O on the ATmeaga. For example looking at the description of the GPIO ports for the ATmega will give you a better idea of that is going on when you use the pinMode and digitalWrite / digitialRead calls for example. You might want to buy some additional shields for your Arduino so you can experiment doing various kinds of I/O.
Although buying a tablet is a good idea for many reasons, it's not going to help you understand how a computer works at all.
Like other small microcontrollers, for example PICs, it is possible to get down to the bare hardware on an Arduino board -- just think of it as an AVR development board. You don't have to use any of the libraries if you don't want to.
For example, to read and write the ports, you can use the instructions:
DDRB = 0x01; // set data direction register for port B to output
PORTB = 0x01; // set bit 1 of PORTB
Essentially, you are now programming in pure C, not C++. Here is more information on programming the Arduino in C.
If you don't like the Arduino IDE, you can program in either Visual Studio or Atmel Studio IDEs.
If you want to really get down to the hardware, you can program in assembly language using the instructions in the datasheet you downloaded earlier. Google "arduino programming in assembler" (without the quotes) for lots of links about this topic.
Here is a one-hour tutorial on YouTube about programming the Arduino inn assembler.
And here is some example code -- a subroutine for turning an LED on and off in assembler:
sbi 4,5; 4 = DDRB (0x24 - 0x20). Bit 5 = pin 13
.global led ; The assembly function must be declared as global
cpi r24, 0x01 ; Parameter passed by caller in r24
sbi 5, 5; 5 = PORTB (0x25 - 0x20). Bit 5 = pin 13
cbi 5, 5; 5 = PORTB (0x25 - 0x20). Bit 5 = pin 13
which is assembled as a separate .s file. The complete code for the Arduino blink LED example in assembler, showing use of several of the Arduino's 32 general purpose registers, can be found here.