6-Achsen Roboterarm mit ATMega328 und Servomotoren

Cet article nous a été envoyé par notre auteur invité Miguel Torres Gordo. Nous vous souhaitons beaucoup de plaisir à le lire et à le reproduire :

J'ai toujours été fasciné par les mouvements des bras des robots lorsqu'ils effectuent toutes sortes de tâches. Leurs mouvements sont précis et continus, comme si j'assistais à un cours de danse. Ces robots industriels disposent de moteurs puissants et de circuits électroniques spéciaux pour contrôler les mouvements selon des coordonnées programmées. Serait-il possible de construire un petit bras robotisé avec des modules et des composants électroniques simples ?

Le principal problème est le poids de la structure du bras robotique et des actionneurs qui doivent le déplacer. Idéalement, la structure devrait être en métal et les actionneurs devraient être des moteurs pas à pas, mais cet ensemble est lourd et coûteux. La question est la suivante : serait-il possible de le faire avec des servomoteurs ?

Il faut chercher un matériau qui ne soit pas très lourd et peu coûteux. Pour les incrustations (travaux de marqueterie), on utilise du balsa, qui n'est pas lourd mais résistant. Ainsi, il est possible que les servomoteurs déplacent l'ensemble, l'électronique pour la commande y étant déjà intégrée. Nous allons développer un bras robotisé qui prend les pièces avec une pince et les dépose à un autre endroit.

Les matériaux nécessaires pour ce projet sont

Le logiciel requis est :

La première étape consiste à concevoir la structure de notre bras robotique en balsa de 3mm d'épaisseur. Pour que les différentes pièces de notre robot puissent supporter le poids de la pièce suivante, nous devons augmenter l'épaisseur de ces pièces en collant plusieurs morceaux identiques (le poids n'augmente pas beaucoup, comme vous le remarquerez). Pour soutenir les mouvements des servomoteurs, on doit équilibrer un peu le poids des bras, en tenant compte du poids du bras à l'autre extrémité.

Plan à télécharger

Pour le fonctionnement de notre bras robotisé, il est très important de connaître les données de largeur d'impulsion des servomoteurs afin de pouvoir positionner l'angle minimal et maximal avec les sketches de réglage et d'amener le bras robotisé dans la position souhaitée. Selon la fiche technique, le servomoteur MG995 tourne à 120 degrés, tandis que les servomoteurs MG90S et SG90 tournent à 180 degrés. Pour déterminer les données de largeur d'impulsion nécessaires, nous utilisons les sketches Servo_check_120_degrees_slow_motion.ino et Servo_check_180_degrees.ino et un rapporteur, comme indiqué sur le dessin.

Les deux sketchs sont très similaires, c'est pourquoi nous allons expliquer les lignes les plus importantes d'un des deux sketchs. Les lignes suivantes font partie du croquis des servomoteurs MG995. Les deux premières lignes que nous analysons sont les valeurs minimales et maximales de la largeur d'impulsion pour chaque servomoteur, qui correspondent aux positions 0 degré et 180 degrés.

 #define SERVOMIN 100         // This is the 'minimum' pulse length count (out of 4096)
 #define SERVOMAX 500         // This is the 'maximum' pulse length count (out of 4096)

Dans les lignes suivantes, on crée deux boucles dans lesquelles on doit modifier les données marquées en rouge pour positionner le servomoteur entre 30 degrés et 150 degrés. Dans ce cas, on obtient les 120 degrés avec lesquels le MG995 travaille.
Le mouvement se fait lentement avec 10 "pas" toutes les 50 millisecondes de 30 degrés à 150 degrés. On doit effectuer ces procédures avec tous les servomoteurs que nous allons utiliser et noter les valeurs correspondantes pour chacun d'entre eux, car ce sont les valeurs entre lesquelles il travaille pour se positionner.

for (int pos=165pos<430pos +=10) {       // Loop with movement slow from 30
  degrees to 150 degrees
  pwm.setPWM(00pos );
  Serial.println("165 pulse length count --> 30 degrees");
  delay(50);
}
delay (5000);

for (int pos_m=430pos_m>165pos_m -=10) {   // Loop with movement slow from 150
  degrees to 30 degrees
  pwm.setPWM(00pos_m );
  Serial.println("430 pulse length count --> 150 degrees");
  delay(50);
}
delay (5000);

Montage

Une fois que nous avons les valeurs d'impulsion minimale et maximale pour l'angle de travail minimal et maximal de chaque servomoteur, il est temps de tout assembler. Pour réaliser correctement l'assemblage, vous pouvez procéder comme suit :

    1. on commence le montage sur le préhenseur, celui-ci étant fermé et le servomoteur tourné de 90 degrés.

    2. le servomoteur suivant est le numéro 1, avec la position à 0 degré et la pince dans la position que l'on voit sur la photo, car la rotation de 180 degrés se fait dans le sens des aiguilles d'une montre.

    3. le troisième servomoteur est le numéro 2, qui, comme le précédent, se trouve en position 0 degré et déplace le préhenseur verticalement vers le haut, car il tourne également dans le sens des aiguilles d'une montre pour se déplacer vers 180 degrés.

    4. c'est maintenant le tour du servomoteur numéro 3, on laisse dans ce cas la position du servomoteur à 90 degrés et on monte le bras en ligne avec le suivant, car on a ainsi 60 degrés de mouvement dans chaque direction.

    5. pour le servomoteur numéro 4, on laisse la position à 90 degrés et on monte le bras horizontalement (parallèlement au sol), ce qui nous donne, comme pour le servomoteur précédent, un grand rayon d'action de 60 degrés dans chaque direction.

    6. on laisse le dernier servomoteur, numéro 5, à 90 degrés, comme le précédent, et on monte la plateforme tournante de façon à ce que le reste du bras soit au milieu du bord latéral de la base.

    Circuit et description du fonctionnement

    Comme tu peux le voir sur le schéma électrique, le circuit est très simple. Nous avons le microcontrôleur, le module PCA9685 et les 6 servomoteurs.

    Les connexions électriques des servomoteurs au module PCA9685 sont reliées au numéro du port de sortie PWM correspondant sur le module, en fonction de la numérotation du servomoteur, c'est-à-dire que le servomoteur numéro 0 est relié au port de sortie 0.

    L'alimentation en courant continu de 5V est connectée au connecteur à vis vert de la carte pilote, en faisant attention à la polarité, car les servomoteurs sont alimentés par cette connexion.

    Les connexions entre le microcontrôleur Atmega328P et le module PCA9685 sont la communication I2C via son port et les 5V pour l'alimentation de l'électronique du module.

    Les six servomoteurs sont contrôlés par le microcontrôleur Atmega328P via le module PCA9685, qui a deux fonctions importantes. La première consiste à alimenter les servomoteurs en 5V à partir d'une alimentation externe suffisamment puissante pour déplacer les 6 servomoteurs simultanément. La seconde consiste à envoyer à chaque servomoteur le signal PWM transmis par le microcontrôleur via le signal I2C. Comme on peut le voir sur le schéma ci-dessus, nous n'avons besoin que de 2 broches pour la communication entre le microcontrôleur et le module PCA9685, les autres broches étant laissées pour d'autres utilisations.

    La partie vraiment pénible de ce projet est le réglage des valeurs pour chaque position du bras et des vitesses des mouvements. Ce dernier doit être plus lent si le bras doit ramasser un objet.

    Pour le réglage et le mouvement du bras du robot à chaque étape, un sketch a été créé pour chaque étape. Cela permet d'effectuer les réglages individuellement. Une fois que nous aurons effectué tous les réglages correctement, nous les regrouperons tous dans un seul sketch. Pour ce faire, nous utiliserons des méthodes/fonctions, de sorte que le code soit plus propre et plus facile à suivre. Analysez le code pour un niveau et vous verrez qu'il est très simple. Pour les autres niveaux, la méthode d'adaptation est similaire.

    Le code que nous allons analyser est le paramétrage du bras robotique pour prendre la première pièce. Le sketch s'appelle pick_up_first_object.ino.

    Les deux premières lignes de code sont les bibliothèques dont nous avons besoin pour que le sketch fonctionne correctement. Wire.h est responsable de la communication I2C et Adafruit_PWMServoDriver est responsable de l'utilisation du module PCA9685.

    #include <Wire.h>

    #include <Adafruit_PWMServoDriver.h>


    Les 4 lignes suivantes sont, dans l'ordre, l'implémentation d'un objet Adafruit_PWMServoDriver pour contrôler les positions des servomoteurs, SERVOMIN et SERVOMAX sont les valeurs du front montant et du front descendant pour la position 0 degré et 180 degrés des servomoteurs respectivement. La variable de vitesse est utilisée pour le temps d'attente avant le mouvement du servomoteur suivant.

    Adafruit_PWMServoDriver pca9685 = Adafruit_PWMServoDriver();


    #define SERVOMIN  100             

    #define SERVOMAX  500            


    int velocidad = 450;


    Les 4 lignes suivantes sont, dans l'ordre, l'implémentation d'un objet Adafruit_PWMServoDriver pour contrôler les positions des servomoteurs, SERVOMIN et SERVOMAX sont les valeurs du front montant et du front descendant pour la position 0 degré et 180 degrés des servomoteurs respectivement. La variable de vitesse est utilisée pour le temps d'attente avant le mouvement du prochain servomoteur. Dans la méthode setup(), nous initialisons le moniteur série et émettons un message. Dans les deux lignes suivantes, nous initialisons le module PCA9685 à l'aide de son objet précédemment implémenté et indiquons la fréquence à laquelle les servomoteurs fonctionnent, à savoir 50 Hz.

    Dans la méthode setup()-, nous initialisons le moniteur série et affichons un message. Dans les deux lignes suivantes, nous initialisons le module PCA9685 à l'aide de son objet précédemment implémenté et indiquons la fréquence à laquelle les servomoteurs fonctionnent, à savoir 50 Hz.

    void setup() {

       Serial.println("Ajusting to Pick up first object");


       pca9685.begin();

       pca9685.setPWMFreq(50);


    }


    Nous mettons maintenant en œuvre la (loop)-méthode. Nous commençons ici par les réglages de chacun des servomoteurs qui doivent agir pour exécuter le mouvement. Nous commençons par le premier servomoteur que nous voulons déplacer. Le servomoteur 5 est celui qui fait tourner le bras du robot. Avec la fonction pca9685.setPWM(5, 0, 350), on indique au module PCA9685 qu'il doit déplacer le moteur 5 dans la position résultant de la soustraction de la valeur du front montant (0) du front descendant (350) et, avec la fonction delay(velocidad ), nous attendons 450 millisecondes pour exécuter la prochaine fonction du servomoteur suivant.

    void loop() {

     

           // Servomotor 5

           pca9685.setPWM(5, 0, 350);

           delay(velocidad);


    Les deux appels de fonction suivants exécutent les mouvements des servomoteurs 4 et 2. L'exécution est similaire à celle de la fonction précédente, d'abord déplacer le servomoteur 4, attendre 450 millisecondes et après ce temps, déplacer le servomoteur 2 à la position de la différence entre le front montant et le front descendant.

           // Servomotor 4

           pca9685.setPWM(4, 0, 210);

           delay(velocidad);


           // Servomotor 2

           ca9685.setPWM(2, 0, 405);

           delay(velocidad);


    Les deux fonctions suivantes exécutent les mouvements des servomoteurs 3 et 2. Expliquons pourquoi nous avons implémenté des boucles pour cela. Le mouvement des servomoteurs précédents se fait à la vitesse normale, qui est très abrupte. Pour donner la sensation d'une vitesse lente, nous avons implémenté une boucle dans laquelle le servomoteur se déplace d'un "pas" toutes les 10 millisecondes depuis la position de départ (150) de la variable pos jusqu'à sa position finale (180) du servomoteur 3. Le mouvement réel est un mouvement intermittent, mais comme le temps d'attente entre chaque mouvement n'est que de 10 millisecondes, le mouvement donne une sensation de continuité à faible vitesse. Comme le mouvement est ainsi lisse, il nous aide à obtenir une bonne précision.

      // Servomotor 3

           for (int pos=150; pos<180; pos +=1) {

               pca9685.setPWM(3, 0, pos);

               delay(10);

           }


           // Servomotor 2

           for (int pos=405; pos>350; pos -=1) {

                 pca9685.setPWM(2, 0, pos);

                 delay(10);

           }

    L'évolution des deux dernières fonctions, qui déplacent les servomoteurs 1 et 0 (préhenseur), est similaire à celle décrite ci-dessus. Le servomoteur 1 se déplace à vitesse normale et le servomoteur 0, qui représente le préhenseur, le ferme à vitesse lente, car il est en boucle.

          // Servomotor 1

           pca9685.setPWM(1, 0, 300);

           delay(velocidad);


           // Servomotor 0

           for (int pos=200; pos>166; pos -=1) {

               pca9685.setPWM(0, 0, pos);

               delay(10);

           }


    Le dernier temps d'attente dans certains des différents sketches est de 60 secondes, car il s'agit de mouvements à l'intérieur de boucles qui sont exécutés en continu. De cette manière, nous pouvons vérifier quelles coordonnées sont correctes dans quelles positions et nous pouvons adapter les valeurs des variables pos de chaque servomoteur de manière à ce que le bras du robot soit positionné aux coordonnées souhaitées.

           delay(60000);

    }


    Pour effectuer le réglage à chaque étape, nous devons exécuter le sketch correspondant et faire varier les valeurs des variables pos de chaque servomoteur jusqu'à ce que le bras du robot atteigne la position souhaitée.

    Le sketch robot_arm.ino préparé exécute une trajectoire qui part d'une position de sécurité, déplace deux pièces et revient à la position de sécurité. J'ai essayé de simplifier autant que possible la programmation de ce sketch. C'est pourquoi j'ai déposé le code de chaque étape sous forme de sketchs séparée et les ai programmées comme fonctions dans la méthode loop() du sketch robot_arm.ino avec les mêmes noms. Ainsi, nous savons à tout moment dans quelle position se trouve notre bras robotisé.

    Lorsque les servomoteurs sont connectés au module PCA9685 et que celui-ci est alimenté, les servomoteurs conservent la position dans laquelle ils se trouvent. J'en ai profité pour réduire le nombre de fonctions à certains niveaux. Si nous avons un servomoteur dans une position à l'étape précédente et que la suivante est la même, nous n'avons pas besoin de changer, nous éliminons donc cette dernière puisqu'elle conserve la position qu'elle avait auparavant.

    Je vous souhaite beaucoup de plaisir avec ce projet.

    Miguel Torres Gordo

    Pour arduinoProjets pour débutants

    19 commentaires

    Sönke Friedrichs

    Sönke Friedrichs

    Die Zeichnungen am PC für die Roboterbauteile nehmen Form an ….
    Wenn diese fertig sind werde ich sie mit einem 3D- Drucker ausdrucken und die Ergebnisse über Herrn Wolter an Herrn Gordo weiterleiten.
    Dann sehen wir weiter, wie wir das mit den Dateien oder den Drucken machen ….

    WETTERENE

    WETTERENE

    https://www.thingiverse.com/thing:5198230

    WETTERENE

    WETTERENE

    merci pour le schéma, j’attend les moteurs et je mets les stl sur thingeverse

    Andreas Wolter

    Andreas Wolter

    Der Autor des Beitrags hat freundlicherweise in einer der PDFs die Maße des Greifers ergänzt. Die PDF-Datei wurde in der verlinkten ZIP-Datei ausgetauscht.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Günter Keilhammer

    Günter Keilhammer

    @Sönke Friedrichs: hatte eine ähnliche Idee; falls möglich wäre super, wenn man die STL Files bekommen könnte?

    WETTERENE

    WETTERENE

    bonjour, serait-il possible d’avoir les mesures pour dessiner la pince
    svp
    je suis en train de dessiner les pièce avec Fusion 360
    ce projet est super

    Andreas Wolter

    Andreas Wolter

    um die Zeichnungen herunterzuladen, klicken Sie auf “Zeichnungen als Download”. Es sollte sich dann Google Drive öffnen und die Dateien in der ZIP aufgelistet werden. Sie können dann rechts oben auf den “Herunterladen”-Button klicken. Sier erhalten darüber alle PDFs als eine ZIP-Datei, die Sie auf Ihrem Rechner entpacken können.

    Die Videos werden zusätzlich bei Youtube hochladen. Dann sollte das Problem behoben sein. Es wird an dem Videocodec liegen, denke ich. Wenn dieser nicht installiert ist, kann man die Videos nicht abspielen.

    Was die ausverkauften Artikel angeht, können wir das leider nicht verhindern. Die Kollegen sind darum bemüht, den Bestand aufzufüllen. In einigen Fällen sind die Komponenten noch bei Amazon im AZ-Shop vorrätig. In diesem Fall jedoch nicht. Das tut uns leider.

    Wolfgang Menzel

    Wolfgang Menzel

    Hm, interessantes Projekt, wollte es eigenlich mit meinem Enkel realisieren. Leider sind die Motoren ausverkauft.
    Gruß

    Sönke Friedrichs

    Sönke Friedrichs

    @ Andreas Wolter, vielen Dank, habe die Zeichnungen gefunden !
    Ich zeichne die Bauteile gerade am PC.
    Zum Nachdrucken mit einem 3D- Drucker ….
    Vieleicht hat ja jemand Interesse daran ……
    Gerne würde ich hierzu auch mit Herrn Gordo in Kontakt treten :-)
    Ist das möglich ?? ( bin noch neu hier …… ;-) )

    Michael

    Michael

    Ich bekomme leider die Zeichnungsdateien nicht runter, kann sie auch nicht einsehen.

    mike

    mike

    videos gehen bei mir weder im firefox noch chromium unter LMDE 4/Linux

    Donboy

    Donboy

    Es gibt von mir sowas sehr ähnliches bereits zum 3D drucken unter : https://www.thingiverse.com/thing:597267 (siehe letztes Bild = Video) Der Trick ist es alle Servos gleichzeitig anzusteuern um somit anstatt jedem einzeln einen Winkel vorzugeben und abzuwarten, alle gleichzeitig zum Zielpunkt anlaufen zu lassen. Hier der relevante Code:

    #include
    #include
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

    #define SERVOMIN 240 // this is the ‘minimum’ pulse length count (out of 4096)
    #define SERVOMAX 470 // this is the ‘maximum’ pulse length count (out of 4096)

    uint8_t servonum = 7;
    int MOnPin = 7;
    int SOnPin = 8;
    int LOnPin = 1;
    boolean MOn = LOW;
    boolean SOn = LOW;
    float oS0;
    float oS1;
    float oS2;
    float oS3;
    float oS4;
    float oSC;

    void setup()
    {
    Serial.begin(9600);

    pinMode(SOnPin, OUTPUT); pinMode(MOnPin, OUTPUT); pinMode(LOnPin, OUTPUT); pwm.reset(); pwm.begin(); pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates digitalWrite(SOnPin, SOn); digitalWrite(MOnPin, MOn); InitArmPos(370, 500, 220, 200, 550, 700) ; ArmOn();

    }
    void loop() {
    // ( S0, S1, S2, S3, S4, SC, Stp, SetpDelay,Paus )
    MoveArm( 370, 500, 220, 200, 550, 700, 100, 2, 1000);
    MoveArm( 0 , 250, 470, 360, 0, 450, 100, 2, 1000);
    MoveArm( 200 , 0, 0, 200, 0, 450, 100, 2, 500);
    digitalWrite(LOnPin, HIGH);
    delay(500);
    MoveArm( 530, 0, 0, 0, 550, 0, 100, 2, 500);
    digitalWrite(LOnPin, LOW);
    MoveArm( 370, 0, 0, 0, 0, 0, 50, 1, 200);
    MoveArm( 0,500, 280, 220, 0, 650, 100, 2, 0);
    MoveTrack(80,80,500);
    MoveArm( 0, 430, 0, 360, 0, 550, 100, 2, 0);
    MoveTrack(-100,100,1000);
    MoveArm( 0, 0, 220, 440, 0, 450, 100, 2, 2000);
    MoveArm( 200, 0, 460, 200, 300, 0, 200, 5, 1000);
    MoveTrack(100,-100,1000);
    MoveArm( 530, 0, 0, 0, 0, 0, 50, 2, 1000);
    MoveArm( 200, 0, 0, 0, 0, 0, 50, 2, 500);
    MoveTrack(-80,-80,500);
    //delay(5000);
    }

    void TrackStop()
    {
    MoveTrack(0,0);
    }

    void ArmOn()
    {
    SOn= HIGH;
    digitalWrite(SOnPin, SOn);
    }

    void ArmOff()
    {
    SOn= LOW;
    digitalWrite(SOnPin, SOn);
    }

    void MoveTrack (int SL, int SR)
    {
    if ( SL !=0 || SR !=0)
    {
    MOn = HIGH;
    }
    else
    {
    MOn = LOW;
    }
    digitalWrite(MOnPin, MOn);
    pwm.setPWM(2, 0, 370 + SL);
    pwm.setPWM(1, 0, 370 – SR);
    }

    void MoveTrack (int SL, int SR, int pause)
    {
    MoveTrack (SL, SR);
    delay(pause);
    MoveTrack (0, 0);
    }

    void MoveArm(int nS0, int nS1, int nS2, int nS3, int nS4, int nSC, float duration, int delays, int pause)
    {
    float dS0 = (nS0 – oS0)/duration;
    float dS1 = (nS1 – oS1)/duration;
    float dS2 = (nS2 – oS2)/duration;

    float dS3 = (nS3 -oS3)/duration; float dS4 = (nS4 -oS4)/duration; float dSC = (nSC -oSC)/duration; for( int i=0 ; i<duration; i++) { if(nS0 > 0) { oS0 += dS0; pwm.setPWM(0, 0, oS0); } if (nS1 > 0) { oS1 += dS1; pwm.setPWM(4, 0, oS1); } if (nS2 > 0) { oS2 += dS2; pwm.setPWM(7, 0, oS2); } if (nS3 > 0) { oS3 += dS3; pwm.setPWM(3, 0, oS3); } if (nS4 > 0) { oS4 += dS4; pwm.setPWM(5, 0, oS4); } if (nSC > 0) { oSC += dSC; pwm.setPWM(6, 0, oSC); } Serial.print(oS0); Serial.print(“\t”); Serial.print(oS1); Serial.print(“\t”); Serial.print(oS2); Serial.print(“\t”); Serial.print(oS3); Serial.print(“\t”); Serial.print(oS4); Serial.print(“\t”); Serial.println(oSC); delay(delays); } delay(pause);

    }

    void InitArmPos(int nS0, int nS1, int nS2, int nS3, int nS4, int nSC)
    {
    digitalWrite(SOnPin, HIGH);
    delay(500);
    oS0 = nS0;
    oS1 = nS1;
    oS2 = nS2;
    oS3 = nS3;
    oS4 = nS4;
    oSC = nSC;
    pwm.setPWM(0, 0, oS0);
    pwm.setPWM(4, 0, oS1);
    pwm.setPWM(7, 0, oS2);
    pwm.setPWM(3, 0, oS3);
    pwm.setPWM(5, 0, oS4);
    pwm.setPWM(6, 0, oSC);
    delay(1000);
    digitalWrite(SOnPin, SOn);
    }
    Wer sich die Mühe macht, kann abhängig der Armlängen das ganze mathemathisch trigonometrisch in Relation stellen (Formeln) und dann als Zielkoordinaten (X,Y,Z) eingeben und der Arm positioniert sich ganu dort hin.

    Andreas Wolter

    Andreas Wolter

    @Sönke Friedrichs: die Zeichnungen sind als PDF Downloads verlinkt. Direkt unter der letzten Abbildung der Zeichnungen.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Eugen Wirsing

    Eugen Wirsing

    Die Videos lassen sich herunterladen und mit z.B. VLC-Player abspielen.

    Sönke Friedrichs

    Sönke Friedrichs

    Ich bin 3D- Drucker …..
    Wenn mir jemand die Zeichnungen zukommen läßt …..
    Vieleicht sogar gleich als .stl …..
    Dann würde ich die Sperrholzteile drucken …..

    Andreas Wolter

    Andreas Wolter

    @Markus Pohle: ich habe es in Firefox unter Windows und Linux, sowie auf dem Smartphone getestet. Dort funktioniert es. Ich vermute, dass ein Videocodec fehlt, oder das Abspielen der Videos blockiert wird. Können Sie es auf anderen Geräten unter anderen Bedingungen nachvollziehen?

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Wolle

    Wolle

    Ein interessantes Projekt. Ich habe noch einen alten Plastik-Roboterarm. Vielleicht kann ich den nehmen und umrüsten.

    Markus Pohle

    Markus Pohle

    Schade, die Videos gehen nicht… ist das nur bei mir der Fall, da ich den Artikel über den Chrome Browser auf dem Handy schaue?

    Schill Gottfried

    Schill Gottfried

    einfach super
    danke für den Beitrag

    Laisser un commentaire

    Tous les commentaires sont modérés avant d'être publiés

    Messages de blogs recommandés

    1. Installez maintenant ESP32 via l'administrateur de la carte
    2. Lüftersteuerung Raspberry Pi
    3. Arduino IDE - Programmieren für Einsteiger - Teil 1
    4. ESP32 - das Multitalent
    5. OTA-Over the Air-ESP Programmation par WiFi