Simulateur DIY 2D Motion Racing
Composants et fournitures
| | × | 1 | |
| | × | 2 | |
Applications et services en ligne
À propos de ce projet
SimTools est un logiciel générique de simulation de mouvement capable de contrôler plusieurs interfaces matérielles, y compris Arduino. Cette combinaison est utilisée dans le projet présenté dans la vidéo. La partie matérielle se compose uniquement d'un microcontrôleur Arduino Nano et de deux micro servomoteurs SG90 bon marché. Nous avons seulement besoin de télécharger le code ci-dessous.
Les données de jeu requises à l'aide du logiciel SimTools sont transmises via le port série à l'Arduino. Ensuite, Arduino active des servomoteurs qui déplacent la plate-forme de simulation en conséquence. Il s'agit d'une petite échelle d'un simulateur à deux axes. Pour faire un vrai simulateur, vous devez ajouter des pilotes de moteur et de gros servomoteurs.
Il existe de nombreux exemples de ces simulateurs de bricolage ainsi que des dessins de construction et des conseils sur la page "https://www.xsimulator.net/". La procédure d'installation de SimTools est décrite dans la vidéo, mais vous pouvez également télécharger le manuel d'utilisation au format PDF sur :https://simtools.us/wp-content/uploads/2019/06/SimToolsUserManual-v2.4.pdf
SimTools fonctionnera en mode « Démo » jusqu'à ce qu'une licence valide ait été enregistrée. Le plugin pour Live for Speed est pleinement opérationnel pour les tests pendant que SimTools est en mode démo. (La démo de Live for Speed fonctionnera également pour tester SimTools.) Vous pouvez trouver plus d'informations et télécharger Live for Speed sur https://www.lfs.net/downloads
Lien de téléchargement SimTools :
https://www.xsimulator.net/community/marketplace/motion-simulation-software-simtools.63/
Code
CodeC/C++
//************************************************ ************************************************** // RC Modèle Servo// Code d'origine par EAOROBBIE (Robert Lindsay)// Complètement mutilé par aarondc// Pour une utilisation gratuite pour Sim Tool Motion Software//************************ ******************************************************** **********************#include //#define DEBUG 1 // commentez cette ligne pour supprimer le debuggin Serial.print linesconst int kActuatorCount =2 ; // combien d'actionneurs nous gérons// les lettres ("noms") envoyées par Sim Tools pour identifier chaque actionneur// NB :l'ordre des lettres détermine ici l'ordre des constantes restantes kPins et kActuatorScaleconst char kActuatorName[kActuatorCount] ={ 'R', 'L' };const int kPins[kActuatorCount] ={4, 5}; // broches auxquelles les actionneurs sont attachésconst int kActuatorScale[kActuatorCount][2] ={ { 0, 179 } , // Mise à l'échelle de l'actionneur droit { 179, 0 } // Mise à l'échelle de l'actionneur gauche } ; const char kEOL ='~'; // Fin de ligne - le délimiteur pour nos valeurs d'acutator const int kMaxCharCount =3; // de l'assurance...Servo activateurSet[kActuatorCount]; // notre tableau d'Actuatorsint activatePosition[kActuatorCount] ={90, 90}; // positions actuelles de l'actionneur, initialisées à 90int currentActuator ; // garde une trace de l'actionneur actuel lu à partir du port série valueCharCount =0; // combien de caractères de valeur avons-nous lus (doit être inférieur à kMaxCharCount!!// configurer certains états pour notre machine d'état// psReadActuator =le prochain caractère du port série nous indique l'actionneur// psReadValue =les 3 prochains caractères du port série nous indique le valueenum TPortState { psReadActuator, psReadValue }; TPortState currentState =psReadActuator;void setup(){ // attache les actionneurs aux broches pour (int i =0; i 0).void serialEvent() { char tmpChar; int tmpValue; while (Serial.available()) { // if nous attendons un nom d'actionneur, saisissez-le ici if (currentState ==psReadActuator) { tmpChar =Serial.read(); // recherchez notre actionneur dans le tableau des noms d'actionneurs que nous avons configurés #ifdef DEBUG Serial.print("read in "); Serial.println(tmpChar); #endif for (int i =0; i 9)) tmpValue =0; ActuatorPosition[currentActuator] =actuatorPosition[currentActuator] * 10 + tmpValue ; valueCharCount++ ; } sinon pause ; } // si nous avons lu le délimiteur de valeur, mettez à jour l'actionneur et commencez à rechercher le prochain nom de l'actionneur if (tmpValue ==kEOL || valueCharCount ==kMaxCharCount) {#ifdef DEBUG Serial.print("read in "); Serial.println(actuatorPosition[currentActuator]); #endif // redimensionne la nouvelle position pour que la valeur soit comprise entre 0 et 179.actuatorPosition[currentActuator] =map(actuatorPosition[currentActuator], 0, 255, kActuatorScale[currentActuator][0], kActuatorScale[currentActuator][1]);# ifdef DEBUG Serial.print("scaled to "); Serial.println(actuatorPosition[currentActuator]); #endif updateActuator(currentActuator); currentState =psReadActuator; } } }}// écrit la position actuelle de l'actionneur dans l'actuateur void updateActuator(int thisActuator) { actuatorSet[thisActuator].write(actuatorPosition[thisActuator]);} Schémas