Digital to Analog Converter (DAC) pada ESP32

Berikut ini percobaan menggunakan DAC (Digital to Analog Converter) pada mikroprosesor ESP32. Modul yang digunakan adalah Lolin32 Lite dari Wemos.

Pemrograman dilakukan di Arduino, jadi sebelumnya harus melakukan instalasi library ESP32 untuk Arduino.

Program DAC yang dicoba adalah sebagai berikut.

#define DAC1 25
// output di pin 25 (DAC1)

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

}
int Value = 255; //255= 3.3V 128=1.65V

void loop() { // Generate a Sine wave
int i;
for (i = 0; i < 256; i++) {
dacWrite(DAC1, i);
}
for (i = 255; i >= 0; i--) {
dacWrite(DAC1, i);
}
}

 

Output diambil dari pin 25. Tampilan sinyal pada pin 25 adalah sebagai berikut:

 

Sinyal output dari DAC pada ESP32
Sinyal output dari DAC pada ESP32

Tegangan maksimum adalah 2,76 volt.

Tegangan minimum adalah -0,36 volt. Kurang jelas kenapa tegangan dapat menjadi negatif.

Frekuensi adalah 360,4 Hz. Perioda adalah 0.0027 detik.

Waktu untuk konversi 1 sampel adalah 5,42 ms.

Frekuensi DAC adalah 184525 Hz.

Arsitektur Perangkat Lunak pada Sistem Embedded

Pada artikel ini diuraikan macam-macam arsitektur perangkat lunak dalam konteks system embedded. Pertama akan diuraikan arsitektur aplikasi desktop sebagai perbandingan. Kemudian akan kita lihat 3 macam arsitektur yang umum dipakai pada system embedded, yaitu pertama: arsitektur super loop, kedua arsitektur super loop dengan interupsi. Arsitektur , kedua ini dikenal juga dengan nama foreground-background. Ketiga adalah arsitektur multithreading.

Ada dua macam aplikasi:

  • Aplikasi Desktop
  • Aplikasi Sistem Embedded

Ada beberapa macam arsitektur software sistem embedded:

  1. Super loop (tanpa interupsi)
  2. Super loop dengan interupsi / foreground-background
  3. Multithreading

Aplikasi Desktop

Berikut ini arsitektur desktop yang biasa. Pada aplikasi desktop, pengguna mesti menjalankan dulu system operasi pada computer yang dipakai, misalkan Windows, atau Linux.. Aplikasi dijalankan oleh pengguna. Sistem operasi akan menjalankan aplikasi tersebut , biasanya dengan cara mengambil kode dari storage seperti har disk atau flash memory, kemudian mengalokasikan resource seperti CPU, RAM , input output ke aplikasi tersebut. Kemudian aplikasi mulai dijalankan pada START.  Kemudian aplikasi ini melakukan suatu proses yang dapat terdiri dari beberapa task (atau pekerjaan). Setelah proses ini selesai, maka aplikasi akan berhenti, di flowchart dilambangkan dengan STOP. Sistem operasi kemudian menghapus aplikasi dari memori. Pada saat ini aplikasi selesai.

Diagram alir perangkat lunak aplikasi desktop
Diagram alir perangkat lunak aplikasi desktop

Arsitektur Superloop

Berikut ini adalah arsitektur paling sederhana yang dipakai pada sistem embedded, yaitu arsitektur superloop. Pada arsitektur ini , software dikelompokkan menjadi 2 bagian, yaitu bagian INIT yang berisi kode-kode inisialisasi yang hanya dijalankan satu kali saja pada aplikasi tersebut. Biasanya bagian INIT ini berisi konfigurasi hardware pada mikroprosesor / mikrokontroler yang dipakai. Misalnya adalah melakukan setting pin-pin sebagai input ataupun sebagai output. Kemudian ada bagian TASK / Tugas, yang dikerjakan berulang-ulang tanpa henti. Pada diagram alir / flowchart aplikasi sistem embedded tidak ada blok STOP , karena aplikasi tidak pernah berhenti. Arsitektur ini dapat dipakai untuk 1 task  atau beberapa task yang tidak memerlukan jadwal atau pewaktuan yang kritis.

Diagram alir perangkat lunak embedded dengan superloop
Diagram alir perangkat lunak embedded dengan superloop

Superloop pada Arduino

Pada Arduino , arsitektur perangkat lunak yang paling sering dipakai adalah superloop. Di sini sudah difasilitasi dengan cara memberikan 2 buah fungsi dasar yaitu fungsi setup() dan fungsi loop(). Fungsi setup() hanya dijalankan sekali saja di awal, biasanya berisi inisialisasi hardware. Selain itu ada fungsi loop() yang dijalankan terus menerus. Jadi flowchart atau diagram alir program Arduino prinsipnya adalah seperti pada gambar ini. Sebagai contoh adalah perangkat lunak lampu kedip yang tersedia di contoh aplikasi Arduino. Aplikasi ini biasanya aplikasi yang pertama kali kita jalankan di Arduino, untuk mengecek apakah compiler dan hardware yang dipakai berfungsi baik. Pada aplikasi ini pada bagian setup() berisi inisialisasi sebuah pin (dalam hal ini pin LED_BUILTIN) sebagai output. Pada Arduino Nano dan Arduino UNO, pin LED_BUILTIN ini adalah pin 13. Kemudian pada fungsi loop() , di dalamnya adalah Task untuk menyalakan dan mematikan LED dengan delay sebanyak 1000 milidetik.

 

Berikut ini contoh perangkat lunak Arduino sesuai dengan diagram alir di atas.

// https://www.arduino.cc/en/tutorial/blink

void setup() {

pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN, HIGH);

delay(1000); digitalWrite(LED_BUILTIN, LOW);   

delay(1000);

}

 

Superloop Dengan Dua Task

Aplikasi superloop umumnya hanya baik dipakai untuk satu task / tugas yang tidak memerlukan pewaktuan yang kritis. Bisa juga dipakai untuk dua atau lebih task, namun akan ada masalah kalau kedua task tersebut memerlukan pewaktuan yang berbeda. Pada ilustrasi flowchart ini kita lihat 2 buah task / pekerjaan yang dimasukkan ke dalam sebuah loop. Task 1 dan Task 2 akan bekerja bergantian. Untuk memulai Task 2 harus menunggu task 1 selesai, dan sebaliknya : task 1 harus menunggu task 2 selesai sebelum task 1 dapat mulai bekerja.

 

Diagram alir superloop dengan dua task
Diagram alir superloop dengan dua task

Lampu Kedip Dengan Superloop

Berikut ini flowchart lampu kedip pada Arduino. Software ini berfungsi cukup baik dan dapat mudah difahami untuk karena pada system ini hanya ada 1 task saja, dan frekuensi lampu kedip tidak terlalu kritis. Secara sepintas, perioda lampu kedip adalah 2 detik , sehingga frekuensi lampu kedip adalah 0,5 Hz. Namun jika kita lihat lebih teliti, perioda akan sedikit lebih besar dari 2 detik. Perioda sebenarnya adalah 2 detik (karena delay 1000 ms) , ditambah waktu untuk menyalakan LED, dan waktu untuk mematikan LED, serta waktu untuk melakukan JUMP dari bawah setelah delay 1000 milidetik ke LED ON..

Diagram alir lampu kedip dengan superloop
Diagram alir lampu kedip dengan superloop

// https://www.arduino.cc/en/tutorial/blink

void setup() {

pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN, HIGH);

delay(1000); digitalWrite(LED_BUILTIN, LOW);   

delay(1000);

}

 

Arsitektur Superloop Dengan Interupsi / Foreground-Background

Arsitektur berikutnya adalah superloop dengan interupsi, atau dikenal juga sebagai foreground-background. Pada arsitektur ini terdapat superloop seperti pada arsitektur sebelumnya, ditambah dengan beberapa buah Task yang dijalankan dengan interupsi. Interupsi ini ditrigger oleh suatu kejadian pada hardware Pada keadaan normal tanpa interupsi, yang dijalankan hanya Loop() saja, di sini menjalankan Task 1. Jika ada Interupsi 1, maka Task 1 akan dihentikan dulu, kemudian CPU menjalankan Task 2 sampai selesai , kemudian Interupsi 1 menjalankan RETI (return from interrupt) yang mengakhiri pelaksanaan interupsi 1. setelah itu baru kemudian Loop() yang berisi Task 1 diteruskan. Demikian juga hal serupa jika terjadi Interupsi 2 dan interupsi 3. Loop () ini dikenal juga sebagai background (latar belakang), sedangkan interupsi ini diistilahkan juga dengan Foreground. Analoginya Background ini posisinya di belakang, jadi tidak kelihatan jika ada sesuatu di depannya. Foreground jika ada akan menutupi Background. Maka dari tamsilan ini arsitektur ini dikenal juga dengan nama foreground-background.

Diagram alir superloop dengan interupsi
Diagram alir superloop dengan interupsi

Contoh Superloop Dengan Interupsi Timer

Interupsi yang umum dipakai misalnya adalah interupsi timer dan interupsi eksternal. Interupsi timer dapat timbul jika ada timer yang overflow atau mencapai suatu angka tertentu. Secara praktisnya, Timer ini dapat dipakai untuk membuat sebuah Task yang aktif secara periodik. Pada Arduino Nano/UNO terdapat 3 timer hardware di mikrokontrolernya, sehingga kita dapat membuat 3 buah interupsi timer. Dari sini kita dapat membuat 3 buah LED berkedip, dengan masing-masing dikendalikan oleh 1 interupsi timer. Dengan arsitektur ini, kita dapat mempunyai task periodic sebanyak jumlah timer yang tersedia pada mikrokontroler

Diagram alir superloop dengan interupsi timer
Diagram alir superloop dengan interupsi timer

 

Lampu Kedip Dengan Interupsi

Sebagai contoh pada gambar ini adalah aplikasi untuk membuat 4 buah LED berkedip dengan frekuensi yang berbeda. LED 1, LED 2 dan LED 3 akan berkedip sesuai dengan frekuensi yang diprogramkan pada timer 0, 1 dan 2. Setting timer ini dilakukan di bagian INIT(). LED 4 berkedip sendiri di superloop, namun periodanya tidak akan seusai 100% dengan waktu delay di superloop.

 

Arsitektur Multi Thread Dengan Real Time Operating System (RTOS)

Berikut ini adalah diagram alir arsitektur dengan multithreading atau multitasking. Untuk dapat menjalankan diagram alir ini, harus menggunakan suatu Real Time Operating System seperti FreeRTOS. Pada RTOS, superloop biasanya hanya berisi inisialisasi RTOS, selain itu kosong saja. Fungsi-fungsi di dalam aplikasi dijalankan sebagai Task pada Thread ataupun sebagai interupsi. Interupsi di sini bekerja sama seperti pada arsitektur sebelumnya. Perbedaan utama di sini adalah ada bagian yang bernama Real Time Kernenl dan Thread. Real Time Kernel biasanya dijalankan secara rutin oleh salah satu interupsi Timer pada mikrokontroler. Real Time Kernel ini kemudian tugasnya adalah menjalankan Thread-thread / Task yang ada pada aplikasi tersebut. Real Time Kernel dapat menjalankan dan menghentikan setiap task secara bergantian, sehingga seakan-akan kita memiliki beberapa CPU , padahal sebenarnya hanya ada 1 buah CPU. Pada Thread 1 dan Thread 2, struktur di dalamnya ada inisialisasi, dan ada sebuah superloop di masing-masingnya.

Diagram alir multithread dengan superloop, interupsi dan thread
Diagram alir multithread dengan superloop, interupsi dan thread

Lampu Kedip dengan RTOS

Berikut ini contoh 4 buah lampu kedip dengan menggunakan FreeRTOS.

Lampu kedip dengan FreeRTOS
Lampu kedip dengan FreeRTOS

Source code ada di tautan berikut ini:  https://github.com/waskita/embedded/tree/master/atmega-blink-freertos

Detail lampu kedip tersebut dijelaskan di artikel berikut ini: Elektrologi:  Lampu kedip pada arduino/

Video Demo : https://www.youtube.com/watch?v=LV0qBlbytHE

Pengertian Real Time pada Sistem Embedded

Banyak sistem embedded berinteraksi dengan dunia fisik, sehingga system embedded harus dapat merespon dunia fisik secara cukup cepat. Respon cepat ini disebut juga sebagai “real time” .

Tidak semua sistem embedded harus real time, demikian juga tidak semua sistem real time harus embedded

Pengertian Menurut Kamus

The actual time during which something takes place
  • –The computer may partly analyze the data in real time (as it comes in) – R.H. March
  • –Chatted online in real time

Sumber: https://www.merriam-webster.com/dictionary/real%20time

Maksudnya dari ‘the actual time during which something takes place” adalah ada 2 atau lebih kejadian, dan semuanya terjadi praktis pada waktu yang sama.

Real time secara Bahasa Inggris diartikan sesuatu yang terjadi seketika, namun dalam dunia teknik, kita perlu definisi yang lebih lugas.

Pengertian dalam Sistem Embedded

A real-time computer system is a computer system where the correctness of the system behavior depends not only on the logical results of the computations, but also on the physical time when these results are produced. By system behavior we mean the sequence of outputs in time of a system.

Sumber: Herman Kopetz, Real Time Systems, Design Principles for Distributed Embedded Applications 2nd edition, Springer, 2011, halaman 2

Terjemahan bebas: “Sistem komputer waktu nyata adalah system computer yang ketepatan perilakunya tergantung tidak hanya pada hasil komputasinya , namun juga waktu terjadinya hasil komputasi tersebut. Perilaku system di sini adalah urutan output terhadap waktu pada system tersebut.”

Jadi pada sistem komputer biasa, kualitas sistem hanya ditentukan hasil perhitungan yang benar, sedangkan pada komputer waktu nyata (real time), kualitas ditentukan oleh ketepatan hasil perhitungan dan waktu keluarnya hasil perhitungan tersebut.

Batasan ‘cepat’ perlu diturunkan dari fenomena fisik pada sistem. Jadi kita perlu memahami perilaku system fisik supaya dapat mendapatkan batasan waktu yang tepat.

Jika komputasi terlalu lambat maka sistem komputasi tidak dapat merespon perubahan fisik dengan baik. Jika hasil komputasi (dikeluarkan) terlalu cepat maka output juga dianggap tidak tepat.

Optimasi komputer juga diperlukan. Jika komputer yang dipakai terlalu cepat dari yang diperlukan, maka harganya akan lebih mahal. Jadi dalam hal ini perlu penentuan kecepatan komputer yang optimal.

Real time bukan hanya sekedar menggunakan prosesor yang cepat, namun juga ada masalah penjadwalan. Hal ini akan dibahas di bahasan Real Time Operating System di  bagian Scheduler (penjadwal). Pada RTOS, selain kecepatan komputasi juga ada faktor pergantian ke pekerjaan yang lebih penting.

Referensi

  • Herman Kopetz, Real Time Systems, Design Principles for Distributed Embedded Applications 2nd edition, Springer, 2011
  • Pengertian Sistem Embedded

Pengertian Sistem Embedded

Pengertian Sistem Embedded pada dunia elektronika adalah “sistem pengolah informasi yang menyatu di dalam suatu produk“.

Definisi Sistem Embedded

Istilah “embedded” adalah istilah dalam bahasa Inggris dengan arti sebagai berikut:

1.occurring as a grammatical constituent (such as a verb phrase or clause) within a like constituent

2.enclosed closely in or as if in a matrix : set firmly into a mass or material

3.attached to a military unit or group for some purpose (such as covering a conflict or providing expert advice)

sumber: “Embedded.” Merriam-Webster.com Dictionary, Merriam-Webster, https://www.merriam-webster.com/dictionary/embedded 

Arti yang paling dekat dengan arti embedded pada dunia elektronika adalah arti nomor 2, yang artinya kurang lebih “sesuatu yang menyatu atau tertanam di dalam benda lain”. Terjemahan langsung istilah ‘embedded’ adalah ‘tertanam’.

Definisi berikut diambil dari buku “Peter Marwedel, Embedded System Design 3rd edition, Springer 2018, halaman 2″

Embedded systems are information processing systems embedded into enclosing products

Pada pengertian ini embedded system adalah suatu system pengolah informasi yang digabungkan atau ditanamkan ke suatu produk atau benda lain. Sistem pengolah informasi di sini tidak harus berupa komputer atau mikroprosesor.

Tertanam atau menyatu di sini berarti bagi orang yang melihat produk hanya melihat produk saja, tidak lagi melihat prosesor di dalamnya sebagai suatu benda yang terpisah.

Berikut ini beberapa definisi menurut literatur lain.

  • An embedded system is any application where a dedicated computer is built right into the system” [Jack Ganssle, The Art of Designing Embedded Systems, 2nd Edition, Newnes, 2008]
  • An application that contains at least one programmable computer (uC, uP or DSP) and which is used by individuals who are in the main, unaware that the system is computer based. [ Pont, M.J. , Patterns for Time Triggered Embedded Systems, (2001)]
  • Any computer system hidden in any products , [David E. Simon, An Embedded Software Primer ,Addison-Wesley Professional; 1st edition (1999)]

Definisi ini menyebutkan secara spesifik bahwa sistem embedded adalah mikroprosesor, dapat berupa mikroprosesor biasa, mikrokontroler ataupun mikropsesor dari jenis digital signal processor

Komputer Umum

Sistem komputer ada yang umum (general purpose) dan embedded. Pada sistem komputer yang umum, kita masih dapat mengenali bahwa benda tersebut adalah sebuah komputer. Dari spesifikasinya biasanya berdasarkan fitur-fitur komputer, seperti kecepatan CPU (Central Processing Unit), ukuran memori dan ukuran storage. Sedangkan pada sistem embedded, biasanya spesifikasinya tidak menampilkan kemampuan komputer yang dipakai di dalamnya, namun hanya menampilkan kemampuan produknya.

Berikut ini beberapa jenis sistem komputer umum:

  1. Desktop Personal Computer
  2. Notebook atau Laptop
  3. Mobile: Smartphone dan tablet
  4. information processing: web server, server database

Berikut ini ilustrasi komputer desktop  (sumber)

Contoh komputer desktop
Contoh komputer desktop

 

Komputer Laptop
Komputer Laptop
Smartphone
Smartphone

Contoh Spesifikasi Komputer Umum

Berikut ini contoh spesifikasi laptop. Perhatikan bahwa disebut jelas tentang kemampuan CPU, memori dan storage dari laptop tersebut.

Thinkpad T495
Thinkpad T495
Spesifikasi Thinkpad T495
Spesifikasi Thinkpad T495

Contoh Produk Dengan Sistem Embedded

Berikut ini contoh mesin cuci tipe front loading otomatis. Di dalam mesin cuci ini ada mikroprosesor untuk mengendalikan semua pekerjaan mesin cuci tersebut. Namun dalam spesifikasinya sama sekali tidak disebut tentang kemampuan mikroprosesornya tersebut.

Mesin cuci Panasonic ECONAVI 8 kg
Mesin cuci Panasonic ECONAVI 8 kg

Spesifikasi:

Spesifikasi mesin cuci Panasonic

Sumber: https://www.panasonic.com/au/support/product-archives/household/laundry-irons/washing-machines/na-148vg4wau.specs.html

Sistem Mikroprosesor dan Sistem Embedded

Berikut ini diagram blok suatu sistem mikroprosor. Komponen utama pada suatu mikroprosesor adalah CPU (Central Processing Unit), memori (RAM, ROM, Flash Memory, EEPROM, EPROM, NVRAM) , Input Output dan bus mikroprosesor.

Diagram blok sistem mikroprosesor
Diagram blok sistem mikroprosesor

Arti dari sistem mikroprosesor sangat mirip dengan system embedded.

Ketika kita bicara system mikroprosesor, biasanya konteksnya kita membahas struktur susunan sistem mikroprosesor, yang terdiri dari CPU, memori dan input output.

Ketika kita membicarakan system embedded, biasanya konteksnya adalah system mikroprosesor ini akan dijadikan bagian dari suatu produk lain.

Di banyak literatur, istilah ‘sistem mikroprosesor’ sinonim dengan ‘sistem embedded’. Pada buku literatur yang baru-baru, misalkan Ketika kita mencari referensi tentang Arduino, yang merupakan mikroprosesor, seringkali judul bukunya mengandung kata ‘embedded’.

Namun perlu diingat juga bahwa tidak semua system embedded menggunakan mikroprosesor, seperti definisi yang sudah disebut di awal. Di bukunya, Peter Marwedel mencontohkan ada system embedded yang menggunakan FPGA (field programmable Gate Array) sebagai pengolah informasi. FPGA ini adalah rangkaian digital yang terdiri dari gerbang rangkaian logika dan memori, yang disusun sebagai pengolah informasi. Untuk kuliah ini kita hanya focus ke system embedded yang menggunakan mikroprosesor.

Referensi

  • Desktop computer https://en.wikipedia.org/wiki/Desktop_computer
  • Laptop computer https://en.wikipedia.org/wiki/Laptop
  • Smartphone https://en.wikipedia.org/wiki/Smartphone
  • “Embedded.” Merriam-Webster.com Dictionary, Merriam-Webster, https://www.merriam-webster.com/dictionary/embedded 
  • Peter Marwedel, Embedded System Design 3rd edition, Springer 2018
  • Jack Ganssle, The Art of Designing Embedded Systems, 2nd Edition, Newnes, 2008
  • Pont, M.J. , Patterns for Time Triggered Embedded Systems, (2001)
  • David E. Simon, An Embedded Software Primer ,Addison-Wesley Professional; 1st edition (1999)

 

 

Cara Membuat Smart Room

Smart Room dapat dibuat dengan menggunakan mikroprosesor. Berikut ini tahap-tahap pembuatan smart room tersebut.

Menentukan Tujuan Smart Room

Tahap pertama dari sebuah pekerjaan/proyek adalah menentukan tujuan utama pekerjaan tersebut.

Berikut ini  beberapa alternatif tujuan sebuah smart room

  • Meningkatkan kenyamanan ruangan, bisa dari sisi pencahayaan, temperatur, kelembaban
  • Menghemat pemakaian energi. Suatu ruangan memerlukan temperatur untuk penerangan dan pemanasan/pendinginan
  • Meningkatkan keamanan ruangan

Menentukan Spesifikasi Sistem

Setelah tujuan ditentukan,berikutnya adalah menentukan spesifikasi teknis dari ruangan tersebut.

Hal-hal yang perlu diperhatikan pada spesifikasi smart-room:

  • Apakah temperatur perlu diukur?
  • Apakah temperatur perlu dikendalikan?
  • Apakah kelembaban perlu diukur?
  • Apakah kelembaban perlu dikendalikan?
  • Apakah cahaya perlu diukur?
  • Apakah cahaya perlu dikendalikan?
  • Temperatur ruangan diukur dengan ketelitian tertentu, misal 1 derajat Celcius, 0,5 derajat Celcius dan sebagainya
  • Rentang temperatur ruangan ditentukan. Hal ini untuk menentukan rentang sensor temperatur yang diperlukan.
  • Target temperatur yang diinginkan
  • Ketelitian pengukuran kelembaban.
  • Rentang kelembaban ruangan yang perlu diukur
  • Target kelembaban yang diinginkan.

Membuat Perancangan Sistem Secara Keseluruhan

Pada tahap ini dibuat arsitektur sistem secara keseluruhan. Aliran data & informasi ditentukan.

Perancangan perangkat keras

Pada tahap ini dilakukan pembuatan rancangan perangkat keras.

Hal-hal yang perlu ditentukan:

  • Menentukan mikrokontroler yang dipakai , jika menggunakan mikroprosesor
  • Menentukan sensor-sensor yang dipakai
  • Menentukan aktuator-aktuator yang diperlukan
  • Menentukan catu daya (power supply) yang diperlukan
  • Kotak untuk menyimpan perangkat

Berikut ini contoh sistem smart room dengan sebuah mikrokontroler sebagai pengendali utama.

Blok Diagram Perangkat Keras Smart-Room
Blok Diagram Perangkat Keras Smart-Room

Contoh prosesor populer yang dapat dipakai di antaranya:

  • Arduino UNO (ATmega328)
  • Arduino Nano (ATmega328)
  • ESP32 (Espressif)
  • ESP8266

ESP32 dan ESP8266 dapat dipakai jika kita memerlukan WiFi atau Bluetooth. Jika tidak perlu komunikasi nirkabel, cukup menggunakan Arduino berbasis ATmega328.

Contoh sensor yang dapat dipakai

  • LM35: sensor temperatur analog
  • DS18S20: sensor temperatur digital
  • BMP280: sensor temperatur dan tekanan udara
  • BME280: sensor temperatur, kelembaban dan tekanan udara
  • LDR (Light Dependent Resistor): sensor cahaya
  • Photodiode : sensor cahaya

Contoh Display yang dapat dipakai:

  • LCD 16×2
  • LCD 20×4
  • LCD matrix

Perancangan perangkat lunak

Pada tahap ini dilakukan hal-hal sebagai berikut

  • menentukan apakah akan menggunakan sistem operasi. pada sistem seperti ini sering dipakai sistem operasi waktu nyata (Real Time Operating System /RTOS ). Salah satu RTOS yang sering dipakai adalah FreeRTOS (https://www.freertos.org/)
  • membuat model diagram alir (flow chart)
  • membuat model aliran data (data flow diagram)
  • membuat model FSM (finite state machine) jika pada sistem terdapat proses yang memerlukan FSM
  • membuat model pengolahan sinyal dengan DSP (Digital Signal Processing), jika terdapat pengolahan sinyal secara digital. Umumnya melibatkan filter digital , equalizer digital, perekaman data digital.

Implementasi Perangkat Keras

Pada tahap ini dibuat papan rangkaian dengan PCB (Printed Circuit Board)

Implementasi Perangkat Lunak

Pada tahap ini dilakukan proses pembuatan perangkat lunak untuk mikrokontroler

Pengujian sistem

Pada tahap ini dilakukan pengujian untuk membandingkan antara perilaku sistem dengan spesifikasi yang diinginkan. Untuk itu diperlukan pengukuran-pengukuran untuk kemudian dibandingkan dengan angka-angka yang diinginkan pada spesifikasi.

Pengujian ini biasanya dilakukan secara kuantitatif, sehingga cukup obyektif.

Perangkat yang diperlukan untuk pengujian sistem di antaranya

  • Termometer digital atau analog sesuai dengan rentang temperatur dan ketelitian yang diinginkan
  • Higrometer digital atau analog sesuai dengan rentang kelembaban dan ketelitian pengukuran kelembaban.
  • Light Meter untuk mengukur pencahayaan ruangan
  • Voltmeter / Wattmeter untuk mengukur unjuk kerja tegangan/ arus/ daya pada rangkaian.

Validasi Sistem

Pada tahap ini dilakukan perbandingan antara tujuan sistem dengan perilaku sistem. Jika sistem yang dibuat sudah dapat menyelesaikan permasalahan di tujuan, maka sistem dapat dikatakan sudah berhasil divalidasi.

Validasi ini biasanya dilakukan secara kualitatif sehinggak agak sedikit subyektif.

Sistem Pengendali Pompa versi 3

Sistem pengendali pompa versi 3 ini adalah lanjutan dari Sistem Pengendali Pompa versi 2 dan Pengendali Pompa versi 1.

Pengendali pompa versi 3
Pengendali pompa versi 3

Fitur utama:

  • Prosesor utama menggunakan ESP32
  • Prosesor display menggunakan ATmega328 (Arduino Nano)
  • Sistem operasi menggunakan FreeRTOS
  • Display menggunakan P10 dot matrix 32 x 16 pixel
  • Relay menggunakan solid state relay (SSR), sebelumnya menggunakan relay elektromekanik

Saat ini implementasi masih di breadboard, belum disolder padahal sudah mulai berdebu.

Fitur yang masih direncanakan namun belum sempat diimplementasikan:

  • Monitoring dengan IoT , artinya data sistem dikirim ke suatu server perekam data.
  • Deteksi ketinggian air dengan sensor ultrasonik

Sistem Filter Digital Praktis Berbasis Mikroprosesor

Suatu sistem filter digital secara prinsip sederhana mengubah sinyal analog menjadi digital, kemudian mengolah sinyal digital tersebut dengan algoritma tertentu, kemudian mengubah sinyal digital kembali menjadi sinyal analog. Secara diagram blok dapat digambarkan sebagai berikut:

Sistem filter digital
Sistem filter digital

Filter digital dapat diimplementasikan dengan beberapa cara, di antaranya dengan sistem mikroprosesor dan sistem digital seperti FPGA (Filed Programmable Gate Array).

Dalam prakteknya, sistem tersebut perlu beberapa tambahan subsistem/modul supaya dapat diimplementasikan secara nyata.

Berikut ini sistem lengkap filter digital untuk diimplementasikan dengan sistem mikroprosesor:

Detail sistem filter digital versi 1
Detail sistem filter digital versi 1

Penjelasan Sistem Filter Digital Sederhana

  • Input: sinyal input berasal dari input, misal untuk sistem audio dapat berupa mikrofon, atau MP3 player, atau komputer.
  • Sinyal input ini memiliki level tegangan dan impedansi tertentu. Seringkali sinyal ini perlu diperkuat dulu. Misal mikrofon biasanya memiliki kuat sinyal puluhan sampai ratusan milivolt dengan impedansi ratusan ohm.
  • Penguat: Penguat memiliki fungsi buffering dan juga menyesuaikan amplitudo supaya cocok dengan amplitudo dari ADC yang dipakai.
  • Pengubah Level Tegangan: tegangan input berupa tegangan bolak-balik, bisa saja memiliki tegangan positif dan negatif. ADC yang dipakai seringkali hanya dapat menerima tegangan positif, sehingga tegangan input mesti digeser agar menjadi positif.
  • Low Pass Filter (anti aliasing): sesuai teori sinyal, frekuensi sampling setidaknya memiliki frekuensi 2x frekuensi kerja sinyal yang diukur. Sinyal input yang lebih dari 1/2 frekuensi sampling harus ditapis supaya tidak terjadi aliasing.
  • ADC (Analog to Digital Converter): mengubah tegangan analog menjadi suatu angka digital, dengan resolusi bit tertentu, dan kecepatan sampling tertentu.
  • Filter Digital:  melakukan proses pengolahan sinyal yang diinginkan, dapat berupa LPF (low pass filter) , HPF (high pass filter), BPF (band pass filter), BSF (band stop filter) ataupun Equalizer.
  • Digital to Analog Converter: mengubah sinyal digital menjadi sinyal analog. Umumnya menggunakan prinsip ZoH (Zero order Hold).
  • Reconstruction Filter: sinyal dari Zero order Hold memiliki bentuk seperti anak tangga (staircase), sehingga memiliki komponen frekuensi tinggi. Untuk itu perlu ada filter rekonstruksi yang menghilangkan komponen frekuensi tinggi tersebut. Selain itu ZoH juga mengubah respon frekuensi, yaitu memberi redaman di frekuensi tinggi. Idealnya reconstruction filter juga mengkompensasi hal tersebut.
  • Penguat: untuk menyesuaikan level tegangan dan impedansi dari DAC ke tahap selanjutnya
  • Power supply: implisit semua sistem elektronika perlu power supply. Sistem pengolah digital ada bagian analog dan digital, sehingga masing-masing perlu level tegangan dan power supply tersendiri.

Kelemahan Sistem Filter Digital Sederhana

Sistem di atas sudah dapat berfungsi dengan baik, namun memiliki beberapa kelemahan.

Masalah pertama: konversi analog ke digital

  • filter anti aliasing sulit untuk dibuat ‘tajam’, sehingga frekuensi sampling mesti jauh lebih tinggi daripada frekuensi kerja sinyal. Jika frekuensi sampling terlalu dekat, respon frekuensi kerja terpengaruh oleh anti aliasing filter, atau juga sebagian sinyal frekuensi tinggi dapat menembus filter anti aliasing.
  • akibat frekuensi sampling tinggi, maka bagian filter digital mesti bekerja pada frekuensi lebih tinggi daripada frekuensi kerja sinyal.
  • hal ini juga berpengaruh jika sinyal perlu disimpan: storage akan membesar
  • hal ini juga berpengaruh jika sinyal perlu dikirim: keperluan bandwidth komunikasi membesar.
  • solusi: sampling dilakukan dengan frekuensi tinggi, namun frekuensi sampling diturunkan (downsampling) sebelum sinyal diolah/dikirim/disimpan.
  • pada proses downsampling, sinyal perlu difilter secara digital supaya tidak terjadi aliasing. proses filter digital lebih mudah dibandingkan filter analog, terutama karena masalah ketelitian nilai komponen analog.

Masalah kedua: konversi digital ke analog

Zero order Hold pada DAC mempunyai respon frekuensi sinc(), sehingga ada redaman di frekuensi tinggi

  • solusi 1: sinyal digital diubah ke frekuensi tinggi sebelum masuk ke DAC, dengan demikian pengaruh redaman frekuensi tinggi berkurang.
  • solusi 2: sinyal digital diperkuat dulu di frekuensi tinggi dengan equalizer, supaya dapat mengkompensasi redaman di frekuensi tinggi.

Berikut ini proses ekualisasi sinyal untuk kompensasi pengaruh ZoH.

Equalizing
Ekualisasi sinyal digital to analog

Pada solusi (a) proses ekualisasi dilakukan secara digital sebelum DAC , disebut sebagai tahap pre-equalization.

Pada solusi (b) proses ekualisasi dilakukan secara analog setelah LPF, disebut sebagai tahap post-equalization.

Sistem Lengkap

Berikut ini blok diagram sistem filter digital dengan tambahan solusi-solusi supaya mengurangi permasalahan-permasalahan.

sistem filter digital lengkap versi 2
Sistem filter digital lengkap versi 2

Pada sistem ini dipilih pre-ekualisasi secara digital , dengan pertimbangan merancang equalizer secara digital lebih mudah. Proses pembuatan equalizer ini dapat dilakukan dengan metode ‘Design of FIR Filters Using the Frequency Sampling Method’.

Referensi

Analisis Sinyal Detak Jantung

Pada artikel ini diuraikan analisis sinyal detak jantung. Sinyal detak jantung diperoleh dari sensor pulsesensor.

Sensor ini sudah pernah dibahas di beberapa artikel sebelumnya:

Tambahan pada artikel ini adalah dilakukan filtering dengan LPF untuk membantu memuluskan sinyal hasil sensor.

 

Sensor detak jantung dari pulsesensor.com
Sensor detak jantung dari pulsesensor.com

Tahap pengolahan sinyal adalah sebagai berikut:

  • Pulsesensor sebagai sumber sinyal yang berasal dari detak jantung
  • Sinyal tegangan dari sensor dimasukkan ke Filter resistor dan kapasitor sebagai low pass filter untuk menghindari terjadinya aliasing,
  • Tegangan hasil filter dimasukkan ke modul Arduino Nano untuk dikonversikan ke digital dengan ADC. Data disampling dengan frekuensi 1 kHz dengan ADC pada Arduino Nano,
  • Data digital kemudian dikirimkan dengan komunikasi serial asinkron dengan kecepatan 115200 bps melalui port USB ke desktop PC.
  • Data direkam di desktop PC dengan perangkat lunak RealTerm. Data direkam ke sebuah file TXT di PC.
  • Data hasil rekaman kemudian dianalisis dengan perangkat lunak python menggunakan Jupyter Notebook

Perangkat lunak untuk pengukuran data di Arduino adalah sebagai berikut:  https://github.com/waskita/embedded/tree/master/atmega-detak-jantung-profiling

Perangkat lunak untuk analisis sinyal adalah sebagai berikut: https://github.com/waskita/embedded/blob/master/analisis-detak-jantung/heart-beat-analysis-1kHz.ipynb

Berikut ini diagram blok aliran sinyal pada sistem ini:

Berikut ini detail uraian aliran sinyal pada sistem tersebut

Sinyal hasil pengukuran dari ADC
Sinyal asli diperbesar

Tujuan dari sensor tersebut adalah mengukur detak jantung seseorang.

Ada beberapa hal yang mempersulit perhitungan detak jantung:

  • amplitudo sinyal berubah-ubah, tergantung kondisi tangan, tekanan pada sensor, dan sebagainya, sehingga batas ambang sinyal berubah-ubah
  • Sinyal detak jantung memiliki puncak yang tinggi, dan ada juga puncak yang lebih kecil. Mesti ada algoritma untuk mendeteksi puncak yang tinggi saja.

Sinyal hasil pengukuran ADC masih kurang rata, sehingga untuk membuat lebih halus dilakukan filtering pada frekuensi cut off 4 Hz. Frekuensi cut-off 4  Hz dipilih mengingat detak jantung maksimum orang normal adalah 220 per menit, atau setara 3,667 Hz. Jadi sinyal di atas frekuensi 3,667 Hz tidak diperlukan. 

Filter menggunakan filter digital IIR 4 pole. Filter 6 pole menghasilkan filter yang tidak stabil, sehingga akhirnya dipakai 4 pole saja. Jenis filter IIR supaya perhitungan lebih sederhana, mengingat sistem ini akan diimplementasikan di mikrokontroler dengan kemampuan komputasi yang terbatas.

Desain filter menggunakan Iowa Hills IIR Filter Designer Version 6.5 sebagai berikut:

Implementasi filter dengan bahasa Python, menggunakan struktur filter “Nth Order Coeffiecients”.

Struktur filter IIR (Infinite Impulse Response) yang dipakai adalah sebagai berikut:

Hasil filter adalah sebagai berikut (sinyal merah).

Sinyal hasil filter dengan low pass dengan fc=4 Hz

Sinyal hasi pengukuran mengandung sinyal DC offset, sehingga rata-ratanya tidak 0. Untuk menghilangkan DC offset, dilakukan filtering dengan LPF pada 200 mHz. Filter 2 pole IIR.

Hasil filter adalah sebagai berikut (sinyal merah):

Sinyal hasil filter LPF 0.2 Hz

Sinyal tanpa offset diperoleh dengan sinyal hasil filter 4 Hz dikurangi dengan sinyal hasil filter di 0.2 Hz.  Hasilnya adalah sinyal (warna biru) di gambar di bawah ini.

Sinyal biru kemudian disearahkan (rectified), sehingga didapat sinyal warna merah.

Sinyal hasil offset dan penyearahan

 

Sinyal hasil penyearahan difilter lagi dengan filter 0.2 Hz, untuk membantu deteksi puncak. Deteksi puncak agak sulit, karena dari hasil filter 4 Hz masih ada puncak kecil. Dengan sinyal hasil penyearahan diharapkan mampu mendeteksi puncak yang tinggi saja.

Gabungan sinyal

Proses terakhir adalah deteksi puncak. Hanya puncak yang tinggi yang dihitung.

Deteksi puncak pulsa denyut jantung

Penutup

Dari percobaan yang dilakukan, filtering (penapisan) analog dan digital dapat membantu membentuk sinyal supaya lebih mudah diproses.

Referensi

Display Untuk Mikroprosesor

Berikut ini beberapa jenis display yang sering dipakai untuk sistem mikroprosesor berbasis Arduino:

  • Dot matriks 16×2
  • Dot matriks 20×4
  • E Paper / E-Ink display
  • OLED
  • LCD TFT / IPS

Antar muka yang dipakai ke display antara lain:

  • komunikasi paralel
  • komunikasi serial I2C
  • komunikasi serial SPI

Komunikasi paralel menggunakan banyak pin, karena setiap bit menggunakan 1 jalur. Antar muka serial hanya memerlukan pin sedikit. Display keluaran baru umumnya sudah menggunakan komunikasi serial.

Berikut ini contoh antar muka ESP32 LOLIN32 Lite dengan display E-INK, menggunakan protokol SPI.

Antar muka LOLIN32 LITE dengan display E-INK Heltec
Antar muka LOLIN32 LITE dengan display E-INK Heltec

Literatur:

Berikut ini antar muka ESP32 Lolin32 Lite dengan display OLED 0.91″, menggunakan protokol I2C.

ESP32 Lolin32 Lite dengan OLED 91
ESP32 Lolin32 Lite dengan OLED 91

Referensi

  • https://github.com/adafruit/Adafruit_SSD1306/blob/master/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino

 

 

Berikut ini ESP32 dengan display LCD TFT berbasis chip ST7789 dengan resolusi 240×240 RGB

ESP32 Dengan TFT ST7789
ESP32 Dengan TFT ST7789

Referensi

  • TFT ST7789 https://simple-circuit.com/arduino-st7789-ips-tft-display-example/

 

Enkripsi Data Antara ESP32 Dan Windows

Mikrokontroler ESP32 dapat berkirim data melalui jaringan dengan komputer lain. Untuk menjaga kerahasiaan data yang dikirim tersebut, maka perlu dilakukan enkripsi  data yang dikirim. Pada tulisan ringkas ini akan ditinjau library enkripsi data yang kompatibel antara ESP32 dan Windows, sehingga memungkinkan pertukaran data dengan enkripsi antara keduanya.

Contoh enkripsi data dengan AES-128 dapat diikuti di artikel berikut ini: https://everythingesp.com/esp32-arduino-tutorial-encryption-aes128-in-ecb-mode/

Enkripsi pada contoh tersebut sangat sederhana:

  • menggunakan AES-128 dengan mode ECB (Electronic Codebook). Seperti diketahui, mode ECB ini punya banyak kelemahan, sehingga kalau mau lebih profesional kita mesti menggunakan mode lain seperti CBC (Cipher Block Chaining).
  • ukuran data harus kelipatan 16 byte. Jika ukuran data lebih dari 16 byte, maka fungsi mesti dipanggil berulangkali, dan kalau ukuran data bukan kelipatan 16, perlu dilakukan padding (pengisian) supaya menjadi kelipatan 16.

Selanjutnya bagaimana supaya data yang dienkripsi di ESP32 dapat dibaca di Windows? Untuk itu perlu diinstall library yang sama / kompatibel di Windows. Untuk mudahnya, pada contoh ini akan digunakan library yang sama supaya tidak perlu mengubah source code.

Library yang dipakai pada ESP32 tersebut adalah Mbed TLS (https://tls.mbed.org/) . Library Mbed TLS tersedia dalam bentuk source code, jadi dapat juga dicompile sendiri untuk platform lain. Untuk Windows, sudah ada library yang sudah dicompile, jadi tinggal diinstall saja. Versi yang tersedia untuk compiler GNU based (Cygwin, MinGW) dan Visual Studio.

Pada contoh berikut ini akan dipakai IDE Netbeans 8.2 dengan compiler Cygwin. Netbeans terbaru adalah versi 11, namun Netbeans yang sudah support C/C++ baru sampai versi 8.2, jadi versi 11 belum mendukung bahasa C / C++.

Library perlu diinstall dari program Setup dari Cygwin. Jalankan program instalasi Cygwin (setup-x86_64.exe), kemudian masuk ke menu pemilihan packages. Pilih View “Full”, dan Search di “mbedtls”. Pilih untuk install library mbedtls dan mbedtls-devel.

Cygwin Mbed TLS library
Cygwin Mbed TLS library

Nama library untuk Mbed TLS adalah libmbedcrypto. Selanjutnya tambahkan library tersebut di setting project dari Netbeans

Berikut ini tampilan library di Netbeans. Lokasi library tersebut adalah di C:/cygwin64/lib/libmbedcrypto.dll.a

Library Mbed TLS di Netbeans 8.2
Library Mbed TLS di Netbeans 8.2

Setelah itu melakukan porting dari program AES-128 di ESP32 ke Netbeans. Hasilnya dapat dilihat di tautan berikut:  https://github.com/waskita/embedded/blob/master/win-crypto/main.c

Berikut ini source code program hasil porting:


/*
* enkripsi data dengan AES-CBC
* modifikasi dari https://everythingesp.com/esp32-arduino-tutorial-encryption-aes128-in-ecb-mode/
* menggunakan library mbedtls dari cygwin
*/
#include "mbedtls/aes.h"
#include "string.h"
#include "stdio.h"

void encrypt(char * plainText, char * key, unsigned char * outputBuffer) {

mbedtls_aes_context aes;

mbedtls_aes_init(&aes);
mbedtls_aes_setkey_enc(&aes, (const unsigned char*) key, strlen(key) * 8);
mbedtls_aes_crypt_ecb(&aes, MBEDTLS_AES_ENCRYPT, (const unsigned char*) plainText, outputBuffer);
mbedtls_aes_free(&aes);
}

void decrypt(unsigned char * chipherText, char * key, unsigned char * outputBuffer) {

mbedtls_aes_context aes;

mbedtls_aes_init(&aes);
mbedtls_aes_setkey_dec(&aes, (const unsigned char*) key, strlen(key) * 8);
mbedtls_aes_crypt_ecb(&aes, MBEDTLS_AES_DECRYPT, (const unsigned char*) chipherText, outputBuffer);
mbedtls_aes_free(&aes);
}

int main(void) {
char * key = "abcdefghijklmnop";

char *plainText = "Tech tutorials x";
unsigned char cipherTextOutput[16];
unsigned char decipheredTextOutput[16];

encrypt(plainText, key, cipherTextOutput);
decrypt(cipherTextOutput, key, decipheredTextOutput);

printf("Original plain text: %s\n", plainText);

printf("Ciphered text:\n");
for (int i = 0; i < 16; i++) {

char str[3];

sprintf(str, "%02x", (int) cipherTextOutput[i]);
printf("%s", str);
}

printf("\n\nDeciphered text:\n");
for (int i = 0; i < 16; i++) {
printf("%c", (char) decipheredTextOutput[i]);
//printf("%c", (char) decipheredTextOutput[i]);
}
return 0;
}

Perubahan yang dilakukan:

  • memindahkan isi setup() di Arduino ke main() di Netbeans
  • menambahkan header file stdio.h dan string.h
  • mengganti Serial.print() dengan printf()
Output di ESP32 ArduinoOutput Windows 32
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:8740
load:0x40080400,len:5788
entry 0x4008069c
Original plain text:
Tech tutorials x
Ciphered text:
567a3b23b683d8488d5d40d2a56e31d2
Deciphered text:
Tech tutorials x
Original plain text: Tech tutorials x
Ciphered text:
567a3b23b683d8488d5d40d2a56e31d2
Deciphered text:
Tech tutorials x
RUN SUCCESSFUL (total time: 70ms)

Dari hasil di atas, nampak bahwa ciphered text adalah identik, dan keduanya dapat melakukan proses dekripsi. Jadi dapat disimpulkan kedua program tersebut mempunyai fungsi yang sama, jadi data yang dienkripsi di ESP32 dapat dibaca di Windows dan sebaliknya.

Tahap selanjutnya adalah menambahkan proses komunikasi data dengan menggunakan UDP/TCP di ESP32 dan Windows, namun hal itu akan menjadi tulisan lain lagi.

Referensi

Percobaan Output PWM dari Timer 0 pada ATmega328

Pulse Width Modulation (PWM) atau modulasi lebar pulsa sangat bermanfaat pada sistem mikrokontroler, salah satunya adalah untuk mengendalikan motor DC. Pada chip ATmega328, sinyal PWM ini dapat dibangkitkan dengan perangkat lunak, ataupun dapat dibangkitkan dari perangkat keras dengan menggunakan periferal Timer internal. PWM dari perangkat keras cukup praktis karena tidak membebani perangkat lunak, namun ada keterbatasan karena pada ATmega328 hanya terdapat 3 buah timer internal, sehingga tidak bisa memiliki banyak output PWM dari perangkat keras.

Berikut ini ujicoba output PWM (Pulse Width Modulation) dari Timer 0 pada ATmega328. Modul yang digunakan adalah Arduino Nano clone.

Konfigurasi pengujian PWM ini adalah sebagai berikut:

  • Perangkat keras menggunakan Timer 0 (8 bit)
  • Clock Source: System Clock
  • Clock Value 2000.000 kHz
  • Mode: Fast PWM top=0xFF
  • Out A: Non-Inverted PWM
  • Out B: Disconnected
  • tidak ada interupsi dari Timer0
  • output pada pin OC0A (pin PD6 pada ATmega328, D6 pada Arduino Nano)

Pengaturan register menggunakan Code Wizard dari CodeVision AVR Evaluation dengan detail sebagai berikut ini:

Source code terkait dengan Timer 0 adalah sebagai berikut:

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 0.128 ms
// Output Pulse(s):
// OC0A Period: 0.128 ms Width: 0.016063 ms
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x20;
OCR0B=0x00;

Source code lengkap dapat dilihat di https://github.com/waskita/embedded/blob/master/cv-kendali/cv-kendali-usart.c

Variable yang dapat diubah-ubah adalah OCR0A untuk mengatur duty-cycle dari PWM. Nilai register ini dapat diisi dari 0x00 sampai dengan 0xff (255)

Tahap selanjutnya adalah pengujian output PWM dengan cara melihat sinyal yang dihasilkan dengan osiloskop GW INSTEK GDS-1042

Berikut ini adalah output dengan nilai register OCR0A=0x00. Perioda PWM adalah 2000/256 = 0.128 ms

OCR0A=0x01

Nampak bahwa nilai register 0 akan memberikan sinyal yang paling pendek, yaitu dengan panjang pulsa 500 ns. Berikut ini adalah sinyal yang sama dilihat dengan time base 100 ns per div

OCR0A=0x01, zoom

Berikut ini adalah sinyal dengan OCR0A=0x80 atau duty cycle=50%

OCR0A=0x80

Berikut ini adalah sinyal dengan OCR0A=0xfe (254)

OCR0A=0xfe (254)

Terakhir adalah sinyal dengan duty cycle = 100% , dengan OCR0A=0xff (255)

OCR0A=0xff

Hal penting yang perlu diperhatikan: nilai duty cycle tidak pernah 0%, minimum adalah 1/256. Nilai maksimum duty cycle adalah 100%. Untuk membuat sinyal PWM duty cycle =0 dapat dilakukan dengan mematikan output PWM.

Debugging ESP32 Dengan FT2232HL

ESP32 dan CJMCU-2232HL

Mikrokontroler/mikroprosesor berbasis ESP32 mempunyai fitur on-chip-debugging dengan protokol JTAG. Supaya ESP32 ini dapat didebug, maka perlu ada komponen JTAG Adapter. Petunjuk pemilihan JTAG adapter terdapat di artikel “Selecting JTAG Adapter“. Cara termudah adalah menggunakan board ESP32-WROVER-KIT yang sudah mempunyai JTAG adapter di dalamnya. Cara lain adalah menambahkan JTAG adapter pada board ESP32 yang belum dilengkapi dengan JTAG Adapter. Daftar JTAG Adapter yang dapat dipakai dapat dilihat antara lain di artikel “Debug Adapter Hardware“.

Pada tulisan ini diuraikan cara menyambungkan ESP32 ke JTAG Adapter berbasis FT2232HL.

Cara termudah melakukan debugging pada ESP32 adalah menggunakan board ESP32-WROVER-KIT yang sudah ada JTAG Adapter built-in di dalamnya. Sayangnya harga board ini agak mahal (sekitar USD 50). Jika Espressif sendiri menggunakan FT2232 untuk JTAG Adapter, nampaknya kemampuan FT2232 cukup bagus sebagai debugger.

Harga board ESP32 yang murah sekitar USD 7, sedangkan breakout board untuk FT2232 harganya sekitar USD 7, jadi dengan USD 14 sudah memperoleh ESP32 lengkap dengan JTAG debugger. Hanya saja perlu merangkai sendiri ESP32 dengan FT2232.

Hardware

Berikut ini teknik penyambungan ESP32 ke FT2232 menurut beberapa sumber.

#1 Analisis Skematik ESP32 WROVER KIT

Contoh cara menyambungkan antara ESP32 dengan FT2232 dapat dilihat dari skematik ESP32 WROVER KIT di situs Espressif. Berikut ini adalah pin JTAG pada ESP32, yaitu:

  • MTCK
  • MTDI
  • MTDO
  • MTMS
  • EN
Pin JTAG pada ESP32

Berikut ini adalah bagian dari skematik ESP32 WROVER KIT, khususnya yang tersambung ke JTAG. Pin yang dipakai adalah ADBUS0, ADBUS1, ADBUS2, ADBUS3, ACBUS1, yang tersambung ke sinyal TCK, TDI, TDO, TMS dan R_RST

Pin JTAG pada FT2232HL

Tabel berikut berisi hasil analisis daftar pin dan sinyal JTAG pada skematik ESP32 WROVER KIT tersebut:

Pin FT2232HLSinyalSinyalPin ESP32
ADBUS0TCKMTCKR_IO13
ADBUS1TDIMTDIR_IO12
ADBUS2TDOMTDOR_IO15
ADBUS3TMSMTMSR_IO14
ACBUS2RSTENR_nTRST

#2 Situs PlatformIO

Penyambungan JTAG juga dijelaskan di situs PlatformIO sebagai berikut:

FT2232H Mini-Module PinBoard JTAG PinDescription
GND [CN2-2]GNDDigital ground
AD0 [CN2-7]TCKJTAG Return Test Clock
AD1 [CN2-10]TDITest Data In
AD2 [CN2-9]TDOTest Data Out
AD3 [CN2-12]TMSTest Mode State
AC2 [CN2-20]RESETConnect this pin to the (active low) reset input of the target CPU (EN for ESP32)

Sumber: http://docs.platformio.org/en/latest/plus/debug-tools/minimodule.html

Modul FT2232 yang dipakai pada artikel tersebut adalah “FT2232H Mini Module” yang diproduksi oleh FTDI.

FT2232H Mini Modul

Produk breakout board serupa juga dibuat oleh CJMCU seperti pada foto berikut:

CJMCU-2232HL

#3 Forum Platformio

Sebagai perbandingan, berikut ini daftar koneksi JTAG ke ESP32 menurut artikel forum PlatformIO (Debugging ESP32 – How), modul FT2232 yang digunakan adalah “FTDI2232 minimodule”:

To debug ESP32 using FTDI2232 minimodule, here is the required connection:
FTDI AD0 -> ESP32 GPIO13 (TCK)
FTDI AD1 -> ESP32 GPIO12 (TDI)
FTDI AD2 -> ESP32 GPIO15 (TDO)
FTDI AD3 -> ESP32 GPIO14 (TMS)
FTDI AC2 -> ESP32 EN (RST)
FTDI GND -> ESP32 GND

Sumber: https://community.platformio.org/t/debugging-esp32-how/4499

#4 Datasheet FT2232H

Penggunaan FT2232H sebagai JTAG juga dijelaskan secara ringkas di datasheet FT2232H sebagai berikut:

Konfigurasi pin FT2232H

Software

Setelah mendapatkan kepastian cara menyambungkan hardware JTAG debugger, selanjutnya adalah setting software untuk melakukan debugging.

Status saat ini baru melakukan studi software apa saja yang perlu disiapkan. Beriktu ini penjelasan software untuk debugging ESP32:

  • Penggunaan software debugger Eclipse/Command Line: https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/jtag-debugging/using-debugger.html https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/jtag-debugging/configure-other-jtag.html
  • Penggunaan Debugger dengan PlatformIO: http://docs.platformio.org/en/latest/plus/debug-tools/minimodule.html
  • Debugging ESP32 secara umum: https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/jtag-debugging/

Hasil debugging menyusul.

Kesimpulan

Kesimpulan sementara ini:

  • Menurut studi literatur, ESP32 dapat didebug dengan hardware FT2232HL, dengan biaya total USD 14, lebih murah daripada harus memakai ESP WROVER KIT seharga USD 50.
  • Penyambungan antara ESP32 dan FT2232 dijelaskan di beberapa situs, dengan isi konsisten.
  • Proses debugging belum dilakukan, namun dari pengalaman selama ini, isi artikel di situs Espressif cukup lengkap dan mudah diikuti. Nampak bahwa Espressif cukup serius mengusahakan agar produk ESP32nya mudah dipakai oleh ‘orang biasa’.

Referensi

Ruang Lingkup Pengembangan Sistem Elektronika

Pengembangan suatu sistem elektronika melibatkan beberapa pekerjaan yang berbeda. Ada beberapa versi ruang lingkup pengembangan sistem elektronika menurut para ahli.

Berikut ini menurut buku Jens Lienig,Hans Bruemmer, Fundamentals of Electronic System Design.

Model Jens & Hans ini ruang lingkupnya luas, dari bagian terluar dari sistem elektronik, sampai ke dalam . Namun demikian tidak dibahas hal-hal yang terlalu spesifik , seperti misalnya mengenai model perangkat lunak untuk sistem yang menggunakan sistem mikroprosesor.

Berikut ini lebih spesifik ke sistem embedded, menurut buku Lee & Seshia, Introduction to Embedded Systems, a cyber-physical systems approach. Sistem embedded secara ringkasnya adalah sistem yang di dalamnya menggunakan komputer/mikroprosesor sebagai salah satu komponen utama, namun komputer/mikroprosesor ini tidak nampak.

Model dari Lee & Seshia ini nampaknya fokus ke mikroprosesor dan teknik pembuatan software di dalamnya. Tidak dibahas permasalahan hardware lainnya.

Berikut ini menurut buku Peter Marweddel, Embedded System Design, Foundations of Cyber-Physical Systems, and the Internet of Things, 3rd Edition.

Model dari Peter Marwedel ini sedikit lebih luas daripada model Lee & Seshia, namun masih lebih sempit dibandingkan model Jens & Hans.

Kesimpulan sementara:

  • Secara umum sistem elektronika perlu memperhatikan model Jens & Hans
  • Jika sistem elektronika yang dibuat menggunakan mikroprosesor & perangkat lunak, perlu menggunakan model Lee & Seshia atau model Peter Marwedel untuk detail di perangkat lunaknya.

Digital to Analog Converter MCP4725

Breakout board MCP4725 tampak atas
Breakout board MCP4725 tampak bawah

MCP4725 adalah Digital to Analog Converter 12 bit dengan antarmuka digital dengan protokol I2C. Komponen ini sangat bermanfaat jika kita ingin menambahkan kemampuan output analog pada suatu sistem mikroprosesor/mikrokontroler yang belum memiliki kemampuan DAC di dalamnya. Mikrokontroler tanpa DAC misalnya adalah Arduino Nano (ATMega328) dan STM32F103C8T (Blue Pill).

Modul MCP4725 yang banyak nampaknya adalah hasil kloning dari modul MCP4725 buatan Sparkfun, mengingat penampilannya sangat mirip.

Modul MCP4725 buatan Sparkfun
Skema modul MCP4725 versi Sparkfun

Pada modul MCP4725 tersebut ada jumper yang dapat dikonfigurasi:

  • SJ1 untuk mengaktifkan atau menonaktifkan pull up resistor I2C berukuran 4k7. Defaultnya adalah pull up resistor terhubung. Jika ingin diganti/ditiadakan, maka jalur pada PCB mesti dipotong dengan cutter.
  • SJ2 untuk memilih alamat I2C dari modul MCP4725 pada pin 0. Defaultnya adalah terhubung ke GND , sehingga alamat pada I2C adalah 1100000 (4 bit ‘1100’ adalah 4 bit device code, 2 bit berikutnya ’00’ adalah A2 dan A1, 0 terakhir sesuai dengan input A0)

Percobaan MCP4725 Dengan Arduino Nano

Tahap pertama, aktifkan library MCP4725 dari Adafruit. Penjelasan library ini terdapat di https://github.com/adafruit/Adafruit_MCP4725

Referensi

dfd


Antar Muka Input Analog

Mikroprosesor dapat menerima input analog maupun digital. Pada input analog, tentunya terjadi perubahan dari analog ke digital dengan menggunakan ADC (Analog to Digital Converter). Namun sebelum masuk ke ADC, ada beberapa proses yang perlu diperhatikan, di antaranya:

  • Level shift, karena pada umumnya input analog berbentuk sinyal AC yang negatif dan positif, sedangkan kebanyakan ADC hanya menerima sinyal positif. Sinyal yang ada negatif dan positif ditambah dengan suatu nilai, sehingga semua sinyal menjadi bernilai positif. Jika ADC dapat menerima sinyal positif, maka level shift ini tidak diperlukan.
  • Penguat (amplifier) atau peredam (attenuator), untuk memperkuat atau memperlemah sinyal agar rentang tegangan sinyal analog yang masuk dan rentang tegangan ADC cocok
  • Clipper / clamp. ADC hanya dapat menerima tegangan pada rentang tertentu tanpa merusaknya. Misal  pin ATMega328 pada Arduino hanya dapat menerima tegangan maksimal VCC+0,7 volt dan minimal GND-0,7 volt. Untuk itu perlu ada rangkaian yang dapat memotong sinyal masuk jika melebihi batas tersebut. Sebenarnya sinyal dari penguat/peredam seharusnya sudah berada dalam rentang tegangan ADC, namun pada kondisi tertentu, sinyal input kadang-kadang dapat naik-turn di luar jangkauan yang normal. Jika kita tidak yakin 100% bahwa tegangan akan berada pada rentang tersebut, maka lebih aman jika dipasang clipper / clamp.
  • Filter anti aliasing / Low Pass Filter. Frekuensi sinyal input harus kurang dari 1/2 frekuensi sampling supaya tidak terjadi aliasing.
  • Tegangan referensi. ADC memerlukan tegangan referensi, ada yang tegangan referensi didapat dari luar mikroprosesor, ada juga mikroprosesor yang sudah menggunakan tegangan referensi built in.
  • Sample & Hold. Jika perubahan sinyal input sangat cepat dibandingkan dengan kecepatan konversi pada ADC, maka tegangan input perlu ditahan (hold) dengan suatu rangkaian , supaya tegangan input ADC tidak berubah-ubah selama konversi berlangsung.
  • Multiplexer, jika 1 ADC dipakai untuk beberapa kanal input yang berbeda. Khusus untu multiplexer dibahas di artikel “Antar Muka Input Analog Multi Kanal
  • Surge Arrester. Khusus jika ada resiko sambaran petir tidak langsung,  maka pada input analog perlu dipasang surge arrester untuk meredam imbas sambaran petir tidak langsung tersebut.
Pemrosesan sinyal input ADC

Level Shift

Level shift pada prinsipnya adalah rangkaian penjumlah (adder) berbasis op-amp. Rangkaian level shift ini dapat disatukan dengan amplifier/attenuator, dengan mengatur besarnya penguatan yang diperlukan. Berikut contoh level shift yang mengubah sinyal analog dengan rentang -5 sampai +5 menjadi rentang 0 sampai 3,3 volt.

Rangkaian level shift

Referensi:

Filter Anti Aliasing

Berikut ini contoh rangkaian low pass orde 1 pasif sederhana:

Filter low pass orde 1 pasif

Berikut ini contoh rangkaian low pass orde 2 aktif  berbasis op-amp:

Filter low pass orde 2 aktif

Referensi

Clipper / Clamp

Output dari rangkaian analog dapat memiliki level tegangan di luar kemampuan ADC, untuk itu tegangan yang masuk ke bagian ADC perlu dijaga supaya tidak terlalu tinggi dan juga tidak terlalu rendah.

Berikut ini contoh rangkaian clamp berbasis diode schottky

Rangkaian proteksi input ADC dengan diode schottky

Berikut contoh rangkaian berbasis op  amp yang membatasi sinyal analog menjadi rentang 0 volt sampai dengan 4,096 volt dengan op-amp LT6015.

Referensi