Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Prenez le contrôle des fonctions Lego Power

Composants et fournitures

Arduino UNO
× 1
Texas Instruments Dual H-Bridge Motor Drivers L293D
(achetez-en un avec de longues broches, pas la version à montage en surface montrée sur la photo)
× 1
Planche à pain (générique)
× 1
Connecteur 9V vers Barrel Jack
× 1
Rallonge Lego Power Functions (article :8886)
× 3
Module Bluetooth HC-05
× 1

À propos de ce projet

Avez-vous l'un de ces superbes modèles Lego Power Functions avec moteurs électriques et servomoteurs ? Dans ce tutoriel je vais vous montrer comment contrôler votre modèle Lego avec votre Arduino et un minimum de composants électroniques. Je vais expliquer les circuits et la programmation en détail pour rendre ce tutoriel facile à comprendre pour les débutants. Le modèle Lego que tu devras construire toi-même (si tu n'as pas de fils), je ne t'aiderai pas avec ça.

Nous apprendrons également à utiliser l'inventeur de l'application MIT pour programmer notre propre application Android de contrôle à distance. Bientôt, vous aurez votre propre rover Lego Mars dans votre jardin !

C'est mon premier projet Arduino et mon fils a un magnifique modèle de voiture Lego Technic (9398 4X4 Crawler) avec des fonctions Lego Power :un servomoteur Lego pour la direction et deux moteurs Lego L pour la conduite. Il m'a permis d'utiliser la voiture pour ce projet (tant que je n'ai pas coupé les câbles du moteur). Ici, nous testons le prototype fini :

Comprendre le câblage des fonctions d'alimentation

Tout d'abord, achetez des fils d'extension Lego Power Functions (article 8886 dans la boutique en ligne Lego). Ensuite, coupez-les (sérieusement). Nous allons fabriquer des câbles "break-out" qui ont des briques Lego à une extrémité et des broches à l'autre extrémité. Soudez les broches sur ou similaire. Voici le câblage expliqué :

GND signifie Ground qui est la borne négative (-) de la batterie (anode). C1 et C2 peuvent changer de polarité pour faire changer de direction les moteurs et les servos. TechnicRobot a réalisé une belle vidéo expliquant tout en détail. (ATTENTION :vous faites cela sous votre propre responsabilité. Je ne serai pas tenu responsable si vous gâchez quelque chose !) Pour le connecteur du servo Lego, vous devez souder des broches sur les quatre câbles. Vous pouvez utiliser la prise gris clair. Pour le câble d'alimentation reliant le boîtier de batterie à la maquette, nous n'avons besoin que de +9 Volt et GND mais vous devez utiliser la prise gris foncé (car vous avez besoin d'un connecteur mâle) :

Pour le câble moteur, il suffit de connecter C1 et C2 et vous pouvez utiliser une prise gris clair. (Étudiez les schémas pour plus de détails).

Contrôler un moteur Lego avec la puce L293D

Nous voulons un contrôle de vitesse variable pour nos moteurs à courant continu et un contrôle de position pour notre servo Lego. Ceci est réalisé par la modulation de largeur d'impulsion (PWM). Le langage de programmation d'Arduino rend PWM facile à utiliser; appelez simplement analogWrite(pin, dutyCycle), où dutyCycle est une valeur de 0 à 255. Les broches PWM sont marquées d'un ~ sur votre arduino.

Les broches de sortie Arduino sont de 5 volts et max. 30 mA tandis que les moteurs Lego ont besoin de 9 volts et tirent plus de 100 mA chacun. Nous avons besoin d'une sorte de "dispositif de commutation" entre les deux. Nous voulons également pouvoir faire fonctionner les moteurs à courant continu dans les deux sens. Ces fonctions sont résolues par un pont en H. Nous utiliserons le L293D, qui contient deux ponts en H sur une puce intégrée, ce qui signifie que nous pouvons connecter les moteurs Lego (M) en parallèle d'un côté et le servo Lego (S) de l'autre côté de la puce. (Si vous souhaitez contrôler les deux moteurs indépendamment, vous aurez besoin d'un deuxième L293D). Le servo Lego doit également être connecté à GND et Lego +9 Volt.

La puce maintient Lego +9 Volt et Arduino +5 Volt complètement séparés. Ne les connectez jamais ensemble ou vous endommageriez quelque chose ! Mais vous devez connecter toutes les lignes de masse ensemble et avec les broches de masse L293D.

Depuis notre Arduino, nous utiliserons la broche 9 pour contrôler la vitesse du moteur et les broches 2 et 5 pour contrôler le sens de rotation. Le servo Lego est contrôlé comme un moteur :on connecte la broche 3 pour la position et les broches 6 et 8 pour la direction (gauche ou droite).

En haut de notre programme, nous définissons les broches Arduino utilisées comme des constantes. De plus, nous définissons quelques variables que nous utiliserons pour contrôler les moteurs :

// Broches de sortie numérique de contrôle moteur définies comme constantes globalesconst int controlPin1A =2 ; const int controlPin2A =5; const int ENablePin =9 ; // Broches de sortie numérique de servocommande définies comme constantes globales const int controlPin3A =6; const int controlPin4A =8; const int servoENablePin =3; // Variables globales de contrôle moteur :int motorSpeed ​​=0; // Vitesse du moteur 0..255int motorDirection =1; // En avant (1) ou en arrière (0)// Variables globales du servocontrôle:int Steering =0; // Position du servo 0..255int directionDirection =0; // Gauche (0) et Droite (1) 

Dans la configuration, nous définissons ces broches comme sorties avec la commande pinmode(), puis les mettons à 0 Volt avec digitalWrite().

void setup() { //other stuff.... // Déclarez les broches de sortie numérique :pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // moteur éteint digitalWrite(servoENablePin, LOW); // pilotage centré} 

Nous devons maintenant comprendre comment la puce L293D contrôle le sens de rotation des moteurs. Nous devons fournir les signaux suivants (High ==5 Volt; Low ==0 Volt):

  • EN1,2     1A       2A
  • Haut       Haut   Bas     Le moteur tourne à gauche (avant ; motorDirection ==1)
  • Haut       Bas    Haut    Le moteur tourne à droite (marche arrière ; motorDirection ==0)
  • EN3,4     3A     4A
  • High       High   Low     Le servo tourne à gauche (steeringDirection ==0)
  • Haut       Bas    Haut    Le servo tourne à droite (steeringDirection ==1)

D'accord. Nous sommes prêts à écrire un sous-programme qui lit les variables globales pour la direction et la vitesse/position et contrôle les moteurs et les servos :

void SetMotorControl(){ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //Vitesse if (directionDirection ==0) //Left { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //Droit { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, direction); //Position du servo} 

Application Android RC simple avec joystick

Ensuite, créons une application Android simple pour contrôler le modèle. (Si vous souhaitez d'abord tester l'application terminée :je l'ai mise à votre disposition dans le Google Play Store. Voici le lien :Arduino RC car bluetooth).

Nous utiliserons l'inventeur d'applications MIT 2. MIT App Inventor est une introduction innovante pour les débutants à la programmation et à la création d'applications. Mark Friedman de Google et le professeur du MIT Hal Abelson ont codirigé le développement d'App Inventor. Il fonctionne comme un service Web administré par le personnel du Center for Mobile Learning du MIT.

Sur votre téléphone Android, accédez à Google Play et installez l'application MIT AI2 Companion. Sur votre ordinateur, ouvrez le lien vers mon application RC dans le navigateur Firefox ou Chrome (Internet Explorer non pris en charge). Vous devrez vous connecter en utilisant votre adresse gmail et créer un compte afin de voir le code source. Si vous ouvrez l'application compagnon sur votre téléphone, vous pouvez consulter le code source dans le navigateur, y apporter des modifications et le tester immédiatement sur votre téléphone.

Dans le navigateur, vous verrez maintenant la vue Designer de l'application :

En bas, nous voyons le pad orange avec le joystickball bleu dedans. Passez maintenant à la vue Blocs pour voir le programme. Le cœur du programme est un bloc quand qui garde une trace des mouvements de votre doigt touchant et faisant glisser le joystickball bleu :

La position de votre doigt est suivie dans les deux variables currentX et actuelY et est utilisé pour calculer les valeurs des deux variables direction et vitesse (plage :-100..0..+100). Le programme vérifie d'abord si votre doigt est à l'extérieur du pad et limite les valeurs à +/- 100. Si le doigt est à l'intérieur du pad, le programme calcule les valeurs de direction et vitesse . Ensuite, le programme génère une chaîne de commande de la forme :

La commande commence par "RC" pour le contrôle à distance (l'idée est qu'à l'avenir, vous voudrez peut-être avoir plus de commandes) suivi d'une virgule. Ensuite, nous envoyons les valeurs de direction et vitesse . Le caractère de nouvelle ligne ('\n') à la fin de la commande est un signal à l'Arduino que la commande est terminée. Cette chaîne de commande est envoyée via Bluetooth à l'Arduino. Pour votre information, la chaîne est également affichée à l'écran.

Lecture des commandes Bluetooth dans l'Arduino

Afin de lire les chaînes de commande Bluetooth, nous devons connecter un module Bluetooth HC-05. Jetez un œil à votre module :

Le mien a 6 broches. Nous n'avons besoin que de quatre broches. VCC est la tension d'alimentation (positive) et GND est la masse. Le module tolère une tension d'alimentation de 6 volts, ce qui signifie que nous pouvons le connecter à la broche d'alimentation arduino 5 volts. TXD et RXD sont les signaux série. Nous devons traverser les lignes et connecter TXD à arduino RXD (broche 0) et vice versa. Attention : Il indique LEVEL : 3,3 V ce qui signifie que le RXD ne peut pas être directement connecté à l'arduino TXD 5V (broche 1). Nous devons construire un diviseur de tension avec trois résistances de 1 kOhm pour produire une tension de sortie qui est 2/3 de 5V (voir schémas). D'autre part, le signal TXD de 3,3V peut être directement connecté à Arduino RXD. L'Arduino reconnaîtra 3,3 volts comme ÉLEVÉ.

Comme les broches 0 et 1 sont partagées avec le port USB de votre Arduino, vous devrez déconnecter les signaux RXD et TXD des broches 0 et 1 tout en téléchargeant le programme via USB sur la carte. Le téléchargement ne fonctionnera pas si vous ne déconnectez pas les câbles.

Ensuite, vous devez coupler le module HC-05 avec votre appareil Android. Activez le Bluetooth ; démarrer l'application ; appuyez sur « Connecter Bluetooth » ; rendez votre téléphone visible et recherchez un appareil appelé HC-05 ou similaire. Sélectionnez l'appareil. Un code vous sera demandé. Appuyez sur "1234". Lorsque vous revenez à l'écran du joystick, il devrait indiquer « connecté » en vert.

Maintenant, regardons le code :

// Taille de la mémoire tampon série :calcul en fonction de la taille d'entrée maximale attendue pour une commande#define INPUT_SIZE 30 void loop() { // Obtenir la prochaine commande à partir du bluetooth série (ajouter 1 octet pour la dernière 0) char input[ INPUT_SIZE + 1] ; // tableau de type char (chaîne C) // lire Serial jusqu'à ce que la nouvelle ligne ou la mémoire tampon soit pleine ou dépasse le délai d'attente taille d'octet =Serial.readBytesUntil('\n', input, INPUT_SIZE); // Ajoutez le 0 final pour terminer la chaîne C input[size] =0; // Chaîne fractionnée de la forme :"RC,steering,speed,\n\0" char* command =strtok(input, ","); // commande (RC) // RCsteering dans la plage :-100 (gauche).. 0 .. 100 (droit) char* RCsteering =strtok(NULL, ","); // RCspeed in Range:-100 (pleine vitesse arrière).. 0 .. 100 (pleine vitesse avant) char* RCspeed =strtok(NULL, ","); int iRCsteering =atoi(RCsteering); // convertit la chaîne en entier int iRCspeed =atoi(RCspeed); // convertir la chaîne en entier //reste du programme}  

La chaîne envoyée par l'application Android est lue dans une construction de chaîne spéciale :une chaîne C avec une terminaison nulle. (Le caractère 0 indique au programme qu'il est arrivé à la fin de la chaîne). Cela se fait en utilisant la fonction Serial.readBytesUntil('\n', input, ...), qui lit à partir de l'interface série (bluetooth) jusqu'à ce qu'elle obtienne un caractère de nouvelle ligne ('\n'). De cette façon, nous continuons à lire les octets jusqu'à ce que nous ayons une commande complète en entrée :

Un moyen très efficace de traiter les entrées est la fonction de jeton de chaîne, qui coupe la chaîne en plusieurs parties en utilisant la virgule comme délimiteur. Le premier appel à strtok() renvoie "RC". Les parties suivantes de la commande sont ensuite lues en passant NULL à strtok(). Les valeurs renvoyées sont stockées dans RCsteering et RCspeed . Ces variables sont en fait des pointeurs vers des positions en entrée . La fonction atoi() les convertit finalement en entiers. Maintenant, nous avons :

Nous avons presque fini maintenant. Nous devons multiplier ces valeurs par 2,55 avant de les transmettre à notre routine SetMotorControl() (Rappelez-vous que la vitesse du moteur était dans la plage 0..255). Étudiez la suite du programme dans la section CODE, construisez le circuit et testez votre modèle Lego télécommandé !

Quelle est la prochaine étape ?

Maintenant que vous disposez d'un Arduino contrôlant votre modèle Lego, vous pouvez utiliser ce modèle comme plate-forme robotique :ajoutez des capteurs de ping à ultrasons, programmez votre propre logique d'évitement d'obstacles et créez votre propre rover Mars robotique autonome. Ou ajoutez plus de commandes à la télécommande et plus de fonctions au modèle. Mais d'abord, trouvez une méthode pour que l'Arduino découvre que le modèle a voyagé hors de portée de la connexion Bluetooth et arrêtez le modèle. Parlez-moi de votre solution.

Bientôt, vous découvrirez qu'une maquette de prototypage et des câbles lâches ne sont pas une bonne idée pour un modèle en mouvement. Procurez-vous un motorshield adafruit avec de gros connecteurs de bornier, recâblez et reprogrammez. Cela libérera également des signaux numériques que vous pourrez utiliser à la place pour les entrées. Vous pouvez également envisager un blindage de capteur pour une meilleure connexion de vos capteurs.

Faites-moi part de vos projets passionnants !

Code

  • Legocar_v3_bluetooth
Legocar_v3_bluetoothArduino
/* Modèle de voiture Lego Powerfunctions contrôlé via Bluetooth Arduino Uno contrôle les moteurs et le servo Télécommande avec application Android développée avec MIT App Inventor 2 Circuit :* Communication série (utilise la broche Uno 0,1) Le module Bluetooth est connecté (doit être détaché lors du chargement du programme via USB) * L293D avec moteur (utilise les broches numériques Uno 2,5,9) * L293D avec servo (utilise les broches numériques Uno 6,8,3) */// Bibliothèques utilisées :#include // Serial Peripheral Interface Library#include // contient la fonction strtok :divise la chaîne en jetons// Serial buffer size :calcule en fonction de la taille d'entrée maximale attendue pour une commande via l'interface série Bluetooth #define INPUT_SIZE 30/ / Broches de sortie numérique de contrôle moteur définies comme constantes globales (4 roues motrices avec 2 moteurs Lego):const int controlPin1A =2; // Entrée du pilote L293D 1A sur la broche n° 2 http://www.ti.com/lit/ds/symlink/l293.pdf connecté à la sortie numérique Arduino broche 2const int controlPin2A =5; // Entrée du pilote L293D 2A sur la broche n° 7 connectée à la sortie numérique Arduino broche 5const int ENablePin =9 ; // L293D ENable (1,2) entrée sur la broche n° 1 connectée à la broche de sortie numérique Arduino 9// Broches de sortie numérique de servocommande définies comme constantes globales (direction servo avec 1 servo Lego):const int controlPin3A =6; // Entrée du pilote L293D 3A sur la broche n° 10 connectée à la sortie numérique Arduino broche 6const int controlPin4A =8; // Entrée du pilote L293D 4A sur la broche n° 15 connectée à la sortie numérique Arduino broche 8 const int servoENablePin =3; // Entrée L293D ENable(3,4) sur la broche n° 9 connectée à la broche 3 de la sortie numérique Arduino // Variables globales de contrôle du moteur :int motorSpeed ​​=0 ; // Vitesse du moteur 0..255int motorDirection =1; // En avant (1) ou en arrière (0)// Variables globales du servocontrôle:int Steering =0; // Position du servo 0..255int directionDirection =0; // Gauche (0) et Droite (1) void setup() { Serial.begin (9600); // initialise la communication série Serial.setTimeout(1000); // 1000 ms time out // Déclarer les broches de sortie numérique :pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // moteur éteint digitalWrite(servoENablePin, LOW); // direction centrée}boucle vide() { // Obtenir la commande suivante du bluetooth série (ajouter 1 octet pour le dernier 0) char input[INPUT_SIZE + 1] ; // tableau de type char (chaîne C) avec terminaison nulle (https://www.arduino.cc/en/Reference/String) byte size =Serial.readBytesUntil('\n', input, INPUT_SIZE); // lire Serial jusqu'à ce que la nouvelle ligne ou le tampon soit plein ou time out // Ajoutez le 0 final pour terminer la chaîne C input[size] =0; // Commande de lecture qui est une chaîne C de la forme :"RC,RCsteering,RCspeed,\n\0" (se termine par un caractère de nouvelle ligne et un null) char* command =strtok(input, ","); // ignore la commande pour le moment (RC pour Remote Control est la seule commande envoyée par l'application pour le moment) char* RCsteering =strtok(NULL, ","); // vient ensuite RCsteering qui est dans la plage :-100 (gauche).. 0 .. 100 (droite) char* RCspeed =strtok(NULL, ","); // vient ensuite RCspeed qui est dans la plage :-100 (pleine vitesse arrière).. 0 .. 100 (pleine vitesse avant) int iRCsteering =atoi(RCsteering); // convertit la chaîne RCsteering en entier iRCsteering int iRCspeed =atoi(RCspeed); // convertir la chaîne RCspeed en entier iRCspeed // Définir les variables de commande du moteur et de l'asservissement if (iRCsteering> 0) SteeringDirection =1; // tourner à droite si iRCsteering =1..100 sinon SteeringDirection =0; // tourner à gauche si iRCsteering =-10..0 direction =int(2.55*abs(iRCsteering)); // Position du servo 0..255 basée sur la commande 0..100 if (iRCspeed> 0) motorDirection =1; // Met la voiture en marche avant si iRCspeed =1..100 else motorDirection =0; // Mettre la voiture en marche arrière si iRCspeed =-10..0 motorSpeed ​​=int(2.55*abs(iRCspeed)); // Définir la vitesse 0..255 en fonction de la commande 0..100 SetMotorControl(); // ajuste la direction et la vitesse du moteur } void SetMotorControl()/*L293 logique :EN1,2 1A 2A HHL Le moteur tourne à gauche (Forward ; motorDirection ==1) HLH Le moteur tourne à droite (Reverse ; motorDirection ==0) EN3,4 3A 4A HHL Servo tourne à gauche (direction de direction ==0) HLH Servo tourne à droite (direction de direction ==1) Vitesse du moteur :signal PWM activé EN1,2 (490 Hz ; valeur de sortie numérique 0..255 pour motorSpeed) Position du servo :signal PWM activé EN3,4 (490 Hz ; valeur de sortie numérique 0..255 pour la position ; 0 est tout droit)*/{ if (motorDirection ==1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //Vitesse if (directionDirection ==0) //Left { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //Droit { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, direction); //Position servo}
Github Lego-voiture-Arduino
Contient le code source Arduino ; Diagramme de frittage ; code source de l'application Android à télécharger sur l'inventeur de l'application MIThttps://github.com/Notthemarsian/Lego-car-Arduino

Schémas

Github Lego-voiture-Arduino
Contient le code source Arduino ; Diagramme de frittage ; code source de l'application Android à télécharger sur l'inventeur de l'application MIThttps://github.com/Notthemarsian/Lego-car-Arduino Lego%20rc%20car%20v2.fzz

Processus de fabrication

  1. Prenez le contrôle de l'épée SaaS à double tranchant
  2. Précédents des fonctions de puissance d'e
  3. Stratégies pour des composants de transmission d'énergie plus fiables
  4. Les bases des panneaux de commande électriques
  5. Énergie éolienne
  6. Les fabricants britanniques dépensent plus de 2,5 millions de livres sterling pour rectifier les erreurs
  7. Électricité et CVC/Contrôle de la climatisation
  8. 8 étapes pour déboguer votre système de contrôle de processus
  9. Contrôle de la tension dans le traitement des bandes - Composants clés