loadcell / sensor berat

loadcell adalah sensor yang menghasilkan sinyal listrik dimana besarnya sinyal sebanding dengan berat yang diukur.

beberapa jenis loadcell :

  1. resistansi ketegangan bahan (strain gauge)
  2. piezzoelectric
  3. hidrolik
  4. pneumatik

Dalam artikel ini hanya membahas loadcell jenis resistansi ketegangan bahan

Merupakan jenis loadcell yang sering digunakan, loadcell ini memanfaatkan perubahan resistansi yang sebanding dengan perubahan ketegangan bahan akibat tekanan berat yang diukur. bahan yang digunakan bersifat :

  1. kaku
  2. bisa digunakan dalam jangka yang panjang
  3. memiliki elastisitas yang bagus

pengukuran resistansi ketegangan bahan menggunakan konfigurasi jembatan wheatstone.

Dengan menerapkan tegangan referensi pada dua titik berlawanan maka akan menghasilkan perbedaan tegangan pengukuran pada dua titik lainnya biasanya hanya beberapa miliVolt. Untuk mengetahui besaran ini bisa menggunakan penguat tegangan atau komponen differential analog to digital.

loadcell resistansi ketegangan bahan (strain gauge) tersedia dalam berbagai ukuran, formasi dan karakteristik. Contoh ukuran yang sering digunakan seperti 1, 2, 5,  … 200Kg, sedangkan formasinya bermacam-macam seperti :

  1. Balok dengan tekanan di ujungnya
  2. Balok ganda dengan tekanan berat di tengah.
  3. tipe-S untuk mengukur berat menggantung
  4.  kompresi
  5. tali digunakan pada crane

untuk rangkaiannya tersedia pula dalam bentuk 4 jembatan (full bridge) dan 2 jembatan (half bridge)

Karakteristik yang menentukan kualitas loadcell adalah sensitifitas dalam satuan mV/V, yaitu perbandingan output tegangan di titik pengukuran (A+ dan A-) dengan tegangan dititik sumber (E+ dan E-). Semakin besar nilainya maka pengukuran akan semakin bagus karena mampu mendeteksi perubahan resistansi ketegangan bahan lebih kecil.

catatan dalam penggunaan loadcell jenis resistansi ketegangan bahan :

  1. Bantalan (mounting) harus terukur atau dibuat nol dengan menempatkannya pada tempat yang benar-benar tidak bergerak. Bantalan yang buruk akan menghasilkan histeresis yang mengurangi tingkat presisi pengukuran.
  2. Memberi batas mekanik untuk menghindari kelebihan beban yang dapat mengakibatkan elastisitas sensor berkurang atau hilang.
  3. Menghindari gesekan dengan benda lain. Gesekan akan menghasilkan gaya redam tekanan.
  4. Tegangan referensi yang stabil dan terhindar dari gangguan riak dari rangkaian diluarnya.
  5. adakalanya loadcell perlu dikalibrasi ulang akibat adanya pengaruh suhu, elastisitas bahan dan variasi tegangan.
  6. Ukuran loadcell perlu disesuaikan dengan kapasitas berat yang akan diukur.

contoh rangkaian loadcell:

warna kabel :

  1. merah, E+
  2. hitam, E-
  3. hijau, A+
  4. putih, A-

Pemasangan loadcell 4 kabel

Pemasangan loadcell 4 x 3 kabel

Pemasangan loadcell 2 x 3 kabel

suara bilangan hingga 999.999 dengan arduino

Modul suara arduino yang ada sudah memenuhi kebutuhan perancangan multimedia saat ini, seperti modul suara WTV020SD, mini TF MP3 player, MP3 shield dan lain-lain. Suara arduino bisa digunakan sebagai alarm peringatan, pengisi suara, suara latar, pemberitahuan dan keperluan lainnya.

Dalam perancangam suara dengan arduino kali ini diperuntukkan sebagai pembilang angka dan bisa diterapkan dalam berbagai proyek arduino. Angka/bilangan berasal dari pembacaan sensor dan dikirim ke modul suara.

Pada modul suara sudah disimpan dalam memorinya (microSD) berbagai macam kemungkinan suara angka dengan urutan tertentu. Arduino berfungsi sebagai pengatur suara angka yang akan diputar.

Suara pembilang arduino dimulai dengan kata pembuka contohnya “nomor antrian”, kemudian diikuti suara deret angka dan terakhir satuannya misalnya “di loket 1”.

Suara bilangan sampai 999.999 dengan komponen :

  1. arduino mega 2560
  2. MP3 DFPlayer
  3. Ampli modul LM386 (bila ada)

Bisa dikombinasikan sebagai pemberi suara :

  1. Mesin timbangan yang menginformasikan berat terukur
  2. Pemberi tahu bila jarak terlalu dekat pada sistem keamanan parkir
  3. Pengingat suhu dan kelembaban dengan sensor humidity
  4. Informasi kecepatan kendaraan kecepatan
  5. Suara antrian pada mesin antrian di perkantoran
  6. Pembilang total belanja
  7. dll

Video:

skema suara informasi arduino:

sketch/program:


#include <miniMP3.h>

#define belas 12 //belas.mp3
#define puluh 13 //puluh.mp3
#define seratus 14 //seratus.mp3
#define ratus 15 //ratus.mp3
#define seribu 16 //seribu.mp3
#define ribu 17 //ribu.mp3
#define koma 18 //Koma.mp3

#define berat 110 //berat.mp3
#define gram 111 //gram.mp3
#define kiloGram 112 //kilogram.mp3
#define jarak 120 //jarak.mp3
#define sentiMeter 121 //sentimeter.mp3
#define meter 122 //meter.mp3
#define suhu 130 //suhu.mp3
#define derajat 131 //derajat_celsius.mp3
#define ph 140 //P_H.mp3
#define kelembaban 150 //Kelembaban.mp3
#define persen 151 //Persen.mp3
#define kecepatan 160 //kecepatan.mp3
#define meterPerDetik 161 //meter_per_detik.mp3
#define kilometerPerJam 162 //kilometer_per_jam.mp3
#define nomorantrian 170 //nomor antrian.mp3
#define totalBelanja 180 //total belanja.mp3
#define rupiah 181 //rupiah.mp3

void setup() {
  mp3_set_serial (Serial1, 17);
  mp3_set_volume(30);

  uint32_t beratTimbangan = 0;
  
  mp3_play(berat);
  suaraBilangan(beratTimbangan);
  mp3_play(gram);
}

void loop() {

}

void suaraBilangan(uint32_t Bilangan)
{
  if (Bilangan < 12)
  {
    mp3_play(Bilangan);
  }
  else if (Bilangan < 20)
  {
    suaraBelasan(Bilangan);
  }
  else if (Bilangan < 100)
  {
    suaraPuluhan(Bilangan);
  }
  else if (Bilangan < 1000)
  {
    suaraRatusan(Bilangan);
  }
  else
  {
    suaraRibuan(Bilangan);
  }
}
void suaraBelasan(uint8_t Bilangan)
{
  mp3_play(Bilangan - 10);
  mp3_play(belas);
}
void suaraPuluhan(uint8_t Bilangan)
{
  uint8_t puluhan = Bilangan / 10;
  mp3_play(puluhan);
  mp3_play(puluh);

  uint8_t satuan = Bilangan % 10;
  if (satuan)
  {
    suaraBilangan(satuan);
  }
}
void suaraRatusan(uint16_t Bilangan)
{
  uint8_t ratusan = (uint8_t)(Bilangan / 100);
  if (ratusan == 1)
  {
    mp3_play(seratus);
  }
  else
  {
    mp3_play(ratusan);
    mp3_play(ratus);
  }
  byte puluhan = Bilangan % 100;
  if(puluhan)
  {
    suaraBilangan(puluhan);
  }
}
void suaraRibuan(uint32_t Bilangan)
{
  uint16_t ribuan = Bilangan / 1000;
  if (ribuan == 1)
  {
    mp3_play(seribu);
  }
  else
  {
    suaraBilangan(ribuan);
    mp3_play(ribu);
  }
  uint16_t ratusan = Bilangan % 1000;
  if (ratusan)
  {
    suaraBilangan(ratusan);
  }
}

file pendukung:
Suara : Suara bilangan mp3
Library : miniMP3

running text anti flicker (improved DMD) dengan arduino

DMD (dot matrix display) yang dikontrol dengan arduino dengan segala keterbatasannya memiliki permasalahan saat panel DMD disusun dalam lebih dari 4 panel. Flicker terjadi karena proses pengiriman data serial dari arduino harus mengantri sekian lama sehingga pergantian aktifasi baris per baris tertangkap oleh mata seperti berayun (berkedip) dan tentu membuat mata tidak nyaman.

Untuk itu saya melakukan improvisasi terhadap library arduino –DMD2– dengan prinsip kerja satu clock untuk lebih dari satu baris. contohnya untuk ukuran panel 4 kolom 2 baris kelompok DMD dibagi menjadi 2 bagian (baris 1 dan baris 2) dengan entri data yang sama setiap clock-nya.

Kelebihan alat DMD2 arduino:

  1. Sensor DHT11 untuk memantau keadaan suhu dan kelembaban sekitar
  2. Database waktu sholat 5 waktu (statis) dan dilengkapi buzzer yang menandakan waktu sholat telah masuk.

 

Komponen yang dibutuhkan :

  1. 8 Panel P10
  2. Arduino Mega 2560
  3. RTC DS1307
  4. DHT11
  5. Buzzer

DS1307 dapat diganti dengan DS3231 untuk keperluan presisi RTC.

berikut skema-nya :

berserta sketch atau program nya:

 

#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
#include <fonts/Arial14.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include "DHT.h"

byte DataPins[2] = {33, 35}; //pin jalur out
SoftDMD dmd(4, 2, 23, 25, 27, 31, 29, 2, DataPins); //kolom, baris, OE, A, B, SCK, CLK, jumlah jalur out, pin jalur out
//SoftDMD dmd(4,2,23,25,27,31,29,33); //standard

DMD_TextBox box(dmd, 0, 0, 78, 32);

DHT dht(A0, DHT11);
String namaSholat[] = {"  Subuh", "  Zuhur", "   Asar", " Maghrib", "   Isya"};
byte waktuSholat[][2] = {{5, 12},
                        {12, 32},
                        {15, 45},
                        {18, 35},
                        {19, 44}
};

#define waktunyaSholat 1
#define pesanSMS 2

int n = 123;
byte lastSecond = 60;
byte lastDay = 32;
byte lastH = 60;
byte lastT = 32;
String Sholat;
String pesanDisplay;
byte pesan;
int buzzer = 8;
bool buzz;
byte buzzCounter;

void setup() {
  Serial.begin(9600);
  Serial.println("Running text dengan Arduino bebas kedip");
  Serial.println("https://www.project.semesin.com");
  dht.begin();
  dmd.setBrightness(255);
  dmd.begin();

  pesan = pesanSMS;
  pesanDisplay = "  Selamat\n  datang";
  dmd.selectFont(Arial14);
  box.print(pesanDisplay);
}

void loop()
{
  tmElements_t tm;
  byte h = (byte)dht.readHumidity();
  byte t = (byte)dht.readTemperature();
  RTC.read(tm);

  if (pesan == waktunyaSholat)
  {
    buzzCounter++;
    if (!(buzzCounter % 32))
    {
      buzz = !buzz;
      digitalWrite(buzzer, buzz);
      pinMode(buzzer, OUTPUT);
    }
  }

  if (tm.Second != lastSecond)
  {
    String waktu = "";
    if (tm.Hour < 10)
      waktu += "0";
    waktu += tm.Hour;
    waktu += ":";
    if (tm.Minute < 10)
      waktu += "0";
    waktu += tm.Minute;
    waktu += ":";
    if (tm.Second < 10)
      waktu += "0";
    waktu += tm.Second;
    lastSecond = tm.Second;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 0, waktu);

    if ((pesan == waktunyaSholat) && (tm.Second >= 58))
    {
      box.clear();
      dmd.selectFont(Arial14);
      box.print(pesanDisplay);
      pesan = pesanSMS;
      digitalWrite(buzzer, LOW);
    }
    else if (tm.Second <= 1)
    {
      for (byte i = 0; i < 5; i++)
      {
        if ((waktuSholat[i][0] == tm.Hour) && (waktuSholat[i][1] == tm.Minute))
        {
          Sholat = namaSholat[i];
          box.clear();
          dmd.selectFont(Arial14);
          box.println("  Sholat");
          box.print(Sholat);
          pesan = waktunyaSholat;
        }
      }
    }
  }
  if (tm.Day != lastDay)
  {
    String tanggal = "";
    if (tm.Day < 10)
      tanggal += "0";
    tanggal += tm.Day;
    tanggal += "/";
    if (tm.Month < 10)
      tanggal += "0";
    tanggal += tm.Month;
    tanggal += "/";
    if (tmYearToCalendar(tm.Year) < 10)
      tanggal += "0";
    tanggal += tmYearToCalendar(tm.Year);
    lastDay = tm.Day;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 8, tanggal);
  }
  if ((h != lastH) || (t != lastT))
  {
    String suhu = "";
    if (t < 10)
      suhu += "0";
    suhu += t;
    suhu += "'C ";
    if (h < 10)
      suhu += "0";
    suhu += h;
    suhu += "%";

    lastT = t;
    lastH = h;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 16, suhu);
  }
}

dokumentasi Galeri DMD arduino anti flicker

Library yang sudah dimodifikasi: DMD-GL

Jika menginginkan jadwal sholat yang dinamis (waktu matahari) bisa menggunakan library “PrayerTimes.h”.

Timbangan digital presisi dan lcd pabrikan dengan arduino

dalam projek msin timbangan otomatis ini saya memanfatkan timbangan digital merk Quattro yang sudah tidak berfungsi normal. Fokus proyek ini adalah untuk memanfatkan Sensor berat/loadcell yang presisi dan linear serta LCD pabrikannya sehingga timbangan bisa dimanfatkan kembali.

komponen yang digunakan:

  1. Arduino Uno
  2. Loadcell
  3. HX711
  4. LCD pabrikan (driver HT1621)

Diagram:

Loadcell

Loadcell atau sensor berat pada perangkat quttro yang digunakan memiliki ukuran lebih besar dari loadcell yang ada dipasaran namun memiliki kesamaan cara kerja dan pengkabelan, kabel terdiri dari empat warna yaitu merah – E+, hitam – E-,  putih – A/B+ dan hijau – A/B-.

HX711

komponen (modul) ini berfungsi sebagai ADC – analog to digital converter 24 bit yang akan mengkonversi nilai resistansi dari jembatan Wheatstone menjadi nilai yang berbanding lurus dengan berat benda yang ditimbang

LCD pabrikan

LCD yang digunakan merupakan bawaan perangkat timbangan quattro yang khusus dipakai untuk jenis timbangan ini saja. karakter Terdiri dari 6 digit seven segmen, 3 digit character segmen (seperti seven segmen digabung dengan garis diagonal), 10 bar/garis penanda berat, dan tampilan penunjuk lainnya.

LCD ini dikontrol oleh driver HT1621 dengan 4 jalur input, saya hanya menggunakan 3 saja yaitu CS, WR dan Data. sedangkan  untuk tampilannya saya hanya menggunakan 6 seven segmen dan 2 character segment untk text “Gr”.

 

Skema:

program/sketch:

#include "HX711.h"

HX711 scale(8,9);

#define jumlahSegmen 15
 
//Command
#define  ComMode	0x52
#define  RCosc	  0x30
#define  LCD_on	 0x06
#define  LCD_off	0x04  
#define  Sys_en	 0x02
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  

//pin
int CS = A3;
int WR = A1;
int Data = A0;
int backLight = 7;
int buttonESC = 5;
int buttonPCS = 4;
int buttonUNIT = 3;
int buttonTARE = 6;
int buttonZERO = 2;

byte angka[] = {0xBE, 0x06, 0x7C, 0x5E, 0xC6, 0xDA, 0xF2, 0x0E, 0xFE, 0xCE};
byte byteArrayBerat[8];
byte strBerat[6];
 
void SendBit_1621(byte sdata,byte cnt)
{ 
  for(byte i=0;i<cnt;i++) 
  { 
	digitalWrite(WR, LOW);
	
	if(sdata&0x80) 
	  digitalWrite(Data, HIGH); 
	else 
	  digitalWrite(Data, LOW);
	  
	digitalWrite(WR, HIGH);
	sdata<<=1; 
  } 
}
 
void SendCmd_1621(byte command) 
{ 
  digitalWrite(CS, LOW); 
  SendBit_1621(0x80,4);  
  SendBit_1621(command,8); 
  digitalWrite(CS, HIGH);					 
}
 
void Write_1621(byte addr,byte sdata)
{ 
  addr<<=3; 
 digitalWrite(CS, LOW); 
 SendBit_1621(0xa0,3);	 
 SendBit_1621(addr,6);	 
 SendBit_1621(sdata,8);   
 digitalWrite(CS, HIGH); 
} 

void doubleToDecArray(double value, byte *byteArray)
{
  double divider = 1000.0;
  for(byte i=0;i<8;i++)
  {
	byte divValue = value / divider;
	byteArray[i] = divValue;
	value = value - (divValue * divider);
	divider /= 10;
  }
}

void setup() {
  pinMode(CS, OUTPUT);
  pinMode(WR, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(backLight, OUTPUT);
  pinMode(buttonESC, INPUT_PULLUP);
  pinMode(buttonPCS, INPUT_PULLUP);
  pinMode(buttonUNIT, INPUT_PULLUP);
  pinMode(buttonTARE, INPUT_PULLUP);
  pinMode(buttonZERO, INPUT_PULLUP);

  digitalWrite(backLight,LOW);
  digitalWrite(CS, HIGH);
  digitalWrite(Data, HIGH);
  digitalWrite(WR, HIGH);

  Serial.begin(9600);
  Serial.println("Timbangan Arduino");
  Serial.println("https://www.project.semesin.com");
  
  delay(50);
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);	
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);

  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0xff); 
  } 
  delay(1000);
  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0x00); 
  } 
  Write_1621(6,0x85);// huruf 'G'
  Write_1621(7,0xA6);
  Write_1621(10,0x02);//Huruf 'r'
  Write_1621(11,0x40);

  scale.set_scale(2280.f);
  scale.tare();
  }
 
void loop() {

  double Berat = scale.get_units(10);
  Serial.println(Berat);
  
  bool getNum = false;
  byte numPointer = 0;
  byte numCounter = 0;
  
  if(Berat < 0)
  {
	Berat = 0;
  }
  else
  {
	doubleToDecArray(Berat, byteArrayBerat);
	for(byte i=0;i<8;i++)
	{
	  if(byteArrayBerat[i] != 0)
	  {
		getNum = true;
	  }
	  if(getNum)
	  {
		numCounter++;
		strBerat[numPointer] = angka[byteArrayBerat[i]];
		if(i==3)
		{
		  strBerat[numPointer] |= 0x01;//Koma
		}
		if(numPointer++ == 6)
		{
			numCounter--;
			break; 
		}
	  }
	  else if(i==3)
	  {
		getNum = true;
		strBerat[numPointer++] = angka[0] | 0x01;
	  }
	}
	byte j=0;
	for(int8_t i=0;i<6-numCounter;i++)
	{
	  Write_1621(i,0x00); 
	}
	for(byte i=6-numCounter;i<6;i++)
	{
	  Write_1621(i,strBerat[j++]); 
	}
  }

  if(!digitalRead(buttonTARE))
  {
	delay(200);
	if(!digitalRead(buttonTARE))
	{
	  scale.tare();
	  while(!digitalRead(buttonTARE));
	}
  }
  delay(50);
}

Fitur-fitur modul HX711:

  1. Memiliki 2 block differential ADC sehingga bisa dengan gain yang berbeda disesuaikan dengan tingkat presisi yang diinginkan , yang tersedia 32, 64 dan 128.
  2. Memiliki regulator tegangan sendiri untuk loadcell dan ADC.
  3. Interface serial yang disederhanakan.
  4. Frekuensi keluaran dapat diatur 10SPS dan 80sps
  5. Penyaring/filter riak 50Hz dan 60Hz.

Dengan spesifikasi:

  1. Tegangan operasional dc 2.6 ~ 5.5v.
  2. ADC 24 bit yang presisi.
  3. frekuensi Internal clock 11.0592 MHz.
  4. Konsumsi arus, 1500uA (normal), 0,5uA (power down).

dokumentasi Galeri timbangan digital presisi

Library : HX711.zip

Menentukan nama hari dari tanggal [Arduino]

Untuk memperoleh nama hari dari tanggal yang diberikan dapat mengikuti dengan langkah berikut:

  1. Menetapkan basis hari, misalnya 1 januari 2000 jatuh pada hari sabtu = 7
  2. Menghitung jumlah hari dari basis hari hingga tanggal yang ditentukan dengan memperhitungkan:
    • tahun x 365
    • jumlah tahun kabisat
    • jumlah hari dalam setiap bulan
    • tanggal
  3. dan terakhir mencari nilai sisa setelah dibagi dengan 7

berikut program atau sketch fungsi yang dapat digunakan:

String namaHari[] = {"Minggu","Senin","Selasa","Rabu","Kamis","Jum'at","Sabtu"};
uint16_t jumlahHariPerBulan[]={0,31,59,90,120,151,181,212,243,273,304,334};

void setup() {
  Serial.begin(9600);
  Serial.println("fungsi mendapatkan Nama hari dari tanggal yang diberikan");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  byte hari;
  byte tanggal = 4;
  byte bulan = 3;
  byte tahun = 18;
  
  hari = hariDariTanggal(tanggal, bulan, tahun);

  Serial.print(tanggal);  
  Serial.print("/");  
  Serial.print(bulan);  
  Serial.print("/");  
  Serial.print(tahun);  
  Serial.print(" => ");  
  Serial.print(hari);  
  Serial.print(" : ");  
  Serial.println(namaHari[hari - 1]);  

  while(1);
}

//tanggal mulai dari 1
//bulan mulai dari 1
//tahun dua digit
//minggu = 1, sabtu = 7
//basis 1 Januari 2000
byte hariDariTanggal(byte tanggal, byte bulan, uint16_t tahun)
{
  uint32_t jumlahHari = tahun * 365;
  uint16_t tahunKabisat = tahun/4;
  for (byte i = 0; i < tahun; i++) 
  {
    if (!(i%4))
    {
      jumlahHari++;
    }
  }
  jumlahHari += jumlahHariPerBulan[bulan-1];
  if ( (bulan >= 2) && !(tahun % 4)) 
  { 
    jumlahHari++;
  }
  jumlahHari+= tanggal;
  return ((jumlahHari + 5) % 7) + 1;
}

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