Berikut ini percobaan menyalakan LCD TFT 2.4″ dalam bentuk Shield untuk Arduino UNO.
Berikut ini penampakan Arduino UNO di sebelah shield LCD TFT 2.4″.
Arduino UNO di sebelah TFT LCD
LCD Shield ini cocok dipasang di atas Arduino UNO. Kalau dipasang ke breadboard malah sulit, memerlukan kabel-kabel karena ukuran kakinya tidak sama dengan ukuran kaki di breadboard.
Bagian belakang TFT LCD
Di bagian belakang TFT LCD ini ada slot untuk kartu memori SD card. Pada bagian belakang tertulis “http://tft.simkeim.com tftlcd for arduino uno (spiflash)”. Namun setelah dicek, domain simkeim.com ternyata tidak ada.
TFT LCD ini menggunakan chip SPFD5408, sehingga tidak kompatibel dengan library LCD dari Adafruit.
Cara menyalakan LCD ini dijelaskan oleh Joao Lopes di artikelnya sebagai berikut:
Berikut ini perangkat Human Machine Interface (HMI) tipe MT6071iP, buatan Weinview atau Weintek. Fungsi alat ini sebagai antar muka ke pengguna di lingkungan industri/pabrik.
Penampakan
Berikut ini tampak depan MT6071iP. Ukuran layar adalah 7 inch. Resolusi layar adalah 800×480. Layar dilengkapi layar sentuh resistif. Operasi alat ini tidak memerlukan keyboard / mouse.
Tampak depan Weinview MT6071iP dengan power supply 24 volt di sebelahnya
Berikut ini tampak depan digelapkan sedikit, supaya kelihatan tulisannya.
Menguji tampilan dengan screencapture website Elektrologi
Tampak belakang MT6071iP
Pada bagian belakang terdapat konektor power (warna hijau). Jalur power adalah chasis ground, power ground, dan power. Tegangan catu daya yang dapat diberikan adalah 10 volt sampai 28 volt.
Komunikasi ke perangkat lain menggunakan koneksi fisik RS232 dan RS485. Protokol yang digunakan misalnya RTU Modbus, sebagai client ataupun sebagai server. Untuk memasukkan program menggunakan kabel USB mikro yang dihubungkan ke komputer Windows 10.
Bagian pojok
Pada bagian pinggir sudah dilengkapi dengan karet, supaya memudahkan membuat panel yang tahap percikan air dan debu.
Produk ini tipenya adalah MT6071iP, namun literatur dan settingnya dari hasil penelitian sama dengan tipe MT8071iP.
Pemasangan di Panel
HMI Weintek ini dirancang untuk dipasang di panel. Untuk itu sudah disediakan sekrup dan dudukan agar mudah memasangnya di panel. Tidak perlu membuat lubang sekrup di panel.
Weintek HMI di Panel
Berikut ini contoh pemasangan HMI di sebuah panel elektrikal. Kabel dari HMI ditempel ke panel menggunakan tie-mount dan cable ties.
Tie mount untuk kabel di panel
Komunikasi Serial
Untuk menghubungkan HMI ini ke perangkat lain mesti menggunakan port serial RS232 ataupun RS485. Protokol yang didukung adalah Modbus.
Berikut ini pin pada port DB9 untuk komunikasi RS232 maupun RS485
Daftar pin serial pada Weintek MT6071iP
Susunan pin pada konektor DB9 ini berbeda dengan susunan pin yang umum dipakai pada DB9 di komputer desktop, sehingga perlu membuat kabel khusus untuk menyambungkannya.
Untuk menghubungkan HMI ini ke perangkat lain mesti menggunakan port serial RS232 ataupun RS485. Protokol yang didukung adalah Modbus.
Beberapa hal menarik yang dapat dikerjakan dengan Weintek MT6071iP ini di antaranya:
menghubungkan HMI ke Desktop PC menggunakan kabel serial RS232
menghubungkan HMI ke Raspberry PI menggunakan kabel serial RS232
menghubungkan HMI ke Raspberry PI menggunakan protokol RS485
menghubungkan HMI ke Arduino UNO/Nano PI menggunakan protokol RS485
menghubungkan HMI ke Arduino UNO/Nano PI menggunakan protokol RS232
Kabel Serial RS232
Untuk menghubungkan Weintek HMI ke desktop PC dapat menggunakan kabel RS-232C. Konektor yang umum dipakai di PC dan USB Serial adalah DB9.
Berikut ini pinout RS232 pada PC:
Pin
SIG.
Signal Name
DTE (PC)
1
DCD
Data Carrier Detect
in
2
RXD
Receive Data
in
3
TXD
Transmit Data
out
4
DTR
Data Terminal Ready
out
5
GND
Signal Ground
–
6
DSR
Data Set Ready
in
7
RTS
Request to Send
out
8
CTS
Clear to Send
in
9
RI
Ring Indicator
in
Ref: https://www.db9-pinout.com/
Sambungan kabelnya adalah sebagai berikut
Pin Weintek
Sinyal Weintek
Pin Desktop
Sinyal Desktop
Keterangan
5
GND
5
GND
6
TXD
2
RXD
7
RTS
8
CTS
opsional
8
CTS
7
RTS
opsional
9
RXD
3
TXD
Sinyal yang diperlukan sekurang-kurangnya adalah GND , TXD dan RXD. RTS dan CTS hanya diperlukan kalau kita mengguanakan sinyal RTS dan CTS untuk handshaking.
Kabel serial untuk Weintek MT6071iP
Konektor DB9 yang dipakai untuk kedua konektor DB9 adalah jenis female.
Kabel serial untuk Weintek MT6071iP
Jika kabelnya terlalu pendek, dapat diperpanjang dengan menggunakan kabel straight DB9 female ke DB9 male.
Kabel serial untuk Weintek MT6071iP diperpanjang dengan kabel straight
Konektor DB9 kemudian dipasang ke HMI Weintek. Jika dipakai di tempat yang mengalami getaran, lebih baik jika sekrup pada konektor DB9 dipasang dengan kuat.
Weintek MT6071iP dengan kabel serial
Jika di PC/Laptop tidak ada konektor serial RS232, maka untuk mendapatkan RS232 dapat menggunakan konverter USB to Serial, misal menggunakan merek BAFO sebagai berikut ini.
VA adalah singkatan dari ‘volt ampere’. Volt adalah satuan tegangan, ampere adalah satuan arus. Watt adalah satuan daya.
Besaran VA biasa dipakai pada arus bolak-balik (AC). Untuk dapat mengubah VA menjadi watt, diperlukan informasi tambahan yaitu faktor daya (cos phi)
Ringkasnya:
Daya (watt) = Tegangan (volt) x arus (ampere) x cos(phi).
Untuk mengubah VA menjadi watt diperlukan angka faktor daya pada sistem tersebut. Faktor daya ini besarnya minimum 0, maksimum 1. Jadi 1 VA = (faktor daya) watt. Misalkan faktor daya 0,7 maka 1 VA = 0,7 watt.
1 kVA sama dengan 1000 VA, jadi 1 kVA = 1000 x (faktor daya) watt. Misal faktor daya = 0,9 maka 1 kVA = 1000 x 0,9 = 900 watt.
Contoh lain:
Tegangan bolak-balik 220 volt, dengan arus 10 ampere. Faktor daya 0,7. Berapakah daya?
Jawab: P = V x A x cos (phi) = 220 volt x 10 ampere x 0,7 = 1540 watt
Berikut ini percobaan 2 task periodik pada FreeRTOS
Spesifikasi
Task1:
Waktu eksekusi 4 detik
Perioda 10 detik (10,8 detik terukur)
Task2:
Waktu eksekusi 1 detik
Perioda 2 detik
Perangkat Lunak
// 1 task periodik dengan FreeRTOS Arduino Nano (ATmega328)
// template umum FreeRTOS di Arduino Nano https://github.com/feilipu/Arduino_FreeRTOS_Library/blob/master/examples/AnalogRead_DigitalRead/AnalogRead_DigitalRead.ino
// contoh pemakaian vTaskDelayUntil dan xTaskGetTickCount dari https://github.com/feilipu/avrfreertos/blob/master/MegaBlink/main.c
#include "Arduino_FreeRTOS.h"
#include <semphr.h>
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
static void TaskBlinkLED1(void *pvParameters);
static void TaskBlinkLED2(void *pvParameters);
// task handle diperlukan jika ingin mengakses parameter suatu task. optional
TaskHandle_t xHandle1 = NULL;
void TaskDummy(int LED_A, int LED_B, long int counter) {
long int i;
for (i = 0; i < counter; i++) {
cli();
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
sei();
asm("nop");
cli();
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
sei();
asm("nop");
}
digitalWrite(LED_A, LOW); // matikan semua LED
digitalWrite(LED_B, LOW);
}
void setup() {
Serial.begin(115200);
Serial.println("Start");
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
xTaskCreate(
TaskBlinkLED1
, "Task1" // A name just for humans
, 100 // This stack size can be checked & adjusted by reading the Stack Highwater
, NULL
, 2 // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
, &xHandle1 );
xTaskCreate(
TaskBlinkLED2
, "Task2" // A name just for humans
, 100 // This stack size can be checked & adjusted by reading the Stack Highwater
, NULL
, 3 // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
, &xHandle1 );
}
void loop() {
}
static void TaskBlinkLED1(void *pvParameters) // Main Red LED Flash
{
TickType_t xLastWakeTime;
/* The xLastWakeTime variable needs to be initialised with the current tick
count. Note that this is the only time we access this variable. From this
point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
API function. */
xLastWakeTime = xTaskGetTickCount();
while (1)
{
Serial.println(millis());
Serial.println(xLastWakeTime); // cetak last wake time, untuk debugging. hanya untuk slow system
TaskDummy(LED1, LED2, 10000L / 0.172 * 4 ); // 4 detik waktu eksekusi
vTaskDelayUntil( &xLastWakeTime, ( 10000L / portTICK_PERIOD_MS ) ); // 10 detik perioda
}
}
static void TaskBlinkLED2(void *pvParameters) // Main Red LED Flash
{
TickType_t xLastWakeTime;
/* The xLastWakeTime variable needs to be initialised with the current tick
count. Note that this is the only time we access this variable. From this
point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
API function. */
xLastWakeTime = xTaskGetTickCount();
while (1)
{
Serial.println(millis());
Serial.println(xLastWakeTime); // cetak last wake time, untuk debugging. hanya untuk slow system
TaskDummy(LED3, LED4, 10000L / 0.172 ); // 1 detik waktu eksekusi
vTaskDelayUntil( &xLastWakeTime, ( 2000L / portTICK_PERIOD_MS ) ); // 2 detik perioda
}
}
Pengukuran
Berikut ini adalah tampilan kedua buah task di layar osiloskop.
Pada percobaan ini dilakukan penjadwalan untuk sebuah task periodik pada sistem operasi FreeRTOS. Mikroprosesor yang dipakai adalah Arduino Nano (ATmega328).
Pengukuran akan dilakukan dengan video dengan kecepatan 25 frame per detik, sehingga pemilihan waktu eksekusi dan periode tidak boleh terlalu kecil. Untuk percobaan dipilih waktu eksekusi 4 detik, dengan perioda task adalah 10 detik.
Task 4 detik dibuat menggunakan TaskDummy yang sudah dibuat di percobaan sebelumnya. Pemilihan waktu 4 detik dapat dilakukan dengan menggunakan parameter fungsi yang sesuai.
Perangkat Keras
Perangkat keras yang digunakan adalah Arduino Nano dengan 2 buah LED terhubung ke pin 2 dan pin 3.
Implementasi Program
Berikut ini source code percobaan tersebut.
// 1 task periodik dengan FreeRTOS Arduino Nano (ATmega328)
// template umum FreeRTOS di Arduino Nano https://github.com/feilipu/Arduino_FreeRTOS_Library/blob/master/examples/AnalogRead_DigitalRead/AnalogRead_DigitalRead.ino
// contoh pemakaian vTaskDelayUntil dan xTaskGetTickCount dari https://github.com/feilipu/avrfreertos/blob/master/MegaBlink/main.c
#include "Arduino_FreeRTOS.h"
#include <semphr.h>
#define LED1 2
#define LED2 3
static void TaskBlinkLED1(void *pvParameters);
// task handle diperlukan jika ingin mengakses parameter suatu task. optional
TaskHandle_t xHandle1 = NULL;
void TaskDummy(int LED_A, int LED_B, long int counter) {
long int i;
for (i = 0; i < counter; i++) {
cli();
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
sei();
asm("nop");
cli();
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
sei();
asm("nop");
}
digitalWrite(LED_A, LOW); // matikan semua LED
digitalWrite(LED_B, LOW);
}
void setup() {
Serial.begin(115200);
Serial.println("Start");
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
xTaskCreate(
TaskBlinkLED1
, "TaskBlinkLED1" // A name just for humans
, 100 // This stack size can be checked & adjusted by reading the Stack Highwater
, NULL
, 2 // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
, &xHandle1 );
}
void loop() {
}
static void TaskBlinkLED1(void *pvParameters) // Main Red LED Flash
{
TickType_t xLastWakeTime;
/* The xLastWakeTime variable needs to be initialised with the current tick
count. Note that this is the only time we access this variable. From this
point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
API function. */
xLastWakeTime = xTaskGetTickCount();
while (1)
{
Serial.println(millis());
Serial.println(xLastWakeTime); // cetak last wake time, untuk debugging. hanya untuk slow system
TaskDummy(LED1, LED2, 10000L / 0.172 * 4 ); // 4 detik waktu eksekusi
vTaskDelayUntil( &xLastWakeTime, ( 10000L / portTICK_PERIOD_MS ) ); // 10 detik perioda
}
}
Pengukuran Dengan Video
Pengukuran dilakukan dengan merekam kedipan LED selama kurang lebih 30 detik. Kecepatan frame video yang dihasilkan adalah 25 frame per detik.
Berikut ini rekaman video lampu kedip yang dihasilkan.
Analisis frame per frame dilakukan dengan menggunakan aplikasi DaVinci Resolve 16.
Tampilan DaVinci Resolve 16
Video dapat ditampilkan dengan mode “Media”, “Cut” maupun “Timeline”. DaVinci Resolve secara default menampilkan waktu dalam format HH:MM:SS, namun tampilan ini dapat diubah menjadi tampilan nomor frame untuk memudahkan analisis.
Berikut ini hasil analisis video LED tersebut:
Transisi
Frame
OFF -> ON
161
ON -> OFF
262
OFF->ON
432
ON->OFF
534
OFF->ON
704
ON->OFF
805
OFF->ON
975
Analisis durasi waktu eksekusi
262-161 = 101 frame = 4,04 detik
534-432=102 frame = 4,08 detik
805-704 = 101 frame = 4,04 detik.
Analisis Perioda Task
432-161= 271 frame = 10.85 detik
534-262= 272 frame = 10.88 detik
704-432= 272 frame= 10.88 detik
805-534= 271 frame = 10.85 detik
975-704= 271 frame= 10.85 detik
Durasi atau waktu eksekusi adalah 4,04 detik ~ 4,08 detik
Periode Task yang terukur adalah antara 10.85 detik sampai 10.88 detik.
Pengukuran Dengan Osiloskop
Sebagai perbandingan juga dilakukan pengukuran tegangan pada LED dengan osiloskop. Berikut ini rekaman video pengukuran dengan osiloskop
Berikut ini pengukuran perioda task dengan menggunakan fitur cursor pada osiloskop.
Pengukuran perioda task
Dari hasil pengukuran perioda didapatkan angka 10,80 detik. Hasil ini cukup sesuai dengan analisis frame video.
Berikut ini pengukuran durasi task.
Pengukuran durasi task
Didapatkan hasil angka durasi task adalah 4,1 detik, cukup mendekati angka 4,08 detik dari hasil analisis frame.
Analisis
Dari hasil perhitungan di atas, dapat didapatkan bahwa
durasi eksekusi dari TaskDummy sudah cukup mendekati hasil yang diinginkan
durasi perioda task berbeda cukup jauh , sekitar 8%
Dari hasil studi literatur didapatkan bahwa Timer Tick pada library FreeRTOS di Arduino Nano yang dipakai menggunakan osilator pada WDT (Watch Dog Timer). Osilator WDT ini menurut literatur datasheet tidak menggunakan kristal, dan periodanya tergantung dengan temperatur ruangan. Jadi perbedaan periode dari seharusnya 10 detik menjadi 10.8 detik dapat dijelaskan.
Pada percobaan FreeRTOS dengan penjadwal periodik, diperlukan suatu task (pekerjaan) dengan waktu eksekusi yang diketahui.
Berikut ini sifat-sifat yang diperlukan dari task tersebut:
waktu eksekusi diketahui
waktu eksekusi dapat diubah-ubah dengan mengubah parameternya
status task dapat dimonitor dari luar mikroprosesor
status yang perlu diketahui: RUNNING, READY, BLOCKING, STOP.
Solusi
Task berupa iterasi yang jumlah iterasi dapat diubah-ubah dengan parameter.
Pengaruh parameter terhadap waktu eksekusi diukur. Pengukuran terbaik dengan menggunakan alat ukur eksternal seperti osiloskop. Jika tidak ada osiloskop, alternatifnya menggunakan fungsi millis() pada Arduino.
Task Dummy melakukan aktivitas membuat 2 buah LED berkedip secara komplementer. Jika kedua lampu nampak menyala, artinya task dalam keadaan RUNNING. Jika salah satu saja yang menyala, artinya task sedang berhenti, artinya dalam keadaan READY atau BLOCKING. Jika kedua lampu mati, artinya task sedang tidak aktif.
Berikut ini kode fungsi Task Dummy pada Arduino.
void TaskDummy(int LED_A, int LED_B, long int counter) {
long int i;
for (i = 0; i < counter; i++) {
cli();
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
sei();
asm("nop");
cli();
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
sei();
asm("nop");
}
digitalWrite(LED_A, LOW); // matikan semua LED
digitalWrite(LED_B, LOW);
}
DigitalWrite menyalakan dan mematikan LED A dan LED B. LED yang dipakai sebagai output dapat diatur melalui parameter fungsi. cli() fungsinya untuk disable interrupt, agar perubahan LED_A dan LED_B terjadi secara serentak. sei() fungsinya untuk mengaktifkan kembali interupsi. Instruksi assembly “nop” dipakai untuk menambah waktu iterasi.
Berikut ini program lengkapnya
// Contoh TaskDummy
// dengan output ke osiloskop juga
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
}
void TaskDummy(int LED_A, int LED_B, long int counter) {
long int i;
for (i = 0; i < counter; i++) {
cli();
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
sei();
asm("nop");
cli();
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
sei();
asm("nop");
}
digitalWrite(LED_A, LOW); // matikan semua LED
digitalWrite(LED_B, LOW);
}
// the loop function runs over and over again forever
void loop() {
unsigned long waktu_awal;
unsigned long waktu_akhir;
waktu_awal = millis();
TaskDummy(LED1, LED2, 10000L);
waktu_akhir = millis();
Serial.print("waktu: ");
Serial.println(waktu_akhir - waktu_awal);
digitalWrite(LED_BUILTIN, HIGH);
TaskDummy(LED1, LED2, 10000L);
digitalWrite(LED_BUILTIN, LOW);
}
Durasi TaskDummy dalam milisekon dapat diamati di port serial. Berikut ini tampilan port serial.
Dari tampilan tersebut dapat diketahui bahwa waktu eksekusi task dummy adalah 173 ms.
Berikut ini foto pengukuran dengan osiloskop. Dari gambar nampak waktu yang diperlukan untuk task dummy adalah 172 ms
Pada artikel ini dibahas cara menghubungkan Raspberry Pi dengan display LCD 20×4 yang menggunakan antar muka I2C
Raspberry Pi 2 dengan LCD 20×4
Berikut ini penampakan display LCD 20×4 dan antar muka I2C berbasis IC PCF8574 yang dipasang di belakang LCD 20×4 tersebut. Antar muka I2C ini memudahkan karena mengurangi jumlah kabel yang diperlukan serta mengurangi jumlah pin yang diperlukan di mikroprosesor Raspberry PI.
Connecting an LCD Screen to Raspberry Pi With a Logic Converter https://maker.pro/raspberry-pi/tutorial/connecting-an-lcd-screen-to-raspberry-pi-with-a-logic-converter
Control a HD44780 LCD display via I2C with the Raspberry Pi https://tutorials-raspberrypi.com/control-a-raspberry-pi-hd44780-lcd-display-via-i2c/
How to Setup an I2C LCD on the Raspberry Pi https://www.circuitbasics.com/raspberry-pi-i2c-lcd-set-up-and-programming/
How to Setup an LCD on the Raspberry Pi and Program It With Python https://www.circuitbasics.com/raspberry-pi-lcd-set-up-and-programming-in-python
Berikut ini foto-foto dan manual pompa air Wasser tipe PB-60EA (Booster Pump).
Foto Pompa
Berikut ini foto-foto pompa dari berbagai sudut.
Tampak sampingTampak sampingPenampakan pompaTampak samping dengan konverter 3/4 inch ke 1/2 inch dari bahan kuningan.Tampak samping, ada peringatan dan petunjuk pemasangan.
Foto Bagian Dalam
Berikut ini foto-foto bagian dalam pompa.
Motor pompa bagian statorMotor bagian dudukan rotorBagian elektronik. Paling besar adalah kapasitor 4 uF.Bagian elektronik dengan TRIAC BT134
Papan rangkaian berisi rangkaian TRIAC dan resistorPapan rangkaian bagian bawahsketsa skema rangkaian
Manual
Manual pompa Wasser PB-60EA (cover)Manual pompa Wasser PB-60EA (halaman 1)
Manual pompa Wasser PB-60EA (halaman 2)Manual pompa Wasser PB-60EA (halaman 3)
Arduino Nano & UNO hanya menggunakan prosesor ATmega328 yang hanya memiliki 1 port serial asinkron. Jika perlu lebih dari 1 port serial, maka kita perlu menggunakan software yang berfungsi sebagai port serial. Library yang diperlukan adalah SoftwareSerial (https://www.arduino.cc/en/Reference/softwareSerial)
Berikut ini diuraikan percobaan menggunakan library SoftwareSerial pada Arduino Nano
Komponen yang diperlukan:
Arduino Nano / Arrduino UNO
Modul USB Serial, bisa yang FTDI ataupun yang CH340
Komputer desktop/laptop dengan 2 port USB yang bebas
2 kabel USB mini
breadboard
kabel-kabel breadboard
Perangkat lunak yang diperlukan
Arduino compiler
Driver CH340 jika menggunakan USB serial dengan chip CH340
void setup() { // put your setup code here, to run once: // Open serial communications and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for Native USB only } Serial.println(“percobaan software serial”); // set the data rate for the SoftwareSerial port mySerial.begin(9600); mySerial.println(“Hello, world from software serial”);
}
void loop() { // baca karakter, dan kirim kembali
if (mySerial.available()) Serial.write(mySerial.read()); // karakter yang diterima di mySerial ditampilkan di Serial if (Serial.available()) mySerial.write(Serial.read());
}
Compile program, kemudian upload.
Jalankan Serial Monitor di Arduino untuk memonitor data yang dikirim dari port serial hardware di Arduino. Pastikan baud rate cocok dengan yang disetting di program (115200bps)
Jalankan software terminal (RealTerm) di Windows, atur port ke port USB Serial. Hati-hati tertukar dengan port Arduino. Pastikan baud rate cocok dengan yang disetting di program (9600 bps)
Kirimkan karakter dari Serial Monitor Arduino. Karakter tersebut akan muncul di RealTerm
Kirimkan karakter dari RealTerm. Karakter tersebut akan muncul di Serial Monitor Arduino
Apa yang terjadi jika op-amp LM358 diberi input negatif?
Sebuah integrator dapat memberikan output tegangan negatif. Untuk itu perlu dikaji, apa yang terjadi jika sinyal tegangan negatif ini masuk ke op-amp di tahap selanjutnya.
Batas Maksimum LM358
Pada datasheet LM358, disebutkan bahwa input voltage Vi mempunyai nilai minimal -0,3 volt. Jika nilai input lebih kecil dari angka ini, perilaku sistem dapat tidak normal, bahkan bisa rusak dengan cepat maupun lambat.
LM358 Absolute Maximum Ratings
Percobaan
Pada percobaan dibuat rangkaian buffer op-amp LM358, dengan input dari integrator dari tahap selanjutnya. Sinyal dari buffer ini mengandung tegangan negatif dan tegangan biasa.
Buffer op-amp unity gain
Input dan Ouput Buffer LM358
Input adalah sinyal warna biru muda. Output adalah sinyal warna kuning.
Sinyal input berasal dari output sebuah integrator dari tahap sebelumnya. Sinyal ini awalnya bernilai 0 volt, kemudian menuju negativ (- 0,56 volt), kemudian naik menuju saturasi maksimum.
Output buffer adalah sinyal warna kuning. Ketika input negatif cukup besar, output menuju saturasi maksimum. Ketika tegangan input sudah lebih dari 0,3 volt ( di gambar cursor X2 menunjukkan tegangan -280 mV), output sudah mulai ‘normal’, yaitu menunjukkan 0 volt. Output LM358 tidak dapat negatif walaupun inputnya negatif. Setelah input lebih besar dari 0 volt, barulah buffer berfungsi sebagamana mestinya.
Pada sebuah buffer op-amp, seharusnya tegangan output sama dengan tegangan input. Namun hal ini tidak berlaku jika inputnya negatif. Ternyata perilaku buffer ini ada 2 macam: ketika input negatif besar (lebih kecil dari – 0,3 volt), dan negatif kecil (antara – 0,3 volt dan 0 volt)
Kesimpulan
Jika tegangan input buffer kurang dari 0,3 volt, maka output akan menuju saturasi maksimum.
Pada tulisan ini disampaikan percobaan pembuatan integrator berbasis operational amplifier.
Parameter Sistem
tipe op amp: LM358
Tegangan power supply: tunggal, 3,2 volt dari sebuah modul ESP32 Lolin32 Lite
Pengukuran dengan osiloskop GW Instek 1152A-U
Sinyal dari pembangkit sinyal GW Instek AFG-2012
Berikut ini adalah rangkaian yang digunakan:
Rangkaian buffer dan integrator berbasis LM358
Power supply tunggal dengan tegangan adalah 3,2 volt, berasal dari sebuah modul ESP32 Lolin32 Lite. Sebagai referensi ground, digunakan pembagi tegangan resistor 2k2 dan 1k, menghasilkan tegangan 1,02 volt.
Operational amplifier menggunakan LM358. Pertimbangannya adalah op amp ini dapat bekerja dengan single supply, dengan tegangan supply dapat mencapai 3 volt. op-amp juga dapat menerima tegangan input yang sudah mendekati 0 volt. op-amp ini bukan jenis rail-to-rail, sehingga tetap akan terjadi clipping di output jika output mendekati tegangan supply.
Op-amp lain yang sering dipakai untuk aplikasi single supply tegangan rendah adalah LM324. LM324 memiliki kemampuan output sampai VCC – 1,5 volt. Jadi kalau diberi VCC 5 volt, output op-amp dapat mulai dari 0 volt sampai 3,5 volt.
Nilai resistor 100k dan kapasitor 10uF. Dari hasil pengukuran, nilai tepat dari resistor adalah 101,5 k dan kapasitor 9,1 uF. Tujuan pemilihan nilai ini adalah untuk mendapatkan parameter time-constant sekitar 1 detik.
Percobaan
Rangkaian dibuat dengan breadboard. Input dengan sinyal persegi dari generator sinyal GW Instek AFG-2012. Output diukur dengan osiloskop GW Instek GDS-1152A-U. Tegangan , nilai resistor dan nilai kapasitor diukur dengan osiloskop dan juga multimeter Kyoritsu KEW 1021R.
Kapasitor pada integrator menggunakan kapasitor non-polar, supaya tegangan pada kapasitor tersebut dapat bernilai positif dan negatif. Jika dipakai kapasitor polar seperti elektrolit, maka kapasitor hanya berfungsi pada 1 polaritas saja.
Set up rangkaian dengan breadboard, osiloskop dan generator sinyal
Berikut ini pengukuran sinyal input yang berasal dari sinyal generator.
Sinyal input dari generator sinyal
Sinyal diukur di channel 1 (sinyal kotak di bawah warna kuning). Frekuensi 0,1 Hz. Amplitudo 2 Vpp. Tegangan terukur adalah 40 mV di bagian low, dan 2,160 di bagian HIGH.
Berikut ini sinyal output dari output integrator.
Sinyal output integrator
Sinyal diukur di channel 2 (sinyal atas warna biru).
Tegangan output integrator naik jika input LOW. Tegangan akan naik dengan kemiringan sesuai time constant, sampai mencapai saturasi. Tegangan maksimum output op amp adalah 1,84 volt, jadi ini adalah tegangan saturasi output op amp.
Jika input HIGH, output integrator akan turun dengan kemiringan sesuai time constant. Tegangan terendah pada output integrator adalah 40 mV.
Ketika input berubah dari HIGH ke LOW, output sejenak berubah menjadi negatif (diukur mencapai -0.6 volt). Tegangan negatif ini berasal dari tegangan yang tersimpan di kapasitor.
Rangkaian Clamp Dioda
Output integrator dapat negatif. Jika terlalu negatif dapat mengganggu/merusak komponen selanjutnya. Berikut ini hasil percobaan menambah diode clamp pada output integrator. Clamp pertama adalah rangkaian diode clamp konvensional.
Perbandingan tanpa clamp dan dengan clamp dioda 1N4148
Tanpa clamp, tegangan minimum adalah -680 mV
Dengan rangkaian clamp dioda 1N4148, tegangan minimum adalah 400 mV
Berikut ini rangkaian clamp dengan perubahan sedikit. Pada rangkaian clamp biasa, anoda disambungkan ke 0 volt. Pada rangkaian ini, anoda disambungkan ke tegangan 0,7 volt supaya tegangan output tidak dapat negatif.
Berikut ini hasil percobaan output integrator dengan diode clamp hasil modifikasi.
Dioda clamp dan resistor 1k
Dengan dioda clamp 1N4148 dan resistor 1k, maka tegangan minimum integrator adalah 120 mV
Dioda clamp dan resistor 10k
Dengan dioda clamp 1N4148 dan resistor 10k, maka tegangan minimum integrator adalah 0 mV
Dari percobaan didapat rangkaian clamp terbaik adalah dengan dioda 1N4148 dan resistor 10k.
Analisis
Tegangan supply 3,2 volt dari ESP32 dapat menjadi power supply untuk LM358.
Berikut ini penjelasan konfigurasi dan fungsi masing-masing pin dari Arduino Uno dengan prosesor ATmega328P.
Pinout Arduino UNO
Daftar Pin Arduino
IOREF
Referensi 5 volt untuk shield yang memerlukannya
RESET
Reset pada ATmega328. Perlu sinyal LOW untuk mereset Arduino. Terhubung ke PC6 dan PCINT pada ATmega328.
3.3V
Catu daya 3,3 volt untuk shield yang memerlukannya. Tegangan 3,3 volt ini berasal dari regulator LP2985-33DBVR.
GND
Ground, 0 volt.
VIN
Tegangan input DC 7~12 volt. Masuk ke regulator internal 5 volt (NCP1117ST50T3G). Tidak melalui dioda pengaman, sehingga tidak ada pengecekan polaritas.
Menyalakan Lampu Dengan Arduino Uno dapat dilakukan dengan berbagai cara, tergantung jenis lampu yang ingin dinyalakan.
Berikut ini adalah beberapa variasi lampu yang dapat dinyalakan dengan Arduino UNO:
LED tegangan kecil & arus kecil
LED tegangan besar / arus besar
Lampu bohlam
Lampu 220 volt
LED tegangan kecil & arus kecil
Untuk LED tegangan kecil dan arus kecil dapat dinyalakan langsung dari port Arduino. Harap diperhatikan bahwa tegangan pin pada Arduino UNO hanya maksimum 5 volt, sehingga hanya dapat menyalakan 2 LED seri. Arus yang dapat diambil dari port Arduino juga terbatas, sehingga arus pada LED juga terbatas. Menurut spesifikasi teknis Arduino UNO, arus maksimum di setiap port adalah 20 mA. Arus maksimum pada VCC ATmega328 adalah 200 mA, sehingga hal ini juga harus diperhatikan.
LED output
LED Tegangan Besar / Arus Besar
Untuk tegangan lebih dari 5 volt ataupun arus lebih dari 20 mA, maka perlu komponen tambahan berupa transistor untuk memperkuat arus & tegangan.
Berikut ini cara memperkuat tegangan pada output Arduino, supaya dapat menggunakan catu daya 12 volt untuk menyalakan LED.
Penguat arus digital dengan transistor NPN
Lampu bohlam kecil
Lampu bohlam kecil memerlukan arus agak besar. Untuk memperkuat arus, dapat digunakan transistor NPN , seperti pada gambar berikut ini.
Lampu 220 volt
Untuk menghubungkan Arduino ke tegangan 220 volt, umumnya dapat menggunakan relay elektromekanik ataupun relay solid state (SSR). Berikut ini contoh cara menghubungkan Arduino ke lampu 220 volt dengan relay elektromekanik.