- Необходими компоненти
- Подготовка за 3D отпечатаната роботизирана ARM
- Електрическа схема
- Стъпки, включени в програмирането на LPC2148 за роботизирана ръка
- Обяснение на кодирането
- Избиране на сервомотора за завъртане с помощта на бутони
- Работа на роботизирана ръка
Роботизираните оръжия са едно от завладяващите инженерни творения и винаги е очарователно да наблюдавате как тези неща се накланят и завъртат, за да се направят сложни неща, точно както би направила човешката ръка. Тези роботизирани оръжия често могат да бъдат намерени в индустриите на поточната линия, извършващи интензивна механична работа като заваряване, пробиване, боядисване и др. Наскоро усъвършенстваните роботизирани рамена с висока точност също се разработват за извършване на сложни хирургични операции. Така че в този урок нека изградим просто роботизирано рамо с помощта на микроконтролер ARM7-LPC2148 за бране и поставяне на обект чрез ръчно управление на няколко потенциометра.
В този урок ще използваме 3D отпечатана роботизирана ARM, която е създадена, следвайки процедурата в thingiverse. ARM използва 4 серво мотора за роботизирано ARM движение. Ако нямате принтер, можете също да изградите ръката си с прости картони, както ние създадохме за нашия проект за Arduino Robotic Arm. За вдъхновение можете да се обърнете и към Record and Play Robotic Arm, който създадохме по-рано с помощта на Arduino.
И така, нека сега подготвим нещата за нашия проект
Необходими компоненти
- 3D принтер Robotic ARM
- ARM7-LPC2148
- Серво мотор SG-90 (4)
- 10k потенциометър (4)
- Бутон (4)
- LED (4)
- 5V (1A) DC захранващ адаптер
- Резистори (10k (4), 2.2k (4))
- Макет
- Свързване на проводници
Подготовка за 3D отпечатаната роботизирана ARM
3D отпечатаната роботизирана ръка, използвана в този урок, е направена, следвайки дизайна, даден от EEZYbotARM, който се предлага в Thingiverse. Пълната процедура за изработване на 3D отпечатано роботизирано рамо и детайлът за сглобяване с видео са представени във връзката thingiverse, която е споделена по-горе.
Това е изображението на моята 3D отпечатана роботизирана ръка след сглобяване с 4 серво мотора.
Електрическа схема
Следващото изображение показва верижните връзки на базирана на ARM роботизирана ръка.
Връзките на веригата за проекта са прости. Уверете се, че захранвате сервомоторите с отделен 5V DC захранващ адаптер. За потенциометри и бутони можем да използваме 3.3V, налични от микроконтролера LPC2148.
Тук използваме 4 ADC щифта на LPC2148 с 4 потенциометра. И също така 4 ШИМ щифта LPC2148, свързани с ШИМ щифтовете на серво мотора. Също така сме свързали 4 бутона, за да изберете кой двигател да работи. И така, след натискане на бутона зачитаният потенциометър се променя, за да се промени позицията на серво мотора.
Бутоните в единия край, който е свързан с GPIO на LPC2148, се спускат чрез резистор от 10k, а друг край е свързан с 3.3V. Също така 4 светодиода са свързани, за да покажат кой серво мотор е избран за промяна на позицията.
Верижни връзки между 4 сервомотора и LPC2148:
LPC2148 | Серво мотор |
P0.1 | SERVO1 (ШИМ-оранжев) |
P0.7 | SERVO2 (ШИМ-оранжев) |
P0.8 | SERVO3 (ШИМ-оранжев) |
P0.21 | SERVO4 (ШИМ-оранжев) |
Връзки на веригата между 4 потенциометъра и LPC2148:
LPC2148 | Потенциометър Централен щифт ляв щифт - 0V GND на LPC2148 Десен щифт - 3.3V на LPC2148 |
P0.25 | Потенциометър |
P0.28 | Потенциометър2 |
P0.29 | Потенциометър 3 |
P0.30 | Потенциометър4 |
Свързващи вериги на 4 светодиода с LPC2148:
LPC2148 | LED анод (катодът на всички LED е GND) |
Р1.28 | LED1 (анод) |
Р1.29 | LED2 (анод) |
P1.30 | LED3 (анод) |
Р1.31 | LED4 (анод) |
Свързващи вериги на 4 бутона с LPC2148:
LPC2148 | Бутон (с падащ резистор 10k) |
Р1.17 | Бутон1 |
Р1.18 | Бутон2 |
Р1.19 | Бутон3 |
P1.20 | Бутон4 |
Стъпки, включени в програмирането на LPC2148 за роботизирана ръка
Преди да програмираме за тази роботизирана ръка, трябва да знаем за генерирането на ШИМ в LPC2148 и използването на ADC в ARM7-LPC2148. За това вижте нашите предишни проекти за свързване на серво мотор с LPC2148 и как да използвате ADC в LPC2148.
ADC преобразуване с помощта на LPC2148
Тъй като трябва да предоставим ADC стойности за задаване на стойност на работния цикъл за генериране на ШИМ изход за управление на позицията на серво мотора. Трябва да намерим ADC стойности на потенциометъра. Тъй като разполагаме с четири потенциометра за управление на четири сервомотора, се нуждаем от 4 ADC канала на LPC2148. Тук в този урок използваме ADC щифтове (P0.25, P0.28, P0.29, P0.30) на ADC канали от съответно 4,1,2,3, налични в LPC2148.
Генериране на ШИМ сигнали за сервомотор с помощта на LPC2148
Тъй като трябва да генерираме ШИМ сигнали за управление на позицията на серво мотора. Трябва да зададем работния цикъл на ШИМ. Имаме четири серво мотора, свързани към роботизираното рамо, така че се нуждаем от 4 ШИМ канала на LPC2148. Тук в този урок използваме PWM щифтове (P0.1, P0.7, P0.8, P0.21) на ШИМ канали от съответно 3,2,4,5, налични в LPC2148.
Програмиране и мигане на шестнадесетичен файл към LPC2148
За да програмираме ARM7-LPC2148, се нуждаем от keil uVision и е необходим флаш код HEX към LPC2148 Flash Magic инструмент. Тук се използва USB кабел за програмиране на ARM7 Stick чрез микро USB порт. Пишем код с помощта на Keil и създаваме шестнадесетичен файл и след това HEX файлът се мига на ARM7 стик с помощта на Flash Magic. За да научите повече за инсталирането на keil uVision и Flash Magic и как да ги използвате, следвайте връзката Първи стъпки с ARM7 LPC2148 Microcontroller и го програмирайте с Keil uVision.
Обяснение на кодирането
Пълната програма за този проект за роботизирана ръка е дадена в края на урока. Сега нека видим подробно програмирането.
Конфигуриране на PORT на LPC2148 за използване на GPIO, PWM и ADC:
Използване на регистъра PINSEL1 за активиране на ADC канали - ADC0.4, ADC0.1, ADC0.2, ADC0.3 за щифтовете P0.25, P0.28, P0.29, P0.30. И също така, за PWM5 за щифта P0.21 (1 << 10).
#define AD04 (1 << 18) // Изберете функция AD0.4 за P0.25 #define AD01 (1 << 24) // Изберете функция AD0.1 за P0.28 #define AD02 (1 << 26) / / Изберете функция AD0.2 за P0.29 # дефинирайте AD03 (1 << 28) // Изберете функция AD0.3 за P0.30 PINSEL1 - = AD04 - AD01 - AD02 - AD03 - (1 << 10);
Използване на регистъра PINSEL0 за активиране на PWM каналите PWM3, PWM2, PWM4 за щифтове P0.1, P0.7, P0.8 от LPC2148.
PINSEL0 = 0x000A800A;
Използване на регистъра PINSEL2, за да активирате функцията GPIO pin за всички изводи в PORT1, използвани за свързване на LED и бутон.
PINSEL2 = 0x00000000;
За да се направят светодиодните щифтове като изходни и бутоните като входни, се използва регистърът IODIR1. (0 за INPUT и 1 за OUTPUT)
IODIR1 = ((0 << 17) - (0 << 18) - (0 << 19) - (0 << 20) - (1 << 28) - (1 << 29) - (1 << 30) - (1 << 31));
Докато номерата на пиновете се определят като
#define SwitchPinNumber1 17 // (Свързан с P1.17) #define SwitchPinNumber2 18 // (Свързан с P1.18) #define SwitchPinNumber3 19 // (Свързан с P1.19) #define SwitchPinNumber4 20 // (Свързан с P1. 20) #define LedPinNumber1 28 // (Свързан с P1.28) #define LedPinNumber2 29 // (Свързан с P1.29) #define LedPinNumber3 30 // (Свързан с P1.30) #define LedPinNumber4 31 // (Свързан с P1.31)
Конфигуриране на настройката за преобразуване на ADC
След това се настройва режимът на преобразуване ADC и часовникът за ADC, като се използва регистърът AD0CR_setup.
неподписан дълъг AD0CR_setup = (CLKDIV << 8) - BURST_MODE_OFF - PowerUP; // Настройка на ADC режим
Докато CLCKDIV, Burst Mode и PowerUP се определят като
#define CLKDIV (15-1) #define BURST_MODE_OFF (0 << 16) // 1 за включване и 0 за изключване #define PowerUP (1 << 21)
Настройка на часовника за ADC преобразуване (CLKDIV)
Това се използва за производство на часовника за ADC. 4Mhz ADC часовник (ADC_CLOCK = PCLK / CLKDIV), където всъщност се използва "CLKDIV-1", в нашия случай PCLK = 60mhz
Burst Mode (Bit-16): Този бит се използва за BURST преобразуване. Ако този бит е зададен, ADC модулът ще извърши преобразуването за всички канали, които са избрани (SET) в SEL бита. Задаването на 0 в този бит ще деактивира преобразуването BURST.
Режим за изключване (Bit-21): Използва се за включване или изключване на ADC. Настройката (1) в този бит извежда ADC от режим на изключване и го прави работещ. Изчистването на този бит ще изключи ADC.
Конфигуриране на настройката за преобразуване на ШИМ
Първо нулирайте и деактивирайте брояча за PWM, като използвате PWMTCR регистър и настройте PWM Timer Prescale Register със стойност за предварително скалиране.
PWMTCR = 0x02; PWMPR = 0x1D;
След това задайте максималния брой отброявания в един цикъл. Това се прави в Регистър на мачове 0 (PWMMR0). Тъй като имаме 20000, това е PWM вълна от 20msecs
PWMMR0 = 20000;
След това задаваме стойността за работен цикъл в регистрите на съвпадението, използваме PWMMR4, PWMMR2, PWMMR3, PWMMR5. Тук задаваме начални стойности от 0 msec (Toff)
ШИММР4 = 0; ШИММР2 = 0; ШИММР3 = 0; ШИММР5 = 0;
След това настройте PWM Match Control Register да предизвиква нулиране на брояча, когато регистърът на съвпаденията настъпи.
PWMMCR = 0x00000002; // Нулиране при съвпадение на MR0
След това ключалката за разрешаване на PWM разрешава, за да позволи използването на стойност на съвпадение (PWMLER)
PWMLER = 0x7C; // Активиране на заключване за PWM2, PWM4, PWM4 и PWM5
Нулирайте брояча на таймера, като използвате малко в регистъра за управление на таймера PWM (PWMTCR) и също така активира PWM.
PWMTCR = 0x09; // Активиране на PWM и брояч
След това активирайте PWM изходите и задайте PWM в режим с единичен ръб в контролен регистър на PWM (PWMPCR).
PWMPCR = 0x7C00; // Активиране на PWM2, PWM4, PWM4 и PWM5, PWM с контролирано управление
Избиране на сервомотора за завъртане с помощта на бутони
Имаме четири бутона, които се използват за завъртане на четири различни серво мотора. Чрез избор на един бутон и промяна на съответния потенциометър, ADC стойността задава работния цикъл и съответният серво мотор променя своето положение. За да получите състоянието на превключвателя с бутон
switchStatus1 = (IOPIN1 >> SwitchPinNumber1) & 0x01;
Така че, в зависимост от това коя стойност на превключвателя е ВИСОКА, се извършва преобразуването на ADC и след успешното преобразуване на стойността на ADC (от 0 до 1023), тя се картографира по отношение на (от 0 до 2045) и след това стойността на работния цикъл се записва в (PWMMRx) PWM щифт, свързан към серво мотор. И също така, светодиодът се превръща ВИСОКО, за да покаже кой ключ е натиснат. По-долу е даден пример за първия бутон
ако (switchStatus1 == 1) { IOPIN1 = (1 <
Работа на роботизирана ръка
След като качите код в LPC2148, натиснете който и да е превключвател и променяйте съответния потенциометър, за да промените позицията на роботизираното рамо.
Всеки превключвател и потенциометър контролират всяко движение на сервомотора, което е основно движение наляво или надясно, движение нагоре или надолу, напред или назад и след това грайфера за задържане и освобождаване на движението. Пълният код с подробно работещо видео е даден по-долу.