Pengaturan frekuensi PWM pada arduino (fungsi analogWrite(pin, value) tetap seperti biasa)

Perintah analogWrite(pin, onTime) pada arduino berfungsi membangkitkan sinyal PWM pada pin dimaksud. biasanya frekuensi yang dibangkitkan adalah :

  1. 976.5625Hz untuk arduino Uno pin 5 dan 6 (clock 16MHz)
  2. 488.28125Hz untuk arduino Uno pin 3, 9,10 dan 11 (clock 16MHz)

adakalanya kita membutuhkan frekuensi berbeda dari standar ini. Dengan mengatur register TCCRnB kita bisa mengatur frekuensi PWM arduino sehingga diperoleh frekuensi maksimum 62500Hz pada pin 5 dan 6 Arduino Uno, dan minimum 30.517578125Hz pada pin 3,9,10 dan 11 Arduino Uno. Formula/rumus yang dapat dipergunakan adalah :

A. Timer 0 Arduino Uno

frekuensi = io_clock/(N * TOP)

B. Timer 1 dan 2 Arduino Uno

frekuensi = io_clock/(2 * N * TOP)

dengan io_clock = 16Mhz dan TOP = 256

dengan merubah nilai N kita bisa mendapatkan harga frekuensi yang berbeda:

Penggunaan perintah analogWrite(pin, value) tetap seperi biasa (nilai value berkisar antara 0 ~ 255).

catatan : merubah register Timer 0 akan berdampak langsung terhadap fungsi delay(), millis() dan micros()

A.  Arduino UNO

Nomor urut pembagi Pembagi frekuensi (Hz)
Timer 0, pin 5 dan 6
1 1 62500
2 8 7812.5
3* 64 976.5625
4 256 244.140625
5 1024 61.03515625
Timer 1, pin 9 dan 10
1 1 31250
2 8 3906.25
3* 64 488.28125
4 256 122.0703125
5 1024 30.517578125
Timer 2, pin 3 dan 11
1 1 31250
2 8 3906.25
3 32 976.5625
4* 64 488.28124
5 128 244.140625
6 256 122.0703125
7 1024 30.517578125

tanda * adalah nilai default

B. Arduino Mega

—Menyusul

cara penggunaannya:

  1. Ketahui Timer yang digunakan (contoh pin 5 terintegrasi pada Timer 0).
  2. Catat nilai nomor urut pembagi sesuai dengan frekuensi yang diinginkan
  3. masukkan kedalam baris sketch

TCCR0B = TCCR0B & B11111000 | Nomor-urut-pembagi; (TCCR0B = Timer 0, TCCR1B = Timer 1, TCCR2B = Timer 2)

contoh: TCCR0B = TCCR0B  & B11111000 | 1;

contoh dalam sketch/program:

int pinPWM = 5;

void setup() {
  pinMode(pinPWM,OUTPUT);
}

void loop() {
  analogWrite(pinPWM,128);
  TCCR0B = (TCCR0B & 0b11111000) | 1;

  while(1);
}

atau menggunakan fungsi yang fleksibel berikut:

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x07; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

Mendeteksi koneksi serial yang terputus pada Arduino

Koneksi serial pada berfungsi sebagai sarana komunikasi (–utama) pada arduino. Untuk mengetahui apakah port serial tersebut terhubung atau tidak dapat dideteksi dengan membaca register ‘frame error’, yaitu register yang bernilai 1 apabila frame serial yang diterima tidak sesuai dengan format yang ditentukan.

Ketika koneksi serial diputus, maka kondisi pin RX akan bernilai 0. Kondisi pin RX 0 juga berarti dimulainya pengiriman sebuah frame (start bit), namun dikarenakan koneksi terputus maka bit yang diterima berikutnya akan bernilai 0 juga. seperti kita ketahui sebuah frame komunikasi serial terdiri dari start bit, data, parity dan stop bit. dan tentu saja block serial akan melaporkan kesalahan ini sebagai ‘frame error’ yang bisa dimanfaatkan untuk mendeteksi menyambung atau terputusnya koneksi komunikasi serial.

Tester : Arduino mega 2560 (memanfaatkan Serial1)

Skema detektor serial:

catatan: metode register  ‘frame error’ ini tidak berfungsi pada Serial biasa (Serial0) karena Serial0 terhubung ke downloader (USB to Serial)

Program/sketch:

bool serial1TidakTersambung = false;

void setup() {
	Serial.begin(9600);
	Serial1.begin(9600);
	Serial.println("Mendeteksi koneksi serial");
	Serial.println("Jika Koneksi serial dilepas, maka arduino akan mengirimkan pesan");
	Serial.println("'Serial1 tidak terhubung' hingga Serial port menerima data valid");
  Serial.println("https://www.project.semesin.com");
}
	
void loop() {
	char c;
	if(Serial1.available())
	{
		if(UCSR1A & (1<<FE1))
		{
			serial1TidakTersambung = true;
		}
		else
		{
			serial1TidakTersambung = false;
			c = Serial1.read();
			Serial.print(c);
		}
	}
	
	if(serial1TidakTersambung)
	{
		Serial.println("Serial1 tidak terhubung");
		delay(1000);
	}
}

Sistem blink alarm dengan arduino

Dalam proses perulangan dengan delay, seringkali kita harus menunggu proses tersebut hingga selesai. terdapat beberapa metode untuk menghentikan/memotong perulangan tersebut diantaranya:

  1. Metode interrupt
  2. Metode millis (tanpa for-loop secara langsung).

Berukut ini saya sertakan sketch dengan metode millis, cara kerjanya sbb:

  1. tekan ‘m’ untuk mulai LED blinking (100 kali)
  2. tekan ‘b’ untuk menghentikan proses perulangan LED blinking

nb: melalui serial monitor (setting baudrate 9600, no ending line)

Komponen pengujian yang digunakan:

  1. Arduino UNO (internal LED)

sketch dengan millis():

Metode serial available:

char input = 0;
int counter = 0;
long MillisValue = 0;
int timeDelay = 500;//dalam milisecond
bool pinState = false;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN,OUTPUT);
  Serial.println("Tekan 'm' untuk mulai, dan 'b' untuk berhenti");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  if(Serial.available())
  {
    input = Serial.read();
    Serial.println(input);
  }
  if(input=='m')//mulai
  {
    counter = 200; // dikali 2 (on-off-on = 3)
    MillisValue = millis();
    input = 0;
    Serial.println("Mulai");
  }
  else if(input=='b')//berhenti
  {
    counter = 0;
    input = 0;
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("Berhenti");
  }
  if(counter && ((MillisValue + timeDelay) < millis()))
  {
    counter--;
    pinState = !pinState;
    digitalWrite(LED_BUILTIN, pinState);
    MillisValue = millis();
  }
}

 

metode serialEvent:

char input = 0;
int counter = 0;
long MillisValue = 0;
int timeDelay = 500;//dalam milisecond
bool pinState = false;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN,OUTPUT);
  Serial.println("Tekan 'm' untuk mulai, dan 'b' untuk berhenti");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  if(input=='m')//mulai
  {
    counter = 200; // dikali 2 (on-off-on = 3)
    MillisValue = millis();
    input = 0;
    Serial.println("Mulai");
  }
  else if(input=='b')//berhenti
  {
    counter = 0;
    input = 0;
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("Berhenti");
  }
  if(counter && ((MillisValue + timeDelay) < millis()))
  {
    counter--;
    pinState = !pinState;
    digitalWrite(LED_BUILTIN, pinState);
    MillisValue = millis();
  }
}
void serialEvent() {
  input = Serial.read();
}

Mesin cutting sticker berbasis arduino-HPGL

perancangan Mesin CNC sudah bisa dilakukan sendiri, baik dengan mencontoh beberapa tutorial maupun dengan merancang perangkat dan firmwarenya sendiri.

Seperti proyek “Arduino Mini CNC Plotter Machine From Dvd Drives” memanfatkan CDROM bekas sebagai perangkat kerasnya dan GRBL yang tersedia secara bebas sebagai perangkat lunaknya. Namun bagi pemula cukup menyulitkan pada tahap design dan pengaplikasian perangkat tersebut ketika berurusan dengan Gcode.

Gcode merupakan protokol yang canggih dan juga komplek.Untuk mesin-mesin plotter (2.5D) penggunaan gcode tidaklah efisien dikarenakan harus menggunakan aplikasi-aplikasi 3D hanya untuk pekerjaan 2D. Sedangkan protokol HPGL lebih familiar sebagai protokol 2D/ 2.5D yang digunakan pada mesin-mesin plotter/cutting.

Kali ini saya merancang mesin cutting sticker berbasis arduino yang menggunakan perangkat mesin merk Jinka yang sudah tidak berfungsi.

Skema mesin cutting sticker HPGL – arduino

Skema tombol mesin cutting sticker merk jinka tahun tidak diketahui

Daftar komponen

  1. Arduino mega 2560
  2. CNC shield v3
  3. DRV8825 2x
  4. AT45DB161
  5. Motor driver DRV8825
  6. Mesin cutting sticker

Firmware

Untuk firmware berbasis protocol HPGL yang saya kembangkan sendiri (open source). Keunggulan proyek ini terletak pada firmware yang mampu mengontrol perangkat lebih baik dan dapat disesuaikan sesuai kebutuhan. beberapa fitur yang dikembangkan adalah :

  1. Perintah HPGL disimpan dalam dataflash sehingga memungkinkan adanya fitur duplikat (dengan menekan tombol “Duplikat” perangkat akan bekerja menjalankan perintah yang tersimpan dalam dataflash tanpa terkoneksi dengan PC/Laptop)
  2. Dengan menggunakan protokol HPGL, HPGL/2 perangkat ini bisa melaksanakan perintah langsung dari software vektor seperti Coreldraw, AutoCAD, Artcut.
  3. Waktu pengerjaan lebih cepat dengan fitur “precision on demand” (Kecepatan penuh saat pergerakan pen up, dan kecepatan setting saat pen down –proses cutting).

HPGL (Hewlett Packard Graphics Language) adalah sebuah protocol antara PC dan plotter (mesin cetak). Protokol cocok digunakan pada plotter/cutting machine dan mudah dimengerti oleh berbagai mesin bahkan bisa diartikan melalui pembacaan manusia kecuali perintah polygon encode.

Dokumen HPGL : HPGL2-RTL_ReferenceGuide_5961-3526_540pages_Sep96

contoh keluaran dari coreldraw + goldcut driver:
HPGL
IN;IP0,0,1016,1016;SC0,1000,0,1000;SP1;PU0,0;
PD15039,0,15039,25000,0,25000,0,0;PU; …

HPGL/2
BP;IN;SP0;QL100ROPS22205,15354RO90
IP0,0,15353,22204SC0,7799,11279,0ACPA0,0
WU0PW0PP1PP0PE<=UYÀwiÀ;
PM0PE_ý¿¿eqÀ`ý¿¿fqÀ;PE<=UYÀwiÀ;
PM1PM2LTSP1EP…

BP – begin plot
IN – inisialisasi
PU – pen up
PD – pen down
PE – polygon encode
banyak lagi koleksi perintahnya.

Files :

  1. Arduino-hpgl-plotter.ino
  2. HPGL.h
  3. HPGL.cpp
  4. DataFlash.h
  5. DataFlash.cpp
  6. dalam zip Arduino_hpgl_plotter.zip

Driver goldcut_driver

Foto dokumentasi :

Galeri Mesin cutting sticker dengan arduino