EsusRover = Esus board + 4 motors + LiPo battery
EsusRover = Esus board + 4 motors + LiPo battery
Développeur>Tutoriels>Contrôle d’un robot avec un smartphone
Un tutoriel pour contrôler un robot avec l’aide d’un smartphone sous Android.
Voici le programme pour le microcontrôleur ESP8266 :
#include <ESP8266WiFi.h> #include <esusBoard.h> const char* ssid = "yout_SSID"; const char* password = "your_PASSWORD"; // serveur WiFiServer server(80); // adresse IP IPAddress ip(192, 168, 1, 13); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); void setup() { // initialisation de la carte Esus initEsusBoard(); // initialisation du port serie Serial.begin(115200); delay(10); // Connection au reseau wifi Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); WiFi.config(ip, gateway, subnet); // attendre la connexion while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // la carte Esus est connecter au reseau wifi Serial.println(""); Serial.println("WiFi connected"); // Démarrage du serveur server.begin(); Serial.println("Server started"); // Affichage de l'adresse IP sur le port serie Serial.print("Use this URL to connect: "); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.println("/"); } void loop() { // vérification si un client est connecté WiFiClient client = server.available(); // attendre la connexion d'un client while(client != true) { client = server.available(); Serial.println("Attendre client..."); delay(100); } // Un client est connecté Serial.println("new client"); while(!client.available()){ delay(1); } // lecture de la requete du client String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // commande avancer if (request.indexOf("/CMD=FOR") != -1) { Serial.println("forward"); motors1_set(1023,DIR_BACK); motors2_set(1023, DIR_BACK); } // commande reculer if (request.indexOf("/CMD=BAK") != -1) { Serial.println("back"); motors1_set(1023,DIR_FORWARD); motors2_set(1023, DIR_FORWARD); } // commande tourner a droite if (request.indexOf("/CMD=TR") != -1) { Serial.println("turn right"); motors1_set(1023,DIR_BACK); motors2_set(1023, DIR_FORWARD); } // commande tourner a gauche if (request.indexOf("/CMD=TL") != -1) { Serial.println("turn left"); motors1_set(1023,DIR_FORWARD); motors2_set(1023, DIR_BACK); } // commande tourner stop if (request.indexOf("/CMD=STP") != -1) { Serial.println("turn left"); motors1_set(0,DIR_FORWARD); motors2_set(0, DIR_BACK); } Serial.println("Client disonnected"); Serial.println(""); }
const char* ssid = "your_SSID"; const char* password = "your_PASSWORD";
Maintenant, nous allons réaliser l’application Android grâce à App Inventor développé par Google et basée sur une interface graphique similaire à Scratch.
Un petit tutoriel pour allumer une led à une heure exacte avec une carte Raspberry Pi.
Le programme en langage Python3 :
#!/usr/bin/python3 from datetime import datetime import time import RPi.GPIO as GPIO # configuration GPIO 18 GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) GPIO.output(18, GPIO.LOW) # saisir alarme heure_alarme = input("Saisir heure :") heure_alarme = int(heure_alarme) # conversion en nombre minute_alarme = input("Saisir minute :") minute_alarme = int(minute_alarme) while True: date_heure = datetime.now() # heure du système if((date_heure.hour == heure_alarme) and (date_heure.minute == minute_alarme)): GPIO.output(18, GPIO.HIGH) print("LED ALLUMER") exit()
Cet article présente la réalisation d’un LIDAR avec un capteur laser Time-of-Flight (ToF) .
Matériels nécessaire :
Logicielle:
Le servomoteur AX12 est câblé sur la sortie Tx de la carte Esus. Puis le capteur VL53L0X, IO n°2 pour SDA et n°13 pour le signal SDL du bus I2C.
L’alimentation doit être d’au moins 7 Volt pour faire fonctionner le servomoteur. La capteur laser est alimenté par une tension de 3.3V présente sur la carte Esus.
La carte Esus contrôle le servomoteur pour le déplacement d’un angle de 0 à 300° aller-retour. De plus, elle gère l’acquisition de la distance obtenu par le capteur VL53L0X.
Voici le setup :
void setup() { // init serial Serial.begin(9600); // init serial AX12 swSer.begin(1000000); // init I2C Wire.begin(2, 13);//SDA, SCL // init VL53L0X sensor.init(); sensor.setTimeout(500); state = 1; }
La boucle infini :
void loop() { // servomotor control AX12_GoalPosition(0xFE, angle, 1023); // read distance data = sensor.readRangeSingleMillimeters(); // send distance Serial.write(data>>8); Serial.write(data); // send angle Serial.write(angle>>8); Serial.write(angle); // angle between 0 and 300 ° if(( angle <= 300)and(state == 1)) { angle = angle + 1; } else { state = 2; } if(( angle >= 0)and(state == 2)) { angle = angle - 1; } else { state = 1; } delay(5);
Voici le programme complet, ici.
Voici le programme Processing de visualisation :
import processing.serial.*; Serial myPort; String val; int distance_mm, val_old; int angle; float radian; float pox,poy; int x=0; void setup() { size(400, 400); background(255); myPort = new Serial(this, "COM13", 9600); } void draw() { if(myPort.available() >= 4) { val_old = distance_mm; distance_mm = (myPort.read() << 8) | (myPort.read()); print("Val1:"); println(distance_mm); distance_mm = distance_mm/2; angle = (myPort.read() << 8) | (myPort.read()); print("Angle:"); println(angle); myPort.clear(); if(angle <= 45) { angle = angle + 315; } else { angle = angle - 45; } } // conversion degre radian radian = (angle * 3.14)/180; pox = int(cos(radian)*distance_mm); poy = int(sin(radian)*distance_mm); clear(); background(255); stroke(0, 0, 0); // grille line(200,0,200,400); line(0,200,400,200); stroke(255, 0, 0); line(200,200,int(pox)+200,200-int(poy)); }
Un tutoriel pour contrôler deux moteurs à courant continu avec la carte Esus.
Contrôle de deux moteurs
Vous avez besoin :
Attention , le courant maximum de sortie des ponts en H est de 1.2 A !
Ce bornier est relié au composant L293, c’est un double pont en H.
Pour contrôler un moteur avec la carte Esus, il faut utiliser la fonction :
void motors1_set(unsigned int speed, boolean direction); void motors2_set(unsigned int speed, boolean direction);
Un peu d’explication pour ces fonctions:
#include <esusBoard.h>
void setup()
{
// initialisation de la carte Esus
initEsusBoard();
}
void loop()
{
}
void loop()
{
// commande moteur avec la vitesse max
motors1_set(1023, true);
}
void loop()
{
// commande moteur avec la vitesse max
motors1_set(1023, DIR_FORWARD);
motors2_set(1023, DIR_BACK);
}
Réaliser un programme pour faire avancer deux moteurs dans un sens, puis après 2 secondes dans un autre sens. Avec une vitesse de 50% de la vitesse maximum.
Réponse :
void loop() { motors1_set(1023/2, DIR_FORWARD); motors2_set(1023/2, DIR_FORWARD); delay(1000); motors1_set(1023/2, DIR_BACK); motors2_set(1023/2, DIR_BACK); delay(1000); }
Une campagne participative est aujourd’hui lancé pour la carte Esus sur la célèbre plateforme Kickstarter.
La carte Esus est une carte de contrôle de robot mobile ou de projet IoT avec une communication Wifi. De plus, elle est facilement programmable avec l’IDE Arduino.
Vous souhaitez plus d’informations : ici
L’apprentissage des mathématiques avec le robot mobile MRduino avec la programmation graphique (Blockly).
Le premier exemple est le concept de distance.
Cet exemple permet de faire avancer le robot en ligne droite de 20 cm.
“Comment faire avancer MRduino d’une distance de 20 cm ?”
Voici l’algorithme pour faire avancer le robot de 20 cm :
Initialisation du robot MRduino avec l’ajout du bloc “Initialisation robot MRduino” :
Activation du contrôle, pour gérer les distances et les angles.
Appel du bloc “Avancer distance” avec en paramètre le nombre 20, afin d’avancer le robot de 20 cm.
Cette deuxième partie présente les angles géométriques :
“Comment faire tourner MRduino d’un angle de 90° ?”
C’est très simple !
Il faut appeler le bloc “Tourner à gauche degré” avec en paramètre l’angle de 90 °.
Un autre exemple :
Maintenant, place à la réalisation d ‘une forme géométrique avec le robot MRduino :
Exercice n°1 :
Réaliser un carré de 10 cm de coté.
Réponses de l’exercice n°1:
Dans ce tutoriel vous allez créer votre propre modélisation de robot mobile avec l’aide d’un fichier URDF. Ce tutoriel nécessite l’installation de ROS sur Ubuntu.
Système :
Une fois sur Ubuntu, vous pouvez ouvrir un terminal.
La première chose à faire et de créer votre workspace pour la création de votre robot.
$ mkdir -p ~/MyRobot_ws/src $ cd ~/MyRobot_ws/src
$ catkin_init_workspace
$ cd ~/MyRobot_ws/src $ catkin_create_pkg MyRobot
Maintenant que votre environnement est près vous pouvez crée la modélisation du robot.
Cette partie va vous permettre de réaliser la modélisation du petit robot mobile de type différentielle :
$ gedit ~/MyRobot_ws/src/MyRobot/MyRobot.urdf
<?xml version="1.0"?>
<robot name="MyRobot">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.035" radius="0.05"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
</robot>
$ roslaunch urdf_tutorial display.launch model:=MyRobot.urdf
<link name="right_wheel"> <visual> <geometry> <cylinder length="0.005" radius="0.016"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> </link>
<joint name="right_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="right_wheel"/> <origin rpy="0 -1.5708 0" xyz="0.05 0 -0.0105"/> </joint>
<link name="left_wheel"> <visual> <geometry> <cylinder length="0.005" radius="0.016"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> </link>
<joint name="left_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="left_wheel"/> <origin rpy="0 -1.5708 0" xyz="-0.05 0 -0.0105"/> </joint>
$ roslaunch urdf_tutorial display.launch model:=MyRobot.urdf
Avec Rviz vous pouvez visualiser le robot avec les deux roues.
<link name="caster_wheel"> <visual> <geometry> <sphere radius="0.0045"/> </geometry> <material name="black"/> </visual> </link>
<joint name="caster_wheel_joint" type="fixed"> <parent link="base_link"/> <child link="caster_wheel"/> <origin rpy="0 0 0" xyz="0 0.025 -0.022"/> </joint>
$ roslaunch urdf_tutorial display.launch model:=MyRobot.urdf
Fin de la partie n°1.
Dans ce tutorial vous allez apprendre à programmer le robot MRPi1 en langage C.
https://github.com/macerobotics/MRPi1/tree/master/Software/C
Transférer les fichiers avec FileZilla.
cd /home/pi/Descktop/MR_Projects/C/header
cd /home/pi/Descktop/MR_Projects/C/sources
Voici un petit programme ‘main.c‘ :
#include "MRPi1.h" int main(int argc, char* argv[]) { // initialisation du robot MRPi1 init(); printf("Hello MRPi1\n"); // Allumer les leds du robot MRPi1 led(1,1); led(2,1); led(3,1); }
>> cd /home/pi/Desktop/MR_Projects/C >> gcc sources/*.c -I header -o Hello_MRPi1
>> ./Hello_MRPi1
Les 3 leds du robot MRPi1 doivent s’allumer.
Voici un exemple de programme pour gérer les déplacements du robot MRPi1.
#include "MRPi1.h" int main(int argc, char* argv[]) { // Initialisation du robot MRPi1 init(); // avancer avec une vitesse de 10% sur une distance de 150 mm forward_mm(10, 150); // pause de 2 secondes sleep(2); // tourner a droite turnRight(30); // pause de 4 secondes sleep(4); // arret du robot stop(); }
Ce petit programme permet :
Dans ce tutorial vous allez apprendre à connecter le robot MRPi1 à Internet. Par défaut le robot MRPi1 est configuré en point d’accès, une configuration pour se connecter à votre réseau est donc nécessaire.
$ sudo nano /etc/network/interfaces
Modifier ce fichier pour qu’il ressemble à ceci :
sudo nano /etc/default/hostapd
La ligne devient donc :
sudo nano /etc/rc.local
ifconfig wlan0 192.168.42.1
etc/init.d/isc-dhcp-server start
Le fichier devient donc :
Maintenant, vous pouvez redémarrer le système pour la prise en compte des modifications :
sudo reboot
Voilà, votre robot peut se connecter à votre box internet. Une adresse IP va lui être affecter automatiquement. Pour connaitre cette adresse pour pouvez utiliser le logiciel Advanced IP Scanner.