Mündəricat:

ColorCube: 7 addım (şəkillərlə)
ColorCube: 7 addım (şəkillərlə)

Video: ColorCube: 7 addım (şəkillərlə)

Video: ColorCube: 7 addım (şəkillərlə)
Video: How to solve a Rubik’s cube | The Easiest tutorial | Part 1 2024, Dekabr
Anonim
Image
Image
ColorCube
ColorCube
ColorCube
ColorCube

Bu lampanı nəvəm rənglər öyrənərkən hazırladım. MagicCube layihəsindən ilham aldım, amma nəhayət bütün hissələri sıfırdan yaratdım. Çap etmək və yığmaq asandır və gyro modulunun necə işlədiyini öyrənəcəksiniz.

Addım 1: Materiallar

Materiallar
Materiallar

Arduino hissəsi:

  • Arduino Nano (lehim başlıq pinləri olmadan daha yaxşıdır)
  • MPU-6050 3 Eksenli Gyro Modulu
  • TP4056 Mikro USB Batareya Şarj Cihazı Modulu
  • MT3608 Step Up Power Booster Modulu
  • LiPo Batareya 902936 900mA və ya 503035 3.7V 500mA. 3, 7V və 35x30x15 mm -dən kiçik hər hansı bir LiPo batareyasından istifadə edə bilərsiniz, ancaq batareyanı çuxurda bağlamalısınız.
  • PS-22F28 Öz-özünə kilidləmə düyməsi və ya PS-22F27 Öz-özünə kilidləmə düyməsi hər ikisi də çap olunmuş hissəyə mükəmməl uyğun gəlir.
  • LED RGB WS2812B Üzük - 16 LED 68mm xarici diametri - müxtəlif diametrli LED -lər olsa belə istənilən halqadan istifadə edə bilərsiniz (kodda bir sabit dəyişmək məcburiyyətindəsiniz - #define NUMPIXELS 16), maksimum diametri 76 mm (bir Neopixel Çubuğu da istifadə edə bilərsiniz. 8x LED və ya WS2812b ilə hər hansı bir LED şeridi).

Üzük nümunələri: 8 LED 32mm12 LED 38mm12 LED 50mm16 LED 60mm24 LED 66 mm16 LED 44mm

Montaj üçün orta hissədə çap edilmiş hər hansı bir deşikdən istifadə edə bilərsiniz. Demək olar ki, hər hansı bir seçimi əhatə edir (üzükün 100% mərkəzdə olması lazım deyil).

Tellər

Küp

  • Kubun üst hissəsi üçün PLA Filamenti - ağ rəng istifadə edin, çünki şəffaf yaxşı deyil (LEDlər görünür və rəng hamar deyil), mənim tövsiyəm Prusament Vanilla White
  • Alt, orta və düymə hissələri üçün PLA Filamenti - tünd rəng istifadə edin, çünki bəzi Arduino modullarının üst tərəfində işıqlar var və kub rəngli LEDlərin rənglərinə uyğun gəlmir, mənim tövsiyəm Prusament Galaxy Black
  • 1x M3x5 Vint - Uzunluq (10 mm) və başın forması kritik deyil - vida görünmür
  • 2x M2x3 Vint - Uzunluq (5 mm) və başın forması kritik deyil - vintlər görünmür

Alətlər

  • 3D printer
  • Çox metrlik
  • Lehimleme dəmir
  • Tornavida

Addım 2: Çap

Çap
Çap
Çap
Çap

ColorCube -un bütün hissələri Autodesk Fusion360 -da hazırlanmışdır. f3d faylı əlavə olunur.

ColorCube, bütün standart parametrləri olan Prusa i3 MK3S printerində çap edildi və fərqli printerlərdə lazımlı dəyişiklik gözləmirəm. PLA üçün ən sevdiyiniz parametrlərdən istifadə edin (PLA üzərində çap olunarsa, PETG və ya ASA istifadə etməkdə heç bir problem yoxdur).

3d çap parametrləri:

  • Layer 0.2 mm (PrusaSlicer -də 0.2mm QUALITY parametrləri)
  • PrusaSlicer -də Prusament PLA Filament parametrləri
  • 15% doldurun
  • Dəstək yoxdur
  • Ağız yoxdur

Addım 3: Dövrə

Dövrə
Dövrə

Addım 4: Lehimləmə

Lehimləmə
Lehimləmə
Lehimləmə
Lehimləmə
Lehimləmə
Lehimləmə

Xəbərdarlıq: DC-DC booster MT3608-in 5V çıxdığından əmin olmaq üçün bir çox metr istifadə edin. Birincisi - ölçmədən əvvəl trimi saat əqrəbi istiqamətində sona çevirin (tıklayarak). Gərginliyə (3, 7V) qoşulduqda, təxminən eyni dəyəri verməlidir. Saat yönünün əksinə çevirin (10-20 tam dönüşə ehtiyacınız olacaq) və birdən gərginlik yüksəlir. Çıxışa yumşaq bir şəkildə 5V qoyun. (Şəkil)

Kubun çap edilmiş alt hissəsinə baxın. Hər komponentin öz çuxuru var. Ehtiyac duyacağınız hər bir komponent arasındakı tellərin uzunluğunu təyin edir (əlavə uzun tellər istifadə etməyin, əks halda tel ormanını əldə edəcəksiniz). (Şəkil)

Yalnız Arduino Nano və LED halqası arasındakı lehim telləri (3 tel: qırmızı 5V - 5V, qara GND - GND, mavi D6 - DI). Növbəti fəsildə LED halqanın funksionallığını yoxlayın. (Şəkil)

Hər şey qaydasındadırsa, Gyro MPU6050 əlavə etməyə davam edin (5 tel: qırmızı 5V - VCC, qara GND - GND, mavi A4 - SDA, yaşıl A5 - SCL, sarı D2 - INT). ColorCube.ino kodunu yükləyin və sınayın (digər komponentlər yalnız batareya və şarj üçündür). (Şəkil)

Hər şey yaxşıdırsa, qalan komponentləri əlavə edin. Yalnız qırmızı (+) və qara (-) tellər var. Öz-özünə kilidləmə düyməsindəki sağ pinləri seçin (basılmadıqda bağlanmır). Batareya və batareya doldurma funksiyalarını yoxlayın. (Şəkil)

Şarj edərkən TP4056 -da qırmızı LED işıqlar və tam doldurulduqda mavi LED işıqlar. Orta çaplı hissədəki TP4056 üzərindəki çuxur LED işığını ColorCube -un üst hissəsinə keçir və şarj mərhələsini tanıyırsınız. (Şəkil)

Addım 5: Kod

Əvvəlcə lazımi kitabxanaları yükləməlisiniz.

Adafruit Neopixel kitabxanası üçün ətraflı təlimatlar var:

LED üzük funksionallığı testi: Dövrənizi kitabxanaya daxil edilmiş bir nümunə ilə sınaya bilərsiniz. Fayl/Nümunələr/Adafruit NeoPixels/sadə faylını açın və yükləyin (istifadə etdiyiniz piksel sayına görə bu xətti düzgün qurmağı unutmayın: #define NUMPIXELS 16).

I2Cdev və MPU6050: https://github.com/jrowberg/i2cdevlib saytından i2cdevlib-master.zip faylını yükləyin və açın. İ2cdevlib-master/Arduino iki alt qovluğu açılmamış qovluqdan kopyalayın: I2Cdev və MPU6050. Hər ikisi də Arduino IDE kitabxana qovluğuna kopyalanır (Sənədlər/Arduino/kitabxanalar standart quraşdırma olarsa).

Kitabxanalar kopyalanandan sonra Arduino IDE -ni yenidən başlatmağı unutmayın.

#include #ifdef _AVR_ #include // 16 MHz Adafruit Trinket #endif #include "Wire.h" daxil "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" MPU6050 mpu; #define INTERRUPT_PIN 2 // Arduino Uno -da pin 2 istifadə edin və əksər lövhələrdə #PIN 6 -ı təyin edin #NUMPIXELS 16 -ı təyin edin // Adafruit_NeoPixel piksellərinin düzgün sayını təyin edin (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t activeColor, oldActiveColor = 0; bool dmpReady = yalan; uint8_t mpuIntStatus; uint8_t devStatus; uint16_t packetSize; uint16_t fifoCount; uint8_t fifoBuffer [64]; Quaternion q; VectorFloat çəkisi; üzən fırlanma [3]; int x, y, z; uçucu bool mpuInterrupt = false; boş dmpDataReady () {mpuInterrupt = doğru; } void setup () {Serial.begin (115200); piksel.begin (); piksel.clear (); piksel.setBrightness (128); #if müəyyən edildikdə (_ AVR_ATtiny85_) && (F_CPU == 16000000) clock_prescale_set (clock_div_1); #endif // I2C avtobusuna qoşul (I2Cdev kitabxanası bunu avtomatik olaraq etmir) #I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C saatı. Kompilyasiya çətinlikləri varsa bu sətiri şərh edin #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif while (! Serial); Serial.println (F ("I2C cihazlarının işə salınması …")); mpu.initialize (); pinMode (INTERRUPT_PIN, GİRİŞ); // əlaqəni yoxlayın Serial.println (F ("Cihaz əlaqələrini yoxlayır …")); Serial.println (mpu.testConnection ()? F ("MPU6050 bağlantısı uğurlu"): F ("MPU6050 bağlantısı uğursuz oldu")); // hazır olanı gözləyin // Serial.println (F ("\ nDMP proqramlaşdırma və demoya başlamaq üçün hər hansı bir xarakter göndərin:")); // while (Serial.available () && Serial.read ()); // boş tampon // while (! Serial.available ()); // məlumatları gözləyin // while (Serial.available () && Serial.read ()); // yenidən boş tampon // DMP Serial.println -ni yükləyin və konfiqurasiya edin (F ("DMP -ni işə salır…")); devStatus = mpu.dmpInitialize (); // mpu.setXGyroOffset (0) üçün minimum həssaslıq üçün ölçülmüş öz girro ofsetlərinizi təmin edin; mpu.setYGyroOffset (0); mpu.setZGyroOffset (0); mpu.setZAccelOffset (1688); // test çipim üçün 1688 zavod standartı // işlədiyinə əmin olun (əgər varsa 0 qaytarır) əgər (devStatus == 0) {// Kalibrləmə vaxtı: ofsetlər yaradın və MPU6050 mpu. CalibrateAccel (6); mpu. CalibrateGyro (6); mpu. PrintActiveOffsets (); // hazır olduğu üçün DMP -ni yandırın Serial.println (F ("DMP -nin aktiv edilməsi …")); mpu.setDMPEnabled (doğru); // Arduino kəsilməsinin aşkarlanmasını aktivləşdirin Serial.print (F ("Aralıq kəsilməsini aktivləşdirmə (Arduino xarici kəsmə")); Serial.print (digitalPinToInterrupt (INTERRUPT_PIN)); Serial.println (F (")…")); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // DMP Hazır bayrağımızı elə qurun ki, əsas loop () funksiyası ondan istifadə etməyinizin yaxşı olduğunu bilsin Serial.println (F ("DMP hazır! İlk kəsilmə gözləyir …")); dmpReady = doğru; // sonrakı müqayisə üçün gözlənilən DMP paket ölçüsünü əldə edin packetSize = mpu.dmpGetFIFOPacketSize (); } başqa {// HATA! // 1 = ilkin yaddaş yüklənməsi uğursuz oldu // 2 = DMP konfiqurasiya yeniləmələri uğursuz oldu // (pozulacaqsa, adətən kod 1 olacaq) Serial.print (F ("DMP Başlanğıcı uğursuz oldu (kod")); Serial. çap (devStatus); Serial.println (F (")")); }} void loop () {if (! dmpReady) qayıt; if (mpu.dmpGetCurrentFIFOPacket (fifoBuffer)) {// Ən Son Paketi Alın // Euler açılarını dərəcə ilə göstərin mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& cazibə qüvvəsi, & q); mpu.dmpGetYawPitchRoll (fırlanma, q, və çəkisi); } Serial.print ("X"); Serial.print (fırlanma [2] * 180/M_PI); Serial.print ("\ t Y"); Serial.print (fırlanma [1] * 180/M_PI); Serial.print ("\ t Z"); Serial.println (fırlanma [0] * 180/M_PI); x = fırlanma [2] * 180/M_PI; y = fırlanma [1] * 180/M_PI; z = fırlanma [0] * 180/M_PI; if (abs (x) <45 && abs (y) 45 && abs (x) <135 && (abs (y) 135)) {activeColor = piksel. Color (255, 0, 0); // Yan tərəfə dönəndə qırmızı} else if if (x <-45 && abs (x) <135 && (abs (y) 135)) {activeColor = piksel. Color (0, 255, 0); // İkinci tərəfə dönəndə yaşıl} başqa} if (y> 45 && abs (y) <135 && (abs (x) 135)) {activeColor = piksel. Color (255, 255, 0); // Üçüncü tərəfə çevrildikdə sarı} başqa} if (y <-45 && abs (y) <135 && (abs (x) 135)) {activeColor = piksel. Color (0, 0, 255); // Dördüncü tərəfə dönəndə mavi}} başqa halda (abs (y)> 135 && abs (x)> 135) {activeColor = piksel. Color (0, 0, 0); // Ters çevrildikdə qara} if (activeColor! = OldActiveColor) {piksel.clear (); piksel doldurun (activeColor); piksel.show (); oldActiveColor = aktivRəng; }}

Sonda ColorCube.ino faylını açıb yükləyə bilərsiniz. ColorCube düz bir səthə qoyun və yandırın. Kalibrdən sonra (bir neçə saniyə) ağ rənglə işıqlanana qədər onu hərəkət etdirməyin. Sonra ColorCube -u yan tərəfə qoya bilərsiniz və rəng dəyişəcək - hər tərəfin öz rəngi var - qırmızı, yaşıl, mavi, sarı. ColorCube tərs çevrildikdə sönür.

Addım 6: Montaj

Montaj
Montaj
Montaj
Montaj
Montaj
Montaj

Quraşdırma zamanı yumşaq olun. Tellər və bütün hissələr kobud davranışı sevmir.

Düyməli 3d çaplı hissə - düyməni altdakı çap hissəsindəki çuxura yumşaq bir şəkildə qoyun (şəkildə göstərildiyi kimi), bütün artıq materialları (əsasən içərisində alt hissədə bir dairə çuxurunun üstü). (Şəkil)

MPU-6050, Arduino Nano, TP4056 və MT3608 deliklərinə qoyun. Qutunun altına MPU-6050 və MT3608 daxil etdiyiniz çıxıntılar var. Arduino Nano və TP4056 USB konnektorlarını qutunun yan divarlarında olan deliklərə qoyun. (Şəkil)

Komponentləri düzəltmək üçün 3d çaplı kiliddən istifadə edin (bütün komponentlərin alt hissəyə möhkəm bir şəkildə qoyulduğundan əmin olun). Bu vacibdir, çünki kimsə mütləq ColorCube ilə zar kimi oynamağa çalışacaq. (Şəkil)

Batareyanı möhkəm tutmadıqda çuxuruna qoyun və bağlayın.

Öz-özünə kilidləmə düyməsini alt hissədəki hazırlanmış çuxura qoyun. Öz-özünə kilidləmə düyməsi ON (qısa) vəziyyətdə olmalıdır. Yavaşca düyməni aşağı salın. 3d çap edilmiş düymə ilə funksionallığı sınayın. (şəkillər)

LED üzüyü orta çaplı hissəyə bağlamaq üçün iki M2 vint istifadə edin. Tel kontaktlarının orta çap hissəsinin yuvarlaq bir çuxurunda olduğu halqanın istiqamətini istifadə etmək yaxşıdır. (şəkillər)

İsteğe bağlı: Burada və orada bir damla isti yapışqan istifadə edin - çox uzun tellər üçün halqaya bağlanan tellər, bir şey kifayət qədər sıx deyilsə və s. ColorCube -nuzu daha davamlı edə bilər.

ColorCube içindəki telləri çap olunmuş hissələrlə sıxılmamasını təmin edin. Orta hissəni aşağıya qoyun. Düzəltmək üçün M3 vintini istifadə edin. (Şəkil)

Nəhayət, yuxarıdakı hissəni yumşaq bir şəkildə aşağıya itələyin. (Şəkil)

Addım 7: Tamamlandı

Təbriklər. Əylənin.

Tövsiyə: