Jump to content

Lorcan
 Share

Recommended Posts

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.

oled_back.jpg

oled_front.jpg

oled_pcb_top.png

oled_pcb_bottom.png

oled_schematic.png

ssd1306_test.jpg

Link to comment
Share on other sites

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 by Lorcan
Mention Thorsten
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

 

oled_back.thumb.jpg.71a82d8bb073bce46e530d401a0ed677.jpgoled_front.thumb.jpg.eb99759c133dc682ba2df2d2fc218d7e.jpg

oled_schematic.png

Link to comment
Share on other sites

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 by Lorcan
typo
Link to comment
Share on other sites

  • 3 weeks later...

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 by Phatline
Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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 by Phatline
Link to comment
Share on other sites

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 by Lorcan
Link to comment
Share on other sites

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 ...

Link to comment
Share on other sites

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....

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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?)

Link to comment
Share on other sites

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:

 

 

DSCF4141.JPG

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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. 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...