اتصال سنسور ژیروسکوپ MPU6050 با Raspberry Pi
قطعات مورد نیاز:
- برد Raspberry Pi
- مازول ژیروسکوپ MPU6050
- ۱۶×۲ LCD
سنسور ژیروسکوپ MPU6050:
MPU-6050 یک ژیروسکوپ و شتاب سنج ۸ پین ۶ محوره در یک تراشه است. این ماژول به طور پیش فرض روی ارتباطات سریال I2C کار می کند اما با پیکربندی رجیستری می تواند برای رابط SPI پیکربندی شود. برای I2C خطوط SDA و SCL دارد. تقریباً همه پین ها چند کاره هستند اما در اینجا ما فقط با پین های حالت I2C کار می کنیم.
پیکربندی پایه ها:
Vcc: – این پین برای تأمین ولتاژ ماژول MPU6050 استفاده می شود
GND: – پایه زمین
SDA: پین SDA برای داده های بین کنترل کننده و ماژول mpu6050 بکار می رود
SCL: – از پین SCL برای ورودی ساعت استفاده می شود
XDA: – این خط داده سنسور I2C SDA برای پیکربندی و خواندن از حسگرهای خارجی است ((اختیاری) که در مورد ما استفاده نمی شود)
XCL: – این خط ساعت سنسور I2C SCL برای پیکربندی و خواندن از حسگرهای خارجی است ((اختیاری) که در مورد ما استفاده نمی شود)
ADO: – آدرس بندی I2C LSB (در مورد ما قابل استفاده نیست)
INT: – پین را برای نشان دادن داده آماده آماده کنید.
توضیحات عملکرد مدار:
در این آموزش، ما با استفاده از MPU6050 و Raspberry Pi، قرائت دما، ژیروسکوپ و شتاب سنج را روی LCD نشان می دهیم
ابتدا مقدار دما را از طریق LCD نشان داده و پس از مدتی مقادیر ژیروسکوپی را نشان می دهیم و پس از آن خواندن شتاب سنج را داریم که در تصاویر زیر نشان داده شده است:
شماتیک مدار و توضیحات:
شماتیک مدار برای این آموزش بسیار ساده است. ما از یک LCD و MPU6050 استفاده کرده ایم، پتانسیومتر 10k برای کنترل روشنایی LCD بکار می رود. در ارتباط با MPU6050، ما ۴ اتصال انجام داده ایم که در آن منبع تغذیه ۳.3v و زمین MPU6050 را به ۳.3v و زمین Raspberry Pi متصل کرده ایم.
پین های SCL و SDA MPU6050 با پین ۳ Raspberry (GPIO2) و پایه ۵ (GPIO3) متصل می شوند. LCD های RS ، RW و EN مستقیماً به GPIO18 و ۲۳ Rasspberry pi متصل هستند. پین داده ها مستقیماً به شماره پین دیجیتال GPIO24 ، GPIO25 ، GPIO8 و GPIO7 متصل می شوند
پیکربندی Raspberry Pi برای سنسور Gyro MPU6050:
قبل از شروع برنامه نویسی، باید I2C برد Raspberry Pi را با استفاده از روش داده شده فعال کنیم:
مرحله ۱: ارتباط I2C را فعال کنید
قبل از نصب کتابخانه Adafruit SSD1306 ، باید ارتباط I2C را در Raspberry Pi فعال کنیم.
sudo raspi-config
در این قسمت گزینه I2C را انتخاب کنیم
در بخش بعد، باید yes را انتخاب کرده و enter را فشار داده و سپس ok را فشار دهید
با دستور زیر باید Raspberry pi را مجدداً راه اندازی کنیم:
sodo reboot
مرحله ۲: کتابخانه python-pip و GPIO را نصب کنید
sudo apt-get install build-essential python-dev python-pip
پس از این، ما باید کتابخانه GPIO را نصب کنیم
sudo pip installs RPi.GPIO
مرحله ۳: کتابخانه smbus را نصب کنید
در آخر، ما باید کتابخانه smbus را با استفاده از دستور داده شده در Raspberry Pi نصب کنیم:
sudo apt-get install python-smbus
مرحله ۴: کتابخانه MPU6050 را نصب شود
بعد از این بخش با استفاده از دستور داده شده، کتابخانه MPU6050 را نصب کنیم
sudo pip install mpu6050
اکنون می توانیم کدهای نمونه را در مثال ها پیدا کنیم. کاربر می تواند با بارگذاری مستقیم در Raspberry Pi، کدها را تست کند یا آن را مطابق با نیاز تغییر دهد. در اینجا ما مقادیر محورهای X ، Y و Z MPU6050 را روی LCD 16×2 نمایش داده ایم. می توانید کد کامل پایتون را در انتهای آموزش مشاهده کنید.
توضیحات برنامه :
کد پایتون کامل در انتها آورده شده است که ما در اینجا چندین بخش مهم کد را توضیح می دهیم.
در برنامه پایتون، ما برخی از کتابخانه های مورد نیاز مانند زمان ، smbus و GPIO را وارد کرده ایم.
import smbus import time import RPi.GPIO as gpio
برای پیکربندی MPU6050 و بدست آوردن مقادیر از همان آدرس مقادیر ثبات را باید بگیریم. ما همچنین برخی از متغیرها را برای کالیبراسیون و مقداردهی اولیه گذرگاه برای I2C در نظر گرفته ایم.
PWR_M = 0x6B DIV = 0x19 CONFIG = 0x1A GYRO_CONFIG = 0x1B INT_EN = 0x38 ACCEL_X = 0x3B ACCEL_Y = 0x3D ACCEL_Z = 0x3F GYRO_X = 0x43 GYRO_Y = 0x45 GYRO_Z = 0x47 TEMP = 0x41 bus = smbus.SMBus(1) Device_Address = 0x68 # device address AxCal=0 AyCal=0 AzCal=0 GxCal=0 GyCal=0 GzCal=0
برخی از توابع را برای درایور 16x2LCD مانند def start () ،def cmd (ch) ،def write (ch) ،def print (str) ،def clear و غیره نوشتیم.
پس از این، ما نیاز به معرفی ماژول MPU6050 داریم
def InitMPU(): bus.write_byte_data(Device_Address, DIV, 7) bus.write_byte_data(Device_Address, PWR_M, 1) bus.write_byte_data(Device_Address, CONFIG, 0) bus.write_byte_data(Device_Address, GYRO_CONFIG, 24) bus.write_byte_data(Device_Address, INT_EN, 1) time.sleep(1)
برخی از توابع را برای خواندن مقادیر از MPU6050 بنویسید و آنها را به LCD نمایش دهید. تابع داده شده برای خواندن داده ها از MPU6050 استفاده می شود.
def readMPU(addr): high = bus.read_byte_data(Device_Address, addr) low = bus.read_byte_data(Device_Address, addr+1) value = ((high << 8) | low) if(value > 32768): value = value - 65536 return value
def accel(): x = readMPU(ACCEL_X) y = readMPU(ACCEL_Y) z = readMPU(ACCEL_Z) Ax = (x/16384.0-AxCal) Ay = (y/16384.0-AyCal) Az = (z/16384.0-AzCal) #print "X="+str(Ax) display(Ax,Ay,Az) time.sleep(.01) def gyro(): global GxCal global GyCal global GzCal x = readMPU(GYRO_X) y = readMPU(GYRO_Y) z = readMPU(GYRO_Z) Gx = x/131.0 - GxCal Gy = y/131.0 - GyCal Gz = z/131.0 - GzCal #print "X="+str(Gx) display(Gx,Gy,Gz) time.sleep(.01)
تابع خواندن دما
def temp(): tempRow=readMPU(TEMP) tempC=(tempRow / 340.0) + 36.53 tempC="%.2f" %tempC print tempC setCursor(0,0) Print("Temp: ") Print(str(tempC)) time.sleep(.2)
def calibrate برای کالیبره کردن MPU6050 و از تابع def display برای نمایش مقادیر روی LCD استفاده می شود.
در بخش بعد LCD را معرفی کرده و MPU6050 را کالیبره می کنیم و سپس در حلقه while، هر سه مجموعه مقدار MPU – دما ، شتاب سنج و ژیرو را فراخوانی کرده و آنها را از طریق LCD نشان می دهیم
begin() Print("MPU6050 Interface") setCursor(0,1) Print("Circuit Digest") time.sleep(2) InitMPU() calibrate() while 1: InitMPU() clear() for i in range(20): temp() clear() Print("Accel") time.sleep(1) for i in range(30): accel() clear() Print("Gyro") time.sleep(1) for i in range(30): gyro()
کد کامل برنامه به زبان پایتون:
import smbus import time import RPi.GPIO as gpio PWR_M = 0x6B DIV = 0x19 CONFIG = 0x1A GYRO_CONFIG = 0x1B INT_EN = 0x38 ACCEL_X = 0x3B ACCEL_Y = 0x3D ACCEL_Z = 0x3F GYRO_X = 0x43 GYRO_Y = 0x45 GYRO_Z = 0x47 TEMP = 0x41 bus = smbus.SMBus(1) Device_Address = 0x68 # device address AxCal=0 AyCal=0 AzCal=0 GxCal=0 GyCal=0 GzCal=0 RS =18 EN =23 D4 =24 D5 =25 D6 =8 D7 =7 gpio.setwarnings(False) gpio.setmode(gpio.BCM) gpio.setup(RS, gpio.OUT) gpio.setup(EN, gpio.OUT) gpio.setup(D4, gpio.OUT) gpio.setup(D5, gpio.OUT) gpio.setup(D6, gpio.OUT) gpio.setup(D7, gpio.OUT) def begin(): cmd(0x33) cmd(0x32) cmd(0x06) cmd(0x0C) cmd(0x28) cmd(0x01) time.sleep(0.0005) def cmd(ch): gpio.output(RS, 0) gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x10==0x10: gpio.output(D4, 1) if ch&0x20==0x20: gpio.output(D5, 1) if ch&0x40==0x40: gpio.output(D6, 1) if ch&0x80==0x80: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) # Low bits gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x01==0x01: gpio.output(D4, 1) if ch&0x02==0x02: gpio.output(D5, 1) if ch&0x04==0x04: gpio.output(D6, 1) if ch&0x08==0x08: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) def write(ch): gpio.output(RS, 1) gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x10==0x10: gpio.output(D4, 1) if ch&0x20==0x20: gpio.output(D5, 1) if ch&0x40==0x40: gpio.output(D6, 1) if ch&0x80==0x80: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) # Low bits gpio.output(D4, 0) gpio.output(D5, 0) gpio.output(D6, 0) gpio.output(D7, 0) if ch&0x01==0x01: gpio.output(D4, 1) if ch&0x02==0x02: gpio.output(D5, 1) if ch&0x04==0x04: gpio.output(D6, 1) if ch&0x08==0x08: gpio.output(D7, 1) gpio.output(EN, 1) time.sleep(0.005) gpio.output(EN, 0) def clear(): cmd(0x01) def Print(Str): l=0; l=len(Str) for i in range(l): write(ord(Str[i])) def setCursor(x,y): if y == 0: n=128+x elif y == 1: n=192+x cmd(n) def InitMPU(): bus.write_byte_data(Device_Address, DIV, 7) bus.write_byte_data(Device_Address, PWR_M, 1) bus.write_byte_data(Device_Address, CONFIG, 0) bus.write_byte_data(Device_Address, GYRO_CONFIG, 24) bus.write_byte_data(Device_Address, INT_EN, 1) time.sleep(1) def display(x,y,z): x=x*100 y=y*100 z=z*100 x= "%d" %x y= "%d" %y z= "%d" %z setCursor(0,0) Print("X Y Z") setCursor(0,1) Print(str(x)) Print(" ") setCursor(6,1) Print(str(y)) Print(" ") setCursor(12,1) Print(str(z)) Print(" ") print x print y print z def readMPU(addr): high = bus.read_byte_data(Device_Address, addr) low = bus.read_byte_data(Device_Address, addr+1) value = ((high << 8) | low) if(value > 32768): value = value - 65536 return value def accel(): x = readMPU(ACCEL_X) y = readMPU(ACCEL_Y) z = readMPU(ACCEL_Z) Ax = (x/16384.0-AxCal) Ay = (y/16384.0-AyCal) Az = (z/16384.0-AzCal) #print "X="+str(Ax) display(Ax,Ay,Az) time.sleep(.01) def gyro(): global GxCal global GyCal global GzCal x = readMPU(GYRO_X) y = readMPU(GYRO_Y) z = readMPU(GYRO_Z) Gx = x/131.0 - GxCal Gy = y/131.0 - GyCal Gz = z/131.0 - GzCal #print "X="+str(Gx) display(Gx,Gy,Gz) time.sleep(.01) def temp(): tempRow=readMPU(TEMP) tempC=(tempRow / 340.0) + 36.53 tempC="%.2f" %tempC print tempC setCursor(0,0) Print("Temp: ") Print(str(tempC)) time.sleep(.2) def calibrate(): clear() Print("Calibrate....") global AxCal global AyCal global AzCal x=0 y=0 z=0 for i in range(50): x = x + readMPU(ACCEL_X) y = y + readMPU(ACCEL_Y) z = z + readMPU(ACCEL_Z) x= x/50 y= y/50 z= z/50 AxCal = x/16384.0 AyCal = y/16384.0 AzCal = z/16384.0 print AxCal print AyCal print AzCal global GxCal global GyCal global GzCal x=0 y=0 z=0 for i in range(50): x = x + readMPU(GYRO_X) y = y + readMPU(GYRO_Y) z = z + readMPU(GYRO_Z) x= x/50 y= y/50 z= z/50 GxCal = x/131.0 GyCal = y/131.0 GzCal = z/131.0 print GxCal print GyCal print GzCal begin(); Print("MPU6050 Interface") setCursor(0,1) Print("Circuit Digest") time.sleep(2) InitMPU() calibrate() while 1: InitMPU() clear() for i in range(20): temp() clear() Print("Accel") time.sleep(1) for i in range(30): accel() clear() Print("Gyro") time.sleep(1) for i in range(30): gyro()
مطالب پیشنهادی برای شما
- معرفی Webmin برای کار با Raspberry Pi
- ۱۰ مورد مهم از مشکلات راه اندازی Raspberry Pi و راه حل آنها
- اتصال سنسور هال با رزبری پای
- نکات بهبود امنیت Raspberry Pi
- نصب صفحه کلید لمسی مجازی روی Raspberry Pi
- بازیابی رمز عبور Raspberry Pi
- مقدمه ای بر Embedded Linux (بخش اول) - آذر ۲۰, ۱۴۰۳
- تفاوت بین روتر و فایروال - مهر ۱۰, ۱۴۰۳
- مسیریابی استاتیک در ویندوز - مهر ۸, ۱۴۰۳