Bibliothèque technique gratuite ENCYCLOPÉDIE DE LA RADIOÉLECTRONIQUE ET DU GÉNIE ÉLECTRIQUE Des robots simples. Encyclopédie de la radioélectronique et de l'électrotechnique Encyclopédie de l'électronique radio et de l'électrotechnique / Équipement de radiocommande Cet article présente un schéma d'un simple "robot". Il va à la lumière, et s'il n'y a pas de source lumineuse, alors le mode « Recherche libre » est activé, c'est-à-dire le robot conduira et, en cas de collision, s'éloignera et fera demi-tour. Le cœur du robot est un microcontrôleur d'ATMEL : AT90S2313, mais vous pouvez en utiliser n'importe quel autre de cette société, ce microcontrôleur a 2 Ko de mémoire programme, 15 ports d'E/S, une alimentation disponible - 4-6 V. Les moteurs seront contrôlés par un « pilote de moteur » - le microcircuit L293D (analogue domestique - KR1128KT4A). Il a été décidé d'utiliser des photorésistances SF3-1 comme capteur. Le robot est composé de deux moteurs. Voici comment ils fonctionneront pour certaines actions :
Éléments radio utilisés dans le circuit : Microcontrôleur AT90S2313 Microcircuit L293D (analogue domestique - KR1128KT4A) 2 photorésistance SF3-1 Quartz à 4MHz Condensateurs 22-24pF Stabilisateur 7805 (ou KREN5A) Résistance de 100 ohms (facultatif) Deux moteurs Alimentation Vbat - 4 piles AA, ou 1 couronne (9V) Alimentation Vm - 1 couronne (9V) Après avoir assemblé le circuit, vous devez télécharger le programme sur le microcontrôleur et le robot est prêt : /**************************************************** **** *** Type de puce : AT90S2313 Fréquence d'horloge : 4,000000 MHz Modèle de mémoire : Minuscule Taille SRAM externe : 0 Taille de la pile de données : 32 ****************************************************** **/#inclure <90s2313.h> #inclure #comprendre // affectation de définitions pour la commodité de travailler avec des périphériques #define PORT SORTIE #define MOTEUR_F 7 #define MOTEUR_B 6 #définir TURN_R 5 #définir TURN_L 4 #définir EN PIN #définir LIGHT_R 0 #définir LIGHT_L 1 #définir BUMPER_F 2 #définir BUMPER_B 3 // Modes de conduite possibles énumération {STOP, F, FR, FL, B, BR, BL} ; // ---------------------------------------------------- ------------------------------ // Délai t x 10ms // ---------------------------------------------------- ------------------------------ void Delay_10ms (caractère non signé) {car je ; pour(i=0;i // table de probabilité pour choisir la direction du mouvement // basé sur la direction actuelle du mouvement caractère non signé 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} ; // direction actuelle du mouvement caractère non signé this_move ; // ---------------------------------------------------- ------------------------------ // Activer la combinaison de moteurs pour se déplacer dans une direction donnée // ---------------------------------------------------- ------------------------------ void go (direction du caractère non signé) { interrupteur (direction) { cas ARRÊT : SORTIE.MOTEUR_F=0 ; SORTIE.MOTEUR_B=0 ; OUT.TURN_R=0 ; OUT.TURN_L=0 ; break; cas F : SORTIE.MOTEUR_F=1 ; SORTIE.MOTEUR_B=0 ; OUT.TURN_R=0 ; OUT.TURN_L=0 ; break; cas FR : SORTIE.MOTEUR_F=1 ; SORTIE.MOTEUR_B=0 ; OUT.TURN_R=1 ; OUT.TURN_L=0 ; break; cas FL : SORTIE.MOTEUR_F=1 ; SORTIE.MOTEUR_B=0 ; OUT.TURN_R=0 ; OUT.TURN_L=1 ; break; cas B : SORTIE.MOTEUR_F=0 ; SORTIE.MOTEUR_B=1 ; OUT.TURN_R=0 ; OUT.TURN_L=0 ; break; cas BR : SORTIE.MOTEUR_F=0 ; SORTIE.MOTEUR_B=1 ; OUT.TURN_R=1 ; OUT.TURN_L=0 ; break; cas BL : SORTIE.MOTEUR_F=0 ; SORTIE.MOTEUR_B=1 ; OUT.TURN_R=0 ; OUT.TURN_L=1 ; break; } } // ---------------------------------------------------- ------------------------------ // Sélection de la direction du mouvement à l'étape suivante selon le tableau de probabilité // ---------------------------------------------------- ------------------------------ caractère non signé next_move(void){ charpp non signé, i; pp = rand()/327; // obtient un nombre aléatoire 0..99 for (i=0;i<7;i++){ // recherche une correspondance dans la table de probabilité si (p[this_move][i] > pp) pause ; } this_move = je; // enregistre la nouvelle direction reçue comme étant la direction actuelle retour(je); } // ---------------------------------------------------- ------------------------------ // Gestion de l'interruption du pare-chocs avant (INT0 = PD2) // ---------------------------------------------------- ------------------------------ interrompre [EXT_INT0] annuler ext_int0_isr (annuler) { if(this_move==FR) go(BL); if(this_move==FL) go(BR); sinon aller(B); Délai_10ms(250); // départ dans les 2.5 x 2 secondes Délai_10 ms (250 ); this_move=B ; } // ---------------------------------------------------- ------------------------------ // Gestion de l'interruption du pare-chocs arrière (INT1 = PD3) // ---------------------------------------------------- ------------------------------ interrompre [EXT_INT1] annuler ext_int1_isr (annuler) { if(this_move==BR) go(FL); if(this_move==BL) go(FR); sinon aller(F); Délai_10ms(250); // départ dans les 2.5 x 2 secondes Délai_10 ms (250 ); this_move=F ; } // ---------------------------------------------------- ------------------------------ // "Marche aléatoire" // ---------------------------------------------------- ------------------------------ char non signé marche (vide){ // cette boucle organise le "free roam" tandis que // aucun signal de l'un des capteurs de lumière tandis que((IN.LIGHT_R) && (IN.LIGHT_L)){ aller(next_move()); // obtient la prochaine direction de mouvement et Délai_10ms(250); // se déplace dans cette direction pendant 2.5 secondes } // cette boucle organise le mouvement vers la lumière tout en // il y a un signal d'au moins un des capteurs de lumière tandis que((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); sinon si(IN.LIGHT_R==0) aller(FR); sinon si(IN.LIGHT_L==0) aller(FL); } retour(0); } // ---------------------------------------------------- ------------------------------ // Programme principal // ---------------------------------------------------- ------------------------------ void main (void) { DDRB=0xff ; // affecte toutes les lignes du port B à la sortie PORTB = 0x00 ; // et réglez-les bas DDRD=0x00 ; // affecte toutes les lignes du port D à l'entrée PORTD=0xff ; // connecte les résistances de charge internes // Initialisation d'interruption(s) externe(s) // INT0 : Activé // Mode INT0 : front descendant // INT1 : Activé // Mode INT1 : front descendant GIMSK=0xC0 ; MCUCR=0x0A ; GIFR=0xC0 ; // active les interruptions #asm("sei") // démarre la boucle principale tandis que(1) marche(); } Téléchargez le programme, le fichier du firmware et le schéma du robot au format sPlan Publication : cxem.net Voir d'autres articles section Équipement de radiocommande. Lire et écrire utile commentaires sur cet article. Dernières nouvelles de la science et de la technologie, nouvelle électronique : Teneur en alcool de la bière chaude
07.05.2024 Facteur de risque majeur de dépendance au jeu
07.05.2024 Le bruit de la circulation retarde la croissance des poussins
06.05.2024
Autres nouvelles intéressantes : ▪ Renaissance du mammouth laineux ▪ Télescope pour radiographier l'univers ▪ Les mains vous aident à penser ▪ Vélos électriques Himiway modèles Pony, Rambler et Rhino Fil d'actualité de la science et de la technologie, nouvelle électronique
Matériaux intéressants de la bibliothèque technique gratuite : ▪ section du site Appels et simulateurs audio. Sélection d'articles ▪ article Opérateur de panneau de commande d'ascenseur. Description de l'emploi
Laissez votre commentaire sur cet article : Toutes les langues de cette page Page principale | bibliothèque | Articles | Plan du site | Avis sur le site www.diagramme.com.ua |