สารบัญ:

เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s: 8 ขั้นตอน
เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s: 8 ขั้นตอน

วีดีโอ: เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s: 8 ขั้นตอน

วีดีโอ: เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s: 8 ขั้นตอน
วีดีโอ: ตอนที่ 5 การใช้งาน OLED(i2c) และ DHT sensor และเริ่ม multi-tasking 2024, พฤศจิกายน
Anonim
เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s
เริ่มต้นใช้งานอินเทอร์เฟซเซ็นเซอร์ I2C ?? - เชื่อมต่อ MMA8451 ของคุณโดยใช้ ESP32s

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้ทั้งหมดเกี่ยวกับวิธีเริ่มต้น เชื่อมต่อ และรับอุปกรณ์ I2C (มาตรความเร่ง) ที่ทำงานร่วมกับคอนโทรลเลอร์ (Arduino, ESP32, ESP8266, ESP12 NodeMCU)

ขั้นตอนที่ 1: วิธีเริ่มต้นใช้งาน I2C - โลกอันงดงามของการสื่อสารระหว่าง IC

Arduino, ESP Series, PIC, Rasberry PI และอื่นๆ ล้วนน่าทึ่ง แต่สิ่งที่คุณจะทำอย่างไรกับมันเมื่อคุณมี?

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

ขั้นตอนที่ 2: ภาพรวมเกี่ยวกับ I2C

I2C เป็นโปรโตคอลการสื่อสารแบบฮาล์ฟดูเพล็กซ์แบบซีเรียล ซิงโครนัส ซึ่งช่วยให้มาสเตอร์และสเลฟหลายตัวอยู่ร่วมกันบนบัสเดียวกันได้ บัส I2C ประกอบด้วยสองบรรทัด: สายข้อมูลอนุกรม (SDA) และนาฬิกาอนุกรม (SCL) ทั้งสองเส้นต้องการตัวต้านทานแบบดึงขึ้น

SDA (Serial Data) – บรรทัดสำหรับมาสเตอร์และสเลฟในการส่งและรับข้อมูล SCL (Serial Clock) – เส้นที่นำสัญญาณนาฬิกา ด้วยข้อดีเช่นความเรียบง่ายและต้นทุนการผลิตต่ำ I2C ส่วนใหญ่จะใช้สำหรับการสื่อสารของอุปกรณ์ต่อพ่วงความเร็วต่ำในระยะทางสั้น ๆ (ภายในหนึ่งฟุต)

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ I2C หรือไม่……

ขั้นตอนที่ 3: วิธีกำหนดค่าเซ็นเซอร์I²C

ก่อนเข้าสู่โครงการ คุณต้องเข้าใจพื้นฐานบางประการเกี่ยวกับเซ็นเซอร์ของคุณ ดื่มกาแฟสักแก้วก่อนดำดิ่งลงไป:)? …

จุดแข็งที่ยอดเยี่ยมของ I2C คือคุณสามารถใส่เซ็นเซอร์จำนวนมากบนสายไฟสี่เส้นเดียวกันได้ แต่สำหรับหน่วยที่มีโมดูลที่สร้างไว้ล่วงหน้าหลายตัวเชื่อมต่ออยู่ คุณอาจต้องถอดตัวต้านทาน smd สองสามตัวออกจากการฝ่าวงล้อม มิฉะนั้น การดึงขึ้นบนบัสอาจรุนแรงเกินไป

เราต้องการข้อมูลอะไรจาก Datasheet??

  1. ฟังก์ชั่นเซนเซอร์
  2. ฟังก์ชัน Pinouts และ Pins
  3. คำอธิบายอินเทอร์เฟซ (อย่าพลาดที่จะดู "ตารางการเลือกที่อยู่ I2c")
  4. ลงทะเบียน!!

ทุกอย่างเรียบร้อยดีคุณจะพบได้ง่าย แต่ Registers?? การลงทะเบียนเป็นเพียงตำแหน่งหน่วยความจำภายในอุปกรณ์I²C สรุปจำนวนรีจิสเตอร์ที่มีอยู่ในเซ็นเซอร์ที่กำหนด และสิ่งที่พวกเขาควบคุมหรือมีไว้เรียกว่าแผนที่รีจิสเตอร์ ข้อมูลส่วนใหญ่ในแผ่นข้อมูลของเซ็นเซอร์นั้นเกี่ยวกับการอธิบายว่ารีจิสเตอร์แต่ละอันทำงานอย่างไร และอาจเป็นเรื่องที่ค่อนข้างยุ่งยากในการอ่าน เนื่องจากข้อมูลนั้นไม่ค่อยถูกนำเสนอโดยตรง

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

1) ทะเบียนควบคุม

เซ็นเซอร์ส่วนใหญ่เปลี่ยนวิธีการทำงานตามค่าที่เก็บไว้ในรีจิสเตอร์ควบคุม ให้คิดว่ารีจิสเตอร์ควบคุมเป็นเหมือนสวิตช์เปิด/ปิด ซึ่งคุณเปิดโดยการตั้งค่าบิตเป็น 1 และปิดโดยการตั้งค่าบิตนั้นเป็น 0 เซ็นเซอร์แบบชิป I²C มักจะมีการตั้งค่าการทำงานหลายสิบรายการหรือมากกว่าสำหรับสิ่งต่างๆ เช่น บิต- โหมด อินเตอร์รัปต์ การควบคุมการอ่าน-เขียน ความลึก ความเร็วในการสุ่มตัวอย่าง การลดสัญญาณรบกวน ฯลฯ ดังนั้น คุณมักจะต้องตั้งค่าบิตในรีจิสเตอร์ควบคุมต่างๆ หลายตัวก่อนจึงจะสามารถอ่านค่าได้จริง

2) การลงทะเบียนข้อมูลต่างจากตัวควบคุมที่ลงทะเบียนธนาคารของสวิตช์ ฉันคิดว่าการลงทะเบียนข้อมูลขาออกเป็นคอนเทนเนอร์ที่มีหมายเลขซึ่งเพิ่งจะถูกเก็บไว้ในรูปแบบไบนารี ดังนั้นคุณจึงต้องการทราบข้อมูล อ่านข้อมูลการลงทะเบียนเสมอ เช่น ฉันลงทะเบียนใครเพื่อระบุอุปกรณ์ การลงทะเบียนสถานะ ฯลฯ

ดังนั้น การเริ่มต้นเซ็นเซอร์I²Cจึงเป็นกระบวนการหลายขั้นตอน และมักจะอธิบายลำดับการทำงานที่ถูกต้องเป็นลายลักษณ์อักษรในทิศทางย้อนกลับ แทนที่จะอธิบายอย่างตรงไปตรงมาในแผ่นข้อมูล รายการไม่เคยพูดว่า "หากต้องการอ่านค่าจากเซ็นเซอร์นี้ ให้ทำ (1), (2), (3), (4), ฯลฯ" แต่คุณจะพบคำอธิบายของบิตรีจิสเตอร์ควบคุมที่บอกว่า "ก่อนที่คุณจะตั้งค่าบิต x ในส่วนนี้ register คุณต้องตั้งค่าบิต y ในรีจิสเตอร์ควบคุมอื่นนี้”

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

ขั้นตอนที่ 4: เริ่มต้นด้วยการเคลื่อนไหว - มาตรความเร่ง

มาตรความเร่งสมัยใหม่เป็นอุปกรณ์ Micro Electro-Mechanical Systems (MEMS) ซึ่งหมายความว่าสามารถใส่ชิปขนาดเล็กภายในอุปกรณ์ที่เล็กที่สุดได้ วิธีหนึ่งในการวัดความเร่งที่ใช้โดยมาตรความเร่ง MEMS คือการใช้มวลสื่อกระแสไฟฟ้าขนาดเล็กที่แขวนอยู่บนสปริง ความเร่งของอุปกรณ์ทำให้สปริงยืดหรือหดตัว และสามารถวัดการโก่งตัวของมวลสื่อนำไฟฟ้าได้โดยการเปลี่ยนแปลงความจุไปยังเพลตคงที่ที่อยู่ใกล้เคียง

มาตรความเร่งถูกกำหนดโดยคุณสมบัติดังต่อไปนี้:

  1. จำนวนแกน ตั้งแต่หนึ่งถึงสามแกน มีป้ายกำกับว่า X, Y และ Z ในไดอะแกรมข้อมูลจำเพาะ โปรดทราบว่ามาตรความเร่งบางรุ่นเรียกว่า 6 แกนหรือ 9 แกน แต่นั่นก็หมายความว่าจะรวมเข้ากับอุปกรณ์ MEMS อื่นๆ เช่น ไจโรสโคปและ/หรือเครื่องวัดความเข้มข้นของสนามแม่เหล็ก อุปกรณ์เหล่านี้แต่ละเครื่องมีสามแกนด้วย ซึ่งเป็นสาเหตุที่มีหน่วยวัดแรงเฉื่อย (IMU) 3, 6 หรือ 9 แกน
  2. ประเภทของเอาต์พุต ทั้งแบบแอนะล็อกหรือดิจิทัล มาตรความเร่งแบบดิจิทัลจะดูแลการจัดรูปแบบข้อมูลการเร่งความเร็วให้เป็นการแสดงแบบดิจิทัลที่สามารถอ่านผ่าน I2C หรือ SPI
  3. ช่วงความเร่งที่วัดเป็น g โดยที่ 1g คือความเร่งเนื่องจากแรงโน้มถ่วงของโลก
  4. ตัวประมวลผลร่วมที่สามารถออฟโหลดการคำนวณบางอย่างที่จำเป็นในการวิเคราะห์ข้อมูลดิบจาก MCU มาตรความเร่งส่วนใหญ่มีความสามารถในการขัดจังหวะอย่างง่ายในการตรวจจับขีดจำกัดความเร่ง (ช็อต) และสภาวะ 0-g (การตกอย่างอิสระ) คนอื่นๆ สามารถประมวลผลข้อมูลดิบขั้นสูงเพื่อนำเสนอข้อมูลที่มีความหมายมากขึ้นแก่ MCU

ขั้นตอนที่ 5: เชื่อมต่อกับคอนโทรลเลอร์

เนื่องจากเรารู้จักไมโครคอนโทรลเลอร์ ESP ในกระแสนิยม เราจะใช้ ESP32 เป็นตัวอย่าง ก่อนอื่นคุณต้องมี Nodemcu-32s

หมดกังวลถ้าคุณมีบอร์ด ESP ตัวอื่น หรือแม้แต่ Arduino !!! คุณเพียงแค่ต้องตั้งค่า Arduino IDE และการกำหนดค่าตามบอร์ดพัฒนาของคุณ สำหรับ Arduino, ESP NodeMCU, ESP32s ฯลฯ … คุณจะต้องมีชิ้นส่วน I2C บางชนิด โดยปกติแล้วจะอยู่บนบอร์ดฝ่าวงล้อม ในบทช่วยสอนนี้ ฉันจะใช้ MMA8451 บอร์ดฝ่าวงล้อม Accelerometer แบบดิจิตอล

และสายจัมเปอร์ไม่กี่….

ขั้นตอนที่ 6: การเชื่อมต่อ

การเชื่อมต่อ
การเชื่อมต่อ

และนี่คือเค้าโครง

ฉันใช้การเชื่อมต่อต่อไปนี้จากโมดูลด้านบนไปยังโมดูล Nodemcu-32s ของฉัน

ESP32s -- โมดูล

3v3 -- วิน

Gnd -- Gnd

SDA 21 -- SDA

SCL 22 -- SCL

"โปรดจำไว้ว่า ส่วนใหญ่แล้วไม่ใช่ทุกบอร์ดพัฒนา (ส่วนใหญ่ใน ESP) จะมีพินเอาต์ที่ชัดเจนเพื่อช่วยในการพิจารณาว่าพินใดถูกใช้ !! ดังนั้นก่อนการเชื่อมต่อ ให้ระบุพินที่ถูกต้องของบอร์ดเพื่อใช้พินสำหรับ SDA และ SCL"

ขั้นตอนที่ 7: รหัส

ต้องใช้ห้องสมุด Adafruit

จาก

ดาวน์โหลด แตกไฟล์ แล้วคุณจะพบโฟลเดอร์ตัวอย่าง ในโฟลเดอร์เพียงแค่เปิด MMA8451demo ใน Arduino IDE ของคุณ แล้วไปได้เลย….

คุณจะเห็นโค้ดต่อไปนี้สำหรับอินเทอร์เฟซเซ็นเซอร์ MMA8451 กับคอนโทรลเลอร์ของคุณ

#รวม

#รวม #รวม Adafruit_MMA8451 mma = Adafruit_MMA8451(); การตั้งค่าเป็นโมฆะ (เป็นโมฆะ) { Serial.begin (9600); Wire.begin(4, 5); /* เข้าร่วมบัส i2c ด้วย SDA=D1 และ SCL=D2 ของ NodeMCU */ Serial.println("การทดสอบ Adafruit MMA8451!"); if (! mma.begin()) { Serial.println("ไม่สามารถเริ่มได้"); ในขณะที่ (1); } Serial.println("พบ MMA8451!"); mma.setRange(MMA8451_RANGE_2_G); Serial.print("ช่วง = "); Serial.print(2 << mma.getRange()); Serial.println ("G"); } void loop() { // อ่านข้อมูล 'raw' ใน 14 บิตนับ mma.read(); Serial.print("X:\t"); Serial.print(mma.x); Serial.print("\tY:\t"); Serial.print(mma.y); Serial.print("\tZ:\t"); Serial.print(mma.z); Serial.println(); /* รับเหตุการณ์เซ็นเซอร์ใหม่ */ sensors_event_t เหตุการณ์; mma.getEvent(&เหตุการณ์); /* แสดงผล (อัตราเร่งมีหน่วยเป็น m/s^2) */ Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t"); Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t"); Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t"); Serial.println("m/s^2 "); /* รับทิศทางของเซ็นเซอร์ */ uint8_t o = mma.getOrientation(); สวิตช์ (o) { กรณี MMA8451_PL_PUF: Serial.println ("Portrait Up Front"); หยุดพัก; กรณี MMA8451_PL_PUB: Serial.println("Portrait Up Back"); หยุดพัก; กรณี MMA8451_PL_PDF: Serial.println("Portrait Down Front"); หยุดพัก; กรณี MMA8451_PL_PDB: Serial.println("Portrait Down Back"); หยุดพัก; กรณี MMA8451_PL_LRF: Serial.println ("แนวนอนด้านหน้าขวา"); หยุดพัก; กรณี MMA8451_PL_LRB: Serial.println("Landscape Right Back"); หยุดพัก; กรณี MMA8451_PL_LLF: Serial.println ("แนวนอนด้านหน้าซ้าย"); หยุดพัก; กรณี MMA8451_PL_LLB: Serial.println("Landscape Left Back"); หยุดพัก; } Serial.println(); ล่าช้า (1000); }

บันทึก ตรวจสอบ และอัปโหลด……

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

X: -2166 Y: 1872 Z: 2186

X: -2166 Y: 1872 Z: 2186X: -4.92 Y: 5.99 Z: 4.87 ม./วินาที^2

ภูมิทัศน์ด้านหน้าซ้าย

X: -224 Y: -2020 Z: 3188

X: -5.10 Y: -3.19 Z: 7.00 ม./วินาที^2

แนวตั้งขึ้นด้านหน้า

ถ้าทุกอย่างเป็นไปตามที่ควร ตอนนี้คุณมีพื้นฐานของ I2C และวิธีเชื่อมต่ออุปกรณ์ของคุณแล้ว..

แต่เครื่องไม่ทำงาน??!

เพียงทำตามขั้นตอนต่อไป……

ขั้นตอนที่ 8: ทำให้อุปกรณ์ I2C ของคุณทำงาน.

ขั้นตอนพื้นฐานสำหรับการทำงานของอุปกรณ์ I2C

มาสำรวจกัน….

  • การเดินสายไฟถูกต้อง..(ตรวจสอบอีกครั้ง)
  • โปรแกรมถูกต้อง..(ใช่ครับ เป็นตัวอย่างทดสอบ..)

เริ่มต้นด้วยขั้นตอนในการแก้ปัญหา…..

ขั้นที่ 1: เรียกใช้โปรแกรมสแกนอุปกรณ์ I2C เพื่อตรวจสอบที่อยู่อุปกรณ์และก่อนอื่น อุปกรณ์ I2C ของคุณก็ใช้ได้

คุณสามารถดาวน์โหลดภาพร่างและตรวจสอบผลลัพธ์ได้

ผลลัพธ์ - อุปกรณ์ทำงานและที่อยู่เซ็นเซอร์ถูกต้อง

เครื่องสแกน I2C กำลังสแกน …

พบที่อยู่: 28 (0x1C) เสร็จสิ้น พบ 1 เครื่อง

ขั้นตอนที่ 2: ตรวจสอบไลบรารีเซ็นเซอร์

เปิดไฟล์ Adafruit_MMA8451.h และค้นหาที่อยู่อุปกรณ์

ผลลัพธ์ - ที่อยู่ต่างจากเครื่องของฉัน??.

/*=============================================== ========================= ที่อยู่ I2C / BITS --------------------- -------------------------------------------------- */ #define MMA8451_DEFAULT_ADDRESS (0x1D) //!< ค่าเริ่มต้นที่อยู่ MMA8451 I2C หาก A คือ GND จะเป็น 0x1C /*======================= ================================================= */

ทำ - แก้ไขไฟล์จากแผ่นจดบันทึก (เปลี่ยนที่อยู่) + บันทึก + รีสตาร์ท IDE

มันได้ผล คุณจะได้รับการอ่านของคุณ

ไม่ง้อ…..???

ขั้นตอนที่ 3: ตรวจสอบ Wire.begin ว่าถูกเขียนทับหรือไม่

เปิดไฟล์ Adafruit_MMA8451.c แล้วค้นหา Wire.begin

ผลลัพธ์ - ข้อความนี้ถูกเขียนทับ.

/****************************************************** *************************//*! @brief ตั้งค่า HW (อ่านค่าสัมประสิทธิ์ ฯลฯ) */ /************************************ **********************************************/ bool Adafruit_MMA8451::begin(uint8_t i2caddr) { Wire.begin(); _i2caddr = i2caddr;

ทำ - แก้ไขไฟล์จากแผ่นจดบันทึก (คำสั่งแสดงความคิดเห็น) + บันทึก + รีสตาร์ท IDE

และในที่สุด อุปกรณ์ก็เริ่มทำงาน☺…

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

แนะนำ: