RTL-SDR Software Defined Radio | Vlog

Saya iseng beli sebuah dongle DVB-T yang sekaligus bisa difungsikan sebagai SDR (Software Defined Radio). Dengan dongle yang menggunakan chipset RTL2832U ini saya bisa mendengarkan gelombang radio dari frekuensi 24-1700 MHz. Sebuah rentang yang sangat lebar. Detail mengenai RTL-SDR bisa dibaca di: RTL-SDR.com.

Iklan

C.H.I.P Radio Internet Versi 2

Baiklah, saatnya mendokumentasikan di blog. Ini masih tentang Internet Radio dengan C.H.I.P. Yang mana kali ini sedikit berbeda dengan yang sudah dituliskan sebelumnya (baca: Memanfaatkan C.H.I.P Sebagai Radio Internet, C.H.I.P Radio Internet Autostart, C.H.I.P Untuk Alarm Radio Internet). Kali ini saya menambahkan 3 tombol untuk mengganti channel, mengeraskan volume, dan mengecilkan volume.

Selain itu saya juga mengubah cara akses vlc. Kali ini menggunakan library Python-vlc sehingga lebih mudah pengaturannya. Dan saya menambahkan daftar channel radio internet.

CHIP Internet Radio
CHIP Internet Radio

Read More »

Membuat Tombol Shutdown di C.H.I.P

Selama ini saya menggunakan C.H.I.P secara headless yang artinya tanpa monitor, tanpa keyboard, tanpa mouse. Lalu bagaimana cara aksesnya? Bagaimana cara memprogramnya?

Untuk melakukan itu semua dibutuhkan bantuan komputer lain. Saya biasanya menggunakan laptop MacBook Air atau menggunakan Raspberry Pi dengan memanfaatkan ssh atau screen (serial).

Yang jadi masalah adalah CHIP ini sejatinya sebuah komputer juga. Dia memiliki sistem operasi yang lengkap dan kompleks juga. Untuk mematikannya tidak boleh asal cabut power atau menahan tombol reset sampai mati. Karena kalau begitu caranya, maka file system bisa corrupt. Atau bahkan merusak storage internalnya. Ini tentu berbeda dengan Arduino yang kalau mematikannya langsung dengan memutuskan power supply-nya.

Selama ini rada repot mematikan CHIP karena saya harus akses secara remote dulu (via ssh atau serial) baru kemudian menjalankan perintah shutdown. Nah hari ini saya belajar bahasa pemrograman Python dan akses GPIO. Jadi sekalian saja membuat tombol Shutdown. Caranya gampang banget. Tidak pake lama.

Pertama, buatlah tombol yang terhubung ke XIO-P7 dan GND. Jadi kalau tombol ini ditekan, maka XIO-P7 akan tersambung ke ground.

Kemudian buatlah script python test_shutdown.py. Isinya adalah sebagai berikut:

#!/usr/bin/python

import CHIP_IO.GPIO as GPIO
import subprocess

GPIO.setup("XIO-P7", GPIO.IN)


while True:
  if GPIO.input("XIO-P7") == 0:
    print "Shutting down..."
    subprocess.call(["sudo","shutdown","-h","now"])

Untuk menjalankannya harus pakai sudo karena akses ke GPIO dan perintah shutdown harus dilakukan oleh superuser.

sudo python test_shutdown.py

Oh iya, jangan lupa tambahkan bit execute supaya script bisa dijalankan tanpa mengetikkan python:

chmod +x test_shutdown.py
sudo ./test_shutdown.py

Coba tekan tombol tersebut. Apakah CHIP akan shutdown?

Belajar Bahasa Pemrograman Python

Dalam rangka mengoprek C.H.I.P (dan Raspberry Pi), lebih baik kita bisa bahasa pemrograman Python. Dulu saya pernah mencoba belajar Python dan Tkinter, tapi kok mentok. Sepertinya bahasa pemrograman Python tidak nyaman. Menurut saya terlalu kaku. Menurut saya loh ya? Mungkin bagi Anda tidak.

Saat ini ada 2 bahasa yang saya hindari. Pernah belajar dan merasa kalau kedua bahasa ini bukanlah bahasa yang perlu saya pelajari. Dan saya pun selalu mencoba menghindari kedua bahasa ini, yaitu Swift dan Python.

Tapi karena harus ngoprek CHIP/Raspberry Pi, maka saya pun memaksakan diri belajar bahasa Python. Kemarin saya masih berusaha menghindari belajar Python dan menggunakan script bash. Tapi ternyata lebih ribet, walau pun dari segi sintaks lebih bisa dipahami, hahaha…

Dan hari Minggu ini (dari pagi sampai malam) saya terpaksa belajar Python, walau pun saya belajar hanya yang saya perlukan. Saya belajarnya tidak sistematis, tidak runut, tapi mencari bahasan yang saya butuhkan. Misalnya menggunakan library, akses GPIO, akses file, operasi string, dll.

Dan akhirnya jadilah radio internet dengan 3 buah tombol. Tombol pertama untuk mengganti-ganti channel. Dua tombol berikutnya untuk mengecilkan dan membesarkan volume. Senang juga akhirnya bisa ngoprek CHIP. Ternyata tidak sulit kok. Dan gaya pemrograman saya nampaknya masih mengikuti gaya Arduino. Padahal sepertinya di Python bisa lebih efisien lagi.

Rencananya besok mau menambahkan tombol untuk mematikan dan menyalakan radio. Soalnya cara akses vlc di program saya ini berbeda dengan cara yang dipakai tempo hari untuk Alarm (Baca: CHIP Untuk Alarm Radio Internet). Dan juga bentrok dengan script penampilan jam. Besok saja deh menggabungkan script-nya.

Dengan demikian akses ke radio internet benar-benar tidak memerlukan remote access. Horeee…

Mengamati Utilisasi CPU & Memory CHIP

Tempo hari kita sudah berhasil memanfaatkan C.H.I.P sebagai radio internet (baca: C.H.I.P Radio Internet Autostart dan Memanfaatkan C.H.I.P Sebagai Radio Internet). Dan saya cukup senang bahwa kenyataannya CHIP ini bisa jadi alarm radio juga (baca: C.H.I.P Untuk Alarm Radio Internet). Tapi saya penasaran dengan berapa utilisasi CPU dan memory CHIP ketika digunakan sebagai radio internet.

Sebagai informasi singkat, CHIP memiliki 1 CPU ARMv7 yang memiliki clock 1 GHz dan RAM 512 MB. Sementara internal storage-nya 4 GB. CHIP sudah dipersenjatai koneksi Wi-Fi dan Bluetooth 4.0. CHIP memiliki 1 micro USB OTG dan 1 USB 2.0 ukuran standard. Kalau melihat bagian bawah board, maka akan ditemukan 1 port JST yang bisa disambungkan ke baterai. Asyiknya adalah USB OTG bisa digunakan juga untuk men-charge baterai.

Sedangkan untuk urusan penampilan bisa menggunakan monitor composite via jack TRRS. Jika diinginkan untuk penyambungan ke monitor VGA atau HDMI, maka CHIP menyediakan VGA/HDMI adapter yang bisa dibeli terpisah. Untuk informasi lebih lanjut silakan merujuk ke website resmi C.H.I.P.

Karena saya tidak memiliki adapter VGA/HDMI, maka urusan pemantauan utilisasi CPU dan memori bisa dilakukan via ssh dengan menggunakan aplikasi htop. Namun solusi ini tidaklah praktis karena harus menggunakan laptop untuk melihatnya.

Jadi saya pun menyambungkan LCD 16×2 I2C yang praktis sehingga urusan penampilan tidaklah merepotkan. Untuk koneksi bisa membaca artikel saya sebelumnya (baca: C.H.I.P Dengan LCD 16×2). Untuk library LCD 16×2 saya ambil dari artikel HOW TO SETUP AN I2C LCD ON THE RASPBERRY PI. Ambil library I2C_LCD_driver.py di situ.

Lalu saya pun menuliskan code yang memanfaatkan library ini untuk menampilkan utilisasi CPU, utilisasi memory, suhu CPU dan jam. Berikut adalah code-nya:

import I2C_LCD_driver
import time
import datetime
import psutil

formatDate1 = ' %a %d/%m/%Y'
formatDate2 = '%H:%M:%S {:5}\'C'
format1 = 'CPU {:3}% MEM {:2}%'

lcd = I2C_LCD_driver.lcd()

cat = lambda file: open(file, 'r').read().strip()

while True:
  namafile = "/sys/class/hwmon/hwmon0/temp1_input"
  temp = cat(namafile)
  temp = float(temp)/1000

  lcd.display_string(format1.format(int(psutil.cpu_percent()), int(psutil.virtual_memor$
  lcd.display_string(datetime.datetime.now().strftime(formatDate2).format(temp), 2)
  time.sleep(1)

Hasilnya cukup mengasyikkan. Pemantauan bisa independen, tidak tergantung laptop. Dan rupanya CHIP sudah cukup powerfull dan stabil jika digunakan sebagai radio internet. Lihat saja hasil pemantauannya yang saya upload di instagram.

C.H.I.P Dengan LCD 16×2

Saat masih mentok ngoprek TouchRadio, saya pun melirik C.H.I.P yang teronggok manis di meja. Tempo hari CHIP ini saya konfigurasi sebagai Radio Internet. Saat saya nyalakan ternyata radio internet-nya berjalan dengan baik. Lalu saya ingin ngoprek CHIP ini lebih lanjut. Misalnya dengan menambahkan LCD 16×2 yang kebetulan saya masih punya stock 1 buah. Jadi saya pun menyambungkannya.

Asyiknya adalah karena header CHIP sudah ada tulisannya. Jadi gampang tahu pin mana yang dituju. Berbeda dengan Raspberry Pi yang header-nya tidak ada tulisannya. Jadi harus menghitung untuk mendapatkan pin yang benar.

Oh iya, saya menggunakan LCD 16×2 dengan backpack I2C sehingga lebih praktis. Cukup menggunakan 2 pin untuk komunikasi dengan CHIP. Berikut adalah koneksinya:

LCD i2c CHIP
VCC 5V
GND GND
SDA TWI1 SDA
SCL TWI1 SCK

Tuh kan gampang nyambungnya? Selanjutnya adalah code-nya. Silakan merefer ke: CHIP I2C LCD Project. Atau langsung download contoh source code-nya: lcd_i2c.py. Setelah itu bisa kita sesuaikan dengan kemauan kita, mau dipakai untuk menampilkan apa.

View this post on Instagram

Tinggal nambahin tombol utk ganti channel.

A post shared by Emanuel Setio Dewo (@setiodewo) on

Sepertinya bener-bener bisa dijadikan radio internet yang keren. Kita bisa menambahkan beberapa tombol. Misalnya tombol mode yang bisa mengganti mode tampilan: mode radio (menampilkan channel dan volume), mode monitoring (suhu, kelembaban, tanggal dan jam), mode system (menampilkan IP, suhu CPU dan utilitas CPU), dan banyak lagi.  Tombol kedua bisa digunakan untuk mengganti-ganti channel radio. Sedangkan untuk volume bisa menggunakan PAM8403 yang sudah build in potensiometer volume. Kebetulan ada stock-nya, hehehe…

Pasti bisa keren ya? Apalagi kalau diberi casing yang keren.

Kehabisan Memori Arduino Uno

Jadi ceritanya saya mau meneruskan ngoprek TouchRadio seperti yang sudah saya tuliskan sebelumnya di “Mendesain User Interface Radio FM Touchscreen.” Dan ternyata saya kehabisan memory utk program. Saya baru sadar kalau Arduino Uno memiliki memory untuk kode yang sangat kecil, cuma 32 Kb. Ups… saya jadi teringat pernah mengalami coding untuk ATMega8 dan ATTiny85/84 yang juga punya memory sangat kecil. Dan berakhir mentok juga. Memory yang kecil memang sangat membatasi kreativitas, hehehe…

Solusi paling keren ya pakai Arduino Mega yang punya memory 256 Kb. Tapi konsekuensinya ya jadi membesar board-nya. Atau menggunakan Wemos D1 Mini yang punya 4 Mb dan punya clock jauh lebih cepat. Tapi Wemos D1 Mini kekurangan pin untuk display TFT 2.8″ Touchscreen. Kecuali jika menggunakan OLED I2C yang hemat pin. Dan sebenarnya saya punya stock-nya. Tapi berarti tidak touchscreen, hiks…

Sejatinya saya memang suka pakai Wemos D1 Mini yang lebih banyak memory, lebih cepat, dan sudah punya modul WiFi. Lebih bisa dikembangkan lebih jauh, seperti pengendalian dari network, dll. Dan tentu saja karena ukurannya sangat kecil dan lebih hemat energi. Tapi ya itu tadi, kekurangan pin untuk menggunakan display TFT Touchscreen.

Di lain pihak, saya memang mengakui kalau saya tidak menyadari sejak awal coding kalau Uno ini terbatas memory-nya. Jadi saya codingnya ngasal. Maksudnya ngasal ini adalah karena saya menggunakan banyak variabel dan konstanta. Dan saya banyak menggunakan perhitungan saat menggambar sesuatu. Ambil contoh:

#define MAX_HEIGHT 240
#define MAX_WIDTH 320
#define RADIUS 20

void tombol_on(boolean pressed) {
  tft.drawCircle(MAX_WIDTH/2, MAX_HEIGHT/2, RADIUS, BLACK);
}

Mestinya kan tidak perlu dijadikan konstanta max_height, max_width, radius, offset, dan lain-lain. Dan saat menggambarkan tidak perlu melakukan operasi matematis seperti max_width/2, dll. Karena angka-angka ini sudah diketahui, absolute, atau tidak relatif. Mungkin relatif itu diperlukan jika ada animasi atau pergerakan. Tapi ini kan tidak. Jadi saya rada boros dalam coding. Gubrak…

Seharusnya bisa lebih praktis lagi. Harus dioptimasi code-nya. Tapi saya sudah terlanjur menulis panjang lebar dan malas meng-optimasinya. Hahaha…

Ah besok lagi saja optimasinya. Toh versi minimalnya sudah berhasil jalan dengan baik, hehehe…