"Kembali Ke Dasar Elektronika Digital ... "

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Tampilkan postingan dengan label adc. Tampilkan semua postingan
Tampilkan postingan dengan label adc. Tampilkan semua postingan

Kamis, 02 Juli 2020

The Coolest Way To Visualize VU Meter From Arduino to Microsoft Excel



On this tutorial i will try to show you how cool is python if combined with arduino, as i've already wrote on previous blogs Here dan Here . Sorry since i was writing only in Bahasa so please use google translate for your convenience and now i would like to write in english and i hope you'll understand.

First prepare some components from this schematic for amplifier part, the purpose is to create audio signal gain (from condenser mic) which is too weak for arduino's ADC to read from. 

Since we only want to read the signal's voltage so we can skip loud speaker part, but if you want to hear some poor noisy sound then it is up to you. Pin no 5 of LM386 can directly feed into any arduino ADC pin and the power supply can directly connected to 5 volt on arduino. The Script is quite simple as i only copy and paste from arduino's ADC example scripts collection.


int analogPin = A0; // Any ADC Pin on ardiuno
                    
int val = 0;  // variable to store the value read

void setup() {
  Serial.begin(9600);           //  setup serial
}

void loop() {
  val = analogRead(analogPin);  // read the input pin
  Serial.println(val);          // send value to serial
  delay(100);   // 100 ms delay is the best, try other number
}
That is one simple scripts, i only use hardware serial directly connecting to USB COM port then the python will do the rest. Xlwings library is a simple tools to write and read directly to any excel 'cell' so then the graph chart on excel can becoming "alive" in real time if the data is changed rapidly. 


import serial #serial library
import xlwings as xw #excel library

wb = xw.Book('Audio.xlsx') #file name, change accordingly
sht = wb.sheets['data'] #sheets name, change it depend on your excel
row = 1

serialPort = serial.Serial(port = "COM4", baudrate=9600,   #baudrate
                           bytesize=8, timeout=2, 
                           stopbits=serial.STOPBITS_ONE)

serialString = ""   

while(1):
    if(serialPort.in_waiting > 0): #read if any serial data is coming
        serialString = serialPort.readline()
        data=serialString.decode('utf-8')     
        print(data) 
        if row == 51: #reset the row
          row=2 
        else: 
          row=row+1
        audio='A'+str(row) #new cell
        sht.range(audio).value= float(data) #write cell

The scripts read the integer value from ADC readout which is sent by arduino, then write it rapidly on cell A2 until A51 in excel file. The graph will be "dancing" according to the sound wave traveling through the condenser microphone.



As microsoft excel is easy to use or to customize then you can create any chart or graph you like and can be use as simple visualization as long as the data speed is not very fast, eg: Heart Beat or ECG.





 I hope you understand and happy Visualizing your favorite music on Excel


Naya Marie Rivera , naya rivera, glee, @nayarivera, missing
Share:

Selasa, 18 Maret 2014

[TUTORIAL] Clinometer (pengukur ketinggian) Sederhana Memanfaatkan ADC




Persiapan sebelum memulai project :

  • Tutorial ADC dapat dibaca disini
  • Dasar menulis ke LCD dapat dilihat disini

Bahan-bahan yang dibutuhkan :
  • Minimum System / ATmega 8535/ ATmega 16
  • Display LCD 16 x 2 
  • Potensiometer linear (nickel) 10K ohm(2 buah)
  • Resistor 1K (2 buah)

Project ini adalah request dari anak SMA yang mendapatkan tugas matematika dimana gurunya cukup "Gila" untuk menantang anak didiknya membuat alat clinometer atau pengukur ketinggian. Sang murid mencari di google dan didapatkan rangkaian yg menggunakan acelerometer tapi kendalanya harga yang mahal dan dia pun kesulitan mengerjakannya. Solusi saya cukup sederhana dengan memanfaatkan putaran sudut yg dikonversikan ke putaran potensiometer (variable resistor) yang kemudian dirubah ke dalam level tegangan dan dibaca ADC.


Gambar diatas merupakan ilustrasi trigonometri dari sebuah clinometer dengan mencoba memanfaatkan rumus trigonometri. Keuntungan rumus diatas adalah tidak perlu menentukan jarak pengamat ke benda yang diukur,akan tetapi karena mengandalkan rumus tangen maka dari grafik tangen berikut terjadi sedikit anomali pengukuran jika sudut mendekati kelipatan 90 derajat, dimana tangent 90 adalah tak berhingga !.

grafik tangen yang tidak linear sedikit mempengaruhi keakuratan


Pemilihan potensiometer yang akan digunakan sebagai penerjemah dari sudut ke tegangan (menggunakan prinsip pembagian tegangan) juga perlu diperhatikan karena pada umumnya potentiometer yg dijual dipasaran adalah potentiometer audio yg bersifat logaritmik. Jadi potentiometer yang dipilih adalah berjenis "wire wound" atau yang umum di pasaran bernama "potensiometer nikel".



Output dari project kali ini menggunakan lcd 16x2 yang akan menampilkan nilai sudut alpha, beta dan nilai hasil pengukuran ketinggian.



Perputaran sudut pengukuran vs tegangan yg dihasilkan dapat menggunakan rumus pembagian 10 bit adc (0 - 1023) sehingga didapat sudut yang mewakili per bit. Tentunya potensiometer tidaklah terlalu linear karena banyak faktor dan untungnya kita hanya menggunakan sudut 0-90 derajat saja untuk alpha maupun beta. Saya mendapatkan untuk sudut 0-90 dapat menggunakan pembagian nilai bulat per bit ADC yaitu  "pembacaan adc / 3". Jadi sesuaikan dulu dengan respon nilai potensiometer yang kamu punya dengan sudut yang dihasilkan.

Untuk pengukuran tangen pada WinAvr akan digunakan library "math.h" dimana pengukuran sudut akan dirubah menjadi satuan radian. Rumus yang digunakan tentunya akan sangat memakan memory akibat nilai "float" yang digunakan. Hal ini kita akali saja dengan menggunakan unsigned integer 32 bit dengan pendekatan seperti berikut :

  • tana = tan((M_PI*adcalpha)/180)*1000;
  • tanb = tan((M_PI*adcbeta)/180)*1000;
  • tinggi= (tanb/tana) + 1 ;

Kita ingat juga konversi dari derajat ke radian digunakan rumus :


  • RADIAN = (PI * sudut ) /180 


Pengali 1000 pada rumus diatas digunakan untuk mendapatkan nilai float (pecahan / koma) menjadi ratusan sehingga pembagian menjadi agak bulat.


Skematiknya adalah sebagai berikut ini :

klik untuk memperjelas


Script selengkapnya seperti dibawah ini, diasumsikan bahwa tinggi pengamat 1 meter :


#define F_CPU 4000000UL
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <math.h>
#include "lcd.h"

char derajat = 0xDF; // karakter derajat

void reverse(char s[]) //rutin untuk merubah angka ke ascii
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
void itoa(uint16_t n, char s[]) 
//rutin untuk merubah angka ke ascii
   uint16_t i;
   
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 

   s[i] = '\0'; // add null terminator for string 
   reverse(s); 


void initADC() //inisialisasi ADC
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(7<<ADPS0);
}


uint16_t ReadADC(uint8_t ch) //pembacaan ADC
{
   //Select ADC Channel ch must be 0-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //Start Single conversion

   ADCSRA|=(1<<ADSC);

   //Wait for conversion to complete
   while(!(ADCSRA & (1<<ADIF)));

   //Clear ADIF by writing one to it
   ADCSRA|=(1<<ADIF);

   return(ADC);
}

int main(void)
{

uint16_t baca1,baca2,tana,tanb,tinggi;
char dum;

lcd_init(LCD_DISP_ON);//inisialisasi LCD
lcd_clrscr(); //bersihkan LCD

   while(1)
   {
      initADC(); 

      baca1=ReadADC(6) / 3; //baca alpha
      if(baca1 <90){ //jika hasil tidak lewat 90 derajat

      lcd_gotoxy(0,0);
      lcd_putc(224); //ascii alpha
      lcd_puts(" =");

          itoa(baca1,&dum);
  lcd_puts(&dum);
 lcd_putc(derajat);
 lcd_putc(' ');
 
 }

 else{ //jika lebih 90 di warning
          lcd_gotoxy(0,0);
 lcd_putc(224);
 lcd_puts(" =max");
 }


     _delay_ms(100);

initADC();


     baca2= ReadADC(5) / 3; //baca beta

     if(baca2 <90){  // jika perhitungan < 90 derajat
 
 lcd_gotoxy(8,0);
 lcd_putc(226);
          lcd_puts(" =");

          itoa(baca2,&dum);
 lcd_puts(&dum);
 lcd_putc(derajat);
 lcd_putc(' ');
      }

      else{  //jika lebih 90 di warning
          lcd_gotoxy(8,0);
 lcd_putc(226);
 lcd_puts(" =max");
 }

      _delay_ms(100);
 lcd_gotoxy(0,1);
      

      if(baca1 <90 && baca2 <90){
          //PERHITUNGAN TINGGI
          tana = tan((M_PI*baca1)/180)*1000;
 tanb = tan((M_PI*baca2)/180)*1000;
 tinggi= (tanb/tana) + 1 ;
 
 lcd_puts(" TINGGI:");
          itoa(tinggi,&dum);
 lcd_puts(&dum);
 lcd_puts(" m");
 lcd_puts("        ");
 }

         else{
          lcd_gotoxy(0,1);
 lcd_puts(" TINGGI: Error !");
 }
   }
return 0;

}


SELAMAT MENCOBA  
Share:

Selasa, 04 Juni 2013

Tutorial: ADC lanjutan - Termometer dengan LM35 dan ATmega8

Kita akan melanjutkan pembahasan dasar ADC sebelumnya, dengan merubah inputan trimpot sebagai voltage divider menjadi inputan dari sensor temperatur yg sangat umum yaitu LM35.




LM35 sangatlah gampang dipakai , hanya dengan memberikan tegangan VCC (kali ini pake 5V) dan ground, maka di pin output akan terjadi perubahan tegangan sebesar 10mV tiap perubahan 1 derajat Celcius.

Skematik dari termometer tidak jauh berbeda dengan project sebelumnya, hanya mengganti trimpot dengan LM35



klik untuk memperbesar



Karena LM35 menggunakan step per derajat sebesar 10mili volt dan mega 8 memiliki resolusi 10 bit dan step per bit adalah 4,9 mili volt, maka secara mudah pembacaan ADC dari LM 35 dapat langsung dirumuskan sebagai 


SUHU = PEMBACAAN ADC / 2

Skrip dibawah ini merupakan cuplikan dari main program, untuk inisialisasi dan lainnya dapat dibaca pada pembahasan dasar adc sebelumnya.

int main(void)
{

uint16_t baca,decimal,pecahan;

char derajat = 0xDF; // karakter derajat
char dum;


lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("TEST ADC ATMEGA8");


initADC();
  

   while(1)
   {

      baca=ReadADC(0); //baca ADC

      lcd_gotoxy(0,1);
      lcd_puts("Suhu=");

   itoa(baca/2,&dum); // konversi ke suhu
   lcd_puts(&dum);
    
   lcd_putc(',');
      
   itoa((baca%2)*5,&dum); // kasi resolusi 0.5
   lcd_puts(&dum);
    
      lcd_putc(' ');
      lcd_putc(derajat);
   lcd_putc('C');
  

      _delay_ms(100);

   }







return 0;

}


hasilnya seperti berikut :






MEMBUAT PEMBACAAN ADC LEBIH STABIL






Dari video diatas, kita lihat hasil pengukuran terlalu loncat2 ....wahh parah, walaupun mengikuti saran menambah filter LC ke AVCC seperti di datasheet dan C ke Aref



wahhh ...pusing juga belom sukses...akhirnya kita baca lagi datasheet dibagian "ADC NOISE CANCELER"

yang aku lakukan dengan menambah LC filter dinamakan analog noise canceler. Yang belum aku lakukan adalah menambahkan "ADC NOISE REDUCTION" yaitu memberikan posisi "SLEEP" saat sebelum konversi dilakukan ...

dan satu lagi, ketika sleep mode dan konversi, penggunaan output di minimalkan seperti dengan mematikan output ke 7 segment


void initADC()

{

ADMUX=(1<<REFS0);// Aref=AVcc;

ADCSRA|=(1<<ADEN)|(1<<ADIE)|(7<<ADPS0); //interupt aktif

sei();

}



uint16_t ReadADC(uint8_t ch)

{

  

  posisi(0);  //MATIKAN OUTPUT KE 7 SEGMENT



  MCUCR |= _BV(SE);  // Sleep Enable, jadi abis ini processor diturunkan loadnya



 MCUCR |=_BV(SM0);  // mode ADC NOISE REDUTION

  

   //Select ADC Channel ch must be 0-7

   ch=ch&0b00000111;

   ADMUX|=ch;



   //Start Single conversion



   ADCSRA|=(1<<ADSC);



   //Wait for conversion to complete

   while(!(ADCSRA & (1<<ADIF)));



   //Clear ADIF by writing one to it

   ADCSRA|=(1<<ADIF);



   return(ADC);



   MCUCR &= ~_BV(SE) ;  //BANGUN DARI SLEEP

}










dan voilaaa .....pembacaan ADC dari LM 35 menjadi lebih stabil


SELAMAT MENCOBA
Share:

Senin, 03 Juni 2013

Tutorial: Penggunaan ADC dari AVR - Praktek voltmeter ATmega8

Tutorial ini pernah dibahas di forum kaskus yang juga saya asuh dan tidak ada salahnya untuk saya tulis lagi disini (untuk alasan kemudahan search). ADC yang embedded pada microcontroller seri AVR merupakan suatu nilai tambah sehingga banyak yang beralih ke jenis microcontroller ini.

Seri AVR yg memiliki ADC yg ada dipasaran adalah : ATtiny26, Mega8/8535/16/32 etc . Umumnya seri yg umum dipasaran memiliki lebih dari satu port ADC dengan resolusi 10bit

sebelumnya kita bahas dulu ADC....ADC dulunya terpisah dari micro, biasanya jaman tahun 2000 kebawah kita harus menggunakan ADC terpisah (contoh ADC 0808) yg selanjutnya akan diolah oleh kontroller. contoh rangkaiannya seperti ini, TS inget dulu pernah praktikum bikin voltmeter trus dibaca melalui paralel port PC

 

ADC 0808 ini memiliki resolusi 8 bit, jadi hasil pengukuran secara digital 0-254
jika AVR memiliki resolusi 10 bit, jadi biner pengukuran 0-1023.
Jadi resolusi menentukan kepekaan dari pembacaan ADC, semisal jika 8 bit dan range pengukuran 0-5V maka perubahan 1bit = 5/253 = 19,6 mV. Jika ADC 10 bit maka perubahan 1bit = 5/1023 = 4,9 mV

ADC akan meminta untuk diberikan tegangan Vref, yg merupakan tegangan cuplik referensi dari analog input. Seinget saya ADC 0808 membutuhkan tegangan referensi Vmax/2 , jadi jika range tegangan 0-5v maka perlu dikasi Vref 2.5 V.

Untuk AVR dapat dipilih tegangan Vref internal (2.56v), VCC sebagai Vref atau Vref external. Kali ini kita menggunakan mode yg paling sederhana yaitu Vref=Vcc , mode pembacaan sekali dan IC yg dipilih adalah ATMEGA 8. Vref merupakan suatu tegangan yang menunjukkan nilai maximum  dari pembacaan ADC sehingga mewakili resolusinya. Jadi ADC akan mengeluarkan data binner yang mewakili nilai 0 - Vref  dan diperlukan nilai tegangan yang stabil, maka apabila menggunakan baterai atau supply yg dapat naik turun maka diperlukan nilai vref yang stabil dengan regulator tegangan.

Pin ADC pada microcontroller seri AVR memiliki keterbatasan input tegangan yang hanya maximum 6volt, sehingga jika memerlukan pengukuran tegangan (DC) yang lebih tinggi dapat dilakukan pembagian tegangan sederhana menggunakan resistor sehingga tegangan max yg masuk ke ADC tidak melebihi spesifikasi datasheet. Rangkaian buffer atau voltage follower menggunakan op-amp mungkin akan menstabilkan tegangan input sebelum masuk ke pin ADC.




figure792

displaymath1978


Untuk rangkaian pertama, kita akan mencoba mebuat pembacaan tegangan pada TRIMPOT 10K, dimana berfungsi sebagai voltage divider dan dibaca oleh ADC port 0. Tampilannya akan dikirim menuju LCD 2x16 baris

INGAT karena memakai LCD, maka sebaiknya baca terlebih dulu pembahasan menulis di LCD

Siapkan rangkaian berikut (klik buat gambar lebih jelas)





selanjutnya kita bahas satu persatu codingnya :

I. Insialisai 

Code:
#define F_CPU 1000000UL //clock mega8 internal default
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "lcd.h" //library lcd milik pfleury


void initADC()  //inisialisasi mode ADC dari mega8
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(7<<ADPS0);
}

II. Pembacaan data ADC

Code:
uint16_t ReadADC(uint8_t ch)
{
   //pemilihan Ch ADC 0-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //mulai konversi

   ADCSRA|=(1<<ADSC);

   //tunggu sampai konversi selesai
   while(!(ADCSRA & (1<<ADIF)));

   //bersihkan ADIF untuk pembacaan selanjutnya
   ADCSRA|=(1<<ADIF);

  //kembalikan nilai pembacaan ADC
   return(ADC); 
}
III. Script Merubah Binner ke ascii

karena pembacaan ADC berupa binner, maka perlu dirubah menjadi ASCII dan dapat langsung ditampilkan ke LCD. Sebenernya WinAVR string.h memiliki fungsi "itoa" / integer to ascii, tetapi memakan memory yg lebih dan mubazir karena konversinya hanya 1 digit saja

Code:
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}
IV. Program Utama
Code:
int main(void)
{

uint16_t baca,decimal,pecahan;
char dum;

//Inisialisasi LCD (dibahas di tutorial laen)

lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("TEST ADC ATMEGA8");


initADC(); //panggil inisialisai ADC


   while(1)
   {

      baca=ReadADC(0); // baca ADC di port 0 , putar-putar trimpot

       // mencari nilai decimal dan pecahan 
       // range 0-5V dengan resolusi 10 bit = 1023 step
      // jadi tiap step = 4,9 mili volt 
      //kalibrasikan dengan nilai VCC  yg sebenarnya

   decimal= (baca * 4.9)/1000 ;
   pecahan= ( ((baca * 4.9) - (decimal * 1000) ) /10);
    
      //tampilkan di LCD

      lcd_gotoxy(0,1);
      lcd_puts("Nilai=");

      itoa(decimal,&dum);
   lcd_puts(&dum);
   lcd_putc(',');
      
       if(pecahan <10) lcd_putc('0');

      itoa(pecahan,&dum);
   lcd_puts(&dum);

   lcd_puts(" V    ");
  

      _delay_ms(100); //kasi delay sebentar

   }

return 0;

}

hasil dari skematik & coding diatas dapat dilihat pada gambar berikut :



Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (38) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (72) television (5) transistor (1) troubleshoot (3) tulisan (59) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika