Სარჩევი:
- ნაბიჯი 1: საჭირო ნივთები
- ნაბიჯი 2: შეკრება
- ნაბიჯი 3: კოდი და კალიბრაცია
- ნაბიჯი 4: როგორ მუშაობს (სურვილისამებრ)
ვიდეო: გიროსკოპი გართობა ნეოპიქსელის ბეჭდით: 4 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:17
ამ სახელმძღვანელოში ჩვენ გამოვიყენებთ MPU6050 გიროსკოპს, ნეოპიქსელურ ბეჭედს და არდუინოს, რათა შევქმნათ მოწყობილობა, რომელიც ანათებს, რომელიც შეესაბამება დახრის კუთხეს.
ეს არის მარტივი და სახალისო პროექტი და ის შეიკრიბება პურის დაფაზე. თუ დაიცავთ ნაბიჯებს, თქვენ შექმნით იმას, რაც ვიდეოში ნახეთ. ეს კარგი გაკვეთილია გიროსკოპისა და ნეოპიქსელის ბეჭდის შესასწავლად.
მე ვაშენებ ამ სამეურვეოს იმ ინტერესის გამო, რაც მე ვნახე ჩემს პირველ ინსტრუქტაჟზე აქ (გიროსკოპის ხელმძღვანელობით კონტროლი არდუინოსთან ერთად). ამ სასწავლო ინსტრუქციაში მე შევცვალე მარტივი ლიდერები ნეოპიქსელის ბეჭდით. ბეჭდის გამოყენება უფრო ადვილია ადაფრუტის ბიბლიოთეკაში და ის ნამდვილად უფრო სანახაობრივია.
ასე რომ, თუ თქვენ გაქვთ ეს კომპონენტები, ეს არის მათი გამოყენების დიდი გზა, მე შევეცდები ნაბიჯ -ნაბიჯ მიგიყვანოთ მოწყობილობის შექმნის გზით და ასევე ავუხსნა, თუ როგორ მუშაობს იგი ბოლო ეტაპზე.
ნაბიჯი 1: საჭირო ნივთები
ნაწილები
1. Arduino pro mini 328p (eBay) 2 $
2. პურის დაფა
3. MPU6050 გიროსკოპი (eBay) 1.2 $
4. 24 ნეოპიქსელიანი led ბეჭედი (ადაფრუტი) 17 $
5. 4 x AA ბატარეის პაკეტი 4 ბატარეით
6. U- ფორმის ჯუმბერის კაბელები (სურვილისამებრ). მე გამოვიყენე ეს ჯუმბერის კაბელები, რადგან ისინი უკეთესად გამოიყურებიან პურის დაფაზე და ლიდერები უფრო თვალსაჩინოა ამ გზით. იბეიზე შეგიძლიათ ნახოთ 140 ცალი ყუთი დაახლოებით 4 $. თუ თქვენ არ გაქვთ ეს კაბელები, შეგიძლიათ შეცვალოთ ისინი დუპონტის მავთულხლართებით.
ინსტრუმენტები:
1. USB სერიული FTDI ადაპტერი FT232RL, რათა დაპროგრამდეს arduino pro mini
2. Arduino IDE
უნარები: 1. Soldering, შეამოწმეთ ეს სამეურვეო
3. არდუინოს ძირითადი პროგრამირება, ეს გაკვეთილი შეიძლება სასარგებლო იყოს
ნაბიჯი 2: შეკრება
მე დავამატე გამაოგნებელი სქემა fzz ფორმატში და მისი სურათი კავშირების მარტივი ვიზუალიზაციისათვის
1. თქვენ უნდა შეკრათ 3 მამრობითი ქინძისთავები ნეოპიქსელის ბეჭდის უკანა მხარეს, როგორც ეს ნაჩვენებია სურათზე
- შეაერთეთ პოზიტიური პინი
- შეაერთეთ მიწა
- შეაერთეთ მონაცემთა შეყვანის პინი
2. მაშინ 4x ბატარეის დამჭერს უნდა ჰქონდეს გზა დაფაზე დამაკავშირებელი, ადვილი გამოსავალია მისი ტერმინალებზე მიამაგროთ ორი მამრობითი დუპონტის მავთული.
3. მოამზადეთ პურის დაფა.
- მოათავსეთ ნეოპიქსელის ბეჭედი, მიკროკონტროლი და გიროსკოპი პურის დაფაზე, როგორც სურათზეა
- მოათავსეთ ყველა უარყოფითი მავთული: მიკროკონტროლერზე, ნეოპიქსელის რგოლზე, გიროზე
- მოათავსეთ ყველა დადებითი მავთული: მიკროკონტროლერზე, ნეოპიქსელის რგოლზე, გიროზე
- მოათავსეთ ყველა მონაცემთა მავთული:
* SDA და SCL მიკროკონტროლიდან გიროში
* მიამაგრეთ D6 მიკროკონტროლიდან ნეოპიქსელის რგოლამდე
- ორმაგად შეამოწმეთ ყველა კავშირი ჩართვამდე
- სურვილისამებრ წებოვანი ლენტის გამოყენებით, აკრიფეთ ბატარეის ნაკრები სამაგრის უკანა მხარეს, რომ დაიჭიროთ და გახადოთ უფრო პორტატული
ნაბიჯი 3: კოდი და კალიბრაცია
პირველი თქვენ უნდა გადმოწეროთ და დააინსტალიროთ ორი ბიბლიოთეკა:
1. ადაფრუტის ნეოპიქსელის ბიბლიოთეკის ნაძვი, რომელიც აკონტროლებს ნეოპიქსელს
2. MPU6050 ბიბლიოთეკა გიროსკოპისთვის
3. I2CDev ბიბლიოთეკის წყარო
ისინი ორი დიდი ბიბლიოთეკაა, რომლებიც მძიმე ტვირთს შეასრულებენ!
ნეოპიქსელებზე მეტი დეტალები აქ
შემდეგ გადმოწერეთ და დააინსტალირეთ ჩემი ბიბლიოთეკა აქედან ან დააკოპირეთ ქვემოდან:
#მოიცავს "I2Cdev.h"
#მოიცავს #მოიცავს "MPU6050_6Axis_MotionApps20.h" #მოიცავს "Wire.h" #განსაზღვრეთ NEOPIXED_CONTROL_PIN 6 #განსაზღვრეთ NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Adafruit_NeoPixel ზოლები = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); ხელმოუწერელი ხანგრძლივი lastPrintTime = 0; bool ინიციალიზაცია = ყალბი; // დააყენეთ true თუ DMP init წარმატებული იყო uint8_t mpuIntStatus; // ფლობს ფაქტობრივ შეწყვეტის სტატუსს byte MPU uint8_t devStatus; // სტატუსის დაბრუნება თითოეული მოწყობილობის ოპერაციის შემდეგ (0 = წარმატება,! 0 = შეცდომა) uint16_t packetSize; // მოსალოდნელი DMP პაკეტის ზომა (ნაგულისხმევი არის 42 ბაიტი) uint16_t fifoCount; // FIFO- ში არსებული ყველა ბაიტის რაოდენობა uint8_t fifoBuffer [64]; // FIFO შენახვის ბუფერი Quaternion q; // [w, x, y, z] მეოთხეული კონტეინერი VectorFloat gravity; // [x, y, z] გრავიტაციის ვექტორი float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll კონტეინერი და სიმძიმის ვექტორი არასტაბილური ბოული mpuInterrupt = false; // მიუთითებს გაიზარდა თუ არა MPU შეწყვეტის პინი
ბათილად დაყენება ()
{Serial.begin (9600); Serial.println ("პროგრამა დაიწყო"); ინიციალიზაცია = ინიციალიზაციაგიროსკოპი (); ზოლები. დაწყება (); } void loop () {if (! ინიციალიზაცია) {return; } mpuInterrupt = ყალბი; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); დაბრუნების; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& სიმძიმე, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & სიმძიმის); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} ლოგიკური hasFifoOverflown (int mpuIntStatus, int fifoCount) {დაბრუნება mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = შეზღუდვა (x, -1 * MAX_ANGLE, MAX_ANGLE); y = შეზღუდვა (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 და z 0 და z 0 და z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = რუკა (კუთხე, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, კუთხე); uint32_t ფერი; for (int i = 0; i პოზიცია + LED_OFFSET) {დაბრუნების პოზიცია + LED_OFFSET; } დაბრუნების პოზიცია + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {დაბრუნება; } Serial.print ("a ="); Serial.print (კუთხე); Serial.print (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = მილი (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu. ინიციალიზაცია (); Serial.println (mpu.testConnection ()? F ("MPU6050 კავშირი წარმატებულია"): F ("MPU6050 კავშირი ვერ მოხერხდა")); Serial.println (F ("DMP ინიციალიზაცია …"); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP ინიციალიზაცია ვერ მოხერხდა (კოდი")); Serial.println (devStatus); დაბრუნება false;} mpu.setDMPEnabled (true); Serial.println (F ("ჩართულია შეწყვეტის გამოვლენა (Arduino გარე შეფერხება 0) … ")); attachInterrupt (0, dmpDataReady, აღმავალი); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP მზად! ელოდება პირველ შეწყვეტას … ")); პაკეტის ზომა = mpu.dmpGetFIFOPacketSize (); true true;} void dmpDataReady () {mpuInterrupt = true;}
ატვირთეთ კოდი:
FTDI ადაპტერის გამოყენებით ატვირთეთ კოდი არდუინოში.
შეაერთეთ კვების ბლოკი (ბატარეები)
კალიბრაცია:
აქ ყველაზე მნიშვნელოვანი დაკალიბრება არის "LED_OFFSET" მუდმივა. ჩემს მაგალითში არის 12. თქვენ უნდა შეცვალოთ ეს 0 -დან 23 -მდე ისე, რომ დაფის ჩართვის შემდეგ led განათდება იმ მიმართულებით, სადაც თქვენ დახრით დაფას.
თუ გსურთ გაეცნოთ უფრო დეტალურად როგორ მუშაობს, შეამოწმეთ ბოლო ნაბიჯი
ნაბიჯი 4: როგორ მუშაობს (სურვილისამებრ)
ჯერ მცირე ინფორმაცია MPU6050 გიროსკოპის შესახებ. ეს არის MEMS გიროსკოპი (MEMS ნიშნავს მიკროელექტრომექანიკურ სისტემებს).
MEM– ის თითოეული ტიპის გიროსკოპს აქვს რხევითი კომპონენტის გარკვეული ფორმა, საიდანაც შეიძლება აღმოჩნდეს აკლაცია და, შესაბამისად, მიმართულების შეცვლა. ეს იმიტომ ხდება, რომ მოძრაობის კანონის კონსერვაციის თანახმად, ვიბრაციულ ობიექტს უყვარს ვიბრაცია იმავე სიბრტყეში და ნებისმიერი ვიბრაციული გადახრა შეიძლება გამოყენებულ იქნას მიმართულების შეცვლის მიზნით.
გირო ასევე შეიცავს თავის მიკროკონტროლერს, რათა გამოთვალოს როლი, მოედანი და ხახუნება ზოგიერთი ლამაზი მათემატიკის საშუალებით.
მაგრამ გირო მონაცემებს აწუხებს ხმაური და დრიფტი, ამიტომ ჩვენ გამოვიყენეთ გარე ბიბლიოთეკა საგნების გასასუფთავებლად და სუფთა გამოსაყენებელი მონაცემების მისაცემად.
Neopixel არის RGB ლიდერები, რომლებიც ინდივიდუალურად არის მიმართული და მიჯაჭვულია ზოლებსა და რგოლებში. ისინი მუშაობენ 5V- ზე და მათ აქვთ საკუთარი სქემა, ასე რომ თქვენ გჭირდებათ მხოლოდ ნეოპიქსელების გაძლიერება და მათთან კომუნიკაცია მონაცემთა ხაზის გამოყენებით. კომუნიკაცია ხდება ერთი მონაცემთა ხაზით, რომელიც შეიცავს საათს და მონაცემებს (უფრო დეტალურად აქ). ადაფრუტი უზრუნველყოფს სუფთა ბიბლიოთეკას ნეოპიქსელის რგოლებთან ურთიერთობისთვის.
Კოდი
L oop () ფუნქციის შიგნით ეწოდება MPU6050_6Axis_MotionApps20 ბიბლიოთეკას. როდესაც ბიბლიოთეკას აქვს ახალი მონაცემები გიროსკოპიდან, ის იძახებს redrawLeds (x, y, z) 3 არგუმენტით, რომელიც წარმოადგენს yaw, pitch and roll
შიგნით redrawLeds ():
- ჩვენ აქცენტს ვაკეთებთ ორ ღერძზე: y, z
- ჩვენ ვზღუდავთ ორივე ღერძს – MAX_ANGLE– დან +MAX_ANGLE– მდე, ჩვენ განვსაზღვრეთ მაქსიმალური კუთხე 45 – მდე და ის ცვალებადია
- ჩვენ 360 ხარისხს ვყოფთ 4 კვადრატად და ვიძახებთ lightLeds () ფუნქციებს თითოეულისთვის შემდეგნაირად:
* y უარყოფითი, z დადებითი პირველი კვადრატი აკონტროლებს led– ს 0 – დან 5 – მდე, კუთხე იქნება 0 – დან 89 – მდე
* y უარყოფითი, z უარყოფითი მეორე კვადრატი აკონტროლებს led– ს 6 – დან 12 – მდე, კუთხე იქნება 89 – დან 0 – მდე
*… და ა.შ
- შიგნით lightLeds ფუნქცია
* მე ვიანგარიშებ კუთხეს ორ ღერძზე დაყრდნობით არქტანგენცენტის გამოყენებით (შეამოწმეთ თანდართული სურათი)
* მე ვიანგარიშებ რა გამოიწვია არდუინოს რუქის ფუნქციის გამოყენებით ჩვენებამ
* მე აღვადგინე led ზოლები ყველა ორის გარდა
* მე ვიყენებ ფუნქციას, რომელსაც ეწოდება normalizeLedPosition (), რათა გავითვალისწინო ნეოპიქსელის კალიბრაცია. კალიბრაცია სასარგებლოა, რადგან ნეოპიქსელის ბეჭედი შეიძლება შემოტრიალდეს როგორც სასურველია და უნდა იყოს გასწორებული გიროსკოპთან
* მე ასევე ვბეჭდავ საბუქსირე ღერძს, რასაც led აქვს შუქი და კუთხე
მათემატიკა
მე დავამატე სურათი led ბეჭდით და ტრიგონომეტრიული ფუნქციით, რომელიც გამოიყენება კუთხის დასადგენად.
გირჩევთ:
RGB LED მატრიცა ნეოპიქსელის გამოყენებით: 8 ნაბიჯი (სურათებით)
RGB LED მატრიცა ნეოპიქსელის გამოყენებით: ამ გაკვეთილში მე ვაპირებ გაჩვენოთ როგორ ავაშენოთ 5*5 RGB LEDMATRIX NEOPIXEL– ის გამოყენებით. ამ მატრიქსით ჩვენ შეგვიძლია აჩვენოთ მომხიბლავი ანიმაციები, ემოციები და ასოები, რომლებიც ძალიან მიმზიდველია. დავიწყოთ
ნეოპიქსელის საათი სამი ნეოპიქსელის ბეჭდით: 7 ნაბიჯი
ნეოპიქსელის საათი სამი ნეოპიქსელის ბეჭდით: სტივ მანლის მიერ Neo Pixel საათის ბრწყინვალე შექმნამ მიბიძგა მე შემექმნა ეს ინსტრუქცია იმის შესახებ, თუ როგორ უნდა შევქმნათ მსგავსი საათი ყველაზე მცირე თანხით. (მნიშვნელოვანი ჰოლანდიური ჩვევა ყოველთვის ცდილობს ფულის დაზოგვას ;-)) აღმოვაჩინე, რომ
გაიყვანეთ სინათლე - სინათლის მოდული ნეოპიქსელის გამოყენებით და გადაათრიეთ გადამრთველი: 6 ნაბიჯი (სურათებით)
გაიგეთ სინათლე - სინათლის მოდული ნეოპიქსელის გამოყენებით და გადაათრიეთ გადამრთველი: სინათლის მოდულის მახასიათებლები Arduino Uno აპარატურა & დანართი შეძენილი ინტერნეტიდან Neopixel & ელექტრომომარაგება ნასესხებია ინფორმატიკის სკოლისგან & პროდუქტის დიზაინი სინათლის მოდული, რომელიც კონტროლდება კვების ბლოკით, ყველა ფუნქცია კონტროლდება
ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: 3 ნაბიჯი (სურათებით)
ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: ამ გაკვეთილში ჩვენ ვაპირებთ ვითამაშოთ ჟესტების სენსორით (APDS-9960) და ნეოპიქსელის ბეჭდით, რომ ვისწავლოთ როგორ გავაერთიანოთ ორივე Arduino UNO- ს გამოყენებით. საბოლოო პროდუქტი უპასუხებს მარცხენა - მარჯვენა ჟესტები მოძრაობის ანიმაციით მარჯვნივ ან მარცხნივ, და თქვენ
GY-521 MPU6050 3 ღერძი აჩქარების გიროსკოპი 6DOF მოდულის გაკვეთილი: 4 ნაბიჯი
GY-521 MPU6050 3-ღერძიანი აჩქარების გიროსკოპი 6DOF მოდულის სახელმძღვანელო: აღწერა ეს მარტივი მოდული შეიცავს ყველაფერს, რაც საჭიროა Arduino– სთან და სხვა კონტროლერებთან I2C– ის საშუალებით (გამოიყენეთ Wire Arduino ბიბლიოთეკა) და მიეცით მოძრაობის საზომი ინფორმაცია 3 ღერძისთვის-X, Y და Z . მახასიათებლები ამაჩქარებლის დიაპაზონი: ± 2, ±