สารบัญ:

เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101: 4 ขั้นตอน (พร้อมรูปภาพ)
เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101: 4 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: รู้จัก Auduino UNO และเขียนโค้ดสั่งไฟกระพริบ ง่ายมากๆ 2024, พฤศจิกายน
Anonim
Image
Image
เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101
เปลี่ยนสีไฟกลางคืนโดยใช้ Ardruino 101

ในโครงการนี้ คุณจะต้องสร้างโคมไฟกลางคืนโดยใช้ ardruino, Adafruit neo rgb Strips และเครื่องพิมพ์ 3 มิติ

โปรดทราบว่าคำสั่งสอนนี้มีไว้สำหรับโครงการโรงเรียนของฉันเท่านั้น รหัสสำหรับโครงการนี้มาจากโครงการอื่น ด้วยที่กล่าวว่าฉันไม่ใช่ผู้เชี่ยวชาญเมื่อพูดถึง Ardruino

ขั้นตอนที่ 1: ข้อกำหนด

ความต้องการ
ความต้องการ
ความต้องการ
ความต้องการ
ความต้องการ
ความต้องการ

สำหรับโครงการนี้ คุณจะต้องมีฮาร์ดแวร์และเครื่องมือดังต่อไปนี้

ฮาร์ดแวร์:

1 - ardruino101 (ในสหรัฐอเมริกา) หรือ Genuino101 (สำหรับนอกสหรัฐอเมริกา)

2 - แถบนำ NeoPixel rgb จาก adafruit (5 โวลต์)

3 - ขั้วต่อ usb ardruino (ขั้วต่อชนิด B ถึง A)

4 - ซอฟต์แวร์จาก Ardruino, Ardruino IDE ในบทช่วยสอนนี้ เราจะใช้เวอร์ชัน 1.8.5 ข้อกำหนดของไลบรารีซอฟต์แวร์คือ: 101, Adafruit NeoPixel และ Madgwick

5 - และวัตถุสำหรับจัดเก็บฮาร์ดแวร์ของคุณ ในกรณีนี้ ฉันจะใช้เครื่องพิมพ์ 3 มิติ ไฟล์สำหรับการพิมพ์ 3 มิตินี้จะอยู่ในคำอธิบายที่เรียกว่า "Lamp Head" โปรดทราบว่ารูปแบบไฟล์นี้ไม่พร้อมสำหรับการพิมพ์ 3 มิติ คุณต้องเรียกใช้ซอฟต์แวร์การพิมพ์ 3 มิติที่กำหนดบนวัตถุ 3 มิติก่อน ทั้งนี้ขึ้นอยู่กับเครื่องพิมพ์ 3 มิติของคุณ บางครั้งขนาดของการพิมพ์ 3 มิติจะรีเซ็ต ดังนั้น ตรวจสอบให้แน่ใจว่าเส้นผ่านศูนย์กลางตั้งไว้ที่ 11 ซม. คูณ 11 ซม.

6 - ชุดบัดกรีพื้นฐาน

ขั้นตอนที่ 2: ทำความเข้าใจเกี่ยวกับฮาร์ดแวร์และซอฟต์แวร์

Ardruin/Genuino101

เพียงเพื่อชี้แจง Ardruino101 และ genuino101 นั้นเหมือนกันทุกประการข้างชื่อ ทั้งสองมีข้อกำหนดเดียวกันและใช้ซอฟต์แวร์เดียวกัน

Ardruino101 มีสเปกพื้นฐาน เช่น ardruino UNO และอื่นๆ คุณสมบัติหลักของ ardruino101 คือมาตรความเร่งและไจโรสโคปที่เราจะใช้ในโครงการของเรา นอกจากนี้ ardruino ประเภทนี้ยังมีไลบรารีโค้ดเฉพาะที่เรียกว่า CurrieIMU (Internal Measuring Units) ซึ่งรวมอยู่ในส่วนขยายไลบรารี 101

ด้วยที่กล่าวว่าเรามาพูดคุยเกี่ยวกับซอฟต์แวร์

ซอฟต์แวร์และไลบรารี

Ardruino IDE ใช้ python เนื่องจากเป็นซอร์สโค้ดหลัก นอกจากนี้ยังเป็น platvorm รหัสหลักที่ ardruino ส่วนใหญ่ทำงาน มีบทเรียนออนไลน์มากมายเกี่ยวกับวิธีการใช้ซอฟต์แวร์นี้ ดังนั้นฉันขอแนะนำให้คุณค้นคว้าข้อมูลเหล่านั้นก่อน หากคุณยังใหม่กับโปรแกรมนี้

โดยที่กล่าวว่าไลบรารีที่เราใช้อยู่มีดังต่อไปนี้:

จากเมนู Sketch > รวมไลบรารี > จัดการไลบรารี… ในช่องป้อนข้อความให้พิมพ์

- 101 ที่มาตรฐาน ardruino 101 จะไม่รวมอยู่ใน ardruino IDE โดยอัตโนมัติ เราต้องการส่วนขยายไลบรารีนี้เพื่อเข้ารหัสประเภท ardruino ของเรา

-Adafruit NeoPixel เพื่อเข้ารหัสแถบพิกเซล Neo ของเรา

-Madgwick เพื่ออ่านข้อมูลดิบและคำนวณข้อมูลนี้เป็นข้อมูลดิบ ขว้างและม้วน

แถบ Neo RGB

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

นี่คือเคล็ดลับบางอย่างที่คุณต้องรู้ก่อนเริ่มใช้งานแถบนี้

ก่อนอื่นคุณต้องมีแถบ LED Neodigital RGB จาก adafruit แถบชนิดนี้ควบคุมได้โดยใช้รหัส ต่อไปคุณต้องรู้ก่อนว่าแถบนี้มีด้านหลังและด้านหน้า ด้านหลังและด้านหน้านี้มีความสำคัญต่อการบัดกรี ตรวจสอบให้แน่ใจว่าคุณประสานด้านหน้าโดยที่ปุ่มลูกศรชี้ออกจากปลาย

นี่คือคำแนะนำเกี่ยวกับวิธีการใช้งาน

มีจุดบัดกรี 3 จุดที่คุณต้องคำนึงถึง การเชื่อมต่อกราวด์ (GND), การเชื่อมต่อแรงดันไฟฟ้า (V) และ การเชื่อมต่อพิน (DIN)

ขั้นตอนที่ 3: การตั้งค่าส่วนประกอบ

การตั้งค่าส่วนประกอบ
การตั้งค่าส่วนประกอบ
การตั้งค่าส่วนประกอบ
การตั้งค่าส่วนประกอบ
การตั้งค่าส่วนประกอบ
การตั้งค่าส่วนประกอบ

ขั้นแรก คุณจะต้องพิมพ์ส่วนประกอบ 3 มิติ ซึ่งคุณสามารถหาได้ในข้อกำหนด ในกรณีนี้ ฉันจะใช้ PLA ตรวจสอบให้แน่ใจว่าเส้นผ่านศูนย์กลางของวัตถุโดยรวมคือ 11 ซม. x 11 ซม. สิ่งนี้จะช่วยให้มั่นใจได้ว่า ardruino และแถบจะพอดีกับ shpere โปรดทราบว่าเครื่องพิมพ์ 3 มิติแต่ละเครื่องใช้ซอฟต์แวร์ที่แตกต่างกันในการคำนวณกระบวนการพิมพ์ ไฟล์ที่คุณใช้อาจมีการปรับขนาดต่างกัน ดังนั้นโปรดระลึกไว้เสมอว่า

วินาทีหลังการพิมพ์ ตรวจสอบให้แน่ใจว่าส่วนประกอบต่างๆ สามารถปิดได้ การพิมพ์ 3 มิติรวมกันเป็นทรงกลม พวกเขาควรจะพอดีอย่างดี หากส่วนประกอบสูญหาย ให้ติดเทปที่ด้านในเพื่อให้ฝาเต็ม และถ้าหนาให้ใช้กระดาษทราย

ประการที่สาม skematichs สำหรับ ardruino และแถบนั้นค่อนข้างง่าย คุณจะใช้สายไฟ 3 เส้นเพื่อเชื่อมต่อแถบกับ ardruino โปรดทราบว่าสถานที่เดียวที่ฉันบัดกรีอยู่บนแถบ ไม่ใช่บน Ardruino เอง

GND ไปที่ GND

DIN ไปที่พิน (ในกรณีของเรา pin6 บน ardruino)

5V ไปที่ 5V

ตรวจสอบให้แน่ใจว่าจำนวนแถบนำที่คุณใช้อยู่ที่ 30 อีกต่อไปแล้วและจะไม่สามารถรันโค้ดได้อย่างถูกต้อง คุณสามารถตัดแถบที่ไม่ได้ใช้ซึ่งแสดงเครื่องหมายกรรไกรได้ง่ายๆ

สิ่งที่สี่ Evrything ควรพอดีอย่างดีในทรงกลม คุณอาจเหมือนว่าฉันทำจุดตัดระหว่าง 1 ของการพิมพ์ 3 มิติเพื่อดูรางและวางพลาสติกรางน้ำที่ด้านบน

ขั้นตอนที่ 4: การเข้ารหัส

ตอนนี้คุณควรมีส่วนประกอบทั้งหมดที่จำเป็นในห้องสมุดของคุณ

นี่คือรหัสที่คุณต้องการเพื่อเรียกใช้โครงการ ผลลัพธ์ควรมีลักษณะเหมือนลิงก์วิดีโอที่ฉันส่งในหน้านี้

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

#รวม #รวม #รวม #รวม

#define PIN 6 // 11 พิกเซล NeoPixel Strip

#define PIN1 7 // 1 พิกเซล NeoPixel Strip #define NUMPIXELS 30 // จำนวนพิกเซล #define SAMPLE_RATE 25 // อัตราการสุ่มตัวอย่างสำหรับมาตรความเร่งและไจโรสโคป

// การกำหนดค่า Madgwick

ตัวกรองแมดจ์วิค; microsPerReading แบบยาวที่ไม่ได้ลงนาม, microsPrevious; ลอย accelScale, gyroScale;

// การกำหนดค่า NeoPixel

พิกเซล Adafruit_NeoPixel = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel พิกเซลสถานะ = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);

// ช่องว่างสี

RGBConverter rgbConverter; สองเท่า ชั่วโมง = 1; ดับเบิ้ล s = 1; ดับเบิล v = 1; ไบต์ rgb[3];

// สถานะหลอดไฟเคลื่อนไหว

// State 0 -> Select Hue - Pitch // State 1 -> Select Saturation - Roll // State 2 -> Select Value - Yaw // State 3 -> แก้ไขสี int statusLamp = 0;

การตั้งค่าเป็นโมฆะ () {

Serial.begin(9600);

// เริ่ม IMU และตัวกรอง

CurieIMU.begin(); CurieIMU.setGyroRate(SAMPLE_RATE); CurieIMU.setAccelerometerRate(SAMPLE_RATE); filter.begin(SAMPLE_RATE);

// ตั้งค่าช่วงมาตรความเร่งเป็น 2G

CurieIMU.setAccelerometerRange(2); // ตั้งค่าไจโรสโคปเป็น 250 องศา/วินาที CurieIMU.setGyroRange(250);

CurieIMU.autoCalibrateเครื่องวัดความเร่งออฟเซ็ต (X_AXIS, 0);

CurieIMU.autoCalibrateเครื่องวัดความเร่งออฟเซ็ต (Y_AXIS, 0); CurieIMU.autoCalibrateเครื่องวัดความเร่งออฟเซ็ต (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset();

CurieIMU.attachInterrupt (เหตุการณ์Callback);

CurieIMU.setDetectionThreshold (CURIE_IMU_TAP, 950); CurieIMU.interrupts(CURIE_IMU_TAP);

// เริ่มต้นตัวแปรเพื่อเร่งการอัพเดตเพื่อแก้ไขอัตรา

microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = ไมโคร ();

// เริ่มต้น NeoPixel 11

พิกเซล.begin(); พิกเซล.show();

// เริ่มต้น NeoPixel 1

pixelStatus.begin(); พิกเซล.show();

// แสดงสถานะเป็น px

setStatusPixel (ไฟสถานะ); }

วงเป็นโมฆะ () {

int aix, aiy, aiz; //มาตรความเร่ง int gix, giy, giz; ขวานลอย, ay, az; ลอย gx, gy, gz; ม้วนลอย, ขว้าง, หันเห; microsNow แบบยาวที่ไม่ได้ลงนามแบบคงที่;

// ตรวจสอบว่าได้เวลาอ่านข้อมูลและอัปเดตตัวกรองหรือไม่

microsNow = ไมโคร (); ถ้า (microsNow - microsPrevious >= microsPerReading) {

// อ่านข้อมูลดิบจาก CurieIMU

CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);

// แปลงจากข้อมูลดิบเป็นหน่วยแรงโน้มถ่วงและหน่วยองศา/วินาที

ขวาน = convertRawAcceleration(aix); ay = convertRawAcceleration(aiy); az = แปลงRawAcceleration(aiz); gx = แปลงRawGyro(gix); gy = convertRawGyro(giy); gz = แปลงRawGyro(giz);

// อัปเดตตัวกรองซึ่งคำนวณการวางแนว

filter.updateIMU(gx, gy, gz, ax, ay, az);

// พิมพ์หัวเรื่อง ขว้างและม้วน

ม้วน = filter.getRoll(); ระยะห่าง = filter.getPitch(); หันเห = filter.getYaw();

// เพิ่มเวลาก่อนหน้านี้เพื่อให้เราก้าวอย่างเหมาะสม

microsPrevious = microsPrevious + microsPerReading;

// เฉพาะในกรณีที่เปลี่ยน Hue, Saturation หรือ Value

if (statusLamp เลือก Hue if (pitch >= -90 && pitch <= 90 && statusLamp == 0) { // เปลี่ยนมุม pitch = pitch + 90; // รับพิกัดสีจากมุม h = pitch / 180.0; }

// ข้อ จำกัด ของมุม

// ม้วนเท่านั้น -90ºถึง90º = 180º // สถานะ 1 -> เลือกความอิ่มตัวถ้า (ม้วน >= -90 && ม้วน <= 90 && statusLamp == 1) { // เปลี่ยนมุมม้วน = ม้วน + 90; // รับพิกัดสีจากมุม s = ม้วน / 180.0; }

// สถานะ 2 -> เลือกค่า

ถ้า (statusLamp == 2) { // yaw 0º ถึง 360º v = yaw / 360.0; }

// แปลงเป็น rgb

rgbConverter.hsvToRgb(h, s, v, rgb); /* Serial.print("สี: "); Serial.print(h); Serial.print(" - "); Serial.print(s); Serial.print(" - "); Serial.print(v); Serial.println(" ");

Serial.print("การวางแนว: ");

Serial.print(หันเห); Serial.print(" "); Serial.print(พิทช์); Serial.print(" "); Serial.println(ม้วน); */

// เปลี่ยนสีของพิกเซล

สำหรับ (int px = 0; px < NUMPIXELS; px++) { pixels.setPixelColor(px, pixels. Color(rgb[0], rgb[1], rgb[2])); พิกเซล.show(); } }

// แสดงสถานะเป็น px

setStatusPixel (ไฟสถานะ); } }

float convertRawAcceleration (int aRaw) {

// เนื่องจากเราใช้ช่วง 2G // -2g จับคู่กับค่าดิบที่ -32768 // +2g จับคู่กับค่าดิบ 32767

float a = (aRaw * 2.0) / 32768.0;

ส่งคืน a; }

float convertRawGyro (int gRaw) {

// เนื่องจากเราใช้ช่วง 250 องศา/วินาที // -250 จับคู่กับค่าดิบที่ -32768 // +250 จับคู่กับค่าดิบ 32767

float g = (gRaw * 250.0) / 32768.0;

กลับกรัม; }

โมฆะคงที่ eventCallback()

{ // ตรวจจับการแตะในแกนทั้งหมดหาก (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) { Serial.print ("ตรวจพบการแตะ statusLamp: "); Serial.println (ไฟสถานะ);

// เปลี่ยนสถานะ

สถานะLamp++;

// สถานะเริ่มต้น

ถ้า (statusLamp > 3) { statusLamp = 0; } } }

เป็นโมฆะ setStatusPixel (int statusPx)

{ สวิตช์ (statusPx) { กรณี 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); pixelStatus.show(); หยุดพัก; กรณีที่ 1: pixelsStatus.setPixelColor(0, pixelsStatus. Color(0, 150, 0)); pixelStatus.show(); หยุดพัก; กรณีที่ 2: pixelsStatus.setPixelColor(0, pixelsStatus. Color(0, 0, 150)); pixelStatus.show(); หยุดพัก; กรณีที่ 3: pixelsStatus.setPixelColor(0, pixelsStatus. Color(0, 0, 0)); pixelStatus.show(); หยุดพัก;

}

}

แนะนำ: