Things That I Learned From Designing Current Sensor for Ultra-Low Power Device

  • Use Kelvin Connection, this eliminates stray voltage from current carrying wires. You want to only measure voltage drop across the shunt resistor.
  • Select your shunt resistor which suitable with your drop voltage requirement. If you’re not okay with 1V voltage drop, then don’t measure 1A with 1Ohm shunt resistor.
  • If you use Op-Amp for amplification, consider its input bias current a.k.a input impedance. Too high input bias current will mess up your measurement especially when you’re trying to work in micro-ampere current.
  • Select an adequate ADC, either it’s 10, 12, 16, or even 24-bit, it’s purely dependent on your resolution requirement. Don’t forget that ADCs sometimes incorporate internal PGA, so consider the input bias current as well.
  • Also, if your ADC requires external voltage ref, choosing an accurate voltage ref will improve your reading accuracy. For me, it is 0.1%
  • Breadboard for prototyping is SUCK!
  • If you want to auto range, you will definitely need MOSFETs. P-Channel for High-Side measurement, N-Channel for Low-Side. Each has its own pros and cons.
  • Basically you are designing an a.n.a.l.o.g circuitry, so don’t treat this like an Arduino project.

A Very Nice Reading List:

By Reference vs By Pointer Dependency Injection C++

By Reference DI is safer because reference cannot be Null, but it has some issues: initialization, copying, and assignment problem. Something that I’m currently experience now.

By Pointer DI has no issues above, but by using pointer reference you will need to watch some issues like object ownership (where Smart Pointer is better), and null-value (always remember to assert dependencies != nullptr)

My Git Command Tricks

Temporarily switch to a certain commit

Make sure git status is clean. Jump to a specific git commit:
git checkout commit_hash

Example:
git checkout 286202caa31b61c2182209f37f8069a0b60fb942

Back to the original commit:
git checkout branch_name

Example:
git checkout master

Arduino Nano Every Pinout Diagram

The newly introduced Arduino Nano Every, Arduino Nano 33 IoT, Arduino Nano 33 BLE, and Arduino Nano 33 BLE Sense are currently not available to purchase. Estimated shipment is as early as mid-June 2019.

I will update this diagram accordingly. We don’t yet know the complete details of Arduino IDE supports for these boards.

Arduino Nano Every Pinout Diagram v0.1
What Programming Language You Mostly Use Then & Now? Why?

What Programming Language You Mostly Use Then & Now? Why?

This probably is the most frequent asked question: programming language choice. Well, there are literally hundreds even thousands of programming languages out there. Several have gained sweet popularity, some have been discontinued, buried along with obsolete technologies. Some languages have lasted to date, some others just get illusively overhyped.

That, of course, makes total beginners get confused. What should I learn? Where can I find help if I get stuck? This short article would probably help you clear your path to choose a programming language.

Continue reading “What Programming Language You Mostly Use Then & Now? Why?”

Perlukah Membuat Digital Module pada FPGA?

Pada paper design-of-an-fpga-based-vlc-system telah disebutkan bahwa digital module diimplementasikan agar sinyal MII dapat diubah menjadi encoded signal yang siap ditransmisikan yang sesuai dengan standar IEEE 802.3 Ethernet. Pada gambar 1, diperlihatkan bahwa digital module merupakan bagian dari PHY layer sistem.

blokdiagram

Kabel ethernet pada sambungan internet sebetulnya merupakan physical layer juga. Pada titik ini, MAC layer sudah ada di bagian MAC chip di router/switch ethernet. PHY layer juga sudah diimplementasikan pada router/switch. Sehingga sinyal kabel ethernet pada dasarnya adalah sinyal luaran dari blok biru digital module di atas.

Kecuali capstone design akan menggunakan USB-to-MII sebagai sumber koneksi, kita sudah tidak perlu lagi untuk membuat digital module dan MAC layer. Sayangnya, pada posisi tersebut kita tidak lagi membutuhkan FPGA. FPGA sama sekali tidak digunakan.

Terdapat paper lain (ethernet-signal-transmission-via-vlc-lighting)  yang membahas transmisi sinyal ethernet melalui VLC. Di dalamnya hanya terdapat analog circuit yang menerima input berupa sinyal ethernet, dan output dihubungkan ke AFE. Perlu diketahui pula bahwa sistem pada paper tersebut adalah full-duplex, yaitu komunikasi dua arah.

twoway

Media Independent Interface (MII)

Media Independent Interface (MII)

Pada paper design-of-an-fpga-based-vlc-system diuraikan cara interfacing antara PC dengan Analog Front End (AFE) menggunakan chip USB-to-Ethernet. Chip yang digunakan menyediakan pin untuk sinyal MII. Di bawah ini adalah blok diagram sistem dari paper di atas:
blokdiagram

Sementara Board DE2-115 menyediakan chip PHY untuk interfacing ethernet ke FPGA:

blokdiagram2Chip tersebut menyediakan pin MII pula. Sehingga untuk proyek capstone design ini akan digunakan diagram blok sebagai berikut:

untitled-diagram-2

Dikutip dari laman wikipedia, MII memiliki sinyal transmitter dan receiver sebagai berikut:

Transmitter signals

  • TX_CLK Transmit clock (PHY to MAC)
  • TXD0 Transmit data bit 0 (MAC to PHY) (transmitted first)
  • TXD1 Transmit data bit 1 (MAC to PHY)
  • TXD2 Transmit data bit 2 (MAC to PHY)
  • TXD3 Transmit data bit 3 (MAC to PHY)
  • TX_EN Transmit enable (MAC to PHY)
  • TX_ER Transmit error (MAC to PHY, optional)

Receiver signals

  • RX_CLK Receive clock (PHY to MAC)
  • RXD0 Receive data bit 0 (PHY to MAC) (received first)
  • RXD1 Receive data bit 1 (PHY to MAC)
  • RXD2 Receive data bit 2 (PHY to MAC)
  • RXD3 Receive data bit 3 (PHY to MAC)
  • RX_DV Receive data valid (PHY to MAC)
  • RX_ER Receive error (PHY to MAC)
  • CRS Carrier sense (PHY to MAC)
  • COL Collision detect (PHY to MAC)

Interpreter Bahasa Brainfuck Dalam Bahasa C

Brainfuck? Jangan salah paham dulu, Brainfuck adalah sebuah bahasa pemrograman esoteric yang minimalis. Bahasa Brainfuck hanya memiliki delapan perintah yaitu , . [ ] < > + -. Sebetulnya sudah banyak juga sih yang menulis compiler dan interpreter untuk bahasa ini, tapi saya ingin membuatnya sendiri karena tertarik perintahnya yang sedikit, hihi.

Untuk implementasi interpreter Brainfuck, saya memutuskan menggunakan Bahasa C sebagai permulaan. Di bawah ini adalah kode C untuk interpreter Brainfuck, kurang dari 170 baris, dan itu belum dioptimasi! 😛 Setelah di-compile interpreternya dapat menerima file program Brainfuck. Kalau malas compile sendiri, saya juga sudah siapkan executable untuk Windows di link github yang saya sediakan di bagian bawah. 🙂
https://github.com/Rosmianto/Brainfuck-interpreter

[code language=”cpp” collapse=”true”]
#include &lt;stdio.h&gt; // for basic I/O operation.
#include &lt;stdlib.h&gt; // for memory management.

typedef struct stack {
int value;
struct stack *next;
} stack_node_t;

typedef struct {
stack_node_t *top;
} stack_t;

int pop(stack_t *s);
void push(stack_t *s, int i);
char *bracemap(char *program);
void loadBFtoMemory(FILE *handle);
void process(char c);

const int memorySize = 30000;
char *cell;
int currentCell = 0;
int InstructionPointer = 0;
int i, charCount;
FILE *hInput; // Handle to File object.
char *programArray; // Cleaned up Brainfuck program.
char *braces; // Storage of braces pair location.
char *bracesStack; // temporary array for braces stack.
char _temp;

int main(int argc, char *argv[])
{
// Make sure file path always be specified.
if(argc &lt; 2)
return 0;

cell = calloc(memorySize, sizeof(char));

hInput = fopen(argv[1], &quot;r&quot;);

loadBFtoMemory(hInput);

braces = bracemap(programArray);

while(InstructionPointer &lt; charCount)
{
process(programArray[InstructionPointer]);
InstructionPointer++;
}

// printf(&quot;\n&quot;);

// for(i = 0; i &lt; 20; i++)
// printf(&quot;%d|&quot;, cell[i]);

// printf(&quot;\n&quot;);

free(programArray);
fclose(hInput);
return 0;
}

char *bracemap(char *program)
{
int i, start;
char *temp = calloc(charCount, sizeof(char));
stack_t tempStack = {NULL};

for(i = 0; i &lt; charCount; i++)
{
if(programArray[i] == ‘[‘)
{
push(&amp;tempStack, i);
start = i;
}
else if(programArray[i] == ‘]’)
{
int start = pop(&amp;tempStack);
temp[start] = i;
temp[i] = start;
}
}
return temp;
}

void process(char c)
{
switch(c)
{
case ‘+’:
cell[currentCell]++;
break;
case ‘-‘:
cell[currentCell]–;
break;
case ‘&gt;’:
currentCell++;
break;
case ‘&lt;’:
currentCell–;
break;
case ‘.’:
printf(&quot;%c&quot;, cell[currentCell]);
break;
case ‘,’:
cell[currentCell] = (char)getchar();
break;
case ‘[‘:
InstructionPointer = (cell[currentCell] == 0) ? braces[InstructionPointer] : (InstructionPointer);
break;
case ‘]’:
InstructionPointer = (cell[currentCell] == 0) ? (InstructionPointer) : braces[InstructionPointer];
break;
default: // Ignore other characters.
break;
}
}

void loadBFtoMemory(FILE *handle){
char c;
charCount = 0;
programArray = (char*) malloc((charCount + 1) * sizeof(char));
if(programArray == NULL)
printf(&quot;Memory allocation failed.&quot;);
else
{
c = fgetc(hInput);
while(c != EOF)
{
switch(c)
{
case ‘+’:
case ‘-‘:
case ‘&gt;’:
case ‘&lt;’:
case ‘.’:
case ‘,’:
case ‘[‘:
case ‘]’:
programArray[charCount++] = c;
realloc(programArray, (charCount + 1) * sizeof(char));
default:
break;
}
c = (char)fgetc(hInput);
}
}
}

int pop(stack_t *s){
stack_node_t *free_node;
int c;

free_node = s-&gt;top;
c = free_node-&gt;value;
s-&gt;top = free_node-&gt;next;
free(free_node);

return c;
}

void push(stack_t *s, int c){
stack_node_t *new_node;
new_node = (stack_node_t *) malloc(sizeof(stack_node_t));
new_node-&gt;value = c;
new_node-&gt;next = s-&gt;top;

s-&gt;top = new_node;
}
[/code]

How To Play Audio Directly From Your Arduino!

Dari segi kekuatan pemrosesan, Arduino memang terbilang minim: 16 MHz clock, 32 KB flash memory, 2 KB RAM (Arduino UNO). Meski minim kemampuan pemrosesan, arduino ternyata mampu melakukan hal-hal ajaib yang normalnya dikerjakan oleh development board papan atas. Hal ajaib ini salah satunya adalah memainkan file audio langsung dari memory flash-nya. Ntaps!

Normalnya supaya bisa memainkan file audio, Arduino harus dipasangi shield tambahan, seperti SD Card shield, atau boleh jadi shield audio player. Sehingga dengan begitu arduino hanya bertugas mengontrol audio playernya saja.

Namun bagi orang yang gemar eksperimen dan malas mengeluarkan uang, Arduino tidak boleh dibiarkan “nganggur” hanya mengatur-atur saja. Arduino harus dipekerjakan dengan keras!

Nah, untuk membuat arduino bisa memainkan file audio, kita bisa mengikuti tutorial yang disediakan di link berikut: http://playground.arduino.cc/Code/PCMAudio. Di bagian akhir disebutkan bahwa kita harus menyediakan file bernama sounddata.h yang berisi file audio kita. Nah loh, file header C kok isinya data audio?

Tenang, pada Arduino suara diproduksi menggunakan PWM (Pulse Width Modulation) yang frekuensinya bisa diatur dengan nilai 0-255. File header sounddata.h berisi urutan angka-angka yang nantinya dipakai untuk menghasilkan suara yang diinginkan.

Untuk menghasilkan angka-angka tersebut ternyata tidak sederhana juga, kita perlu program bernama wav2c. Program tersebut bertugas mengubah file audio wav yang kita miliki menjadi urutan angka-angka yang siap diupload pada Arduino.

Selain program wav2c, kita juga membutuhkan program sox. Sox ini berguna untuk memotong durasi file audio menjadi maksimal 10000 sampel (hanya beberapa detik). Oke, sebagai wrap-up, dan agar artikel ini mudah diikuti, saya sajikan tutorialnya dalam bentuk step by step:

  1. Pastikan sudah menginstalasi Audacity pada komputer Anda.
  2. Download program soxwav2c yang telah saya kostumasi khusus untuk Arduino di sini (link). Ekstrak ditempan yang aman.
  3. Buka audacity, pastikan Project Rate pada bagian kiri bawah diset pada 8000 Hz. Lakukan rekaman singkat. Dalam contoh ini saya coba merekam suara ucapan ‘test’:

    Project rate
    window test

  4. Potong file audio di bagian yang diperlukan saja.
    delete track
  5. Ubah tipe audio menjadi mono, dan hapus salah satu channel-nya:
    to mono
  6. Selanjutnya export file wav tersebut sebagai unsigned 8-bit PCM dan simpan di folder yang sama dengan program soxwav2c tadi.
    save
  7. Drag and drop file audio hasil export tadi ke convert.bat pada folder soxwav2c. Akan dihasilkan file sounddata.h
  8. Buat sketch baru pada Arduino IDE dengan program mengikuti http://playground.arduino.cc/Code/PCMAudio. Letakkan file sounddata.h bersama dengan file .ino yang dibuat pada folder yang sama.
  9. Hubungkan speaker biasa ke Pin 11 dan GND arduino. Akan terdengar suara ‘test’ setiap kali Arduino di-reset.

Selamat mencoba!