typedef struct
{
int x, y;
short life;
char *nama;
} Man;
void setup() {
Serial.begin(9600);
//menggunakan 4 memori untuk string
String hi = "Hello";
String names = "World";
String hello = hi + " " + names;
//menggunakan 1 memori
String greeting = hi;
greeting.concat(" ");
greeting.concat(names);
String tempname = "Temperature";
String temp = "23C";
PrintVal1(tempname, temp); //membuat string redundan. Lihat fungsi
PrintVal2(tempname, temp); //pass by reference, tidak redundan. Lihat fungsi
char thestring[30] = "This is a string";
//thestring = "New content"; //cara yang salah, panjang string harus sama!
strcpy(thestring, "New content"); //good method
char isgood[8] = "is good";
//char allbad[38] = thestring + isgood; //cara yang salah, ini adalah operasi biner. gunakan strcat
char allgood[38];
strcat(allgood, thestring); strcat(allgood, isgood);
char a[2] = "A"; char b[2] = "A";
if (a == b) {}//cara yang salah, akan selalu bernilai false
if (strcmp(a, b) == 0 ) {} //car yang benar, atau gunakan strcasecmp()
//pointer
int var = 0;
int arr[] = {1, 2, 3};
int *ptr; //init, don't set to NULL (destroy), *ptr = 0, first address? no!
ptr = &var; //to address of var, not the value of var
*ptr = 50;; //pointer content is 50
//ptr = 50; //pointer (address) is 50
//ptr++; //pointer address + 1
ptr = arr; //to array
ptr[0] = 50; //array number 0, is 50
ptr = &arr[0]; //equal to above, array number 0 is 50
Man *ptrMan;
Man manusia = {0, 0, 0, NULL};
manusia.life = 9; //kucing :D
manusia.nama = "Todol"; //pointer in struct
ptrMan = &manusia;
ptrMan-> life = 0; //mati
char *pString = "This is text"; //not safe to change content! don't do!
const char *pStringSafe = "This is text"; //display warning when change content
char temperature[] = "23C"; //constant
//Following syntax is not compiler friendly, it will be unhappy
PrintValP("Temperature", temperature);
//The following will make compiler happier (look at the fuction!)
PrintValPC("Temperature", temperature);
PrintString(temperature);
}
//make 2 new strings, redundant string
void PrintVal1(String tag, String value) {
Serial.print(tag);
Serial.print(" = ");
Serial.println(value);
}
//pass by reference
void PrintVal2(String &tag, String &value) {
Serial.print(tag);
Serial.print(" = ");
Serial.println(value);
}
//pass by pointer
void PrintValP(char *tag, char *value) {
Serial.print(tag);
Serial.print(" = ");
Serial.println(value);
}
void PrintValPC(const char *tag, const char *value) {
Serial.print(tag);
Serial.print(" = ");
Serial.println(value);
}
void PrintString(const char *str) {
const char *p;
p = str;
while (*p) {
Serial.print(*p);
p++;
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Kategori: Semua Catatan
Panelisasi PCB
Saat ukuran desain PCB kecil, katakanlah 2×3 cm, dan akan dibuat pada PCB dengan ukuran 10 x 10 cm, maka desain PCB dapat dibuat panel. PCB ukuran 10 x 10 akan dapat menampung setidaknya 12 desain PCB 2×3 cm.








Zip semua file gerber dan siap untuk dimasukkan ke percetakan atau dibuka dengan FlatCam untuk dicetak lewat CNC. Atau dapat juga dicetak di printer untuk metode toner transfer dan photoresist.
Konfigurasi FlatCAM


Konfigurasi untuk VBit 0.2mm pada PCB 1 Oz
Konfigurasi untuk VBit 0.2mm pada PCB 1 Oz. Pada CNC yang saya gunakan, konfigurasi terbaik adalah:
Tool Dia: 0.3
Width Passes: 3
Pass Overlap: 0.15
Combine passes: v
Cut Z: -0.075
Travel Z: 2.54
Feed Rate: 254
Tool Dia:0.3
Konfigurasi untuk Millier 2 Flute 0.6mm pada PCB 1 Oz. Pada CNC yang saya gunakan, konfigurasi terbaik adalah:
Tool Dia: 0.5
Width Passes: 2
Pass Overlap: 0.25
Combine passes: v
Cut Z: -0.038
Travel Z: 2.54
Feed Rate: 128
Tool Dia:0.5
Ukuran Kapasitor pada PCB


Pembuatan PCB dengan DEET (Lotion anti nyamuk)
Desain PCB
- Lebar track >= 20mil (0,5 mm), jarak antar track >= 20mil (kecuali ada smd yang jarak kakinya 10 mil, tidak masalah)
- Cetak via, hole, top/bottom dan dimension untuk Toner transfer.
- Cetak tCream/bCream, hole, dan dimension untuk masking. Atau cukup pilih tStop/bStop, cetak dengan memilih solid dan black.
A. Persiapkan PCB:
PCB harus bebas korosi. Jika banyak minyak, pertama tama bersihkan tembaga menggunakan sabun cuci piring lalu keringkan. Anginkan atau jemur PCB hingga kering. Jika sudah tidak ada minyak yang menempel pada tembaha, gosok tembaga menggunakan penggosok panci atau ampelas halus. Lalu bersihkan debu butiran menggunakan tisu atau kertas polos dan alkohol 95%. Jika menggunakan aceton murni akan lebih baik. Aceton ini bukan yang digunakan untuk pembersih kuku, karena biasanya aseton jenis ini sudah dilarutkan dengan air, alkohol, vitamin dan pewangi.
Catatan:
PCB harus bebas dari minyak dan korosi, sehingga toner atau senyawa lain mudah menempel. Dissarankan untuk membersihkan dengan alkohol/aseton. Membersihakn dengan air dapat menjadikan air bereaksi dengan tembaga dan membentuk korosi.
B. Proses transfer toner
1.Siapkan kertas fotokopi yang sudah di-mirror. Potong sesuai ukuran. Tempelkan bagian toner ke tembaga dan kunci dengan isolasi jika perlu.
2. Tuang beberapa titik di diethyltoluamide (DEET), biasanya ada pada lotion anti nyamuk, di atas kertas dan usapkan hingga kertas menjadi transparan. Jika belum transparant, tambahkan sedikit-demi sedikit. Jangan menambahkan terlalu banyak karena dapat mengakibatkan kertas bergelombang, dan menjadikan toner terlalu lembek.
3. Tambahkan sedikit air cukup dengan mencelupkan tangan di air lalu usapka menggunakan tangan di kertas. Tutup dengan cellophane atau mika bungkus kado.
4. Gunakan koin atau kartu PVC untuk menggosok mika secara merata dan urut dari ujung ke ujung. Jangan terlalu keras menekan, terlalu keras menekan mangakibatkan toner menyebar, jalur jadi menebal dan bisa terhubung di sebelahnya. Lakukan hingga merata.
5. Lepas mika lalu lepas kertas perlahan. Saat melepas kertas kadang menjadikan beberapa toner di pinggir jalur ikut terlepas bersama kertas. Jika masih ada yang menempel di kertas, gosok ulang denga kartu PVC.
6. Saat kertas sudah terlepas, keringkan toner dengan menganginkan. Atau dapat juga memanaskannya dengan korek api pada bagian tembaganya pada api biru. Pengeringan dapat dilakukan dengan menaruh PCB pada pada wajan dengan tembaga menghadap ke atas sampai warna tembaga sedikit berubah pucat. Kurang lebih 1 menit dengan api sedang. Awas: Jika terlalu panas, PCB dapat melengkung. Lalu segera masukkan ke air dingin segera setelah PCB dipanasi. Air dingin digunakan untuk mendinginkan secara cepat, sehingga toner mengeras kembali.
7. Jika masih ada kertas yang menempel, lanjutkan dengan mengelus-elus pcb dengan jari hingga lapisan kertas yang menempel pada toner terlepas.
8. Cek jalur PCB jika ada yang terlepas/teputus, gambar jalur dengan spidol anti air. PAstikan PCB dalam kondisi kering. Jika ada jalur bersebelahan yang terhubung, kerok sedikit menggunakan cutter atau jarum.
C. Etching
1. Gunakan Feri Chorida 1 gram + 100 ml Air. Atau dapat gunakan campuran 1 bagian Asam Chlorida dan 2 bagian Peroxida (HCl + 2H2O2) + 4 bagian Air. Jika sulit ditemukan bisa menggunakan 2 bagian Wipol / WPC + 1 bagian Vanish.
2. Masukkan PCB dengan tembaga menghadap ke atas. Jika menggunakan FeCl, perlu digoyangkan. Namun jika menggunakan HCl cukup diamkan dan amati hingga tembaga larut.
3. Jika ada toner yang terkoyak, angkat dan keringkan dengan ditiriskan dan dianginkan. Jangan mengeringkan dengan cara diusap karena toner dapat terkelupas. Lalu gambar jalur toner yang putus dengan drawing pen atau spidol anti air. Kemudian masukkan lagi.
4. Angkat dan tiriskan PCB ke tisue. Bersihkan menggunakan aseton (pembersik kutek)
5. Jika ada minyak atau korosi, amplas dengan amplas terhalus (nomor 1)
D. Persiapkan Curabe UV Solder Mask (CUVSM) / Dry film solder mask
1. Cureble UV harus bebas dari minyak, Minyak digunakan untuk melumasi agar tidak mudah beku. Jika Curable UV terlalu cair dan keliatan ada minyaknya, taruh curable di atas tisue dan biarkan beberapa saat. Minyak mengakibatkan curable sulit menempel ke PCB.
2. PCB harus dalam keadaan bersih. Lihat poin A.
3. Tuangkan pasta CUVSM yang sudah tanpa minyak, atau minyak sudah tidak tampak, ke PCB.
4. Gunakan plastik pembungkus kado (cellophane) untuk menutup CUVSM. Jika menggunakan plastik mika fotokopi, bisanya hasit akhir solder mask malah menempel ke mika. Jika menggunakan plastik pembungkus makanan biasanya membuat CUVSM tidak rata (bergelombang).
5. Pasang mika tebal atau kaca untuk menekan cellophane yang dipasang menempel CUVSM. Tekan hingga permukaan rata. Jika jalur PCB belum terlihat, tekan kaca/mika lebih kuat lagi
6. Siapkan hasil cetakan solder paste area yang dicetak di kertas polos dan tambahkan minyak baby oil / kayu putih hingga transparan. Cetakan solder paste dapat juga dicetak di kertas transparant atau difotokopi, sehigga tidak memerlukan minyak untuk menjadikan trasnparan. Namun perlu di cek apakah warna hitam masih tembus? jika tebus maka pasang 1 lapis lagi agar bener-benar warna hitamnya tidak tembus cahaya. Penggunaan transparant ditujukan agar saat memasang di atas CUVSM jalur dapat terlihat jelas, dibandingkan menggunakan kertas yang diberi minyak.
7. Gunakan penjepit jika inggin menggunakan kaca untuk dapat meratakan CUVSM. Pasang kertas transparan di atas cellophane sesuai relief yang diinginkan, dengan bagian permukaan cetak di bawah. Hal ini agar cahaya tidak terdispersi saat menyinari CUVSM. Jangan pula menaruh mika tebal atau kaca tebal diatas kertas transparan, karena mengakibatkan penyinaran tidak maksimal. Kaitkan dengan isolasi jika perlu, agar posisi tidak mudah berubah.
8. Gunakan Lampu UV atau pengering UV HP atau pengering kuku kutek atau apapun yang dapat menyinari gelombang UV. Lama penyinaran tergantung dari kuat cahayanya. Untuk UV 8 watt TL, membutuhkan 4 – 5 menit. Untuk 2×9 watt (2 lampu pengering kuku) cukup 20 – 30 detik. Disarankan untuk mencoba menyunari CUVSM di kertas yang tidak terpakai dan tandai dari 1 s.d 7 menit. Cari lama penyinaran yang tepat, dimana CUVSM sudah mulai mengeras dan mengkilap. Pastikan pula CUVSM yang menenpel di kertas juga sudah mengeras, sehingga tidak lagi dijumpai dalam bentuk pasta.
9. Lepas cellophane secara perlahan dengan menggeser sedikit demi sedikit pada pucuknya. Usahakan saat membuka cellophane, sudut cellophane tidak leboh dari 5 derajat terhadap PCB.
10. Bersihkan sisa pasta CUVSM yang tidak mengeras, yang tidak mendapatkan sinar UV, dengan menempel – tempel dengan tisue kering hingga tidak ada pasta CUVSM yang bsa menempel ke tisue. Tuang sedikit aseton ke tisue dan ulangi tempel-tempel ke pasta CUVSM. Jangan digosok, karena dapat menjadikan CUVSM yang telah menempel ke PCB, yang mengeras, terkoyak dan lepas dari ikatan tembaga. Jika ada lubang yang tertutup pasta, gunakan aseton yang dituang di wadah dan masukkan PCB dengan digoyang goyangkan agar pasta larut. Penggunaan tiner tidak disarankan, karena bisa mengupas CUVSM yang sudah keras. Penggunaan alkohol 70% juga tidak disarankan karena pasta malah dapat berpindah di tempat lain, karena pasta tidak menempel di tissue yang ada alkoholnya.
11. Saat pasta sudah bersih, ulangi penyinaran hingga 1 jam. Ini digunakan untuk mengeraskan CUVSM dan membuatnya lebih menempel ke tembaga. Jika perlu, panaskan PCB ke suhu 250C selama bebrapa menit dengan blower atau pemanggang. Dapat juga jemur di bawah matahari terik selama 2 jam.
12. Masukkan kapas atau tisue ke AgNO3 (perak nitrat) dan tempel-tempel (tap) ke PCB. Jika memiliki AgNO3 ukuran banyak, PCB dapat dicelupkan selama 3 menit.

PCB dengan Dry Film Photoresist
Membuat jalur PCB dapat menggunakan beberapa cara, dari mulai menggambar menggunakan tinta anti air, sablon, toner transfer, dan salah satunya adalah menggunakan Dry Film Photoresist. Berikut langkahnya
A. Pembersihan PCB
PCB dapat cukup dibersihkan dengan digosok menggunakan sabut cuci piring Scotch-Brite, atau sabut per cuci, atau menggunakan amplas yang paling halus. Lalu usap dengan aseton bila perlu. Aseton dapat dibeli di toko kimia atau di toko swalayan sebagai pembersih kutek (cat kuku).
Jika ada minyak yang menempel pada PCB, biasanya bekas sidik jari, dapat dibersihkan dengan sabun cuci dan keringkan. Setelah itu baru digosok dengan sabut cuci atau amplas.
B. Potong PCB sesuai ukuran
Pemotongan FR2 dapat dilakukan dengan cutter. Tandai dengan cutter di sisi tembaga dan sisi sebailknya. Lalu tekan di tempat rata dan patahkan. Pemotongan FR4 perlu menggunakan gergaji besi atau semarcamnya.
C. Siapkan DFP
Siapkan DFP dengan memotong sesuai ukuran lalu buka strip plastik pelapis menggunakan isolasi.
D. Pasan DFP ke PCB
Ada beberapa cara untuk masang DFP ke PCB. Cara yang paling mudah adalah pastikan PCB kering lalu pasang DFP dari sudut dan ditekan menggunakan jari lalu ratakan dengan rakel / kartu ATM. Jika ada yang menggelembung dapat diseterika dengan suhu untuk nylon. Jika memiliki laminator dapat dilaminating dengan suhu kurang dari 100 derajat. Beberapa tutorial ada yang menggunakan blower suhu rendah untuk memanasi DFP.
E. Siapkan desain PCB negatif
Siapkan cetakan negatif dari jalur PCB. Dapat menggunakan kertas transparan, jika memiliki printer laser. Atau cukup difotokopi di kertas transparan. Jika kesulitan, dapat pula dicetak di printer tinta.
Untuk cetakan di kertas transparan, biasanya ada toner, gambar hitam, yang agak transparan. Solusinya adalah mendobeli gambar dan diisolasi. Sedangkan jika dicetak di kertas HVS, nantinya cukup diberikan minyak, semisal minyak baby oil agar kertas menjadi trasparan.
F. Pasang desain ke PCB
Pasang desain ke PCB. Untuk desain pada kertas HVS, tempelkan, isolasi bagian pinggir dan tuang minyak hingga semua kertas transparan. Kertas akan menempel ke PCB karena daya ikat minyak. Sedangkan jika menggunakan kertas transparan, maka selain diisolasi bagian pinggir, perlu ditindih dengan kaca agar benar-benar menempel sempurnya.
G. Penyinaran
Penyinaran dapat dilakukan di matahari terik kurang lebih 1 menit. Atau dapat juga menggunakan lampu UV untuk cek uang 18 Watt, dengan waktu 5 menit. Atau dapat juga menggunakan lampu UV pengering kutek kuku 1.5 menit (90 detik) untuk film berupa kertas yang diolesi minyak. Jika menggunakan film berupa mika trasnparan (biasanya perlu didobel untuk mendapatkan hitam sempurna), lama penyinaran cukup 20 – 30 detik saja. Lama penyinaran tergantung dari intensitas sinar UV. Lakukan percobaan penyinaran dengan mengambil sampel DFP ukuran kecil.
H. Melepas lapisan pelindung DFP
Lepas plastik pelindung DFP dengan menggunakan isolasi.
I. Bersihkan DFP
DFP yang tidak terkena sinar UV akan tetap menjadi pasta, sedangkan yang terkena sinar UV akan mengeras. Bersihkan DFP yang berbentuk pasta dengan Na2CO3 atau soda Ash (1 gram/100ml). Jika kesulitan mendapatkan Soda Ash, dapat juga menggunakan detergen cuci baju yang mengandung Na2CO3. Rendam beberapa saat lalu bersihkan menggunakan kuas kecil. Jika tidak ada kuas kecil, gunakan kapas, namun gosok perlahan jangan sampai DFP kering ikut terkelupas.
J. PCB siap di-etching
Ket:
DRC – Design Rule Check untuk penggunaan DFP terbaik yang pernah dicoba adalah:
Clearance: >=15 mil (0,381 mm), dapat dijadikan 10mil jika menggunakan kertas transparan.
Track Width: >=10 mil (0.254 mm)
DRC – Design Rule Check untuk penggunaan DFP yang disarankan adalah:
Clearance: >= 0,5 mm
Track Width: >= 0.4 mm
Pengaman Batere
Raspberry Bluetooth Printer
You have to perform several steps in order to establish communication.
You have to pair your desired bluetooth device using bluetoothctl
sudo bluetoothctl -a
scan on
devices
pair XX:XX:XX:XX:XX:XX
trust XX:XX:XX:XX:XX:XX
quit
Where XX:XX:XX:XX:XX:XX is the MAC address of your bluetooth device.
You have to create the serial device that binds to your paired bluetooth device.
sudo rfcomm bind /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1
The last number is the communication channel. It has to bee unique for all your connections.
Then you should be able to open a connection. (Assuming your bluetooth device actually supports the required SPP protocol.)
echo “test” > /dev/rfcomm0
source: https://raspberrypi.stackexchange.com/questions/78155/using-dev-rfcomm0-in-raspberry-pi/78301#78301?s=39be540452a34b55af09cb19d04ea700
Machine Learning #7 – Menuju Klasifikasi
Pada tulisan Machine Learning #5 telah diceritakan tentang Neural Network dengan 2 input dan 1 output. Mari kita kembangkan jika menggunakan 1 input dan 2 output. Percobaan ini mengarah ke klasifikasi.
Sabagai gambaran apabila inputnya adalah suara yang diubah menjadi nilai dalam bentuk matrik x dan hasilnya adalah 2 output, yaitu output y= [0 0]. Output y = [1 0], jika hasil klasifikasinya mengarah pada output pertama, misalkan saya kata “YA”, dan outputnya y = [0 1] jika hasil klasifikasinya adalah output kedua, misalkan kata “Tidak”.



Dari model di atas, tentunya agak kesulitan untuk diterapkan di mikrokontroler. Hasil dari training dalam bentuk TFLite >5Mb. Padahal mikrokontroler, katakanlah BLE 33 Sense, tidak memiliki Flash Memori yang berkapasitas 5Mb
Cara yang pertama yaitu mengubah kuantisasi dari float menjadi int pada mikrokontoler. Berikut contoh perbandingan kuantisasi menggunakan float dibandingkan menggunakan int. Memang akurasi menjadi sedikit berubah, namun penggunaan memori jauh lebih kecil.

Menghilangkan parameter yang tidak begitu penting, dengan pruning.

Dan beberapa proses yang dapat disimpulkan seperti gambar berikut:

Mencoba seonsor yang ada pada Nano BLE Sense
Melanjutkan tulisan Mencoba Nano 33 BLE Sense saatnya mencoba sensor-sensor yang ada pada modul ini. Sensor yang ada adalah 3D accelerometer, 3D gyroscope, 3D magnetometer (LSM9DS1), MEMS Digital Microphone (MP34DT05), Digital Proximity, Ambient Light, RGB and Gesture (APDS9960), Tekanan Udara (LPS22HB), Suhu dan Kelambaban (HTS221) Chip sensornya kecil kecil sekali!

Langsung saja, untuk mencoba Microphone, bisa kita lihat di sample skecthnya. Pastikan Board sudah bisa terpilih, driver terpasang dan Port juga sudah benar, cek di tulisan Mencoba Nano 33 BLE Sense. Selanjutnya pilih di bagian example -> PDM ->PDMSerialPlotter

Program ini menggunakan mikrofon on-board untuk mendengarkan audio dan memplotnya pada plotter serial. Kita akan melakukan kompilasi yang sangat lambat, membutuhkan waktu sekitar 10 menit untuk mengkompilasi dan mengunggah program. Ini karena integrasi Mbed OS dengan Arduino IDE, semoga Komunitas Arduino bisa memberikan solusi untuk ini.

Sedangkan untuk mencoba sensor-sensor lain, perlu mengistall library sesuai dengan chip sensornya berikut:

Selanjutnya gunakan contoh sketch berikut:
#include <Arduino_LSM9DS1.h> //IMU
#include <Arduino_LPS22HB.h> //Tekanan
#include <Arduino_HTS221.h> //Suhu dan kelembaban
#include <Arduino_APDS9960.h> //Gerakan, cahaya dan proksimiti
void setup(){
Serial.begin(9600);
if (!IMU.begin())
{ Serial.println("Chip IMU tidak ditemukan!"); while (1);}
if (!BARO.begin())
{ Serial.println("Chip Sensor Tekanan tidak ditemukan!"); while (1);}
if (!HTS.begin())
{ Serial.println("Chip Sensor Suhu & Kelembaban tidak ditemukan!"); while (1);}
if (!APDS.begin())
{ Serial.println("Chip Gesture, cahaya dan proksimiti tidak ditemukan!"); while (1);}
}
float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
float mag_x, mag_y, mag_z;
float Pressure;
float Temperature, Humidity;
int Proximity;
void loop()
{
//Accelerometer
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(accel_x, accel_y, accel_z);
Serial.print("Accelerometer = ");Serial.print(accel_x); Serial.print(", ");Serial.print(accel_y);Serial.print(", ");Serial.println(accel_z);
}
delay (200);
//Gyroscope
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(gyro_x, gyro_y, gyro_z);
Serial.print("Gyroscope = ");Serial.print(gyro_x); Serial.print(", ");Serial.print(gyro_y);Serial.print(", ");Serial.println(gyro_z);
}
delay (200);
//Magnetometer
if (IMU.magneticFieldAvailable()) {
IMU.readMagneticField(mag_x, mag_y, mag_z);
Serial.print("Magnetometer = ");Serial.print(mag_x); Serial.print(", ");Serial.print(mag_y);Serial.print(", ");Serial.println(mag_z);
}
delay (200);
//Pressure
Pressure = BARO.readPressure();
Serial.print("Tekanan= ");Serial.println(Pressure);
delay (200);
//Temperature
Temperature = HTS.readTemperature();
Serial.print("Suhu= ");Serial.println(Temperature);
delay (200);
//Humidity
Humidity = HTS.readHumidity();
Serial.print("Kelembaban= ");Serial.println(Humidity);
delay (200);
//Proximity
if (APDS.proximityAvailable()) {
Proximity = APDS.readProximity();
Serial.print("Proksimiti= ");Serial.println(Proximity);
}
delay (200);
Serial.println();
delay(1000);
}
HAsil bisa dilihat di serial monitor
