Eintrag. Lyrics, können Sie überspringen
Hallo nochmal! In dieser Geschichte möchte ich das Thema "Roboterbau zu Hause" fortsetzen, dies ist eine Art
Fortsetzung des vorherigen Beitrags .
Ich warne Sie sofort: Ich bin kein Experte in dieser Branche, ich lerne nur und es ist mir schon lange "peinlich", meine Gedanken auszudrücken und hier hausgemachte Dinge zu zeigen. Ich habe lange Zeit Veröffentlichungen über Habr gelesen, manchmal wundert man sich, was auf der Welt passiert! Sie lesen einen Beitrag, Sie verstehen nicht, woher der Autor weiß! Wie kannst du das überhaupt herausfinden? Angesichts all dessen dachte ich, dass meine „plumpe“ Präsentation für niemanden interessant sein würde, aber mehr als 9.000 Menschen haben die vorherige Geschichte gesehen. Für mich ist dies mit Sicherheit ein Erfolg. Ich denke, viele Menschen wie ich sind „normale Menschen“ ohne Diplome des Massachusetts Institute of Technology , so dass diese Informationen für sie zugänglicher sind. Also lass uns gehen ...
Änderung der Struktur
Als Grundlage für mein Projekt nahm ich die bisherige "Kreation", eine Chupocabra, die verkleidet und unter einer lichtklaren Darbietung einen Urlaub durchführte. Ich habe es für einen Tag getan und von improvisierten Mitteln, die in ihrem Aussehen verfolgt werden können, war die Aufführung satirisch. Es sah ungefähr so aus:
Zuerst habe ich alles unnötige entfernt, Aluminiumprofile und perforierte Ecken für ein neues Design gekauft.
Die Leistung des Telepräsenzroboters der ausländischen Firma "Origibot" hat mir sehr gut gefallen


Sein asketisches Aussehen hat mehrere Vorteile, urteilen Sie selbst, das Gewicht ist nicht groß, dies ist in erster Linie Energieeinsparung, Ergonomie, Einsparung von Batteriestrom, ein weniger leistungsstarker elektrischer Antrieb. Stellen Sie sich diese Situation hypothetisch vor, wir gingen voran und zu dieser Zeit Kommunikationsprobleme, wenn das Gewicht des Roboters mehrere zehn Kilogramm beträgt, können die Konsequenzen fatal sein. Der zweite Vorteil dieser Form Ich denke, die Fähigkeit, den Manipulator zwischen den Rädern zu falten, ist es möglich, etwas vom Boden zu heben.
Na ja, inspiriert und los! Als Remake von "his" entschloss er sich, die Produktion stufenweise aufzuteilen:
- Die Herstellung eines Radstands basiert auf zwei Antriebsrädern und einem tragenden Heck.
- Eine Skizze für das Management schreiben.
- Montage einer Kamera oder eines Telefons. Die Höhe der Platzierung wurde basierend auf der Höhe des Ofens in der Küche gewählt, sodass Sie in die Pfanne schauen und sehen können, woraus der Borschtsch gekocht wurde.
- Installieren Sie ein Servo an der Kamera, damit Sie unter die "Beine" und die Decke schauen können. Ich habe mich nicht um horizontale Bewegungen gekümmert, man kann den Sockel drehen.
- Montage am "Produkt" des Manipulators mit Griff.
Bei der weiteren Inbetriebnahme sollte, was das allgemeine Konzept des Roboters betrifft, im Idealfall, der noch nicht implementiert wurde, das Haupttelekommunikationsgerät ein Telefon sein. Darauf ist Skype installiert, das für den automatischen Empfang von Videoanrufen konfiguriert ist. Das Telefon wird auch als Zugriffspunkt für eine Karte verwendet, die auf dem ESP-Modul basiert. Auf diese Weise können Roboter und Videokonferenzen gesteuert werden. Warum Skype? Warum etwas einfallen lassen, wenn Sie bereits Dienste haben, die einwandfrei funktionieren und die Qualität abhängig von der Netzwerkbandbreite automatisch ändern.
Es gab keine Probleme mit dem ersten Artikel, die Basis war aus dem vorherigen Handwerk fertig, alles überflüssige wurde entfernt, der TPlink MR3020 Router mit einer selbstgebauten Remote-Antenne. In der vorherigen Rede gab es "dicke" Mauern, ich musste kollektiv bewirtschaften, das Ergebnis ist + 9db. Verkehrskontrollbefehle gingen an den Router, die cyberWRT-Firmware.
Mit dem zweiten Punkt war es interessanter, mein Level in der Arduino-Programmierung "LED Blinker", ich fand eine fertige Skizze im Internet, leider erinnere ich mich nicht an den Autor, ich habe es nicht viel für mich selbst getan, indem ich die wissenschaftliche Poke-Methode verwendete, sie wird von denen verwendet, die die Theorie schlecht verstehen. Da das Programmieren in noch niedrigeren Sprachen für mich ein dunkler Wald ist, musste ich mich für eine Plattform entscheiden, auf der ich mein eigenes Control Panel aufbauen konnte. Ein wichtiger Aspekt für mich war die Möglichkeit, den Roboter über einen Cloud-Service zu steuern, da die Steuerung über die "grauen Adressen" erfolgt. Der Blynk-Dienst ist zu einer solchen Plattform geworden, ich werde die Vorteile nicht beschreiben, es gibt viele Informationen im Netz. In der ersten Version habe ich das Joystick-Widget verwendet, um die Bewegung zu steuern. Der Code ist unten dargestellt:
#define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "****"; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "****"; char pass[] = "****"; #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); BlynkTimer timer; Servo servo; Servo servo2; // These are used to set the direction of the bridge driver. #define ENB 5 //ENB monstr motor shield 5 6 #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA int motor_right_speed = 0; int motor_left_speed = 0; AccelStepper Stepper1(4, 10, 11, 12, 13); //4 , int steeps = 192; // , , // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); digitalWrite(ENA,LOW); digitalWrite(ENB,LOW); Stepper1.setMaxSpeed(10000); // (/) Stepper1.setAcceleration(10000); // (/^2) servo.attach(1); servo2.attach(3); servo2.write(55); timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V1) / , , / { if (param.asInt() == 1) { servo.attach(1); servo.write(165); // High gear timer.setTimeout(500L, StopServo); } else { servo.attach(1); servo.write(115); // Low gear timer.setTimeout(500L, StopServo); } } BLYNK_WRITE(V2) { servo2.write(param.asInt()); } void StopServo() / { servo.detach(); } // JOYSTICK BLYNK_WRITE(V0) { int nJoyY = param[0].asInt(); // read x-joystick int nJoyX = param[1].asInt(); // read y-joystick // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt : The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range: (0..+127) float fPivYLimit = 1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY >= 0) { // Forward nMotPremixL = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); nMotPremixR = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; } else { // Reverse nMotPremixL = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; nMotPremixR = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL = nMotPremixL * nJoyY/900.0; // nMotPremixR = nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed = nJoyX; fPivScale = (abs(nJoyY)>fPivYLimit)? 0.0 : (1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL = (1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR = (1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed)/ 1.1; motor_left_speed = nMotMixL; motor_right_speed = nMotMixR; if (motor_right_speed > 20) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else if (motor_right_speed < -20) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2, HIGH); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } if (motor_left_speed > 20) { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, HIGH); } else if (motor_left_speed < -20) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } analogWrite(ENB, abs(motor_left_speed)); analogWrite(ENA, abs(motor_right_speed)); } BLYNK_WRITE(V3) { // Motor Speed - Slider set with 0-100 and Send On Relese OFF int pinValue = param.asInt(); Stepper1.move(pinValue); } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run(); }
Als nächstes versuchte ich die Installation einer Kamera oder eines Telefons.

Auf dem Foto steht der Manipulator separat.
Jetzt ist es Zeit zu testen! Ich nutzte die Gelegenheit, um den Bildschirm des Telefons (verfügbar in der neuesten Android-Firmware), den oberen Teil des Videos, unten zu steuern. Um alles gleichzeitig zu starten, habe ich die Bildschirmanwendung vom Play Market heruntergeladen und bin ...
Während der ersten „Pokatushek“ wurden die folgenden Mängel aufgedeckt: Die Motoren, die in ihrer deutschen Vergangenheit verwendet wurden, um etwas an einer Attraktion zu drehen, haben aufgrund einer geraden Linie unterschiedliche Leistungen, Bewegung funktioniert nicht. Die ganze Zeit, in der es in eine der Richtungen zieht, eine Anpassung an die Berechnung der Drehzahl der Motoren im Code vorgenommen hat, hat geholfen, aber beschlossen, den Code in Knöpfe umzuwandeln, was für mich bequemer ist und die Bewegungen in der Wohnung größtenteils linear sein werden.
Wie sich herausstellte, war dies die zeitaufwändigste Phase. Jetzt ist klar, warum viele Telepräsenzroboter auf dem Markt keinen Manipulator haben. Vor nicht allzu langer Zeit las ich über Methoden zur Berechnung von Antrieben für die Rotation, die nicht gleichmäßig entlang der Lastachse verteilt sind. Ich erinnerte mich daran, wie ich vor fünfzehn Jahren an einer Vorlesung über theoretische Mechanik am Institut saß und mich vorstellte: „Warum brauche ich einen zukünftigen Ingenieur - einen Elektriker? dieser Mist. " Na gut, wie sie sagen: "Praxis ohne Theorie ist blind." Etwa zehnmal habe ich den Manipulator neu gedreht, mehrere Servos verbrannt, die die Hauptlast anheben sollten.
Wenn Sie auf das Origibot-Foto geachtet haben, gibt es dort etwas Schreckliches als eine Fahrt. Auf ihrer Website habe ich gelesen, dass der Manipulator in der Lage ist, bis zu 1 kg zu heben, fantastisch!
Wenden wir zum Beispiel einen Servoantrieb mit einer Kraft von 20 kg / cm an, so kann in einem Abstand von 2 cm eine Last von 10 kg angehoben werden, und wenn das Gewicht dieser Last ungleichmäßig entlang der Achse verteilt ist und die Achse ungefähr einen Meter beträgt, dann noch weniger.
Es ist gut, dass die alte rotierende CCTV-Kamera zur Hand war. Ich habe zwei Schrittmotoren herausgenommen, großartig! Ein Motor hebt die Achse an und der zweite einen automatischen Vorhang. Ich wollte schon lange ein Zuhause haben, finde aber gleichzeitig heraus, wie man mit Stiefwürmern arbeitet! Sozusagen zwei Fliegen mit einer Klappe. Ja! Das Hauptproblem lag im Warten. Ich habe vergessen zu sagen, dass ich den Wemos D1 R1-Controller für mein hausgemachtes Produkt verwendet habe. Er ähnelt Arduino Uno, nur dass an Bord WLAN vorhanden ist. Während es keinen Manipulator gab, gab es genug Stifte auf der Platine, ein Schrittmotor wurde hinzugefügt, um die Wicklungen zu steuern. Brauchen Sie vier Stifte, woher bekommen Sie sie? Es stellte sich heraus, dass die Pins der Platine die Pins des CES selbst sind, was für die Kommunikation sorgt, wobei die Pins vom 0. bis 8. weiter wiederholt werden. Nun, wie sie sagen: "Ein schlechter Kopf gibt deinen Händen keinen Frieden!"
Der Preis des Fehlers - Übertragung der Arbeitsergebnisse auf das Wemos 2560 esp8266 Board, dieses Board ist das übliche Mega und Esp. Ich habe es für die Automatisierung des Gewächshauses genommen, natürlich ging es nicht sofort, die Skizze wurde nicht kompiliert, Fehler flogen heraus. Auf der Website eine Lösung gefunden:
community.alexgyver.ru/threads/robotdyn-mega-wifi-r3-connect-blynk.1270/#post-16746Unten ist eine Skizze für eine knopfbetätigte Mega:
#define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); #define ENB 5 //ENB monstr motor shield 5 6 #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA BlynkTimer timer; Servo servo; Servo servo2; AccelStepper Stepper1(4, 10, 11, 12, 13); //4 , char auth[] = "****"; char ssid[] = "****"; char pass[] = "****"; // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); Stepper1.setMaxSpeed(100); // (/) Stepper1.setAcceleration(96); // (/^2) servo.attach(2); // servo.write(115); // servo2.attach(3); // servo2.write(55); // //timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V6) { servo.write(param.asInt()); //timer.setTimeout(2500L, StopServo); } BLYNK_WRITE(V7) { servo2.write(param.asInt()); } //void StopServo() { // servo.detach(); //} BLYNK_WRITE(V8) { int pinValue = param.asInt(); Stepper1.move(pinValue); } BLYNK_WRITE(V4) { int speedL = param.asInt(); // . 1,13 analogWrite(ENA, speedL); analogWrite(ENB, speedL* 1.13); } / FORWARD BLYNK_WRITE(V0) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // RIGHT BLYNK_WRITE(V1) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // LEFT BLYNK_WRITE(V2) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // BACKWARD BLYNK_WRITE(V3) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run();
Infolgedessen war die Kraft des chinesischen Substantivs noch geringer - 5 kg / cm.

Der Riemen rutschte trotz des an der Rolle angebrachten Spanners (nicht abgebildet). Außergewöhnliche Psychosen und Nervositäten, verursacht durch eine Reihe technischer Rückschläge, wurden durch eine neue Idee unterbrochen. Es ist notwendig, das Gewicht der Struktur zu reduzieren - um die zwei Servos am Ende der Achse für zusätzliche Freiheitsgrade aufzugeben und die Länge der Achse des Manipulators zu reduzieren. (Ich hoffe die Sicherung bleibt und diese Entscheidung ist vorübergehend).

Außerdem habe ich auf dem Foto einen externen Lautsprecher installiert, der vom Hersteller Hikvizhn an die Kamera ds-2cd2432f-iw angelötet wurde. Der Vollzeitsprecher schien schwach zu sein.
Nun sieht es so aus.

Zusammenfassung
Wir haben eine Kamera auf Rädern, bisher habe ich das Telefon abgelehnt. Skype funktioniert im Mehrfenstermodus meines Telefons nicht richtig, wenn die Steuerung des Videobilds auf die Größe eines kleinen Fensters minimiert wird, was bei Bewegungen des Roboters nicht sehr praktisch ist. Daher habe ich angehalten, während ich auf der Kamera war. Ich verwende immer noch die kostenpflichtige Version des Programms Tiny cam pro, um auf das Video zuzugreifen. Zugriff von überall auf der Welt. Die Kamera ist drahtlos mit einem Router verbunden, über den ihre Ports weitergeleitet werden, und der No-Ip-Domainnamendienst wird verwendet. Gut, dass der Provider bisher eine "weiße" Adresse zur Verfügung stellt. Warum ich Blynk nicht für die Videoübertragung verwende, fragen Sie, weil es ein Standard-Widget für die Übertragung des RTSP-Protokolls gibt. Ich antworte, ich möchte die gesamte Funktionalität der Kamera nutzen, nämlich die bidirektionale Kommunikation. Auch wenn es in einer Form vorliegt, wie sie von einer Anwendung bereitgestellt wird, in der Audio-Codecs verwendet werden, die die Klangqualität erheblich verringern. Das wichtigste RTSP-Protokoll in der Blynk-Anwendung arbeitet mit einer geringen Verzögerung, die für das Fahren mit einem 10 kg schweren Mechanismus von entscheidender Bedeutung ist.
Ernährung, ein eigenständiges interessantes Thema. Das Problem einer autonomen Ladestation ist noch nicht gelöst. Beim Vorgängermodell habe ich paarweise gelötete Li-Ionen-Akkus verwendet, um die Spannung auf 12 V zu erhöhen und die Kapazität über den Laderegler zu erhöhen. In diesem Projekt lehnte er Lithium ab, die Batterien explodierten schrecklich nach einer schlechten Erfahrung! Eine Blei-Säure-Batterie mit 7 A / h ist im hinteren Teil des Geräts installiert, um die Last gleichmäßig zu verteilen, wenn der Manipulator die Last anhebt. Ein Gleichstromwandler, der die Spannung von 5 V reduziert, ist an die Batterie angeschlossen, um die Steuerung und die Logik der beiden MonstrmotorShield-Motortreiber zu versorgen, und zwar eine für jedes Rad Nur der Boden des Fahrers arbeitete in beiden Brettern, höchstwahrscheinlich ein Fabrikdefekt. Kann ich ihn nicht wegwerfen? Der ln298-Motortreiber wird benötigt, damit zwei Schrittmotoren funktionieren.
Von den noch nicht gelösten Problemen, dem autonomen Laden, möchte ich es so wiederholen
Ich habe auch die AccelStepper-Bibliothek nicht ganz verstanden. Wenn Sie die Motorwicklungen mit Strom versorgen, bleibt nach Beendigung des Manipulators der Strom erhalten, wodurch sich der Batterieentladestrom um etwa 400 mA erhöht. Dies ist nicht wirtschaftlich. Sie müssen die Logik finden, wenn sich der Manipulator in der unteren Position befindet und der Wicklungsstrom ausgeschaltet ist. Ich hätte auch gerne eine Rückmeldung, damit die Position der Servos und Stiefwürmer zu Blynk kommt, wenn der Roboter eingeschaltet wird. Und natürlich muss die Batterie die Last abschalten, wenn die Spannung auf 10,5 V abfällt, was eine vorzeitige Verschlechterung verhindert. Es gibt keine Möglichkeit, von einem Computer aus zu steuern. Und natürlich muss der Code optimiert werden.
Diejenigen, die keine Angst vor vielen Büchern haben und bis zum Ende lesen, danke, viel Glück an alle, alles Gute!
Zum Schluss machen wir noch ein bisschen!