- Componenten vereist
- Voorbereiding op de 3D-geprinte robotarm
- Schakelschema
- Stappen die betrokken zijn bij het programmeren van LPC2148 voor robotarm
- Codering Uitleg
- Selecteren van de te draaien servomotor met drukknoppen
- Werking van Pick and Place Robotarm
Robotarmen zijn een van de fascinerende technische creaties en het is altijd fascinerend om te zien hoe deze dingen kantelen en draaien om complexe dingen voor elkaar te krijgen, net zoals een menselijke arm dat zou doen. Deze robotarmen zijn vaak te vinden in industrieën aan de lopende band die intensief mechanisch werk uitvoeren, zoals lassen, boren, schilderen, enz. Recentelijk worden geavanceerde robotarmen met hoge precisie ontwikkeld om complexe chirurgische ingrepen uit te voeren. Dus in deze tutorial laten we bouwen aan een eenvoudige robotarm met behulp van ARM7-LPC2148 microcontroller voor het oppakken en plaatsen van een voorwerp door handmatig besturen van enkele potentiometers.
In deze tutorial zullen we een 3D-geprinte robotarm gebruiken die is gebouwd door de procedure in Thingiverse te volgen. De ARM maakt gebruik van 4 servomotoren voor robotachtige ARM-beweging. Als je geen printer hebt, kun je je arm ook bouwen met eenvoudige kartonnen kaarten zoals we hebben gebouwd voor ons Arduino Robotic Arm Project. Ter inspiratie kun je ook verwijzen naar de Record and Play Robotic Arm die we eerder met Arduino hebben gebouwd.
Dus laten we nu de dingen klaarmaken voor ons project
Componenten vereist
- 3D-printer robotarm
- ARM7-LPC2148
- Sg-90 servomotor (4)
- 10k Potentiometer (4)
- Drukknop (4)
- LED (4)
- 5V (1A) DC-voedingsadapter
- Weerstanden (10k (4), 2,2k (4))
- Breadboard
- Verbindingsdraden
Voorbereiding op de 3D-geprinte robotarm
De 3D-geprinte robotarm die in deze tutorial wordt gebruikt, is gemaakt volgens het ontwerp van EEZYbotARM dat beschikbaar is in het Thingiverse. De volledige procedure voor het maken van de 3D-geprinte robotarm en het assemblagedetail met video zijn aanwezig in de Thingiverse-link, die hierboven is weergegeven.
Dit is de afbeelding van mijn 3D-geprinte robotarm na montage met 4 servomotoren.
Schakelschema
De volgende afbeelding toont de circuitaansluitingen van op ARM gebaseerde robotarm.
De circuitaansluitingen voor het project zijn eenvoudig. Zorg ervoor dat u de servomotoren van stroom voorziet met een aparte 5V DC-voedingsadapter. Voor potmeters en drukknoppen kunnen we 3.3V gebruiken die beschikbaar is via de LPC2148-microcontroller.
Hier gebruiken we de 4 ADC-pinnen van LPC2148 met 4 potentiometers. En ook 4 PWM-pinnen van LPC2148 verbonden met de PWM-pinnen van de servomotor. We hebben ook 4 drukknoppen aangesloten om te selecteren welke motor moet worden bediend. Dus na het indrukken van de knop wordt de gerespecteerde potentiometer gevarieerd om de positie van de servomotor te veranderen.
De drukknoppen aan het ene uiteinde dat is verbonden met GPIO van LPC2148 zijn pull-down via een weerstand van 10k en het andere uiteinde is verbonden met 3.3V. Er zijn ook 4 LED's aangesloten om aan te geven welke servomotor is geselecteerd om de positie te wijzigen.
Circuitverbindingen tussen 4 Servomotoren en LPC2148:
LPC2148 | Servomotor |
P0.1 | SERVO1 (PWM-Oranje) |
P0.7 | SERVO2 (PWM-Oranje) |
P0.8 | SERVO3 (PWM-Oranje) |
P0.21 | SERVO4 (PWM-Oranje) |
Circuitverbindingen tussen 4 Potentiometers en LPC2148:
LPC2148 | Potentiometer Middenpen Linkerpen - 0V GND van LPC2148 Rechterpen - 3.3V van LPC2148 |
P0.25 | Potentiometer 1 |
P0.28 | Potentiometer 2 |
P0.29 | Potentiometer 3 |
P0.30 | Potentiometer 4 |
Circuitaansluitingen van 4 LED's met LPC2148:
LPC2148 | LED-anode (kathode van alle LED's is GND) |
P1.28 | LED1 (anode) |
P1.29 | LED2 (anode) |
P1.30 | LED3 (anode) |
P1.31 | LED4 (Anode) |
Circuitaansluitingen van 4 drukknoppen met LPC2148:
LPC2148 | Drukknop (met neertrekweerstand 10k) |
P1.17 | Drukknop 1 |
P1.18 | Drukknop 2 |
P1.19 | Drukknop 3 |
P1.20 | Drukknop 4 |
Stappen die betrokken zijn bij het programmeren van LPC2148 voor robotarm
Voordat we voor deze robotarm gaan programmeren, moeten we weten hoe we PWM genereren in LPC2148 en ADC gebruiken in ARM7-LPC2148. Raadpleeg hiervoor onze eerdere projecten over Interfacing Servomotor met LPC2148 en het gebruik van ADC in LPC2148.
ADC-conversie met behulp van LPC2148
Omdat we ADC-waarden moeten opgeven voor het instellen van de werkcycluswaarde voor het genereren van PWM-uitvoer voor het regelen van de servomotorpositie. We moeten de ADC-waarden van de potentiometer vinden. Omdat we vier potentiometers hebben voor het besturen van vier servomotoren, hebben we 4 ADC-kanalen van LPC2148 nodig. Hier in deze tutorial gebruiken we ADC-pinnen (P0.25, P0.28, P0.29, P0.30) van ADC-kanalen van 4,1,2,3 respectievelijk aanwezig in LPC2148.
Genereren van PWM-signalen voor servomotor met behulp van LPC2148
Omdat we PWM-signalen moeten genereren voor het regelen van de servomotorpositie. We moeten de duty-cycle van PWM instellen. We hebben vier servomotoren aangesloten op de robotarm, dus we hebben 4 PWM-kanalen van LPC2148 nodig. Hier in deze tutorial gebruiken we PWM-pinnen (P0.1, P0.7, P0.8, P0.21) van PWM-kanalen van 3,2,4,5 die respectievelijk aanwezig zijn in LPC2148.
Programmeren en flashen van hex-bestand naar LPC2148
Om ARM7-LPC2148 te programmeren, hebben we keil uVision nodig en om HEX-code naar LPC2148 te flashen is Flash Magic-tool nodig. Een USB-kabel wordt hier gebruikt om de ARM7 Stick via een micro-USB-poort te programmeren. We schrijven code met Keil en maken een hex-bestand en vervolgens wordt het HEX-bestand met Flash Magic naar de ARM7-stick geflitst. Om meer te weten over het installeren van keil uVision en Flash Magic en hoe u ze kunt gebruiken, volgt u de link Aan de slag met ARM7 LPC2148 Microcontroller en programmeert u deze met Keil uVision.
Codering Uitleg
Het volledige programma voor dit robotarmproject wordt aan het einde van de tutorial gegeven. Laten we nu de programmering in detail bekijken.
PORT van LPC2148 configureren voor het gebruik van GPIO, PWM en ADC:
Het PINSEL1-register gebruiken om de ADC-kanalen in te schakelen - ADC0.4, ADC0.1, ADC0.2, ADC0.3 voor de pinnen P0.25, P0.28, P0.29, P0.30. En ook voor PWM5 voor de pin P0.21 (1 << 10).
#define AD04 (1 << 18) // Selecteer AD0.4-functie voor P0.25 #define AD01 (1 << 24) // Selecteer AD0.1-functie voor P0.28 #define AD02 (1 << 26) / / Selecteer AD0.2-functie voor P0.29 #define AD03 (1 << 28) // Selecteer AD0.3-functie voor P0.30 PINSEL1 - = AD04 - AD01 - AD02 - AD03 - (1 << 10);
Het PINSEL0-register gebruiken om de PWM-kanalen PWM3, PWM2, PWM4 in te schakelen voor pinnen P0.1, P0.7, P0.8 of LPC2148.
PINSEL0 = 0x000A800A;
Gebruik het PINSEL2-register om de GPIO-pinfunctie in te schakelen voor alle pinnen in PORT1 die worden gebruikt voor de verbinding van LED en drukknop.
PINSEL2 = 0x00000000;
Om de LED-pinnen als uitgang en drukknop pinnen als ingang te maken, wordt het IODIR1-register gebruikt. (0 voor INPUT & 1 voor OUTPUT)
IODIR1 = ((0 << 17) - (0 << 18) - (0 << 19) - (0 << 20) - (1 << 28) - (1 << 29) - (1 << 30) - (1 << 31));
Terwijl de pincodes zijn gedefinieerd als
#define SwitchPinNumber1 17 // (Verbonden met P1.17) #define SwitchPinNumber2 18 // (Verbonden met P1.18) #define SwitchPinNumber3 19 // (Verbonden met P1.19) #define SwitchPinNumber4 20 // (Verbonden met P1. 20) #define LedPinNumber1 28 // (Verbonden met P1.28) #define LedPinNumber2 29 // (Verbonden met P1.29) #define LedPinNumber3 30 // (Verbonden met P1.30) #define LedPinNumber4 31 // (Verbonden met P1.31)
ADC-conversie-instelling configureren
Vervolgens wordt de ADC-conversiemodus en de klok voor ADC ingesteld met behulp van het AD0CR_setup-register.
lange niet-ondertekende AD0CR_setup = (CLKDIV << 8) - BURST_MODE_OFF - PowerUP; // ADC-modus instellen
Terwijl de CLCKDIV, Burst Mode en PowerUP zijn gedefinieerd als
#define CLKDIV (15-1) #define BURST_MODE_OFF (0 << 16) // 1 voor aan en 0 voor uit #define PowerUP (1 << 21)
De klok instellen voor ADC-conversie (CLKDIV)
Dit wordt gebruikt om de klok voor ADC te produceren. 4Mhz ADC-klok (ADC_CLOCK = PCLK / CLKDIV) waarbij "CLKDIV-1" daadwerkelijk wordt gebruikt, in ons geval PCLK = 60mhz
Burst-modus (Bit-16): deze bit wordt gebruikt voor BURST-conversie. Als deze bit is ingesteld, zal de ADC-module de conversie uitvoeren voor alle kanalen die zijn geselecteerd (SET) in SEL-bits. Als u 0 instelt in deze bit, wordt de BURST-conversie uitgeschakeld.
Power Down Mode (Bit-21): Dit wordt gebruikt om ADC AAN of UIT te zetten. Instelling (1) in deze bit haalt ADC uit de stroomuitschakelmodus en maakt deze operationeel. Als u dit bit wist, wordt de ADC uitgeschakeld.
PWM-conversie-instelling configureren
Reset en deactiveer eerst de teller voor PWM met behulp van het PWMTCR-register en stel het PWM Timer Prescale Register in met de waarde van de voorschrijver.
PWMTCR = 0x02; PWMPR = 0x1D;
Stel vervolgens het maximale aantal tellingen in één cyclus in. Dit wordt gedaan in Match Register 0 (PWMMR0). Omdat we 20000 hebben, want het is een PWM-golf van 20 msec
PWMMR0 = 20000;
Stel daarna de waarde in voor de duty-cycle in de matchregisters, we gebruiken PWMMR4, PWMMR2, PWMMR3, PWMMR5. Hier stellen we de beginwaarden in van 0 msec (Toff)
PWMMR4 = 0; PWMMR2 = 0; PWMMR3 = 0; PWMMR5 = 0;
Stel daarna het PWM Match Control Register in om een tellerreset te veroorzaken wanneer het matchregister plaatsvindt.
PWMMCR = 0x00000002; // Reset op MR0-wedstrijd
Daarna schakelt de PWM-vergrendeling Register in om het gebruik van de matchwaarde (PWMLER) mogelijk te maken
PWMLER = 0x7C; // Vergrendeling inschakelen voor PWM2, PWM4, PWM4 en PWM5
Reset de timer-teller met een bit in het PWM Timer Control Register (PWMTCR) en het activeert ook de PWM.
PWMTCR = 0x09; // Schakel PWM en teller in
Schakel vervolgens de PWM-uitgangen in en stel de PWM in op enkele flankgestuurde modus in PWM-besturingsregister (PWMPCR).
PWMPCR = 0x7C00; // Schakel PWM2, PWM4, PWM4 en PWM5, enkelzijdige PWM in
Selecteren van de te draaien servomotor met drukknoppen
We hebben vier drukknoppen die worden gebruikt om vier verschillende servomotoren te laten draaien. Door een drukknop te selecteren en de bijbehorende potentiometer te variëren, stelt de ADC-waarde de duty-cycle in en verandert de bijbehorende servomotor van positie. Om de status van de drukknopschakelaar te krijgen
switchStatus1 = (IOPIN1 >> SwitchPinNumber1) & 0x01;
Dus, afhankelijk van welke schakelaarwaarde HOOG is, vindt de ADC-conversie plaats en na succesvolle conversie van de ADC-waarde (0 tot 1023) wordt deze in kaart gebracht in termen van (0 tot 2045) en vervolgens wordt de duty-cycle-waarde geschreven naar de (PWMMRx) PWM-pin verbonden met servomotor. En ook wordt een LED HOOG gedraaid om aan te geven welke schakelaar wordt ingedrukt. Het volgende is een voorbeeld voor de eerste drukknop
if (switchStatus1 == 1) { IOPIN1 = (1 <
Werking van Pick and Place Robotarm
Na het uploaden van de code naar de LPC2148, drukt u op een willekeurige schakelaar en varieert u de bijbehorende potentiometer om de positie van de robotarm te wijzigen.
Elke schakelaar en potentiometer bestuurt elke beweging van de servomotor die de basisbeweging naar links of rechts is, de beweging omhoog of omlaag, vooruit of achteruit en vervolgens de grijper om de beweging vast te houden en los te laten. De volledige code met een gedetailleerde werkvideo wordt hieronder gegeven.