Selasa, 11 April 2017

Cara kirim data serial Dari Raspberry PI 3 ke Arduino (UART TX RX)


1. Siapkan Raspberry dan Arduino
2. Hubungkan kedua pin GPIO TR RX Raspberry dan Arduino nya secara silang (RX ke TX & TX ke RX) jangan lupa ground nya juga di pasang, lihat gambar di bawah ini:



3. Jika sudah hidupkan Raspberry, kemudian masuk ke terminal ketikkan nano /boot/cmdline.txt
ubah baris berikut :

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

menjadi

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

lalu save & simpan (ctrl X, Y, enter)

4. Reboot PI anda, serial UART sudah siap digunakan

Sabtu, 08 April 2017

Mengatur IP Address Statik di Raspberry Pi dengan OS Raspbian Jessie


Di Raspbian Jessie, pengaturan IP tidak lagi dilakukan melalui file konfigurasi /etc/network/interfaces, file tersebut hanya sebagai boneka dan akan ditimpa oleh file konfigurasi /etc/dhcpcd.conf. Maka dari itu, jika kita melakukan kesalahan atau konfigurasi trial and mumet pada file dhcpcd.conf maka /etc/network/interfaces juga akan terpengaruh.
Untuk melakukan pengaturan IP Address melalui file /etc/dhcpcd.conf, sebetulnya sangatlah mudah. Kita tinggal menyalin contoh konfigurasi yang ditampilkan pada panduannya. Sebagai contoh kasus, kita akan melakukan konfigurasi IP Address statik dan IP Address dinamis/DHCP pada interface eth0.

Mengatur IP Address Statik

Silahkan buka file konfigurasi dhcpcd.conf dengan perintah berikut:
$ sudo nano /etc/dhcpcd.conf
Kemudian geser ke bagian paling bawah file, lalu tambahkan baris-baris berikut:
?
1
2
3
4
interface eth0
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
Seperti yang terlihat, parameter tersebut akan mengaktifkan IP Address statik 192.168.0.10 pada interface eth0. Dan menambahkan rute jaringan (alamat router/gateway) ke 192.168.0.1. Jika kita tidak menginginkan adanya rute pada eth0, kita bisa menonaktifkan baris routers dengan menambahkan tanda # di depannya. Sehingga menjadi #static routers=192.168.0.1. Ini dilakukan jika router/gateway yang kita gunakan ada di interface yang lain, misal di wlan0. Jika tidak dimatikan, maka rute jaringan bawaan akan dialihkan ke eth0, sehingga jika kita menggunakan internet di wlan0 maka internetnya tidak akan bekerja.

Akses Raspberry Menggunakan Laptop/PC

Selain akses Raspberry Pi dengan mode shell dengan PC/Laptop, desktop Raspberry Pi juga bisa diakses secara remote melalui PC/Laptop. Umumnya Raspberry Pi dengan OS Debian sudah terinstal LXDE (Lightweight X11 Desktop Environment), sebuah tampilan desktop alternatif (selain GNOME, KDE, dll) yang sangat ringan dan menarik, tentunya cocok untuk komputer dengan kecepatan atau RAM yang rendah. Dengan menggunakan mode desktop, organisasi file, menjalankan aplikasi, atau main game akan menjadi mudah dan lebih interaktif, karena tidak perlu mengetik perintah-perintah seperti jika kita menjalankan Raspberry Pi pada mode shell (console). Ikuti langkah berikut:


  1. Untuk bisa mengakses Raspberry Pi dengan lingkungan desktop pada Laptop (Windows) saya lebih suka menggunakan MobaXterm. Untuk akses melalui PuTTY akan dibahas pada artikel berikutnya ðŸ˜‰ . Download dan instal programnya pada Laptop anda.
  2. Pada menu MobaXterm pilih Session – New Session, kemudian klik tab SSH.
  3. Isikan alamat IP Raspberry Pi pada kolom Remote Host. Pada kolom Specify Username isikan username untuk login Raspberry Pi (default: pi) atau boleh dikosongkan dulu. Port isikan 22.
  4. Kemudian aktifkan tab Advance SSH Setting. Centang X11 Forwarding (ini untuk memfordward tampilan dekstop Raspberry Pi). Centang Compression, dan pilih LXDE Desktop untuk pilihan Desktop environment. Klik OK.
    raspberry_desktop_setting
  5. Pada Session explorer akan muncul Session baru dengan nama alamat IP yang kita masukkan tadi. Klik dua kali untuk mengaktifkannya. Masukkan username dan password untuk login ke Raspberry Pi jika diminta.raspberry_desktop
  6. Tunggu sesaat dan akhirnya tampilan desktop Raspberry Pi muncul.

Membuat Script Python Berjalan Otomatis (Sebagai Service) Saat Booting

Untuk beberapa proyek saya membuat sebuah service/daemon menggunakan Python agar bisa mengontrol sistem secara keseluruhan dari jarak jauh, service ini juga akan berjalan otomatis ketika Raspberry Pi dinyalakan. Di Linux, lain distribusi lain juga caranya memulai dan menghentikan service (sekarang ini beberapa menggunakan Upstart, dan ada juga systemd). Saya sendiri menggunakan versi Jessie dari distribusi Raspbian di Raspberry Pi 2 saya, dan dalam kasus ini cara yang benar untuk melakukannya adalah dengan menggunakan sebuah "init script".
Letak dari init script adalah di folder /etc/init.d. Disana kamu bisa menemukan berbagai script yang misalnya, untuk menjalakan sistem jaringan atau server printer. Raspbian Jessie menggunakan sistem init yang termasuk lama, yaitu Sys V  yang artinya bahwa script-script tersebut dijalankan berdasarkan tautan simbolis (symbolic links) yang berada dalam folder /etc/rc.xDokumentasi dari Debian menjelaskan secara detil mengenai hal ini.
Dan langsung saja, init script yang akan dijabarkan berikut ini akan membuat script Python (atau script lainnya seperti Perl) bisa berjalan di latar belakang ketika Raspberry Pi dinyalakan. Perlu diingat, service berarti sebuah program yang berjalan di latar belakang tanpa memerlukan interaksi dengan pengguna. Maka dari itu service wajib berjalan dalam mode "daemon" yang mana sangat sulit dan rumit untuk diimplementasikan langsung pada bahasa pemrograman termasuk Python tanpa bantuan dari sisi sistem operasi, karena proses ini akan melibatkan teknik yang namanya forking proses sebanyak dua kali dan trik trik kotor lainnya.
Maka dari itu, kita bisa menggunakan fitur yang sudah ada yang juga sangat mudah untuk digunakan yaitu perintah start-stop-daemon yang telah menyediakan segala kebutuhan kita untuk bisa menjalankan script yang kita buat di latar belakang secara otomatis.
Pada contoh ini nama service saya adalah govindaservice, silahkan disesuaikan.
Buat file service dengan nama govindaservice.sh dan buat menjadi executable, chmod a+x govindaservice.sh
#!/bin/sh
### BEGIN INIT INFO
# Provides:          govindaservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Deskripsi singkat dari service
# Description:       Deskripsi lengkap dari service
### END INIT INFO
 
# Ganti 3 baris berikut untuk menyesuaikan dimana kamu menaruh script mu
# dan apa nama service yang kamu inginkan
DIR=/home/pi/govinda
DAEMON=$DIR/main.py
DAEMON_NAME=govindaservice
 
# Path yang diperlukan oleh script mu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/home/pi:/home/pi/bin:home/pi/govinda:/var/data/pi/govinda:/var/data/pi/bin
 
# Tambahkan opsi atau argumen command line disini jika service mu memerlukannya
DAEMON_OPTS=""
 
# Baris berikut menentukan apa user atau level user yang digunakan oleh script mu.
# Root umumnya tidak dianjurkan karena akan membuka celah keamanan, tapi root diperlukan
# jika script memerlukan akses ke sistem seperti penggunaan GPIO di Python
DAEMON_USER=root
 
# Proses ID dari script ketika ia berjalan akan disimpan disini
PIDFILE=/var/run/$DAEMON_NAME.pid
 
. /lib/lsb/init-functions
 
do_start () {
    log_daemon_msg "Memulai service $DAEMON_NAME daemon"
    #masukan perintah tambahan sebelum memulai service
    #misal
    #killall top
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
 
do_stop () {
    log_daemon_msg "Menghentikan service $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    #masukan perintah tambahan setelah menghentikan service
    #misal
    #killall main.py
    log_end_msg $?
}
 
case "$1" in
    start|stop)
        do_${1}
        ;;
     
    restart|reload|force-reload)
        do_stop
        do_start
        ;;
     
    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
     
    *)
        echo "Cara pakai: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;
 
esac
exit 0





start-stop-daemon perlu mengetahui dan mengenali proses yang berkaitan dengan service, tujuannya agar (1) dia bisa tahu kalau prosesnya sudah berjalan atau sedang berjalan sehingga dia tidak perlu menjalankannya lagi, dan (2) dia bisa menemukan proses yang telah berjalan tersebut dan mengakirinya ketika diminta. Dalam kasus ini yang menggunakan script Python maka nama prosesnya adalah "python" jadi menggunakan nama proses untuk mengenali proses mana yang dimaksud tidaklah mungkin karena proses lain yang juga dibuat menggunakan Python akan memiliki nama proses yang sama juga, dan ini akan jadi membingungkan dan berbahaya bila salah kill.
Solusinya kita membuat start-stop-daemon agar menyimpan PID (Id proses) menggunakan argumen --pidfile #PIDFILE --make-pidfile. Ketika diminta untuk menjalankan proses ia akan mencari file $PIDFILE yang pada script diatas akan menjadi /var/run/govindaservice.pid (pada Raspberry Pi aslinya terletak di /run/govindaservice.pid) karena adanya fitur tautan simbolis.
Selain itu, kita menggunakan flag --background dari start-stop-daemon untuk menjalankan script kita di background, "--chuid" untuk mengatur user yang menjalankan script (dengan "--user" untuk mencari script yang dijalankan oleh user tersebut ketika kita mencoba untuk menentukan jika ia sudah atau sedang berjalan) dan "--start" untuk menentukan apa yang ingin kita jalankan. Opsi dari start-stop-daemon diakhiri dengan double-hyphen dan kemudian kita menambahkan pada $DAEMON_OPTS jika terdapat parameter atau argumen yang harus dilewatkan ke daemon sendiri.
Ketika menghentikan daemon --retry10 berarti bahwa pertama dari semua tahap sinyal TERM dikirim ke proses, dan 10 detik kemudian ia akan memeriksa jika proses yang diminta untuk mati itu masih berjalan atau tidak dan jika masih ia akan mengirim KILL atau sinyal mati paksa (yang tentunya akan berhasil).

Menggunakan Init Script

Untuk bisa menggunakan script ini secara nyata, tempatkan script Python mu di tempat yang kamu suka dan pastikan ia bisa dieksekusi (dengan chmod 755 main.py atau chmod a+x main.py) dan juga jangan lupa mulai baris script dari main.py dengan menggunakan Python interpreter (misal #!/usr/bin/env python). Sunting init script sesuai keperluan mu.
Langkah selanjutnya adalah menyalin script service yang telah dibuat diatas ke /etc/init.d dengan sudo cp govindaservice.sh /etc/init.d. Sekali lagi pastikan govindaservice.sh juga sudah executable dan menggunakan UNIX line-endings. Terakhir untuk mengupdate database system-ctl jalankan perintah sudo sysctl reload. Pada titik ini kamu seharusnya sudah bisa menjalankan script Python mu menggunakan perintah sudo service govindaservice start, memeriksa statusnya dengan sudo service govindaservice status dan untuk menghentikan menggunakan sudo service govindaservice stop.
Terakhir untuk membuat Raspberry Pi menggunakan init script mu pada waktu dan urutan yang tepat, satu langkah terakhir ini sangat diperlukan: menjalankan perintah sudo update-rc.d govindaservice.sh defaults. Perintah ini akan menambahkan tautan simbolis dari service mu ke folder /etc/rc.x sehingga init scriptnya dijalankan pada waktu default saat start up atau ketika Raspberry Pi dinyalakan. Kamu bisa melihat tautan tersebut jika kamu menjalankan perintah ls -l /etc/rc?.d/*govindaservice.sh. Terkahir jangan lupa reload lagi dengan sudo sysctl reload. Restart dan coba lihat script mu berjalan otomatis!