- Komponenter krävs
- Förbereda den 3D-tryckta robotarmen
- Kretsschema
- Steg involverade i programmering av LPC2148 för robotarm
- Kodning Förklaring
- Välja servomotor att rotera med hjälp av tryckknappar
- Arbeta med plocka och placera robotarm
Robotic Arms, är en av de fascinerande tekniska skapelserna och det är alltid fascinerande att se dessa saker luta och panorera för att få komplexa saker gjort precis som en mänsklig arm skulle göra. Dessa robotarmar kan vanligtvis hittas i industrier vid monteringsbandet som utför intensivt mekaniskt arbete som svetsning, borrning, målning osv. Nyligen utvecklas också avancerade robotarmar med hög precision för att utföra komplexa kirurgiska operationer. Så i den här handledningen låt oss bygga en enkel robotarm med ARM7-LPC2148 mikrokontroller för att plocka och placera ett objekt genom att manuellt styra några potentiometrar.
I den här handledningen använder vi en 3D-tryckt robotarm som byggdes genom att följa proceduren i thingiverse. ARM använder 4 servomotorer för robotarmsrörelse. Om du inte har en skrivare kan du också bygga din arm med enkla kartonger som vi byggde för vårt Arduino Robotic Arm Project. För inspiration kan du också hänvisa till Record and Play Robotic Arm som vi byggde tidigare med Arduino.
Så nu ska vi göra saker redo för vårt projekt
Komponenter krävs
- 3D-skrivare Robotic ARM
- ARM7-LPC2148
- SG-90 Servomotor (4)
- 10k potentiometer (4)
- Tryckknapp (4)
- LED (4)
- 5V (1A) likströmsadapter
- Motstånd (10k (4), 2.2k (4))
- Bakbord
- Anslutande ledningar
Förbereda den 3D-tryckta robotarmen
Den 3D-tryckta robotarmen som användes i denna handledning gjordes genom att följa designen från EEZYbotARM som finns i Thingiverse. Den kompletta proceduren för att tillverka den 3D-tryckta robotarmen och monteringsdetaljer med video finns i länken thingiverse, som är delad ovan.
Detta är bilden av min 3D-tryckta robotarm efter montering med 4 servomotorer.
Kretsschema
Följande bild visar kretsanslutningarna för ARM-baserad robotarm.
Kretsanslutningarna för projektet är enkla. Se till att driva servomotorerna med en separat 5V likströmsadapter. För potentiometrar och tryckknappar kan vi använda 3.3V som finns tillgänglig från LPC2148 mikrokontroller.
Här använder vi de 4 ADC-stiften på LPC2148 med fyra potentiometrar. Och även 4 PWM-stift på LPC2148 anslutna till PWM-stiften på servomotorn. Vi har också anslutit fyra tryckknappar för att välja vilken motor som ska användas. Efter att ha tryckt på knappen varieras respekterad potentiometer för att ändra servomotorns läge.
Tryckknapparna i ena änden som är ansluten till GPIO på LPC2148 är neddragbara via motstånd på 10k och en annan ände är ansluten med 3,3V. Dessutom är fyra lysdioder anslutna för att indikera vilken servomotor som har valts för att ändra position.
Kretsförbindelser mellan 4 servomotorer och LPC2148:
LPC2148 | Servomotor |
P0.1 | SERVO1 (PWM-Orange) |
P0.7 | SERVO2 (PWM-Orange) |
P0.8 | SERVO3 (PWM-Orange) |
P0.21 | SERVO4 (PWM-Orange) |
Kretsförbindelser mellan 4 potentiometer och LPC2148:
LPC2148 | Potentiometer mittstift Vänster stift - 0V GND av LPC2148 höger stift - 3,3V av LPC2148 |
P0.25 | Potentiometer1 |
P0.28 | Potentiometer2 |
P0.29 | Potentiometer 3 |
P0.30 | Potentiometer 4 |
Kretsanslutningar av 4 lysdioder med LPC2148:
LPC2148 | LED-anod (katod för alla lysdioder är GND) |
P1.28 | LED1 (anod) |
P1.29 | LED2 (anod) |
P1.30 | LED3 (anod) |
P1.31 | LED4 (anod) |
Kretsanslutningar av fyra tryckknappar med LPC2148:
LPC2148 | Tryckknapp (med neddragbar motstånd 10k) |
P1.17 | Tryckknapp 1 |
P1.18 | Tryckknapp2 |
P1.19 | Tryckknapp3 |
P1.20 | Tryckknapp4 |
Steg involverade i programmering av LPC2148 för robotarm
Innan vi programmerar för denna robotarm måste vi veta om att generera PWM i LPC2148 och använda ADC i ARM7-LPC2148. För detta hänvisar vi till våra tidigare projekt om gränssnitts Servomotor med LPC2148 och hur man använder ADC i LPC2148.
ADC-omvandling med LPC2148
Eftersom vi måste tillhandahålla ADC-värden för att ställa in arbetscykelvärde för att generera PWM-utgång för att styra servomotorns position. Vi måste hitta ADC-värdena för potentiometern. Eftersom vi har fyra potentiometrar för styrning av fyra servomotorer behöver vi 4 ADC-kanaler på LPC2148. Här i denna handledning använder vi ADC-stift (P0.25, P0.28, P0.29, P0.30) av ADC-kanaler på 4,1,2,3 som finns i LPC2148.
Generera PWM-signaler för servomotor med LPC2148
Eftersom vi behöver generera PWM-signaler för att styra servomotorns position. Vi måste ställa in arbetscykeln för PWM. Vi har fyra servomotorer anslutna till robotarmen, så vi behöver 4 PWM-kanaler för LPC2148. Här i denna handledning använder vi PWM-stift (P0.1, P0.7, P0.8, P0.21) av PWM-kanaler på 3,2,4,5 som finns i LPC2148.
Programmering och blinkande hexfil till LPC2148
För att programmera ARM7-LPC2148 behöver vi keL uVision & för att blinka HEX-kod till LPC2148 Flash Magic-verktyget behövs. En USB-kabel används här för att programmera ARM7 Stick via mikro-USB-port. Vi skriver kod med Keil och skapar en hex-fil och sedan blinkar HEX-filen till ARM7-stick med Flash Magic. Om du vill veta mer om installation av Keil uVision och Flash Magic och hur du använder dem följer du länken Komma igång med ARM7 LPC2148 Microcontroller och programmerar den med Keil uVision.
Kodning Förklaring
Komplett program för detta robotarmprojekt ges i slutet av handledningen. Låt oss nu se programmeringen i detalj.
Konfigurera PORT för LPC2148 för att använda GPIO, PWM och ADC:
Använda PINSEL1-registret för att aktivera ADC-kanalerna - ADC0.4, ADC0.1, ADC0.2, ADC0.3 för stiften P0.25, P0.28, P0.29, P0.30. Och även för PWM5 för stift P0.21 (1 << 10).
#define AD04 (1 << 18) // Välj AD0.4-funktion för P0.25 #define AD01 (1 << 24) // Välj AD0.1-funktion för P0.28 #define AD02 (1 << 26) / / Välj AD0.2-funktion för P0.29 #definiera AD03 (1 << 28) // Välj AD0.3-funktion för P0.30 PINSEL1 - = AD04 - AD01 - AD02 - AD03 - (1 << 10);
Använda PINSEL0-registret för att aktivera PWM-kanalerna PWM3, PWM2, PWM4 för stift P0.1, P0.7, P0.8 för LPC2148.
PINSEL0 = 0x000A800A;
Använd PINSEL2-registret för att aktivera GPIO-stiftfunktionen för alla stift i PORT1 som används för anslutning av LED och tryckknapp.
PINSEL2 = 0x00000000;
För att göra LED-stiften som utgång och tryckknappstift som ingång används IODIR1-registret. (0 för INGÅNG och 1 för UTGÅNG)
IODIR1 = ((0 << 17) - (0 << 18) - (0 << 19) - (0 << 20) - (1 << 28) - (1 << 29) - (1 << 30) - (1 << 31));
Medan stiftnumren definieras som
#define SwitchPinNumber1 17 // (Ansluten med P1.17) #define SwitchPinNumber2 18 // (Ansluten med P1.18) #define SwitchPinNumber3 19 // (Ansluten med P1.19) #define SwitchPinNumber4 20 // (Ansluten med P1. 20) #define LedPinNumber1 28 // (Connected with P1.28) #define LedPinNumber2 29 // (Connected with P1.29) #define LedPinNumber3 30 // (Connected with P1.30) #define LedPinNumber4 31 // (Connected with P1.31)
Konfigurerar ADC-konverteringsinställning
Därefter ställs ADC-omvandlingsläget och klockan för ADC in med AD0CR_setup-registret.
osignerad lång AD0CR_setup = (CLKDIV << 8) - BURST_MODE_OFF - PowerUP; // Ställa in ADC-läge
Medan CLCKDIV, Burst Mode och PowerUP definieras som
#define CLKDIV (15-1) #define BURST_MODE_OFF (0 << 16) // 1 för på och 0 för av # definiera PowerUP (1 << 21)
Ställa in klockan för ADC-konvertering (CLKDIV)
Detta används för att producera klockan för ADC. 4Mhz ADC-klocka (ADC_CLOCK = PCLK / CLKDIV) där "CLKDIV-1" faktiskt används, i vårt fall PCLK = 60mhz
Burst Mode (Bit-16): Denna bit används för BURST-konvertering. Om denna bit är inställd kommer ADC-modulen att göra omvandlingen för alla kanaler som väljs (SET) i SEL-bitar. Inställning 0 i denna bit inaktiverar BURST-konverteringen.
Avstängningsläge (Bit-21): Detta används för att slå på eller stänga av ADC. Inställning (1) i den här biten tar ADC ur strömavstängningsläge och gör det operativt. Om du rensar den här biten slås ADC av.
Konfigurerar PWM-konverteringsinställning
Först Återställ och inaktivera räknaren för PWM med hjälp av PWMTCR-registret och ställ in PWM Timer Prescale Register med prescaler-värde.
PWMTCR = 0x02; PWMPR = 0x1D;
Ställ sedan in maximalt antal räkningar i en cykel. Detta görs i Match Register 0 (PWMMR0). Eftersom vi har 20000 eftersom det är en PWM-våg på 20 ms
PWMMR0 = 20000;
Efter att ha ställt in värdet för arbetscykel i matchregistret använder vi PWMMR4, PWMMR2, PWMMR3, PWMMR5. Här ställer vi in initialvärden på 0 ms (Toff)
PWMMR4 = 0; PWMMR2 = 0; PWMMR3 = 0; PWMMR5 = 0;
Därefter ställer PWM Match Control Register in för att orsaka en räknareåterställning när matchregistret uppstår.
PWMMCR = 0x00000002; // Återställ vid MR0-match
Därefter aktiverar PWM-spärren Aktivera register för att möjliggöra användning av matchningsvärde (PWMLER)
PWMLER = 0x7C; // Spärraktivering för PWM2, PWM4, PWM4 och PWM5
Återställ timerräknaren med hjälp av en bit i PWM Timer Control Register (PWMTCR) och det aktiverar också PWM.
PWMTCR = 0x09; // Aktivera PWM och räknare
Därefter aktiverar du PWM-utgångarna och ställer in PWM i enkantkontrollerat läge i PWM-kontrollregistret (PWMPCR).
PWMPCR = 0x7C00; // Aktivera PWM2, PWM4, PWM4 och PWM5, enkantstyrd PWM
Välja servomotor att rotera med hjälp av tryckknappar
Vi har fyra tryckknappar som används för att rotera fyra olika servomotorer. Genom att välja en tryckknapp och variera motsvarande potentiometer ställer ADC-värdet in arbetscykeln och motsvarande servomotor ändrar sin position. För att få status för tryckknappsbrytaren
switchStatus1 = (IOPIN1 >> SwitchPinNumber1) & 0x01;
Så beroende på vilket omkopplarvärde som är HÖGT tar ADC-omvandlingen plats och sedan efter framgångsrik konvertering av ADC-värdet (0 till 1023) mappas det i termer av (0 till 2045) och sedan skrivs arbetscykelvärdet till (PWMMRx) PWM-stift ansluten till servomotor. Dessutom lyser en LED högt för att indikera vilken omkopplare som trycks in. Följande är ett exempel på den första tryckknappen
if (switchStatus1 == 1) { IOPIN1 = (1 <
Arbeta med plocka och placera robotarm
Efter uppladdning av kod till LPC2148, tryck på valfri brytare och variera motsvarande potentiometer för att ändra robotarmens position.
Varje brytare och potentiometer styr varje servomotorrörelse som är basen till vänster eller höger, uppåt eller nedåt, framåt eller bakåt och sedan griparen för att hålla och släppa rörelse. Komplett kod med en detaljerad arbetsvideo ges nedan.