สารบัญ:

การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12: 6 ขั้นตอน
การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12: 6 ขั้นตอน

วีดีโอ: การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12: 6 ขั้นตอน

วีดีโอ: การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12: 6 ขั้นตอน
วีดีโอ: การใช้งาน MPU-6050 กับ ESP8266 2024, พฤศจิกายน
Anonim
การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12
การควบคุมเซอร์โวโดยใช้ MPU6050 ระหว่าง Arduino และ ESP8266 ด้วย HC-12

ในโครงการนี้ เรากำลังควบคุมตำแหน่งของเซอร์โวมอเตอร์โดยใช้ mpu6050 และ HC-12 สำหรับการสื่อสารระหว่าง Arduino UNO และ ESP8266 NodeMCU

ขั้นตอนที่ 1: เกี่ยวกับโครงการนี้

เป็นโครงการ IoT อีกโครงการหนึ่งที่ใช้โมดูล RF HC-12 ที่นี่ข้อมูล imu (mpu6050) จาก arduino ใช้เพื่อควบคุมเซอร์โวมอเตอร์ (เชื่อมต่อกับ Nodemcu) ที่นี่ การสร้างภาพข้อมูลยังดำเนินการที่ด้าน Arduino โดยที่ข้อมูลระดับเสียงของ mpu6050 (การหมุนเกี่ยวกับแกน x) จะแสดงภาพด้วยภาพร่างการประมวลผล (จะกล่าวถึงในภายหลัง) โดยพื้นฐานแล้วโครงการนี้เป็นเพียงการอุ่นเครื่องเล็กน้อยสำหรับการจดจำแง่มุมต่างๆ ของการควบคุม Imu & Servo ด้วย Arduino และ ESP8266 nodemcu

วัตถุประสงค์

วัตถุประสงค์ที่ชัดเจนคือ เรากำลังควบคุมตำแหน่งของเซอร์โวมอเตอร์โดยใช้ค่าพิทช์ของ IMU และเมื่อรวมกันแล้วระยะพิทช์และตำแหน่งของมอเตอร์ที่ซิงโครไนซ์จะแสดงให้เห็นด้วยการประมวลผล

ขั้นตอนที่ 2: ต้องใช้ฮาร์ดแวร์

NodeMCU ESP8266 12E โมดูล Wifi

เขียงหั่นขนมไร้บัดกรี

สายจัมเปอร์

MPU6050 คันเร่ง+ไจโร

โมดูล RF HC-12 (คู่)

SG90 เซอร์โวมอเตอร์

ขั้นตอนที่ 3: วงจรและการเชื่อมต่อ

วงจรและการเชื่อมต่อ
วงจรและการเชื่อมต่อ
วงจรและการเชื่อมต่อ
วงจรและการเชื่อมต่อ

การเชื่อมต่อตรงไปตรงมา คุณสามารถจ่ายไฟให้กับเซอร์โวด้วย Nodemcu 3.3V ของคุณ คุณยังสามารถใช้ Vin เพื่อจ่ายไฟให้กับเซอร์โวได้หาก nodemcu ของคุณมีแรงดันไฟฟ้าบนพินนั้นมาก แต่บอร์ด Lolin ส่วนใหญ่ไม่มี 5V ที่ Vin (ขึ้นอยู่กับผู้ผลิต)

แผนภาพวงจรเหล่านี้สร้างขึ้นโดยใช้ EasyADA

ขั้นตอนที่ 4: การทำงาน

ทำงาน
ทำงาน

ทันทีที่ร่าง Arduino เริ่มต้น มันจะส่งมุมพิทช์ (ซึ่งอยู่ในช่วง -45 ถึง 45) ไปยังตัวรับ hc12 ของ Nodemcu ที่จับคู่กับตำแหน่งเซอร์โว 0 ถึง 180 องศา ที่นี่เราใช้มุมพิทช์ตั้งแต่ -45 ถึง +45 องศา เพื่อให้เราสามารถแมปกับตำแหน่งเซอร์โวได้อย่างง่ายดาย

ตอนนี้ คุณกำลังคิดว่าทำไมเราถึงใช้วิธีแผนที่ง่ายๆ ได้ดังนี้:-

int pos = แผนที่ (val, -45, 45, 0, 180);

เนื่องจากได้รับมุมลบที่ส่งโดยตัวส่ง hc12 เป็น:

ครึ่งแรก: (T)0 ถึง 45 => 0 ถึง 45(R)

ครึ่งหลัง: (T)-45 ถึง -1 => 255 ถึง 210(R)

ดังนั้นคุณต้องแมปมันกับ 0 ถึง 180 as

if(val>=0 && val<=45) pos = (val*2)+90; อื่น ๆ pos = (val-210)*2;

ฉันกำลังหลีกเลี่ยงวิธีการทำแผนที่เนื่องจากมีข้อผิดพลาดที่ไม่เกี่ยวข้อง คุณสามารถลองและแสดงความคิดเห็นว่าใช้ได้กับคุณ

if(val>=0 && val<=45) pos = map(val, 0, 45, 90, 180); อื่น pos = แผนที่ (val, 255, 210, 0, 90); // อาร์กิวเมนต์ที่ 4 สามารถเป็น 2 (คุณสามารถตรวจสอบได้)

MPU6050 การคำนวณมุมพิทช์

ฉันใช้ไลบรารี MPU6050_tockn ซึ่งอิงจากการให้ข้อมูลดิบจาก IMU

int pitchAngle = mpu6050.getAngleX()

จะได้มุมการหมุนรอบแกน x ดังที่คุณเห็นในภาพ imu ของฉันถูกวางในแนวตั้งบนเขียงหั่นขนม ดังนั้นอย่าสับสนกับ pitch และ roll จริงๆแล้วคุณควรเห็นแกนพิมพ์อยู่บนกระดานฝ่าวงล้อม

ผ่านห้องสมุดนี้ คุณไม่ต้องกังวลเกี่ยวกับอุปกรณ์อิเล็กทรอนิกส์ภายในของการอ่านการลงทะเบียนเฉพาะสำหรับการทำงานเฉพาะ คุณระบุเฉพาะงานและคุณทำเสร็จแล้ว!

แต่ถ้าคุณต้องการคำนวณมุมด้วยตัวเอง คุณสามารถทำได้อย่างง่ายดายดังนี้:

#รวม

const int MPU6050_addr=0x68; int16_t AcX, AcY, AcZ, อุณหภูมิ, GyroX, GyroY, GyroZ; การตั้งค่าเป็นโมฆะ () { Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(จริง); Serial.begin(9600); } วงเป็นโมฆะ () { Wire.beginTransmission (MPU6050_addr); Wire.write(0x3B); Wire.endTransmission (เท็จ); Wire.requestFrom(MPU6050_addr, 14, จริง); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Temp=Wire.read()<<8|Wire.read(); GyroX=Wire.read()<<8|Wire.read(); GyroY=Wire.read()<<8|Wire.read(); GyroZ=Wire.read()<<8|Wire.read();

int xAng = แผนที่ (AcX, minVal, maxVal, -90, 90); int yAng = แผนที่ (AcY, minVal, maxVal, -90, 90); int zAng = แผนที่ (AcZ, minVal, maxVal, -90, 90); x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI); Serial.print("มุมX= "); // ระยะห่าง Serial.println(x); Serial.print("มุมY= "); //ม้วน Serial.println(y); Serial.print("มุมZ= "); //หันเห Serial.println(z); }

แต่คุณไม่จำเป็นต้องเขียนโค้ดมากขนาดนี้เพื่อให้ได้มุม คุณควรทราบข้อเท็จจริงเบื้องหลัง แต่การใช้ห้องสมุดของผู้อื่นมีประสิทธิภาพมากในหลายโครงการ คุณสามารถอ่านเกี่ยวกับ imu นี้และแนวทางอื่นๆ เพื่อรับข้อมูลที่กรองเพิ่มเติมได้จากลิงก์ต่อไปนี้: Explore-mpu6050

รหัส Arduino ของฉันที่จุดสิ้นสุดการส่งสัญญาณมีเพียง 30 บรรทัดด้วยความช่วยเหลือของห้องสมุด MPU6050_tockn ดังนั้นการใช้ห้องสมุดจึงดีเว้นแต่คุณไม่จำเป็นต้องเปลี่ยนแปลงหลักในการทำงานของ IMU ห้องสมุดชื่อ I2Cdev โดย Jeff Rowberg มีประโยชน์มากหากคุณต้องการข้อมูลที่กรองโดยใช้ DMP (ตัวประมวลผลการเคลื่อนไหวดิจิทัล) ของ IMU

บูรณาการกับการประมวลผล

ที่นี่ การประมวลผลใช้สำหรับการแสดงภาพข้อมูลการหมุนเกี่ยวกับแกน x ของ IMU ตามที่คำนวณโดยข้อมูลดิบที่มาจาก MPU6050 เราได้รับข้อมูลดิบขาเข้าใน SerialEvent ในลักษณะต่อไปนี้:

เป็นโมฆะ serialEvent (อนุกรม myPort) {

inString = myPort.readString(); ลอง {// แยกวิเคราะห์ข้อมูล //println(inString); สตริง dataStrings = split(inString, ':'); if (dataStrings.length == 2) { if (dataStrings[0].equals("RAW")) { for (int i = 0; i < dataStrings.length - 1; i++) { raw = float (dataStrings[i+1]); } } อื่น { println (inString); } } } catch (ข้อยกเว้น e) { println ("จับข้อยกเว้น"); } }

ที่นี่คุณสามารถดูการสร้างภาพข้อมูลในภาพที่แนบมาในขั้นตอนนี้ ข้อมูลตำแหน่งที่ได้รับที่ปลาย nodemcu จะเห็นได้บนจอภาพแบบอนุกรมตามที่แสดงในภาพ

ขั้นตอนที่ 5: CODE

ฉันได้แนบที่เก็บ github คุณสามารถโคลนและแยกมันเพื่อใช้ในโครงการของคุณ

my_code

repo ประกอบด้วย 2 ภาพร่าง Arduino สำหรับตัวส่ง (arduino+IMU) และตัวรับ (Nodemcu+Servo)

และหนึ่งร่างการประมวลผล ติดดาว repo หากสิ่งนี้ช่วยในโครงการของคุณ

ในคำสั่งสอนนี้

R- ตัวรับ & T- ตัวส่งสัญญาณ

ขั้นตอนที่ 6: การสาธิตวิดีโอ

ฉันจะแนบวิดีโอในวันพรุ่งนี้ ติดตามฉันเพื่อรับการแจ้งเตือน

ขอบคุณทุกคน!

แนะนำ: