سلام به دوستان.بی مقدمه، بنا به نیاز یک پروژه ناچار به استفاده از حسگر ژیروسکوپ 6050 در قالب یک ماژول شدم. از اونجا هم که قصد نوشتن برنامه استفاده از این حسگر رو در ربان بیسیک و کامپایلر بسکام داشتم. طبیعتا دنبال پروژه های مشابه و استفاده از تجارب دیگران توی فروم های مختلف جستجو کردم اما اغلب دوستان پروژه هایی در زبان c رو با کتابخانه های ثابت ارائه داده بودن. من هم به کاتالوگ اصلی و کاتالوگ رجیستر های چیپ رجوع کردمو برنامه مورد نیازمو در کامپایلر بسکام تهیه کردم.
قسمت اصلی شاخه برنامه رو هم برای شما به انتشار میذارم شاید به درد کسی خورد
تو قسمت کامنت ها توضیحات مختصری نوشتم. لازمه ذکر کنم که قبل از هر مرتبه خوندن رجیستر های اطلاعات ماژول، تنظیم رجیستر ها ی فرکانس کاری، مقیاس ژیرو و شتاب سنج و وضعیت کار ( پاور ) چیپ رو باید مجدد انجام بدید. البته در هر بار اتصال جریان یک بارش کافیه اما تکرارش میتونه خیال شما رو بابت ارتباط صحیح راحت کنه.
دو فایل کاتالوگ دستگاه و آدرس رجیستر ها رو هم برای دانلود لینک میکنم
قسمت اصلی شاخه برنامه رو هم برای شما به انتشار میذارم شاید به درد کسی خورد
تو قسمت کامنت ها توضیحات مختصری نوشتم. لازمه ذکر کنم که قبل از هر مرتبه خوندن رجیستر های اطلاعات ماژول، تنظیم رجیستر ها ی فرکانس کاری، مقیاس ژیرو و شتاب سنج و وضعیت کار ( پاور ) چیپ رو باید مجدد انجام بدید. البته در هر بار اتصال جریان یک بارش کافیه اما تکرارش میتونه خیال شما رو بابت ارتباط صحیح راحت کنه.
دو فایل کاتالوگ دستگاه و آدرس رجیستر ها رو هم برای دانلود لینک میکنم
'Master headers
$regfile = "m32def.dat"
$crystal = 8000000
'Ports configurations
Config Portb = Output
'Configuration LCD
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , Rs = Portb.0 , E = Portb.1
Config Lcd = 16 * 2
Cursor Off
'Configuration I2C protocol connections
Config Sda = Portc.1
Config Scl = Portc.0
Config I2cdelay = 5
Const Mpu6050_w = &HD0
Const Mpu6050_r = &HD1
'Callback variables
Dim Key_flag As Bit
Dim Temp_l As Byte
Dim Temp_h As Byte
Dim Acc_xl As Byte
Dim Acc_xh As Byte
Dim Acc_yl As Byte
Dim Acc_yh As Byte
Dim Acc_zl As Byte
Dim Acc_zh As Byte
Dim Gyr_xl As Byte
Dim Gyr_xh As Byte
Dim Gyr_yl As Byte
Dim Gyr_yh As Byte
Dim Gyr_zl As Byte
Dim Gyr_zh As Byte
Dim Temp As Integer
Dim Acc_x As Integer
Dim Acc_y As Integer
Dim Acc_z As Integer
Dim Gyr_x As Integer
Dim Gyr_y As Integer
Dim Gyr_z As Integer
'Rename terminals
Lcd_bl Alias Portb.6
'Pre start
Set Lcd_bl
'Script here
Here:
'Get from I2C
I2cstart
I2cwbyte Mpu6050_w 'Set Clock source
I2cwbyte &H6B
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Config gyro scale
I2cwbyte &H1B
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Config acc scale
I2cwbyte &H1C
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Sample rate divider
I2cwbyte &H19
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Start reading registers from #ADD 59 '
I2cwbyte 59
I2cstop
I2cstart
I2cwbyte Mpu6050_r
I2crbyte Acc_xh , Ack
I2crbyte Acc_xl , Ack
I2crbyte Acc_yh , Ack
I2crbyte Acc_yl , Ack
I2crbyte Acc_zh , Ack
I2crbyte Acc_zl , Ack
I2crbyte Temp_h , Ack
I2crbyte Temp_l , Ack
I2crbyte Gyr_xh , Ack
I2crbyte Gyr_xl , Ack
I2crbyte Gyr_yh , Ack
I2crbyte Gyr_yl , Ack
I2crbyte Gyr_zh , Ack
I2crbyte Gyr_zl , Nack
I2cstop
'Calculate & fine
Acc_x = Acc_xh * 256
Acc_x = Acc_x + Acc_xl
Acc_y = Acc_yh * 256
Acc_y = Acc_y + Acc_yl
Acc_z = Acc_zh * 256
Acc_z = Acc_z + Acc_zl
Temp = Temp_h * 256
Temp = Temp + Temp_l
Gyr_x = Gyr_xh * 256
Gyr_x = Gyr_x + Gyr_xl
Gyr_y = Gyr_yh * 256
Gyr_y = Gyr_y + Gyr_yl
Gyr_z = Gyr_zh * 256
Gyr_z = Gyr_z + Gyr_zl
Acc_x = Acc_x / 16384
Acc_y = Acc_y / 16384
Acc_z = Acc_z / 16384
Gyr_x = Gyr_x / 131
Gyr_y = Gyr_y / 131
Gyr_z = Gyr_z / 131
Temp = Temp / 340
Temp = Temp + 36.53
Locate 1 , 1
Lcd Acc_x ; "." ; Acc_y ; "." ; Acc_z ; "." ; Temp ; " "
Locate 2 , 1
Lcd Gyr_x ; "." ; Gyr_y ; "." ; Gyr_z ; " "
Wait 1
Goto Here
$regfile = "m32def.dat"
$crystal = 8000000
'Ports configurations
Config Portb = Output
'Configuration LCD
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , Rs = Portb.0 , E = Portb.1
Config Lcd = 16 * 2
Cursor Off
'Configuration I2C protocol connections
Config Sda = Portc.1
Config Scl = Portc.0
Config I2cdelay = 5
Const Mpu6050_w = &HD0
Const Mpu6050_r = &HD1
'Callback variables
Dim Key_flag As Bit
Dim Temp_l As Byte
Dim Temp_h As Byte
Dim Acc_xl As Byte
Dim Acc_xh As Byte
Dim Acc_yl As Byte
Dim Acc_yh As Byte
Dim Acc_zl As Byte
Dim Acc_zh As Byte
Dim Gyr_xl As Byte
Dim Gyr_xh As Byte
Dim Gyr_yl As Byte
Dim Gyr_yh As Byte
Dim Gyr_zl As Byte
Dim Gyr_zh As Byte
Dim Temp As Integer
Dim Acc_x As Integer
Dim Acc_y As Integer
Dim Acc_z As Integer
Dim Gyr_x As Integer
Dim Gyr_y As Integer
Dim Gyr_z As Integer
'Rename terminals
Lcd_bl Alias Portb.6
'Pre start
Set Lcd_bl
'Script here
Here:
'Get from I2C
I2cstart
I2cwbyte Mpu6050_w 'Set Clock source
I2cwbyte &H6B
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Config gyro scale
I2cwbyte &H1B
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Config acc scale
I2cwbyte &H1C
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Sample rate divider
I2cwbyte &H19
I2cwbyte 0
I2cstart
I2cwbyte Mpu6050_w 'Start reading registers from #ADD 59 '
I2cwbyte 59
I2cstop
I2cstart
I2cwbyte Mpu6050_r
I2crbyte Acc_xh , Ack
I2crbyte Acc_xl , Ack
I2crbyte Acc_yh , Ack
I2crbyte Acc_yl , Ack
I2crbyte Acc_zh , Ack
I2crbyte Acc_zl , Ack
I2crbyte Temp_h , Ack
I2crbyte Temp_l , Ack
I2crbyte Gyr_xh , Ack
I2crbyte Gyr_xl , Ack
I2crbyte Gyr_yh , Ack
I2crbyte Gyr_yl , Ack
I2crbyte Gyr_zh , Ack
I2crbyte Gyr_zl , Nack
I2cstop
'Calculate & fine
Acc_x = Acc_xh * 256
Acc_x = Acc_x + Acc_xl
Acc_y = Acc_yh * 256
Acc_y = Acc_y + Acc_yl
Acc_z = Acc_zh * 256
Acc_z = Acc_z + Acc_zl
Temp = Temp_h * 256
Temp = Temp + Temp_l
Gyr_x = Gyr_xh * 256
Gyr_x = Gyr_x + Gyr_xl
Gyr_y = Gyr_yh * 256
Gyr_y = Gyr_y + Gyr_yl
Gyr_z = Gyr_zh * 256
Gyr_z = Gyr_z + Gyr_zl
Acc_x = Acc_x / 16384
Acc_y = Acc_y / 16384
Acc_z = Acc_z / 16384
Gyr_x = Gyr_x / 131
Gyr_y = Gyr_y / 131
Gyr_z = Gyr_z / 131
Temp = Temp / 340
Temp = Temp + 36.53
Locate 1 , 1
Lcd Acc_x ; "." ; Acc_y ; "." ; Acc_z ; "." ; Temp ; " "
Locate 2 , 1
Lcd Gyr_x ; "." ; Gyr_y ; "." ; Gyr_z ; " "
Wait 1
Goto Here