สารบัญ:
วีดีโอ: วิธีทำ Robo-Bellhop: 3 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:08
By jeffreyfFollow เพิ่มเติมโดยผู้เขียน:
เกี่ยวกับ: ฉันชอบแยกสิ่งต่าง ๆ และค้นหาวิธีการทำงาน ฉันมักจะหมดดอกเบี้ยหลังจากนั้น ข้อมูลเพิ่มเติมเกี่ยวกับเจฟฟรีฟ »
คำแนะนำนี้แสดงวิธีใช้ iRobot Create เพื่อสร้างเบลล์ฮอปที่เคลื่อนไหว สิ่งนี้ถูกยกขึ้นโดยได้รับอนุญาตจากคำแนะนำของ carolDancer และฉันได้รวบรวมไว้เป็นตัวอย่างสำหรับการประกวดของเรา Robo-BellHop สามารถเป็นผู้ช่วยส่วนตัวของคุณในการขนกระเป๋า ของชำ ซักรีด ฯลฯ ดังนั้นคุณจึงไม่มี ถึง. Create พื้นฐานมีถังติดอยู่ที่ด้านบนและใช้เครื่องตรวจจับ IR ในตัวสองตัวเพื่อติดตามเครื่องส่งสัญญาณ IR ของเจ้าของ ด้วยรหัสซอฟต์แวร์ C พื้นฐาน ผู้ใช้สามารถรักษาความปลอดภัยของของชำหนัก ซักรีดจำนวนมาก หรือกระเป๋าค้างคืนของคุณบน Robo-BellHop และให้หุ่นยนต์ติดตามคุณไปตามถนน ผ่านห้างสรรพสินค้า ลงห้องโถง หรือผ่านสนามบิน - - ทุกที่ที่ผู้ใช้ต้องการไป การทำงานพื้นฐาน1) กดปุ่มรีเซ็ตเพื่อเปิดโมดูลคำสั่งและตรวจสอบว่าเซ็นเซอร์ทำงานอยู่1a) ไฟ LED เล่นควรสว่างเมื่อเห็นเครื่องส่งสัญญาณ IR ติดตามคุณ1b) ไฟ LED ขั้นสูงจะติดเมื่อ หุ่นยนต์อยู่ในระยะใกล้มาก2) กดปุ่มซอฟท์สีดำเพื่อเรียกใช้กิจวัตร Robo-BellHop3) ติดเครื่องส่งสัญญาณ IR ที่ข้อเท้าและตรวจดูให้แน่ใจว่าได้เปิดเครื่องแล้ว โหลดตะกร้าแล้วไปกันเลย!4) ตรรกะของ Robo-BellHop มีดังนี้:4a) ในขณะที่คุณเดินไปมา หากตรวจพบสัญญาณ IR หุ่นยนต์จะขับด้วยความเร็วสูงสุด4b) หากสัญญาณ IR ดับลง ช่วง (โดยการทำมุมที่ไกลเกินไปหรือคมเกินไป) หุ่นยนต์จะเคลื่อนที่เป็นระยะทางสั้น ๆ ด้วยความเร็วต่ำในกรณีที่สัญญาณถูกหยิบขึ้นมาอีกครั้ง4c) หากตรวจไม่พบสัญญาณ IR หุ่นยนต์จะเลี้ยวซ้ายและขวาใน พยายามหาสัญญาณอีกครั้ง4d) หากตรวจพบสัญญาณ IR แต่หุ่นยนต์ชนสิ่งกีดขวาง หุ่นยนต์จะพยายามขับรถไปรอบๆ สิ่งกีดขวาง4e) หากหุ่นยนต์เข้าใกล้สัญญาณ IR มาก หุ่นยนต์จะหยุดเพื่อหลีกเลี่ยงการกระแทก ข้อเท้าของเจ้าของฮาร์ดแวร์1 หน่วยผนังเสมือน iRobot - เครื่องตรวจจับ IR มูลค่า 301 เหรียญจาก RadioShack - ขั้วต่อตัวผู้ DB-9 มูลค่า 31 เหรียญจาก Radio Shack - 44 เหรียญสหรัฐฯ 6-32 สกรูจาก Home Depot - แบตเตอรี่ 2.502 เหรียญสหรัฐฯ 3V ฉันใช้ตะกร้าซักผ้า D1 จาก Target - 51 ดอลลาร์ล้อพิเศษเพื่อเข้าสู่ ด้านหลังของ Create robotเทปพันสายไฟ ลวด และบัดกรี
ขั้นตอนที่ 1: ปิดเซ็นเซอร์ IR
ติดเทปพันสายไฟเพื่อให้ครอบคลุมทั้งหมด ยกเว้นรอยผ่าเล็กๆ ของเซ็นเซอร์ IR ที่ด้านหน้าของหุ่นยนต์ Create รื้อยูนิตผนังเสมือนและดึงแผงวงจรขนาดเล็กที่ด้านหน้ายูนิต ค่อนข้างยุ่งยากเพราะมีสกรูและที่ยึดพลาสติกซ่อนอยู่มากมาย เครื่องส่งสัญญาณ IR อยู่บนแผงวงจร ปิดเครื่องส่งสัญญาณ IR ด้วยกระดาษทิชชู่ชิ้นหนึ่งเพื่อหลีกเลี่ยงการสะท้อน IR ติดแผงวงจรเข้ากับสายรัดหรือแถบยางยืดที่สามารถพันรอบข้อเท้าของคุณได้ ต่อแบตเตอรี่เข้ากับแผงวงจรเพื่อให้คุณสามารถใส่แบตเตอรี่ไว้ในที่ที่สะดวกสบาย (ฉันทำขึ้นเพื่อใส่แบตเตอรี่ในกระเป๋าของฉัน)
ต่อสายตรวจจับ IR ตัวที่ 2 เข้ากับตัวเชื่อมต่อ DB-9 และเสียบเข้ากับขา 3 ของ Cargo Bay ePort (สัญญาณ) และพิน 5 (กราวด์) ติดตัวตรวจจับ IR ตัวที่ 2 ที่ด้านบนของเซ็นเซอร์ IR ที่มีอยู่บน Create และคลุมด้วยกระดาษทิชชู่สองสามชั้นจนกระทั่งเครื่องตรวจจับ IR ตัวที่ 2 ไม่เห็นตัวปล่อยในระยะทางที่คุณต้องการให้หุ่นยนต์ Create หยุด จากการตีคุณ คุณสามารถทดสอบสิ่งนี้ได้หลังจากคุณกดปุ่มรีเซ็ตแล้วดู LED ขั้นสูงให้ทำงานต่อไปเมื่อคุณอยู่ในระยะหยุด
ขั้นตอนที่ 2: แนบตะกร้า
ติดตะกร้าโดยใช้สกรู 6-32 ฉันเพิ่งติดตั้งตะกร้าไว้ที่ด้านบนของหุ่นยนต์ Create เลื่อนล้อหลังด้วย เพื่อให้คุณวางน้ำหนักไว้ที่ด้านหลังของหุ่นยนต์ Create
หมายเหตุ: - หุ่นยนต์สามารถบรรทุกของได้ไม่น้อย อย่างน้อย 30 ปอนด์ - ขนาดที่เล็กดูเหมือนจะเป็นส่วนที่ยากที่สุดในการพกพากระเป๋าเดินทาง - IR นั้นเจ้าอารมณ์มาก บางทีการใช้ภาพอาจจะดีกว่าแต่ราคาแพงกว่ามาก
ขั้นตอนที่ 3: ดาวน์โหลดซอร์สโค้ด
รหัสที่มาดังต่อไปนี้และแนบมาในไฟล์ข้อความ:
/****************************************************** ******************** follow.c ** -------- ** รันบน Create Command Module ** ครอบคลุมทั้งหมด ยกเว้นช่องเล็กๆ ที่ด้านหน้า ของเซ็นเซอร์ IR ** Create จะเป็นไปตามกำแพงเสมือน (หรือ IR ใด ๆ ที่ส่งสัญญาณ ** สนามแรง) และหวังว่าจะหลีกเลี่ยงอุปสรรคในกระบวนการ ***************** ******************************************************** **/#include interrupt.h>#include io.h>#include#include "oi.h"#define TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#define ค้นหาLeftAngle 125#define ค้นหามุมขวา (SearchLeftAngle - 1000)#define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRDetected (~PINB & 0x01)//states#define Ready 0#define Following 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8/ ตัวแปรโกลบอล olatile uint16_t timer_cnt = 0; uint8_t timer_on ที่ระเหยได้ = 0; uint8_t sensors_flag = 0 ระเหยง่าย uint8_t sensors_index = 0; ระเหย uint8_t sensors_in [Sen6Size]; ระเหย uint8_6 มุม; เซ็นเซอร์วัดมุม ความผันผวน uint8_t inRange = 0; // Functionsvoid byteTx (ค่า uint8_t); เป็นโมฆะ delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); เป็นโมฆะ delayAndUpdateSensors (ไม่ได้ลงนาม int time_ms); เป็นโมฆะเริ่มต้น (เป็นโมฆะ); เป็นโมฆะ powerOnRobot (เป็นโมฆะ); เป็นโมฆะ baud(uint8_t baud_code);void drive(int16_t velocity, int16_t radius);uint16_t randomAngle(void);void defineSongs(void);int main (void){//state variableuint8_t state = Ready;int found = 0;int wait_counter = 0; // ตั้งค่า Create และ moduleinitialize();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// set i/o for second IR sensorDDRB &= ~0x01; //ตั้งค่า cargo bay ePort pin 3 เป็น inputPORTB |= 0x01; // ตั้งค่า cargo ePort pin3 pullup ที่เปิดใช้งาน // โปรแกรมวนรอบ (TRUE){// หยุดเพียงเพื่อเป็นการป้องกันไว้ก่อนไดรฟ์(0, RadStraight);// set LEDsbyteTx(CmdLeds);byteTx(((sensors[SenVWall]))?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;//กำลังมองหาปุ่มผู้ใช้ ตรวจสอบมักจะdelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(UserButtonPressed)&&(!sensors[SenCliffL])&&(!sensors[SenCliffFL])&&(!sensors[SenCliffFR])&&(! เซนเซอร์[SenCliffR])) {byteTx(CmdLeds);byteTx(((เซนเซอร์[SenVWall]))?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(เซนเซอร์[SenCharge1]);byteTx(255);IRDetected ?LED2On:LED2Off;inRange?LED1On:LED1Off;switch(state) {case Ready:if(sensors[SenVWall]) {//check for proximity to leaderif(inRange) {drive(0, RadStraight);} else {// ไดรฟ์ตรง (SlowSpeed, RadStraight);state = กำลังติดตาม;}} อื่น {//ค้นหา beamangle = 0;distance = 0;wait_counter = 0;found = FALSE;drive(SearchSpeed, RadCCW);state = SearchingLeft;}break;case Following:if (เซ็นเซอร์ [SenBumpDrop] & BumpRight) {ระยะทาง = 0;angle = 0;drive (-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if (เซ็นเซอร์ [SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive (-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบ ความใกล้ชิดกับผู้นำ (inRange) {ไดรฟ์ (0, RadStraight);state = Ready;} else {//drive straightdrive (FullSpeed, RadStraight);state = กำลังติดตาม;}} อื่น ๆ {// เพิ่งสูญเสียสัญญาณ ให้ไปช้าๆ หนึ่ง cycledistance = 0; ไดรฟ์ (ความเร็วช้า, RadStraight); รัฐ = WasFollowing;} แตก; กรณี WasFollowing: ถ้า (เซ็นเซอร์ [SenBumpDrop] & BumpRight) {ระยะทาง = 0; มุม = 0; ไดรฟ์ (- ความเร็วช้า, RadStraight);state = BackingTraceLeft;} else if(เซ็นเซอร์[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบความใกล้ชิดกับผู้นำหาก (ในช่วง) {ไดรฟ์(0, RadStraight);state = R eady;} อื่น {// ขับตรง (FullSpeed, RadStraight);state = กำลังติดตาม;}} else if (ระยะทาง >= CoastDistance) {ขับ (0, RadStraight);state = พร้อมแล้ว;} อื่น ๆ {drive (ความเร็วช้า, RadStraight);}break;case SearchingLeft:if(found) {if (angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);state = Following;} else {drive(SearchSpeed, RadCCW);}} else if (เซ็นเซอร์ [SenVWall]) {found = TRUE;angle = 0;if (inRange) {drive(0, RadStraight);state = Ready;} else {drive(SearchSpeed, RadCCW);}} else if (angle >= SearchLeftAngle) {drive (SearchSpeed), RadCW);wait_counter = 0;state = SearchingRight;} else {drive(SearchSpeed, RadCCW);}break;case SearchingRight:if(found) {if (-angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);state = กำลังติดตาม;} else {drive(SearchSpeed, RadCW);}} else if (เซ็นเซอร์ [SenVWall]) {found = TRUE;angle = 0;if (inRange) {drive (0, RadStraight);state = Ready;} else {drive(SearchSpeed, RadCCW);}} else if(wait_counter > 0) {wait_counter -= 20;drive(0, RadStraight);} else if (angle = ค้นหา RightAngle) {drive(0, RadStraight);wait_counter = 5000;angle = 0;} else {drive(SearchSpeed, RadCW);}break;case TracingLeft:if(sensors[SenBumpDrop] & BumpRight) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (เซ็นเซอร์ [SenVWall]) {//check สำหรับความใกล้ชิดกับผู้นำ (inRange) {ไดรฟ์ (0, RadStraight);state = Ready;} else {//drive straightdrive (ความเร็วช้า, RadStraight);state = กำลังติดตาม;}} else if (!(ระยะทาง >= TraceDistance)) { drive(SlowSpeed, RadStraight);} else if (!(-angle >= TraceAngle)) {drive(SearchSpeed, RadCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready; }break;case TracingRight:if(เซ็นเซอร์ [SenBumpDrop] & BumpRight) {drive(0, RadStraight);state=Ready;} else if (เซ็นเซอร์ [SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive (- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (เซ็นเซอร์ [SenVWall]) {// ตรวจสอบความใกล้ชิดกับผู้นำหาก (inRang) e) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = Following;}} else if (!(distance >= TraceDistance)) {drive(SlowSpeed, RadStraight));} else if (!(angle >= TraceAngle)) {drive(SearchSpeed, RadCCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready;}break;case BackingTraceLeft: if (เซ็นเซอร์ [SenVWall] && inRange) {drive(0, RadStraight);state = Ready;} else if (angle >=TraceAngle) {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = TracingLeft; } else if (-distance >= BackDistance) {drive (SearchSpeed, RadCCW);} else {drive(-SlowSpeed, RadStraight);}break;case BackingTraceRight:if (เซ็นเซอร์ [SenVWall] && inRange) {drive(0, RadStraight));state = Ready;} else if (-angle >=TraceAngle) {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = TracingRight;} else if (-distance >= BackDistance) {drive (SearchSpeed), RadCW);} else {drive(-SlowSpeed, RadStraight);}break;default://stopdrive(0, RadStraight);state = Re ady;break;}delayAndCheckIR(10);delayAndUpdateSensors(10);}//cliff หรือ userbutton ตรวจพบ อนุญาตให้เงื่อนไขเสถียร (เช่น ปุ่มที่จะปล่อย)ไดรฟ์(0, RadStraight);delayAndUpdateSensors(2000);}}} // อนุกรมรับการขัดจังหวะเพื่อเก็บค่าเซ็นเซอร์SIGNAL(SIG_USART_RECV){uint8_t temp;temp = UDR0;if(sensors_flag){sensors_in[sensors_index++] = temp;if(sensors_index >= Sen6Size)sensors_flag = 0;}}// ตัวจับเวลา 1 ขัดจังหวะ เวลาล่าช้าใน msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsetimer_on = 0;}// ส่งไบต์ผ่านพอร์ตอนุกรม byteTx(uint8_t value){while(!(UCSR0A & _BV;(UDRE0))) UDR0 = value;}// หน่วงเวลาตามเวลาที่ระบุในหน่วย ms โดยไม่อัปเดตค่าของเซ็นเซอร์void delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms;while(timer_on);}// หน่วงเวลาสำหรับเวลาที่ระบุในหน่วย ms และตรวจสอบวินาที IR detectorvoid delayAndCheckIR (uint16_t time_ms){uint8_t timer_val = 0;inRange = 0;timer_on = 1;timer_cnt = time_ms;while (timer_on) {if (!(timer_val == timer_cnt)) {inRange + = IRDetected;timer_val = timer_cnt;}}inRange = (inRange>=(time_ms>>1));}// หน่วงเวลาสำหรับเวลาที่ระบุในหน่วย ms และอัปเดตค่าของเซ็นเซอร์void delayAndUpdateSensors(uint16_t time_ms){uint8_t temp;timer_on = 1; timer_cnt = time_ms;while(timer_on){if(!sensors_flag){for(temp = 0; อุณหภูมิ Sen6Size; temp++)sensors[temp] = sensors_in[temp];// Update Running Totals of Distance and angledistance += (int)((sensors[SenDist1] 8) | sensors[SenDist0]);angle += (int)((เซ็นเซอร์) [SenAng1] 8) | เซ็นเซอร์[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}}// เริ่มต้นการควบคุมจิตใจ ATmega168 microcontrollervoid initialize(void){cli(); // ตั้งค่าพิน I/ODDRB = 0x10;PORTB = 0xCF;DDRC = 0x00;PORTC = 0xFF;DDRD = 0xE6;PORTD = 0x7D;// ตั้งค่าตัวจับเวลา 1 เพื่อสร้างการขัดจังหวะทุกๆ 1 msTCCR1A = 0x00;TCCR1B = (_BV (WGM12) | _BV(CS12));OCR1A = 71;TIMSK1 = _BV(OCIE1A);// ตั้งค่าพอร์ตอนุกรมด้วย rx interruptUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0)));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// เปิด interruptssei();}เป็นโมฆะ powerOnRobot(เป็นโมฆะ){// ถ้า Create&aposs ปิดอยู่ ให้เปิดขึ้นถ้า (!RobotIsOn){while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // หน่วงเวลาในสถานะนี้ RobotPwrToggleHigh; // การเปลี่ยนจากต่ำไปสูงเพื่อสลับ powerdelayMs(100); // หน่วงเวลาในสถานะ RobotPwrToggleLow;}delayMs(3500); // Delay for startup}}// เปลี่ยนอัตรา baud ทั้ง Create และ modulevoid baud(uint8_t baud_code){if(baud_code = 11){byteTx(CmdBaud);UCSR0A |= _BV(TXC0);byteTx(baud_code);/ / รอจนกว่าการส่งจะเสร็จสมบูรณ์ (!(UCSR0A & _BV(TXC0)));cli();// เปลี่ยนการลงทะเบียนอัตรารับส่งข้อมูล (baud_code == Baud115200)UBRR0 = Ubrr115200;else if(baud_code == Baud57600)UBRR0 = Ubrr57600;else if(baud_code == Baud38400)UBRR0 = Ubrr38400;else if(baud_code == Baud28800)UBRR0 = Ubrr28800;else if(baud_code == Baud19200)UBRR0 = Ubrr19200;else if(baud_code == Baud14400)UBRR0;elsebrr14 if(baud_code == Baud9600)UBRR0 = Ubrr9600;else if(baud_code == Baud4800)UBRR0 = Ubrr4800;else if(baud_code == Baud2400)UBRR0 = Ubrr2400;else if(baud_code == Baud1200)UBRR0 = Ubrr1200;ถ้า baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}}// ส่งสร้างคำสั่งไดรฟ์ในแง่ของความเร็วและรัศมีไดรฟ์ (int16_t ความเร็ว, int16_t รัศมี){byteTx(CmdDrive);byteTx((uint 8_t)((ความเร็ว >> 8) & 0x00FF));byteTx((uint8_t)(ความเร็ว & 0x00FF));byteTx((uint8_t)((รัศมี >> 8) & 0x00FF));byteTx((uint8_t)(รัศมี & 0x00FF));}
แนะนำ:
วิธีทำ LED Cube - LED Cube 4x4x4: 3 ขั้นตอน
วิธีทำ LED Cube | LED Cube 4x4x4: LED Cube ถือได้ว่าเป็นหน้าจอ LED ซึ่ง LED ขนาด 5 มม. แบบธรรมดาจะทำหน้าที่เป็นพิกเซลดิจิทัล ลูกบาศก์ LED ช่วยให้เราสามารถสร้างภาพและรูปแบบโดยใช้แนวคิดของปรากฏการณ์ทางแสงที่เรียกว่าการคงอยู่ของการมองเห็น (POV) ดังนั้น,
วิธีทำ PCB แบบมืออาชีพ (คุ้มไหม): 5 ขั้นตอน
วิธีสร้าง PCB แบบมืออาชีพ (คุ้มค่าไหม): ฉันต้องการแบ่งปัน "ประสบการณ์ PCB" กับคุณ
วิธีทำ Spring Vibration Sensor ที่บ้าน!: 5 ขั้นตอน (พร้อมรูปภาพ)
วิธีทำ Spring Vibration Sensor ที่บ้าน!: ฉันกำลังทำงานในโปรเจ็กต์ใหม่ที่เกี่ยวข้องกับเซ็นเซอร์ Spring Vibration หรือที่รู้จักว่า "คนจน" มาตรความเร่ง/เซ็นเซอร์ตรวจจับความเคลื่อนไหว! สวิตช์การสั่นสะเทือนแบบสปริงเหล่านี้เป็นสวิตช์ทริกเกอร์การกระตุ้นด้วยการสั่นสะเทือนที่ไม่ใช่ทิศทางที่มีความไวสูง ด้านในเป็น
วิธีทำ Secret Communicator โดยใช้ Micro Bit: 9 ขั้นตอน
วิธีสร้างผู้สื่อสารลับโดยใช้ Micro Bit: ฉันได้รับแรงบันดาลใจจาก 'othermachines' you tube chanal.here สิ่งที่ฉันได้รับจากมัน -https://youtu.be/mqlMo4LbfKQนี่คือสิ่งที่ฉันเพิ่มในตัวฉัน - จอแสดงผล LCD- ปุ่มกด สำหรับไมโครบิตอื่น ๆ- ธนาคารพลังงาน - รหัสเพิ่มเติมสำหรับมัน
วิธีทำ Power Bank 4500 mAh ราคาถูกมาก: 3 ขั้นตอน
วิธีสร้าง Power Bank 4500 MAh ราคาถูกมาก: เมื่อฉันค้นหาร้านค้าสำหรับธนาคารพลังงาน ราคาถูกที่สุดที่ฉันสามารถหาได้ไม่น่าเชื่อถือเสมอไป ดังนั้นในคำแนะนำนี้ฉันจะแสดงวิธีสร้างธนาคารพลังงานราคาถูกมาก