Kostenlose technische Bibliothek ENZYKLOPÄDIE DER FUNKELEKTRONIK UND ELEKTROTECHNIK Einfacher Roboter. Enzyklopädie der Funkelektronik und Elektrotechnik Lexikon der Funkelektronik und Elektrotechnik / Funksteuerungsausrüstung Dieser Artikel präsentiert ein Diagramm eines einfachen „Roboters“. Es geht ans Licht, und wenn keine Lichtquelle vorhanden ist, wird der Modus „Freie Suche“ aktiviert, d.h. Der Roboter fährt und fährt im Falle einer Kollision weg und dreht sich um. Das Herzstück des Roboters ist ein Mikrocontroller von ATMEL: AT90S2313, Sie können aber auch jeden anderen dieser Firma verwenden. Dieser Mikrocontroller verfügt über 2 KB Programmspeicher, 15 I/O-Ports und eine verfügbare Spannung von 4 bis 6 V. Die Motoren werden von einem „Motortreiber“ gesteuert – der Mikroschaltung L293D (inländisches Analogon – KR1128KT4A). Es wurde beschlossen, SF3-1-Fotowiderstände als Sensor zu verwenden. Der Roboter besteht aus zwei Motoren. So funktionieren sie für bestimmte Aktionen:
Verwendete Funkelemente in der Schaltung: Mikrocontroller AT90S2313 Mikroschaltung L293D (inländisches Analogon - KR1128KT4A) 2 Fotowiderstand SF3-1 Quarz bei 4MHz Kondensatoren 22-24pF Stabilisator 7805 (oder KREN5A) 100-Ohm-Widerstand (optional) Zwei Motoren Power Vbat - 4 AA-Batterien oder 1 Krone (9 V) Stromversorgung Vm - 1 Krone (9V) Nach dem Zusammenbau der Schaltung müssen Sie das Programm auf den Mikrocontroller herunterladen und der Roboter ist bereit: /**************************************************** **** *** Chiptyp: AT90S2313 Taktfrequenz: 4,000000 MHz Speichermodell: Winzig Externe SRAM-Größe: 0 Datenstapelgröße: 32 ****************************************************** ***** **/#include <90s2313.h> #einschließen #enthalten // Zuweisung von Definitionen für die bequeme Arbeit mit Peripheriegeräten #OUT PORTB definieren #define MOTOR_F 7 #define MOTOR_B 6 #define TURN_R 5 #define TURN_L 4 #definiere IN PIND #define LIGHT_R 0 #define LIGHT_L 1 #define BUMPER_F 2 #define BUMPER_B 3 // Mögliche Fahrmodi Aufzählung {STOP, F, FR, FL, B, BR, BL}; // ------------------------------------------------ ------------------------------ // Verzögerung t x 10 ms // ------------------------------------------------ ------------------------------ void Delay_10ms (unsigned char t) {char ich; für(i=0;i // Wahrscheinlichkeitstabelle für die Wahl der Bewegungsrichtung // basierend auf der aktuellen Bewegungsrichtung unsigned char p[7][7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100}; // aktuelle Bewegungsrichtung unsigned char this_move; // ------------------------------------------------ ------------------------------ // Schalten Sie die Kombination von Motoren für die Bewegung in eine bestimmte Richtung ein // ------------------------------------------------ ------------------------------ void go(unsigned char Direction){ Schalter (Richtung) { Fall STOP: AUS.MOTOR_F=0; AUS.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; Fall F: AUS.MOTOR_F=1; AUS.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; Fall FR: AUS.MOTOR_F=1; AUS.MOTOR_B=0; OUT.TURN_R=1; OUT.TURN_L=0; break; Fall FL: AUS.MOTOR_F=1; AUS.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=1; break; Fall B: AUS.MOTOR_F=0; AUS.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=0; break; Fall BR: AUS.MOTOR_F=0; AUS.MOTOR_B=1; OUT.TURN_R=1; OUT.TURN_L=0; break; Fall BL: AUS.MOTOR_F=0; AUS.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=1; break; } } // ------------------------------------------------ ------------------------------ // Auswahl der Bewegungsrichtung im nächsten Schritt gemäß Wahrscheinlichkeitstabelle // ------------------------------------------------ ------------------------------ unsigned char next_move(void){ unsigned charpp, i; pp = rand()/327; // eine Zufallszahl 0..99 erhalten for (i=0;i<7;i++){ // Suche nach einer Übereinstimmung in der Wahrscheinlichkeitstabelle if (p[this_move][i] > pp) break; } this_move = i; // die neu empfangene Richtung als aktuelle aufzeichnen Rückkehr(i); } // ------------------------------------------------ ------------------------------ // Umgang mit vorderem Stoßfänger-Interrupt (INT0 = PD2) // ------------------------------------------------ ------------------------------ Unterbrechung [EXT_INT0] void ext_int0_isr(void) { if(this_move==FR) go(BL); if(this_move==FL) go(BR); sonst gehen (B); Verzögerung_10 ms (250); // Abfahrt innerhalb von 2.5 x 2 Sekunden Verzögerung_10 ms (250); this_move=B; } // ------------------------------------------------ ------------------------------ // Behandlung des Interrupts für die hintere Stoßstange (INT1 = PD3) // ------------------------------------------------ ------------------------------ Unterbrechung [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) go(FL); if(this_move==BL) go(FR); Sonst geh(F); Verzögerung_10 ms (250); // Abfahrt innerhalb von 2.5 x 2 Sekunden Verzögerung_10 ms (250); this_move=F; } // ------------------------------------------------ ------------------------------ // "Zielloser Spaziergang" // ------------------------------------------------ ------------------------------ unsigned char walk(void){ // diese Schleife organisiert "free roam" while // kein Signal von einem der Lichtsensoren while((IN.LIGHT_R) && (IN.LIGHT_L)){ go(next_move()); // die nächste Bewegungsrichtung ermitteln und Verzögerung_10 ms (250); // 2.5 Sekunden lang in diese Richtung bewegen } // diese Schleife organisiert die Bewegung zum Licht während // Es gibt ein Signal von mindestens einem der Lichtsensoren while((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); sonst if(IN.LIGHT_R==0) go(FR); Sonst wenn (IN.LIGHT_L==0) gehe(FL); } Rückgabe (0); } // ------------------------------------------------ ------------------------------ // Hauptprogramm // ------------------------------------------------ ------------------------------ void main (void) { DDRB=0xff; // Weisen Sie alle Leitungen von Port B dem Ausgang zu PORTB = 0x00; // und setze sie niedrig DDRD=0x00; // Alle Leitungen von Port D dem Eingang zuweisen PORTD=0xff; // Interne Lastwiderstände anschließen // Initialisierung externer Interrupts // INT0: Ein // INT0-Modus: Fallende Flanke // INT1: Ein // INT1-Modus: Fallende Flanke GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // Interrupts aktivieren #asm("sei") // starte die Hauptschleife während (1) gehen (); } Laden Sie das Programm, die Firmware-Datei und das Roboterschema im sPlan-Format herunter Veröffentlichung: cxem.net Siehe andere Artikel Abschnitt Funksteuerungsausrüstung. Lesen und Schreiben nützlich Kommentare zu diesem Artikel. Neueste Nachrichten aus Wissenschaft und Technik, neue Elektronik: Energie aus dem Weltraum für Raumschiff
08.05.2024 Neue Methode zur Herstellung leistungsstarker Batterien
08.05.2024 Alkoholgehalt von warmem Bier
07.05.2024
Weitere interessante Neuigkeiten: ▪ ViewSonic VSD241 All-in-One mit NVIDIA Tegra 3 Prozessor ▪ Umweltfreundlicher Benzinmotor von Mazda ▪ Billionen Bilder pro Sekunde Kamera News-Feed von Wissenschaft und Technologie, neue Elektronik
Interessante Materialien der Freien Technischen Bibliothek: ▪ Abschnitt der Website Geschichten aus dem Leben von Funkamateuren. Artikelauswahl ▪ Artikel Klebeband. Geschichte der Erfindung und Produktion ▪ Artikel Was ist Sonnenaktivität? Ausführliche Antwort ▪ Artikel Muskeln aus der Luft. Wissenschaftliches Kinderlabor ▪ Artikel Stromregler auf Trinistor. Enzyklopädie der Funkelektronik und Elektrotechnik
Hinterlasse deinen Kommentar zu diesem Artikel: Alle Sprachen dieser Seite Startseite | Bibliothek | Artikel | Sitemap | Site-Überprüfungen www.diagramm.com.ua |