Telerobot

(projet démarré le 18 mai 2021)

Humanisons la visioconférence grâce à un avatar élégant.

Avec un photon, des servomoteurs, des leds, du wifi. Juste quelques bases pour le moment…

Interface web : http://lesporteslogiques.net/telerobot/

Code photon tout moche (adapté depuis https://github.com/lesporteslogiques/atelier_ioc_2017/tree/master/mouvement_photon%2Bservo )

telerobot_001.phot (cliquer pour afficher le code)

telerobot_001.phot
#define broche_bouton1    D4
#define broche_bouton2    D5
//servo1 sur              D0
//servo2 sur              D1
 
Servo servo1;
Servo servo2;
 
int position = 0;
 
 
void setup() {
 
    servo1.attach(D0);   
    servo1.write(90);    // test 
    servo2.attach(D1);   
    servo2.write(90);    // test 
 
    pinMode(D7, OUTPUT);  
    pinMode(broche_bouton1, INPUT);
    pinMode(broche_bouton2, INPUT);
 
   Particle.function("alarme", declencherAlarme);  
}
 
int declencherAlarme(String commande) {       
 
    if (commande == "m1gauche") {     
 
        servo1.write(0);       
        digitalWrite(D7, HIGH); 
        delay(1000);             
        servo1.write(90);      
        digitalWrite(D7, LOW);  
 
    } else if (commande == "m1droite") {     
 
        servo1.write(180);       
        digitalWrite(D7, HIGH); 
        delay(1000);             
        servo1.write(90);      
        digitalWrite(D7, LOW);  
 
    } else if (commande == "m2gauche") {     
 
        servo2.write(0);       
        digitalWrite(D7, HIGH); 
        delay(1000);             
        servo2.write(25);      
        digitalWrite(D7, LOW);  
 
    } else if (commande == "m2droite") {     
 
        servo2.write(180);       
        digitalWrite(D7, HIGH); 
        delay(1000);             
        servo2.write(90);      
        digitalWrite(D7, LOW);  
 
    } 
}
 
void loop() {
    if (digitalRead(broche_bouton1) == HIGH) {
        servo1.write(25);       
        digitalWrite(D7, HIGH); 
        delay(100);             
        servo1.write(90);      
        digitalWrite(D7, LOW); 
        delay(500);
    }
    if (digitalRead(broche_bouton2) == HIGH) {
        servo2.write(25);       
        digitalWrite(D7, HIGH); 
        delay(100);             
        servo2.write(90);      
        digitalWrite(D7, LOW);  
        delay(1000);
    } 
}

Peut-être remplacer par ce servo : https://www.dfrobot.com/product-1970.html
Et puis ça ne marche pas, il reçoit une instruction par le web et plante avec D7 allumée fixe, peut-être que 2 moteurs c'est trop de courant pour la broche ViN, solution élégante : en enlever un, ou ajouter une alim externe

À peine mieux, avec un seul servo, ça plante et se bloque aussi, alors trop de courant demandé ou autre raison ? Problème de servomoteur ?

telerobot_002.phot (cliquer pour afficher le code)

telerobot_002.phot
#include <neopixel.h>  // This #include statement was automatically added by the Particle IDE.
 
#define BROCHE_BOUTON1    D4
#define BROCHE_BOUTON2    D5
#define BROCHE_LED        D2
#define BROCHE_SERVO      D0
 
#define PIXEL_COUNT        4
#define PIXEL_TYPE   WS2812B
 
Adafruit_NeoPixel strip(PIXEL_COUNT, BROCHE_LED, PIXEL_TYPE);
 
Servo servo1;
Servo servo2;
 
int position = 0;
 
long compteur = 0;
long last_show = 0;
 
 
void setup() {
 
    //servo1.attach(BROCHE_SERVO);   
    //servo1.write(90);    // test 
 
    pinMode(D7, OUTPUT);  
    pinMode(BROCHE_BOUTON1, INPUT);
    pinMode(BROCHE_BOUTON2, INPUT);
 
    strip.begin();
    strip.show(); 
 
   //Particle.function("alarme", declencherAlarme);  
}
 
 
 
void loop() {
    /*
    if (digitalRead(BROCHE_BOUTON1) == HIGH) {
        servo1.write(25);       
        digitalWrite(D7, HIGH); 
        delay(300);             
        servo1.write(90);      
        digitalWrite(D7, LOW); 
        delay(300);
    }*/
    /*
    if (digitalRead(BROCHE_BOUTON2) == HIGH) {
        servo2.write(25);       
        digitalWrite(D7, HIGH); 
        delay(100);             
        servo2.write(90);      
        digitalWrite(D7, LOW);  
        delay(1000);
    } */
 
 
    if (millis() - last_show > 1000) {
        strip.setPixelColor(0, strip.Color(random(255),  random(255), random(255)));
        strip.setPixelColor(3, strip.Color(random(255),  random(255), random(255)));
        strip.setBrightness(200);
        strip.show();
        last_show = millis();
    }
 
}
/*
int declencherAlarme(String commande) {       
 
    if (commande == "m1gauche") {     
 
        servo1.write(40);       
        digitalWrite(D7, HIGH); 
        delay(600);             
        servo1.write(90);    
        delay(600);  
        digitalWrite(D7, LOW);  
 
    } else if (commande == "m1droite") {     
 
        servo1.write(140);       
        digitalWrite(D7, HIGH); 
        delay(600);             
        servo1.write(90);   
        delay(600);  
        digitalWrite(D7, LOW);  
 
    }
}*/

Petite amélioration quand même, il prend corps : avec des leds pour éclairer les yeux, et un système pour les faire bouger mais foutraque et en plus qui s'autodétruit assez vite.

Mais c'est quand même beaucoup plus joli que https://www.youtube.com/watch?v=XEDgSblMb_4

La prochaine, pour l'instant une todolist

  • résoudre le problème principal
  • des sourcils mobiles le rendraient beaucoup plus expressif
  • cette bouche ne peut pas rester immobile
  • openatelier/projet/telerobot.txt
  • Dernière modification: 2022/06/27 19:37
  • par emoc