Pengantar
Protect Arduino Sketch adalah hal yang sangat penting dalam sebuah sistem yang kita bangun. Pada dasar nya, setiap program yang kita tanam pada sebuah mikrokontroller, contoh nya seri AVR bisa di download balik menjadi file HEX atau BIN, kemudian di tanam kembali di chip-chip baru.
Bayangkan program yang kita bangun, kita analisa error seriap baris program nya agar flexible bagi pengguna, kemudian dengan mudah nya di copy paste pebisnis besar dan memproduksi massal karya kita, sehingga memungkin menjual produk secara massal dengan harga yang jauh lebih murah dari yang kita jual.
Ada malam, ada siang yang habis kita gunakan untuk membangun program ini, kemudian dalam hitungan jam saja program kita telah di miliki free oleh orang lain. yah dia tinggal sewa jasa duplikat PCB beberapa ratus ribu. jreng, jadi dah produk yang sama dengan produk kita.
Beberapa orang mungkin mengeluarkan statment ketika membaca artikel ini, kan bisa proteksi bit nya? lock fuse bit nya? seperti pertanyaan di bawah ini,
Layanan re upload hex
kembali ke pertanyaan di atas? bukan kah bisa di proteksi dengan fuse bit? pada umum nya, bisa di proteksi dengan fuset bit, bahkan hampir semua melakukan ini. Cuman ngeri nya, ada layanan di china untuk mengambil hex program dengan harga yang lebih murah. Sampai ada ratusan list jenis mikrokontroller yang bisa di ambil hex nya, sekali pun di proteksi fuse bit nya.
Lantas seperti apakah cara nya? tanpa fuse bit namun bisa protect arduino sketch? Ternyata ada cara yang cukup mudah, ini kita dapatkan dari facebook Group Arduino, yaitu menggunakan Sensor DS18b20, sebuah sensor Suhu yang memiliki alamat yang berbeda dari setiap sensor nya, ini lah yang akan kita gunakan sebagai ID dari setiap hardware yang kita desain. sebenar nya ini tidak hanya berlaku untuk arduino, tapi semua jenis mikrokontroller. Nah bagaimana kah program nya?
Code Unique DS18b20
Karena sensor ini memiliki alamat yang berbeda setiap device nya, makan sensor ini bisa kita jadikan sebagai ID dari hardware kita. Untuk itu, hal pertama yang kita lakukan adalah program untuk mendapat kan alamat nya.
Karena kita menggunakan Arduino, maka teman-teman harus download dulu library dari DS18b20, atau bisa visit artikel di bawah ini, cukup klik tombol merah di bawah ini saja
Setelah library nya sudah terpasang cukup baik di Arduino nya, selanjut nya adalah membuat list program membaca alamat ds18b20.
Alamat ds18b20
program membaca alamat nya bisa di lihat pada baris program di bawah ini,
// Include the libraries we need #include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 22 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // arrays to hold device address DeviceAddress insideThermometer; // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 15, en = 14, d4 = 7, d5 = 6, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); String line1, line2, line3; String ID; void setup() { // put your setup code here, to run once: // Start up the library sensors.begin(); lcd.begin(20, 4); if (sensors.isParasitePowerMode()) lcd.print("ON"); else lcd.print("OFF"); delay(2000); lcd.clear(); if (!sensors.getAddress(insideThermometer, 0)) lcd.print("Unable address"); else lcd.print("found device"); delay(2000); lcd.clear(); printAddress(insideThermometer); } void loop() { // put your main code here, to run repeatedly: lcd.setCursor(0,0); lcd.print(line2); lcd.setCursor(0,1); lcd.print(line3); delay(250); } void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { deviceAddress[i]; delay(100); } line2 = String(deviceAddress[0]) + (",") + deviceAddress[1] + (",") + deviceAddress[2] + (",") + deviceAddress[3]+(","); line3 = String(deviceAddress[4])+(",") + deviceAddress[5]+(",") + deviceAddress[6] + (",") + deviceAddress[7] + (",") + deviceAddress[8]; ID = line2+line3; }
Program di atas, kita menggunakan atmega128, tapi bekerja juga pastika di arduino mega, Code uniqe nya akan tampil di LCD 20×4. Setelah dapat code unique nya? bagaimana kah contoh nya? agar code ini bisa di jadikan penentu? apakah code nya valid atau tidak? tinggal tambah if
Valid not Valid
Code unique sudah kita dapat kan dari program di atas, langkah selanjut nya adalah membuat sebuah variable code unique itu sendiri, kemudian membandingkan apakah sama variable code unique kita dengan code unique yang terbaca dari sensor ds18b20, variable nya seperti berikut
String key = "40,255,143,39,36,23,3,112,0";
kemudian program seluruh nya adalah sebagai berikut,
// Include the libraries we need #include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 22 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&amp;oneWire); // arrays to hold device address DeviceAddress insideThermometer; // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 15, en = 14, d4 = 7, d5 = 6, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); String line1, line2, line3; String ID; String key = "40,255,143,39,36,23,3,112,0"; void setup() { // put your setup code here, to run once: // Start up the library sensors.begin(); lcd.begin(20, 4); if (sensors.isParasitePowerMode()) lcd.print("ON"); else lcd.print("OFF"); delay(2000); lcd.clear(); if (!sensors.getAddress(insideThermometer, 0)) lcd.print("Unable address"); else lcd.print("found device"); delay(2000); lcd.clear(); printAddress(insideThermometer); } void loop() { // put your main code here, to run repeatedly: lcd.setCursor(0,0); lcd.print(line2); lcd.setCursor(0,1); lcd.print(line3); if ( ID == key){ lcd.setCursor(0,3); lcd.print("Key valid"); }else{ lcd.setCursor(0,3); lcd.print("invalid:085207770631"); } delay(250); } void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { deviceAddress[i]; delay(100); } line2 = String(deviceAddress[0]) + (",") + deviceAddress[1] + (",") + deviceAddress[2] + (",") + deviceAddress[3]+(","); line3 = String(deviceAddress[4])+(",") + deviceAddress[5]+(",") + deviceAddress[6] + (",") + deviceAddress[7] + (",") + deviceAddress[8]; ID = line2+line3; }
Cara Kerja nya
Ketika ada anonimous coba untuk ambil hex teman-teman, dan re upload kembali ke chip baru, maka variable key di atas juga sesungguh nya ikut menjadi binary di dalam hex dan ter tanam di chip baru nya.
sementara variable key tadi hanya berlaku untuk satu chip DS18b20, sementara DS18b20 baru yang dipasang anonimous atau bahkan tidak di pasang di PCB clone nya akan berbeda dengan key variable. hal ini akan membuat program dia lompat ke
else{ lcd.setCursor(0,3); lcd.print("invalid:085207770631"); }
Tentu saja, dengan metode ini, mudah-mudahan akan mempersulit bahkan mungkin tidak mungkin untuk mem bajak program yang teman-teman buat sendiri.
Semoga Tulisan Sederhana ini bermanfaat, Thank to Senior-senior yang suka berbagi, atau jika ada metode yang lebih murah dan lebih cepat boleh di comen yah
Thanks