Showing posts with label GPIO. Show all posts
Showing posts with label GPIO. Show all posts

Sunday, 18 March 2018

Pull-Up dan Pull Down Resistor

Pull-Up dan Pull-Down resistor adalah penambahan resistor pada I/O MCU (Microcontroller unit), yang membedakan antara Pull-up dan Pull-down adalah penempatan resistor pada kutup arus listrik, juga pada input.

Untuk Pull-up resistor, salah satu kaki resistor dihubungkan ke kutub Vcc (5v/3.3v pada RasPi), sedangkan kaki resistor yang lain dicabangkan, satu ke pin input MCU, dan yang lain ke switch on/off untuk disambungkan ke ground (0V).
Rangkaian Pull-Up

Pada gambar diatas kita bisa lihat, Vcc tersambung ke pin, sehingga pin akan mendapatkan signal HIGH, dan ketika push button ditekan, arus Vcc akan mengalir ke ground (0v), sehingga pin akan mendapat signal LOW. Kondisi ini mirip (tidak sama) dengan kondisi "normaly close".

Sedangkan Pull-down resistor, salah satu kaki resistor dihubungkan ke kutub ground (0v), sedangkan kaki resistor yang lain dicabangkan, satu ke pin input MCU, dan yang lain ke switch on/off untuk disambungkan ke Vcc (5v/3.3v).

Rangkaian Pull-Down

Pada rangkaian pull-down, Vcc tidak terhubung dengan pin, tetapi pin terhubung dengan ground (0v),
pin dalam keadaan LOW, dan ketika push button ditekan, Vcc akan terhubung dengan pin, kondisi pin sekarang menjadi HIGH. Rangkaian ini mirip dengan kondisi "normally open".

Kegunaanya adalah untuk menstabilkan signal antara HIGH atau LOW yang akan diterima pin lebih akurat. Bila kita tidak menggunakan rangkaian pull-up atau pull-down, signal yang akan terbaca pada pin akan berubah-ubah. Kondisi yang berubah-ubah ini disebut floating.

Kondisi floating ini terjadi karena pin input tidak terhubung ke salah satu kondisi (Vcc atau 0v) yang menjadi dasar pin input mengetahui statusnya HIGH atau LOW. Status HIGH diperoleh bila pin input terhubung dengan Vcc, dan status LOW diperoleh bila pin terhubung dengan ground (0v). Karena pin tidak terhubung dengan salah satu kondisi tersebut, kondisi pin menjadi floating, karena pada pin tersebut memiliki listrik juga, sehingga pin dapat terbaca HIGH karena listriknya sendiri, dan LOW karena pin tersebut juga terhubung ke ground secara internal menggunakan resistor (1MOhm).

Lihat gambar di bawah ini:


Bila kita tekan push button 1, maka pin akan menghasilkan LOW, bila kita tekan push button 2 maka pin akan menghasilkan HIGH. Bila pin tidak terhubung kesalah satu syarat tersebut, pin akan menghasilkan HIGH dan LOW tidak terkendali, karena didalam MCU, pin terhubung dengan Vcc dan ground. Gambar MCU yang terhubung dengan Vcc dan Ground diilustrasikan secara kasar, gambar tersebut hanya untuk menerangkan kondisi floating saja.

Pada prinsipnya antara Pull-up dan Pull-down adalah sama, Pull-up adalah menghubungkan pin dengan Vcc yang dijembatani resistor, dan Pull down adalah menghubungkan pin dengan 0v yang dijembatani oleh resistor. sehingga pin akan selalu terhubung dengan ground (0v) atau Vcc setiap saat.

Besar tahanan pada resistor secara kasar menggunakan 10kΩ-20kΩ baik untuk pull-up maupun pull-down dengan voltase 3.3v. Bila tahanan resistor terlalu besar (1MΩ) pada pull-up resistor kemungkinan pin tidak akan mendapatkan kondisi HIGH, karena arus listrik didapatkan terlalu kecil. Perlu diketahui juga rangkaian pin pada MCU terhubung ke ground (0v) dengan menggunakan resistor 1MΩ.

Sekarang kita coba hitung arus yang akan diterima pin (hukum Ohm) dengan menggunakan resistor 10kΩ-secara umum:

V = I R
dimana V adalah Vcc yang akan mengaliri listrik ke pin (5v atau 3.3V)
R adalah tahanan resistor 10kΩ(voltase 5v untuk input tidak direkomendasikan, gunakan 3.3v untuk input pin Raspi)
Jadi 
I = V / R
I = 5v / 10.000Ω
I = 0.0005 A atau 0.5mA

Atau kita ingin memberikan arus listrik ke pin sebesar 1mA, dengan menggunakan tegangan 3.3v

V = I R
R = V / I
R = 3.3 / 0.001
R = 3300 atau 3.3kOhm

Harap diingat satuan unit yang digunakan rumus diatas untuk V adalah volt, I adalah amper (bukan miliamper) dan R adalah Ω (Ohm bukan kilo atau mega Ohm) jadi bila satuan unit berbeda, kita harus mengkonversikannya dahulu.

Besarnya arus listrik yang direkomendasikan mengalir ke pin, secara resmi dari produsen Raspberry Pi, tidak saya temukan. Kata rekomendasi arus listrik untuk pin di blog ini berdasarkan pengalaman dan informasi dibeberapa forum terkait.

Kondisi HIGH dan LOW ini tidak selamanya benar, dengan 3,3v - 5v akan memberikan input HIGH atau 1, dan bila 0v akan memberikian input LOW atau 0. Ini disebabkan tiap MCU memiliki standar yang berbeda-beda. Contoh datasheet untuk TTL 7400 series dibawah ini:

Pada table diatas yang masih 1 familly TTL 7400 memiliki perbedaan yang berbeda pada arus listrik yang digunakan, walaupun pengguna voltase yang sama.

Jadi kondisi HIGH dan LOW voltase (V) dan arus listrik (I) berbeda pada antara TTL (transistor-transistor logic) sehingga antara RasPi dan Arduino, kemungkinan akan lain kondisinya. Baca lagi datasheetnya.

Untuk menggali lebih dalam kondisi HIGH dan LOW, kita asumsikan 3.3v/5v adalah kondisi voltase HIGH, dan 0v adalah kondisi voltase LOW. Diantara 0v-3.3v/5v ini ada 3 bagian kondisi yang berbeda, yaitu:

  1. 0v sampai LOWmax volt adalah kondisi LOW
  2. LOWmax volt sampai HIGHmin volt adalah kondisi floating
  3. HIGHmin volt sampai 3.3v/5v adalah kondisi HIGH
Nilai LOWmax volt dan HIGHmin volt ini yang harus kita ketahui, untuk menentukan HIGH tegangan minimun dan LOW tegangan maksimal. Kurang lebih gambarnya seperti dibawah ini:
Kita akan mencari nilai floating dengan asumsikan lagi Vcc HIGHmin adalah 2v, 50µA  dan Vcc LOWmax adalah 0.8v, -2mA menurut salah satu type TTL table diatas.

RHIGHmax = (Vcc - VHIGHmin) / IHighmin
RHIGHmax = (3.3v - 2v) / 0.00005
RHIGHmax = 26000Ω
RHIGHmax 26kΩ

RLOWmin = (Vcc-VLOWmax)/ILOWmax
RLOWmin = (3.3v - 0.8) / 0.000002
RLOWmin = 1250000Ohm 
RLOWmin = 1.25MΩ

Kesimpulanya berdasarkan data seperti itu (data dari asumsi, bukan sesungguhnya pada RasPi atau Arduino) dengan menggunakan resistor 26kΩ sampai 1.25MΩ kita masuk ke area floating. Kurang dari 26kΩ masuk kondisi HIGH, lebih dari 1.25MΩ masuk kondisi LOW.

Saturday, 17 March 2018

RasPi Library GPIO WiringPi (Core Function, Raspberry Pi Specifics dan Timing)

Dengan menggunakan wiringPi yang juga dapat digunakan dengan command line, dengan cara kita meninstall progamnya dahulu sehingga kita bisa menggunakan wiringPi ini dari shell script. untuk menginstalnya bisa dilihat di https://kepython.blogspot.co.id/2018/03/raspberry-pi-install-wiringpi.html .

Untuk RasPi ada function khusus yang bukan merupakan core dari wiringPi, tapi dapat bertindak pada RasPi hardware, dan ada beberapa function yang dapat digunakan bila menggunakan hardware modul.
Function-function tersebut adalah:
  • void digitalWriteByte(int value);
  • pwmSetMode (int mode);
  • pwmSetRange (unsigned int range);
  • pwmSetClock (int divisor) ;
  • piBoardRev (void) ;
  • wpiPinToGpio (int wPiPin) ;
  • physPinToGpio (int physPin) ;
  • setPadDrive (int group, int value) ;


void digitalWriteByte (int value) ;

Function yang menulis (write) 8 bit byte pada 8 gpio pertama, yang merupakan cara cepat untuk menset 8 bit secara langsung dengan nilai tertentu.

pwmSetMode (int mode) ;

Dengan PWM merupakan optional mode, yaitu balance dan mark:space. Mark:space adalah mode tradisional, dan pada default rasPi adalah balance. Kita bisa mengganti mode ini mengan parameter: PWM_MODE_BAL atau PWM_MODE_MS.

pwmSetRange (unsigned int range) ;

Untuk mengatur registrasi PWM, default 1024

pwmSetClock (int divisor) ;

Setting pembagi PWM clock. PWM control tidak bisa digunakan pada Sys mode (untuk lebih lanjut silahkan pelajari Broadcom ARM peripherals manual)

piBoardRev (void) ;

Hasil dari perintah ini adalah informasi tentang revisi board RasPi. Ada beberapa fungsi pin di BCM_GPIO yang berbeda pada revisi yang beda.

wpiPinToGpio (int wPiPin) ;

Mengembalikan (return) nomor pin BCM_GPIO yang diberikan oleh wiringPi.

physPinToGpio (int physPin) ;

Mengembalikan (return) nomor BCM_GPIO pin yang disupply pin fisik pada konektor P1. 

setPadDrive (int group, int value) ;

Untuk mensetting driver pad pada group pin. Ada 3 group pin dan ukuran drive antara 0-7.
JANGAN SENTUH FUNCTION INI, KECUALI KITA TAHU APA YANG SEDANG KITA KERJAKAN. TIDAK UNTUK COBA-COBA TANPA TAHU MAU KEMANA TUJUANNYA.


Core Function

Function-function ini bekerja langsung pada RasPi dan juga GPIO ekternal module seperti GPIO expander dan lain-lain, tapi tidak semua modul disupport dengan semua function.

Core function:


  • void pinMode (int pin, int mode) ;
  • void pullUpDnControl (int pin, int pud) ;
  • void digitalWrite (int pin, int value) ;
  • void pwmWrite (int pin, int value) ;
  • int digitalRead (int pin) ;
  • analogRead (int pin) ;
  • analogWrite (int pin, int value) ;


  • void pinMode (int pin, int mode) ;
    GPIO setting untuk INPUT, OUTPUTM, PWM_OUT atau GPIO_CLOCK.

    PWM_OUTPUT  hanya untuk pin 1 (wiringPi) atau pin 18 (BCM), dan
    GPIO_CLOCK untuk pin 7 (wiringPi) atau pin 4 (BCM).

    Function ini tidak bekerja pada mode Sys, bila kita ingin mengubah pin mode kita harus menggunakan program gpio sebelum menjalankan program.

    void pullUpDnControl (int pin, int pud) ;
    Ini adalah mode pull-up atau pull-down resistor pada pin. Harusnya function ini digunakan untuk input pin. RasPi memiliki fungsi pull-up dan pull-down resistor secara internal.
    Parameter int pud ditulis

    • PUD_OFF, tidak menggunakan fungsi pull-up ataupun pull-down secara internal
    • PUD_DOWN, input tersambung dengan ground menggunakan 50kΩ resistor secara internal
    • PUD_UP, input tersambung dengan vcc 3.3v, juga mengguanakan 50kΩ resistor secara internal
    Function ini tidak memberikan efek ketika kita berada di Sys mode, kita harus masuk ke program gpio terlebih dahulu sebelum program dijalankan.

    void digitalWrite (int pin, int value) ;
    Untuk pin yang telah diset sebagai OUTPUT, kita menset pin on (HIGH, atau 1) dan off (LOW, atau 0). WiringPi akan menset semua angka selain 0 (nol) sebagai HIGH. Hanya 0 (nol) yang diartikan sebagai LOW.

    void pwmWrite (int pin, int value) ;
    Setting pin registrasi PWM. RasPi memiliki hanya 1 (satu, sejauh ini sampai RasPi3) pin pada board-nya yaitu pin BCM_GPIO 18. yang bernilai dari 0 - 1024.

    Juga tidak berkerja pada Sys mode. 

    int digitalRead (int pin) ;
    Function ini membaca (return) value dari pin input. Hasilnya adalah HIGH (1) atau LOW(0), tergantung dari level logic pin tersebut.

    analogRead (int pin) ;
    Pembacaan pin input pada input pin analog. Kita harus menambahkan register analog modul untuk menggunakan function ini pada device seperti Gertboard, quick2Wire analog board, dan sebagainya.

    analogWrite (int pin, int value) ;
    Pemberian signal untuk analog output. Kita harus menambahkan register analog modul untuk menggunakan function ini pada device seperti Gertboard, quick2Wire analog board, dan sebagainya.


    Timing

    Ada beberapa function timing yang dapat kita gunakan:

    • unsigned int millis (void)
    • unsigned int micros (void)
    • void delay (unsigned int howLong)
    • void delayMicroseconds (unsigned int howLong)

    unsigned int millis (void)
    Function ini memberikan return yang menunjukan waktu dengan unit millidetik dengan 32 bit sehingga kita memiliki waktu 49 hari.

    unsigned int micros (void)
    Function ini sama seperti millis,tapi return yang menunjukan waktu dengan unit mikrodetik dengan 32 bit sehingga kita memiliki waktu 71 menit.

    void delay (unsigned int howLong)
    Function ini menyebabkan program akan berhenti dengan unit waktu millidetik. Dengan Linux multitasking waktu tidak seakurat yang kita inginkan, akan terlambat. Maksimum delay menggunakan unsigned 32 bit integer, 49 hari delay yang bisa kita gunakan.

    void delayMicroseconds (unsigned int howLong)
    Function ini sama seperti delay,tapi menyebabkan program akan berhenti dengan unit waktu mikradetik. Dengan Linux multitasking waktu tidak seakurat yang kita inginkan, akan terlambat. Maksimum delay menggunakan unsigned 32 bit integer, 71 menit delay yang bisa kita gunakan.


    Penundaan di bawah 100 mikrodetik menggunakan loop yang terus menerus menggunakan waktu sistem, Penundaan lebih dari 100 mikrodetik dapat dilakukan dengan menggunakan fungsi nanosleep sistem (Anda mungkin perlu mempertimbangkan implikasi penundaan yang sangat singkat terhadap keseluruhan kinerja sistem , terutama jika menggunakan thread.

    wiringPi updated ke 2.46 untuk new Pi v3+ (Pi3 model B+)

    Pada tanggal 14 Maret 2018, RasPi mengeluarkan Raspberry Pi 3 Model B+, the Pi v3+, setelah 2 tahun umur RasPi 3 Model B keluar, yang telah terjual sebanyak 19 juta unit totalnya diseluruh dunia. RasPi 3 B+ ini merupakan produk pertama yang menggunakan 64 bit, dan juga memiliki fitur pertama dengan koneksi wireless yang terintergrasi.



    Raspberry Pi 3 B+ ini dijual pertama kali nya dengan harga $35 (harga yang sama dengan Raspberry Pi sebelumnya) dengan speksifikasi sebagai berikut:

    • 1.4GHz 64-bit quad-core ARM Cortex-A53 CPU
    • Dual-band 802.11ac wireless LAN and Bluetooth 4.2
    • Faster Ethernet (Gigabit Ethernet over USB 2.0)
    • Power-over-Ethernet support (with separate PoE HAT)
    • Improved PXE network and USB mass-storage booting
    • Improved thermal management

    Penambahan yang tidak jelek (berharap banyak banget nih), untuk penambahan plus (+) dibelakang nama produk.

    update dari wiringPi. Untuk wiringPi ada sedikit update, walaupun versi 2.44 tanpa update wiringPi masih dapat bekerja normal, hanya saja ketika command readall akan terganggu, karena board rev yang belum terdaftar diantara list-nya.

    Jika ingin update paket .deb bisa menggunakan:

    cd /tmp
    wget https://unicorn.drogon.net/wiringpi-2.46-1.deb
    sudo dpkg -i wiringpi-2.46-1.deb

    dan md5sum :5c540b1426381bc598ea48b55f39c091

    Friday, 9 March 2018

    C IR Obstacle avoidance Sensor

    Fungsi dari IR Obstacle Sensor untuk mendeteksi halangan/sesuatu yang menghalangi sensor ini menggunakan pantulan cahaya infrared. Cara kerjanya, ketika ada objek menghalangi sensor pada jarak tertentu (mulai dari 2cm sampai 500cm. Tidak semua model dapat mencapai 500cm, tergantung dari specifikasi.) , objek ini akan memantul cahaya infrared dari IR transmitter, dan ditangkap oleh sensor receiver. Ketika objek tidak ada atau jarak yang tidak dijangkau oleh transmitter, maka tidak ada pantulan cahaya, receiver tidak memberikan signal. Sebaliknya jika ada benda atau objek yang dipantulkan, sehingga receiver medapatkan sinar pantulan, maka receiver memberikan signal.Potensio meter yang terdapat pada sensor adalah untuk mengatur seberapa jauh atau dekat objek yang bisa dideteksi.

    IR Obstacle avoidance Sensor 




    Illustrasi cara kerja IR Obstacle avoidance Sensor 



    Sensor ini sangat baik bila kondisi lapangan dalam keadaan gelap sekalipun dan memiliki kestabilan respon yang baik.

    Spesifikasi sensor pada umumnya:
    Tegangan operasi 3V - 5V
    Jarak yang dapat dicapai 2cm - 30cm (untuk sensor tertentu dapat sampai 500cm)
    Arus listrik 3.3V ~23mA dan 5V ~43mA
    Effective angle 35° 
    Temperatur kerja -10°  +50°
    Berkeja pada 38kHz


    Kode berupa .txt dapat didownload disini

    #include <wiringPi.h> //function wiringPi
    #include <stdio.h> //function stdio

    #define PIN 6 // konstanta wiringPi GPIO 6


    void TerhalangObjek()
    {
    printf("Ada objek menghalangi\nBuat bikin baris kedua \n\n");
    }

    void ReadData()
    {
    while(1)
    {
    wiringPiISR(PIN, INT_EDGE_FALLING, & TerhalangObjek);
    printf("Tidak ada halangan\n");
    }

    }

    int main ()
    {
    wiringPiSetup();
    pinMode(PIN, INPUT);
    ReadData();
    return 0;
    }

    Kode berupa .txt dapat didownload disini

    Ketika sensor membaca ada benda yang menghalangi, kita bisa ubah jaraknya dengan mengatur tingkat sensitif sensor pada potensiometer IR Transmitter tapi sebaiknya potensiometer IR Receiver tidak diubah, karena potensiometer ini untuk mengubah frekwensi infrared, dan bisanya sudah diset pada frekwensi yang tepat. Jadi buat apa dipasang potensiometer disitu? Potensiometer tersebut berguna bila ada sumber infrared lain yang bisa menggangu sensor receiver.

    Satu lagi yang penting untuk diketahui, bila diperhatikan pada PCB sensor, ada jumper disana. Jumper ini untuk mengedipkan IR LED secara terus-menerus pada 38kHz. Bila kita tidak menggunakan kaki keempat (4) yaitu EN (enable, posisi kaki ada pada kaki yang tidak kita pakai, sebelah kanan kaki tempat input pin, yang paling kanan gampangnya) Jumper ini harus dipasang. Ketika jumper dicopot, pin 4 pada 555 timer akan tertahan pada posisi LOW  (reser) oleh resistor R3, sebuah resistor pull-down 22K. Untuk mengaktifkannya kita harus memberi kondisi HIGH pada pin EN ini, sehingga 555 timer akan bergerak lagi. Pin EN tidak dapat digunakan ketika jumper dipasang.


    Monday, 5 March 2018

    C Raspberry Pi DHT11 Thermal & Humidity Sensor

    Sensor ini dipasaran ada beberapa jenis DTH11, 2 (dua) jenis yang paling umum seperti gambar dibawah ini, tetapi semuanya sama saja.
    yang pertama DTH11 dengan resistor
    yang kedua DTH 11 tanpa resistor



    Kira kira begitulah barangnya, DTH11 yang menggunakan resistor ditempatkan pada sebuah pcb, dan mempunyai 3 (tiga) kaki, resistor ditempatkan pada bagian kiri (mungkin juga ada yang dikanan, atas, atau bawah, mungkin), pada DTH11 tanpa resistor, adalah barang itu sendiri dengan 4 (empat) kaki, dimana salah satu kaki nya tidak digunakan (lalu buat apa dibikin kaki?).

    DTH11 dengan resistor atau tidak bukan masalah, karena kita bisa menambahkan sebuah resistor sebesar 10kΩ pada kaki signal pada DTH tanpa resistor.

    Data sheet DTH11 ini kita bisa mengetahui spesifikasinya:

    Ultra low cost 
    3 to 5V power and I/O 
    2.5mA max current use during conversion (while requesting data) 
    Good for 20-80% humidity readings with 5% accuracy 
    Good for 0-50°C temperature readings ±2°C accuracy 
    No more than 1 Hz sampling rate (once every second) 
    Body size 15.5mm x 12mm x 5.5mm 
    4 pins with 0.1" spacing

    Soal harga sudah bukan masalah lagi (karena sudah dibeli)
    Tegangan yang direkomendasikan adalah 3 sampai 5V dan I/O ( dan I/O? apaan tuh?)
    Arus max 25mA, ketika kita meminta data
    Baik digunakan pada kelembaban 20 - 80% dengan akurasi 5%
    Baik digunakan pada suhu 0 - 50°C  dengan akurasi  ±2%
    Data sampling tidak sampai 1 Hz (satu siklus dalam 1 detik, belajar fisika SMA lagi buat yang lupa)
    Ukuran Body 15.5mmx12mmx5.5mm (padahal lagi cari yang 36 x 32 x38).
    Memiliki 4 pin dengan jarak 2.54mm (tapi koq ada 1 pin yang tidak digunakan? buat apa?)


    Sepertinya dengan gambar diatas langsung jelas apa gunanya dan dimana harus diletakan kaki-kakinya.

    Tapi tidak salah bila saya jelaskan:
    Kaki Vcc jelas harus disambungkan kemana ( 3,3V atau 5V) bila DTH11 tidak memiliki resistor, bisa ditambahkan resistor dikaki yang ini.
    Kaki Signal disambungkan ke resistor dan pin I/O Raspberry Pi (lihat gambar, jangan salah merangkai komponen, bisa mengakibatkan pin Raspberry Pi jebol)
    Kaki Ground disambungkan ke 0V


    (Gambar diambil dari adafruit.com)

    (Lha koq gambar arduino? tidak masalah, rangkaiannya sama aja)
    (ya udah gitu dhe gambarnya)

    Keterangan gambar:
    kabel hijau (atas)/ biru (bawah) hubungkan ke pin I/O Raspberry Pi
    kabel merah hubungkan ke Vcc (3,3V atau 5V)
    kabel hitam hubungkan ke ground (0V)

    Jadi salah satu ujung resistor disambungkan ke Vcc, dan ujung yang lain ke kaki signal. Dari kaki resistor yang terhubung ke signal ini juga dihubungkan ke Pin I/O Raspberry Pi.

    Untuk DHT11  yang telah menggunakan resistor, dapat menghubungkan semua kaki-kaki DHT11 langsung.



    Setelah rangkaiannya selesai, sekarang kita buat programnya:
    Ada function2 yang mempermudah kita untuk mengambil data dari DTH, yaitu dengan wiringPi.
    untuk mendapatkannya dan panduan installasinya  klik disini.

    #include <wiringPi.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>

    #define MAX_TIMINGS 85
    #define DHT_PIN 6 /* GPIO11 */

    int data[5] = { 0, 0, 0, 0, 0 };

    void read_dht_data()
    {
    uint8_t laststate = HIGH;
    uint8_t counter = 0;
    uint8_t j = 0, i;

    data[0] = data[1] = data[2] = data[3] = data[4] = 0;

    pinMode( DHT_PIN, OUTPUT );  //Set pin 6 menjadi output
    digitalWrite( DHT_PIN, LOW );    //Set pin 6 off
    delay( 18 );                                       // stop sementara

    pinMode( DHT_PIN, INPUT );     //Set pin 6 menjadi input

    for ( i = 0; i < MAX_TIMINGS; i++ )  // cek data dari signal
    {
    counter = 0;
    while ( digitalRead( DHT_PIN ) == laststate )  // jika data masih sama
    {
    counter++;
    delayMicroseconds( 1 );    
    if ( counter == 255 )
    {
    break;
    }
    }
    laststate = digitalRead( DHT_PIN );   // menyimpan data baru 

    if ( counter == 255 )
    break;

    /* 3 signal pertama tidak perlu dibaca */
    if ( (i >= 4) && (i % 2 == 0) )
    {
    /* signal bit dimasukan dalam byte*/
    data[j / 8] <<= 1;
    if ( counter > 16 )
    data[j / 8] |= 1;
    j++;
    }
    }

    /*cek bila signal yang masuk memiliki 40 bit (8bit x 5) + verifikasi byte terakhir 
        mencetak data lengkap, bila tidak beri peringatan */
    if ( (j >= 40) &&
         (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
    {
    float h = (float)((data[0] << 8) + data[1]) / 10;
    if ( h > 100 )
    {
    h = data[0]; // for DHT11
    }
    float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
    if ( c > 125 )
    {
    c = data[2]; // for DHT11
    }
    if ( data[2] & 0x80 )
    {
    c = -c;
    }
    float f = c * 1.8f + 32;
    printf( "Kelembaban udara = %.1f %% Temperatur = %.1f *C (%.1f *F)\n", h, c, f );
    }else  {
    printf( "Data tidak valid\n" );
    }
    }

    int main( void )
    {
    printf( "Raspberry Pi Test Semsor DHT11 Temperatur dan Kelembaban Udara\n" );

    if ( wiringPiSetup() == -1 )
    exit( 1 );

    while ( 1 )
    {
    read_dht_data();
    delay( 2000 ); /* tunggu 2 detik sebelum membaca signal baru */
    }

    return(0);
    }

    Download kode diatas berupa .txt  klik disini

    Lalu kita compile dengan:

    cc -Wall dht.c -o dht -lwiringPi
    ./dht

    atau

    gcc -o dht dht11.c -lwirinngPi
    ./dht

    Compile menggunakan Geany:
    Compile dan Build pada Geany, kita harus menambahkan perintah -lwiringPi pada compile dan built-nya. Dengan cara menu Build > Set Built Command .
    Lalu kita tambahkan perintah -lwiringPi pada bagian akhir dikolom compile dan built




    dan klik OK.

    Misalkan suatu hari nanti kode kita tidak memerlukan function wiringPi (pada program tidak ada #include <wiringPi>, akhiran -lwiringPi pada compiler dan built boleh dihapus.

    Saturday, 3 March 2018

    Raspberry Pi Install wiringPi

    Update untuk wiringPi Raspberry Pi 3 Model B+ 

    Wiring Pi adalah library pin GPIO raspberry pi yang ditulis dengan C untuk BCM2835, BCM2836 dan BCM2837 SoC yang dapat digunakan oleh C, C++ dan RTB (BASIC), dan katanya bisa juga dipakai oleh beberapa program lainnya (saya tidak begitu tahu soal itu).

    Dengan menggunakan wiringPi, beberapa nomor GPIO berubah.
    Perubahan nomor GPIO ini bisa dilihat dengan perintah 
    "gpio readall" di terminal, perintah tersebut akan mengeluarkan keterangan gpio menggunakan BCM dan wiringPi pada masing-masing GPIO.



    WiringPi dimaintain oleh GIT untuk memudahkan pencaharian. Jadi kita harus install dahulu GIT-nya bila belum.

    Install GIT :

    sudo apt-get install git-core


    Bila terdapat error, salah satu penyelesainya update dan upgrade dahulu Raspberry Pi nya. dengan:


    sudo apt-get update
    sudo apt-get upgrade


    bila sudah diupdate dan upgrade, coba lagi install git-core nya.

    Setelah kita menginstall GIT, sekarang kita install wiringPi menggunakan GIT dengan perintah:

    git clone git://git.drogon.net/wiringPi 

    Langkah selanjutnya adalah meng-update wiringPi
    Masuk ke direktori wiringPi

    cd wiringPi <enter>
    git pull origin <enter>

    Lalu kita Build/install

    cd wiringPi <enter>
    ./build <enter>

    Script akan di-compile dan install semuanya.
    Bila perintah terakhir tidak berhasil, boleh dicoba menggunakan perintah sudo didepannya.

    Lalu kita coba gpio wiringPi nya
    test versi:

    gpio -v

    lalu muncul keterangan seperti dibawah ini:

    gpio version: 2.44
    Copyright (c) 2012-2017 Gordon Henderson
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type: gpio -warranty

    Raspberry Pi Details:
      Type: Model B, Revision: 02, Memory: 512MB, Maker: Sony 
      * Device tree is enabled.
      *--> Raspberry Pi Model B Rev 2
      * This Raspberry Pi supports user-level GPIO access.

    { Update 17 Maret 2018
    Bila menggunakan Raspberry Pi 3 Model B+ (function readall bermasalah pada RasPi ini, belum update), bisa kita update wiringPi-nya disini:
    Update untuk wiringPi Raspberry Pi 3 Model B+  }

    Lalu kita test pin-nya:

    gpio readall

    lalu muncul keterangan seperti ini :



    Gambar dan versi diatas adalah RaspberryPi jadul saya, masih Pi 1 model B.
    Berarti semua berkerja sesuai yang kita harapkan (paling tidak, sesuai dengan pembuat wiringPi harapkan). Kita telah sukses kita menginstall wiringPi

    Untuk melakukan cek fisik apakah wiringPi  berfungsi dengan baik kita gunakan LED, dan kita bisa mengcek semua gpio. Pada gambar dibawah ini kita menggunakan gpio 6 (wiringPi) atau pin 26 (BCM).

    Buka terminal, lalu:

    gpio mode 6 out
    gpio write 6 1
    gpio write 6 0

    "gpio mode 6 out"  kita perintahkan raspberry pi untuk membuat output di pin no.6
    "gpio write 6 1" kita perintahkan RaspPi untuk memberi listrik pada pin 6
    "gpio write 6 0" kita perintahkan RaspPi untuk mematikan listrik pada pin 6

    Dan untuk input:

    Seperti pada rangkaian push button diatas, kita menggunakan gpio 10 (wiringPi).
    Lalu:

    gpio mode 10 in

    Lalu kita test

    gpio read 10

    bila hasilnya '0', berarti tidak ada input pada gpio tersebut
    kita perintahkan lagi "gpio read 10" (jangan tekan <enter> dulu), dengan menekan tahan push button lalu tekan <enter>.
    bila hasilnya 1, maka gpio 10 mendeteksi input.

    Wednesday, 16 September 2015

    Rpi Input dan Output dengan Python

    Keunggulan scripting dengan python dibanding dengan bash atau yang lain, kode-kode lebih mudah ditulis dan dibaca, dan juga Python menyediakan module-module yang beragam, sehingga untuk melakukan sesuatu yang komplek dapat dilakukan dengan mudah. Kekurangannya dengan python adalah tidak bisa realtime, maksudnya, penggunaan RPi tidak hanya untuk python saja, sehingga python tidak menjadi prioritas utama dalam menjalankan program, dan python merupakan script yang harus dibaca dan diterjemahkan kedalam bahasa mesin setiap kita menjalankan program python. Jangan terlalu terintimidasi oleh realtime disini, delay yang terjadi juga tidak lama, untuk melakukan projek yang toleransi waktu satuan detik keterlambatan dan alat-alat yang tingkat kepresisiannya tidak tinggi, kita masih bisa menggunakan python.


    Bila kita ingin membuat sesuatu yang tidak perlu realtime, dan melakukan scripting dengan mudah, maka python adalah pilihan yang terbaik. 

    Sebelum kita melakukan apa-apa dengan python, kita test dahulu Python GPIO module, apakah telah terinstall apa belum, dengan cara:
    1. Pada command line atau terminal kita tulis:
      'sudo python'
    2. Setelah python muncul, kita import module GPIO dengan:
      import RPi.GPIO as gpio
    3. Bila tidak terjadi error, maka semuanya baik-baik saja.

    Bila mendapatkan error karena tidak adanya module GPIO, kita harus install modulnya terlebih dahulu. Kita keluar dahulu dari python dengan menggunakan perintah 'exit()', lalu kita masuk ke command line lagi. Kita update terlebih dahulu software RPi kita dengan :

    'sudo apt-get update'

    lalu kita install module RPi GPIO nya:

    'sudo apt-get install python-rpi.gpio'


    dan kemudian coba lagi masuk ke python, lalu import GPIO lagi. Bila tidak ada error maka semuanya baik-baik saja.

    Kita menggunakan nomor-nomor pin sesuai dengan apa yang telah disediakan atau didesign oleh pabrik. Kita bisa juga menggunakan standar yang lain dengan menggunakan GPIO.setmode(GPIO.BOARD). Mode ini adalah penamaan pin sesuai dengan urutan pin pada RPi board, jadi pin pertama adalah GPIO1, kedua adalah GPIO2 dan seterusnya.  



    sehingga script kita menjadi:

    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BOARD)

    Kita akan mengguakan pin dengan standar pabrik saja yaitu, GPIO.BCM, dimana pin-pin akan menggunakan nama pin standar, yaitu GPIO25 ada pada pin nomor 22.

    Kita masih menggunakan rangkaian LED seperti yang sebelumnya
    GPIO25 tersambung ke anoda LED (boleh menggunakan resistor boleh tidak (sebaiknya menggunakan resistor). LED masih bisa bertahan, tapi sebaiknya menggunakan resistor 10 ohm sampai 10k ohm tidak masalah). Dan Katoda LED tersambung dengan ground.
    Script:

    1. Bila kita belum masuk ke python, kita buka dahulu pythonnya dengan perintah
      'sudo python'.
    2. Lalu kita tulis : import RPi.GPIO as GPIO
      kita mengimport module GPIO
    3. GPIO.setmode(GPIO.BCM) 
      kita menset pin-pin pada RPi seperti apa adanya.
    4. GPIO.setup(25,GPIO.OUT)
      kita menset GPIO25 untuk output
    5. GPIO.output(25,1)
      Aktifkan output GPIO25 (LED menyala)
    6. GPIO.output(25,0)
      Nonaktifkan output GPIO25 (LED padam)



    Untuk membuat input dengan tombol, dan indikator tombol ditekan dengan LED, jadi bila kita menekan tombol, LED (dalam keadaan mati). Kita gunakan script dengan membuat file python terlebih dahulu.

    Komponen yang akan kita gunakan adalah:

    1. RPi
    2. Breadboard
    3. 1x LED
    4. 2x Resistor (10 -100 ohm dan 10k ohm).
    5. 1x Push button
    6. Beberapa kabel jumper ('male to female' dan 'male to male')

    Rangkaian pada breadboard:
    1. Hubungkan RPi pin 3,3v ke breadboard (+) atau langsung ke push button, bila jumper masuk ke positif (+) sambungkan lagi dengan jumper dari (+) ke kaki push button, dan ground ke breadboard (-).
    2. Hubungkan RPi GPIO25 ke breadboard, terhubung dengan LED anoda, dan LED katoda terhubung kesalahsatu ujung resistor (10 ohm - 100 ohm) dan ujung yang lain terhubung dengan ground.
    3. Lalu tempelkan push button ditengah breadboard dan salah satu kakinya terhubung dengan resistor (10k ohm), kaki resistor yang lain terhubung dengan ground. 
    4. Hubungkan RPi GPIO24 ke kaki push button yang terhubung dengan resistor.


    Pada defaut, pertama kali masuk direktori kita dibawa ke direktori /home/pi, pada direktori tersebut buat sebuah file kosong dengan nama 'tombolOnDanOff.py', dengan perintah pada command line:
    'touch tombolOnDanOff.py'
    lalu kita gunakan text editor nano untuk membuat script-nya dengan perintah:
    'nano tombolOnDanOff.py'
    lalu ketikan (Pada python spasi untuk blok-blok (seperti blok if ) merupakan syarat, jadi pastikan menekan tombol Tab jangan kurang atau lebih pada setiap bloknya) :
    1. import RPi.GPIO as GPIO
    2. import time

    3. GPIO.setmode (GPIO.BCM)
    4. GPIO.setup (25,GPIO.OUT)
    5. GPIO.setup (24,GPIO.IN)

    6. GPIO.output(25,GPIO.LOW)
    7. LEDState=False

    8. while True:
    9. inputButton = GPIO.input(24)
    10. if (inputButton == True):
    11. if (LEDState == False):
    12. GPIO.output (25, GPIO.HIGH)
    13. LEDState = True
    14. print ('push button ditekan, LED menyala ')
    15. time.sleep(0.2)
    16. else :
    17. GPIO.output (25, GPIO.LOW)
    18. LEDState = False
    19. print ('push button ditekan, LED mati ')
    20. time.sleep(0.2)
    atau bisa didownload disini 

    Yang terjadi pada script diatas adalah:
    1. baris 1, kita mengimport module GPIO untuk RPi dengan nama panggilan GPIO.
    2. baris 2, kita mengimport module waktu (time).
    3. baris 4, setting peta pin RPi standar pabrik, bukan berdasarkan nomor pin.
    4. baris 5, mengsetting GPIO25 sebagai output.
    5. baris 6, mengsetting GPIO24 sebagai input.
    6. baris 8, mengsetting GPIO24 dalam keadaan mati.
    7. baris 9, boolean untuk keadaan LED mati.
    8. baris 11, baris ini akan menbuat blok looping terus menerus, karena kondisi akan selalu True (kita tandai ini adalah awal dari blok 1).
    9. baris 12, membuat variable inputButton yang merupakan steatment GPIO.input(24) 
    10. baris 13, jika adanya input dari push button maka inputButton akan bernilai True, dan blok ini akan dijalankan. Awal blok 2 yang merupakan bagian dari blok 1)
    11. baris 14, Bila LEDState merupakan False (LED mati), blok ini yang akan dijalankan. Awal blok 3
    12. baris 15, set GPIO25 dengan nilai HIGH, sehingga LED mendapakan aliran listrik.
    13. baris 16, mengganti variable LEDState menjadi True (karena LED menyala).
    14. baris 17, mencetak string.
    15. baris 18, tidak menlakukan apa-apa selama 0,2 detik. Akhir dari blok 3.
    16. baris 19, bila nilai LEDState bukan nilai dari blok if diatasnya. Awal blok 4.
    17. baris 20, menset GPIO25 menjadi LOW, sehingga LED akan mati.
    18. baris 21, menset variable LEDState menjadi False.
    19. baris 22, mencetak string.
    20. baris 23, tidak melakukan apa-apa selama 0.2 detik. Akhir dari blok 4
    blok 1,dan blok 2 berakhir secara otomatis karena tidak ada perintah lagi dibawah baris 23.



    Tuesday, 8 September 2015

    Input dan output Raspberry Pi

    Salah satu perbedaan antara RPi dan komputer linux adalah RPi memiliki GPIO (General Purpose Input and Output), yang bisa kita akses langsung menggunakan RPi. GPIO ini dapat mengkontrol output ke komponen elektronik seperti LED, motor (jangan memasangkan motor langsung ke GPIO RPi, akan menyebabkan RPi terbakar, gunakan relay), dan lain-lain, dan untuk Input seperti tombol, sensor, motion, proximity dan lain-lain. Untuk menbaca sensor analog seperti temperatur tidak dapat digunakan langsung. Kita harus mengkonversikan dahulu ke digital, menggunakan ADC (Analog to Digital Converter), ada beberapa model ADC seperti ADS1015 12-BIT ADC - 4 CHANNEL WITH PROGRAMMABLE GAIN AMPLIFIER.
    Dengan adanya GPIO ini kita bisa menbuat program yang bisa membaca input dan mengkontrol output secara general. Berbeda dengan mikrokontroler yang lain (yang juga dimiliki oleh RPi), RPi memiliki input dan output tambahan ke keyboard, mouse, monitor, dan juga tidak ketinggalan ethernet (kita bisa menggunakan ethernet sebagai input dan output). Semuanya tergabung jadi satu. Dan masih ada lagi keuntungan yang lain dalam pembuatan projek elektronik dengan RPi, seperti membaca data pada sistem file Linux, misalnya kita memiliki sensor analog, data dari sensor analog tersebut dapat disimpan dalam file (biasanya log file), dan data-data tersebut dapat kita tampilkan dengan grafik kapanpun yang kita mau. 

    Banyak bahasa program juga bisa kita gunakan (Linux) seperti linux shell, python, C, java, perl, dan lain-lain.

    Untuk menggunakan GPIO ini kita memerlukan tambahan alat, seperti:
    1. Solderless breadboard 
    2. LED
    3. Kable male to male jumper

    4. Kable male to female jumper 
    5. Pushbutton (tombol)
    6. Resistor 


    RPi GPIO 



    + 5v
    + 5v
    -
    14
    15
    18
    -
    23
    24
    -
    25
    8
    7
    + 3.3v
    2
    3
    4
    -
    17
    v1:21
    v2:27
    22
    + 3.3v
    10
    9
    11
    -

    Ada perbedaan no pin pada RPi v1 dan RPi v2 pada pin 21(RPi v1) menjadi pin 27 (RPi v2). Untuk mengetahuinya kita gunakan terminal RPi atau di command line, dan ketik 'cat /proc/cpuinfo', jika disana tertulis revision 0002 atau 0003, berarti RPi v1, jika diatasnya berarti RPi v2.


    (atas) RPi rev 2
    (bawah) RPi rev 1


    Contoh diatas adalah RPi ver 2 (000e (hex)).  Sedangkan untuk RPi 2 model A+ dan B+.





    5v
    +  5v

    141518

    2324

    2587



    12

    162021
    + 3.3v234

    172722+ 3.3v10911



    56131926

    Keterangan warna RPi dan RPi 2:
    • warna merah untuk power + 5v
    • warna orange untuk power + 3.3v
    • warna hitam untuk ground
    • warna putih untuk I/O berserta nomornya.
    • warna biru untuk ID EEPROM, (Jangan menggunakan pin-pin ini, jangan mencoba-coba menggunakannya, bila tidak tahu apa yang dilakukan ya)
    Pin I2C digunakan berinteraksi antar chip. Dengan pin ini kita terkoneksi dengan beragam I2C chip dan module.

    Untuk terminal terminal yang terkoneksi satu sama lain pada breadboard pada gambar dibawah ini, digambarkan dengan warna abu-abu tranparan.

    Kita akan menggunakan command line untuk menyala atau mematikan output RPi GPIO pin dengan indikator LED. 

    Yang kita butuhkan adalah:

    1. RPi
    2. Breadboard
    3. 1x Led
    4. Resistor 82 ohm atau 100 ohm, 1/8 watt atau 1/4 watt atau 1/2 watt (apa bedanya soal wattage? klik disini)
    5. Jumper




    1. Dengan mengunakan jumper male-to-female kita hubungkan pin 25 pada RPi ke breadboard.
    2. Gunakan jumper yang lain untuk menghubungkan ground ke breadboad sisi negatif (-).
    3. Pasang LED pada lubang yang lain (yang terhubung), pastikan polarisasi LED. LED katoda (-) dihubungkan dengan ground, dan anoda (+) dihubungkan dengan pin 25. Katoda adalah sisi yang panjang bila kita lihat kedalam LED (bukan kaki LED yang kita lihat), dan yang pendek adalah anoda.
      Dengan Resistor:
      Tanpa resistor:
      Led
    4. Lalu nyalakan RPi nya. Bila kita masuk ke dalam X window (yang tampilanya seperti window) kita klik 'Terminal', bila berada di command line, kita baik-baik saja.
    5. Untuk mengakses input dan output pin dari command line, kita harus sebagai user 'root', (super user). Untuk mengganti menjadi 'root' kita ketikan pada command line 'sudo su'. Super user memiliki akses kesemua fungsi dan file pada sistem. Dengan user ini kita dapat merusakan operation system dengan perintah tertentu. Hanya sedikit keamanan agar super user tidak merusakan sesuatu yang penting pada system. Tapi tidak usah khawatir, kita tetap bisa install ulang operating system RPi kita.
    6. Sebelum kita bisa mengaksek untuk menyalakan LED pada pin 25, kita harus membuat yang namanya userspace, agar pin dapat diakses dari luar Linux kernel. Dengan:

      echo 25 > /sys/class/gpio/export

      Perintah 'echo' membuat nomor pin (25) yang akan kita gunakan melalui file export, yang terletak di folder '/sys/class/gpio'. Dengan perintah diatas, kita dibuatkan folder baru yang bernama 'gpio25 di '/sys/class/gpio/gpio25'.
    7. Lalu kita masuk ke directori-nya dengan menggunakan perintah:

      cd /sys/class/gpio/gpio25

      Kita akan menggunakan direktori ini untuk mengkontrol pin 25.
    8. Lalu kita tulis perintah :

      echo out > direction

      Perintah 'direction' untuk menset pin ini menjadi sebuah input atau output, pada saat ini kita gunakan pin 25 untuk LED (output) sehingga perintah 'direction' out (echo out > direction), yang ditulis seperti diatas.
    9. Semuanya preparasi telah dilaksanakan, sekarang saatnya kita menyalakan LED dengan perintah:

      echo 1 > value

      dan untuk mematikannya:

      echo 0 > value
    Untuk lebih jelasnya kita lihat video dibawah ini:




    Pada saat kita mengkontrol pin RPi dengan output, pada kenyataanya kita membuat atau menuliskan sebuah file (virtual file) yang tidak ada pada RPi SD card, yang merupakan bagian dari virtual file system dari linux, untuk mempermudah akses. Dan bila kita membuat input, maka kita membaca dari sebuah virtual file tersebut.

    Untuk membuat input dari sebuah tombol/pushbutton pada dasarnya sama saja seperti output, hanya saja dengan input kita tidak bisa melihat lansung, bila kita masukan input dari sebuah tombol, apakah RPi mendapatkan signal yang kita kirim. 

    Yang kita butuhkan adalah:

    1. RPi
    2. Breadboard
    3. Push button
    4. Resistor 10K ohm
    5. jumper 


    push button yang memiliki empat kaki, skemanya seperti ini:


    Jadi kaki no.1 terhubung dengan kaki no.2, dan kaki no.3 terhubung dengan kaki no.4, dan ketika push button ditekan kaki no.1 dan no.2 akan terhubung dengan kaki no.3 dan no.4

    Tidak harus menggunakan push button seperti diatas, bila tidak ada gunakan yang masih compatible, atau yang menggunakan push button dua kaki. Bila kita menggunakan push button dua kaki, kemungkinan akan ada masalah dengan pembacaan pada pin (bila tidak menggunakan resistor), kecuali kita hubungkan dengan membuat cabang dari push button 3,3v dengan resistor ke ground karena secara teori (dalam hal pembacaan digital input) pin harus terhubung dengan 3,3v atau ground. 

    Kita pasangkan push button, resistor ke breadboard dan hubungkan dengan jumper ke pin RPi.

    Peringatan: Jangan menghubungkan input push button ke pin 5v!. Menggunakan lebih dari 3,3v ke input pin dapat merusakan RPi. Selalu gunakan pin 3,3v untuk membuat input pin. 





    Selanjutnya:
    1. tulis
      echo 25 > /sys/class/gpio/export
    2. masuk ke direktori gpio25 dengan
      cd /sys/class/gpio/gpio25
    3. kemudian, set direction pin nya menjadi input
      echo in > direction
    4. Sudah siap semua, kita tinggal tekan push button. Untuk melihat apakah input dari push button diterima oleh RPi pin, kita tulis
      cat value
    5. bila menghasilkan angka '0' (nol) maka pin tersebut terkoneksi ke ground, dan bila menghasilkan angka '1' (satu), pin menerima signal dari push button. Push button harus ditekan dan tahan, lalu tuliskan 'cat value' (push button masih ditahan) lalu enter (masih ditahan).
    Bila RPi menolak permintaan kita, coba membuat perintah dengan user 'root', dengan cara, pada command line (atau Terminal di X window), bila belum sebagai root, ketik 'sudo su'. Indikator  kita telah menjadi root pada command line, akan tertulis 'root@raspberrypi:'.