Lorcan Posted March 24, 2021 Report Posted March 24, 2021 Hi, I'm building a MCU type controller and I'm starting to design some PCB's for the various modules. I'm planning to share them here so other users can use them if they want, if that's ok. The first and simplest one is an 8xOLED carrier board to connect to J15A of the STM32F4 core. Initial tests on a breadboard with 2 screens work fine. It is my first time using Kicad and also designing a 2-layer board, so I'd like to get some feedback before sending them to the fab house. OLED's are 0.96'' SSD1306 4-wire SPI type Mechanically the OLED's are plugged into 1x7 sockets Each 'channel' is exactly 1.1 inch wide. It leaves a little wiggle room between the screens, and should allow the case too be quite compact I remember seeing another schematic with added 100nF decoupling caps, but they're not on Thorsten wiring diagram, so I'm wondering if I should add those NOTE: I'm going to extend the board to avoid having the holes running under the OLED's. Quote
Phatline Posted March 24, 2021 Report Posted March 24, 2021 i think you will need a the cap and resistor on reset for every display (they told me...dont know if necessery) Quote
Lorcan Posted March 24, 2021 Author Report Posted March 24, 2021 (edited) 15 hours ago, Phatline said: i think you will need a the cap and resistor on reset for every display (they told me...dont know if necessery) Thanks, but are you sure ? I distinctly remember reading @TK. saying only one is needed, at least for 8. It looks like a simple RC cell, and I don't think the current drain on the Reset pin would alter the time constant. Edited March 25, 2021 by Lorcan Mention Thorsten Quote
Lorcan Posted March 24, 2021 Author Report Posted March 24, 2021 On another note, I looked at current consumptions of various OLED's, and according to this page, a 128x64 0.96” can pull 21mA at max contrast with all pixels lit. As the STM32F4 board docs state, the integrated 3.3V regulator can only supply 100mA max. I wonder if problems some people were having with multiple OLED's might be related to that. So to be on the safe side and to avoid heating the poor little SMD IC, I'm going to add an optional on-board 3.3V regulator or input. Quote
Phatline Posted March 25, 2021 Report Posted March 25, 2021 if height is a problem this could spare 2mm: https://www.mouser.at/ProductDetail/Hirose-Connector/MDF7-7S-254DSA55?qs=%2Fha2pyFaduiZ71eBiARkwzzUReMZP2WhzZTuqPhRayn1qNB0%2FX2TxKoytKf%2BS9gq (not realy needett when shorten the pinheaders of the displays by hand, and removing the header-plastic) but maybe its whise to use standart pinheader - because of price and aviable... ..just a thought. Quote
Lorcan Posted March 25, 2021 Author Report Posted March 25, 2021 I'm going to use these from Reichelt which I will cut to 1x7. They're 0.2€ so a fifth of the price ! This way if an OLED goes dead (they do after a few years), I can replace it easily. Quote
Lorcan Posted March 25, 2021 Author Report Posted March 25, 2021 Found those which are 1x7, even better and only 0.27€ Quote
Lorcan Posted March 25, 2021 Author Report Posted March 25, 2021 Updated the PCB, hopefully it's close to being ready for fabrication. Added decoupling capacitors (optional, just in case) Added external 3.3V option w/jumper selection Cleaned up traces etc I'll put all the files on github when I've confirmed everyhting works as intended. Quote
novski Posted March 30, 2021 Report Posted March 30, 2021 (edited) Nice Work. I did same once. See: http://wiki.midibox.org/doku.php?id=fadercore_-_vlr-8odisp i think i have some pcb still laying around. Edited March 30, 2021 by novski Quote
Lorcan Posted March 31, 2021 Author Report Posted March 31, 2021 (edited) On 3/30/2021 at 12:42 PM, novski said: Nice Work. I did same once. See: http://wiki.midibox.org/doku.php?id=fadercore_-_vlr-8odisp i think i have some pcb still laying around. Thanks ! Yes I've seen your work too, very impressive ! I want to make my own boards so I started with the simplest PCB to learn KiCad. It's quite a wonderful piece of software,it has evolved a lot since I last tried it. And it's looking even better in the upcoming version 6. I've sent the PCB for fabrication yesterday, let's hope I didn't make any stupid mistakes ! Edited March 31, 2021 by Lorcan typo Quote
Lorcan Posted April 16, 2021 Author Report Posted April 16, 2021 First test, everything seems in order ! The 3.3V LDO on the core board is a little hot, I'll probably use external power for this. Quote
Phatline Posted April 16, 2021 Report Posted April 16, 2021 (edited) in the meantime i also have expirience with 9x OLEDs here with 3 reset circuits --- good to know that one is enough - thx! really hot? i use 9x OLED-LCDs and a 2x16x16 LED matrix on one core - have no problems here - so far... but i also implemented a "screensaver" in my app, that turn of all UI when nothing is touched for 4 minutes... (thought of dead Oleds and dark BLM-Leds . in far future...) Edited April 16, 2021 by Phatline Quote
Lorcan Posted April 16, 2021 Author Report Posted April 16, 2021 1 hour ago, Phatline said: really hot? i use 9x OLED-LCDs and a 2x16x16 LED matrix on one core - have no problems here - so far... but i also implemented a "screensaver" in my app, that turn of all UI when nothing is touched for 4 minutes... (thought of dead Oleds and dark BLM-Leds . in far future...) It's not that hot, but I only have 6 screens connected atm. The regulator on the core is rated at 100mA absolute max and it's a tiny SOT23 part, so it could become a problem if people use fonts with lots of lit pixels. This page quotes as much as 40mA consumption in certain scenarios ! And for general reliability it's better to keep things running cool ;) The screensaver is a great idea, the life of these things is a few years at most and I'd prefer not to replace them that often. May I ask how you implemented that ? Quote
Phatline Posted April 16, 2021 Report Posted April 16, 2021 (edited) 1 hour ago, Lorcan said: The screensaver is a great idea, the life of these things is a few years at most and I'd prefer not to replace them that often. May I ask how you implemented that ? with mios: on every input (button press) of a UI-Task (DIN_BLM, DIN, ENC,) except of AIN (to much datamess when faders are going bad...) i reset the energy-save timer (4minutes for example) to 0.... looking like this: void DIN_BLM_NotifyToggle(u32 pin, u32 pin_value){ // Wakeup the Energy-Saver (BLM+LCD) // if it is in save-mode then dump out normal LCD-Labels if(flag.energy_save == 1) { flag.energy_save = 0; flag.clear_LCD0 = 1; flag.clear_LCD1 = 1; flag.clear_LCD2 = 1; flag.clear_LCD3 = 1; flag.clear_LCD4 = 1; flag.clear_LCD5 = 1; flag.clear_LCD6 = 1; flag.clear_LCD7 = 1; flag.clear_LCD8 = 1; Router(5,0,0,0); Router(7,0,0,0); Router(99,0,0,0); } flag.energy_reset = 1; flag.energy_save = 0; flag.energy_lcd = 0; flag.energy_blm = 0; flag.energy_led = 0; ... normal UI things... } in the low priority task "App Background" it is steady counting until 4000seconds are gone... then activate the Energy-Save.. like this: void APP_Background(void){ // Screen & LED - Energy Saver // reduce rate static int e_rate = 0; e_rate++; if(e_rate > 1000) { e_rate = 0; // reset counter 1000 ~= 1second static int e_cnt = 0; if(flag.energy_reset == 1) { flag.energy_reset = 0; e_cnt = 0; } if(flag.energy_save == 0) { e_cnt++; } if(e_cnt > Screensaver_time_sec) { e_cnt = 0; flag.energy_save = 1; flag.energy_blm = 1; flag.energy_lcd = 1; flag.energy_led = 1; Router(5,0,0,0); } // Update BLM} // turn of BLM and LCD //MIOS32_MIDI_SendDebugMessage("e_cnt: %d save: %d blm: %d", e_cnt, flag.energy_save, flag.energy_blm); } } then i made a rtos task (LCD(void...) ... on low priority... where all my LCDs are handled... in energy-save mode: print "spaces" aka clear screen - 1time > instead of update and handle (flags...) normal LCD/menue things... static void LCD(void *pvParameters) { portTickType xLastExecutionTime; xLastExecutionTime = xTaskGetTickCount(); while( 1 ) { vTaskDelayUntil(&xLastExecutionTime, 10 / portTICK_RATE_MS); // Energy Saver - CLEAR SCREENS if(flag.energy_save == 1 && flag.energy_lcd == 1) { flag.energy_lcd = 0; // kill flag MIOS32_LCD_FontInit((u8 *)fnt_BIG); // use big custom font MUTEX_LCD_TAKE; MIOS32_LCD_DeviceSet( 0 ); MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString(" "); // aka CLEAR SCREEN MIOS32_LCD_CursorSet(0, 1); MIOS32_LCD_PrintFormattedString(" "); MIOS32_LCD_CursorSet(0, 2); MIOS32_LCD_PrintFormattedString(" "); MIOS32_LCD_CursorSet(0, 3); MIOS32_LCD_PrintFormattedString(" "); MUTEX_LCD_GIVE; } } in normal operation the LCD-task do such things..: static void LCD(void *pvParameters) { portTickType xLastExecutionTime; xLastExecutionTime = xTaskGetTickCount(); while( 1 ) { vTaskDelayUntil(&xLastExecutionTime, 10 / portTICK_RATE_MS); // Energy Saver - OFF AND There is no Temporal Message showing (2 seconds...) if(flag.energy_save == 0 && flag.Update_LCD_s == 0) { if(flag.clear_LCD8 == 1) { // Menue LCD flag.clear_LCD8 = 0; // kill Flag /// MENUE //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Beat Name - SHOW and EDIT if(Menue == 0) { MUTEX_LCD_TAKE; MIOS32_LCD_DeviceSet( 8 ); MIOS32_LCD_FontInit((u8 *)fnt_BIG); // use big custom font MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString(" "); // clear MIOS32_LCD_CursorSet(0, 1); MIOS32_LCD_PrintFormattedString("%c%c%c%c%c%c%c%c", beat.name[0],beat.name[1],beat.name[2],beat.name[3],beat.name[4],beat.name[5],beat.name[6],beat.name[7]); MIOS32_LCD_CursorSet(0, 2); MIOS32_LCD_PrintFormattedString(" "); // clear MIOS32_LCD_CursorSet(0, 3); MIOS32_LCD_PrintFormattedString(" "); // clear MIOS32_LCD_CursorSet(cursor,2); MIOS32_LCD_PrintFormattedString("^"); // show CURSOR MIOS32_LCD_FontInit((u8 *)GLCD_FONT_NORMAL); // use tiny font MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString(" Beat Name %d", Menue); MIOS32_LCD_CursorSet(0, 7); MIOS32_LCD_PrintFormattedString("cursor letter"); MUTEX_LCD_GIVE; } ..... } i do that also for LEDs and the BLM.... about Hottnes... thx for tip... i will also implement a Vreg in now... not that it dies when i am in a great jam... Edited April 16, 2021 by Phatline Quote
Lorcan Posted April 17, 2021 Author Report Posted April 17, 2021 (edited) Thanks, I'll incorporate this idea when I'm done with all the rest. I don't think I'll do it for the LEDs though, I've yet to see one of those fail on me. These things are incredibly enduring, provided you use reasonable currents. For the 3.3V, I'll be using this 3€ DC/DC part, it hardly dissipates any heat unlike linear regulators. Edited April 17, 2021 by Lorcan Quote
Lorcan Posted April 17, 2021 Author Report Posted April 17, 2021 Found a problem: the 8th display is always garbled. I've tried swapping the OLED's, adding 100nF decoupling caps, stuffing only one, swapping cores, using a separate breadboard with only CS7, 3.3/5V, haven't managed to fix it yet :( I hope the external 3.3V supply will get rid of this ... Quote
Phatline Posted April 17, 2021 Report Posted April 17, 2021 you removed all Solder-Flux? (Aceton...) (i always have problems with that low-impedance Shit (<1K! between to pins because of some flux...) by swapping cores you mean the whole Motherboard and Discovery? if only discovery > try to replace that 595er... send a picture of that "garbled" --- if it looks like noise then you may not set the Displays right (bootloader-app > help > displays num x and y.... maybe one to less?) else post a board picture (with top and buttom layer in one....) may there is something you dont see.... Quote
Lorcan Posted April 17, 2021 Author Report Posted April 17, 2021 Looking at the core schematic, I see CS7 is connected to both Q7 of the 74HC595 and PD7 of the STM32F4, whereas CS0-CS6 are connected only to Q0-Q6 of the 74HC595. If PD7 is also an output pin, I wonder if PD7/Q7 could be interfering with eachother ? Quote
Phatline Posted April 17, 2021 Report Posted April 17, 2021 dont think that is the right trace...but PD7 by looking on the Shematic is only for the Display... but i dont know why? may it is needet for a special LCD? or some feedback/control/detection routine? (GPIO as input?) i would try to upload the bootloader app, and look if you can see anything on LCD8 --- i too have a discovery board with latest bootloader and 9 LCDs and on my machine everything is alright > so we can cancel out a mios/bootloader-PD7 problem but PD7 could be buggyerwise set as gpio out in your App you have on your machine (NG?) Quote
Lorcan Posted April 17, 2021 Author Report Posted April 17, 2021 3 minutes ago, Phatline said: you removed all Solder-Flux? (Aceton...) (i always have problems with that low-impedance Shit (<1K! between to pins because of some flux...) by swapping cores you mean the whole Motherboard and Discovery? if only discovery > try to replace that 595er... send a picture of that "garbled" --- if it looks like noise then you may not set the Displays right (bootloader-app > help > displays num x and y.... maybe one to less?) else post a board picture (with top and buttom layer in one....) may there is something you dont see.... Yes I thoroughly cleaned all boards with isopropyl, thanks. I have 2 complete motherboards + discovery as I plan to build a MCU + a MCU XT. I double checked the bootloader, eveything is fine: SSD_1306 x:8, y:1 This is what it looks like: Quote
Phatline Posted April 17, 2021 Report Posted April 17, 2021 try a temporar reset line for that display... (could be done by making a adapter cable between OLED and PCB ...while you cut the Reset Wire, and feed there the 1K 10uF thing in....) - and see what happens else i would try to set X8 to X9 (only for testing - not that is right - X8 is right...) then i would try to set the LCD Type to SSD_1306 Rotated (not that is right...) then i would post the board-file-picture (i cant see anything on your Separated Top/Buttom Pictures...i become eye and brain-cancer) Quote
Lorcan Posted April 17, 2021 Author Report Posted April 17, 2021 29 minutes ago, Phatline said: try a temporar reset line for that display... (could be done by making a adapter cable between OLED and PCB ...while you cut the Reset Wire, and feed there the 1K 10uF thing in....) - and see what happens else i would try to set X8 to X9 (only for testing - not that is right - X8 is right...) then i would try to set the LCD Type to SSD_1306 Rotated (not that is right...) then i would post the board-file-picture (i cant see anything on your Separated Top/Buttom Pictures...i become eye and brain-cancer) Thanks, I've tried all of the above already. I've put the OLED on a breadboard too and tried all CSx lines, they all work except CS7. Then I checked the motherboards and noticed that a few solder joints were less than perfect. Turns out they're all GND connections and that the pads don't have thermal relief, which isn't great. I also swapped out the U74HC595AC I got from Reichelt (made by Unisonic Technologies, never heard of them) for 74HC595AC by ST I had laying around, they seem less susceptible to noise. Now everything looks much better ! There's just an occasional glitch on a few pixels on one board which I'll investigate later. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.