İçindekiler:
Video: Robo-Belhop Nasıl Yapılır: 3 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:21
jeffreyfTakip eden yazar
Hakkında: Bir şeyleri parçalara ayırmayı ve nasıl çalıştıklarını çözmeyi seviyorum. Genelde bundan sonra ilgimi kaybederim. Jeffreyf Hakkında Daha Fazlası »
Bu Eğitilebilir Tablo, hareketli bir bellhop yapmak için iRobot Create'in nasıl kullanılacağını gösterir. Bu tamamen carolDancer'ın talimatlarının izniyle kaldırıldı ve bunu yarışmamız için örnek bir giriş olarak koydum. Robo-BellHop çantalarınızı, yiyeceklerinizi, çamaşırlarınızı vb. taşımak için kendi kişisel asistanınız olabilir, bu nedenle ile. Temel Create'in üstüne bir kutu takılır ve sahibinin IR vericisini takip etmek için iki yerleşik IR dedektörü kullanır. Çok basit C yazılım koduyla, kullanıcı ağır yiyecekleri, büyük miktarda çamaşırları veya gecelik çantanızı Robo-BellHop'a bağlayabilir ve robotun sizi caddede, alışveriş merkezinde, koridorda veya havaalanında takip etmesini sağlayabilir - - kullanıcının nereye gitmesi gerekiyorsa. Temel İşlem1) Komut modülünü açmak için Sıfırla düğmesine basın ve sensörlerin devreye girdiğini kontrol edin1a) IR vericisinin sizi takip ettiğini gördüğünde Oynatma LED'i yanmalı1b) İlerleme LED'i, robot çok yakın mesafede 2) Robo-BellHop rutinini çalıştırmak için siyah yumuşak düğmeye basın 3) IR vericisini ayak bileğine takın ve açık olduğundan emin olun. O halde sepeti doldur ve git!4) Robo-BellHop'un mantığı şu şekildedir:4a) Siz etrafta dolaşırken IR sinyali algılanıyorsa robot maksimum hızda hareket edecektir4b) IR sinyali sönerse (çok uzak veya çok keskin bir açıyla), sinyalin tekrar alınması durumunda robot kısa bir mesafeyi yavaş hızda kat edecektir4c) IR sinyali algılanmıyorsa, robot bir sinyali yeniden bulmaya çalışın4d) IR sinyali algılanıyorsa ancak robot bir engele çarparsa, robot engelin etrafından dolaşmaya çalışır4e) Robot IR sinyaline çok yaklaşırsa, robot IR sinyaline çarpmamak için duracaktır. sahibinin ayak bilekleriHardware1 iRobot sanal duvar ünitesi - RadioShack'ten 301 $ IR dedektörü - Radio Shack'ten 31 $ DB-9 erkek konektör - Home Depot'tan 44 $ 6-32 vida - 2.502 $ 3V piller, Target'tan D1 çamaşır sepetini kullandım - 51 $ ekstra tekerlek Robotun arkası oluşturElektrik bandı, tel ve lehim
Adım 1: IR Sensörünün Kapatılması
Create robotunun ön tarafındaki IR sensörünün küçük bir yarığı dışında tamamını kaplayacak şekilde elektrik bandı yapıştırın. Sanal duvar ünitesini sökün ve ünitenin önündeki küçük devre kartını çıkarın. Bu biraz zor çünkü çok sayıda gizli vida ve plastik bağlantı parçası var. IR vericisi devre kartı üzerindedir. IR yansımalarını önlemek için IR vericisini bir kağıt mendille örtün. Devre kartını, bileğinizi sarabilecek bir kayışa veya elastik bir banda takın. Pilleri devre kartına bağlayın ki pilleri rahat bir yerde bulundurabilesiniz (pilleri cebime koyabileyim diye yaptım).
2. IR dedektörünü DB-9 konektörüne bağlayın ve Cargo Bay ePort pin 3'e (sinyal) ve pin 5'e (toprak) takın. 2. IR dedektörünü Create'te mevcut IR sensörünün üstüne takın ve 2. IR dedektörü Create robotunun durdurmak için durmasını istediğiniz bir mesafede emitörü görene kadar birkaç kat kağıt mendille kaplayın. sana vurmaktan Bunu Sıfırla düğmesine bastıktan sonra test edebilir ve durma mesafesinde olduğunuzda İlerleme LED'inin yanmasını izleyebilirsiniz.
2. Adım: Sepeti Takın
6-32 vidayı kullanarak sepeti takın. Sepeti Oluştur robotunun üstüne monte ettim. Ayrıca, Create robotunun arkasına ağırlık vermek için arka tekerleği kaydırın.
Notlar: - Robot, en az 30 libre olmak üzere oldukça fazla yük taşıyabilir. - Küçük boyut, herhangi bir bagajı taşımanın en zor kısmı gibi görünüyordu - IR çok huysuz. Belki görüntülemeyi kullanmak daha iyidir ama çok daha pahalıdır
Adım 3: Kaynak Kodunu İndirin
Kaynak kodu takip eder ve bir metin dosyasına eklenir:
/******************************************************** ******************** takip.c ** -------- ** Komut Modülü Oluştur üzerinde çalışır ** ön taraftaki küçük açıklıklar hariç tümünü kapsar ** Create sanal bir duvarı (veya ** kuvvet alanı sinyali gönderen herhangi bir IR'yi) takip edecek ve umarım süreçteki engellerden kaçınacaktır ******************** ************************************************************ **/#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 SearchSolAçı 125#define SearchRightAngle (AramaSolAçı - 1000)#define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRAlgılandı (~PINB & 0x01)//states#define Hazır 0#Takip Ediliyor 1#Takip Ediliyor 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8// Genel değişkenlerv olatile uint16_t timer_cnt = 0;volatile uint8_t timer_on = 0;volatile uint8_t sensor_flag = 0;volatile uint8_t sensor_index = 0;volatile uint8_t sensor_in[Sen6Size];volatile uint8_t sensörler_t; volatile uint8_t inRange = 0;// Functionsvoid byteTx(uint8_t value);void delayMs(uint16_t time_ms);void delayAndCheckIR(uint16_t time_ms);void delayAndUpdateSensors(unsigned int time_ms);void initialoide(void);void initialoide(void);void baud(uint8_t baud_code);void sürücü(int16_t hız, int16_t yarıçap);uint16_t randomAngle(void);void defineSongs(void);int ana (void){//durum değişkeniuint8_t durum = Hazır;int bulundu = 0;int wait_counter = 0;// Create and moduleinitialize();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// ikinci IR sensörü için i/o ayarlaDDRB &= ~0x01; //kargo bölmesi ePort pin 3'ü bir inputPORTB olarak ayarlayın |= 0x01; //kargo ePort pin3 pullup'ı etkinleştir// program loopwhile(TRUE){// Sadece bir önlem olarak durdur(0, RadStraight);// LEDsbyteTx(CmdLeds);byteTx(((sensörler[SenVWall])?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;//kullanıcı düğmesini arıyor, sık sık kontrol edindelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(UserButtonPressed)&&(!sensors[SenCliffL])&&(!sensors[SenCliffFL])&&(!sensors[SenCliffFR])&&(! sensörler[SenCliffR])) {byteTx(CmdLeds);byteTx(((sensörler[SenVWall])?LEDPlay:0x00) | (Range?LEDAdvance:0x00));byteTx(sensörler[SenCharge1]);byteTx(255);IRDetected ?LED2On:LED2Off;inRange?LED1On:LED1Off;switch(durum) {case Ready:if(sensörler[SenVWall]) {//liderif(inRange) {drive(0, RadStraight);} else {// düz sürüş (SlowSpeed, RadStraight);durum = Takip;}} else {//hüzme açısı için arama = 0;mesafe = 0;wait_counter = 0;bulunan = YANLIŞ;drive(SearchSpeed, RadCCW);durum = SearchingLeft;}break;durum Aşağıdaki:if(sensors[SenBumpDrop] & BumpRight) {mesafe = 0;açı = 0;drive(-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {mesafe = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if(sensors[SenVWall]) {//kontrol edin lidere yakınlık(inRange) {drive(0, RadStraight);state = Ready;} else {//drive düz sürücü(FullSpeed, RadStraight);state = Follow;}} başka {//sinyal kaybetti, yavaş devam edin bir cycledistance = 0;drive(SlowSpeed, RadStraight);state = WasFollowing;}break;case WasFollowing:if(sensörler[SenBumpDrop] & BumpRight) {mesafe = 0;açı = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//liderif'e yakınlığı kontrol edin (inRange) {drive(0, RadStraight);durum = R eady;} else {//drive düz yol(FullSpeed, RadStraight);durum = Takip;}} else if (mesafe >= CoastDistance) {drive(0, RadStraight);durum = Hazır;} else {drive(SlowSpeed, RadStraight);}break;case SearchingLeft:if(bulundu) {if (angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);state = Follow;} else {drive(SearchSpeed, RadCCW);}} else if (sensörler[SenVWall]) {found = TRUE;angle = 0;if (inRange) {drive(0, RadStraight);state = Ready;} else {drive(SearchSpeed, RadCCW);}} else if (açı >= SearchLeftAngle) {drive(SearchSpeed), RadCW);wait_counter = 0;state = SearchingRight;} else {drive(SearchSpeed, RadCCW);}break;case SearchingRight:if(bulundu) {if (-angle >= ExtraAngle) {drive(SlowSpeed, RadStraight);durum = Takip ediliyor;} else {drive(SearchSpeed, RadCW);}} else if (sensörler[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 (açı = Ara RightAngle) {drive(0, RadStraight);wait_counter = 5000;angle = 0;} else {drive(SearchSpeed, RadCW);}break;case TracingLeft:if(sensörler[SenBumpDrop] & BumpRight) {mesafe = 0;açı = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (sensörler[SenVWall]) {//check liderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive düz sürücü(SlowSpeed, RadStraight);state = Follow;}} else if (!(mesafe >= TraceDistance)) { drive(SlowSpeed, RadStraight);} else if (!(-angle >= TraceAngle)) {drive(SearchSpeed, RadCW);} else {mesafe = 0;açı = 0;drive(SlowSpeed, RadStraight);durum = Hazır; }break;case TracingRight:if(sensors[SenBumpDrop] & BumpRight) {drive(0, RadStraight);state=Ready;} else if(sensors[SenBumpDrop] & BumpLeft) {mesafe = 0;açı = 0;sürücü(- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//liderif(inRang)'a yakınlığı kontrol edin e) {drive(0, RadStraight);durum = Hazır;} başka {//sürücü düz sürücü(SlowSpeed, RadStraight);durum = Takip ediliyor;}} else if (!(mesafe >= TraceDistance)) {drive(SlowSpeed, RadStraight));} else if (!(angle >= TraceAngle)) {drive(SearchSpeed, RadCCW);} else {mesafe = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready;}break;case BackingTraceLeft: if (sensors[SenVWall] && inRange) {drive(0, RadStraight);state = Ready;} else if (angle >=TraceAngle) {mesafe = 0;angle = 0;drive(SlowSpeed, RadStraight);state = TracingLeft; } else if (-distance >= BackDistance) {drive (SearchSpeed, RadCCW);} else {drive(-SlowSpeed, RadStraight);}break;case BackingTraceRight:if (sensörler[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);durum = Yeniden ady;break;}delayAndCheckIR(10);delayAndUpdateSensors(10);}//cliff veya kullanıcı düğmesi algılandı, koşulun stabilize olmasına izin verin (örneğin, düğmenin serbest bırakılması)drive(0, RadStraight);delayAndUpdateSensors(2000);}}} // Sensör değerlerini saklamak için seri alma kesmesiSIGNAL(SIG_USART_RECV){uint8_t temp;temp = UDR0;if(sensors_flag){sensors_in[sensors_index++] = temp;if(sensors_index >= Sen6Size)sensors_flag = 0;}}// Zamanlayıcı msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsemer_on = 0;}// seri portvoid üzerinden bir bayt iletin byteTx(uint8_t value){while(!(UCSR0A & _BV(UDRE0))); UDR0 = value;}// Sensör değerlerini güncellemeden ms cinsinden belirtilen süre için gecikme void delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms;while(timer_on);}// ms cinsinden belirtilen süre için gecikme ve saniyeyi kontrol edin IR dedektörüvoid 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 cinsinden belirtilen süre için gecikme ve sensör değerlerini güncelleme 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; sıcaklık Sen6Size; temp++)sensors[temp] = sensor_in[temp];// Mesafe ve angledistance'ın çalışma toplamlarını güncelleyin += (int)((sensors[SenDist1] 8) | sensor[SenDist0]);angle += (int)((sensörler [SenAng1] 8) |ensors[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}}// Zihin Kontrolü'nü başlat ATmega168 microcontrollervoid initialize(void){cli(); // G/Ç pinlerini ayarlayınDDRB = 0x10;PORTB = 0xCF;DDRC = 0x00;PORTC = 0xFF;DDRD = 0xE6;PORTD = 0x7D;// Zamanlayıcı 1'i her 1 ms'de bir kesme oluşturmak için ayarlayınTCCR1A = 0x00;TCCR1B = (_BV (WGM12) | _BV(CS12));OCR1A = 71;TIMSK1 = _BV(OCIE1A);// seri bağlantı noktasını rx interrupt ile ayarlayınUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// Kesintileri açın();}void powerOnRobot(void){// Create' gücü kapalıysa, onu açınif(!RobotIsOn){while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // Bu durumda gecikmeRobotPwrToggleHigh; // powerdelayMs(100) arasında geçiş yapmak için düşükten yükseğe geçiş; // Bu durumda gecikmeRobotPwrToggleLow;}delayMs(3500); // Başlatma için gecikme}}// Hem Create hem de modulevoid baud(uint8_t baud_code){if(baud_code = 11){byteTx(CmdBaud);UCSR0A |= _BV(TXC0);byteTx(baud_code);/ / İletim tamamlanana kadar bekleyinwhile(!(UCSR0A & _BV(TXC0)));cli();// Baud hızı kaydını değiştirif(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 = Ubrr28800;else 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;else if(baud_code == Baud2400) baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}}// Gönder Hız ve radiusvoid açısından sürücü komutları oluşturun sürücü(int16_t hız, int16_t yarıçap){byteTx(CmdDrive);byteTx((uint 8_t)((hız >> 8) & 0x00FF));byteTx((uint8_t)(hız ve 0x00FF));byteTx((uint8_t)((yarıçap >> 8) & 0x00FF));byteTx((uint8_t)(yarıçap) & 0x00FF));}
Önerilen:
Kablosuz Teneke Telefon Nasıl Yapılır! (Arduino Walkie Talkie): 7 Adım (Resimli)
Kablosuz Teneke Telefon Nasıl Yapılır! (Arduino Walkie Talkie): Daha geçen gün çok önemli bir telefon görüşmesinin ortasındaydım ve banana telefonum çalışmayı durdurdu! Çok sinirliydim. O aptal telefon yüzünden son kez bir aramayı kaçırdım! (Geriye dönüp baktığımda, biraz fazla kızmış olabilirim
Adım Sayacı Nasıl Yapılır?: 3 Adım (Resimlerle)
Adım Sayacı Nasıl Yapılır?: Yürümek, koşmak, bisiklete binmek, badminton oynamak gibi birçok sporda iyi performans gösterirdim. Binmeyi çok uzun zaman önce dolaşmak için seviyorum. Pekala, iri göbeğime bakın……Her neyse, egzersize yeniden başlamaya karar verdim. Hangi ekipmanı hazırlamalıyım?
Dünyanın En Küçük Çizgi İzleyen Robotu Nasıl Yapılır (robo Rizeh): 7 Adım (Resimlerle)
Dünyanın En Küçük Çizgi İzleyen Robotu (robo Rizeh) Nasıl Yapılır: Dünyanın en küçük çizgi izleyen robotu (vibrobot) nasıl yapılır "roboRizeh"; ağırlık: 5gr boyut: 19x16x10 mm tarafından: Naghi Sotoudeh "Rizeh" kelimesi; "küçük" anlamına gelen farsça bir kelimedir. Rizeh, titreşim tabanlı çok küçük bir ro
Büyükanne ve Büyükbaba Takvimi Nasıl Yapılır? Karalama Defteri (Karalama Defteri Nasıl Yapılacağını Bilmiyorsanız Bile): 8 Adım (Resimlerle)
Büyükanne ve Büyükbaba Takvimi Nasıl Yapılır? Scrapbook (Scrapbook Nasıl Yapılacağını Bilmiyorsanız): Bu, büyükanne ve büyükbabalar için çok ekonomik (ve çok takdir edilen!) bir tatil hediyesi. Bu yıl her biri 7 dolardan daha ucuza 5 takvim yaptım. Malzemeler: Çocuğunuzun, çocuklarınızın, yeğenlerinizin, yeğenlerinizin, köpeklerinizin, kedilerinizin veya diğer akrabalarınızın 12 harika fotoğrafı 12 farklı parça
Bir Gitar Hoparlör Kutusu Nasıl Yapılır veya Stereonuz İçin İki Adet Nasıl Yapılır: 17 Adım (Resimlerle)
Bir Gitar Hoparlör Kutusu Nasıl Yapılır veya Stereonuz için İki Adet Yapın.: Yaptığım tüp amfi ile birlikte yeni bir gitar hoparlörü istedim. Hoparlör dükkânımda kalacak, bu yüzden çok özel bir şey olmasına gerek yok. Tolex kaplama çok kolay zarar görebilir, bu yüzden hafif bir kumdan sonra dışarıdaki siyahı püskürttüm