MPU6050 PIC16F877 kullanımı

Başlatan Dtmf, 04 Ocak 2020, 13:08:54

Dtmf

hayırlı sabahlar degerlı arkadaslar MPU6050 ımu sesor modulu programını baslangıc olarak paylasıyorum dahada gelıstırmek ısteyen gonullu arkadaslar varsa beraber calısarak daha ıyı sonuclar ele edebılırız.ardunıo ıle degılde PIC ıle kendı dronumuzu yapabılırız.programda sadece gyro degerlerı gostermekte.ıyı calısmalar.
Device = 16F877A
Declare XTAL = 20          ' Kristal frekansı: 20 MHz
Declare ALL_DIGITAL = True  ' 16f877A nın tüm uçları Dijital
TRISA = %00000000:PORTA=0
TRISB = %00000000:PORTB=0
TRISC = %00000000
TRISD = %00000011
TRISE = %00000000
Declare RSOUT_PIN = PORTB.2 ' RSOut komutuyla gönderilecek veri için çıkış pinini tayin eder.
Declare SERIAL_BAUD = 9600  ' 0 dan 65535 bps e kadar
Declare RSOUT_MODE 0        ' Data 1= True Normal modda gönderilir. (Diğeri 0=Inverted modu)

Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1  

Dim READAX  As Word
Dim READAY  As Word
Dim READAZ  As Word
Dim READX  As Word 
Dim READY  As Word
Dim READZ  As Word
Dim READT  As Word
Dim READT1  As Word
;____________________________________________________________________________________________________________________        
Symbol SDA = PORTD.0  ' I2C Veri pimi. Çekme bağlantısı gerekiyor. Kurulu limanlarınıza göre değiştirebilirsiniz
Symbol SCL = PORTD.1  ' I2C saat pimi. Çekme bağlantısı gerekiyor. Kurulu limanlarınıza göre değiştirebilirsiniz
Symbol W_DATA = $D0  'Yazma işlemi gerçekleştirmek için kullanılır
Symbol R_DATA = $D1  'Okuma işlemi gerçekleştirmek için kullanılır
Symbol PWR_M1 = $6B  'Güç Yönetimi Kayıt 1. Bu kayıt, kullanıcının güç modunu ve saat kaynağını yapılandırmasına izin verir. Ayrıca, tüm Cihazı sıfırlamak için bir Bit ve sıcaklık sensörünü devre dışı bırakmak için bir Bit sağlar.
Symbol PWR_M2 = $6C  'Pow Low Power Modmeter and gyroscope into standby mode.
Symbol CONF_R = $1A  'Konfigürasyon Kayıt. Bu kayıt, hem harici Çerçeve Senkronizasyonu (FSYNC) pim örneklemesini hem de Dijital Düşük Geçişli Filtre (LPF) ayarını, hem jiroskoplar hem de ivmeölçer için yapılandırır.
Symbol G_CONF = $1B  'Gyro Konfigürasyon Kayıt. Bu kayıt, jiroskop kendi kendini testini tetiklemek ve jiroskop tam skala aralığını yapılandırmak için kullanılır.
Symbol A_CONF = $1C  'İvmeölçer Kongresi. Bu kayıt, ivmeölçerin kendi kendini sınamasını tetiklemek ve 
;ivmeölçerin tam ölçekli aralığını yapılandırmak için kullanılır. Bu kayıt aynı zamanda Dijital Yüksek Geçiş Filtresini (DHPF) yapılandırır.
Symbol XA_MSB = $3B  'Okundu Kaydı, ivmeölçer X MSB 8-Bit değeri çıkışı.
Symbol XA_LSB = $3C  'Okunmuş Kayıt, ivmeölçer X LSB 8-Bit değeri çıkışı.
Symbol YA_MSB = $3D  'Okundu Kaydı, ivmeölçer Y MSB 8-Bit değeri çıkışı.
Symbol YA_LSB = $3E  'Okundu Kaydı, ivmeölçer Y LSB 8-Bit değeri çıkışı.
Symbol ZA_MSB = $3F  'Okundu Kaydı, ivmeölçer Z MSB 8-Bit değeri çıkışı.
Symbol ZA_LSB = $40  'Okundu Kaydı, ivmeölçer Z LSB 8-Bit değeri çıkışı.
Symbol TEMP_M = $41  'Okuma Kaydı, Sıcaklık MSB 8-Bit Değeri çıkışı.
Symbol TEMP_L = $42  'Okunan Kayıt, Sıcaklık LSB 8 Bitlik değer çıkışı.
Symbol XG_MSB = $43  'Okunmuş Kayıt, Gyro X MSB 8-Bit değerinin çıkışı.
Symbol XG_LSB = $44  'Okunan Kayıt, Gyro X LSB 8-Bit değerinin çıkışı.
Symbol YG_MSB = $45  'Oku Kayıt, Gyro Y MSB 8-Bit değeri çıkışı.
Symbol YG_LSB = $46  'Okunan Kayıt, Gyro Y LSB 8-Bit Değeri Çıktısı.
Symbol ZG_MSB = $47  'Okunmuş Kayıt, Gyro Z MSB 8-Bit değerinin çıkışı.
Symbol ZG_LSB = $48  'Okunan Kayıt, Gyro Z LSB 8-Bit değerinin çıkışı.
;_______________________________________________________________________________________________________________
I2COut SDA,SCL,W_DATA,PWR_M1,[%10000000]  'KAYIT 6B Yapılandırması (PWR YÖNETİMİ) MPU6050 sıfırlama
DelayMS 100
I2COut SDA,SCL,W_DATA,PWR_M1,[%00000000]  'KAYIT 6B Yapılandırması (PWR YÖNETİMİ) MPU6050 START
DelayMS 100
I2COut SDA,SCL,W_DATA,CONF_R,[%00000001]  'RESISTOR 1A Yapılandırma (FILTER Config)
DelayMS 10
I2COut SDA,SCL,W_DATA,G_CONF,[%00000000]  'KAYDEDİCİ 1B Yapılandırma (GYRO Yapılandırması)
DelayMS 10
I2COut SDA,SCL,W_DATA,A_CONF,[%00010000]  'KAYDEDİC 1C Yapılandırması (ACCELERATOR Config)
DelayMS 10
;=======================================ANA PROGRAM==========================================================
BASLA:
I2CIn SDA,SCL,R_DATA,XA_MSB,[READAX.HighByte]  '16-Bit X Ekseninin ilk 8 biti
I2CIn SDA,SCL,R_DATA,XA_LSB,[READAX.LowByte ]  '16-Bit X Ekseninin ikinci 8 biti
I2CIn SDA,SCL,R_DATA,YA_MSB,[READAY.HighByte]
I2CIn SDA,SCL,R_DATA,YA_LSB,[READAY.LowByte ]
I2CIn SDA,SCL,R_DATA,ZA_MSB,[READAZ.HighByte]
I2CIn SDA,SCL,R_DATA,ZA_LSB,[READAZ.LowByte ]
I2CIn SDA,SCL,R_DATA,TEMP_M,[READT.HighByte ]
I2CIn SDA,SCL,R_DATA,TEMP_L,[READT.LowByte  ]

I2CIn SDA,SCL,R_DATA,XG_MSB,[READX.HighByte]  
I2CIn SDA,SCL,R_DATA,XG_LSB,[READX.LowByte ]
I2CIn SDA,SCL,R_DATA,YG_MSB,[READY.HighByte]
I2CIn SDA,SCL,R_DATA,YG_LSB,[READY.LowByte ]
I2CIn SDA,SCL,R_DATA,ZG_MSB,[READZ.HighByte]
I2CIn SDA,SCL,R_DATA,ZG_LSB,[READZ.LowByte ]
DelayMS 1
READT1 = (READT / 340 + 37)-192

Print At 1,1, "X=",SDEC READAX,"    "
Print At 1,9, "Y=",SDEC READAY,"    " 
Print At 2,1, "Z=",SDEC READAZ,"    "
Print At 2,9, "T=",SDEC READT1,"    "
DelayMS 100        
GoTo BASLA

elektro77

#1
ellerinize ve aklınıza sağlık. Başlangıç için iyi bir kütüphane olmuş. MPU6050 ve bu veriler kullanılarak 4 ayağı veya 2 ayağı veya tek tekerlek üzerinde dengede duran robot yapılabilirmi.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Dtmf

X-y ve z ekseni degerleri mpu6050 den alinan ham degerler.ham degreri biraz daha stabil hale getirirsek(kalman filtresi ile)neden olmasin bu program sadece x-y ve z ekseninde hareketi lcd de gormek icin yapildi.dedigim gibi formdaki degerli arkadaslar ile ortak bir calisma ile daha ileriye goturebiliriz.siz isterseniz ham degerler ile bir deneyin ornek x ekseninde alinan deger dengede iken 100 ise x<95 den ileri-x>105 geri gibi diyerek dengede tutabilirsiniz

elektro77

Alıntı yapılan: Dtmf - 04 Ocak 2020, 14:12:05X-y ve z ekseni degerleri mpu6050 den alinan ham degerler.ham degreri biraz daha stabil hale getirirsek(kalman filtresi ile)neden olmasin bu program sadece x-y ve z ekseninde hareketi lcd de gormek icin yapildi.dedigim gibi formdaki degerli arkadaslar ile ortak bir calisma ile daha ileriye goturebiliriz.siz isterseniz ham degerler ile bir deneyin ornek x ekseninde alinan deger dengede iken 100 ise x<95 den ileri-x>105 geri gibi diyerek dengede tutabilirsiniz
siz proton kullanıcısınız galiba. Peki proton stm32 ailesinden herhangibir mcu yu desteklermi.Bu durumda dediğiniz gibi hem basici hemde stm yi kullanmış oluruz. Desteklemiyorsa bile stm yi dil öğrenmek yerine protonda veya pbp de yazabilmenin bir yolu yokmu. Çünki bu dediğimiz denge robotunun mcu sunun çok hızlı çalışması gerekir diye düşünüyorum. bu nedenle 72 mhz de çalışabilen stm32f103 tercih edilse hız sorunu kalmaz sanırım.
MPU6050 yi ne kadar hızlı okursak o kadar stabil bir işlem yapmış oluruz değilmi.bunları tamamen sınırlı bilgilerimi kullarak yazıyorum. Aynı zamanda ne zamandır jiroskop ve akselometre konularında bir şeyler yapmak ve bir denge robotu hayranı olduğum için.İç kulaktaki denge organının yapısı hakkında da düşünmediğim bir gün yok desem yeridir.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Dtmf

18f45k22 kullan 64mhz.20mhz yeterli olabilecegini dusunuyorum.stm ailesini hic kullanmadim

elektro77

#5
Boston Dynamics in ürettiği robot köpeği mutlaka görmüş olmalısınız. O robotunda bir jiroskop, akselometre ve ivme ölçen sensörler kullandığınını sanıyorum. Belki en hızlısından.
Sizce o köpeğe benzer bir robot yapmak istesem, ki mekanik olarak bu yeteneğe haizim 18f serisi 64Mhz bir işlemci ile yapılabilirmi.
Örneğin köpek dengede iken köpeği itiyorlar ve köpek itilen tarafa ayaklarını hemen açarak devrilmiyor. sadece bu hareket için bile bence 1000 lerce satır kod işleniyordur. 64 mhz de de 72 mhz de de bu hıza ulaşılabileceği konusunda şüpheliyim.Bilen varsa anlatsın bu köpeğin nasıl yapıldığını.Ne tür bir işlemci kullanıdığını. En azından bu yolda bir şeyler öğrenilmiş olunur sadece. Ve ben bu yoldan gitmek istesemde ve onlarca mekanizmayı ve motoru edinsemde yazılım öğrenmek konusunda bir türlü ne yeterli zamanı nede imkanı bulamıyorum. Her zaman bir şeyler eksik kalıyor.
Kusura bakmayın konu denge olduğu için bu kadar yazıyorum. Hep ilgilendiğim bir alan. fırsatını bulmuşken düşüncelerimi yazmak istedim. Vaktinizi çaldıysam özür dilerim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Dtmf

ıyı aksamlar degerlı arkadaslar mpu6050 ıle ılerleme kaydettım kalıbre ayarlarını yaptım X ve Y eksenınde.yalnız Z degerı uzerınde calısıyorum sımdılık ısıne yarayan olursa kullanabılır bu Z degerı hakkında fıkrı olan varsa yazabılırmı.
Device = 16F877A
Declare XTAL = 20          ' Kristal frekansı: 20 MHz
Declare ALL_DIGITAL = True  ' 16f877A nın tüm uçları Dijital
TRISA = %00000000:PORTA=0
TRISB = %00000000:PORTB=0
TRISC = %00000000
TRISD = %00000011
TRISE = %00000000
Declare RSOUT_PIN = PORTB.2 ' RSOut komutuyla gönderilecek veri için çıkış pinini tayin eder.
Declare SERIAL_BAUD = 9600  ' 0 dan 65535 bps e kadar
Declare RSOUT_MODE 0        ' Data 1= True Normal modda gönderilir. (Diğeri 0=Inverted modu)

Declare LCD_TYPE alpha  
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1  

Dim READAX  As Word
Dim READAY  As Word
Dim READAZ  As Word
Dim READX  As Word 
Dim READY  As Word
Dim READZ  As Word
Dim READT  As Word
Dim READT1  As Word
Dim XG As DWord
Dim XY As DWord
Dim XZ As DWord
;____________________________________________________________________________________________________________________        
Symbol SDA = PORTD.0  ' I2C Veri pimi. Çekme bağlantısı gerekiyor. Kurulu limanlarınıza göre değiştirebilirsiniz
Symbol SCL = PORTD.1  ' I2C saat pimi. Çekme bağlantısı gerekiyor. Kurulu limanlarınıza göre değiştirebilirsiniz
Symbol W_DATA = $D0  'Yazma işlemi gerçekleştirmek için kullanılır
Symbol R_DATA = $D1  'Okuma işlemi gerçekleştirmek için kullanılır
Symbol PWR_M1 = $6B  'Güç Yönetimi Kayıt 1. Bu kayıt, kullanıcının güç modunu ve saat kaynağını yapılandırmasına izin verir. Ayrıca, tüm Cihazı sıfırlamak için bir Bit ve sıcaklık sensörünü devre dışı bırakmak için bir Bit sağlar.
Symbol PWR_M2 = $6C  'Pow Low Power Modmeter and gyroscope into standby mode.
Symbol CONF_R = $1A  'Konfigürasyon Kayıt. Bu kayıt, hem harici Çerçeve Senkronizasyonu (FSYNC) pim örneklemesini hem de Dijital Düşük Geçişli Filtre (LPF) ayarını, hem jiroskoplar hem de ivmeölçer için yapılandırır.
Symbol G_CONF = $1B  'Gyro Konfigürasyon Kayıt. Bu kayıt, jiroskop kendi kendini testini tetiklemek ve jiroskop tam skala aralığını yapılandırmak için kullanılır.
Symbol A_CONF = $1C  'İvmeölçer Kongresi. Bu kayıt, ivmeölçerin kendi kendini sınamasını tetiklemek ve 
;ivmeölçerin tam ölçekli aralığını yapılandırmak için kullanılır. Bu kayıt aynı zamanda Dijital Yüksek Geçiş Filtresini (DHPF) yapılandırır.
Symbol XA_MSB = $3B  'Okundu Kaydı, ivmeölçer X MSB 8-Bit değeri çıkışı.
Symbol XA_LSB = $3C  'Okunmuş Kayıt, ivmeölçer X LSB 8-Bit değeri çıkışı.
Symbol YA_MSB = $3D  'Okundu Kaydı, ivmeölçer Y MSB 8-Bit değeri çıkışı.
Symbol YA_LSB = $3E  'Okundu Kaydı, ivmeölçer Y LSB 8-Bit değeri çıkışı.
Symbol ZA_MSB = $3F  'Okundu Kaydı, ivmeölçer Z MSB 8-Bit değeri çıkışı.
Symbol ZA_LSB = $40  'Okundu Kaydı, ivmeölçer Z LSB 8-Bit değeri çıkışı.
Symbol TEMP_M = $41  'Okuma Kaydı, Sıcaklık MSB 8-Bit Değeri çıkışı.
Symbol TEMP_L = $42  'Okunan Kayıt, Sıcaklık LSB 8 Bitlik değer çıkışı.
Symbol XG_MSB = $43  'Okunmuş Kayıt, Gyro X MSB 8-Bit değerinin çıkışı.
Symbol XG_LSB = $44  'Okunan Kayıt, Gyro X LSB 8-Bit değerinin çıkışı.
Symbol YG_MSB = $45  'Oku Kayıt, Gyro Y MSB 8-Bit değeri çıkışı.
Symbol YG_LSB = $46  'Okunan Kayıt, Gyro Y LSB 8-Bit Değeri Çıktısı.
Symbol ZG_MSB = $47  'Okunmuş Kayıt, Gyro Z MSB 8-Bit değerinin çıkışı.
Symbol ZG_LSB = $48  'Okunan Kayıt, Gyro Z LSB 8-Bit değerinin çıkışı.
;_______________________________________________________________________________________________________________
DelayMS 200
Print At 1,1,"KALIBRE EDILIYOR"
I2COut SDA,SCL,W_DATA,PWR_M1,[%10000000]  'KAYIT 6B Yapılandırması (PWR YÖNETİMİ) MPU6050 sıfırlama
DelayMS 100
I2COut SDA,SCL,W_DATA,PWR_M1,[%00000010]  'KAYIT 6B Yapılandırması (PWR YÖNETİMİ) MPU6050 START
DelayMS 100
I2COut SDA,SCL,W_DATA,CONF_R,[%00000011]  'RESISTOR 1A Yapılandırma (FILTER Config)
DelayMS 10
I2COut SDA,SCL,W_DATA,G_CONF,[%00011000]  'KAYDEDİCİ 1B Yapılandırma (GYRO Yapılandırması)
DelayMS 10
I2COut SDA,SCL,W_DATA,A_CONF,[%00011000]  'KAYDEDİC 1C Yapılandırması (ACCELERATOR Config)
DelayMS 10

I2COut SDA,SCL,W_DATA,$19,[%00000001]  ;SMPLRT_DIV
DelayMS 100
I2COut SDA,SCL,W_DATA,$37,[%00000001] ;RA-INT PIN -CONFG 
DelayMS 100
I2COut SDA,SCL,W_DATA,$38,[%00000001]  ;RA-INT-ENABLE  AKTIF ETMEK ISTENEN SON RAKAMI 1 PASIF 0
DelayMS 2000
Cls
;=======================================ANA PROGRAM==========================================================
BASLA:
Print At 1,6,"  MPU6050  "
I2CIn SDA,SCL,R_DATA,XA_MSB,[READAX.HighByte]  '16-Bit X Ekseninin ilk 8 biti
DelayUS 10
I2CIn SDA,SCL,R_DATA,XA_LSB,[READAX.LowByte ]:DelayUS 10  '16-Bit X Ekseninin ikinci 8 biti
I2CIn SDA,SCL,R_DATA,YA_MSB,[READAY.HighByte]:DelayUS 10
I2CIn SDA,SCL,R_DATA,YA_LSB,[READAY.LowByte ]:DelayUS 10
I2CIn SDA,SCL,R_DATA,ZA_MSB,[READAZ.HighByte]:DelayUS 10
I2CIn SDA,SCL,R_DATA,ZA_LSB,[READAZ.LowByte ]:DelayUS 10
I2CIn SDA,SCL,R_DATA,TEMP_M,[READT.HighByte ]:DelayUS 10
I2CIn SDA,SCL,R_DATA,TEMP_L,[READT.LowByte  ]:DelayUS 10

I2CIn SDA,SCL,R_DATA,XG_MSB,[READX.HighByte] :DelayUS 10 
I2CIn SDA,SCL,R_DATA,XG_LSB,[READX.LowByte ] :DelayUS 10
I2CIn SDA,SCL,R_DATA,YG_MSB,[READY.HighByte] :DelayUS 10
I2CIn SDA,SCL,R_DATA,YG_LSB,[READY.LowByte ] :DelayUS 10
I2CIn SDA,SCL,R_DATA,ZG_MSB,[READZ.HighByte]  :DelayUS 10
I2CIn SDA,SCL,R_DATA,ZG_LSB,[READZ.LowByte ]  :DelayUS 10
DelayMS 50
READT1 = (READT / 340 + 36)-192

XG=(READAX.HighByte<<8) + READAX.LowByte
XG=XG/13

XY=(READAY.HighByte<<8) + READAY.LowByte
XY=XY/13

XZ=(READAZ.HighByte<<8) + READAZ.LowByte
XZ=XZ/13

Print At 2,1,"XG:",SDEC XG
Print At 2,10,"XY:",SDEC XY
Print At 3,6,"XZ:",SDEC XZ
DelayMS 300  
Cls      
GoTo BASLA

elektro77

z değeri konusunda bir şeyler yapabildiniz mi? Sizi pür dikkat takip ediyorum.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Dtmf

Elektro77 z degerı uzerınde calısıyorum bıtırecegım ınsallah paylasacagım suan x ve y degerlerı guzel calısıyor stabıl.bırde Z degerı nı halledersek tamamdır.aslın da  Z degerı calısıyor soyle ornegın x kordınatı uzerınde yapılan bır acı ıle z degerı calısıyor yanı z degerının calısması ıcın x ve y acılarında hareketlılık olması lazım benım amacım x ve  degerı 0 ıken bıle z degerını alabılmek

Dtmf

Iyi aksamlar arkadaslar mpu6050 Z degeri icin bize yardimci olacak yokmu.eccelometre degerleri Z ekseninde sonuc veriyor ama bana gayro degeri lazim gyro degeri cok degismiyor 2034-2040 arasi gidip geliyor ne yapmamiz lazim

Powered by EzPortal