DIY PCB Exposure Box using Arduino Nano

Printed circuit boards make the creation of electronic devices in a repeatable and reliable manner a possibility. However, due to factors such as long turnaround time, cost, and other challenges associated with making PCBs through established fab houses, electronics hobbyists and prototype engineers usually turn to DIY approaches of PCB development like the heat transfer method and the UV-based design transfer method. While the UV-based system with pre-sensitized PCBs is more reliable, the heat-based system is far more popular due to the complexity and cost of setting up the UV chamber required for a UV-based system. To remove these barriers and make the pre-sensitized PCB approach accessible to everyone, Youtube DIY Star; “Techbuilder“, recently shared the process of creating a DIY Digital PCB Exposure Box in a video.

The Exposure Box which was made from a recycled components box, had it’s top lined with LED strips that are turned “on” or “off” by an Arduino Nano based control system. The control system makes use of time duration, preset by the user via a potentiometer, as the control variable. It turns off the light when the preset time has been attained, ensuring the PCB is not overexposed.

Today’s tutorial will lay out the project in a step-by-step manner to make it easy for you to replicate.

Ready? let’s go!

Required Components

To build the DIY Digital PCB Exposure Box, you will need the following components:

  1. Plastic Container 
  2. Arduino Nano 
  3. White LED Strips 
  4. UV LED Strips [Better] 
  5. 12V 2A Power Brick
  6. TIP31C NPN Transistor
  7. 10k Ohm Trimmer Resistor
  8. 10k Ohm Potentiometer
  9. 10k Ohm Resistor
  10. 470 Ohm Resistor
  11. 100 Ohm Resistor
  12. Male Headers
  13. Power Switch
  14. Piezo Buzzer
  15. DC Jack
  16. PCB Materials 

While you may be able to salvage some of these components from old projects/a dumpster dive, the components can also be bought via the links attached to them. In case you are not able to get the exact components, the project is flexible and almost all of the components can be swapped with close alternatives. For instance, you can decide to use the cheaper and smaller Arduino Pro-Mini instead of the Arduino Nano.

Schematics

The schematics for the project is provided in the image below. The project was implemented on a PCB to make it more compact and easy to mount on the enclosure, but by carefully following the schematics below, you should be able to replicate the project on a veroboard or breadboard.

The schematics and PCB were created using Proteus and the project file with the schematics and PCB is attached under the download section to make it easy to replicate.

Project Enclosure and Assembly

The enclosure is an important part of this project and it makes sense that Techbuilder made use of components box, as they can be easily bought from any electronics component store. But just in case you are unable to get your hands on the exact kind of box, you can make do with any kind of box with a good opaque top. A wooden enclosure should also work great.

With the enclosure secured, follow the steps below to put it together.

1. Prepare the top/cover of the enclosure. If the surface is not perfectly flat, you can put a layer of cardboard or any other material to make it flat.

2. Based on the width (or length, depending on the orientation you prefer) of the lid, cut the LED strips into pieces with equal length. Peel the cover off the back of the LED strips to expose the sticky side of the strips and gently mount the strips on the lid of your enclosure, ensuring there is little or no space between the strips.

3. Next solder the positive leads of the strips together on one side and the negative terminals together on the other side of the box. Soldering on different sides reduces the chances of shorts.

With this done, power the LEDs up with a 12VDC/2A supply to be sure there are no shorts. If your connections have been properly soldered, all LEDs should come on.

4. Next, you need to cut out holes for the screens, switch, and other elements that the users will interact with. You can do this with a CNC machine or a combination of drills, files, Dremel tools, and hot glue.

5. Connect all components and mount the external components in the holes made. feel free to use Hot glue to secure things in place where necessary.

With all this in place, your enclosure should now be ready and look like the image below.

Code

With the enclosure ready, the next step is to write the code and upload it to the Arduino board. The operations of the device are quite straight forward; allow the user to set the desired exposure time via the potentiometer, turn on the LEDs, and initiate the countdown process with the progress being displayed on the LCD. When the preset time is reached, turn off the LEDs and initiate a beep on the buzzer so the user is notified.

To turn these these patterns into code, the Arduino IDE was used and since most of the heavy lifting associated with the code has to do with displaying data on the LCD, the Arduino LiquidCrystal Library was used.

As usual, I will do a quick breakdown of the code, explaining the concepts/parts of it that I feel might be difficult to follow.

The sketch starts with the include statements for the liquid crystal library along with a declaration of an instance of the library.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

Next, some pin declaration is done with the pins of the Arduino to which different components are connected clearly laid out.

//----------PIN ASSIGNEMENTS-----------//
#define LEDs 11          //LED Transistor Trigger Pin
#define buzzer 10        //Buzzer Pin
#define button A4        //Select Button Pin
#define durationPot A0   //Duration Knob Pin
#define brightnessPot A2 //Brightness Knob Pin

Next, variables to hold different parameters including maximum countdown time, among others are declared and initialized.

//-------CONFIGURABLE PARAMETERS-------//
int 
maxTime = 1200,          //Maximum countdown timer time (in secs)      
buzzerFreq = 1000,       //Buzzer frequency (Hz, Change to customize tone)
glowDelay = 10;          //Change this to increase LED glow rate (0-200)

Next, system variables that are used to store different data during runtime are declared and initialized.

//---SYSTEM VARIABLES (DO NOT TOUCH)---//
float 
timeLeftBarPercent = 0.00,
durationSecFloat = 0.00,
durationSecSelect = 0.00;
int
whitePWM = 0,
duration = 0,
durationSec = 0,
brightness = 0,
brightnessPercent = 0,
brightnessPWM = 0,
seconds = 0,
minutes = 0,
exposureLoop = 0,
startupLoop = 0;
unsigned long previousMillis = 0;    
const long interval = 1000;  
char timeMinSec[16];

Next, we write the void setup() function.

We start by setting the pinMode() of the output pins and initializing the LCD, after which some initialization and version control information is displayed.

//-VOID SETUP (Runs codes before entering loop)-//
void setup(){
  pinMode(LEDs,OUTPUT);
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();  

  brightnessPWM = map(analogRead(brightnessPot),0,1023,0,255);
  
  while(digitalRead(button)==LOW){
    lcd.setCursor(0,0);lcd.print("     PCB UV     ");
    lcd.setCursor(0,1);lcd.print("  Exposure Box  ");
    for (int i=0; i <= brightnessPWM; i++){ 
      analogWrite(LEDs,i);
      delay(glowDelay);
    }
    lcd.clear();
    lcd.setCursor(0, 0);lcd.print("Firmware Version");delay(500);
    lcd.setCursor(0, 1);lcd.print("TechBuilder v3.1");delay(500);
    break;
  }
  lcd.clear();
}

Next is the void loop() function.

This is where the functionality of the exposure box is defined and implemented. The system waits for the user to set the duration and brightness parameters and updates the display in realtime based on the values. Once the start button is pressed, the last duration valued set is stored, the LED is switched on and the exposure process starts. The duration is used for a countdown timer, and once it hits zero, the exposure process is halted by switching off the LEDs.

To restart the process, the user will have to press the reset button, set the duration and brightness, and press the button again to start the exposure process again.

void loop(){
  //--Gather Duration Knob Readings--//
  duration = analogRead(durationPot);
  durationSec = map(duration,0,1023,0, maxTime);
  
  //--Gather Brightness Knob Readings--// 
  brightness = analogRead(brightnessPot);
  brightnessPercent = map(brightness,0,1023,0,100);
  brightnessPWM = map(brightness,0,1023,0,255);

  //--Control LED brightness in real time--// 
  analogWrite(LEDs,brightnessPWM);
      
  minutes = durationSec/60;
  seconds = durationSec%60;
  
  lcd.setCursor(0,0);lcd.print("Duration: ");
  sprintf(timeMinSec,"%0.2d:%0.2d",minutes,seconds);
  lcd.setCursor(11,0);lcd.print(timeMinSec); 
  
  if(brightnessPercent<100){  //Used this instead of "lcd.clear();" function. Done to reduce LCD flicker.
    lcd.setCursor(14, 1);
    lcd.print(" ");
  }
      
  lcd.setCursor(0, 1);
  lcd.print("Brightness:     ");
  lcd.setCursor(12, 1);
  lcd.print(brightnessPercent);
  lcd.setCursor(15, 1);
  lcd.print("%");  
  
  if (digitalRead(button)==HIGH){
    durationSecSelect = durationSec;
    durationSecFloat = durationSec;
    
    lcd.clear();
    /*
    lcd.setCursor(0, 0);lcd.print(" Initializing  ");delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing.  ");tone(buzzer, buzzerFreq*3, 100);delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing.. ");tone(buzzer, buzzerFreq*3, 100);delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing...");tone(buzzer, buzzerFreq*3, 100);delay(500);
    */
    lcd.setCursor(0,0);lcd.print("    STARTING    ");
    lcd.setCursor(0, 1);
    for (int i=0; i <= 15; i++){ 
      lcd.print((char) 255);delay(35);
      tone(buzzer, buzzerFreq*2, 50);
    }
    lcd.print((char) 255);
    delay(300);
    analogWrite(LEDs,brightnessPWM);    
 
    lcd.clear();  
    lcd.setCursor(0, 0);
    lcd.print("Time Left: ");

    while(exposureLoop==0){

      timeLeftBarPercent = 100*(durationSecFloat/durationSecSelect);
      
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval){
        previousMillis = currentMillis;

        minutes = durationSec/60;
        seconds = durationSec%60;

        sprintf(timeMinSec,"%0.2d:%0.2d", minutes, seconds);
        lcd.setCursor(11, 0);
        lcd.print(timeMinSec); 
         
        if(timeLeftBarPercent<2)        {for (int v=0; v <= 15; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}      
        else if(timeLeftBarPercent<6.25){for(int v=0; v <= 14; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<12.5){for(int v=0; v <= 13; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}  
        else if(timeLeftBarPercent<18.75){for(int v=0; v <= 12; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<25)   {for (int v=0; v <= 11; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<31.25){for(int v=0; v <= 10; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}  
        else if(timeLeftBarPercent<37.5) {for(int v=0; v <= 9; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<43.75){for(int v=0; v <= 8; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<50)   {for(int v=0; v <= 7; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}      
        else if(timeLeftBarPercent<56.25){for(int v=0; v <= 6; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<62.5) {for(int v=0; v <= 5; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<68.75){for (int v=0; v <= 4; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}    
        else if(timeLeftBarPercent<75)   {for (int v=0; v <= 3; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<81.25){for (int v=0; v <= 2; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<87.5) {for (int v=0; v <= 1; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<93.75){lcd.setCursor(0, 1);lcd.print((char) 255);}
        durationSec--;
        durationSecFloat--;
      }

      if(durationSec<=0){
        digitalWrite(LEDs,LOW);           //Turn off LEDs when countdown hits 0  
        tone(buzzer,3000,500);         
        lcd.setCursor(0,0);lcd.print("    Exposure    ");
        lcd.setCursor(0,1);lcd.print("    Finished    ");
        delay(500);lcd.clear();
        lcd.setCursor(0,0);lcd.print("  Press Button  ");
        lcd.setCursor(0,1);lcd.print("    To Start    ");
        delay(500);
        while(digitalRead(button)==LOW){}  //Press button to proceed with system restart
        for (int i=0; i <= 255; i++){      //Glow-up Illumination LED
          analogWrite(LEDs,i);
          delay(glowDelay);
        }
        lcd.clear(); 
        exposureLoop=1;
      }
      else if(digitalRead(button)==HIGH){
        digitalWrite(LEDs,LOW);
        tone(buzzer,3000,500);
        lcd.setCursor(0,0);lcd.print("   Cancelling   ");
        lcd.setCursor(0,1);lcd.print("    Process!    ");
        delay(750);       
        lcd.setCursor(0,0);lcd.print("    Exposure    ");
        lcd.setCursor(0,1);lcd.print("    Finished    ");
        delay(500);lcd.clear();
        lcd.setCursor(0,0);lcd.print("  Press Button  ");
        lcd.setCursor(0,1);lcd.print("    To Start    ");
        
        while(digitalRead(button)==LOW){}
        for (int i=0;i<=brightnessPWM;i++){ 
          analogWrite(LEDs,i);
          delay(glowDelay);
        }
        lcd.clear();  
        exposureLoop=1;
      }
    } //End of While
    exposureLoop=0; 
  } //End Of Startup Button
  delay(20);
}//End of loop

The complete code for the project is provided below and attached under the download section.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
//----------PIN ASSIGNEMENTS-----------//
#define LEDs 11          //LED Transistor Trigger Pin
#define buzzer 10        //Buzzer Pin
#define button A4        //Select Button Pin
#define durationPot A0   //Duration Knob Pin
#define brightnessPot A2 //Brightness Knob Pin
//-------CONFIGURABLE PARAMETERS-------//
int 
maxTime = 1200,          //Maximum countdown timer time (in secs)      
buzzerFreq = 1000,       //Buzzer frequency (Hz, Change to customize tone)
glowDelay = 10;          //Change this to increase LED glow rate (0-200)
//---SYSTEM VARIABLES (DO NOT TOUCH)---//
float 
timeLeftBarPercent = 0.00,
durationSecFloat = 0.00,
durationSecSelect = 0.00;
int
whitePWM = 0,
duration = 0,
durationSec = 0,
brightness = 0,
brightnessPercent = 0,
brightnessPWM = 0,
seconds = 0,
minutes = 0,
exposureLoop = 0,
startupLoop = 0;
unsigned long previousMillis = 0;    
const long interval = 1000;  
char timeMinSec[16];

//-VOID SETUP (Runs codes before entering loop)-//
void setup(){
  pinMode(LEDs,                                      OUTPUT);
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();  

  brightnessPWM = map(analogRead(brightnessPot),0,1023,0,255);
  
  while(digitalRead(button)==LOW){
    lcd.setCursor(0,0);lcd.print("     PCB UV     ");
    lcd.setCursor(0,1);lcd.print("  Exposure Box  ");
    for (int i=0; i <= brightnessPWM; i++){ 
      analogWrite(LEDs,i);
      delay(glowDelay);
    }
    lcd.clear();
    lcd.setCursor(0, 0);lcd.print("Firmware Version");delay(500);
    lcd.setCursor(0, 1);lcd.print("TechBuilder v3.1");delay(500);
    break;
  }
  lcd.clear();
}
//-VOID LOOP (Code that runs on repeat)-//
void loop(){
  //--Gather Duration Knob Readings--//
  duration = analogRead(durationPot);
  durationSec = map(duration,0,1023,0, maxTime);
  
  //--Gather Brightness Knob Readings--// 
  brightness = analogRead(brightnessPot);
  brightnessPercent = map(brightness,0,1023,0,100);
  brightnessPWM = map(brightness,0,1023,0,255);

  //--Control LED brightness in real time--// 
  analogWrite(LEDs,brightnessPWM);
      
  minutes = durationSec/60;
  seconds = durationSec%60;
  
  lcd.setCursor(0,0);lcd.print("Duration: ");
  sprintf(timeMinSec,"%0.2d:%0.2d",minutes,seconds);
  lcd.setCursor(11,0);lcd.print(timeMinSec); 
  
  if(brightnessPercent<100){  //Used this instead of "lcd.clear();" function. Done to reduce LCD flicker.
    lcd.setCursor(14, 1);
    lcd.print(" ");
  }
      
  lcd.setCursor(0, 1);
  lcd.print("Brightness:     ");
  lcd.setCursor(12, 1);
  lcd.print(brightnessPercent);
  lcd.setCursor(15, 1);
  lcd.print("%");  
  
  if (digitalRead(button)==HIGH){
    durationSecSelect = durationSec;
    durationSecFloat = durationSec;
    
    lcd.clear();
    /*
    lcd.setCursor(0, 0);lcd.print(" Initializing  ");delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing.  ");tone(buzzer, buzzerFreq*3, 100);delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing.. ");tone(buzzer, buzzerFreq*3, 100);delay(300);
    lcd.setCursor(0, 0);lcd.print(" Initializing...");tone(buzzer, buzzerFreq*3, 100);delay(500);
    */
    lcd.setCursor(0,0);lcd.print("    STARTING    ");
    lcd.setCursor(0, 1);
    for (int i=0; i <= 15; i++){ 
      lcd.print((char) 255);delay(35);
      tone(buzzer, buzzerFreq*2, 50);
    }
    lcd.print((char) 255);
    delay(300);
    analogWrite(LEDs,brightnessPWM);    
 
    lcd.clear();  
    lcd.setCursor(0, 0);
    lcd.print("Time Left: ");

    while(exposureLoop==0){

      timeLeftBarPercent = 100*(durationSecFloat/durationSecSelect);
      
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval){
        previousMillis = currentMillis;

        minutes = durationSec/60;
        seconds = durationSec%60;

        sprintf(timeMinSec,"%0.2d:%0.2d", minutes, seconds);
        lcd.setCursor(11, 0);
        lcd.print(timeMinSec); 
         
        if(timeLeftBarPercent<2)        {for (int v=0; v <= 15; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}      
        else if(timeLeftBarPercent<6.25){for(int v=0; v <= 14; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<12.5){for(int v=0; v <= 13; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}  
        else if(timeLeftBarPercent<18.75){for(int v=0; v <= 12; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<25)   {for (int v=0; v <= 11; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<31.25){for(int v=0; v <= 10; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}  
        else if(timeLeftBarPercent<37.5) {for(int v=0; v <= 9; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<43.75){for(int v=0; v <= 8; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<50)   {for(int v=0; v <= 7; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}      
        else if(timeLeftBarPercent<56.25){for(int v=0; v <= 6; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<62.5) {for(int v=0; v <= 5; v++){  lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<68.75){for (int v=0; v <= 4; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}    
        else if(timeLeftBarPercent<75)   {for (int v=0; v <= 3; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<81.25){for (int v=0; v <= 2; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}} 
        else if(timeLeftBarPercent<87.5) {for (int v=0; v <= 1; v++){lcd.setCursor(v, 1);lcd.print((char) 255);}}   
        else if(timeLeftBarPercent<93.75){lcd.setCursor(0, 1);lcd.print((char) 255);}
        durationSec--;
        durationSecFloat--;
      }

      if(durationSec<=0){
        digitalWrite(LEDs,LOW);           //Turn off LEDs when countdown hits 0  
        tone(buzzer,3000,500);         
        lcd.setCursor(0,0);lcd.print("    Exposure    ");
        lcd.setCursor(0,1);lcd.print("    Finished    ");
        delay(500);lcd.clear();
        lcd.setCursor(0,0);lcd.print("  Press Button  ");
        lcd.setCursor(0,1);lcd.print("    To Start    ");
        delay(500);
        while(digitalRead(button)==LOW){}  //Press button to proceed with system restart
        for (int i=0; i <= 255; i++){      //Glow-up Illumination LED
          analogWrite(LEDs,i);
          delay(glowDelay);
        }
        lcd.clear(); 
        exposureLoop=1;
      }
      else if(digitalRead(button)==HIGH){
        digitalWrite(LEDs,LOW);
        tone(buzzer,3000,500);
        lcd.setCursor(0,0);lcd.print("   Cancelling   ");
        lcd.setCursor(0,1);lcd.print("    Process!    ");
        delay(750);       
        lcd.setCursor(0,0);lcd.print("    Exposure    ");
        lcd.setCursor(0,1);lcd.print("    Finished    ");
        delay(500);lcd.clear();
        lcd.setCursor(0,0);lcd.print("  Press Button  ");
        lcd.setCursor(0,1);lcd.print("    To Start    ");
        
        while(digitalRead(button)==LOW){}
        for (int i=0;i<=brightnessPWM;i++){ 
          analogWrite(LEDs,i);
          delay(glowDelay);
        }
        lcd.clear();  
        exposureLoop=1;
      }
    } //End of While
    exposureLoop=0; 
  } //End Of Startup Button
  delay(20);
}//End of loop

Demo

With the code complete, connect the Arduino nano board to your computer and upload the code to it. Ensure to select the right board type and COM port as the case may be.

After the upload, power up your device. You should see the LCD come up with the initialization messages being displayed.  Feel free to test things out with any design, you should see more efficient design transfer than with heat or any other method.

That’s it. Your very own PCB Exposure BOX. Feel free to reach out via the comment section if you have any questions about this build.

Project credit goes to Techbuilder, and a video version of the tutorial is available on youtube here.

Expansion Shield – Breakout Board for Arduino Nano

 

If you need to interface many devices and sensors to Arduino Nano, then, this project is for you. This is a Nano expansion I/O shield (breakout board) for the Arduino Nano. The board facilitates the easy connection between Arduino Nano and other devices.  Each Arduino (I/O) Pin including the 5V DC and GND pins are available for easy connection to the sensors and other devices. The board enables the easy interface of many devices and sensors which includes various power voltage options. It provides several different options for power outputs and wide range of operating power supply input.

Features

  • All I/O pins including 5V DC and GND Pins (5V-I/0-GND)
  • On-Board TX/RX/5V/GND Connector for Serial Interface
  • On-Board I2C Connector (A5SCL- A4SDA-5V-GND)
  • 2x Connector for Power Output: VD (Input Supply After Diode), 5V DC, 3.3V DC)
  • Supply Input 7V to 24V DC Using DC Jack or Header Connector
  • On-Board 5V Regulator L317-Adj (Output Set to 5V)
  • On-Board 3.3V Regulator LM1117-3.3V
  • On-Board Power LED
  • On-Board DC Jack for Power Input 7V-24V DC
  • Reverse Supply Protection Diode on Power Input
  • Optional 4 Pin Header Connector for Power Input
  • On-Board Reset Switch
  • PCB Dimensions 62.55 x 48.90mm

Schematic

 

Parts List

Connections

Gerber View

 

Photos

Video

Forlinx Launches OK1028A-C networking SBC Offers LVDS displays

Forlinx has launched the OK1028A-C SBC, alongside a FET1028A-C module, which is designed based on Cortex -A72 featuring dual-core processor LS1028 A up to 1. 5G Hz. It features on-board 2GB DDR4 RAM and 8GB eMMC, can support 5 Gigabit Ethernet ports with TSN, 2 CAN-FD, USB3.0, UART, SPI, IIC, LVDS, TF card slot, SATA3.0, Headphone peripheral sources, and preserved with M.2 Key B for 5G module, mini PCIe for 4G module, and M.2 Key E for WiFi module. This is coming after Forlinx launched the headless OK1043A-C and OK1046A networking SBCs last year, which are powered by NXP’s quad-core, Cortex-A53 LS1043A, and quad -A72 LS1046A SoCs. However, the older SBCs do not enable video output, and you can only carry out configuration via a computer or laptop either through a UART interface or a web interface. To solve this problem, Forlinx released the new OK1028A-C which offers both a display interface and TSN (Time-Sensitive Networking).

The OK1028A-C is based on the FET1028A-C, and features 5x GbE ports with TSN, a microSD slot, USB 3.0 host port, 2x CAN-FD ports, SATA III with SATA power, and a UART debug DB9 port. It features an LVDS interface which enables a PWM backlight control and a headphone jack and speaker. The OK1028A-C also enables a mini-PCIe slot that supports an optional 5G module and a M.2 B-key slot which supports an optional 4G module, both with the help of a SIM card slot. Available also is an M.2 E-key module with PCIe Gen2 which supports an optional, dual-band WiFi module. If offers additional interfaces like JTAG, SPI, 3.3V UART, and 2x I2C. The board offers a 12V jack with power and reset switches, 2x programmable LEDs, and an RTC with battery. The OK1028A-C SBC runs Ubuntu 18.04 with Qt 5.9.9 with the development of HMI applications. The OK1028A-C can be applied to Industrial IoT, TSN, SD-WAN, 5G CPE, edge computing, gateway, IP-PBX, smart factory, information security, intelligent transport, power management,

FET1028A-C module

The FET1028A-C module that drives the OK1028A-C SBC supports up to 5x 2.5GbE ports, as well as SerDes technology, but the SBC is limited to 5x 1GbE ports. This is compared to up to 6x or 7x 1GbE ports on the OK1043A-C and OK1046A, respectively. Those earlier boards also feature a 10GbE port and the OK1046A adds a 10GbE SFP+ or SFP-GE cage. The FET1028A-C features a 4-port TSN switch with 2.5GbE support and also support for a fifth 2.5GbE port and a GbE port. Five of the GbE ports can be configured by SerDes with SATA III and 2x up to 8GT/s PCIe 3.0 in various combinations with SGMII and QSGMII Ethernet. The 65 x 42mm FET1028A-C module also features 2GB DDR4 and 8GB eMMC, and enables DP 1.3 and eDP 1.4 interfaces up to 4Kp60. Other features includes up to 2x USB 3.0, 2x CAN FD, 4x UART, 6x I2C, 6x I2S, 2x SPI, and SD 3.0. The module has an operating range of -40 to 85℃.

Forlinx OK1028A-C specifications include:

  • FET1028A-C system-on-module
    *SoC – NXP LS1028A dual-core Cortex-A72 processor @ up to 1.5GHz
    *System Memory – 2GB DDR4
    *Storage – 8GB eMMC flash
    *Board-to-board connectors with
  • Display – DP1.3 and eDP 1.4, up to 4Kp60
  • Storage – 1x SATA III up to 6Gbps, configured by SerDes
  • Networking – Up to 6x Ethernet up to 2.5Gbps, TSN support, and 4-port TSN switch; 5x Ethernet ports can be configured by SerDes
  • PCIe – Up to 2x PCIe 3.0 interfaces up to 8GT/s, configured by SerDes
  • USB – Up to 2x USB 3.0 5Gbps interfaces
  • Various low-speed interfaces – 4x UART, 2x CAN FD, 6x I2C, 2x SPI, etc…
  • Supply Voltage – 12V DC (TBC)
  • Dimensions – 65 x 42 mm
  • Temperature Range – -40℃~ +85℃

The FET1028A-C and OK1028A-C SBC is available for an undisclosed price, buyers should bear shipping cost in mind. More information can be found on their product pages.

Orange Pi Zero 2 SBC debuts Allwinner H1616

With the market being flooded by “Pi” branded products, it becomes hard to find out which ones deserve your attention and bring something new to the table, and not just impersonate the original Raspberry Pi models. This is as big of a rant you are going to get today, as we take a peek to the new Orange Pi Zero 2 and find out where it stands in this Pi world we live in.

The Orange Pi Zero 2 is an alternative to the Pi Zero, and has been unveiled over a year ago, but only now has started shipping orders. It build upon its predecessor by switching from an ARM Cortex-A7 based processor, the Allwinner H2, to a much faster, Cortex-A53 based Allwinner H616 (clocked at 1.5 GHz), which blows the Raspberry Pi Zero right out of the water in terms of performance for about the same price and a less rectangular, but just a tad bit bigger size, coming at a size of 60 x 53 mm (compared with the 66 x 30 mm of the Raspberry Pi Zero). Besides that, it offers you the option for 512 MB or 1 GB of RAM, and upgrades its predecessor Orange Pi Zero in almost every level: processor, RAM, adds Bluetooth 5.0, faster Wi-Fi and ethernet, provides a micro HDMI interface and switches its power to USB type-C, instead of micro USB.

Looking at its specs in greater detail:

  • Allwinner H616: 64-bit quad-core ARM Cortex-A53 processor, clocked at 1.5 GHz
  • Mali G31 MP2 GPU: Supports OpenGL ES 1.0 / 2.0 / 3.2 and OpenCL 2.0
  • Memories: 512 MB / 1 GB DDR3 RAM (shared with the GPU) + 2 MB SPI Flash + SD card storage
  • Connectivity: Dual band Wi-Fi, Bluetooth 5.0 and 10M / 100M / 1000M ethernet
  • Video output: Micro HDMI 2.0a up to 4K@60 fps and TV CVBS output (support for PAL / NTSC) via 13 pin interface board
  • 3x USB 2.0 host (2 of them via 13 pin interface board)
  • Peripherals: 26 pin header with I2C, SPI, UART and GPIO ports + 13 pin header with 2x USB host, IR pin, TV-out, audio (no mic) and 3 GPIO ports
  • Power: 5V 2A via USB Type-C interface
  • Support for Android 10, Ubuntu and Debian
  • 53 mm x 60 mm dimensions and weight of 30 grams
A detailed view of the Orange Pi Zero 2

Regarding this set of specifications, there is a lot of potential projects you can do with it. In my opinion, this board seems like the perfect candidate for an Android TV box, but that is only an idea. You can use it as a computer for Linux, gaming, video applications, among other things. Your creativity is the limit. Lastly, you are probably wondering about the price: remember me saying that the board competes with the Raspberry Pi Zero? By the specs it offers, it blows that out of the water, and the pricing is only $18.99 for the 1 GB RAM version, which is crazy. I think it is worth a go.

Orange Pi Zero 2 link: http://www.orangepi.org/Orange%20Pi%20Zero2/

Bluetooth 5.2 Module Powered by Energy Efficient Arm Cortex-M33

The NORA-B10 series are small, stand-alone Bluetooth 5.2 low energy, wireless microcontroller unit (MCU) modules from the Swiss wireless chip manufacturer u-blox. These modules are built around the Nordic nRF5340 chip that is powered by two Arm® Cortex®-M33 processor cores. The first core is intended for high-performance applications, clocked at either 128 or 64 Mhz. The second core is clocked at 64 Mhz and optimized for the wireless protocol stack and less demanding applications. The maximum range of these modules is estimated at around 700 meters.

As the manufacturer claims, applications on the first core can run without being interrupted by network activity on the second core. This makes it very advantageous for time-critical applications where a quick response is prioritized. Also, the modules support trusted execution with Arm TrustZone and root-of-trust with Arm CryptoCell-312. NORA-B10 has the support for the new Bluetooth 5.2, which has highlighted features such as Angle-of-Arrival and Angle-of-Departure, Bluetooth long-range, and low energy audio.

The intended wireless application of the module is backed up by its wide range of support for Bluetooth low energy services such as serial port communication, GATT, beacons, and mesh. Also, they have support for NFC and IEEE 802.15.4 with Thread and Zigbee. A wide range of wired interfaces is also there such as UART, QSPI, SPI, I2C, I2S, USB, QDEC, PDM, PWM, and ADC.

There are three Nora-B1 products, differing in their antenna set-up mainly:

  • NORA-B100 with U.FL connector for an external antenna
  • NORA-B101 with antenna pin for an external antenna
  • NORA-B106 with internal PCB antenna

Promising industrial applications of these modules can be found in industrial automation, medical and healthcare, telematics, smart cities, and buildings. Specific applications may include connected tools, advanced and medical wearables, smart lighting, asset tracking, indoor location, low power sensors, as well as wireless-connected and configurable equipment.

Samples for these modules are scheduled to be available in Q4 2020. More information can be found here.

New SMARC Module supports AI-based point-of-sale applications

The Kontron SMARC-fA3399 module with Arm® Rockchip processor is suitable for high performance applications and is leading regarding price/performance ratio – a dedicated software community continuously pushes the application spectrum

Kontron, a global leader in IoT/Embedded Computing Technology (ECT), is launching the new fA3399 SMARC module, which uses the Rockchip RK3399K Arm® processor. In the benchmark of Arm®-based modules, the new module has the highest performance compared to its price, with six processor cores, which are derived from an energy-saving dual-core Arm® Cortex®-A72 and quad-core Cortex®-A53.

The robust module complies with the new SMARC 2.1 module standard with dimensions of 82 x 80 mm and is designed for the extended temperature range of -20 to +85 degrees Celsius. The module includes 2 GB, 4 GB or 8 GB Low-Power Double Data Rate (LPDDR4) SDRAM Memory down; displays can be connected via LVDS, DP and HDMI and an Arm® Mali-T860MP4 GPU ensures high performance for 2D and 3D graphic displays. Other connections include two Gbit Ethernet ports, three PCIe interfaces, six USB 2.0 and one USB 3.0 interface.

The Rockchip-CPU offers a perfect platform for non-critical applications around POS/POI like digital signage, retail or kiosk. Here, price pressure and speed are important drivers, because time-to-market is crucial to quickly place new contents/contexts close to the end customer.
Experiments are often based on the agile concept of the minimum viable product (MVP) and in this environment of customer communication, new possibilities of Artificial Intelligence are also used, which requires high computing power. This applies, for example, to advertising or information terminals that use AI image recognition algorithms to display adaptive content – depending on the gender and age of the recipients. Another example is supermarket scales that automatically recognize which fruit or vegetables are to be weighed.

All common Linux operating systems are supported, and since the processor is very well established in the maker environment, a large community is continuously developing the open source applications further on.

Sample quantities are available from Q1/2021. Kontron is also planning a 3.5″ board with this CPU.

more information: https://www.kontron.com/products/boards-and-standard-form-factors/smarc/smarc-fa3399.html

MP2018 is a 16 V, 500 mA, low quiescent current linear regulator

MPS’ MP2018 is a 16 V, 500 mA, low quiescent current linear regulator that features thermal shutdown and short-circuit protection (SCP)

The MP2018 from Monolithic Power Systems is a low-power, linear regulator that supplies power to systems with high-voltage batteries. This device includes a wide 3 V to 16 V input voltage range, low dropout voltage, and low quiescent supply current. The low quiescent current and low dropout voltage allow the MP2018 to operate at extremely low power levels, making it ideal for low-power microcontrollers and battery-powered equipment. The device is available in 3.3 V and 5 V fixed output voltage options. The regulator output current is limited internally and the device is protected against short-circuit, overload, and overtemperature conditions. The MP2018 also includes thermal shutdown and current-limiting fault protection and is available in a TO252-5 package.

Features

  • 10 µA quiescent supply current
  • Input range from 3 V to 16 V
  • 500 mA specified current
  • Specified current limit
  • Fixed output voltage
  • Stable, low-value output ceramic capacitor (>0.47 µF)
  • ±2% output accuracy
  • Power good with programmable delay
  • Thermal shutdown and short-circuit protection (SCP)
  • Specified junction temperature range of -40°C to +150°C
  • Available in a TO252-5 package

more information: https://www.monolithicpower.com/en/mp2018.html

FET1028A-C SoM Powered by LS1028A Offers Five-Port Networking Solution

Forlinx has published details on the headless sandwich-style OK1028A-C SBC with a FET1028A-C module powered with a 1.5GHz, dual-core, Cortex-A72 LS1028A. The SBC comes with the support for the LVDS interface to enable HMI (Human-Machine Interface) applications.

The FET1028A-C module has the support for five 2.5GbE ports but the OK1028A-C SBC is limited to five 1GbE ports. The OK1028A-C is equipped with a display interface and TSN (Time-Sensitive Networking). TSN is the technique that is often used as an economic alternative to proprietary Fieldbus technologies. It provides Ethernet time synchronization for guaranteed latency and Quality of Service (QoS).

The 65 x 42mm FET1028A-C module comes with 2GB DDR4 and 8GB eMMC memory. Other features include the support for DP 1.3 and eDP 1.4 interfaces up to 4Kp60. Available I/Os are 2x USB 3.0, 2x CAN FD, 4x UART, 6x I2C, 6x I2S, 2x SPI, and SD 3.0. The module has a robust operating temperature range of -40 to 85℃.

The SoM provides a 4-port TSN switch with 2.5GbE support as well as support for a fifth 2.5GbE port and a GbE port. Five of these native GbE ports can be configured by SerDes with SATA III and 2x up to 8GT/s PCIe 3.0 in various combinations with SGMII and QSGMII Ethernet.

Overview of SoM FET1028A-C :

  • CPU: NXP LS1028A, Dual-core Cortex-A72 @1.5GHz
  • Memory: 2GB DDR4, 8GB eMMC
  • Interface:
    • 1x Display Port; DP1.3 and eDP 1.4, up to 4Kp60
    • eSDH; SD3.0
    • Ethernet; CPU has 6 native MAC, up to 2.5Gbps
    • PCIe 3.0;  up to 8GT/s, configured by SerDes
    • SATA 3.0; up to 6Gbps , configured by SerDes
    • USB 3.0; up to 5Gbps
    • UART; can support 1x DUART or 4x UART
  • OS: Ubuntu 18.04
  • Power input: DC 12V
  • Working temperature: -40℃~ +85℃
  • Dimensions: 42mm×65mm

Ubuntu18.04 is well supported with apt-get installation on this board. Targeted applications are in the field of industrial IoT, TSN, SD-WAN, 5G CPE, edge computing gateway, IP-PBX, smart factory, information security, intelligent transport, power management and, various other fields.

The FET1028A-C module and OK1028A-C SBC appear to be available at an undisclosed price. More information may be found on the Forlinx FET1028A-C product pages.

Tigard Is Here to Bust Open Any Embedded Physical Interface You Can Find

We have all been there. You get a new development board, you go online to check how you communicate with it and then you realize you need a new connector that costs some extra cash. And here goes on the cycle of electronic waste, because it generally only works with boards from that company, hence you can deem them, dust catchers, as they provide no other use to you. This becomes even more inconvenient when you have to work in more than one place and keep forgetting the connectors. And I did not bring up debugging, which is mandatory if you do more than a printf(“Hello World!”), and you do, so we can add a logic analyzer to the mix, it is something you should not live without. If only there was a way to condense all this clutter into a single package… Wait, there is, Tigard!

Tigard is an open-source, multi-protocol multi-voltage PCB to be used in hardware hacking. It combines a bunch of common pinouts, a labeled wiring harness, an onboard level shifting, and a connector for a logic analyzer and was specifically designed to attach and communicate with the low-speed interfaces found in hardware platforms. Tigard supports the most popular interfaces and some very useful features on a very small board. It can act as a replacement for many of your tools bought specifically for this or that board and just clutter your working space and add to your project’s expenses. It has native support for commonly used hardware tools, such as OpenOCD, FlashROM, and many more. The Tigard may be a simple device, but it enables about 80% of all the common hardware hacking tasks needed, so it can serve as a very useful starting point, or even as the only thing you need.

The TIgard along with a companion logic analyser
The TIgard along with a companion logic analyser

Regarding specifications, the Tigard has: 

  • USB Type-C high-speed interface (480 Mbps)
  • FTDI FT2232HQ dual high-speed multipurpose UART / FIFO IC
  • High-performance directional level shifters ranging from 1.8 to 5.5 V
  • Switch to choose between on-board 1.8, 3.3 and 5 V and off-board target voltage supplies
  • Switch to choose between SPI / JTAG and I2C / SWD modes
  • Logic analyzer port to check the signals on devices
  • Indicator lights for debugging purposes

Now, where can you apply this? For starters, you can plug it into a device you are trying to reverse engineer, program MCUs by using the JTAG and SWD interfaces and use the logic analyzer port (and a respective logic analyzer) to observe the interactions at the same time, for instance, with an I2C OLED display.

Lastly, the Tigard is available through CrowdSupply, is already funded. You can get the Tigard for $39, the Tigard with a logic analyzer for $69, and a crazy kit for $1337. Overall, we think the second option is the most competitive.

Tigard CrowdSupply link: https://www.crowdsupply.com/securinghw/tigard

Turing Pi 2 mini-ITX case houses a Compute Module 4 from Raspberry Pi

Are you on the market for a beefy, general use or cluster computer, but do not want to break the bank or have a giant, power-hungry machine in your office? You might be thinking “nah, too many compromises, no way this is going to work”. Then think again, because you should never underestimate the power of the Raspberry Pi. Now, if you place 4 Raspberry Pi Compute Module 4 boards with the aid of a Turing Pi 2, there you have it!

The Turing Pi 2 (is of course, a second iteration) is a break in the trends of computing, due to its small size and enormous capabilities. Making use of the new Compute Module 4 from Raspberry Pi, it places up to four of them in order to provide as much or more computing power than its predecessor, which used seven Compute Modules 3+, downsizing an already small cluster! Right now, let us discuss the internals of the Turing Pi 2. Being a mini-ITX desktop cluster enables you to configure up to four Compute Module 4’s (CM4) with a maximum of 32 GB of RAM memory. Its mainboard includes connectors for Mini PCI Express, two SATA 3 ports, dual Gigabit Ethernet, an ATX power connector, HDMI output, and a DSI to which you can connect the official Raspberry Pi touchscreen, besides four USB ports (there is no confirmation that they are USB 3.0, but it is likely).

There is something you might be wondering if you own a Compute Module 4: they are not compatible with the Mini PCI Express, so how did they solve this issue? Simple, they designed an adaptor specifically for the CM4. They also considered the cooling issue we have been witnessing with the new Raspberry Pi modules. As they run hotter than hell (especially when we overclock them), a fan is necessary to cool each of the CM4 modules individually. A nice touch that will only increase the performance and the lifespan of your cluster.

The layout of the Turing Pi 2
The layout of the Turing Pi 2

Now, where can you use the Turing Pi 2? Firstly, as an edge infrastructure for your applications (both consumer and industrial grade), enabling you to host your apps locally affordably and gradually adding cluster blocks if you deem necessary, along the line. Another possibility is to use it as an ARM workstation and take advantage of its 32 GB of RAM, where one node can be used to run a desktop version of an OS and the other 3 can perform compilation, testing, debugging tasks, and developing cloud-native solutions for ARM clusters.

Lastly, the pricing is not yet available, which is normal, since the product is only queued for the next year. So far, we know that is expected to be cheaper to manufacture than its predecessor and the buyers of the Turing Pi 1 will get a sweet 25% discount. We can only wait patiently for more updates on the promising 2!

Turing Pi 2 link: https://turingpi.com

TOP PCB Companies