Code zoeken

16 Kanaal Relaismodule 5V relaisspanning vast

16 Kanaal Relaismodule 5V relaisspanning vast

Introductie

Dit project behandelt een kritiek ontwerpfout die in veel 16-kanaals 5V-relaismodules wordt aangetroffen. Hoewel deze modules op de markt worden gebracht als 5V-apparaten, levert de spanningsregelaar aan boord vaak alleen de gereguleerde 5V aan de optocoupler-schakeling, waardoor de eigenlijke relaisspoelen de volledige, ongereguleerde ingangsspanning ontvangen. Als u de module voedt met iets hogers dan 5V—zoals een 9V- of 12V-voeding—riskeert u schade aan de relais en eventuele aangesloten apparaten.

16 Channel Relay module
16 Channel Relay Module -2

Deze handleiding toont een eenvoudige en effectieve hardware-oplossing om ervoor te zorgen dat de relaisspoelen altijd de juiste 5V ontvangen, ongeacht de ingangsspanning. Dit is een cruciale aanpassing voor elk project waarbij betrouwbaarheid essentieel is. Hier zijn een paar praktische toepassingen waarbij deze oplossing essentieel is:

  • Het bouwen van een domoticahub die 16 verschillende apparaten (lampen, ventilatoren, kachels) aanstuurt vanuit één enkele voeding met hogere spanning.
  • Het creëren van een industrieel bedieningspaneel waarbij een 24V-industriële voeding wordt gebruikt, maar de logica en relais een stabiele 5V vereisen.
  • Het upgraden van een bestaande 16-kanaals relaismodule om een breder bereik aan ingangsspanningen aan te kunnen zonder risico op componentstoringen.

Hardware-overzicht

De kern van het probleem ligt in de stroomverdeling van de module. De ingangsspanning (bijv. 12V) wordt naar een spanningsregelaar (vaak een LM2596) gevoerd, die deze verlaagt naar een schone 5V. Deze gereguleerde 5V wordt echter alleen gebruikt om de optocouplers van stroom te voorzien, die de stuursignalen isoleren. De relaisspoelen en de ULN2003-driverchips zijn per abuis rechtstreeks aangesloten op de ruwe ingangsspanningslijn. Dit betekent dat een 12V-ingang 12V aan de 5V-relaisspoelen zou leveren, waardoor ze oververhit raken en uiteindelijk defect raken.

De video toont dit probleem duidelijk. Met een ingang van 8,72V wordt gemeten dat de relaisspoel 7,75V ontvangt, wat gevaarlijk hoog is voor een component die geschikt is voor 5V (in de video op 03:17).

Hardware/componenten

  • 16-kanaals 5V-relaismodule
  • Soldeerbout en soldeertin
  • Draadknipper/stripper
  • Een scherp mes of snijgereedschap
  • Een stukje verbindingsdraad
  • Multimeter voor het testen
  • Voeding (bijv. 9V of 12V) voor het testen

Bekabelingshandleiding

De oplossing omvat een eenvoudige herbekabelingsprocedure. Het doel is om de stroombaan die de ULN2003-chips en de relaisspoelen van stroom voorziet los te koppelen van de ruwe ingang en deze in plaats daarvan aan te sluiten op de gereguleerde 5V-uitgang. De video toont een gedetailleerd schema van het gecorrigeerde circuit (in de video op 03:45).

Hier is het stapsgewijze proces dat in de video wordt gedemonstreerd:

  1. Identificeer de stroombaan: Volg eerst de PCB-sporen om te vinden waar de ruwe ingangsspanning naar de ULN2003-driverchips wordt geleid. In de video is dit een spoor dat onder een condensator naar pin 1 van de driverchips loopt (in de video op 05:15).
  2. Snijd het spoor door: Snijd met een scherp mes voorzichtig dit stroomspoor door. Hiermee worden de driverchips en relaisspoelen losgekoppeld van de ruwe ingangsspanning. De video toont deze snede op 05:56.
  3. Controleer de onderbreking: Gebruik een multimeter in de continuïteitsmodus om te bevestigen dat de ingangsspanning de driverchips niet langer bereikt (in de video op 06:11).
  4. Soldeer een nieuwe draad: Soldeer een nieuwe draad van het gereguleerde 5V-uitgangspunt (dat voorheen alleen de optocouplers voedde) naar het nu losgekoppelde stroompunt dat de driverchips en relais voedt. De video toont hoe de draad door een bestaand gat op de printplaat wordt geleid om de gemeenschappelijke pin van de relais te bereiken (in de video op 07:06).
  5. Test de oplossing: Voed de module met een spanning hoger dan 5V (bijv. 15V) en controleer met een multimeter dat de relaisspoelen nu exact 5V ontvangen (in de video op 07:37).

Uitleg van de code

De meegeleverde Arduino-code is een eenvoudig testprogramma om alle 16 relaiskanalen te doorlopen. U kunt dit gebruiken om te verifiëren dat uw hardware-oplossing correct werkt.

Het belangrijkste onderdeel dat u moet configureren is de controlPin-array. Dit definieert welke Arduino-pinnen zijn verbonden met de ingangspinnen van de relaismodule.

const int controlPin[16] = {2,3,4,5,6,7,8,9,10,11,12,A0,A1,A2,A3,A4}; // definieer pinnen

Pas deze lijst aan zodat deze overeenkomt met uw daadwerkelijke bedrading. De code gebruikt digitale pinnen 2-12 en analoge pinnen A0-A4, maar u kunt deze wijzigen naar elke beschikbare digitale I/O-pin op uw bord.

Een andere belangrijke variabele is triggerType. Deze staat standaard op LOW, wat gebruikelijk is voor veel relaismodules.

const int triggerType = LOW;// uw relaistype

Als uw relaismodule "actief HOOG" is (wat betekent dat u een HOOG signaal stuurt om hem IN te schakelen), kunt u dit wijzigen naar HIGH. De functie channelControl() handelt de logica voor beide typen af, dus u hoeft alleen deze ene variabele aan te passen.

Tot slot regelt de variabele loopDelay de pauze tussen elk kanaal in de testcyclus.

int loopDelay = 1000;// vertraging in lus

U kunt dit aanpassen om de test sneller of langzamer te maken.

Live project/demonstratie

Na de oplossing toont de video dat de module perfect werkt met een 15V-ingang. De multimeter toont de ingangsspanning op 15V, terwijl de gereguleerde spanning bij de relaisspoel een stabiele en veilige 5V is (in de video op 08:10). De relais klikken aan en uit zoals verwacht, wat bevestigt dat de oplossing succesvol is en de module nu hogere ingangsspanningen aankan zonder schade.

Hoofdstukken

  • [00:00] Inleiding tot het 16-kanaals relaisspanningsprobleem
  • [00:34] Het identificeren van de ontwerpfout
  • [01:56] Demonstratie van het spanningsprobleem
  • [03:45] Schema van het gecorrigeerde circuit
  • [05:07] Doorsnijden van de onjuiste stroombaan
  • [06:34] Solderen van de nieuwe 5V-verbinding
  • [07:37] Testen van de reparatie met 15V-ingang
  • [08:24] Conclusie en slotgedachten

Afbeeldingen

16 Channel Relay module
16 Channel Relay module
16 Channel Relay Module -3
16 Channel Relay Module -3
16 Channel Relay Module -2
16 Channel Relay Module -2
16 Channel Relay Module size
16 Channel Relay Module size
16 Channel Relay Module IC and Optocouplers
16 Channel Relay Module IC and Optocouplers
16 Channel Relay Module
16 Channel Relay Module
16 Channel Relay module 12V vs 5V difference
16 Channel Relay module 12V vs 5V difference
160-Code to control a 16-channel relay module using Arduino
Taal: C++
/*
 * Arduino code to control 16 channel relay with Arduino UNO
 * 
 * Written by Ahmad Shamshiri for Robojax.com on Sunday, October 8, 2018 
 * at 10:35 in Ajax, Ontario, Canada
 * Watch video instructions for this code: https://youtu.be/Q9aBI4ELKC4
 * 
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


const int controlPin[16] = {2,3,4,5,6,7,8,9,10,11,12,A0,A1,A2,A3,A4}; // define pins

const int triggerType = LOW;// your relay type
int loopDelay = 1000;// delay in loop
int tmpStat =1;


void setup() {
  for(int i=0; i<16; i++)
  {
    pinMode(controlPin[i], OUTPUT);// set pin as output
    if(triggerType ==LOW){
      digitalWrite(controlPin[i], HIGH); // set initial state OFF for low trigger relay
    }else{
       digitalWrite(controlPin[i], LOW); // set initial state OFF for high trigger relay     
    }
  }
  
  Serial.begin(9600);// initialize serial monitor with 9600 baud
}

void loop() {

  for(int i=0; i<16; i++)
  {

   channelControl(i,tmpStat,200);// turn each relay ON for 200ms

    
  }
  if(tmpStat)
  {
    tmpStat=0;
  }else{
    tmpStat=1;
  }
 Serial.println("===============");
 //channelControl(6,1, 2000); // turn relay 7 ON for 2 seconds
 //channelControl(6,0, 5000); // turn relay 7 OFF for 5 seconds
 //channelControl(9,1, 3000); // turn relay 10 OFF for ever

 delay(loopDelay);// wait for loopDelay ms
          
}

/*
 * funciton: channelControl
 * turns ON or OFF specific relay channel
 * @param relayChannel is integer value channel from 0 to 15
 * @param action is 1 for ON or 0 for OFF
 * @param t is time in milliseconds
 */
void channelControl(int relayChannel, int action, int t)
{
  int state =LOW;
  String statTXT =" ON";
  if(triggerType == LOW)
  {    
    if (action ==0)// if OFF requested
    {
      state = HIGH;
      statTXT = " OFF";
    }
    digitalWrite(controlPin[relayChannel], state);
    if(t >0 )
    {
      delay(t);
    }
       Serial.print ("Channel: ");
       Serial.print(relayChannel); 
       Serial.print(statTXT);
       Serial.print(" - "); 
       Serial.println(t);        
  }else{
    if (action ==1)// if ON requested
    {
      state = HIGH;     
    }else{
      statTXT = " OFF";    
    }
    digitalWrite(controlPin[relayChannel], state);
    if(t >0 )
    {
      delay(t);
    }
       Serial.print ("Channel: ");
       Serial.print(relayChannel); 
       Serial.print(statTXT);
       Serial.print(" - "); 
       Serial.println(t);    
  }

}

Bestanden📁

Schematisch