İçindekiler:

Robo-Belhop Nasıl Yapılır: 3 Adım
Robo-Belhop Nasıl Yapılır: 3 Adım

Video: Robo-Belhop Nasıl Yapılır: 3 Adım

Video: Robo-Belhop Nasıl Yapılır: 3 Adım
Video: "Қоф" сүресі - 1: "Таңғажайып дәрежелі - Құран!" | Арын Қажы Мешіті | Ұстаз Ерлан Ақатаев ᴴᴰ 2024, Kasım
Anonim

jeffreyfTakip eden yazar

iRobot Burs Yarat mini yarışmasına nasıl girilir
iRobot Burs Yarat mini yarışmasına nasıl girilir
iRobot Burs Yarat mini yarışmasına nasıl girilir
iRobot Burs Yarat mini yarışmasına nasıl girilir
Komik altyazılı LOLCats, Meme kedileri, Kedi makroları veya kedi resimleri nasıl yapılır
Komik altyazılı LOLCats, Meme kedileri, Kedi makroları veya kedi resimleri nasıl yapılır
Komik altyazılı LOLCats, Meme kedileri, Kedi makroları veya kedi resimleri nasıl yapılır
Komik altyazılı LOLCats, Meme kedileri, Kedi makroları veya kedi resimleri nasıl yapılır

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 indirin
Kaynak Kodu indirin

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: