Mundarija:
2025 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2025-01-13 06:58
Ushbu loyihada siz ardruino, Adafruit neo rgb Strips va 3D printer yordamida tungi chiroqni yasaysiz.
E'tibor bering, bu tushunarli narsa faqat mening maktab loyiham uchun. Ushbu loyihaning kodi boshqa loyihadan olingan. Aytgancha, men Ardruino haqida gap ketganda, men mutaxassis emasman.
1 -qadam: talablar
Loyihani amalga oshirish uchun sizga quyidagi uskunalar va asboblar kerak bo'ladi
Uskuna:
1 - ardruino101 (AQShda) yoki Genuino101 (AQShdan tashqarida).
2 - Adafruitdan (5 volt) NeoPixel rgb etakchi chiziqlar.
3 - ardruino usb ulagichi (B tipidagi A konnektori).
4 - Ardruino, Ardruino IDE dasturlari Ushbu qo'llanmada biz 1.8.5 versiyasidan foydalanamiz. Dasturiy kutubxona talablari: 101, Adafruit NeoPixel va Madgwick.
5 -Va sizning qurilmangizni joylashtiradigan ob'ekt. Bunday holda, men 3D printerdan foydalanaman. Ushbu 3D chop etish uchun fayl "Chiroq boshi" deb nomlangan tavsiflarda joylashgan. E'tibor bering, bu format 3D chop etishga tayyor emas. 3D -printerlaringizga qarab, avval 3D -ob'ektda 3D bosma dasturini ishga tushirish kerak. Ba'zida 3D bosib chiqarish o'lchami tiklanadi. shuning uchun diametri 11 sm dan 11 sm gacha o'rnatilganligiga ishonch hosil qiling.
6 - asosiy lehim to'plami.
2 -qadam: Uskuna va dasturiy ta'minotni tushunish
Ardruin/Genuino101
Tushuntirish uchun, Ardruino101 va genuino101 nomlari bilan bir xil. Ikkalasi ham bir xil xususiyatlarga ega va bir xil dasturiy ta'minotdan foydalanadi.
Ardruino101, UNR ardruino kabi asosiy xususiyatlarga ega. Ardruino101 -ning asosiy xususiyati - biz o'z loyihamizda ishlatadigan akselerometr va giroskop. Bundan tashqari, bu turdagi ardruino 101 -sonli kutubxona kengaytmasiga kiritilgan CurrieIMU (Ichki o'lchov birliklari) nomli yagona kodli kutubxonaga ega.
Shu bilan dasturiy ta'minot haqida gaplashamiz.
Dasturlar va kutubxonalar
Ardruino IDE pythonni asosiy manba kodi sifatida ishlatadi. bu, shuningdek, eng ardruino ishlaydigan asosiy platvorm kodi. Internetda ushbu dasturiy ta'minotdan foydalanish bo'yicha ko'plab darsliklar mavjud, shuning uchun agar siz ushbu dasturda yangi bo'lsangiz, avval ularni o'rganishni tavsiya qilaman.
Bu bilan biz foydalanadigan kutubxonalar quyidagilar:
Sketch menyusidan> Kutubxonani qo'shish> Kutubxonalarni boshqarish … matn kiritish maydoniga kiriting
- 101 standart bo'yicha ardruino 101 avtomatik ravishda ardruino IDE -ga kiritilmagan. Bizning ardruino turini kodlash uchun bizga ushbu kutubxona kengaytmasi kerak.
-Adafruit NeoPixel Neo pikselli chiziqlarimizni kodlash uchun.
-Madgvik Xom -ashyo ma'lumotlarini o'qish va bu ma'lumotlarni xom -ashyo, pitch va rulonli hisoblash uchun.
RGB tasmalari yo'q
Men foydalanmoqchi bo'lgan turdagi 5 voltli yoki 5v tipli. Bu 5v yordamida men chiziqlarimni boshqarish uchun kengaytirilgan quvvat manbaiga muhtoj emasman. Buning o'rniga men chiziqlarimni boshqarish va yoritishda quvvat manbai sifatida ardruino -dan foydalanmoqchiman.
Bu chiziqlarni boshlashdan oldin bilishingiz kerak bo'lgan ba'zi maslahatlar.
Birinchidan, sizga adafruitdan Neodigital RGB chiziqli chiziqlar kerak bo'ladi. Ushbu turdagi chiziqlar kodlar yordamida ko'chirilishi mumkin. Siz bilishingiz kerakki, bu chiziqlarda orqa va old tomon bor. Bu orqa va old tomondan lehim uchun muhim ahamiyatga ega. O'q tugmasi uchidan uzoqroqqa qaragan old tomonni lehimlaganingizga ishonch hosil qiling.
Bu erda ulardan qanday foydalanish bo'yicha ko'rsatma.
Shuni yodda tutish kerakki, 3 ta lehim nuqtasi bor: erga ulanish (GND), kuchlanishli ulanish (V) va pinli ulanish (DIN).
3 -qadam: Komponentlarni sozlash
Avval siz talablarga javob beradigan komponentni 3d chop etishingiz kerak. Bu holda men PLAdan foydalanmoqchiman. Qo'shimcha ob'ektning diametri 11 sm dan 11 sm gacha ekanligiga ishonch hosil qiling. Bu ardruino va chiziqlar shpirga mos kelishini ta'minlaydi. E'tibor bering, har bir 3D printer bosib chiqarish jarayonini hisoblash uchun turli xil dasturlardan foydalanadi. Aytgancha, siz foydalanadigan fayl har xil bo'lishi mumkin, shuning uchun buni yodda tuting.
Chop etishdan so'ng, komponentlar yopilishi mumkinligiga ishonch hosil qiling. 3D bosmalar birgalikda sharni tashkil qiladi. Ular yaxshi joylashishi kerak. Agar kontent yo'qolsa, qopqoqni to'ldirish uchun ichki tomonga lenta yopishtiring. Va agar qalin bo'lsa, zımpara qog'ozidan foydalaning.
Uchinchidan, ardruino va chiziqlar uchun skematichlar juda oson. Chiziqlarni ardruino bilan ulash uchun siz 3 ta simdan foydalanasiz. E'tibor bering, faqat lehimlanadigan joylar chiziqlardadir. Ardruinoning o'zida emas.
GND GNDga o'tadi
DIN PIN -kodga o'tadi (bizning holatimizda ardruino -dagi pin6)
5V 5V ga o'tadi
Qo'llaniladigan chiziqlar soni 30 ga teng ekanligiga ishonch hosil qiling. Qachonki, u kodni to'g'ri bajara olmaydi. Siz qaychi belgisi bilan ko'rsatilgan keraksiz chiziqlarni kesib qo'yishingiz mumkin.
To'rtinchi narsa hamma narsaga yaxshi mos bo'lishi kerak. Siz xohlaysizmi, men 3 o'lchamli bosmadan birini kesib o'tmoqchiman va tepada plastmassani ko'rdim.
4 -qadam: kodlash
Shunday qilib, hozircha kutubxonangizda zarur bo'lgan barcha komponentlar bo'lishi kerak.
Mana, loyihani ishga tushirish uchun sizga kerak bo'lgan kod. Natijada men bu sahifada yuborgan video havolaga o'xshab ketishi kerak.
Bu kodning manbasini bu erda topish mumkin. Ushbu loyiha, shuningdek, kodni va algaritmalarni ishlatishni yaxshiroq tushunish uchun zarur qadamlarni o'z ichiga oladi.
#qo'shish #qo'shish #qo'shish #qo'shish
#PIN kodni belgilang 6 // 11 pikselli NeoPixel Strip
#define PIN1 7 // 1 pixel NeoPixel Strip #NUMPIXELS 30 ni belgilang // Piksellar soni #SAMPLE_RATE 25 ni aniqlang // Akselerometr va giroskop uchun namuna olish tezligi
// Madgvik konfiguratsiyasi
Madgvik filtri; imzosiz uzun microsPerReading, microsPrevious; float accelScale, gyroScale;
// NeoPixel konfiguratsiyasi
Adafruit_NeoPixel piksellari = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);
// Rangli bo'shliqlar
RGBConverter rgbConverter; er -xotin h = 1; er -xotin s = 1; er -xotin v = 1; bayt rgb [3];
// Status Motion Lamp
// 0 -holat -> Hue -Pitch -ni tanlang // 1 -holat -> Saturation -ni tanlang -Roll // 2 -holat -> Value -ni tanlang -Yaw // 3 -holat -> Fix color volatile int statusLamp = 0;
bo'sh o'rnatish () {
Serial.begin (9600);
// IMUni ishga tushiring va filtrlang
CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);
// Akselerometr diapazonini 2G ga o'rnating
CurieIMU.setAccelerometerRange (2); // Giroskop diapazonini 250 daraja/sekundga o'rnating CurieIMU.setGyroRange (250);
CurieIMU.autoCalibrateAccelerometerOffset (X_AXIS, 0);
CurieIMU.autoCalibrateAccelerometerOffset (Y_AXIS, 0); CurieIMU.autoCalibrateAccelerometerOffset (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset ();
CurieIMU.attachInterrupt (eventCallback);
CurieIMU.setDetectionThreshold (CURIE_IMU_TAP, 950); CurieIMU.ni uzadi (CURIE_IMU_TAP);
// tezlikni to'g'rilash uchun o'zgaruvchilarni ishga tushirish
microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();
// NeoPixel 11 -ni ishga tushiring
piksel.begin (); piksel.show ();
// NeoPixel 1 -ni ishga tushiring
pikselStatus.begin (); piksel.show ();
// Vaziyatni piksellar sonida ko'rsatish
setStatusPixel (statusLamp); }
void loop () {
int aix, aiy, aiz; // akselerometr int gix, kiyim, giz; suzuvchi bolta, ay, az; float gx, gy, gz; suzuvchi rulon, qadam, yaw; statik belgisiz uzun mikrosxabar;
// ma'lumotlarni o'qish va filtrni yangilash vaqti kelganligini tekshiring
microsNow = micros (); agar (microsNow - microsPrevious> = microsPerReading) {
// CurieIMU ma'lumotlarini o'qing
CurieIMU.readMotionSensor (aix, aiy, aiz, gix, kiyim, giz);
// xom ma'lumotlardan tortishish va daraja/soniya birliklariga aylantirish
ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (kiyim); gz = convertRawGyro (yashirish);
// yo'nalishni hisoblaydigan filtrni yangilang
filter.updateIMU (gx, gy, gz, ax, ay, az);
// sarlavhani chop eting, aylantiring va aylantiring
roll = filter.getRoll (); qadam = filter.getPitch (); yaw = filter.getYaw ();
// oldingi vaqtni ko'paytiring, shuning uchun biz to'g'ri tezlikni saqlaymiz
microsPrevious = microsPrevious + microsPerReading;
// Faqat rang, to'yinganlik yoki qiymat o'zgarganda
Agar
// Burchaklar cheklovlari
// faqat -90º dan 90º = 180º gacha siljish // 1 -holat -> to'yinganlikni tanlang, agar (roll> = -90 && roll <= 90 && statusLamp == 1) {// Burilish burchagini aylantirish = rulon + 90; // Rangli kordinatalarni s = roll / 180.0 burchaklardan oladi; }
// 2 -holat -> qiymatni tanlang
agar (statusLamp == 2) {// yaw 0º dan 360º v = yaw / 360.0; }
// rgb ga aylantirish
rgbConverter.hsvToRgb (h, s, v, rgb); /* Serial.print ("Rang:"); Ketma -ket chop etish (h); Serial.print (" -"); Ketma -ket bosma nashrlar; Serial.print (" -"); Serial.print (v); Serial.println ("");
Serial.print ("Yo'nalish:");
Ketma -ket chop etish (yaw); Serial.print (""); Ketma -ket chop etish (qadam); Serial.print (""); Serial.println (rulon); */
// Piksellarning rangini o'zgartirish
uchun (int px = 0; px <NUMPIXELS; px ++) {piksel.setPixelColor (px, piksel. Color (rgb [0], rgb [1], rgb [2]))); piksel.show (); }}
// Vaziyatni piksellar sonida ko'rsatish
setStatusPixel (statusLamp); }}
float convertRawAcceleration (int aRaw) {
// chunki biz 2G diapazonidan foydalanmoqdamiz // -2g xaritalari -32768/ 2g xaritalari 32767 xom qiymatiga.
float a = (aRaw * 2.0) / 32768.0;
qaytarish a; }
float convertRawGyro (int gRaw) {
// biz 250 daraja/soniya diapazonidan foydalanganimiz uchun // -250 xaritalar -32768/+250 xaritalari 32767 xom qiymatiga.
float g = (gRaw * 250.0) / 32768.0;
qaytish g; }
statik void eventCallback ()
{// Agar (CurieIMU.getInterruptStatus (CURIE_IMU_TAP))) {Serial.print ("Aniqlangan statusLamp -ga teging") bo'lsa, barcha o'qda tegishni aniqlang; Serial.println (statusLamp);
// Vaziyatni o'zgartirish
statusLamp ++;
// Bosh holat
if (statusLamp> 3) {statusLamp = 0; }}}
void setStatusPixel (int statusPx)
{switch (statusPx) {0 holat: pixelStatus.setPixelColor (0, pixelStatus. Color (150, 0, 0))); pixelStatus.show (); tanaffus; 1 -holat: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 150, 0)); pikselStatus.show (); tanaffus; 2 -holat: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 0, 150)); pixelStatus.show (); tanaffus; 3 -holat: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 0, 0)); pixelStatus.show (); tanaffus;
}
}