Perhitungan Daya Speaker Aktif Dengan Baterai

Suatu speaker aktif 12V dapat diberi daya dari adaptor 12V maupun menggunakan baterai. Jika menggunakan baterai yang bisa diisi ulang seperti Li-Ion, sebaiknya menggunakan komponen BMS (Battery Management System) supaya penggunaan baterai lebih baik.

Berikut ini contoh penggunaan BMS dengan 6 baterai.

BMS memiliki beberapa fungsi berikut ini:

  • Pengaman untuk charging, supaya tidak terjadi overcharge, ataupun kesalahan arus/ tegangan untuk pengisian
  • Memastikan tegangan pada baterai yang diseri seimbang. Baterai yang telah diisi ulang berkali-kali dapat saja mengalami perubahan tegangan karena kecepatan pengisian pada setiap baterai berbeda.
  • Pengaman kalau baterai sudah habis. Baterai isi ulang biasanya bisa rusak kalau dipaksa dipakai walaupun sudah habis isinya.

Berikut ini perhitungan durasi pemakaian baterai tersebut. Asumsi:

  • speaker aktif mendapatkan energi dari baterai dengan BMS 40A
  • jumlah baterai yang dipakai 6 buah
  • susunan baterai seri paralel, paralel 2, diseri 3.
  • tegangan baterai 4,2 volt (tegangan 18650 bisa dari 3,7 volt sampai 4,2 volt)
  • kapasitas baterai 2600 mAh

Pertanyaan:
(1) berapa lama mampu dipakai untuk menyalakan speaker aktif 30 watt
(2) jika speaker aktif tersebut menggunakan adaptor, perlu berapa ampere

Jawaban (1):
Jika dianggap efisiensi amplifier adalah 100%, maka perhitungan sebagai berikut:
energi setiap baterai = tegangan baterai (volt) x kapasitas muatan baterai (Ah)
jumlah energi di semua baterai = 6 x tegangan baterai x kapasitas baterai
total energi tersimpan di baterai = 6 x 4,2 volt x 2600 mAh = 10,92 VAh = 65,52 Wh
waktu = energi / daya = 65,52 Wh / 30 watt = 2,184 jam = 2 jam 11 menit
Dalam prakteknya efisiensi amplifier bisa antara 50% ~ 90%, jadi durasi penggunaannya akan kurang dari 2 jam 11 menit.
Jika misalkan efisiensi = 50%, maka durasi akan menjadi: 2,184 jam x 50% = 1,092 jam

Jawaban (2)
Daya 30 watt
tegangan 12 volt
asumsi efisiensi 100% (semua daya dari adaptor menjadi energi suara)
daya = tegangan x arus
P = V x I
daya dan tegangan diketahui, tinggal menghitung arus.
I = P / V = 30 watt / 12 ampere = 2,5 ampere
Jadi diperlukan adaptor 2,5 ampere
Dalam prakteknya akan ada inefisiensi, jadi lebih baik pakai adaptor yang lebih dari 2,5 ampere

Sinkronisasi Waktu Dengan Network Time Protocol (NTP) pada Mikrokontroler ESP32

NTP (Network Time Protocol) adalah protokol komunikasi di jaringan komputer untuk sinkronisasi waktu melalui jaringan komputer. Sinkronisasi waktu ini penting pada aplikasi-aplikasi yang berbasis pewaktuan yang tepat, misalnya pencatatan ataupun untuk koordinasi aktivitas di suatu sistem berbasis IoT (Internet of Things).

ESP32 adalah mikrokontroler yang memiliki fitur Wi-Fi yang memungkinkan untuk tersambung ke jaringan komputer, termasuk ke suatu server NTP. ESP32 dapat menggunakan protokol NTP untuk sinkronisasi waktu dengan server NTP. Proses ini menyederhanakan kalibrasi waktu di ESP32. Alternatif lainnya adalah menggunakan RTC (real time clock) yaitu jam digital yang dibackup dengan baterai, ataupun dengan setting waktu secara manual. Teknik RTC perlu komponen tambahan, sedangkan setting manual memerlukan waktu dan tenaga. Selain itu sumber waktu di ESP32 juga tidak sepresisi sumber waktu di server NTP, sehingga setelah beberapa waktu maka jam di ESP32 akan bergeser dari setting awal.

Untuk mengakses NTP dari ESP32 dapat menggunakan library yang sudah ada, jadi tidak perlu lagi koding protokol secara dari nol. Library yang umum dipakai ada 2 macam yaitu:

  • Arduino Library NTPClient untuk Arduino. Library ini dapat dipakai di semua mikrokontroler Arduino.
  • Arduino ESP32 NTP untuk ESP32. Library ini hanya dapat dipakai untuk ESP32.

Persiapan

Sebelum menjalankan program NTP ini, ada beberapa hal yang perlu diperhatikan:

  • Arduino IDE sudah diinstal di desktop/laptop, dan libraray Arduino-ESP32 sudah diaktifkan
  • Konfigurasi ESP32 sudah diujicoba dengan program sederhana, misalnya lampu kedip (Blink)
  • Wi-Fi akses point dapat mengakses internet tersedia, dan juga sudah disiapkan nama akses point dan passwordnya.
  • Pahami zona waktu tempat anda. NTP memberikan waktu dengan standar GMT+0, jadi perlu disesuaikan jika anda memerlukan waktu lokal.

Arduino NTPClient

Cara pertama adalah menggunakan library NTPClient Arduino. Library ini dicantumkan di laman NTPClient di situs Arduino, namun tidak ada penjelasan sama sekali di situs tersebut. Untuk cara penggunaannya kita perlu melihat repository NTPClient di github. Contoh penggunaan ada di direktori /examples di repository tersebut.

Contoh kode juga dapat diakses dari Arduino IDE, dari menu File -> Examples -> NTPClient. Namun sedikit repot, karena daftar Examples cukup banyak dan urutannya tidak tepat abjad. Berikut ini tampilan menunya di Arduino IDE. (klik untuk gambar yang lebih besar).

Kode yang mudah dipakai adalah yang ‘Basic’ , namun kode ini perlu diubah sedikit seperti pada listing kode berikut ini.

#include <NTPClient.h>
// change next line to use with another board/shield
//#include <ESP8266WiFi.h>
#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  timeClient.begin();
}
void loop() {
  timeClient.update();
  Serial.println(timeClient.getFormattedTime());
  delay(1000);
}

Perubahan yang dilakukan adalah sebagai berikut:

  • Kode ini awalnya untuk ESP8266. Untuk dipakai di ESP32 maka header file mesti diganti, dari “ESP8266WiFi.h” menjadi “WiFi.h”
  • Sesuaikan nama SSID untuk akses point
  • Sesuaikan password untuk mengakses akses point. Perhatikan bahwa program NTP ini hanya dapat berfungsi jika ESP32 tersambung ke internet. Jadi pastikan Wi-Fi access point tersambung ke internet atau bisa juga menggunakan tethering ke smartphone

Berikut ini tampilan output ESP32 di serial monitor Arduino. Waktu adalah GMT+0, sedangkan di Indonesia adalah GMT+7, sehingga jam yang ditampilkan berbeda 7 jam.

Program di atas menampilkan waktu dalam UTC atau GMT+0. Untuk menampilkan dalam waktu lokal seperti WIB (Waktu Indonesia bagian Barat), gunakan fungsi setTimeOffset() untuk menambah/mengurangi waktu yang ditampilkan. Untuk WIB, waktu yang ditambah dalam detik adalah 7 x 60 x 60. Programnya menjadi sebagai berikut:

#include <NTPClient.h>
// change next line to use with another board/shield
//#include <ESP8266WiFi.h>
#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup() {
  Serial.begin(115200); 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  timeClient.begin();
  timeClient.setTimeOffset(7*60*60);
}
void loop() {
  timeClient.update();
  Serial.println(timeClient.getFormattedTime());
  delay(1000);
}

Beberapa hal yang dapat diambil/diubah dengan member function di di class NTPClient :

  • SetPoolServerName() : mengubah NTP server dari default pool.ntp.org
  • isTimeSet() : apakah berhasil mengambil waktu dari NTP server
  • getDay() : ambil hari dalam minggu (0 = minggu)
  • getHours() : ambil waktu jam
  • getMinutes() : ambil waktu menit
  • getSeconds() : ambil waktu detik
  • setTimeOffset() : menambah/mengurangi offset waktu yang ditampilkan dalam detik
  • getFormattedTime() : waktu terformat dalam bentuk string
  • getEpochTime() : jumlah detik sejak 1 Januari 1970

Arduino ESP32 NTP Library

Library ini adalah bagian dari Arduino ESP32, jadi hanya dapat dipakai di ESP32.

Fungsi-fungsi penting adalah:

  • getLocalTime() untuk mendapatkan waktu
  • configTime() untuk setting NTP
  • configTzTime() untuk set timezone

Contoh kode diambil dari contoh program SimpleTime.ino di repository arduino-esp32 .

Daftar timezone yang dapat dipakai dapat dilihat di https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h

Berikut ini adalah kode yang sudah dimodifikasi:

// sumber: libraries/ESP32/examples/Time/SimpleTime/SimpleTime.ino
// URL: https://github.com/espressif/arduino-esp32/blob/496b8411773243e1ad88a68652d6982ba2366d6b/libraries/ESP32/examples/Time/SimpleTime/SimpleTime.ino
// dimodifikasi untuk WIB (GMT+7)

#include <WiFi.h>
#include "time.h"
#include "esp_sntp.h"

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

const char *ntpServer1 = "pool.ntp.org";
const char *ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;

//const char *time_zone = "CET-1CEST,M3.5.0,M10.5.0/3";  // TimeZone rule for Europe/Rome including daylight adjustment rules (optional)
const char *time_zone = "WIB-7";  // Indonesia WIB

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("No time available (yet)");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

// Callback function (gets called when time adjusts via NTP)
void timeavailable(struct timeval *t) {
  Serial.println("Got time adjustment from NTP!");
  printLocalTime();
}

void setup() {
  Serial.begin(115200);

  // First step is to configure WiFi STA and connect in order to get the current time and date.
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);

  /**
   * NTP server address could be acquired via DHCP,
   *
   * NOTE: This call should be made BEFORE esp32 acquires IP address via DHCP,
   * otherwise SNTP option 42 would be rejected by default.
   * NOTE: configTime() function call if made AFTER DHCP-client run
   * will OVERRIDE acquired NTP server address
   */
  esp_sntp_servermode_dhcp(1);  // (optional)

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

  // set notification call-back function
  sntp_set_time_sync_notification_cb(timeavailable);

  /**
   * This will set configured ntp servers and constant TimeZone/daylightOffset
   * should be OK if your time zone does not need to adjust daylightOffset twice a year,
   * in such a case time adjustment won't be handled automagically.
   */
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);

  /**
   * A more convenient approach to handle TimeZones with daylightOffset
   * would be to specify a environment variable with TimeZone definition including daylight adjustmnet rules.
   * A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
   */
  configTzTime(time_zone, ntpServer1, ntpServer2);
}

void loop() {
  delay(5000);
  printLocalTime();  // it will take some time to sync time :)
}

Penyesuaian yang dilakukan adalah sebagai berikut:

  • Timezone diganti menjadi Waktu Indonesia bagian Barat (WIB-7)

Berikut ini output program di serial terminal

Kedua library tersebut fungsinya mirip-mirip. Library ESP32 memiliki fitur lebih banyak dan lebih cocok untuk dijalankan di ESP32.

Saran & Penyempurnaan

Contoh program NTP yang disajikan adalah program yang sangat minimalis untuk menunjukkan konsep NTP. Pada kondisi sesungguhnya, sistem mikrokontroler IoT ini akan menghadapi berbagai masalah, sehingga perlu ditambahkan penanganan beberapa kasus berikut:

  • Koneksi ESP32 ke server NTP tidak stabil, baik di local network maupun di internetnya.
  • Pada program perlu ditambahkan error handling jika terjadi koneksi internet putus ataupun koneksi Wi-Fi putus. Jika koneksi Wi-Fi putus, maka perlu ada prosedur untuk melakukan rekoneksi ulang ke akses point Wi-Fi. Jadi tidak perlu reset manual.
  • Pengubahan konfigurasi nama akses point dan password akses point secara software dengan interface tertentu. Pada contoh ini nama dan password dikodekan langsung di source code sehingga tidak dapat diubah. Pada kondisi nyata seharusnya dapat diubah oleh pemakai tanpa perlu mengubah source code.

Literatur

Simulasi Rangkaian Elektrik Online

Falstadt, simulator rangkaian elektrik Online. Antar mukanya menggunakan graphical, jadi sangat mudah. Visualisasi arus di setiap kabel juga bagus.

Falstadt

Simulator ESP32

  • Wokwi, mengklaim sebagai “World’s most advanced ESP32 simulator”. Dapat melakukan simulasi Arduino (Uno, Mega, Nano), ESP32, STM32 dan Pi Pico. Ada versi onlinenya di website Wokwi, dan ada juga versi offline yang dapat diinstall di VS Code / JetBrains (berbayar). Ada juga versi Wokwi Pro (berbayar) yang dapat diintegrasikan ke CI (Continous Integration).

Filter Analog yang dapat diprogram

Saya sedang mencari-cari ide rangkaian untuk membuat filter analog yang frekuensi cut-off nya dapat diprogram secara digital. Tujuannya jangka pendek adalah untuk filter anti aliasing dan reconstruction filter untuk suatu pengolahan sinyal digital.

Beberapa artikel berisi ide yang sudah didapat:

    Ide rangkaian dari “Application Note 269 Circuit Applications of Multiplying CMOS D to A Converters”

    Ide rangkaian dari Application Note: “Application Ideas for Multiplying DAC’s Digital Controlled Gain is Useful in Filter Circuits”

    Ide dari “”A Digitally Controllable Lowpass Filter Using a Digital Potentiometer”

     

    Ide dari Microchip: AN737 Using Digital Potentiometers to Design Low Pass Adjustable Filters.

    Rangkaian ini berisi 2 buah potensiometer digital (MCP42100) , opamp MCP601 (single supply, rail to rail). Konfigurasi filter yang dipakai adalah Sallen-key orde 2, low-pass filter.

    Referensi

    Nilai Resistor dan Kapasitor untuk Rangkaian Operational Amplifier

    Panduan pemilihan nilai resissor dan kapasitor untuk rangkaian dengan op-amp:

    • Nilai resistor antara 1k ~ 100kΩ
    • Nilai kapasitor antara 1 nF ~ beberapa μF

    Kutipan:

    Resistor values should stay within the range of 1–100 kΩ. The lower limit avoids excessive current draw from the op amp output, which is particularly important for single-supply op amps in power-sensitive applications. Those amplifiers have typical output currents of between 1 mA and 5 mA. At a supply voltage of 5 V, this current translates to a minimum of 1 kΩ.

    The upper limit of 100 kΩ is to avoid excessive resistor noise.

    Capacitor values can range from 1 nF to several μF. The lower limit avoids coming too close to parasitic capacitances. If the common-mode input capacitance of the op amp, used in a Sallen–Key filter section, is close to 0.25% of C1, (C1/400), it must be considered for accurate filter response. The MFB topology, in comparison, does not require input-capacitance compensation.

    Sumber:

    • https://www.sciencedirect.com/topics/engineering/resistor-value
    • https://www.sciencedirect.com/book/9780128116487/op-amps-for-everyone

    Error pada ESP32: Guru Meditation Error: Core 1 panic’ed (Interrupt wdt timeout on CPU1).

    Salah satu pesan kesalahan yang dapat muncul pada ESP32 adalah “Guru Meditation Error: Core 1 panic’ed (Interrupt wdt timeout on CPU1)”. Salah satu penyebabnya adalah memanggil Serial.print() dari interupsi

    Berikut ini pesan kesalahan yang muncul pada ESP32

    Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1). 
     
    Core  1 register dump:
     PC      : 0x4008ab86  PS      : 0x00060535  A0      : 0x80089afe  A1      : 0x3ffbf19c  
     A2      : 0x3ffbd448  A3      : 0x3ffbd2d8  A4      : 0x00000004  A5      : 0x00060523  
     A6      : 0x00060523  A7      : 0x00000001  A8      : 0x3ffbd2d8  A9      : 0x00000018  
     A10     : 0x3ffbd2d8  A11     : 0x00000018  A12     : 0x00000004  A13     : 0x00060523  
     A14     : 0x007bf318  A15     : 0x003fffff  SAR     : 0x0000000a  EXCCAUSE: 0x00000006  
     EXCVADDR: 0x00000000  LBEG    : 0x400863f9  LEND    : 0x40086409  LCOUNT  : 0xfffffffe  
     Core  1 was running in ISR context:
     EPC1    : 0x400db223  EPC2    : 0x00000000  EPC3    : 0x00000000  EPC4    : 0x00000000
     
     
     Backtrace: 0x4008ab83:0x3ffbf19c |<-CORRUPTED
     
     
     Core  0 register dump:
     PC      : 0x4008ad1b  PS      : 0x00060035  A0      : 0x80089727  A1      : 0x3ffbea3c  
     A2      : 0x3ffbf318  A3      : 0xb33fffff  A4      : 0x0000abab  A5      : 0x00060023  
     A6      : 0x00060021  A7      : 0x0000cdcd  A8      : 0x0000abab  A9      : 0xffffffff  
     A10     : 0x3ffc1f58  A11     : 0x00000000  A12     : 0x3ffc1f54  A13     : 0x00000007  
     A14     : 0x007bf318  A15     : 0x003fffff  SAR     : 0x0000001d  EXCCAUSE: 0x00000006  
     EXCVADDR: 0x00000000  LBEG    : 0x00000000  LEND    : 0x00000000  LCOUNT  : 0x00000000  
     
     
     Backtrace: 0x4008ad18:0x3ffbea3c |<-CORRUPTED
     
     
     
     
     ELF file SHA256: e85d33667e5fa1a7
     
     Rebooting...

    Berikut ini contoh program yang menyebabkan kesalahan tersebut.

    // https://www.arduino.cc/reference/en/libraries/esp32timerinterrupt/
    #define LED_BUILTIN 22
    
    hw_timer_t *My_timer = NULL;
    
    int kerja_counter = 0;
    int print_job = 0;
    long int timer_delay = 1000000L;  // clock timer= 1 MHz
    
    void IRAM_ATTR onTimer() {
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
      kerja_counter++;
      Serial.print("Test ");
      Serial.println(kerja_counter); // bad practice
    }
    
    // the setup function runs once when you press reset or power the board
    void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      Serial.begin(115200);
      Serial.print(__FILE__);
      Serial.print(F("\nStarting TimerInterruptTest on "));
      Serial.println(ARDUINO_BOARD);
      Serial.print(F("CPU Frequency = "));
      Serial.print(F_CPU / 1000000);
      Serial.println(F(" MHz"));
      pinMode(LED_BUILTIN, OUTPUT);
      My_timer = timerBegin(0, 80, true);  // prescaler
      timerAttachInterrupt(My_timer, &onTimer, true);
      timerAlarmWrite(My_timer, timer_delay, true);
      timerAlarmEnable(My_timer);  //Just Enable
    }
    
    // the loop function runs over and over again forever
    void loop() {
    }
    

    Solusi: Serial.print() dipanggil dari fungsi loop(), sedangkan interupsi hanya mempersiapkan datanya saja, atau menaruh data ke dalam suatu FIFO buffer.

    Berikut ini contoh hasil modifikasi program di atas.

    // https://www.arduino.cc/reference/en/libraries/esp32timerinterrupt/
    #define LED_BUILTIN 22
    
    hw_timer_t *My_timer = NULL;
    
    int kerja_counter = 0;
    int print_job = 0;
    long int timer_delay = 1000000L;  // clock timer= 1 MHz
    
    void IRAM_ATTR onTimer() {
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
      kerja_counter++;
      print_job=1;
    }
    
    // the setup function runs once when you press reset or power the board
    void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      Serial.begin(115200);
      Serial.print(__FILE__);
      Serial.print(F("\nStarting TimerInterruptTest on "));
      Serial.println(ARDUINO_BOARD);
      Serial.print(F("CPU Frequency = "));
      Serial.print(F_CPU / 1000000);
      Serial.println(F(" MHz"));
    
      pinMode(LED_BUILTIN, OUTPUT);
    
      My_timer = timerBegin(0, 80, true);  // prescaler
      timerAttachInterrupt(My_timer, &onTimer, true);
      timerAlarmWrite(My_timer, timer_delay, true);
      timerAlarmEnable(My_timer);  //Just Enable
      sei();
    }
    
    // the loop function runs over and over again forever
    void loop() {
      if (print_job == 1) {
        print_job = 0;
        Serial.print("Test ");
        Serial.println(kerja_counter);   
      }
    }
    

    Simulasi Kendali Digital

    Simulasi Kendali Digital dengan Matlab Simulink

    Problem: “Design the gain for the antenna azimuth position control system shown in
    Figure 13.30(b) to yield a closed-loop damping ratio of 0.5. Assume a sampling interval
    of T ˆ 0:1 second.”

    Blok diagram sistem dengan simulink sebagai berikut:

    Fungsi transfer sistem dimasukkan ke blok “Transfer Fcn”

    Respon sistem terhadap input step adalah sebagai berikut

    respon sistem kendali zoh

     

     

    Transformasi Bilinear

    Respon Frekuensi LPF orde 1

    Percobaan melihat pengaruh frekuensi sampling terhadap fungsi transfer sistem orde 1 low pass

    Fungsi transfer sistem = 1/(s+1)

    Time constant = 1, sehingga frekuensi cut off adalah 0.159 Hz

    Gambar ilustrasi fungsi transfer untuk filter analog dan filter digital.

    Filter digital dicoba dengan beberapa frekuensi sampling: 10 Hz, 100 Hz, 1000 Hz

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import signal
    %matplotlib inline
    
    B = [0, 1]
    A = [1, 1]
    
    fs10= 10
    fs100= 100
    fs1000= 1000
    
    fs10_z   = signal.bilinear(B,A,fs10)
    fs100_z  = signal.bilinear(B,A,fs100)
    fs1000_z = signal.bilinear(B,A,fs1000)
    
    fs10_a  =fs10_z[1]
    fs10_b  =fs10_z[0]
    
    fs100_a =fs100_z[1]
    fs100_b =fs100_z[0]
    
    fs1000_a=fs1000_z[1]
    fs1000_b=fs1000_z[0]
    # displaying
    plt.figure(figsize=(10, 8))
    Om, fs10_Hd   = signal.freqz(fs10_b  , fs10_a, worN=1024)
    f10 = Om * fs10 / (2 * np.pi)
    
    Om, fs100_Hd  = signal.freqz(fs100_b , fs100_a, worN=2048)
    f100 = Om * fs100 / (2 * np.pi)
    
    Om, fs1000_Hd = signal.freqz(fs1000_b, fs1000_a, worN=16384) # 1000 Hz mesti lebih banyak sampelnya
    f1000 = Om * fs1000 / (2 * np.pi)
    
    tmp, H = signal.freqs(B, A, worN=f1000 * Om)
    f = Om * f1000 / (2 * np.pi)
    
    plt.semilogx(f, 20 * np.log10(np.abs(H)), label=r"$|H(j \omega)|$ of analog filter")
    plt.semilogx(f10, 20 * np.log10(np.abs(fs10_Hd)), label=r"$|H_d(e^{j \Omega})|$ of digital filter 10")
    plt.semilogx(f100, 20 * np.log10(np.abs(fs100_Hd)), label=r"$|H_d(e^{j \Omega})|$ of digital filter 100")
    plt.semilogx(f1000, 20 * np.log10(np.abs(fs1000_Hd)), label=r"$|H_d(e^{j \Omega})|$ of digital filter 1000")
    plt.semilogx(0.159, 20 * np.log10(0.707), marker='o',label="cutoff")
    plt.axvline(x = 10/2,   linestyle="--", label = '5 Hz')
    plt.axvline(x = 100/2,  linestyle="--", label = '50 Hz')
    plt.axvline(x = 1000/2, linestyle="--", label = '500 Hz')
    plt.xlabel(r"$f$ in Hz")
    plt.ylabel(r"dB")
    plt.axis([0.01, 600, -80, 3])
    plt.legend()
    plt.grid()
    plt.savefig("first-order.jpg",dpi=200)
    # https://www.geeksforgeeks.org/plot-a-vertical-line-in-matplotlib/

    Analisis

    • frekuensi warping kelihatan di frekuensi yang makin dekat dengan 1/2 frekuensi sampling
    • frekuensi cut off tidak terpengaruh

    Respon Step Low Pass Filter orde 1

    LPF step response bilinear

    Respon Frekuensi High Pass Filter orde 1

    first order HPF frequency responseKesimpulan:

    • perubahan frekuensi sampling tidak mengubah banyak respon frekuensi filter

    Respon Step High Pass Filter orde 1

    first order HPF step responseKesimpulan:

    • perubahan frekuensi sampling tidak banyak mengubah bentuk sinyal, kecual pada fs = 10 Hz

     

    Apakah ada pin analog output di Arduino?

    Apakah ada pin analog output di Arduino? Ada Arduino yang memiliki analog output sesungguhnya, ada yang tidak. Analog output yang sesungguhnya menggunakan DAC (Digital to Analog Converter). Pada Arduino yang tidak ada DAC, analog output dapat ditiru menggunakan output PWM (Pulse Width Modulation) / Modulasi Lebar Pulsa.

    Apa bedanya sinyal output dari DAC dan dari PWM? Sinyal DAC berupa tegangan tertentu yang dapat diatur tegangannya sesuai dengan parameter yang diberikan. Sinyal PWM berupa tegangan HIGH (biasanya 5 volt) dan LOW (0 volt), dengan perbandingan antara HIGH dan LOW mengikuti suatu perbandingan tertentu.

    Berikut ini contoh sinyal PWM

    Arduino yang memiliki DAC adalah di antaranya sebagai berikut:

    Arduino yang tidak memiliki DAC di antaranya sebagai berikut:

    • Arduino Nano dengan prosessor ATmega328P
    • Arduino UNO dengan prosessor ATmega328P
    • Arduino UNO mini dengan prosessor ATmega328P
    • Arduino Mega 2560 Rev3
    • Arduino UNO WiFI Rev2 dengan prosesor ATmega4809 
    • Arduino Micro dengan prosesor ATmega32U4
    • Arduino Leonardo dengan prosesor ATmega32U4

    Berikut ini Arduino Zero yang memiliki output analog dengan DAC:

    Referensi

    Arduino SIM

    Apakah itu Arduino SIM?

    Arduino SIM adalah kartu SIM GSM dari Arduino yang menawarkan konektivitas global di seluruh dunia. Arduino SIM cocok dipakai untuk perangkat yang memerlukan akses ke Arduino IoT Cloud di tempat-tempat yang tidak memiliki akses IoT lain seperti Wifi

    Arduino SIM
    Arduino SIM

    Arduino SIM kompatibel dengan produk MKR GSM 1400 dari Arduino. Pada papan Arduino ini terdapat konektor untuk memasukkan SIM card.

    Arduino MKR GSM 1400
    Arduino MKR GSM 1400

     

    Arduino IoT Cloud

    Arduino SIM memungkinkan akses ke Arduino IoT Cloud. Pada saat ini papan Arduino yang mendukung Arduino SIM adalah  MKR GSM 1400

    Berikut ini foto perangkat pengukur tekanan menggunakan Arduino MKR GSM 1400 yang terhubung ke Arduino Cloud dan Google Sheets

    IoT Pressure Sensor: MKR GSM + Arduino Cloud + Google Sheets
    IoT Pressure Sensor

    Dataplan

    SIM Arduino hanya mengirimkan data ke Arduino IoT Cloud. Dengan cara ini, kami memberi Anda saluran komunikasi yang aman dari perangkat ke dasbor. Setelah data mencapai Arduino IoT Cloud, data dapat dijembatani ke platform dan layanan lain melalui webhook atau Arduino IoT API. Setelah aktivasi kartu SIM, Anda mendapatkan 10MB data gratis hingga 90 hari (5MB per bulan seharga $1,50 USD setelahnya). Fitur utama paket ini adalah:

    • Konektivitas seluler langsung ke Arduino IoT Cloud
    • HANYA kompatibel dengan Arduino IoT Cloud
    • Data dapat dijembatani dari Arduino IoT Cloud ke platform dan layanan lain menggunakan webhook atau Arduino IoT API
    • Profil roaming global – satu paket data sederhana beroperasi di lebih dari 100 negara. Periksa di sini cakupannya berdasarkan negara
    • Paket SIM Arduino bulanan dapat disewa di seluruh dunia kecuali Brasil
    • Data gratis awal akan kedaluwarsa setelah 90 hari atau ketika Anda telah menggunakan data gratis 10 MB, mana saja yang lebih dulu
    • Anda dapat menjeda dan memulai ulang SIM Anda di sini. Harap perhatikan bahwa SIM Anda dapat dijeda selama maksimal 6 bulan dan ada biaya jeda berkelanjutan sebesar $0,30 USD per bulan ditambah pajak yang berlaku. SIM tidak dapat dijeda selama masa uji coba gratis 90 hari Anda
    • Jumlah lalu lintas data yang sama dengan harga yang sama di mana pun Anda mengoperasikan perangkat di seluruh dunia
    • Layanan seluler terukur dari Konektivitas Arm® Pelion™ – cocok untuk sejumlah besar perangkat di masa depan

    Pertanyaan yang Sering Diajukan

    Dapatkah Arduino SIM Terhubung ke Internet?

    Awalnya Arduino SIM akan terbatas pada konektivitas ke Arduino IoT Cloud saja – dengan kemampuan untuk menjembatani Internet yang lebih luas menggunakan webhook dan API yang akan hadir pada akhir tahun ini.

    BAGAIMANA CARA MENJEDA SIM SAYA?

    Anda dapat menjeda dan memulai ulang SIM Anda di sini. Harap perhatikan bahwa SIM Anda dapat dijeda selama maksimal 6 bulan dan ada biaya jeda berkelanjutan sebesar $0,30 USD per bulan ditambah pajak yang berlaku. (n.b. SIM tidak dapat dijeda selama masa uji coba gratis 90 hari Anda).
    DIMANA SIM SAYA AKAN BEROPERASI?
    Anda akan dapat terhubung ke cloud Arduino IoT dari lebih dari 100 negara, memungkinkan Anda menggunakan perangkat Anda di seluruh dunia –

    PAPAN APA YANG SIM AKAN BEKERJA?

    Awalnya Arduino SIM akan mendukung Arduino MKR GSM 1400 (3G dengan fallback 2G). Ada peta jalan untuk mendukung Arduino MKR NB 1500 (LTE Cat-M dan NB-IoT) yang akan datang. Akhirnya kami berencana untuk membukanya untuk dewan pihak ketiga juga.

    Dapatkah Saya Menggunakan SIM Lain?

    Ya! Anda bebas menggunakan layanan seluler apa pun yang Anda sukai, dan memasukkan SIM apa pun yang Anda suka ke papan seluler Arduino Anda.

    Saya Mengalami Masalah Dengan SIM Arduino Saya

    Jika Anda mengalami masalah teknis saat menghubungkan perangkat Anda, pastikan untuk memeriksa forum SIM.

    Referensi

    • Arduino MKR GSM 1400 https://store-usa.arduino.cc/products/arduino-mkr-gsm-1400?selectedStore=us

     

     

    Rangkaian Motor Servo Arduino

    Berikut ini beberapa rangkaian sederhana untuk mengendalikan motor servo dengan Arduino. Motor servo yang dimaksud di sini adalah motor servo radio control. Motor servo radio control memiliki 3 terminal: VCC, GND dan PWM.

    Berikut ini contoh motor servo yang dipakai

    Kendali Servo Dengan Potensiometer

    Pada contoh ini posisi motor servo dikendalikan dengan sebuah potensiometer. Posisi potensiometer dibaca dengan membaca tegangan output dari potensiometer tersebut. Angka tersebut kemudian dipakai untuk mengendalikan posisi motor servo .

    Rangkaian motor servo sebagai berikut:

    Penjelasan Rangkaian:

    Terminal VCC dari motor servo disambung ke catu daya motor

    Terminal GND dari motor servo disambung ke GND catu daya motor dan GND Arduino

    Terminal PWM dari motor servo disambung ke port 9 pada Arduino

    Terminal pinggir Potensiometer disambung ke VCC dan GND pada Arduino

    Terminal tengah potensiometer disambung ke pin A0 pada Arduino. Tegangan dari potensiometer akan dibaca sebagai tegangan analog, sehingga harus menggunakan pin input analog dari Arduino.

    Sumber tegangan untuk Arduino UNO dapat menggunakan USB ataupun dari POWER PIN. Sumber tegangan untuk motor servo menggunakan baterai ataupun adaptor terpisah. Tegangan baterai untuk motor servo disesuaikan dengan spesifikasi motor servo. Catu daya untuk Arduino dipisah dengan catu daya untuk motor servo, karena biasanya arus yang ditarik oleh motor servo cukup besar sehingga dapat mengganggu tegangan catu daya yang terhubung ke motor servo.

    Motor servo seperti HS-311 memerlukan tegangan catu daya antara 4,8 volt sampai 6 volt dengan arus maksimum 800 mA. Jadi pastikan tegangan catu daya dan arusnya sesuai untuk motor servo yang dipakai.

    Perangkat lunak untuk Arduino adalah sebagai berikut:

    #include <Servo.h>
    Servo myservo;  // create servo object to control a servo
    int potpin = 0;  // analog pin used to connect the potentiometer
    int val;    // variable to read the value from the analog pin
    void setup() {
      myservo.attach(9);  // attaches the servo on pin 9 to the servo object
    }
    void loop() {
      val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
      val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
      myservo.write(val);                  // sets the servo position according to the scaled value
      delay(15);                           // waits for the servo to get there
    }

    Cara kerja perangkat lunak

    Library yang dipakai untuk mengendalikan motor adalah Arduino Servo Library.

    Pada bagian setup, pin 9 diset sebagai output motor servo.

    Pada fungsi loop() dilakukan proses sebagai berikut:

    • membaca tegangan dari pin A0 untuk mengetahui posisi dari potensiometer dengan fungsi analogRead()
    • angka ini skalanya adalah 0 sampai 1023, sedangkan input motor servo adalah 0 sampai 180, sehingga perlu dilakuan penskalaan dengan fungsi map()
    • tuliskan angka hasil penskalaan ke motor servo
    • tunggu 15 milidetik untuk memberi waktu motor bergerak

    Fungsi loop() akan dilakukan berulang-ulang , sehingga posisi motor servo akan mengikuti posisi di potensiometer.

    Kendali Servo Bolak-Balik

    Pada contoh ini, posisi motor servo beralih dari 0 ke 180 derajat, kemudian kembali ke 0 derajat berulang-ulang.

    Rangkaian sebagai berikut

    Penjelasan Rangkaian:

    Terminal VCC dari motor servo disambung ke catu daya motor

    Terminal GND dari motor servo disambung ke GND catu daya motor dan GND Arduino

    Terminal PWM dari motor servo disambung ke port 9 pada Arduino

    Terminal pinggir Potensiometer disambung ke VCC dan GND pada Arduino

    Kode sebagai berikut

    #include <Servo.h>
    
    Servo myservo;  // create servo object to control a servo
    // twelve servo objects can be created on most boards
    int pos = 0;    // variable to store the servo position
    
    void setup() {
      myservo.attach(9);  // attaches the servo on pin 9 to the servo object
    }
    void loop() {
      for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
        // in steps of 1 degree
        myservo.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);               // waits 15ms for the servo to reach the position
      }
      for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
        myservo.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                       // waits 15ms for the servo to reach the position
      }
    }

    Cara kerja perangkat lunak

    Pada fungsi loop(), dilakukan hal berikut:

    • buat suatu for() loop untuk menggerakkan motor dari 0 derajat ke 180 derajat dengan langkah sebesar 1 derajat. Tiap kali geser 1 derajat, lakukan penundaan selama 15 milidetik untuk menunggu motor bergerak.
    • buat suatu for() loop untuk menggerakkan motor dari 0 derajat ke 180 derajat dengan langkah sebesar 1 derajat. Tiap kali geser 1 derajat, lakukan penundaan selama 15 milidetik untuk menunggu motor bergerak.

    Referensi

     

    Apa Itu Mikrokontroler dan Contohnya

    Apa yang dimaksud dengan mikrokontroler?

    Jawab: Pengertian mikrokontroler adalah suatu komputer kecil dalam satu keping rangkaian terintegrasi. Suatu mikrokontroler di dalamnya terdiri dari satu atau lebih CPU (Central Processing Unit / Unit pengolahan terpusat) dengan sejumlah memori dan periferal input/output.

    Mengapa mikrokontroler disebut sebagai komputer?

    Jawab: Mikrokontroler disebut sebagai komputer karena memang mikrokontroler adalah suatu komputer lengkap. Perbedaan khusus dibandingkan komputer biasa adalah semua komponen komputer pada mikrokontroler sudah terkandung dalam satu rangkaian terintegrasi, sedangkan pada komputer biasa komponen-komponen tersebut berada pada beberapa keping rangkaian terintegrasi.

    Sebagai contoh,  Arduino UNO / Nano di dalamnya ada komponen utama mikrokontroler tipe ATmega328 . Di dalam ATmega328 ini sudah ada CPU, memori flash untuk menampung program, memori RAM (Random Access Memory) untuk menampung variabel di perangkat lunak, dan EEPROM (Electrically Erasable Programmable Read Only Memory) untuk menampung data yang dapat diubah oleh program namun tidak hilang kalau listrik dimatikan.

    Berikut ini foto ATmega328

    Sebagai perbandingan , motherboard komputer desktop memiliki CPU, memori dan periferal masing-masing pada rangkaian terintegrasi yang terpisah. Berikut ini contoh papan rangkaian motherboard.

     

    Berikut ini contoh CPU AMD Ryzen 9 5950X. Dalam rangkaian terintegrasi ini hanya ada CPU saja, belum dilengkapi dengan RAM maupun periferal lain.

    Referensi

    • https://en.wikipedia.org/wiki/Motherboard

    Kenapa mikrokontroler sering disebut juga sebagai komputer mini?

    Mikrokontroler sering disebut juga sebagai komputer mini karena mikrokontroler sudah merupakan satu komputer lengkap yang dapat menjalankan perangkat lunak, dan ukurannya kecil (maka disebut sebagai mini).

    Istilah ‘minicomputer’ sebenarnya pernah dipakai di tahun 1960-an untuk menyebut komputer serba guna yang ada di era itu. Ukurannya cukup besar dibandingkan komputer zaman sekarang.  Lebih jauh dapat dibaca di https://en.wikipedia.org/wiki/Minicomputer

    Apakah mikrokontroler termasuk ke dalam komputer?

    Ya, mikrokontroler termasuk dalam salah satu jenis komputer.

    Apa contoh mikrokontroler?

    Contoh mikrokontroler di antaranya:

    • ESP32
    • ESP8266
    • ATmega328 yang dipakai di Arduino Nano dan Arduino UNO
    • RP2040 yang dipakai di Arduino Nano RP2040
    • Keluarga STM32 , seperti STM32F103C8T6  yang dipakai di modul Blue Pill
    • nRF52840 yang dipakai di Arduio Nano 33 BLE Sense
    • Atmel SAM3X8E yang dipakai di Arduino Due
    •  

    Referensi

    • RP2040 https://en.wikipedia.org/wiki/RP2040
    • ATmega328 https://www.microchip.com/en-us/product/atmega328
    • ESP32 https://en.wikipedia.org/wiki/ESP32
    • STM32 Blue Pill https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill.html

    Apa kelebihan mikrokontroler

    Keuntungan mikrokontroler dan keistimewaan dibandingkan mikroprosesor biasa adalah:

    • ukuran kecil karena semua komponen komputer sudah ada dalam satu keping chip.
    • penggunaan daya kecil
    • pembuatan perangkat keras / rangkaian lebih mudah karena rangkaian lebih sederhana

    Apa kekurangan mikrokontroler?

    Kekurangan mikrokontroler adalah terutama pada ukurannya yang kecil, harus muat di dalam satu keping rangkaian terintegrasi. Akibatnya kemampuan komputasinya terbatas, memori terbatas, periferal juga terbatas dibandingkan dengan mikroprosesor.

    Kemampuan komputasi terbatas artinya kecepatan komputasi relatif lambat.

    Periferal terbatas, artinya input output digital maupun analog terbatas. Media penyimpanan terbatas. Jika perlu penyimpanan tambahan, biasanya  untuk mikrokontroler menggunakan memori tipe SD card. Mikroprosesor dapat menggunakan media besar seperti flashdisk, SSD dan hard disk.

    Mikrokontroler pakai bahasa apa?

    Mikrokontroler yang ada saat ini umumnya diprogram menggunakan bahasa pemrograman Assembly, C dan C++. Bahasa lain jarang dipakai, misalkan sebagai berikut:

    • Python dipakai di NodeMCU dengan bahasa MicroPython (https://micropython.org/)
    • Rust dipakai untuk ESP32 https://github.com/esp-rs/awesome-esp-rust
    • TinyGo (versi kecil dari Go) https://tinygo.org/

    Apa singkatan dari mikrokontroler?

    Mikrokontroler sering disingkat sebagai MCU  (Microcontroller Unit)

    Apa fungsi ALU dalam mikrokontroler?

    ALU (Arithmetic & Logic Unit) adalah bagian dari CPU (Central Processing Unit), sedangkan CPU adalah bagian dari mikrokontroler. Fungsi ALU pada mikrokontroler sama seperti fungsi ALU pada CPU, yaitu untuk melakukan proses perhitungan aritmatik (tambah kurang kali bagi) dan logika (AND, OR, NOT, penggeseran bit)

    Apa bagian dari mikrokontroler?

    Bagian-bagian utama dari mikrokontroler adalah: CPU, memori dan periferal.

    • CPU (Central Processing Unit) berfungsi mengatur seluruh aktivitas di dalam mikrokontroler
    • Memori berfungsi untuk menyimpan program dan variabel-variabel.
    • Periferal berfungsi menghubungkan mikrokontroler ke dunia luar

    Sebagai contoh, berikut ini blok diagram mikrokontroler ESP32

    Blok diagram ESP32
    Blok diagram ESP32

    Penjelasan:

    • CPU pada ESP32 tersebut adalah “Xtensa LX6 microprocessor”
      Memori adalah ROM dan SRAM
    • Periferal adalah bagian-bagian lainnya, seperti Radio, Cryptographic, Peripheral Interfaces (I2C, SDIO, CAN, IR, Temperature Sensor, DAC, SPI, I2S, UART, ETH, PWM, Touch Sensor, SAR ADC)

    Apa fungsi chip pada mikrokontroler?

    Apakah Chip termasuk mikrokontroler?

    Chip tidak termasuk mikrokontroler. Justru mikrokontroler adalah salah satu jenis chip. Chip jenis lain selain mikrokontroler banyak , misal chip penguat op-amp, chip rangkaian logika dan sebagainya.

    Apa yang dimaksud dengan sistem minimum mikrokontroler?

    Mikrokontroler secara definisi sudah dapat langsung dijalankan tanpa tambahan komponen mikroprosesor lain, jadi istilah ‘sistem minimum mikrokontroler’ ini agak rancu. Beberapa mikrokontroler sudah dapat dijalankan hanya dengan menambahkan tegangan power supply, namun ada juga beberapa mikrokontroler yang masih memerlukan tambahan komponen seperti kristal untuk clock.

    Istilah ‘sistem minimum mikroprosesor’ sebenarnya dikenal untuk mikroprosesor, yaitu rangkaian minimum suatu sistem mikroprosesor (CPU, RAM dan periferal) yang dapat menjalankan suatu program sederhana.

    Apa karakteristik mikrokontroler?

    Karakteristik utama mikrokontroler adalah sebagai berikut

    • mikrokontroler adalah komputer, di dalamnya ada CPU , memori dan periferal
    • sering dipakai untuk mengendalikan perangkat-perangkat kecil
    • dipakai di sistem tertanam (embedded systems), yaitu perangkat yang di dalamnya terdapat komputer namun komputer tersebut tidak kelihatan
    • kemampuan komputasi terbatas, jadi umumnya hanya dipakai untuk komputasi ringan
    • konsumsi daya mikrokontroler relatif kecil dibandingkan mikroprosesor biasa. terutama di perangkat yang mobile/mudah dipindahkan.
    • Sering dipakai untuk menangani pekerjaan waktu nyata (pekerjaan yang memiliki batas waktu ketat)
    • Sudah dilengkapi dengan periferal input & output jadi dapat langsung disambung ke sensor dan aktuator
    • program pada mikrokontroler umumnya disimpan di flash memory, bukan di hard drive ataupun SSD
    • harga relatif murah
    • ukuran kecil, mudah diintegrasikan dengan produk lain
    • Ukuran memori dan periferal pada mikrokontroler tidak dapat diubah, sehingga mikrokontroler diproduksi dengan berbagai kombinasi kemampuan memori dan periferal. Mikroprosesor dapat dikonfigurasi kemampuannya dengan menambah periferal, jadi jenis mikroprosesor tidak terlalu banyak.