mikroE RELAY click je ekonomična ekspanziona ploča u click standardu koja na sebi ima dva Omron G6D releja SPST-NO tipa. Omron G6D je malih dimenzija 6.5 × 17.5 × 12.5 mm u plastičnom kućštu. Sposoban je da prekida tok struje do 5 A, a kao kontrolni signal koristiti se napon do 5 VDC. Maksimalni prekidačni napon je 250 VAC i 30 VDC. Proizvođač garantuje 300.000 operacija sa maksimalnom strujom kroz teminale od 2 A.

Pločica dolazi u standardnoj kartonskoj kutiji i uredno je urađena. Odmah se uočava opsesija prema detaljima koja inače izdvaja sve mikroE proizvode, bez obzira na njihovu cenu. Od šesnaest pinova na click ploči, za upravljačke signale za kontrolu rada releja se koriste samo dva, označeni sa RL1 i RL2. Uz jedanaest nepovezanih (NC), tu su i još dva GND i jedan 5 VDC pin. Sve što nam je potrebno je ploča sa microBUS konektorom, ali se može koristiti i klasični protoboard, budući da je razmak između niza hedera na mikroE click pločama u standardu.
Uz dva releja, svaki kontroliše jednu liniju, na ploči se nalazi po jedna pripadajuća LED dioda. Desni relej 1 ima crvenu, a levi relej 2 žutu. Tu je i dodatna zelena PWR koja označava da je mikroE click pod radnim naponom. Naime, da bi funkcionisao, potrebno je dovesti 5 VDC na pripadajući pin označen sa 5V, kao i povezati GND. Kontrolni naponi na pinovima RL1 i RL2 su 3 VDC i njih ćemo u ovom mini projektu dovesti sa Conexio Stratus razvojnog sistema. Cena RELAY click-a je $22,00.

Conexio Stratus sa nRF9160 SiP-om smo opisali u posebnoj recenziji ranije. U međuvremenu se pojavio i upola jeftiniji naslednika Conexio Stratus Pro sa nRF9161 SiP-om kojeg smo takođe upoznali. Kako nemamo Conexio Stratus Shield sa microBUS konektorom, odlučili smo se za stariji nRF9160 model čija je cena oko $180,00.
Conexio Stratus modeli su open source LTE-M/NB-IoT/GNSS Cellular-IoT razvojni sistemi baziran na seriji Nordic Semi nRF91xx SiP-ova koji se mogu napajati i baterijski uz prikupljanje energije u polju, usled svoje izuzetno male potrošnje. Stoga su odlično rešenje za sve aplikacije praćenja i nadgledanja mobilnih objekata sa svetskom pokrivenošću.

Za razvoj aplikacija na Conexio Stratus razvojnim sistemima je predviđen Zephyr RTOS. Zephyr hostuje Linux fondacija, open source RTOS je u pitanju i razvijen je sa idejom da se podrži što veći broj različitih procesora/razvojnih sistema/platformi kako bi se omogućio unificiran razvoj embedovanih rešenja i skratilo vreme timovima potrebno da se proizvod razvije i predstavi na tržište. Iako trenutna verzija 4.1 zvanično pokriva preko 750+ sistema, Conexio Sratus nije među njima. Međutim, Conexio tim je dao sopstveni Zepyr firmware-SDK koji se koristi za razvoj aplikacija uz Visual Code Studio. Za flešovanje, nije potreban dodatan programator, već se Conexio Stratus može programirati iz terminala preko USB-C kabla. Postupak instalacije, konfiguracije i korišćenja dali smo u samoj recenziji.
Kontrola rada releja radi se jednostavnim dovođenjem 3 VDC napona na neki od pinova. Ako pogledamo Conexio Stratus Shield videćemo da su CS i PWM pinovi na mikroBUS-u kontrolni pinovi za releje 2 i 1. Iz šeme vidimo da je CS povezan sa P0.18 GPIO nRF9160, dok je PWM „otkačen“. Ovo znači da Shield nećemo moći da koristimo za kontrolu releja 1. Da stvar bude još gora i 5V je „otkačen“ pa ni sam RELAY click ne može da se pravilno napaja.

Nažalost, nepovezanost PWM pina, kao i NC umesto 5V na istom hederu su velike upotrebne mane ovog Shield-a i time je drastično smanjen broj mikroE click ploča koje se mogu koristiti. Dalji rad smo morali da nastavimo na protoboard-u.

Povezali smo P0.18 i PL2, a P0.17 sa PL1 pinom. Doveli 5 VDC i GND na RELAY click i zasijala je zelena LED, što znači da je sve korektno plarisano. Da bismo upravljali relejima, potrebno je da softverski upravljamo P0.17 i P0.18 pinovima, što znači da je potrebno dodati ova dva pina u devicetree overlay kao izlazne led pinove. Pogledamo li u fajl conexio_stratus_common.dtsi koji se nalazi u direktorijumu conexio-firmware-sdk/boards/conexio/stratus u firmware-SDK direktorijumu. Videćemo da je postojeći plavi LED povezan na P0.3 na ploči i odmah primećujemo i alias za taj čvor.
/ {
leds {
compatible = "gpio-leds";
blue_led: led_0 {
gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
label = "Blue LED";
};
};
aliases {
led0 = &blue_led; /* For user programmable purpose */
};
};
Kako nije dobra praksa menjati osnovni devicetree, napravićemo sopstveni overlay. U root direktorijumu projekta kreiramo direktorijum boards i u njemu devicetree overlay fajl koji smo mi nazvali conexio_stratus_ns.overlay. Ime može biti bilo koje, ali ekstenzija mora biti .overlay.
/ {
leds {
compatible = "gpio-leds";
relay_1:relay1 {
gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
label = "Relay 1";
};
relay_2:relay2 {
gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
label = "Relay 2";
};
};
aliases {
relay1 = &relay_1; /* For user programmable purpose */
relay2 = &relay_2; /* For user programmable purpose */
};
};
U bazičnom modu dodajemo opise za dva izlazna noda relay1 i relay2 na 17 i 18 GPIO pinu. Definisaćemo i aktivan status izlaza kao HIGH u ovom slučaju. Odmah ćemo dodati i aliase koji su zgodni pri pisanju programa. Njih ćemo iskoristiti za dobijanje indetifikatora čvora svakog od relejskih kontrolnih pinova.
#define RELAY1 DT_ALIAS(relay1)
#define RELAY2 DT_ALIAS(relay2)
Nakon toga ćemo inicijalizovati same GPIO linije i konfigurisati ih kao izlaze sa LOW nivoom.
static struct gpio_dt_spec relay1 = GPIO_DT_SPEC_GET(RELAY1, gpios);
static struct gpio_dt_spec relay2 = GPIO_DT_SPEC_GET(RELAY2, gpios);
gpio_pin_configure_dt(&relay1, GPIO_OUTPUT_LOW);
gpio_pin_configure_dt(&relay2, GPIO_OUTPUT_LOW);
Upravljanje stanjem na pinu vršimo komandom gpio_pin_set_dt u kojoj referenciramo izlaz i definišemo njegovo trenutno stanje, poput primera ispod.
gpio_pin_set_dt(&relay1, LED_ON);
gpio_pin_set_dt(&relay2, LED_OFF);
U skladu sa svim rečenim modifikovaćemo button demo program koji dolazi sa Conexio Stratus firmware-SDK-om i dobijamo finalni funkcionalni main.c. Program na početku oba releja stavlja u stanje prekida. Nakon pritiska na taster koji je ugrađen na Conexio Stratus ploči, prvo se zatvara relej 1, zadržava jedno vreme u tom stanju, a nakon toga on prekida liniju i zatvara se relej 2. Na kraju oba releja su otvorena i kroz terminale ne teče signal.
/*
* Copyright (c) 2025 Conexio Technologies, Inc.
* Author: Rajeev Piyare <rajeev@conexiotech.com>
*
* Modify by magazin Mehatronika
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/logging/log.h>
#include <zephyr/drivers/gpio.h>
/* Include the dk button library */
#include <dk_buttons_and_leds.h>
#define GPIO_NODE DT_NODELABEL(gpio0)
#define ZEPHYR_USER_NODE DT_PATH(zephyr_user)
/* The devicetree node identifier for the "led0" alias. */
#define LED DT_ALIAS(led0)
#define RELAY1 DT_ALIAS(relay1)
#define RELAY2 DT_ALIAS(relay2)
static struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED, gpios);
static struct gpio_dt_spec relay1 = GPIO_DT_SPEC_GET(RELAY1, gpios);
static struct gpio_dt_spec relay2 = GPIO_DT_SPEC_GET(RELAY2, gpios);
static const struct device *gpio_dev;
LOG_MODULE_REGISTER(app);
/* Set the sleep time */
#define SLEEP_TIME_MS 1000
#define LED_ON_TIME_MS 2000
#define LED_OFF 0
#define LED_ON !LED_OFF
/* Define the button handler function */
static void button_handler(uint32_t button_states, uint32_t has_changed)
{
/* Check for the button state */
if (has_changed & button_states & BIT(CONFIG_BUTTON_EVENT_BTN_NUM - 1)) {
printk("Button pressed\n");
/* Blink the LED on Stratus board */
gpio_pin_set_dt(&led, LED_ON);
gpio_pin_set_dt(&relay1, LED_OFF);
gpio_pin_set_dt(&relay2, LED_OFF);
k_msleep(LED_ON_TIME_MS);
gpio_pin_set_dt(&led, LED_OFF);
gpio_pin_set_dt(&relay1, LED_ON);
gpio_pin_set_dt(&relay2, LED_OFF);
k_msleep(LED_ON_TIME_MS);
gpio_pin_set_dt(&relay1, LED_OFF);
gpio_pin_set_dt(&relay2, LED_ON);
k_msleep(LED_ON_TIME_MS);
gpio_pin_set_dt(&relay1, LED_OFF);
gpio_pin_set_dt(&relay2, LED_OFF);
}
}
void init_led(void)
{
gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);
gpio_pin_configure_dt(&relay1, GPIO_OUTPUT_LOW);
gpio_pin_configure_dt(&relay2, GPIO_OUTPUT_LOW);
}
int main(void)
{
printk("Button and Blink sample app for %s\n", CONFIG_BOARD);
gpio_dev = DEVICE_DT_GET(GPIO_NODE);
if (!gpio_dev) {
printk("Error getting GPIO device binding\r\n");
return false;
}
/* Initialize the LED pin */
init_led();
/* Initialize the button handler */
dk_buttons_init(button_handler);
while (1) {
k_msleep(SLEEP_TIME_MS);
}
return 0;
}
NAPOMENA: Za praktičnu proveru softverskih rešenja korišćeni su Conexio Stratus i mikroE RELAY click koje smo dobili od proizvođača za potrebe pisanja recenzija.