ENCICLOPEDIA DELLA RADIOELETTRONICA ED ELETTRICA Robot semplice. Enciclopedia dell'elettronica radio e dell'ingegneria elettrica Enciclopedia della radioelettronica e dell'elettrotecnica / Apparecchiatura di radiocomando Questo articolo presenta uno schema di un semplice "robot". Va alla luce e, se non c'è fonte di luce, viene attivata la modalità "Ricerca libera", ad es. il robot guiderà e, in caso di collisione, si allontanerà e si girerà. Il cuore del robot è un microcontrollore ATMEL: AT90S2313, ma puoi usare qualsiasi altro di questa azienda, questo microcontrollore ha 2kb di memoria per il programma, 15 porte di ingresso / uscita, alimentazione disponibile - 4-6V. I motori saranno controllati da un "macchinista" - un microcircuito L293D (l'analogo domestico è KR1128KT4A). Come sensore, si è deciso di prendere le fotoresistenze SF3-1. Il robot è composto da due motori. Ecco come funzioneranno per determinate azioni:
Elementi radio utilizzati nel circuito: Microcontrollore AT90S2313 Microcircuito L293D (analogico domestico - KR1128KT4A) 2 fotoresistenza SF3-1 Quarzo a 4MHz Condensatori 22-24pF Stabilizzatore 7805 (o KREN5A) Resistenza da 100 ohm (opzionale) Due motori Power Vbat - 4 batterie AA o 1 corona (9V) Alimentazione Vm - 1 corona (9V) Dopo aver assemblato il circuito, è necessario scaricare il programma sul microcontrollore e il robot è pronto: /************************************************** **** *** Tipo di chip: AT90S2313 Frequenza di clock: 4,000000 MHz Modello di memoria: minuscolo Dimensione SRAM esterna: 0 Dimensione dello stack di dati: 32 ************************************************** ***** **/#includi <90s2313.h> #includere #includere // assegnazione di definizioni per la comodità di lavorare con le periferiche #definisci OUT PORTB #definisci MOTORE_F 7 #definisci MOTORE_B 6 #define TURN_R 5 #definire TURN_L 4 #definire IN PIND #definisci LUCE_R 0 #define LUCE_L 1 #define PARAURTI_F 2 #define PARAURTI_B 3 // Possibili modalità di guida enum {STOP, F, FR, FL, B, BR, BL}; // ------------------------------------------------ ------------------------------ // Ritardo t x 10 ms // ------------------------------------------------ ------------------------------ void Delay_10ms(carattere non firmato) {carattere i; per(i=0;i // tabella delle probabilità per la scelta della direzione del movimento // in base alla direzione di movimento corrente carattere senza segno 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}; // direzione di movimento attuale carattere non firmato this_move; // ------------------------------------------------ ------------------------------ // Attiva la combinazione di motori per muoverti in una determinata direzione // ------------------------------------------------ ------------------------------ void go(direzione del carattere senza segno){ interruttore (direzione) { caso ARRESTO: FUORI.MOTORE_F=0; FUORI.MOTORE_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; caso F: FUORI.MOTORE_F=1; FUORI.MOTORE_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; caso FR: FUORI.MOTORE_F=1; FUORI.MOTORE_B=0; OUT.TURN_R=1; OUT.TURN_L=0; break; caso FL: FUORI.MOTORE_F=1; FUORI.MOTORE_B=0; OUT.TURN_R=0; OUT.TURN_L=1; break; caso B: FUORI.MOTORE_F=0; FUORI.MOTORE_B=1; OUT.TURN_R=0; OUT.TURN_L=0; break; caso BR: FUORI.MOTORE_F=0; FUORI.MOTORE_B=1; OUT.TURN_R=1; OUT.TURN_L=0; break; caso BL: FUORI.MOTORE_F=0; FUORI.MOTORE_B=1; OUT.TURN_R=0; OUT.TURN_L=1; break; } } // ------------------------------------------------ ------------------------------ // Selezione della direzione del movimento nel passaggio successivo in base alla tabella delle probabilità // ------------------------------------------------ ------------------------------ carattere non firmato next_move(void){ charpp senza segno, i; pp = rand()/327; // ottiene un numero casuale 0..99 for (i=0;i<7;i++){ // cercando una corrispondenza nella tabella delle probabilità se (p[questo_move][i] > pp) si interrompe; } this_move = io; // scrive la nuova direzione ricevuta come quella corrente ritorno(i); } // ------------------------------------------------ ------------------------------ // Gestione dell'interruzione del paraurti anteriore (INT0 = PD2) // ------------------------------------------------ ------------------------------ interrompere [EXT_INT0] void ext_int0_isr(void) { if(this_move==FR) vai(BL); if(this_move==FL) vai(BR); altrimenti vai(B); Ritardo_10ms(250); // partenza entro 2.5 x 2 sec Ritardo_10 ms(250); questa_mossa=B; } // ------------------------------------------------ ------------------------------ // Gestione dell'interruzione del paraurti posteriore (INT1 = PD3) // ------------------------------------------------ ------------------------------ interrompere [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) vai(FL); if(this_move==BL) vai(FR); altrimenti vai(F); Ritardo_10ms(250); // partenza entro 2.5 x 2 sec Ritardo_10 ms(250); questa_mossa=F; } // ------------------------------------------------ ------------------------------ // "Passeggiata casuale" // ------------------------------------------------ ------------------------------ unsigned char walk(vuoto){ // questo ciclo organizza il "roaming libero" mentre // nessun segnale da nessuno dei sensori di luce while((IN.LIGHT_R) && (IN.LIGHT_L)){ vai(next_move()); // ottieni la prossima direzione di movimento e Ritardo_10ms(250); // muovendosi in questa direzione 2.5 sec } // questo ciclo organizza il movimento verso la luce mentre // è presente un segnale da almeno uno dei sensori di luce while((IN.LUCE_R==0) || (IN.LUCE_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); altrimenti se(IN.LIGHT_R==0) go(FR); altrimenti se(IN.LIGHT_L==0) vai(FL); } ritorno (0); } // ------------------------------------------------ ------------------------------ // Programma principale // ------------------------------------------------ ------------------------------ void main (void) { DDRB=0xff; // Assegna tutte le linee della porta B all'output PORTAB = 0x00; // e impostali bassi DDR=0x00; // Assegna tutte le linee della porta D all'input PORTA=0xff; // collega i resistori di carico interni // Inizializzazione degli interrupt esterni // INT0: attivato // Modalità INT0: Fronte discendente // INT1: attivato // Modalità INT1: Fronte discendente GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // abilita gli interrupt #asm("sei") // avvia il ciclo principale mentre(1) cammina(); } Scarica il programma, il file del firmware e il diagramma del robot in formato sPlan Pubblicazione: cxem.net Vedi altri articoli sezione Apparecchiatura di radiocomando. Leggere e scrivere utile commenti su questo articolo. Ultime notizie di scienza e tecnologia, nuova elettronica: Energia dallo spazio per Starship
08.05.2024 Nuovo metodo per creare batterie potenti
08.05.2024 Contenuto alcolico della birra calda
07.05.2024
Altre notizie interessanti: ▪ ViewSonic VSD241 All-in-One con processore NVIDIA Tegra 3 ▪ Motore a benzina ecologico di Mazda ▪ Trilioni di fotogrammi al secondo fotocamera News feed di scienza e tecnologia, nuova elettronica
Materiali interessanti della Biblioteca Tecnica Libera: ▪ sezione del sito Storie dalla vita dei radioamatori. Selezione dell'articolo ▪ articolo Nastro adesivo. Storia dell'invenzione e della produzione ▪ articolo Cos'è l'attività solare? Risposta dettagliata ▪ articolo Muscoli dall'aria. Laboratorio di scienze per bambini
Lascia il tuo commento su questo articolo: Tutte le lingue di questa pagina Homepage | Biblioteca | Articoli | Mappa del sito | Recensioni del sito www.diagram.com.ua |