2RM voix contrôlée Robot avec Arduino et serveur BitVoicer (5 / 7 étapes)

Étape 5: Télécharger le Code sur l’Arduino

Dans cette étape, vous devrez télécharger le code ci-dessous à l’Arduino. Vous pouvez également télécharger le sketch Arduino à partir du lien ci-dessous le code. N’oubliez pas que pour envoyer le code à l’Arduino vous devez définir le commutateur sur le Sparkfun bouclier au poste DLINE tel que décrit à l’étape 3. Avant de télécharger le code, vous devez installer correctement le Serveur BitVoicer et les bibliothèques de Pololu moteur dans l’IDE Arduino (Importer un fichier zip bibliothèque).

 #include <BVSP.h>#include <BVSMic.h>#include <DualMC33926MotorShield.h>// Defines the Arduino pins that will be used to control // LEDs and capture audio #define BVS_RUNNING 2 #define BVS_SRE 5 #define BVS_DATA_FWD 3 #define BVS_ACT_PERIOD 6 #define BVSM_AUDIO_INPUT 3// Defines the constants that will be passed as parameters to // the BVSP.begin function const unsigned long STATUS_REQUEST_INTERVAL = 2000; const unsigned long STATUS_REQUEST_TIMEOUT = 1000;// Defines the size of the mic buffer const int MIC_BUFFER_SIZE = 64;// Initializes a new global instance of the BVSP class BVSP bvsp = BVSP();// Initializes a new global instance of the BVSMic class BVSMic bvsm = BVSMic();// Initializes a new global instance of the // DualMC33926MotorShield class DualMC33926MotorShield ms = DualMC33926MotorShield();// Creates a buffer that will be used to read recorded samples // from the BVSMic class byte micBuffer[MIC_BUFFER_SIZE];// Creates a global variable that indicates whether the // Arduino is connected to BitVoicer Server boolean connected = false;// Defines some constants for the motor settings const int SPEED_STOP = 0; const int SPEED_SLOW = 100; const int SPEED_NORMAL = 250; const int SPEED_FAST = 400; const int DIRECTION_FRONT = -1; const int DIRECTION_BACK = 1;// Declares a global variables to hold the current motor speed. // The default is SPEED_NORMAL, but there are voice // commands that change this setting. int motorSpeed = SPEED_NORMAL;// Stores the command duration in milliseconds unsigned long cmdDuration = 0;// Stores the time the command started running unsigned long cmdStartTime = 0;// Stores whether a command is running or not bool cmdRunning = false;// Stores the last MOVE_FORWARD command. This variable // is used only for the COME_BACK command. byte lastFwdCmd = 0;// Defines some constants for command names/values // Just to make the code more readable const byte CMD_STOP = 0; const byte CMD_MOVE_FORWARD = 1; const byte CMD_MOVE_FORWARD_1_CM = 2; const byte CMD_MOVE_FORWARD_2_CM = 3; const byte CMD_MOVE_FORWARD_5_CM = 4; const byte CMD_MOVE_FORWARD_10_CM = 5; const byte CMD_MOVE_FORWARD_25_CM = 6; const byte CMD_MOVE_FORWARD_50_CM = 7; const byte CMD_MOVE_FORWARD_1_M = 8; const byte CMD_MOVE_BACKWARD = 9; const byte CMD_MOVE_BACKWARD_1_CM = 10; const byte CMD_MOVE_BACKWARD_2_CM = 11; const byte CMD_MOVE_BACKWARD_5_CM = 12; const byte CMD_MOVE_BACKWARD_10_CM = 13; const byte CMD_MOVE_BACKWARD_25_CM = 14; const byte CMD_MOVE_BACKWARD_50_CM = 15; const byte CMD_MOVE_BACKWARD_1_M = 16; const byte CMD_TURN_AROUND = 17; const byte CMD_TURN_AROUND_RIGHT = 18; const byte CMD_TURN_AROUND_LEFT = 19; const byte CMD_DO_360 = 20; const byte CMD_TURN_RIGHT = 21; const byte CMD_TURN_RIGHT_10 = 22; const byte CMD_TURN_RIGHT_25 = 23; const byte CMD_TURN_RIGHT_45 = 24; const byte CMD_TURN_LEFT = 25; const byte CMD_TURN_LEFT_10 = 26; const byte CMD_TURN_LEFT_25 = 27; const byte CMD_TURN_LEFT_45 = 28; const byte CMD_DO_CIRCLE = 29; const byte CMD_COME_BACK = 30; const byte CMD_MOVE_FORWARD_2_M = 31; const byte CMD_MOVE_FORWARD_3_M = 32; const byte CMD_MOVE_BACKWARD_2_M = 33; const byte CMD_MOVE_BACKWARD_3_M = 34; const byte CMD_SET_SPEED_SLOW = 35; const byte CMD_SET_SPEED_NORMAL = 36; const byte CMD_SET_SPEED_FAST = 37; const byte CMD_TURN_LEFT_45_BACKWARD = 38; const byte CMD_TURN_RIGHT_45_BACKWARD = 39;void setup() { // Starts serial communication at 115200 bps Serial.begin(115200); // Sets the Arduino pin modes pinMode(BVS_RUNNING, OUTPUT); pinMode(BVS_SRE, OUTPUT); pinMode(BVS_DATA_FWD, OUTPUT); pinMode(BVS_ACT_PERIOD, OUTPUT); AllLEDsOff(); // Sets the Arduino serial port that will be used for // communication, how long it will take before a status request // times out and how often status requests should be sent to // BitVoicer Server bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Sets the function that will handle the frameReceived // event bvsp.frameReceived = BVSP_frameReceived; // Prepares the BVSMic class timer bvsm.begin(); // Prepares the motor shield class (pins and timer1) ms.init(); }void loop() { // If it is not connected to the server, opens a TCP/IP // connection, sets connected to true and resets the BVSP // class if (!connected) { Connect(Serial); connected = true; bvsp.reset(); } // Checks if the status request interval has elapsed and if it // has, sends a status request to BitVoicer Server bvsp.keepAlive(); // Checks if there is data available at the serial port buffer // and processes its content according to the specifications // of the BitVoicer Server Protocol bvsp.receive(); // Gets the respective status from the BVSP class and sets // the LEDs on or off digitalWrite(BVS_RUNNING, bvsp.isBVSRunning()); digitalWrite(BVS_DATA_FWD, bvsp.isDataFwdRunning()); // Checks if there is a SRE assigned to the Arduino if (bvsp.isSREAvailable()) { // Turns on the SRE available LED digitalWrite(BVS_SRE, HIGH); // If the BVSMic class is not recording, sets up the audio // input and starts recording if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // Checks if the BVSMic class has available samples if (bvsm.available) { // Makes sure the inbound mode is STREAM_MODE before // transmitting the stream if (bvsp.inboundMode == FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Reads the audio samples from the BVSMic class int bytesRead = bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Sends the audio stream to BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // There is no SRE available // Turns off the SRE and ACT_PERIOD LEDs digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_ACT_PERIOD, LOW); // If the BVSMic class is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); } // If the status has timed out, the connection is considered // lost if (bvsp.hasStatusTimedOut()) { // If the BVSMic is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); // Closes the TCP/IP connection Disconnect(Serial); AllLEDsOff(); connected = false; } // If a command is running, checks if its duration has // expired. If it has, stop the motors. if (cmdRunning) if (millis() - cmdStartTime >= cmdDuration) RunCommand(CMD_STOP); }// Handles the frameReceived event void BVSP_frameReceived(byte dataType, int payloadSize) { // Performs the appropriate actions based on the frame // data type. If the data type is byte, it is a command. // If the data type is int, changes the activated // period LED. switch (dataType) { case DATA_TYPE_BYTE: RunCommand(bvsp.getReceivedByte()); break; case DATA_TYPE_INT16: digitalWrite(BVS_ACT_PERIOD, bvsp.getReceivedInt16()); break; } }// Runs the command received from the server void RunCommand(byte cmd) { switch (cmd) { case CMD_STOP: ms.setSpeeds(SPEED_STOP, SPEED_STOP); cmdRunning = false; return; case CMD_MOVE_FORWARD: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 60000; break; case CMD_MOVE_FORWARD_1_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 23; break; case CMD_MOVE_FORWARD_2_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 47; break; case CMD_MOVE_FORWARD_5_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 117; break; case CMD_MOVE_FORWARD_10_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 234; break; case CMD_MOVE_FORWARD_25_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 468; break; case CMD_MOVE_FORWARD_50_CM: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 1170; break; case CMD_MOVE_FORWARD_1_M: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 2339; break; case CMD_MOVE_FORWARD_2_M: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 4678; break; case CMD_MOVE_FORWARD_3_M: lastFwdCmd = cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration = 7018; break; case CMD_MOVE_BACKWARD: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 60000; break; case CMD_MOVE_BACKWARD_1_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 23; break; case CMD_MOVE_BACKWARD_2_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 47; break; case CMD_MOVE_BACKWARD_5_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 117; break; case CMD_MOVE_BACKWARD_10_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 234; break; case CMD_MOVE_BACKWARD_25_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 468; break; case CMD_MOVE_BACKWARD_50_CM: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 1170; break; case CMD_MOVE_BACKWARD_1_M: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 2339; break; case CMD_MOVE_BACKWARD_2_M: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 4678; break; case CMD_MOVE_BACKWARD_3_M: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration = 7017; break; case CMD_TURN_AROUND: ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration = 540; break; case CMD_TURN_AROUND_RIGHT: ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration = 540; break; case CMD_TURN_AROUND_LEFT: ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_FRONT); cmdDuration = 540; break; case CMD_DO_360: ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration = 1065; break; case CMD_TURN_RIGHT: ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration = 503; break; case CMD_TURN_RIGHT_10: ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration = 56; break; case CMD_TURN_RIGHT_25: ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration = 140; break; case CMD_TURN_RIGHT_45: ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration = 252; break; case CMD_TURN_LEFT: ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration = 503; break; case CMD_TURN_LEFT_10: ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration = 56; break; case CMD_TURN_LEFT_25: ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration = 140; break; case CMD_TURN_LEFT_45: ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration = 252; break; case CMD_DO_CIRCLE: ms.setSpeeds( SPEED_NORMAL * DIRECTION_FRONT, SPEED_NORMAL * DIRECTION_FRONT * 0.60); cmdDuration = 4587; break; case CMD_COME_BACK: RunCommand(lastFwdCmd); return; case CMD_SET_SPEED_SLOW: motorSpeed = SPEED_SLOW; return; case CMD_SET_SPEED_NORMAL: motorSpeed = SPEED_NORMAL; return; case CMD_SET_SPEED_FAST: motorSpeed = SPEED_FAST; return; case CMD_TURN_LEFT_45_BACKWARD: ms.setSpeeds(motorSpeed * DIRECTION_BACK, 0); cmdDuration = 252; break; case CMD_TURN_RIGHT_45_BACKWARD: ms.setSpeeds(0, motorSpeed * DIRECTION_BACK); cmdDuration = 252; break; } // Sets the command start time cmdStartTime = millis(); // Sets cmdRunning to true cmdRunning = true; }// Opens a TCP/IP connection with the BitVoicer Server void Connect(HardwareSerial &serialPort) { serialPort.print("$$$"); delay(500); // Use the IP address of the server and the TCP port set // in the server properties serialPort.println("open 192.168.0.11 4194"); delay(1000); serialPort.println("exit"); delay(500); }// Closes the TCP/IP connection with the BitVoicer Server void Disconnect(HardwareSerial &serialPort) { serialPort.print("$$$"); delay(500); serialPort.println("close"); delay(1000); serialPort.println("exit"); delay(500); }// Turns all LEDs off void AllLEDsOff() { digitalWrite(BVS_RUNNING, LOW); digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_DATA_FWD, LOW); digitalWrite(BVS_ACT_PERIOD, LOW); } 

BVS_Demo3.INO

Certaines parties de ce croquis sont semblables aux pièces que j’ai utilisé dans un de mes précédents Instructables et traite de la communication avec le serveur BitVoicer (classesDJESTOXX et BVSMic ). Dans ce Instructable, je m’en tiendrai à l’explication des nouvelles pièces de l’esquisse. Si vous souhaitez obtenir plus d’informations sur comment utiliser les classes BVSMic et le DJESTOXX, je suggère votre consulter l’Instructable je l’ai mentionné plus haut.

  • Déclaration de constantes : au début de l’esquisse, je déclare une série de constantes utilisées partout dans le code. Le groupe de constantes avec les paramètres moteurs définit les vitesses du moteur par défaut et deux constantes de la direction. Le Pololu bibliothèque pilote moteur accepte les valeurs comprises entre -400 et + 400 pour la vitesse du moteur où le zéro signifie hors. Valeurs négatives indiquent la rotation en sens inverse ou, si vous avez inversé les câbles du moteur comme moi, rotation vers l’avant. Le groupe de constantes avec des valeurs de commande renvoie aux commandes qui seront envoyés du serveur BitVoicer. Dans ce sketch, j’ai défini seulement 40 commandes de base de type byte , mais des mouvements plus complexes peuvent être effectuées en combinant ces commandes.
  • Variables de contrôle de l’exécution : cinq variables sont définies au début du code pour contrôler l’exécution des commandes (motorSpeed, cmdDuration, cmdStartTime, cmdRunning e lastFwdCmd). La variable motorSpeed détient la vitesse du moteur actuelle. Cette variable est mise à jour avec l’une des valeurs par défaut définies par les constantes de vitesse si l’Arduino reçoit une commande de serveur BitVoicer pour mettre à jour les vitesses du moteur. La variable cmdDuration contient la durée totale de la commande actuelle. Cette variable est comparée à la variable cmdStartTime dans toutes les itérations de la fonction de boucle si cmdRunning a la valeur true. Si la durée d’exécution de commande a expiré, la fonction ExécuterCommande est appelée pour arrêter les moteurs. La variable lastFwdCmd contient la dernière commande "go/déplacer vers l’avant". Cette variable est utilisée pour connaître la dernière distance parcourue pour la « come back » de commande peut être exécutée. Notez que pour utiliser cette commande, vous devez tout d’abord dire au robot de tourner autour.
  • Connexion WiFi : à la fin de l’esquisse, je définir deux fonctions pour connecter et déconnecter du serveur BitVoicer (Connect et Disconnect). Ces fonctions mettent la puce WiFi module en mode commande, ouvrir ou fermer une connexion TCP/IP et le module de retour en mode données. À l’intérieur de la fonction de boucle , si la variable connecté n’est pas vrai, j’appelle la fonction Connect . Si la classe DJESTOXX indique l’état du serveur a expiré, en d’autres termes, aucune réponse n’a été reçue pour la dernière demande de statut, je suppose que la connexion a été perdue et j’appelle la fonction de déconnexion . Cela va forcer une nouvelle tentative de connexion à la prochaine itération de la boucle.
  • ExécuterCommande fonction : cette fonction est appelée chaque fois qu’une commande est reçue du serveur BitVoicer. Il prend une valeur d’octet qui correspond à l’un des commandes de base définis par les constantes au début de l’esquisse. Chaque commande de base est identifié à l’intérieur de l’interrupteur donc les vitesses moteurs appropriés peuvent être définies ainsi que la durée de la commande. À la fin de la fonction, la variable cmdRunning la valeur true et l’heure retournée par la fonction millis est stocké dans la variable cmdStartTime . Cela permet à l’Arduino contrôler l’exécution de la commande tel que décrit ci-dessus. Les temps, en millisecondes, pour chaque commande ont été obtenues comme décrit à l’étape précédente.

Articles Liés

La reconnaissance vocale avec Arduino et serveur BitVoicer

La reconnaissance vocale avec Arduino et serveur BitVoicer

Dans ce Instructable je vais montrer comment utiliser une carte Arduino et BitVoicer serveur pour contrôler quelques LEDs avec commandes vocales. Je vais utiliser le Micro de l'Arduino dans ce Instructable, mais vous pouvez utiliser n'importe quel ca
Ligne de base suivant Robot avec Arduino

Ligne de base suivant Robot avec Arduino

07/09/2015Il a été quelques années puisque nous avons affiché initialement ce Robot suivant ligne de base avec tutorial Arduino, et il semble tellement de gens a jugé utile que nous devrions poster une mise à jour qui se déroule courant Arduino bibli
Contrôle a mené avec Arduino et c#

Contrôle a mené avec Arduino et c#

Bonjour les amis c'est mon premier Arduino Tutorial sur contrôler un programme LED avec Arduino et c#.Vous aurez besoinArduinoRésistance de 1KLEDLogicielArduino Software - www.arduino.ccMicrosoft visual c# / Visual StudioLED est connecté à la broche
Contrôler votre discours avec arduino

Contrôler votre discours avec arduino

Contrôler votre app keynote de mac avec un arduino.Étape 1: Choses nécessaires :Arduino (j'utilise uno, mais tous doivent faire).Câble USB pour l'arduino.IR recevoir diode.Télécommande universelle IR.câbles de démarrage pour le décodeur IR.Etape 2: C
Contrôler un Furby avec Arduino (ou autre microcontrôleur)

Contrôler un Furby avec Arduino (ou autre microcontrôleur)

Le Furby Million de dollars : Nous pouvons reconstruire. Nous disposons de la technologie.Suite de la précédente Instructable où nous excisés cerveau primitif de Furby, il est maintenant temps de le remplacer par quelque chose de plus.Ce Instructable
Faire un Robot avec Arduino pour les débutants

Faire un Robot avec Arduino pour les débutants

Étape 1: Matériaux nécessaires Tamiya piste et roue monté (7,95 $ à Pololu)Kit de boîte de vitesses Double Tamiya 70168 (9,25 $ à Pololu)L298N double pont H (3,65 $ sur Amazon et peut être beaucoup plus faible à ebay)Support de batterie 4AA (utilisé
Extrêmement Simple ligne Robot avec Arduino qui suit

Extrêmement Simple ligne Robot avec Arduino qui suit

Dans ce Instructable, nous allons construire une ligne générique simple suivant arduinobot. Il y aura beaucoup de place à la créativité dans ce Instructable.Le robot, dans ce tutoriel, est propulsé hors de 4 piles AA et est capable de suivre un ruban
Contrôler un Robot avec une télécommande Wii

Contrôler un Robot avec une télécommande Wii

Il s'agit d'un amusant petit projet qui utilise un Pi de framboise, un Robot de Finch et une télécommande Wii (Wiimote AKA), pour montrer certaines des choses que vous pouvez faire avec un pi framboise et/ou une Wii remote. Il utilise Python et la bi
Contrôler un cafard avec Arduino pour moins de 30 $

Contrôler un cafard avec Arduino pour moins de 30 $

Il y a quelques années j'ai vu cafard contrôlé de la basse-cour cerveau smartphone, et il a juste soufflé mon esprit ! J'ai essayé d'obtenir ma mère de me laisser acheter, mais la mention de cafards lui convaincu du contraire. :) J'ai commencé à fair
SainSmart InstaBots Rover verticale (Self Balancing Robot avec Arduino)

SainSmart InstaBots Rover verticale (Self Balancing Robot avec Arduino)

Rover verticale est un robot autonome qui a été conçu par SainSmart. Ils ont fait c'est vraiment simple. Comme vous pouvez le voir, il y a seulement 8 fils sur le robot et 8 sur le contrôleur. Nous allons donc savoir comment cela fonctionne !PIÈCES D
Contrôler votre maison avec Arduino

Contrôler votre maison avec Arduino

Arduino est un excellent outil pour contrôler et chose du sens, c'est pourquoi la plupart des gens l'utiliser, mais il y a un gros hic. Arduino ne peut gérer que des très faibles courants. (Pas plus de 40 ma). C'est ok pour certains projets électroni
Contrôle de moteur avec arduino flasque arrière via Web

Contrôle de moteur avec arduino flasque arrière via Web

Dans ce projet, j'ai contrôle moteur à courant continu (ventilateur d'ordinateur) avec moteur shield(official) via la page Web.Vous pouvez contrôler le moteur comme la vitesse lente ou de vitesse rapide et d'arrêt.Aussi si vous le souhaitez, vous pou
Contrôle LED RGB avec arduino et traitement.

Contrôle LED RGB avec arduino et traitement.

Je vais vous dire aujourd'hui comment contrôler un LED RGB avec l'aide du langage Arduino et traitement. Il s'agit de mon premier instructable alors, s'il vous plaît laissez-moi savoir si je pouvais rien améliorer et si vous avez n'importe quel genre
Obstacle en évitant le Robot avec arduino

Obstacle en évitant le Robot avec arduino

OBSTACLE - ROBOT ÉVITANTUn OBSTACLE évitant ROBOT est celle qui peut éviter un obstacle à l'aide de capteurs ultrasons et naviguer sur son propre chemin. Avec une maquette attachée au robot, vous pouvez jouer fun dans un court laps de temps. C'est ce