Showing posts with label Sensor. Show all posts
Showing posts with label Sensor. Show all posts

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.