How can I make a complete and fully compatible arduboy FX?

Hey everyone, I am sure somebody already explained this but everything I found was too confusing for me. So I decided to ask directly here.

I build my first arduboy last week, and I solved it’s issues and made it work just two days ago. So I am a noob, that is the main reason I find other post confusing.
I built my first working arduboy with arduino nano and a custom arduboy2 fork and I am loving it. But it doesn’t support more than half of the games I tried and sometimes even if it supports it has some issues (Like game freezing after 2-3 minutes of gameplay) so I decided to buy a more compatible one.

I live in a country where buying a retail arduboy is too hard (or might be impossible for me as a student) so I can’t buy it, but I want to make one as close as the retail arduboy FX. I don’t know if its possible to get same functionality but even if isn’t I would love to get as close as possible.

I understand I need a pro micro for that but I didn’t understand the thing about “Alternate wirings” are there more than one pro micros with same chip but different boards or something? Should I solder something to chip directly?

Also the schematics people is sharing for normal arduboy shows connections directly on chip, I can’t understand where to connect which pin from looking at it.

I thought just buying an SPI oled 128x64 display will work but it doesn’t seem like it. Some people talking about SH1106 issues that I don’t understand anything so which kind of screen do I need?

Some games uses FX chip for extra functionalities, can I get the same functionality with a chip or would it be just usable for storing games? And of course, what kind of chip should I buy?

I am seeing some arduboys with normal speakers and some with buzzers (my nano one was with a buzzer) which one do I need for making everything work? and if answer is speaker what kind of speaker should I buy?

I am seeing arduboys with three different leds and some with one RGB led, is it up to me?

Theese are the ones I can remember right now. I know they are noob questions but I couldn’t figure it out myself. I want to make an arduboy that can open every game without recompiling or changing game codes. It would be really good if I could just upload the hex file and it worked.

Thanks for anyone willing to read and answer my questions.

1 Like

The alternate wiring is used if you’re using @Mr.Blinky 's Homemade Package and want more functionality (extra speaker pin and green LED IIRC)

There are pin diagrams underneath.

If you make sure you buy a screen with the SSD1306 driver, you’re good.

You can indeed make your own FX chip Arduboy. Not sure about the actual FX data and games, but as far as storing games, it works just fine.

Some links to help you get started:

Flash cart(ridge) (I recommend the ‘Lite’ version)
Arduboy custom bootloader (gotta flash the Cathy3K bootloader to your Pro Micro)

For the chip, make sure to buy either a Windbond w25q64/w25q128/w25q512 (depending on how much storage you want-8 megabytes, 16 megabytes, 64 megabytes iirc) imo the w25q128 is perfect but if you think ~500 games might be a bit too much, you could downgrade to a w25q64 for less of your currency.

Ideally, you should look for piezo buzzers. I personally used piezo discs for mine. Should note that speakers that identify a positive pin with a ‘+’ are usually not piezoelectric.

Probably should stay away from the ‘alternate wiring’ then, if you’re okay with losing a bit of (rather unimportant) functionality.

That’s very likely because the Arduino Nano uses an ATmega328, which only has 2KB of SRAM.

The official Arduboy is based on the Arduino Leonardo, which uses an ATmega32u4, which has 2.5KB of SRAM - 512 bytes more. The Pro Micro also works because it uses the same processor.

Many games will be expecting there to be 2.5KB of RAM, and the fact the Nano has less means that some games won’t even run and others will just crash when the call stack gets too full - again, they’re expecting there to be more memory available to support both their global variables and the stack.

The standard wiring expects certain pins to be wired to certain inputs/outputs.

The alternative wiring(s) allow you to deviate from that standard configuration and assign different roles to the pins. E.g. what might be the A button in one wiring arrangement might instead connect to the screen in a different wiring arrangement.

See here for a comparison table:

The official Arduboy uses an SSD1306 128x64 monochrome (1-bit) SPI OLED screen.

Some other screen models are supported with Mr Blinky’s Homemade Package, but the official library expects that particular display.

Other displays have different quirks and caveats. E.g.

  • An IIC/I2C screen will be slower because IIC/I2C is a slower protocol than SPI. For most games that might not make a difference, but it may for others.
  • Different screen models use a different set of screen commands. E.g. what might be the ‘change contrast’ command on one might be the ‘invert display’ command on another. This is important because one of the things the Arduboy2 library does is initialise and control the screen.

Any deviation from the standard wiring, screen, or processor will require games to be recompiled before you can play them, and some games may not be playable at all because they bypass the Arduboy2 library or otherwise depend on the Arduboy’s specific hardware arrangement.

Some deviations can avoid the need to compile by having the .hex file patched, but currently that’s only possible for certain specific arrangements. (I believe using a certain screen type, with that being the only change, would allow the .hex-patching technique to be used, but I don’t recall which.)

If it’s the right kind of chip and it’s installed correctly then you’d be able to use it both for storing games and for the extra functionality. The extra functionality is provided by the library, not the hardware.

Theoretically another kind of chip could work, but it would require modifying the FX library, which is something nobody has attempted yet.

I believe the official Arduboy FX uses a W25Q128, a 16MB SPI-controlled flash memory chip from Winbond.

Other capacities that use the same interface and command set should work, but anything that deviates too much would require modifying the FX library to support it.

The official Arduboy uses a single RGB LED.

I’m not sure if it’s possible to use three seperately coloured LEDs without modifying the library, or if the Homemade Package supports using three separate LEDs.

Then you’d have to follow the original specification exactly, including (but not limited to):

  • An ATmega32u4 processor
  • An SSD1306 screen
  • A W25Q128 flash memory chip

You should also follow the standard wiring arrangement.


I can’t comment on the schematics because I don’t know enough about electronics to actually be able to read them.

I don’t know about the speakers/buzzer situation either, it’s not something that comes up a lot.

2 Likes

Yes, you can use three separate LEDs because the RGB LED is just three individual LEDs (one red, one green and one blue) in a single package, with one pin of each all tied together. However, if a sketch is trying to display a specific RGB color (such as a specific shade and intensity of purple, by blending certain brightnesses of the RGB LED’s internal red and blue LEDs) you would have to interpret what you see on separate red and blue LEDs to imagine what the colour would be.

It may also be possible to add an external translucent filter in front of three closely spaced red, green and blue LEDs, to blend their output into a single colour, thus acting like an actual single RGB LED.

For full compatibility with the Arduboy or Arduboy FX, the RGB LED (or equivalently wired separate LEDs) must be of the common anode type (not common cathode). In addition to common anode and common cathode RGB LEDs, there are also RGB LEDs available (with 6 pins) with fully isolated internal LEDs, which would also be usable.

2 Likes

Thanks everybody, you’ve been a lot help to me. I didn’t know standart and alternate wirings are a thing we do (I thought it is about soldering of board) so I didn’t even bought anything. But with your help I learned what to get and bought some parts including an arduino pro micro and SSD1306 SPI screen.

I bought a W25Q128 chip but it is not windbond (it was the only one that is currently available in Turkey) it just says it is a imitation without giving any brand name, I hope it works.

I bought 3 buzzers because it wasn’t saying which one is piezo, instead it said active or passive buzzer, I didn’t know which to get and they were cheap so I bought one of each. (One active, one passive and one disc)

I have some leds including RGB ones but I don’t know if they are common anode or cathode, I will try to build with it and if it doesn’t work I can switch to seperate red, green and blue ones.

I guess thats it for now. I will update you when all the parts arrive.
Thanks a lot everyone, I would probably waste my money on wrong parts without your help.

The disc should work. Not sure about the two buzzers.

My order came today and I am starting to build it. I might try to give alternate wiring a chance for 2nd channel speaker compatibility.

It had some weird pin names like SPI MOSI that I don’t know which pin but I found another on @Mr.Blinky’s github

Ekran Resmi 2023-03-21 20.21.54

This one is more clear so it should be fine. My only issue left is I don’t have any clue on where to solder which leg of FX chip. I have just the chip itself without any indication of which leg is what. Only thing I found is a little dot in one of the corners.
Chip is a W25Q128FVSG if I can see correctly (Text is too small)

This might help with that:

Should I use same pins (15 and 16) on both oled and fx chip? Or there are different pins for D0 and D1?

The OLED and flash chip share MOSI, MISO, and CLK lines, but have separate CS.

This allows tricks like displayPrefetch in the FX library, which fetches from the flash chip while writing to the display.

1 Like

This should help

image

I reccomend using the pinnout diagram

from

Those are the SPI pins. @MLXXXp helped me out with that a while ago.

I couldn’t find where to connect VCC on oled. Also my SPI display has no CS pin (it is a 6 pin display, not 7) is this make a problem?

Edit: I realised there is a vcc pin on arduino itself. My unawareness, sorry

It’s less ideal but you could use the following trick to use a 6 pin display and a flash chip together:

Oh, I don’t have any diodes right now so I have to halt my making process and order some. Should I get 60V 3A ones? (Since @JiNa used SS36 diodes in that post)
And if I don’t install fx chip (I didn’t installed it yet) can I make it without diodes?
Sorry if I annoy with my questions, I am really excited and I want to complete it as soon as possible

That’s over kill just get some BAT42 or 1N4148 diodes.

Yes, when you don’t add a flash chip you don’t need them.

I soldered Oled’s VCC pin to VCC on arduino and installed ardubreakout in homemade package but nothing happened, I set Arduino IDE up just like it shows on github (It saw my pro micro as leonardo after selecting alternate wiring, maybe that is the problem) so software side it should be good. I probably messed something up on soldering

I don’t know if this helps but when I install arduino blinks red on 2 leds 3-4 times. After complete, IDE says “avrdude done, thank you” and when I connect to power It blinks a red led once while another led is continiously ligts green

Edit:
I was able to get a visual from screen but display is not correct. Two halves show reversed visuals.

Also the screen is too dim. I wasn’t able to see it a normal lit room. This picture is taken in a dark room in night mode and here I am trying to close arduinos own led with my finger because its brightness is enough to make screen invisible. I can only see it in a really dark room without any light on

The Pro Micro is actually not an Arduino board . . .

So, the IDE/Computer/Port sees any ATmega32u4 chip as a Leonardo.

So softwarewise it is ok and this screen issue thing is about wiring, if I understand correctly

Well, I’m not too sure about that, to be honest. It looks to me like something with the compiling. I think I’ve seen something like this happen before where the code uses (or is compiled with) the wrong screen driver or something, but I’m not entirely sure about that.

Maybe double check your compile settings? Make sure you have SH1106 selected.

I have a ssd1306 display so I chose it when compiling. I am not sure about the lack of 7th (CS) pin though, might be something about it