- Erforderliche Komponenten
- Machen Sie sich bereit für den 3D-gedruckten Robotic ARM
- Schaltplan
- Schritte zur Programmierung von LPC2148 für Robotic Arm
- Codierungserklärung
- Auswählen des Servomotors zum Drehen mit Drucktasten
- Arbeiten am Pick-and-Place-Roboterarm
Roboterarme sind eine der faszinierenden technischen Kreationen, und es ist immer wieder faszinierend zu beobachten, wie sich diese Dinge neigen und schwenken, um komplexe Dinge so zu erledigen, wie es ein menschlicher Arm tun würde. Diese Roboterarme sind häufig in Industrien am Fließband zu finden, die intensive mechanische Arbeiten wie Schweißen, Bohren, Lackieren usw. ausführen. Kürzlich wurden auch fortschrittliche Roboterarme mit hoher Präzision entwickelt, um komplexe chirurgische Operationen durchzuführen. In diesem Tutorial bauen wir einen einfachen Roboterarm mit dem ARM7-LPC2148-Mikrocontroller zum Aufnehmen und Platzieren eines Objekts durch manuelle Steuerung einiger Potentiometer.
In diesem Tutorial verwenden wir einen 3D-gedruckten Roboter-ARM, der nach dem Verfahren in thingiverse erstellt wurde. Der ARM verwendet 4 Servomotoren für die Roboter-ARM-Bewegung. Wenn Sie keinen Drucker haben, können Sie Ihren Arm auch aus einfachen Pappen bauen, wie wir sie für unser Arduino Robotic Arm Project gebaut haben. Als Inspiration können Sie auch auf den Record and Play Robotic Arm verweisen, den wir zuvor mit Arduino gebaut haben.
Nun bereiten wir die Dinge für unser Projekt vor
Erforderliche Komponenten
- 3D-Drucker Robotic ARM
- ARM7-LPC2148
- SG-90 Servomotor (4)
- 10k Potentiometer (4)
- Druckknopf (4)
- LED (4)
- 5V (1A) DC-Netzteil
- Widerstände (10 k (4), 2,2 k (4))
- Steckbrett
- Kabel anschließen
Machen Sie sich bereit für den 3D-gedruckten Robotic ARM
Der in diesem Tutorial verwendete 3D-gedruckte Roboterarm wurde nach dem Entwurf von EEZYbotARM erstellt, der im Thingiverse erhältlich ist. Das vollständige Verfahren zur Herstellung des 3D-gedruckten Roboterarms und das Zusammenbau-Detail mit Video finden Sie in dem oben angegebenen Link zu thingiverse.
Dies ist das Bild meines 3D-gedruckten Roboterarms nach dem Zusammenbau mit 4 Servomotoren.
Schaltplan
Das folgende Bild zeigt die Schaltungsverbindungen des ARM-basierten Roboterarms.
Die Schaltungsanschlüsse für das Projekt sind einfach. Stellen Sie sicher, dass die Servomotoren mit einem separaten 5-V-Gleichstromnetzteil betrieben werden. Für Potentiometer und Drucktasten können wir 3,3 V verwenden, die vom Mikrocontroller LPC2148 erhältlich sind.
Hier verwenden wir die 4 ADC-Pins von LPC2148 mit 4 Potentiometern. Außerdem sind 4 PWM-Pins des LPC2148 mit den PWM-Pins des Servomotors verbunden. Wir haben auch 4 Drucktasten angeschlossen, um auszuwählen, welcher Motor betrieben werden soll. Nach dem Drücken der Taste wird das jeweilige Potentiometer variiert, um die Position des Servomotors zu ändern.
Die Druckknöpfe an einem Ende, das mit dem GPIO von LPC2148 verbunden ist, werden über einen Widerstand von 10 k heruntergezogen, und ein anderes Ende ist mit 3,3 V verbunden. Außerdem sind 4 LEDs angeschlossen, um anzuzeigen, welcher Servomotor zum Ändern der Position ausgewählt wurde.
Stromkreisverbindungen zwischen 4 Servomotoren und LPC2148:
LPC2148 | Servomotor |
P0.1 | SERVO1 (PWM-Orange) |
P0.7 | SERVO2 (PWM-Orange) |
P0.8 | SERVO3 (PWM-Orange) |
P0.21 | SERVO4 (PWM-Orange) |
Stromkreisverbindungen zwischen 4 Potentiometer und LPC2148:
LPC2148 | Potentiometer-Mittelstift Linker Stift - 0 V GND von LPC2148 Rechter Stift - 3,3 V von LPC2148 |
P0.25 | Potentiometer1 |
P0.28 | Potentiometer2 |
P0.29 | Potentiometer3 |
P0.30 | Potentiometer4 |
Schaltungsanschlüsse von 4 LEDs mit LPC2148:
LPC2148 | LED-Anode (Kathode aller LED ist GND) |
P1.28 | LED1 (Anode) |
P1.29 | LED2 (Anode) |
P1.30 | LED3 (Anode) |
P1.31 | LED4 (Anode) |
Schaltungsanschlüsse von 4 Drucktasten mit LPC2148:
LPC2148 | Druckknopf (mit Pull-Down-Widerstand 10k) |
P1.17 | Drucktaste1 |
P1.18 | Drucktaste2 |
P1.19 | Drucktaste3 |
P1.20 | Drucktaste4 |
Schritte zur Programmierung von LPC2148 für Robotic Arm
Vor dem Programmieren für diesen Roboterarm müssen wir wissen, wie PWM in LPC2148 generiert und ADC in ARM7-LPC2148 verwendet wird. Lesen Sie dazu unsere früheren Projekte zur Schnittstelle zwischen Servomotor und LPC2148 und zur Verwendung von ADC in LPC2148.
ADC-Konvertierung mit LPC2148
Da wir ADC-Werte zum Einstellen des Arbeitszykluswerts zum Erzeugen des PWM-Ausgangs zum Steuern der Servomotorposition bereitstellen müssen. Wir müssen die ADC-Werte des Potentiometers finden. Da wir vier Potentiometer zur Steuerung von vier Servomotoren haben, benötigen wir 4 ADC-Kanäle von LPC2148. Hier in diesem Tutorial verwenden wir ADC-Pins (P0.25, P0.28, P0.29, P0.30) von ADC-Kanälen von 4,1,2,3, die in LPC2148 vorhanden sind.
Generieren von PWM-Signalen für Servomotoren mit LPC2148
Da müssen wir PWM-Signale zur Steuerung der Servomotorposition erzeugen. Wir müssen den Arbeitszyklus von PWM einstellen. Wir haben vier Servomotoren an den Roboterarm angeschlossen, daher benötigen wir 4 PWM-Kanäle von LPC2148. Hier in diesem Tutorial verwenden wir PWM-Pins (P0.1, P0.7, P0.8, P0.21) von PWM-Kanälen von 3,2,4,5, die in LPC2148 vorhanden sind.
Programmieren und Flashen der Hex-Datei auf LPC2148
Um ARM7-LPC2148 zu programmieren, benötigen wir keil uVision & um den HEX-Code auf das LPC2148 Flash Magic Tool zu flashen. Hier wird ein USB-Kabel verwendet, um den ARM7 Stick über einen Micro-USB-Anschluss zu programmieren. Wir schreiben Code mit Keil und erstellen eine Hex-Datei. Anschließend wird die HEX-Datei mit Flash Magic auf den ARM7-Stick geflasht. Um mehr über die Installation von keil uVision und Flash Magic und deren Verwendung zu erfahren, folgen Sie dem Link Erste Schritte mit dem ARM7 LPC2148-Mikrocontroller und programmieren Sie ihn mit Keil uVision.
Codierungserklärung
Das vollständige Programm für dieses Roboterarmprojekt finden Sie am Ende des Tutorials. Lassen Sie uns nun die Programmierung im Detail sehen.
Konfigurieren von PORT von LPC2148 für die Verwendung von GPIO, PWM und ADC:
Verwenden des PINSEL1-Registers zum Aktivieren der ADC-Kanäle ADC0.4, ADC0.1, ADC0.2, ADC0.3 für die Pins P0.25, P0.28, P0.29, P0.30. Und auch für PWM5 für den Pin P0.21 (1 << 10).
# AD04 definieren (1 << 18) // AD0.4-Funktion für P0.25 auswählen # AD01 definieren (1 << 24) // AD0.1-Funktion für P0.28 auswählen # AD02 definieren (1 << 26) / / AD0.2-Funktion für P0.29 auswählen # AD03 definieren (1 << 28) // AD0.3-Funktion für P0.30 auswählen PINSEL1 - = AD04 - AD01 - AD02 - AD03 - (1 << 10);
Verwenden des PINSEL0-Registers zum Aktivieren der PWM-Kanäle PWM3, PWM2, PWM4 für die Pins P0.1, P0.7, P0.8 von LPC2148.
PINSEL0 = 0x000A800A;
Verwenden des PINSEL2-Registers zum Aktivieren der GPIO-Pin-Funktion für alle Pins in PORT1, die für die Verbindung von LED und Drucktaste verwendet werden.
PINSEL2 = 0x00000000;
Um die LED-Pins als Ausgang und die Drucktasten als Eingang zu verwenden, wird das IODIR1-Register verwendet. (0 für INPUT & 1 für OUTPUT)
IODIR1 = ((0 << 17) - (0 << 18) - (0 << 19) - (0 << 20) - (1 << 28) - (1 << 29) - (1 << 30)) - (1 << 31));
Während die Pin-Nummern definiert sind als
#define SwitchPinNumber1 17 // (Verbunden mit P1.17) #define SwitchPinNumber2 18 // (Verbunden mit P1.18) #define SwitchPinNumber3 19 // (Verbunden mit P1.19) #define SwitchPinNumber4 20 // (Verbunden mit P1. 20) #define LedPinNumber1 28 // (Verbunden mit P1.28) #define LedPinNumber2 29 // (Verbunden mit P1.29) #define LedPinNumber3 30 // (Verbunden mit P1.30) #define LedPinNumber4 31 // (Verbunden mit P1.31)
Konfigurieren der ADC-Konvertierungseinstellung
Als nächstes werden der ADC-Konvertierungsmodus und die Uhr für ADC unter Verwendung des Registers AD0CR_setup eingestellt.
unsigned long AD0CR_setup = (CLKDIV << 8) - BURST_MODE_OFF - PowerUP; // ADC-Modus einrichten
Während CLCKDIV, Burst Mode und PowerUP definiert sind als
#define CLKDIV (15-1) #define BURST_MODE_OFF (0 << 16) // 1 für Ein und 0 für Aus #define PowerUP (1 << 21)
Einstellen der Uhr für die ADC-Konvertierung (CLKDIV)
Dies wird verwendet, um die Uhr für ADC zu erzeugen. 4-MHz-ADC-Takt (ADC_CLOCK = PCLK / CLKDIV), wobei tatsächlich "CLKDIV-1" verwendet wird, in unserem Fall PCLK = 60 MHz
Burst-Modus (Bit-16): Dieses Bit wird für die BURST-Konvertierung verwendet. Wenn dieses Bit gesetzt ist, führt das ADC-Modul die Konvertierung für alle ausgewählten Kanäle (SET) in SEL-Bits durch. Wenn Sie in diesem Bit 0 setzen, wird die BURST-Konvertierung deaktiviert.
Ausschaltmodus (Bit-21): Hiermit wird der ADC ein- oder ausgeschaltet. Die Einstellung (1) in diesem Bit bringt den ADC aus dem Ausschaltmodus und macht ihn betriebsbereit. Durch Löschen dieses Bits wird der ADC ausgeschaltet.
Konfigurieren der PWM-Konvertierungseinstellung
Zuerst den Zähler für PWM mithilfe des PWMTCR-Registers zurücksetzen und deaktivieren und das PWM-Timer-Prescale-Register mit dem Prescaler-Wert einrichten.
PWMTCR = 0x02; PWMPR = 0x1D;
Stellen Sie als nächstes die maximale Anzahl von Zählungen in einem Zyklus ein. Dies erfolgt im Match Register 0 (PWMMR0). Da wir 20000 haben, handelt es sich um eine PWM-Welle von 20 ms
PWMMR0 = 20000;
Nachdem der Wert für das Tastverhältnis in den Übereinstimmungsregistern eingestellt wurde, verwenden wir PWMMR4, PWMMR2, PWMMR3, PWMMR5. Hier setzen wir Anfangswerte von 0 ms (Toff)
PWMMR4 = 0; PWMMR2 = 0; PWMMR3 = 0; PWMMR5 = 0;
Stellen Sie danach das PWM-Übereinstimmungssteuerregister so ein, dass ein Zähler zurückgesetzt wird, wenn das Übereinstimmungsregister auftritt.
PWMMCR = 0x00000002; // Beim MR0-Match zurücksetzen
Danach das PWM-Latch-Aktivierungsregister, um die Verwendung des Übereinstimmungswerts (PWMLER) zu ermöglichen.
PWMLER = 0x7C; // Latch-Freigabe für PWM2, PWM4, PWM4 und PWM5
Setzen Sie den Timer-Zähler mit einem Bit im PWM-Timer- Steuerregister (PWMTCR) zurück und aktivieren Sie die PWM.
PWMTCR = 0x09; // PWM und Zähler aktivieren
Aktivieren Sie anschließend die PWM-Ausgänge und stellen Sie die PWM im PWM-Steuerregister (PWMPCR) in den einkantengesteuerten Modus.
PWMPCR = 0x7C00; // Aktiviere PWM2, PWM4, PWM4 und PWM5, einkantengesteuertes PWM
Auswählen des Servomotors zum Drehen mit Drucktasten
Wir haben vier Druckknöpfe, mit denen vier verschiedene Servomotoren gedreht werden. Durch Auswahl eines Druckknopfs und Variation des entsprechenden Potentiometers stellt der ADC-Wert das Tastverhältnis ein und der entsprechende Servomotor ändert seine Position. Um den Status des Druckknopfschalters zu erhalten
switchStatus1 = (IOPIN1 >> SwitchPinNumber1) & 0x01;
Abhängig davon, welcher Schaltwert HOCH ist, findet die ADC-Konvertierung statt, und nach erfolgreicher Konvertierung des ADC-Werts (0 bis 1023) wird sie in Form von (0 bis 2045) abgebildet und dann in den Arbeitszykluswert geschrieben Der PWM-Pin (PWMMRx) ist mit dem Servomotor verbunden. Außerdem wird eine LED auf HIGH gestellt, um anzuzeigen, welcher Schalter gedrückt wird. Das Folgende ist ein Beispiel für den ersten Druckknopf
if (switchStatus1 == 1) { IOPIN1 = (1 <
Arbeiten am Pick-and-Place-Roboterarm
Drücken Sie nach dem Hochladen des Codes auf den LPC2148 einen beliebigen Schalter und variieren Sie das entsprechende Potentiometer, um die Position des Roboterarms zu ändern.
Jeder Schalter und jedes Potentiometer steuern jede Servomotorbewegung, bei der es sich um eine Grundbewegung nach links oder rechts, eine Aufwärts- oder Abwärtsbewegung, eine Vorwärts- oder Rückwärtsbewegung und dann den Greifer handelt, um die Bewegung zu halten und freizugeben. Der vollständige Code mit einem detaillierten Arbeitsvideo ist unten angegeben.