Sisällysluettelo:
Video: Robo-Bellhopin tekeminen: 3 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:03
Seuraa lisää tekijältä:
Tietoja: Tykkään purkaa asioita ja selvittää, miten ne toimivat. Yleensä menetän kiinnostukseni sen jälkeen. Lisätietoja jeffreyfistä »
Tämä opas näyttää, kuinka iRobot Create -toiminnon avulla luodaan liikkuva kello. Tämä poistettiin kokonaan carolDancerin ohjeiden luvalla, ja laitoin sen esimerkkikilpailuksi kilpailuumme. Robo-BellHop voi olla oma henkilökohtainen avustajasi kantamaan laukkuja, päivittäistavaroita, pyykkiä jne., Joten sinulla ei ole kohteeseen. Basic Create -laitteen yläosassa on roska-astia, ja se käyttää kahta sisäistä IR-tunnistinta omistajansa IR-lähettimen seuraamiseen. Hyvin yksinkertaisella C -ohjelmistokoodilla käyttäjä voi turvata raskaat ruokaostokset, suuren pyykkipaketin tai yöpussin Robo -BellHopille ja saada robotin seuraamaan sinua kadulla, ostoskeskuksen, käytävän tai lentokentän läpi - - mihin tahansa käyttäjän täytyy mennä. robotti on hyvin lähellä2) Paina mustaa pehmeää painiketta Robo-BellHop-rutiinin suorittamiseksi3) Kiinnitä infrapunalähetin nilkaan ja varmista, että se on päällä. Lataa sitten kori ja mene! 4) Robo-BellHopin logiikka on seuraava: 4a) Kun kävelet ympäri, jos IR-signaali havaitaan, robotti ajaa suurimmalla nopeudella4b) Jos IR-signaali sammuu (liian kaukana tai liian terävässä kulmassa) robotti kulkee lyhyen matkan hitaalla nopeudella, jos signaali otetaan uudelleen vastaan4c) Jos IR -signaalia ei havaita, robotti kääntyy vasemmalle ja oikealle yrittää löytää signaalin uudelleen Laitteisto1 iRobot -virtuaalinen seinäyksikkö - 301 dollarin IR -ilmaisin RadioShackilta - 31 dollaria DB -9 -urosliitin Radio Shackilta - 44 dollaria 6-32 ruuvia Home Depotilta - 2,502 dollarin 3V -paristot, käytin Targetin D1 -pyykkikoria - 51 dollaria lisäpyörää takana Luo robotti Sähköinen nauha, lanka ja juote
Vaihe 1: IR -anturin peittäminen
Kiinnitä sähköteippi peittämään kaikki muut paitsi pieni IR -anturin rako Create -robotin etupuolella. Pura virtuaalinen seinäyksikkö ja irrota pieni piirilevy yksikön etuosasta. Tämä on hieman hankalaa, koska siellä on paljon piilotettuja ruuveja ja muovikiinnikkeitä. IR -lähetin on piirilevyllä. Peitä infrapunalähetin pehmopaperilla, jotta vältetään infrapunaheijastukset. Kiinnitä piirilevy hihnaan tai kuminauhaan, joka voi kiertyä nilkan ympärille. Kytke paristot piirilevyyn, jotta saat akut mukavalle paikalle (tein sen niin, että voisin laittaa paristot taskuun).
Kytke toinen IR-ilmaisin DB-9-liittimeen ja työnnä Cargo Bay ePort -tappiin 3 (signaali) ja nasta 5 (maa). Kiinnitä toinen infrapunatunnistin luodun olemassa olevan IR -anturin yläosaan ja peitä se muutamalla pehmopaperikerroksella, kunnes toinen IR -ilmaisin ei näe lähetintä etäisyydellä, jonka haluat Luo robotin pysähtyvän lyömästä sinua. Voit testata tämän sen jälkeen, kun olet painanut Palauta -painiketta, ja katsoa, että Edistynyt LED -valo syttyy, kun olet pysähdysmatkalla.
Vaihe 2: Kiinnitä kori
Kiinnitä kori 6-32 ruuvilla. Asensin korin juuri Create -robotin yläosaan. Liu'uta myös takapyörää sisään, jotta voit painaa Create -robotin takapuolelle.
Huomautuksia: - Robotti voi kantaa melko vähän, vähintään 30 kg. - Pieni koko näytti olevan vaikeinta saada matkatavarat mukaan - IR on erittäin temperamenttinen. Ehkä kuvantaminen on parempi, mutta se on paljon kalliimpaa
Vaihe 3: Lataa lähdekoodi
Lähdekoodi seuraa ja on liitetty tekstitiedostoon:
/************************************************* ******************** follow.c ** -------- ** toimii Luo komentomoduuli ** peitä kaikki paitsi pieni aukko edessä infrapuna-anturista ** Luo seuraa virtuaalista seinää (tai mitä tahansa infrapunaa, joka lähettää ** voimakentän signaalin) ja toivottavasti välttää esteitä prosessissa ***************** ************************************************** **/#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 SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRDetected (~ PINB & 0x01) // tilat#define Ready 0#define Seurataan 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Global variablesv haihtuva uint16_t timer_cnt = 0; haihtuva uint8_t timer_on = 0; haihtuva uint8_t anturit_lippu = 0; haihtuvat uint8_t anturit_indeksi = 0; haihtuvat uint8_t anturit_in [Sen6Size]; haihtuvat uint8_t anturit [Sen6Size 0t; = haihtuvat volatile uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t -arvo); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void void; void void; void baud (uint8_t baud_code); void -asema (int16_t -nopeus, int16_t -säde); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Valmis; int löytynyt = 0; int odotuslaskuri = 0; // Määritä Luo ja moduuli aloittaa (); LEDBothOff; powerOnRobot (); tavuTx (CmdStart); baud (Baud28800); tavuTx (CmdControl); tavuTx (CmdFull); // aseta i/o toiselle IR -anturilleDDRB & = ~ 0x01; // aseta rahtitilan ePort -nasta 3 tuloksiPORTB | = 0x01; // aseta lastin ePort -pin3 -pullup -toiminto käyttöön // ohjelmointisilmukka (TRUE) {// Pysäytä varotoimena ajaa (0, RadStraight); // asettaa LEDsbyteTx (CmdLeds); byteTx ((((anturit [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (anturit [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // etsii käyttäjäpainiketta, tarkista oftendelayAndUpdateSensors (10); delay (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // aktiivinen silmukka (! (UserButtonPressed) && (! Sensorit [SenCliffL]) && (! Anturit [SenCliffFL]) && (! Anturit [SenCliffFR]) && (! anturit [SenCliffR])) {byteTx (CmdLeds); byteTx (((anturit [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (anturit [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; kytkin (tila) {case Ready: if (anturit [SenVWall]) {// tarkista, onko lähellä Leadif (inRange) {drive (0, RadStraight);} else {// aja suoraa (SlowSpeed, RadStraight); state = seuraavat;}} else {// hae sädekulma = 0; etäisyys = 0; odota_laskuri = 0; löytynyt = EPÄTOSI; asema (SearchSpeed, RadCCW); state = SearchingLeft;} tauko; tapaus Seuraa: if (anturit [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (anturit [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (anturit [SenVWall]) {// tarkista proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// juuri menettänyt signaalin, jatka hitaasti yksi cycledistance = 0; asema (SlowSpeed, RadStraight); state = WasFollowing;} tauko; case WasFollowing: if (anturit [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (anturit [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (anturit [SenVWall]) {// tarkista, onko lähellä Leadifia (inRange) {asema (0, RadStraight); tila = R eady;} else {// aja suoraa (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} tauko; tapaus SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = following;} else {drive (SearchSpeed, RadCCW);}} else if (anturit [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 = Seurataan;} else {asema (SearchSpeed, RadCW);}} else if (anturit [SenVWall]) {found = TRUE; kulma = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {asema (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} else if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (anturit [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; asema (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (anturit [SenBumpDrop] & BumpLeft) {asema (0, RadStraight); tila = Valmis;} else if (anturit [SenVWall]) {// tarkista läheisyydelle leaderif (inRange) {asema (0, RadStraight); state = Ready;} else {// aja suoraa (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { asema (hidas nopeus, RadStraight);} else if (! (-kulma> = TraceAngle)) {asema (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } tauko; tapaus TracingRight: if (anturit [SenBumpDrop] & BumpRight) {asema (0, RadStraight); tila = Valmis;} muu jos (anturit [SenBumpDrop] & BumpLeft) {etäisyys = 0; kulma = 0; asema (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (anturit [SenVWall]) {// tarkista, onko lähellä Leadif (inRang e) {asema (0, RadStraight); tila = valmis;} else {// aja suoraa (SlowSpeed, RadStraight); state = seuraavat;}} 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 (anturit [SenVWall] && inRange) {asema (0, RadStraight); tila = valmis;} muu jos (kulma> = TraceAngle) {etäisyys = 0; kulma = 0; asema (hidas nopeus, radStraight); tila = jäljitysvasen; } else if (-distance> = BackDistance) {asema (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (anturit [SenVWall] && inRange) {asema (0, RadStraight); tila = Valmis;} 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);} // kallio tai käyttäjäpainike havaittu, anna tilan vakautua (esim. vapautettava painike) asema (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sarjavastaanoton keskeytys anturiarvojen tallentamiseksi SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Ajastimen 1 keskeytys aikaviiveisiin msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Lähetä tavu sarjaportin kautta portvoid byteTx (uint8_t-arvo) {while (! (UCSR0A & _BV (UDRE0))) UDR0 = arvo;} // Viive määrätyn ajan ms: ssa ilman, että anturin arvoja päivitetään, viiveetön viive IR -ilmaisin välttää viiveenAndCheckIR (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));} // Viive määrätyn ajan ms: ssa ja päivitä anturin arvotvoid delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; lämpötila Sen6Size; temp ++) anturit [temp] = sensors_in [temp]; // Päivitä etäisyyden ja kulmaetäisyyden juoksevat summat += (int) ((anturit [SenDist1] 8) | anturit [SenDist0]); kulma += (int) ((anturit [SenAng1] 8) | anturit [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Alusta mielenhallinta & aposs ATmega168 -mikrokontrollerivälinealusta (void) {cli (); // Aseta I/O -nastatDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Aseta ajastin 1 niin, että se muodostaa keskeytyksen 1 ms väleinTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Määritä sarjaportti rx -keskeytykselläUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Ota keskeytykset käyttöön ();} void powerOnRobot (void) {// Jos Luo & aposs -virta on pois päältä, kytke se päälle, jos (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Viive tässä tilassaRobotPwrToggleHigh; // Matalasta korkeaan siirtyminen vaihtamaan powerdelayMs (100); // Viive tässä tilassaRobotPwrToggleLow;} delayMs (3500); // Käynnistyksen viive}} // Vaihda siirtonopeus sekä Luo- että moduulivapaa baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Odota, kunnes lähetys on valmis (! (UCSR0A & _BV (TXC0))); cli (); // Vaihda siirtonopeusregisterif (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 == BaR14400) 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) if UBR0; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} Lähetä säde) {tavuTx (CmdDrive); tavuTx ((uint 8_t) ((nopeus >> 8) & 0x00FF)); tavuTx ((uint8_t) (nopeus & 0x00FF)); tavuTx ((uint8_t) ((säde >> 8) & 0x00FF)); tavuTx ((uint8_t) (säde & 0x00FF));}
Suositeltava:
Lineaarisen toimilaitteen tekeminen: 3 vaihetta
Lineaarisen toimilaitteen tekeminen: Lineaariset toimilaitteet ovat koneita, jotka muuttavat pyörimisen tai minkä tahansa liikkeen työntö- tai vetoliikkeeksi
Oman tekeminen (saha) Kaksinkertainen LED -himmennin: 4 vaihetta
Oman (Seesaw) kaksois-LED-himmentimen tekeminen: Tänään näytän sinulle, kuinka tehdä kaksois-LED-himmennin, jossa on vain 555-ajastinsirut ja tavalliset komponentit. tai N-kanava), joka säätää LED-valon kirkkautta, tämä käyttää kahta MOS
LED -äänispektrianalysaattorin tekeminen: 7 vaihetta (kuvilla)
LED -äänispektrin analysaattorin tekeminen: LED -äänispektrin analysaattori luo kauniin valaistuskuvion musiikin voimakkuuden mukaan. Markkinoilla on paljon DIY LED -musiikkispektrisarjoja, mutta tässä aiomme tehdä LED -äänispektrin NeoPixe -analysaattori
Yksinkertaisen Nintendo LABO -tavoiteharjoituksen tekeminen: 13 vaihetta
Yksinkertaisen Nintendo LABO -tavoiteharjoituksen tekeminen: Sisareni ja minä ostimme äskettäin Nintendo Switchin. Joten tietysti meillä on joitain pelejä sen kanssa. Ja yksi niistä oli Nintendo LABO Variety Kit. Lopulta törmäsin Toy-Con Garageen. Kokeilin joitain asioita, ja silloin
Bluetooth -sovittimen tekeminen Pt.2 (yhteensopivan kaiuttimen tekeminen): 16 vaihetta
Bluetooth -sovittimen tekeminen Pt.2 (yhteensopivan kaiuttimen tekeminen): Tässä ohjeessa näytän sinulle, kuinka voin käyttää Bluetooth -sovitinta tehdäkseni vanhan kaiuttimen Bluetooth -yhteensopivaksi.*Jos et ole lukenut ensimmäistä ohjeeni " Bluetooth -sovitin " Ehdotan, että teet niin ennen kuin jatkat. C