Wie kann man den Roboter genau bewegen? Übersicht und Funktionen der Studuino Platform Robotics

Bild

Die Organisation, in der ich arbeite, wurde gebeten, ein kleines Robotik-Webinar für den Moskauer Internationalen Bildungssalon 2020 abzuhalten, das in einem Online-Format abgehalten wurde. Das Thema der Präsentation wurde mir offen gelassen und mit einem Lehrgang über Robotik versehen. Also habe ich Produkte des japanischen Unternehmens ArTeC kennengelernt (dies ist keine Werbung und ich bin kein Mitarbeiter von ArTeC - es ist nur meine persönliche Erfahrung aus der Kommunikation mit ihren Produkten). Nach dem Webinar habe ich beschlossen, diesen Artikel zu schreiben, da in Russland Kits von Lego Education sehr beliebt waren und ich zum ersten Mal auf diesen japanischen Designer stieß.

Der Artikel ist in zwei Teile gegliedert. Der erste Teil ist nützlich für diejenigen, die ein Kit für pädagogische Robotik wählen. Im zweiten Teil untersuchte ich die Verwendung eines Kits zur Lösung eines angewandten Problems, das im Leben auftreten kann.

Wenn sich jemand dafür interessiert, was für ein Roboter-Kit es ist und was damit gemacht werden kann, bitte ich um eine Katze. So lass uns gehen!

Als Gebäudebasis verwendet der Designer nur wenige grundlegende Teile, aus denen Sie recht komplexe Strukturen zusammensetzen können. Beispielmodelle von

ArTeC Designer-Basisblöcke
ArTeC Designer-Basisblöcken

Bild
aus Designer-Teilen

Aufgrund der Besonderheiten der Teile - der versetzten Reihenfolge der Löcher und Spitzen für die Verbindung - ist es nicht immer schnell, die richtige Kombination von Teilen zu finden, um das Ergebnis zu erzielen. Von den Vorteilen im Gegensatz zu Lego: Alle Teile sind groß genug, was den Verlust erheblich erschwert. Das zweite Plus ist, dass Sie nicht lange auf der Suche nach dem erforderlichen Teil herumwühlen müssen, da es nur 5-6 Teile der Basisteile gibt (der Unterschied in der Farbe der Teile zählt nicht). Es gibt ein Minus - solange die Teile völlig neu sind, wird ihre Trennung manchmal zu Qualen -, so dass sie fest aneinander haften. Um sie zu lösen, ist ein spezielles Werkzeug im Kit enthalten.

Zusätzlich zu den Grundblöcken im Set gibt es verschiedene Arten von Rädern und Zahnrädern sowie eine Zahnstange.

Nun zu dem, was im elektronischen Teil dieses Roboterkits enthalten ist. Die japanische Website enthält eine relativ große Anzahl verschiedener Sensoren und Module. Natürlich hatte ich viel weniger davon, aber diejenigen, denen bereits ein gewisser Spielraum für Kreativität gegeben wurde.

Für die Befüllung der Hauptsteuereinheit stellten die Japaner ihre Version des Arduino-Boards her, finalisierten es und nannten es Studuino. Sie fügten einen DC-Motorsteuerungstreiber hinzu und brachten eine Leitung für 3-polige Steckverbinder (Standard BLS-3, diese sind auf Servos platziert). An jedem dieser Anschlüsse befindet sich Strom: Plus und Minus sowie einer der Pins der Arduino-Platine. Alle Anschlüsse sind signiert, daher ist es schwierig, beim Anschließen einen Fehler zu machen.

Studuino-Plattform
Studuino-Plattform

Aus Gründen der Kompatibilität mit Standard-Arduino-Abschirmungen an Standardplätzen gibt es ähnliche Anschlüsse wie Arduino.

Der Hauptunterschied zur Arduino-Karte besteht darin, dass die Spannung des Controllers 3,3 V beträgt. Dies erklärt sich aus der Tatsache, dass das zentrale Steuermodul über das mitgelieferte Batteriefach für 3 AA-Batterien (insgesamt 4,5 V) mit Strom versorgt wird. Der Akku wird leider nicht mitgeliefert, kann aber nicht einmal auf der Website des Herstellers als zusätzliche Option gekauft werden.

Die Platine befindet sich in einem Kunststoffgehäuse, an dem Sie die Basisteile des Designers und andere Elemente befestigen können.

ArTeC-Zentraleinheit
ArTeC-Zentraleinheit

Als Stellantriebe bietet der Hersteller zwei Gleichstrommotoren mit Getriebe und bis zu 8 Servoantrieben eigener Bauart an (deren Anzahl je nach Kit-Konfiguration variieren kann). Die Motoren werden über spezielle Anschlüsse auf der Platine angeschlossen.

Gleichstrommotoren mit Zahnrädern und deren Anschluss
Gleichstrommotoren mit Getrieben und deren Anschluss

Es ist möglich, die einfachste Konstruktion, die mir in den Sinn kommt, ganz einfach und schnell zusammenzubauen: eine Robotermaschine mit zwei Motoren, die steuert, welche Bewegung Sie in die richtige Richtung bewegen können.

Einfache Robotermaschine mit zwei Gleichstrommotoren
Einfache Robotermaschine mit zwei Gleichstrommotoren

Die Motoren werden gesteuert, indem die logischen Zustände der Klemmen D2, D4, D3 für den Motor eingestellt werden, der an die Anschlüsse M1 und D7, D8, D5 für den Motor angeschlossen ist, der an den Anschluss M2 auf der Studuino-Platine angeschlossen ist. Zu diesen Schlussfolgerungen haben die Entwickler des Studuino-Boards parallel einen Motortreiber-Treiberchip angeschlossen. Wenn Sie diese Schlussfolgerungen verwenden, indem Sie Ihren Stromkreis dort anschließen und gleichzeitig die Motoren gleichzeitig verwenden, schlägt dies fehl.

Überlegen Sie, wie Sie einen Motor steuern, der an den M1-Stecker angeschlossen ist. Durch Einstellen eines anderen logischen Zustands der Klemmen D2 und D4 ist es möglich, eine Drehung des Motors in die gewünschte Richtung zu erreichen. Zum Beispiel: Bei D2 - 1 und D4 - 0 dreht sich der Motor im Uhrzeigersinn, und wenn D2 - 0 und D4 - 1, dreht sich der Motor gegen den Uhrzeigersinn. Es ist auch erforderlich, die Motordrehzahl durch Einstellen des PWM-Werts an Pin D3 einzustellen - er kann im Bereich von 0 bis 255 liegen. Wenn der Wert 0 ist, dreht sich der Motor nicht, und wenn der Wert 255 ist, erhalten wir die maximale Drehzahl. Der Motortreiber ermöglicht auch eine sofortige Änderung der Drehrichtung des Motors und unterstützt den Motorbremsmodus. Um den Motor abzubremsen, muss an den Klemmen D2 und D4 der gleiche logische Zustand gleich 1 eingestellt werden.

Übrigens gibt es keine D3- und D5-Pins in den Anschlüssen mit 3 Pins (GND, VCC, SIG) auf der Studuino-Platine, aber sie befinden sich auf dem Standard-Arduino-Anschluss, den die Entwickler zur Wahrung der Plattformkompatibilität verlassen haben.

Ebenso wird der Motor gesteuert, der an den M2-Stecker angeschlossen ist. Für ihn wird die Drehrichtung durch den Zustand der Klemmen D7 und D8 und die Drehzahl durch die Klemme D5 festgelegt.

Das einfachste Programm, das ich geschrieben habe, hat die Robotermaschine so bewegt:


Servos können an die rot hervorgehobenen Anschlüsse auf der Platine angeschlossen werden: D2, D4, D7, D8, D9, D10, D11, D12. Anschließen von

Servoverbindung
Servoantrieben

An diesen Pins verfügt der AtMega168-Mikrocontroller über eine PWM, die zur Steuerung der Servoantriebe benötigt wird. Wenn Sie die maximale Anzahl von Servos anschließen, erhalten Sie ein interessantes Design. Zur Demonstration habe ich ein einfaches Analogon eines Laufroboters zusammengestellt und versucht, es ein wenig zu programmieren. Das Ergebnis ist im Video zu sehen:


Wenn Sie vorhaben, sowohl Gleichstrommotoren als auch Servos gleichzeitig zu verwenden, können Sie nicht zwei Gleichstrommotoren und 8 Servos gleichzeitig verwenden, da diese über gemeinsame Ausgänge verfügen, die vom Mikrocontroller gesteuert werden. Sie können folgende Konfigurationen vornehmen: 2 Gleichstrommotoren + 4 Servos, 1 Gleichstrommotor + 6 Servos oder nur 8 Servos verwenden.

In jedem Roboterkit müssen zusätzlich zu den Aktuatoren Sensoren vorhanden sein, die die "Augen" und "Ohren" eines Roboters sind. Sie sind auch hier. In meinem Set befanden sich folgende Sensoren: ein Lichtsensor, ein Schallsensor, ein Beschleunigungssensor, zwei IR-Sensoren, ein Berührungssensor sowie LEDs (grün, rot, blau, weiß) und eine piezodynamische.

Sensoren im Set
Sensoren im Set

Die Sensoren werden über die mit dem Kit gelieferten Kabel an die Zentraleinheit angeschlossen. Um die Sensoren im Robotermodell an den Gehäusen zu befestigen, haben sie Spikes, mit denen sie an der Struktur befestigt werden können. Ich habe ein paar einfache Designs zusammengestellt und programmiert, um die Funktionsweise der Sensoren zu untersuchen.

So funktioniert der Berührungssensor:


Und so funktioniert der Lichtsensor:


Wenn das Set nicht genügend Standardsensoren enthält und Sie seine Funktionalität erweitern möchten, können Sie das lötfreie Steckbrett problemlos verwenden und dort Schaltkreise anschließen, genau wie bei einem Standard-Arduino-Board.

Erweiterte Rekrutierungsfunktionen
Verbessertes Wählen

Der nächste wichtige Punkt für jedes Roboterkit ist die Verfügbarkeit einer praktischen Programmierumgebung. Hier bietet der Hersteller drei verschiedene Programmiermöglichkeiten an.

Einstiegsmodell - für die kleinsten Benutzer, die noch nicht wirklich lesen können, aber bereits ihre ersten Schritte in die Erwachsenenwelt der Robotik unternehmen. Für sie wird die einfachste Programmierumgebung angeboten - das Piktogramm.

Symbolprogrammierung
Symbolprogrammierung

Hier können Sie Piktogramme mit grundlegenden Aktionen in das Programm ziehen (vorwärts gehen, drehen, LED einschalten usw.) und deren grundlegende Parameter konfigurieren.

Wenn diese Stufe beherrscht wird oder ihre Fähigkeiten nicht mehr ausreichen, um die Aufgaben zu lösen, können Sie mit dem nächsten Schritt fortfahren und die Scratch-Programmierumgebung für die Studuino-Plattform verwenden.

Scratch-Programmierung für Studuino
Scratch-Programmierung für Studuino

Es gibt bereits weitere Programmieroptionen: Sie können Variablen und Arrays, logische und arithmetische Ausdrücke, Unterprogramme verwenden und verschiedene Blöcke flexibler für die Ausführung konfigurieren.

Wenn diese Funktionen nicht ausreichen, können Sie mit der Programmierung in der Arduino IDE fortfahren und die vollständige Kontrolle über alle Hardwarefunktionen der Studuino-Plattform erhalten. Um die Studuino-Karte in der Arduino IDE zu verwenden, müssen Sie die Umgebung gemäß den Anweisungen auf der Website des Herstellers konfigurieren (damit die Umgebung die Studuino-Plattform in der Liste der unterstützten Karten sieht).

Zusammen mit der Programmiersoftware gibt der Hersteller eine Reihe von Anweisungen zum Zusammenbauen und Programmieren verschiedener Modelle. Die Software selbst ist kostenlos auf der Website des Herstellers verfügbar.

Versuchen wir nun, mit diesem Set ein kleines praktisches Problem zu lösen.

Stellen Sie sich vor, wir haben einen Roboter, der sich im Lager vorwärts und rückwärts bewegen muss, und wir müssen ihn an den angegebenen Stellen anhalten lassen. Wenn der Roboter nicht gesteuert wird, kommt es zu einem Unfall. Ein Beispiel für einen solchen Unfall ist hier dargestellt:


Das Vor- und Zurückbewegen des Roboters kann mit Gleichstrommotoren oder Servos erfolgen. Servoantriebe lösen das Problem, wie der Roboter an der richtigen Stelle angehalten werden kann (Sie können den Drehwinkel des Servos genau einstellen). Diese Lösung hat eine Einschränkung (wir verwenden ein Servo aus einem Satz mit einem daran befestigten Rad) - Servos können sich nicht um einen Winkel von mehr als 180 Grad drehen, und daher ist die Bewegung unseres Roboters auf die Hälfte der Radumdrehung des Servos begrenzt, aber normalerweise möchten Sie mehr.

Wir werden einen Gleichstrommotor mit einem Reduzierstück aus dem Satz verwenden, um vorwärts und rückwärts zu fahren. Diese Motoren haben keine Rückmeldung. Nach dem Starten des Motors können wir nicht sagen, wie weit der Roboter gefahren ist. Sie können die Zeit erfassen, während der der Roboter während des Motorbetriebs die erforderliche Strecke zurücklegt, und diese Verzögerungen im Programm verwenden, um den Roboter an der richtigen Stelle anzuhalten. Diese Methode hat einen wesentlichen Nachteil: Die Motordrehzahl hängt von der Spannung ab, die an sie geliefert wird, und von der erforderlichen Anstrengung. Da im Roboter Batterien verwendet werden, die nach einer Weile leicht entladen werden und deren Spannung abnimmt, beginnt der Roboter gleichzeitig, eine kürzere Strecke zurückzulegen, und es ist erforderlich, die Zeit erneut auszuwählen.

Die einfachste Option, die Sie verwenden können, ist ein Roboter, der den gewünschten Punkt passiert und den Berührungssensor berührt. Dies ist ein Stoppsignal an der richtigen Stelle.

Ich habe Änderungen an meinem Design vorgenommen, indem ich Berührungssensoren am Roboter hinzugefügt und Elemente entlang des Roboterpfads platziert habe, sodass der Roboter sie beim Bewegen mit Berührungssensoren berührt hat.


Das Video zeigt, dass der Roboter das Ende des „Lagers“ erreicht und die „Wand“ mit dem Sensor berührt, dann zur gegenüberliegenden „Wand“ des Lagers zurückkehrt und dort auch berührt. Danach wird der Vorgang wiederholt. Es gibt also zwei Punkte, die der Roboter mit Sicherheit „kennt“ - dies sind die Punkte, an denen der Berührungssensor ausgelöst wird.

Scratch-Touch-Programm für Studuino
Ein Programm mit Berührungssensoren in der Scratch-Sprache für Studuino

Manchmal reicht dies aus, um die Aufgabe zu lösen. Aber wir wollen mehr!

Ich habe das Design und das Programm des Roboters geändert und Folgendes erhalten:


Lassen Sie uns genauer betrachten, was ich so viel mehr vom Roboter verlangt habe. Ich entschied, dass zwei Haltepunkte für mich nicht ausreichen und ich mehr möchte. Dafür habe ich einen IR-Sensor verwendet, der im Kit enthalten ist. Ich befestigte es auf einer beweglichen Plattform und arrangierte darunter einen Papierstreifen mit schwarzen Linien, die von der Markierung vorgezeichnet wurden und auf denen der Roboter anhalten musste. Ich habe auch einen der Berührungssensoren vom Roboter entfernt (auf der rechten Seite).

IR-Roboter
Roboter mit IR-Sensor

Als Ergebnis erhielt ich ein klassisches Diagramm des Geräts einer der Achsen eines 3D-Druckers oder einer CNC-Maschine. Im eingeschalteten Zustand weiß der Drucker nicht, wo er sich befindet, und bewegt sich ganz zur Seite (bis er vom Endschalter berührt wird). Danach betrachtet er diesen Punkt auf Null und beginnt, seine Position auf dieser Achse von dort aus zu zählen.

Bei diesem Design erfolgt der Countdown auf schwarzen Streifen auf Papier. Die Anzahl dieser Bänder ist im Voraus bekannt. Wenn Sie also das letzte Band erreichen, können Sie zum Nullreferenzpunkt zurückkehren. Das Scratch-Programm für Studuino wird unten vorgestellt.

Scratch IR Robot Program für Studuino
Scratch IR Robot Program für Studuino

Wenn Sie sich das Programm genau ansehen, sehen Sie unverständliche Werte von 40 und 50, mit denen der Wert des IR-Sensors verglichen wird. Um diese Zahlen zu verstehen, müssen Sie sich ein wenig daran erinnern, welche Signale von verschiedenen Sensoren gelesen werden können. Es gibt digitale und analoge Sensoren. Digitale Sensoren haben eine feste Anzahl von Positionen und bewegen sich scharf und ohne Zwischenwerte von einer Position zur anderen. Meist verwendete Sensoren mit zwei Positionen. Berührungssensoren sind das auffälligste Beispiel für einen digitalen Sensor: Bis der Sensor gedrückt wird, gibt er einen logischen Wert von 1 und beim Drücken einen logischen Wert von 0 (in diesem Konstruktor und bei diesen Sensoren ist dies das Schema, aber es gibt Schemata, bei denen es umgekehrt gemacht wird: gedrückt - 1, nicht gedrückt - 0).Analoge Sensoren beschreiben eine untrennbare Beziehung zwischen dem Signal und der Spannung oder dem Strom am Ausgang und haben keine festen Werte. Der IR-Sensor sendet ein analoges Lichtsignal aus, das von verschiedenen Faktoren wie Umgebungslicht, Batteriespannung und sogar Umgebungstemperatur abhängen kann.

Das analoge Signal wird für Scratch for Studuino linear in eine Zahl umgewandelt - im Bereich von 0 bis 100. Dies dient dazu, die Arbeit mit ihnen für Endbenutzer zu vereinfachen (diese Programmierumgebung wurde zuerst für das Unterrichten von Kindern entwickelt). In der Arduino IDE wird ein „ehrlicher“ Wertebereich von 0 bis 1023 ausgegeben, der dem 10-Bit-ADC-Wandler entspricht, der im Atmega168-Controller vorhanden ist. Wenn Sie sich die Unterschiede in den Diagrammen zwischen dem digitalen und dem analogen Signal ansehen, wird klar, warum das analoge Signal ein Wertebereich ist.

Analoges (links) und digitales (rechts) Signal
Analoges (links) und digitales (rechts) Signal Der

Infrarotsensor, mit dem die schwarze Markierungslinie bestimmt wird, arbeitet nach dem Prinzip der Erfassung des reflektierten Signals. In der Abbildung sind zwei Elemente deutlich zu erkennen: IR-LED und IR-Fotodetektor.

IR-Sensor
IR-Sensor

Wenn Sie ein Hindernis vor den Sensor stellen, von dem IR-Strahlen reflektiert werden, werden sie vom IR-Fotodetektor umso mehr aufgenommen, je besser sie vom Hindernis reflektiert werden (abhängig von der Entfernung zum Hindernis oder der Art des Hindernisses) Wert für den Benutzer während seiner Umfrage.

Die Zahlen 40 und 50 werden empirisch ausgewählt. In meinem Fall zeigte der Sensor über einer weißen Oberfläche Werte von etwa 65-75. Über der schwarzen Oberfläche gab der Sensor Werte im Bereich von 18 bis 25 zurück. Die Zahl 40 ist der Moment, in dem der Sensor beginnt, von einer weißen zu einer schwarzen Oberfläche zu wechseln, und die Zahl 50 ist der Moment des Übergangs von einer schwarzen zu einer weißen Oberfläche. Diese Zahlen werden mit einem kleinen Rand aufgenommen, um den Fehler bei der Messung des Sensors zu blockieren. Bei der Entwicklung eines realen Designs müssen die Bedingungen berücksichtigt werden, unter denen der Sensor Messwerte erfasst (externe Beleuchtung, Position des Sensors usw.), da alle diese Faktoren die Sensorwerte beeinflussen. Möglicherweise müssen Sie einen Algorithmus entwickeln, um diese Werte abhängig von den äußeren Bedingungen ständig anzupassen.

Ich werde ein kleines Ergebnis zusammenfassen. Es wurden zwei mögliche Lösungen für das Problem des Bewegens des Roboters im Lager in Betracht gezogen. Beide Optionen erforderten zusätzliche externe "Tags", die den Roboter leiteten. Gibt es eine Möglichkeit, ohne sie auszukommen? Damit der Roboter beispielsweise weiß, in welchem ​​Winkel sich die Motorwelle gedreht hat und je nach Winkelwert beschlossen hat, anzuhalten oder weiterzufahren. Für dieses Problem gibt es eine einfache Lösung - die Verwendung eines Motors mit einem Encoder (Winkelsensor).

Das Set verfügt über Gleichstrommotoren mit Getriebe, die jedoch keinen Encoder haben. Mir kam die Idee: Vielleicht könnte ich versuchen, aus den Teilen des Designers einen einfachen Encoder zu machen, zumal die Zahnräder aus dem Set ein ziemlich großes Modul (Zahngröße) haben?

Die Hauptelemente des Encoders
Die Hauptelemente des Encoders

Das Hauptproblem bestand darin, den Ort zu wählen und den IR-Sensor so zu befestigen, dass er den Zahnradzahn schneidet, wenn er sich dreht. Als Ergebnis habe ich ein Testdesign erhalten, das in der folgenden Abbildung dargestellt ist.

Encoder-Testmodell
Encoder-Testmodell

Wie Sie in der Abbildung oben sehen können, ist der IR-Sensor so fixiert, dass das Zahnrad während der Drehung seinen Arbeitsmessbereich mit den Zähnen kreuzt. Gegenüber (auf der anderen Seite des Zahnrads) des IR-Sensors habe ich zusätzlich ein Hindernis für die Reflexion von Infrarotstrahlen angebracht, um korrektere Daten vom Sensor zu erhalten. Wenn sich das Zahnrad dreht und der IR-Sensor die Signalreflexion misst, gibt es große Werte, wenn sich ein Zahn vor dem Sensor befindet, und kleinere, wenn sich zwischen den Zahnradzähnen ein „Loch“ befindet.

Das Programm für die Arbeit mit dem Encoder wird in der Arduino IDE entwickelt. Um die Effizienz meiner Idee zu testen, habe ich ein einfaches Programm geschrieben, mit dem der Motor mit konstanter Geschwindigkeit gedreht und kontinuierlich Werte vom IR-Sensor an die Debug-Konsole ausgegeben wurden.

Programmtext
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

void setup() {
  Serial.begin(9600);       //      
  pinMode(M1_A, OUTPUT);    //       " "
  pinMode(M1_B, OUTPUT);    
  analogWrite(M1_PWM, 100); //    
  digitalWrite(M1_A, HIGH); //    
  for (int i=0; i < 2000; i++) {    //   2000    -
    Serial.println(analogRead(SENSOR_PIN));   //      
  }
  digitalWrite(M1_A, LOW);  //   
}

void loop() {
}


Entsprechend den Daten, die das Programm auf der Konsole angezeigt hat, habe ich das folgende Diagramm erhalten:

Diagramm der IR-Sensorwerte während der Gangdrehung
Diagramm der Änderungen der Werte des IR-Sensors während der Drehung des Zahnrads

Die Art des Diagramms ähnelt der Form der Zähne eines Zahnrads, was darauf hindeutet, dass solche Daten tatsächlich verwendet werden können, um die Drehung des Motors unter Verwendung des Zahnrads aus dem Konstruktionssatz als Encoderscheibe zu steuern. Um die "Bounce" -Hysterese zu eliminieren, wird diese wie folgt implementiert (Symbole in der Grafik): MIDDLE ist der Durchschnittswert zwischen den Maximal- und Minimalwerten der IR-Sensorwerte, WIDTH ist die Abweichung von MIDDLE zu einem größeren oder kleineren Wert, um ein bestimmtes "Fehlerband" zu erzeugen. »Signalmessungen (die Gesamtbreite dieses Bandes beträgt 2 * BREITE). MIDDLE und WIDTH werden im Algorithmus zur Steuerung der Motordrehung verwendet. Der Algorithmus zum Zählen der Zähne im Zahnrad während der Motordrehung kann wie folgt dargestellt werden:

Algorithmus zum Zählen der Zähne im Zahnrad während der Motordrehung
Algorithmus zum Zählen der Zähne im Zahnrad während der Motordrehung.

Der Algorithmus verwendet die folgende Notation:

  • prev_state - vorheriger Gangzustand ;
  • cur_state - aktueller Zustand des Zahnrads;
  • count - die Anzahl der gezählten Zahnradzähne;
  • tmp - IR-Sensorwerte.

Das Prinzip des Zählens der Zahnradzähne in diesem Algorithmus basiert auf einem konstanten Ablesen der Ablesungen vom IR-Sensor und einer Änderung des Werts der Variablen cur_state, wenn der Signalpegel über die obere oder untere Zeile des „Fehlerbandes“ geht. Wenn der Wert die Obergrenze überschreitet, wird die Variable cur_state gleich 1, was einen Zahnradzahn bedeutet, und wenn die untere Grenze überschritten wird, wird die Variable cur_state gleich 0, was einen Spalt zwischen den Zahnradzähnen bedeutet. Das Hinzufügen der Zählvariablen erfolgt nur, wenn sich der Status der Variablen cur_state ändert.

Ein Programm, das diesen Algorithmus verwendet, wird unten vorgestellt. Darin habe ich ein Unterprogramm beschrieben, das wartet, bis der Motor das Zahnrad um eine vorgegebene Anzahl von Zähnen dreht, und danach die Steuerung an das Hauptprogramm überträgt.

Programmtext
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

#define MIDDLE      550     //         
                            // ""
#define WIDTH       50      //      ,   
      //    -     
      // 

int enc_tooth = 0;          // ,    
int cur_state = 0;          //   :  (1)  "" (0)
int prev_state = 0;         //   
int tmp;                    //      

void init_enc() {
  enc_tooth = 0;
  cur_state = 0;
  prev_state = 0;

  //         cur_state
  //    ,   = 1,    ""      
  //   0      
  if (analogRead(SENSOR_PIN)>MIDDLE) {
    prev_state = 1;
    cur_state = 1;
    enc_tooth++;
  }  
}

void wait_by_count(int count) {
  //       count,       IR 
  //           ""
  while (enc_tooth <= count) {
    //    IR-    
    tmp = analogRead(SENSOR_PIN);

    //       +  ,    
    if ((tmp + WIDTH) > MIDDLE) {
      cur_state = 1;
    } else {
    //       -  ,    ""
      if ((tmp - WIDTH) < MIDDLE) {
        cur_state = 0;
      }
    }

    //       ,      
    // ,     ""   -  ""  
    if (cur_state != prev_state) {
    //   ,   0  - ,     
    // 
      enc_tooth += cur_state;
    
    //        
      prev_state = cur_state;
    }
  }
}

void setup() {
  //        
  Serial.begin(115200);

  //        ""
  pinMode(M1_A, OUTPUT);
  pinMode(M1_B, OUTPUT);

  //   
  init_enc();

  //    
  analogWrite(M1_PWM, 100);
 
  //    ,      1 (    
  //  0)
  digitalWrite(M1_A, 1);

  // ,    30  
  wait_by_count(30);
  
  //   
  digitalWrite(M1_B, 1);

  Serial.print("  = ");
  Serial.println(enc_tooth);

}

void loop() {
}


Das Programm startet den Motor und wartet, bis sich das Zahnrad um 30 Zähne dreht - genau so viele Zähne im Zahnrad, und danach stoppt es den Motor. Unten sehen Sie ein Video, das die Funktionsweise des Programms demonstriert:


Auf einem weißen Stück Papier, das auf das Zahnrad geklebt ist, können Sie dessen Drehung um 360 Grad verfolgen.

Dazu möchte ich diesen Artikel beenden. Abschließend kann ich sagen, dass ich nicht nur beim Encoder-Modell stehen geblieben bin. Eine vollwertige Roboterplattform wurde mit zwei Motoren und zwei Encodern (einer für jedes Rad) zusammengebaut und ein Programm zur Synchronisierung der Raddrehung nach Encodern erstellt. Dies ist jedoch ein Thema für einen anderen Artikel ... Eine

Roboterplattform mit Encodern basierend auf IR-Sensoren
Roboterplattform mit Encodern, die auf IR-Sensoren basieren

Als pädagogischer Designer in der Robotik ist dies eine gute Option für Kinder (also Erwachsene), die an solchen Kursen teilnehmen möchten, zumal der Hersteller alles getan hat, um die Altersspanne derjenigen zu maximieren, die dieses Produkt verwenden können (das Vorhandensein unterschiedlicher Programmierumgebungen) ) Sie können mit den einfachsten und elementarsten Elementen beginnen und nach dem Erwerb von Grundkenntnissen zu einer anderen Entwicklungsstufe für Robotik und Elektronik übergehen.

All Articles