
Posted On: juin 24, 2021
Seen by: 3260
Categories: ROBOTS
Author: Christian Joseph
Tags: bras robot , cassiopée , assistant vocal , arduino , bras robot 6 axes , commande vocale
Les assistants vocaux tels que OK GOOGLE pour le communs des mortels, SIRI pour les gens de l'iphonHaute (vous savez ceux qui se déplacent avec l'auriculaire levé!), ou encore ALEXA sont devenus des éléments essentiels de notre quotidien. Ils peuvent allumer le lumière, trouver une recette, annoncer la météo, ou encore jouer votre playlist préférée...Mais pour l'instant CASSIOPÉE notre assistante vocale avec son module XY5300 va se contenter de contrôler 2 Bras robots 6axes, et plus tard peut-être contrôler le Monde...
Trouver un nom est très essentiel pour le développement de votre assistant vocal. Tout comme le nom d'un produit ou d'une voiture est essentiel pour rendre cet objet vendeur. Bien! si cela ne vous convainc toujours pas alors imaginer que vous devez donner un nom à votre enfant.
J'avais plutôt un faible pour MARIE-CUNÉGONDE mais nous avons opté pour CASSIOPÉE comme la constellation!
Comme CASSIOPÉE est de type féminin, nous avons donc opté pour une voix féminine. Après libre à vous d'appeler votre assistant CERBERE et de lui donner une voix très féminine. (Après tout pourquoi pas!)
Ou encore CHARLOTTE mais avec une voix de Biker bien viril (Attention à ne surtout pas contrarier CHARLOTTE!)
Anyway, Le choix vous appartient.
Pour entendre la magnifique voix de CASSIOPÉE, nous allons utiliser le YX5300 qui est un module MP3 compatible arduino et doté d'un connecteur pour carte micro SD et d'un connecteur pour écouteurs ou Haut-parleurs.
Comme vous l'avez compris nous allons utiliser le YX5300 pour donner une voix à notre assistant vocal, encore faudrait qu'il sache quoi dire.
En effet l'assistant vocal réagit en fonction des requêtes des utilisateurs. En clair: UNE QUESTION = UNE REPONSE.
A la question de l'utilisateur comme par exemple : "Bonjour comment vas-tu?", l'assistant vocal répond: "Je vais bien merci, Et vous?". Vous allez donc devoir créer un tas de questions/réponses pour communiquer avec votre assistant vocal.
En vérité tous les assistants vocaux fonctionnent sur le même principe et disposent en réalité de banques de données de questions/réponses qui sont alimentées chaque jour par les entreprises qui gèrent ces assistant vocaux. Vous pouvez par exemple poser une question à "OK GOOGLE" concernant la composition de la comète supposée frôler la terre dans 2 mois, il pourrait botter en touche, mais reposez lui la même question 1 mois plus tard et il pourra vous donner toutes les infos possible sur cette fameuse comète. En réalité il se sert des données que l'on met à sa disposition, notamment grâce à son puissant moteur de recherche GOOGLE pour répondre aux questions/requêtes qu'on lui pose.
Nous allons d'abord créer les répliques de notre assistant vocal, et nous aborderons les questions plus tard.
Pour les répliques nous allons utiliser un site permettant de faire du text-to-speech vers mp3.
Mais avant, je vais répondre à votre brillante question: "Qu'est ce que le Text-To-Speech?" .
Et bien le Text-To-Speech comme son nom l'indique, est une technique qui permet à un appareil tel qu'un ordinateur par exemple de lire de manière audible un texte écrit sur le bloc note par exemple.
Nous avons donc besoin d'un outil sur lequel nous allons écrire les répliques de notre assistant vocal, et lequel va nous les retranscrire de manière orale et surtout au format MP3 (Pour notre bon YX5300).
Il existe une multitude de sites internet proposant ce service, dont un que j'affectionne tout particulièrement et qui nous a été utile pour créer les répliques de CASSIOPÉE (LÉA sur leur site): https://freetts.com
Sur ce site vous avez la possibilité de créer et télécharger vos répliques au format MP3 en de nombreuses langues et sur des voix différentes.
Nous allons utiliser une Carte SHIELD MEGA V3.2 pour les questions. En effet c'est cette carte qui va gérer les questions et les réponses. Mais petite question tout de même: "Comment est-on supposer envoyer les questions à notre assistant vocal?"
N'ayez craintes gens de peu de foi! Nous avons développé une application Android présente sur notre site internet et qui utilise la fonction "OK GOOGLE" de votre smartphone. L'application fait ce que l'on appelle du Speech-To-Text (l'inverse du Text-To-Speech) et transforme votre voix et donc vos questions en texte qu'elle envoi à la carte SHIELD MEGA V3.2 via le Bluetooth.
Dans notre programme Arduino, nous allons comparer les phrases que nous recevons de l'application avec ce que notre assistant vocal sait déjà. Et dans le cas où notre assistant vocal est incapable de répondre, nous avons programmé une réponse comme "Je suis désolé je n'ai pas compris votre requête".
Avant d'aller plus loin dans le jeu de questions/réponses, nous allons d'abord voir l'environnement que votre assistant vocal va maîtriser.
En ce qui concerne CASSIOPEE nous avons créer un environnement avec 2 Bras robots 6 axes avec une pince spéciale pour la circonstance , 3 supports pour bols (1 pour les chips, 1 pour des biscuits apéritifs, et 1 pour des bonbons), et 4 supports pour les boissons. Les supports ont été réalisés avec une imprimante 3D et fixés sur une planche en bois de 1200 x 800 mm.
La première étape consistera à fixer votre ou vos Bras robots 6 axes sur la planche en bois à l'aide de vis standard que vous pouvez trouver dans le commerce. Pour ce qui est du montage du Bras robot, ça se passe par ici.
Pour ce qui concerne la connexion de la carte Arduino Mega avec le XY5300 et le module Bluetooth:
Arduino Mega | 5V | GND | TX1 | RX1 | TX2 | RX2 |
YX5300 / YX6300 | VCC | GND | RX | TX | ||
Bluetooth HC05 ou HC06 | VCC | GND | RXD | TXD |
Une fois le(s) bras robot(s) monté(s) et installé(s), vous allez fixer le reste des éléments en fonction du ou des Bras robots.
En ce qui concerne la partie programmation, nous avons procédé par étapes successives jusqu'à obtenir le bon résultat afin que le bras robot de gauche puisse saisir le contenu de chaque bol et celui de droite chaque bouteille.
Nous avons donc créer un sous-programme pour chaque élément de notre environnement, avec par exemple le sous-programme "coca" qui déplace le bras robot vers la bouteille de coca, la saisit, la soulève, sert un verre, puis repose la bouteille.
Cela est rendu possible grâce à la fonctions "softmove" qui permet de faire bouger un servomoteur doucement d'un angle de départ A vers un angle final B, et la fonction "Multimove" qui permet de faire la même chose que Softmove mais avec 2 servomoteurs. Ces 2 fonctions vous éviterons de voir votre bras robot bouger de manière rapide, voir un peu brutale, là où au contraire nous avons besoin de douceur. Si par exemple votre servomoteur est à 90° et que vous voulez le faire aller jusqu'à 120°, et bien en faisant juste monServo.write(120) vous allez voir votre servomoteur bouger rapidement de 90° vers cette valeur 120° en l'espace d'à peine une seconde.
Cela n'est pas du tout pratique si vous devez saisir une bouteille avec votre bras et il y aura probablement un problème de précision. certaines actions que nous effectuons nous-mêmes avec nos bras demandent de la rapidité (ex:un batteur dans un groupe de Heavy Metal), mais d'autres demande de la précision, de la lenteur dans le geste( ex: un chirugien qui opère). Donc ces fonctions vous serons très utiles dans le développement de votre environnement. Vous pouvez retrouver les fonctions SOFTMOVE-MULTIMOVE dans notre article de Blog dédié à ces fonctions.
Vous devez apprendre à décomposer les mouvements de votre Bras robot du genre:
Pour toutes ces actions, vous allez devoir jouer avec les fonctions Softmove et Multimove en modifiant au besoin votre valeur d'arrivée de chaque servomoteur jusqu'à obtenir le bon résultat (Eh oui il n'y a pas de formule miracle!)
Le Résultat que vous voyez dans la vidéo suivante à été obtenu de la même manière par des approches successives jusqu'à obtenir le bon résultat: https://www.youtube.com/watch?v=FVBM9PFW9SE
#include "Servo.h"
byte ZERO = 0x00;
String voice;//Notre voix transformée en Texte
Servo p[13];
int a, b, c, d;
int mvt, mvt1;
int vit = 20;
void setup() {
Serial1.begin(9600);//Bluetooth
Serial2.begin(9600);//Module MP3 YX5300
//Bras Robot gauche
p[1].attach(2); //Base - Servo 1
p[2].attach(3);
p[3].attach(4);
p[4].attach(5);
p[5].attach(6);
p[6].attach(7); // Pince - Servo 6
//Bras Robot droit
p[7].attach(8); // Base - Servo 1
p[8].attach(9);
p[9].attach(10);
p[10].attach(22);
p[11].attach(24);
p[12].attach(26);// Pince - Servo 6
b = 0x03;
stand_g();//Bras Robot gauche
stand_d();//Bras Robot droit
}
void loop() {
if(Serial1.available()) {
voice = Serial1.readString();
}
if (voice.length() > 0) {
if (voice == "comment tu t'appelles" || voice == "tu t'appelles comment" || voice == "quel est ton nom" || voice == "c'est quoi ton nom")
{
voice="";
b = 0x03; //03
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "Cassiopée tu as une belle voix"||voice == "Tu as une très belle voix"||voice == "Cassiopée tu as une très belle voix" || voice == "J'aime beaucoup ta voix")
{
voice="";
//droite();
b = 0x04;
playsoundindex();//Réponse de l'assistant
delay(5000);
b = 0x09;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "non c'est bon"||voice == "non ça va"||voice == "non non tout va bien")
{
voice="";
b = 0x0B;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "merci"||voice == "merci Cassiopée"||voice == "merci beaucoup" ||voice == "muchas gracias")
{
voice="";
b = 0x10;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "Cassiopée chante une chanson s'il te plaît"||voice == "chante-moi une chanson s'il te plaît"||voice == "Cassiopée chante s'il te plaît")
{
voice="";
b = 0x08;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "Cassiopée tu es insolente"||voice == "tu es insolente"||voice == "Cassiopée tu es vraiment insolente" ||voice == "tu es insolente Cassiopée")
{
voice="";
b = 0x0F;
playsoundindex();//Réponse de l'assistant
delay(5000);
b = 0x11;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
else if (voice == "Cassiopée sers-moi des chips s'il te plaît"||voice == "Cassiopée donne-moi des chips s'il te plaît"||voice == "Cassiopée des chips s'il te plaît" )
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
chips();
}
else if (voice == "Cassiopée sers-moi des chips"||voice == "Cassiopée donne-moi des chips"||voice == "Cassiopée des chips" ||voice == "Cassiopée donne-moi des bsicuits" ||voice == "Cassiopée des biscuits" ||voice == "Cassiopée sers-moi des biscuits")
{
voice="";
b = 0x01;
playsoundindex();//Réponse de l'assistant
}
else if (voice == "Cassiopée sers-moi des bonbons"||voice == "Cassiopée donne-moi des bonbons"||voice == "Cassiopée des bonbons" ||voice == "Cassiopée du coca" ||voice == "Cassiopée donne-moi du coca" ||voice == "Cassiopée sers-moi du coca")
{
voice="";
b = 0x01;
playsoundindex();//Réponse de l'assistant
}
else if (voice == "Cassiopée sers-moi de l'eau"||voice == "Cassiopée donne-moi de l'eau"||voice == "Cassiopée de l'eau" ||voice == "Cassiopée du jus" ||voice == "Cassiopée donne-moi du jus" ||voice == "Cassiopée sers-moi du jus")
{
voice="";
b = 0x01;
playsoundindex();//Réponse de l'assistant
}
else if (voice == "Cassiopée sers-moi de l'oasis"||voice == "Cassiopée donne-moi de l'oasis"||voice == "Cassiopée de l'oasis")
{
voice="";
b = 0x01;
playsoundindex();//Réponse de l'assistant
}
else if (voice == "Cassiopée sers-moi des biscuits s'il te plaît"||voice == "Cassiopée donne-moi des biscuits s'il te plaît"||voice == "Cassiopée des biscuits s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
biscuit();
}
else if (voice == "Cassiopée sers-moi des bonbons s'il te plaît"||voice == "Cassiopée donne-moi des bonbons s'il te plaît"||voice == "Cassiopée des bonbons s'il te plaît"||voice == "Cassiopée sers-moi des bonbons s'il te plaît"||voice == "Cassiopée donne-moi des bonbons s'il te plaît"||voice == "Cassiopée des bonbons s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
bonbons();
}
else if (voice == "Cassiopée sers-moi du coca s'il te plaît"||voice == "Cassiopée donne-moi du coca s'il te plaît"||voice == "Cassiopée du coca s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
coca();
}
else if (voice == "Cassiopée sers-moi du jus s'il te plaît"||voice == "Cassiopée donne-moi du jus s'il te plaît"||voice == "Cassiopée du jus s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
jus();
}
else if (voice == "Cassiopée sers-moi de l'eau s'il te plaît"||voice == "Cassiopée donne-moi de l'eau s'il te plaît"||voice == "Cassiopée de l'eau s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
eau();
}
else if (voice == "Cassiopée sers-moi de l'oasis s'il te plaît"||voice == "Cassiopée donne-moi de l'oasis s'il te plaît"||voice == "Cassiopée de l'oasis s'il te plaît")
{
voice="";
b = 0x0A;
playsoundindex();//Réponse de l'assistant
delay(3000);
oasis();
}
else{
voice ="";
b = 0x0C;
playsoundindex();//Réponse de l'assistant
delay(5000);
}
}
}
void playsoundindex()
{
Serial2.write(0x7E);
Serial2.write(0xFF);
Serial2.write(0x06);
Serial2.write(0x03);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(b); //Selection du Fichier MP3 à Lire
Serial2.write(0xEF);
}
void stand_g(){ // Position de départ et d'attente du bras gauche
delay(500);
p[1].write(90);// Base
delay(500);
p[2].write(90);
delay(500);
p[3].write(90);
delay(500);
p[4].write(90);
delay(500);
p[5].write(18);
delay(500);
p[6].write(100);// Pince
delay(500);
}
void stand_d(){ // Position de départ et d'attente du bras droit
delay(100);
p[7].write(95); //Base
delay(500);
p[8].write(90);
delay(500);
p[9].write(0);//160
delay(100);
p[10].write(130);
delay(100);
p[11].write(172);
delay(100);
p[12].write(140); //Pince
delay(100);
}
void chips(){
softmove(1,90,55); //Le Bras se déplace vers la gauche
multimove(2,90,110,3,90,130); // Le Bras se baisse
delay(500);
softmove(2,110,55);
softmove(6,100,160); //Le Bras prend des chips
multimove(2,65,90,3,130,90); // Le Bras remonte
softmove(1,55,90); // Le Bras revient au centre
multimove(2,90,50,4,90,60); //Le Bras se baisse vers l'assiette
softmove(6,160,100); // La Pince s'ouvre pour servir les chips
multimove(2,50,100,4,60,90); //Le Bras remonte et retourne dans sa position d'attente
}
void biscuit(){
softmove(1,90,92);
multimove(2,90,110,3,90,145);
delay(500);
softmove(2,110,65);
softmove(6,90,160);
multimove(2,65,90,3,145,90);
softmove(1,92,90);
multimove(2,90,50,4,90,60);
softmove(6,160,90);
multimove(2,50,100,4,60,90);
}
void bonbons(){
softmove(1,90,130);
multimove(2,90,110,3,90,120);
delay(500);
softmove(2,110,55);
softmove(6,90,160);
multimove(2,55,90,3,120,90);
softmove(1,130,85);
multimove(2,90,50,4,90,60);
softmove(6,160,90);
multimove(2,50,100,4,60,90);
}
void jus(){
softmove(7,95,46);
multimove(9,0,125,10,130,5);
softmove(8,90,80);
softmove(12,140,170);
multimove(9,120,0,10,5,130);
softmove(8,80,105);
softmove(7,46,80);
softmove(11,175,40);
softmove(11,40,175);
softmove(7,80,46);
softmove(8,105,80);
multimove(9,0,125,10,130,5);
softmove(12,170,140);
softmove(8,80,90);
multimove(9,120,0,10,5,130);
softmove(7,46,95);
}
void coca(){
softmove(7,95,70);
multimove(9,0,115,10,130,5);
softmove(8,90,75);
softmove(12,140,175);
multimove(9,115,0,10,5,130);
softmove(11,175,40);
softmove(11,40,175);
multimove(9,0,115,10,130,5);
softmove(8,90,75);
softmove(12,175,140);
softmove(8,75,90);
multimove(9,115,0,10,5,130);
softmove(7,72,95);
}
void eau(){
softmove(7,95,147);
multimove(9,0,120,10,130,5);
softmove(8,90,80);
softmove(12,140,170);
multimove(9,115,0,10,5,130);
softmove(8,80,105);
softmove(7,150,95);
softmove(11,172,40);
softmove(11,40,172);
softmove(7,95,147);
softmove(8,105,80);
multimove(9,0,120,10,130,5);
softmove(12,170,140);
softmove(8,80,90);
multimove(9,120,0,10,5,130);
softmove(7,150,95);
}
void oasis(){
softmove(7,95,125);
multimove(9,0,115,10,130,5);
softmove(8,90,75);
softmove(12,140,175);
multimove(9,115,0,10,5,130);
softmove(8,75,105);
softmove(7,125,95);
softmove(11,175,40);
softmove(11,40,175);
softmove(7,95,125);
softmove(8,105,75);
multimove(9,0,115,10,130,5);
softmove(12,175,140);
softmove(8,75,90);
multimove(9,115,0,10,5,130);
softmove(7,125,95);
}
//Softmove:Déplacement lent d'un servomoteur
int softmove(int ser,int pos1, int pos2){
if(pos1 < pos2){
while(pos1 < pos2){
pos1 = pos1 +1;
p[ser].write(pos1);
delay(vit);
Serial.println(pos1);
}
}
else if (pos1 > pos2){
while(pos1 > pos2){
pos1 = pos1 -1;
p[ser].write(pos1);
delay(vit);
Serial.println(pos1);
}
}
}
//Multimove: Déplacement lent de 2 servomoteurs en même temps
int multimove(int ser1, int pos11, int pos12, int ser2, int pos21, int pos22){
if(pos11 < pos12 && pos21 < pos22){
a = pos12 - pos11;
b = pos22 - pos21;
if(a > b){
c = a - b;
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21++;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser1].write(pos11);
pos11++;
delay(vit);
}
}
else if(a < b){
c = b - a;
for(mvt = 0; mvt < a; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21++;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser2].write(pos21);
pos21++;
delay(vit);
}
}
else {
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21++;
delay(vit);
}
}
}
else if(pos11 < pos12 && pos21 > pos22){
a = pos12 - pos11;
b = pos21 - pos22;
if(a > b){
c = a - b;
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21--;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser1].write(pos11);
pos11++;
delay(vit);
}
}
else if(a < b){
c = b - a;
for(mvt = 0; mvt < a; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21--;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser2].write(pos21);
pos21--;
delay(vit);
}
}
else {
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11++;
pos21--;
delay(vit);
}
}
}
if(pos11 > pos12 && pos21 < pos22){
a = pos11 - pos12;
b = pos22 - pos21;
if(a > b){
c = a - b;
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21++;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser1].write(pos11);
pos11--;
delay(vit);
}
}
else if(a < b){
c = b - a;
for(mvt = 0; mvt < a; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21++;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser2].write(pos21);
pos21++;
delay(vit);
}
}
else {
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21++;
delay(vit);
}
}
}
if(pos11 > pos12 && pos21 > pos22){
a = pos11 - pos12;
b = pos21 - pos22;
if(a > b){
c = a - b;
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21--;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser1].write(pos11);
pos11--;
delay(vit);
}
}
else if(a < b){
c = b - a;
for(mvt = 0; mvt < a; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21--;
delay(vit);
}
for(mvt1 = 0; mvt1 < c; mvt1++){
p[ser2].write(pos21);
pos21--;
delay(vit);
}
}
else {
for(mvt = 0; mvt < b; mvt++){
p[ser1].write(pos11);
p[ser2].write(pos21);
pos11--;
pos21--;
delay(vit);
}
}
}
}
Pour toute demande d'aide, sur un montage ou une programmation sur mesure, veuillez nous faire signe à projet@eagle-robotics.com, et nous vous accompagnerons avec joie dans votre projet.