Inhaltsverzeichnis:

Teil 3: GPIO: ARM Assembly: Line Follower: TI-RSLK - Gunook
Teil 3: GPIO: ARM Assembly: Line Follower: TI-RSLK - Gunook

Video: Teil 3: GPIO: ARM Assembly: Line Follower: TI-RSLK - Gunook

Video: Teil 3: GPIO: ARM Assembly: Line Follower: TI-RSLK - Gunook
Video: Hackaday TV - Raspberry Pi show and tell with Adafruit 2024, Juli
Anonim
Image
Image
Die Hardware
Die Hardware

Hallo. Dies ist die nächste Folge, in der wir weiterhin ARM-Assembly (anstelle einer höheren Sprache) verwenden. Die Inspiration für dieses Instructable ist Lab 6 des Texas Instruments Robotics System Learning Kit oder TI-RSLK.

Wir verwenden den Mikrocontroller aus dem Kit, das MSP432 LaunchPad-Entwicklungsboard, aber vielleicht finden Sie etwas Nützliches, das Sie aus diesem Instructable extrahieren können, auch wenn Sie das LaunchPad nicht verwenden oder dem T. I. Lehrplan.

Wir begannen mit einem Instructable, das ARM Assembly, die Entwicklungsumgebung und die Erstellung eines Projekts vorstellte.

Das nächste Instructable on ARM Assembly stellte die Interaktion mit der Eingabe / Ausgabe (GPIO) vor.

Dann haben wir unser Wissen erweitert und Funktionen eingeführt, die LEDs und Schalter steuern.

Jetzt mit diesem Instructable können wir das, was wir gelernt haben, verwenden, um etwas mehr Spaß und Nützliches zu tun: eine Linie zu erkennen.

Dies kann uns später helfen, wenn wir einen Linienfolger-Roboter bauen.

Im Lehrplan wird der Großteil der Programmierung in C oder C++ durchgeführt, aber es ist hilfreich, sich mit Assembler vertraut zu machen, bevor wir abhängig von höheren Sprachen und Bibliotheken beginnen.

Schritt 1: Die Hardware

Die Hardware
Die Hardware
Die Hardware
Die Hardware
Die Hardware
Die Hardware

Ich möchte die Hardware nicht im Detail aufwärmen, da es bereits Quellen gibt, aber wir werden bei Bedarf Erklärungen hinzufügen.

Für dieses Instructable verwenden wir das Reflectance Sensor Arrray von Pololu, da es als Teil des TI-RSLK (des Roboter-Kits) geliefert wird. Es wird im Kurs und in Lab 6 des Curriculums verwendet.

Wenn Sie das nicht haben, können Sie jeden IR-Melder (oder eine Reihe davon) verwenden, der ein digitales Signal HIGH oder LOW für Anwesenheit und Abwesenheit ausgibt.

Der Array-Sensor ist am besten geeignet, weil er erkennen kann, ob wir uns direkt in der Mitte der Linie oder auf einer Seite befinden. Außerdem kann es uns, wie wir später sehen werden, helfen, den Winkel des Roboters in Bezug auf die Linie zu erkennen.

Das Reflektanz-Array hat Detektoren, die sehr nahe beieinander liegen. Das bedeutet, dass wir mehrere Erkennungssignale erhalten sollten, natürlich abhängig von der Dicke der Linie.

Wenn dies der Fall ist, sollte der Roboter, wenn er sich nicht direkt an der Linie befindet, eine Ausgabe zurückgeben, dass die Linie breiter ist, als sie sein sollte (weil wir uns in einem Winkel befinden).

Für eine bessere Erklärung des oben Gesagten werfen Sie einen Blick auf das Lab 6-Dokument.

Für Hilfe bei der Verkabelung / Verbindung des Sensors mit dem MSP432 LaunchPad-Entwicklungsboard finden Sie hier einige hilfreiche Anweisungen.

Ich habe diesem Schritt auch die gleichen (ähnlichen?) PDF-Anweisungen hinzugefügt.

Wenn Sie die Pololu-Dokumente sorgfältig lesen, erklären sie den Grund für den "3.3V-Bypass", den Sie überbrücken möchten, wenn Sie 3.3V anstelle von 5V verwenden.

Da wir den Roboter noch nicht bauen, sondern nur die ARM-Montage und auch die Interaktion mit Teilen (Subsystemen) des Roboters lernen, müssen wir die obigen Anweisungen nicht buchstabengetreu befolgen.

Im Moment läuft das Anschließen des Zeilensensor-Arrays nur auf Folgendes hinaus:

  • Verbinden Sie 3,3 V und GND von der MSP432-Platine mit dem Sensor-Array.
  • Verbinden Sie einen Port-Pin (ich schlage P5.3) vom MSP432 mit dem LED-Enable-Pin des Zeilensensor-Arrays. Dieser Pin am Sensor liegt zwischen 3,3 V und GND.
  • Verbinden Sie alle acht Pins / Bits eines einzelnen Ports (ich schlage P7.0 bis P7.7) mit den acht Pins des Sensorarrays mit der Bezeichnung "1" bis "8". Dies sind die Linien, die je nach dem, was sie wahrnehmen, auf HIGH oder LOW gehen.

Wie Sie in den Bildern dieses Schrittes und im Video sehen können, habe ich den Sensor nicht am Roboterchassis befestigt, weil ich eine einfache Programmierung, Fehlersuche, Testung und Lernen wollte.

Wenn also alles verbunden ist, sind wir bereit, in die Software einzusteigen.

Schritt 2: Zeilenfolge

Linie folgt
Linie folgt
Linie folgt
Linie folgt

Der Reflexions-Array-Sensor ist ziemlich raffiniert, da er auf mindestens zwei Arten helfen kann.

  • Bestimmen Sie, ob der Roboter auf der Linie zentriert ist oder zu einer Seite abdriftet.
  • Ist der Roboter in Richtung der Linie ausgerichtet oder steht er schräg.

Jeder der Detektoren des Arrays liefert im Wesentlichen ein Informationsbit, entweder HIGH oder LOW.

Die Idee ist, all diese Bits zu einer einzigen Zahl oder einem einzelnen Bitmuster zu kombinieren und dieses Muster zu verwenden, um Entscheidungen zu treffen (um sich richtig zu bewegen).

Schritt 3: Bevor wir wirklich loslegen können…

.. wir müssen etwas Neues über die ARM-Assemblerprogrammierung lernen. Und ich meine nicht nur eine andere Anweisung. Diese sind in der Regel gering.

Bisher haben wir den "Stack" in unseren Programmen nicht verwendet.

Wir haben uns darauf verlassen, die meisten Kern-CPU-Register global über verschiedene Subroutinen hinweg zu verwenden.

Die einzige Sache, die wir gemacht haben, war, die LR-Adresse (Link Register) für eine Funktion zu speichern und wiederherzustellen - diejenige, die mehrere andere Funktionen aufgerufen hat. (Ich verwende hier "Funktion" und "Unterprogramm" austauschbar).

Was wir gemacht haben, ist nicht gut. Was ist, wenn wir andere Funktionen verschachteln möchten? Was ist, wenn wir mehr als eine Verschachtelungsebene haben?

In den vorherigen Beispielen haben wir uns dafür entschieden, das Register R6 als Speicher für die LR- oder Rücksprungadresse zu verwenden. Wenn wir jedoch weiter / tiefer verschachteln möchten, können wir den Wert von R6 nicht weiter ändern. Wir müssten noch ein weiteres Register auswählen. Und ein anderer. Und dann wird es mühsam, nachzuverfolgen, welches Kern-CPU-Register welche LR für welche Funktion wiederherzustellen.

Also schauen wir uns jetzt den "Stack" an.

Schritt 4: Der Stapel

Hier ist etwas Lesematerial, das den Stapel erklärt.

Ich bin ein größerer Befürworter von ein paar Ideen:

  • nur so viel Theorie wie nötig, schnell ins Praktische
  • nach Bedarf lernen, sich darauf konzentrieren, etwas tatsächlich zu tun und nicht nur zwecklose Übungen oder Beispiele.

Es gibt viele ARM- und MSP432-Dokumentationen online, die sich mit dem Stack befassen, also werde ich das nicht alles wiederholen. Ich werde auch die Verwendung des Stapels hier auf ein absolutes Minimum beschränken - die Rücksendeadresse (das Link Register) speichern.

Im Wesentlichen brauchen wir nur Anweisungen:

PUSH {Liste registrieren}

POP{Liste registrieren}

Oder in unserem Fall konkret:

DRÜCKEN {LR}

POP-{LR}

Eine Assembly-Funktion/-Subroutine würde also so aussehen:

funcLabel:.asmfunc

PUSH{LR};Dies sollte wahrscheinlich eine der ersten Anweisungen bei der Eingabe sein.; mach mehr Code hier..; bla.. bla… bla…; ok, wir sind fertig mit der Funktion, bereit zur Rückkehr zur aufrufenden Funktion POP{LR}; dies stellt die korrekte Rückkehradresse zum Aufrufen wieder her; Funktion. BXLR;.endasmfunc. zurückgeben

Das Video führt ein Live-Beispiel mehrerer verschachtelter Funktionen durch.

Schritt 5: Die Software

Die angehängte Datei mit der Bezeichnung "MSP432_Chapter…" enthält viele gute Informationen über die Ports des MSP432, und aus diesem Dokument erhalten wir die folgenden Ports, Register, Adressen usw. Sie ist jedoch etwas veraltet. Ich habe jedoch die detaillierten Adressen für Port 5 und höher nicht angezeigt. (nur "alternative Funktionen"). Aber es ist immer noch nützlich.

Wir werden zwei Ports verwenden. P5, P7, P1 und P2.

Der Ausgang P5.3 (ein einzelnes Bit) dient zur Steuerung der IR-LED-Aktivierung des Sensors. Wir verwenden P5.3, weil es sich um einen freiliegenden Pin auf demselben Header wie die anderen MSP432-Anschlüsse handelt, die zum Sensor-Array gehen.

P7.0 bis P7.7 sind die acht Eingänge, die die Daten vom Sensor sammeln; was es "sieht".

P1.0 ist die einzelne rote LED und wir könnten sie verwenden, um uns einige Hinweise auf die Daten zu geben.

P2.0, P2.1, P2.2 ist die RGB-LED und auch diese können wir mit ihren unterschiedlichen Farbmöglichkeiten nutzen, um uns die Sensordaten anzuzeigen.

Wenn Sie die vorherigen Instructables zu all dem durchgegangen sind, wissen Sie bereits, wie Sie das Programm einrichten.

Haben Sie nur einen Deklarationsabschnitt für die Ports und Bits usw.

Sie haben einen "Haupt"-Bereich.

Es sollte eine Schleife geben, in der wir kontinuierlich die Daten von P7 lesen, eine Entscheidung über diese Daten treffen und die beiden LEDs entsprechend aufleuchten.

Hier nochmal die Port Register Adressen:

  • GPIO P1: 0x4000 4C00 + 0 (gerade Adressen)
  • GPIO P2: 0x4000 4C00 + 1 (ungerade Adressen)
  • GPIO P3: 0x4000 4C00 + 20 (gerade Adressen)
  • GPIO P4: 0x4000 4C00 + 21 (ungerade Adressen)
  • GPIO P5: 0x4000 4C00 + 40 (gerade Adressen)
  • GPIO P6: 0x4000 4C00 + 41 (ungerade Adressen)
  • GPIO P7: 0x4000 4C00 + 60 (gerade Adressen)
  • GPIO P8: 0x4000 4C00 + 61 (ungerade Adressen)
  • GPIO P9: 0x4000 4C00 + 80 (gerade Adressen)
  • GPIO P10: 0x4000 4C00 + 81 (ungerade Adressen)

Was fett gedruckt ist, ist das, was wir für dieses Instructable verwenden werden.

Programmierschritte zum Auslesen von IR-Detektoren

Das Folgende ist Pseudocode zum Schreiben des Programms in C, aber es ist immer noch nützlich, und wir werden es in der Assemblerversion des Programms ziemlich genau verfolgen.

Hauptprogramm0) // Ports initialisieren, während (1) { 1) P5.3 hoch setzen (IR-LED einschalten) 2) P7.0 zu einem Ausgang machen und ihn hoch setzen (Kondensator laden) 3) Warten Sie 10 us, Clock_Delay1us (10); 4) Machen Sie aus P7.0 einen Eingang 5) Führen Sie diese Schleife 10.000 Mal aus a) Lesen Sie P7.0 (konvertiert die Spannung an P7.0 in binär) b) Ausgang binär zu P1.0 (ermöglicht es Ihnen, Binär in Echtzeit zu sehen) 6) P5.3 niedrig setzen (IR-LED ausschalten, Strom sparen) 7) 10 ms warten, Clock_Delay1ms(10); } // wiederholen (zurück zu while())

Schritt 6: Lassen Sie uns den Code verbessern

Der Zweck oder die Verwendung des Pololu IR-LED-Arrays besteht darin, eine Linie zu erkennen und zu wissen, ob der Roboter (zukünftig) direkt auf der Linie oder seitlich zentriert ist. Da die Linie eine bestimmte Dicke hat, haben N Sensoren einen anderen Messwert als der Rest, wenn das Sensorarray direkt senkrecht zur Linie steht, während sich das IR-LED-Array in einem bestimmten Winkel (nicht senkrecht) befindet N+1 oder N+2 IR-LED/Detektor-Paare sollten jetzt einen anderen Messwert liefern.

Abhängig davon, wie viele Sensoren das Vorhandensein der Linie anzeigen, sollten wir also wissen, ob wir zentriert sind und ob wir abgewinkelt sind oder nicht.

Für dieses letzte Experiment wollen wir nur sehen, ob wir die rote LED und die RGB-LED bekommen, um uns mehr Informationen darüber zu geben, was das Sensorarray uns sagt.

Das Video geht auf alle Details ein. Der endgültige Code ist ebenfalls beigefügt.

Damit ist die Reihe der ARM-Assembly im Zusammenhang mit GPIO abgeschlossen. Wir hoffen, zu einem späteren Zeitpunkt mit mehr ARM Assembly zurückkehren zu können.

Dankeschön.

Empfohlen: