Motor akımı izleme, makinenin kendisine dokunmadan herhangi bir elektrik motorunun güç kablosunu bir sağlık sensörüne dönüştürür. Bu eğitimde bir motor kablosuna temassız (non-invasive) bir CT akım trafosu takacak, RMS akımı bir ESP32 ile ölçecek, MQTT üzerinden yayınlayacak ve aşırı yükleri, aşırı sayıda kalkışı ve anormal yük desenlerini işaretleyen bir Python servisi çalıştıracaksınız.
Motor Akımı Neden Bu Kadar Faydalı Bir Sinyaldir?
Akım, bir motorun ne kadar zorlandığını söyler. Akım trafosu elektrik panosundaki kablonun etrafına takıldığı için, hiçbir veri arayüzü olmayan eski makinelere de sonradan eklenebilir ve dönen parçalara hiçbir şey monte etmeniz gerekmez.
Saniyede tek bir akım okumasından şaşırtıcı miktarda bilgi çıkarabilirsiniz:
- Çalışma durumu: kapalı, boşta (motor yüksüz dönüyor) veya yüklü. Bu genellikle makine duruş takibini beslemenin en ucuz yoludur.
- Aşırı yük: kısa bir kalkış süresinden daha uzun süre etiket değeri olan tam yük akımının üzerinde akım.
- Yük sapması: giderek daha fazla akım çeken bir konveyörde sürtünen bir rulman, kaymış bir kayış ya da ürün birikmesi olabilir. Daha az akım çeken bir pompa kuru çalışıyor ya da kavitasyon yapıyor olabilir.
- Kalkış sıklığı: saatte çok fazla kalkış sargıları aşırı ısıtır ve ani bir artış genellikle bir kontrol sorununu ortaya çıkarır.
- Faz dengesizliği: her faz için bir akım trafosuyla, eşit olmayan akımlar besleme sorunlarına ya da sargı arızalarına işaret eder.
Motor akım imza analizi (MCSA) gibi daha gelişmiş teknikler, kırık rotor çubuklarını ve rulman kusurlarını tespit etmek için akımın frekans spektrumuna bakar. Bunlar çok daha hızlı örnekleme ve özel donanım gerektirir. Bu makaledeki her şey saniyede birkaç RMS değeriyle çalışır ve yine de en yaygın operasyonel sorunları yakalar.
Önce Güvenlik
CT akım trafosu temassızdır: tek bir yalıtılmış iletkenin etrafını sarar ve asla elektriksel temas kurmaz. Yine de akım trafosu, gerilimli parçaların bulunduğu bir panonun içine monte edilir. Montajı pano enerjisi kesilmiş halde yetkin bir elektrikçiye yaptırın, akım trafosunu yalnızca tek bir faz iletkeninin etrafına takın (manyetik alanların birbirini sıfırladığı çok damarlı kablonun tamamına asla takmayın) ve düşük gerilimli sensör kablolarını güç kablolarından ayrı tutun.
Donanım
| Parça | Amaç | Notlar |
|---|---|---|
| ESP32 DevKit | Örnekleme, RMS hesabı, Wi-Fi ve MQTT | ADC1 pini olan herhangi bir ESP32 |
| SCT-013-030 CT akım trafosu | 30 A'e kadar akım ölçer | Gerilim çıkışlı sürüm, nominal akımda 1 V |
| 2 x 10 kOhm direnç | Sinyali besleme geriliminin ortasına kaydırır | 3,3 V'tan bir gerilim bölücü oluşturur |
| 10 uF kondansatör | Kaydırma noktasını kararlı hale getirir | Bölücünün orta noktası ile GND arasında |
| 3,5 mm jak soketi | Akım trafosunu bağlar | İsteğe bağlı, ama fişi kesmekten daha düzenli |
En iyi çözünürlük için motorun tam yük akımının hemen üzerinde değerlendirilmiş bir akım trafosu seçin. 3 A'lik bir motorda 30 A'lik bir akım trafosu çalışır, ancak sinyal küçük ve gürültülü olur.
Kablolama
Akım trafosu sıfır etrafında merkezlenmiş bir AC gerilim verir, ESP32 ADC'si ise yalnızca pozitif gerilimleri okur. Sinyali aralığın ortasına kaydırın:
- İki 10 kOhm direnci 3,3 V ile GND arasına seri bağlayın.
- 10 uF kondansatörü orta noktadan GND'ye bağlayın.
- Akım trafosunun bir ucunu orta noktaya, diğerini GPIO 34'e bağlayın.
GPIO 34, Wi-Fi etkinken de çalışmaya devam eden ADC1'e aittir. ESP32 SCT-013 akım sensörü rehberi kalibrasyonu ve kablolama varyantlarını daha ayrıntılı ele alıyor.
Firmware: ESP32 Üzerinde Motor Akımı İzleme
Sketch, ADC'yi 200 ms boyunca 2.000 kez örnekler; bu, 50 Hz'de on, 60 Hz'de on iki şebeke periyodunu kapsar. Ortalamayı çıkararak DC kaydırmayı kaldırır, RMS gerilimi hesaplar ve ampere dönüştürür. Her saniye akımı ve basit bir durumu yayınlar.
#include <WiFi.h>
#include <PubSubClient.h>
#include <math.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST = "broker.connectmq.com";
const char* CLIENT_ID = "motor-ct-9be2c4";
const char* TOPIC = "connectmq/demo/9be2c4/line1/conveyor1/current";
const int CT_PIN = 34;
const float AMPS_PER_VOLT = 30.0f; // SCT-013-030: 1 V RMS = 30 A
const float CAL = 1.00f; // pens ampermetreyle karşılaştırdıktan sonra ayarlayın
const int SAMPLES = 2000;
const uint32_t SAMPLE_US = 100; // 10 kHz, 200 ms pencere
const float IDLE_A = 0.5f; // bunun altında motor kapalıdır
const float LOADED_A = 2.0f; // bunun üstünde motor yük altındadır
WiFiClient net;
PubSubClient mqtt(net);
uint16_t samples[SAMPLES];
float measureAmps() {
uint32_t next = micros();
for (int i = 0; i < SAMPLES; i++) {
while ((int32_t)(micros() - next) < 0) { }
next += SAMPLE_US;
samples[i] = analogReadMilliVolts(CT_PIN);
}
double mean = 0;
for (int i = 0; i < SAMPLES; i++) mean += samples[i];
mean /= SAMPLES;
double sumSq = 0;
for (int i = 0; i < SAMPLES; i++) {
double d = samples[i] - mean;
sumSq += d * d;
}
double vrms = sqrt(sumSq / SAMPLES) / 1000.0;
return vrms * AMPS_PER_VOLT * CAL;
}
void ensureConnected() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
}
while (!mqtt.connected()) {
if (!mqtt.connect(CLIENT_ID)) delay(2000);
}
}
void setup() {
Serial.begin(115200);
analogSetPinAttenuation(CT_PIN, ADC_11db);
WiFi.mode(WIFI_STA);
mqtt.setServer(MQTT_HOST, 1883);
ensureConnected();
}
void loop() {
ensureConnected();
mqtt.loop();
static uint32_t lastPub = 0;
if (millis() - lastPub < 1000) return;
lastPub = millis();
float amps = measureAmps();
if (amps < 0.1f) amps = 0; // gürültü tabanını bastır
const char* state = amps < IDLE_A ? "off" : amps < LOADED_A ? "idle" : "loaded";
char payload[128];
snprintf(payload, sizeof(payload),
"{\"current_a\":%.2f,\"state\":\"%s\",\"uptime_s\":%lu}",
amps, state, millis() / 1000);
mqtt.publish(TOPIC, payload);
Serial.println(payload);
}
Güvendiğiniz bir pens ampermetreyle bir kez kalibre edin: motoru sabit yükte çalıştırın, iki okumayı karşılaştırın ve CAL değerini aradaki orana ayarlayın. Ardından gerçek makineyi boşta ve yüklü çalışırken gözlemleyerek IDLE_A ve LOADED_A değerlerini belirleyin.
Akışı herhangi bir terminalden kontrol edin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i ct-viewer-9be2c4 -t "connectmq/demo/9be2c4/#" -v
Aşırı Yükleri ve Anormal Desenleri Tespit Etmek
Cihaz ham gerçekleri raporlar. Yorumlama, geçmişi görebilen bir servise aittir. Aşağıdaki Python abonesi (paho-mqtt 2.x), pratik ihtiyaçların çoğunu karşılayan dört kontrol uygular:
- Aşırı yük: kalkıştaki normal ani akımı göz ardı eden bir tolerans süresinden daha uzun süre etiket değerinin üzerinde akım.
- Kalkış sayımı: kayan bir saatlik pencerede sayılan, kapalıdan çalışır duruma geçişler.
- Yük sapması: son on dakikadaki yüklü durum ortalamasının öğrenilmiş bir normalle karşılaştırılması.
- Bayat veri: 30 saniye boyunca mesaj gelmemesi, sensörün ya da ağın çöktüğü anlamına gelir.
import json
import time
from collections import deque
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/9be2c4"
RATED_A = 8.5 # motor etiketindeki tam yük akımı
OVERLOAD_GRACE_S = 10
MAX_STARTS_PER_HOUR = 6
DRIFT_LIMIT = 0.20 # öğrenilen normalden %20 sapma
LEARN_SAMPLES = 1800 # 30 dakikalık yüklü çalışma
over_since = None
last_state = "off"
starts = deque()
loaded = deque(maxlen=600) # son 10 dakikanın yüklü örnekleri
learn = []
normal = None
last_seen = time.time()
def alert(client, kind, detail):
msg = {"ts": int(time.time()), "kind": kind, **detail}
client.publish(f"{PREFIX}/line1/conveyor1/alert", json.dumps(msg), qos=1)
print("ALERT", msg)
def on_connect(client, userdata, flags, reason_code, properties):
client.subscribe(f"{PREFIX}/line1/conveyor1/current", qos=1)
def on_message(client, userdata, msg):
global over_since, last_state, normal, last_seen
d = json.loads(msg.payload)
amps, state, now = d["current_a"], d["state"], time.time()
last_seen = now
if amps > RATED_A:
over_since = over_since or now
if now - over_since >= OVERLOAD_GRACE_S:
alert(client, "overload", {"current_a": amps, "rated_a": RATED_A})
over_since = now # tolerans süresi başına en fazla bir kez yeniden uyar
else:
over_since = None
if last_state == "off" and state != "off":
starts.append(now)
while starts and now - starts[0] > 3600:
starts.popleft()
if len(starts) > MAX_STARTS_PER_HOUR:
alert(client, "frequent_starts", {"starts_last_hour": len(starts)})
starts.clear()
last_state = state
if state == "loaded":
if normal is None:
learn.append(amps)
if len(learn) >= LEARN_SAMPLES:
normal = sorted(learn)[len(learn) // 2]
print(f"learned normal loaded current: {normal:.2f} A")
else:
loaded.append(amps)
if len(loaded) == loaded.maxlen:
avg = sum(loaded) / len(loaded)
if abs(avg - normal) / normal > DRIFT_LIMIT:
alert(client, "load_drift", {"avg_a": round(avg, 2), "normal_a": round(normal, 2)})
loaded.clear()
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="motor-analytics-9be2c4")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
time.sleep(5)
if time.time() - last_seen > 30:
alert(client, "stale", {"seconds_silent": int(time.time() - last_seen)})
last_seen = time.time()
Yalnızca aşırı yük kuralı için bu servise bile ihtiyacınız yoktur. ConnectMQ portalında current_a alanı üzerinde tanımlanan bir eşik uyarı kuralı, her eşik aşımını uyarı günlüğüne kaydeder. Python servisini sapma ve kalkış sayımı gibi durum tutan kontroller için saklayın.
Gördüklerinizi Yorumlamak
| Desen | Olası nedenler | Tipik eylem |
|---|---|---|
| Aynı yük altında akımın yavaşça artması | Rulman sürtünmesi, eksen kaçıklığı, kayış gerginliği, ürün birikmesi | Mekaniği inceleyin, titreşimle doğrulayın |
| Bir pompada akımın düşmesi | Kuru çalışma, kapalı vana, aşınmış çark, kavitasyon | Süreç koşullarını ve emiş tarafını kontrol edin |
| Sık ve kısa aşırı yükler | Sıkışmalar, küçük boyutlu motor, süreç değişiklikleri | Süreci ve motor boyutlandırmasını gözden geçirin |
| Saatte çok sayıda kalkış | Kontrol döngüsünde salınım, sensör titreşimi (chatter) | Kontrol mantığındaki histerezisi ayarlayın |
| Eşit olmayan faz akımları | Besleme dengesizliği, gevşek bağlantı, sargı arızası | Elektriksel muayene |
Akım, diğer sinyallerle birleştirildiğinde en güçlü halindedir. Artan titreşimle birlikte artan akım mekaniğe işaret ederken, normal titreşimle birlikte artan akım ve yükselen rulman sıcaklığı izleme değerleri aramayı daha da daraltır. IoT ile kestirimci bakım makalesi bu sinyallerin bir bakım stratejisinde nasıl birleştiğini gösteriyor.
Mantıklı Eşikler Seçmek
Tahminlerden değil, motor etiketinden başlayın. Tam yük akımı değeri sürekli çalışma için üst sınırdır; bu yüzden aşırı yük kuralı onu doğrudan, o makinede gözlemlediğiniz normal kalkış ani akımını kapsayacak kadar uzun bir tolerans süresiyle kullanmalıdır. Direkt yol vermeli kalkışlar bir iki saniye boyunca büyük bir ani akım çekerken, yumuşak yol vericiler ve sürücüler kademeli olarak hızlanır; bu yüzden doğru tolerans süresi motordan motora değişir.
Sapma için normal yüklü akımı, makinenin sağlıklı olduğunun bilindiği ve ürün karışımının tipik olduğu bir dönemden öğrenin. Hat çok farklı yüklere sahip birkaç ürün çalıştırıyorsa, ürün ya da reçete başına bir normal değer öğrenin ve aktif reçeteyi payload'a ekleyin. Aksi halde her ürün değişimi bir anomali gibi görünür ve operatörler uyarıları görmezden gelmeyi öğrenir; bu da izlemenin amacını boşa çıkarır.
Üretime Geçiş
Herkese açık broker test için harikadır, ancak topic'leri herkese görünür. Gerçek motorlar için:
- ConnectMQ portalında özel bir broker oluşturun ve üretilen kullanıcı adını, parolayı ve client ID'yi kullanın.
WiFiClientSecureile 8883 portunda TLS'ye geçin.- Varlıkların cihaz görünümünde doğal olarak gruplanması için
acme/plant1/packaging/line1/conveyor1/currentgibi ISA-95 topic'leri kullanın. - Ölü bir sensörün hemen çevrimdışı olarak raporlanması için bir Last Will mesajı ekleyin.
Barındırılan bir MQTT broker, siz analitiğe odaklanırken bu altyapıyı yamalı ve erişilebilir tutar. Akım izlemenin eksiksiz bir fabrika veri mimarisine nasıl oturduğunu görmek için akıllı üretim rehberini okuyun.
Motorlarınızı ConnectMQ ile İzleyin
ConnectMQ, MQTT broker'ınızı bulutta TLS, MQTT 5, canlı topic gezgini ve portala yerleşik eşik uyarılarıyla çalıştırır. app.connectmq.com adresinden kredi kartı gerektirmeyen ücretsiz Serverless planına kaydolun ve ilk CT akım trafonuzu bugün bağlayın.
Sık Sorulan Sorular
Motor akımı izleme neleri tespit edebilir?
Çalışma durumunu, aşırı yükleri, anormal kalkış sıklığını, yük sapmasını ve faz dengesizliğini güvenilir şekilde tespit eder. Rotor çubuğu ya da rulman kusurlarını akımdan tespit etmek yüksek hızlı örnekleme ve spektral analiz gerektirir.
CT akım trafosunu çalışan bir motora takmak güvenli mi?
Akım trafosu temassızdır, ancak gerilimli parçaların bulunduğu bir panoya monte edilir. Montajı pano enerjisi kesilmiş halde yetkin bir elektrikçi yapmalıdır.
Motor akımı okumalarını ne sıklıkla yayınlamalıyım?
Durum ve aşırı yük tespiti için saniyede bir iyi bir varsayılandır. Salt trend izleme için her 10 saniyede bir gibi daha yavaş hızlar da işe yarar.
Motor kapalıyken okumam neden akım gösteriyor?
Bu, ADC gürültü tabanıdır. Firmware'de küçük bir eşiğin altındaki değerleri bastırın ve sensör kablolarını güç kablolarından uzak tutun.



