Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Lokale en op afstand programmeerbare robotarm

Componenten en benodigdheden

Arduino Mega 2560
× 1
SainSmart DIY 3-Axis Control Palletizing Robotarm Model voor Arduino UNO MEGA2560
× 1
MeArm DIY Robotarm Kit
× 1
Adafruit RGB-achtergrondverlichting LCD - 16x2
× 1
Android-apparaat
× 1
Draaipotentiometer (generiek)
10Kohm
× 4
SparkFun Drukknopschakelaar 12 mm
× 3
LED (generiek)
ROOD, BLAUW, GROEN, GEEL
× 4

Apps en online services

Arduino IDE
MIT App Inventor 2

Over dit project

Het doel van deze tutorial is om stap voor stap een project te ontwikkelen voor het besturen en programmeren van een robotarm, waarbij de basisfuncties van een industriële robot worden gesimuleerd.

Stap 1:Specificaties

De robot heeft twee basisfuncties:

  • Programma :Registreer armposities in drie dimensies (elk record is een "stap")
  • Uitvoeren :Voer achtereenvolgens de posities uit die zijn vastgelegd in het "Programma". De robot zal het programma uitvoeren totdat het commando "ABORT" wordt gebruikt.

Belangrijkste kenmerken:

  • Het project kan worden gebruikt om robots te besturen met 3 of 4 DOF ("Degrees of Freedom").
  • De robot kan worden bestuurd in de modi "LOCAL" en "REMOTE" (de laatste via een Android-apparaat)
  • Tijdens de programmafase kan de gebruiker de bedieningsmodus wijzigen van "LOKAAL" naar "AFSTAND" en vice versa.
  • De gebruiker krijgt informatie via gekleurde LED's, een 2-regelig LED-display en geluid (een zoemer).
  • Het geluidsalarm kan ook op afstand worden geactiveerd.

Stap 2:​Het project

Het blokdiagram in de vorige stap toont de "Bill of Material" die in dit project zal worden gebruikt.

Ik koos voor de Arduino MEGA om me geen zorgen te maken over het aantal beschikbare Arduino-poorten (I/O's). De UNO zou bijvoorbeeld zonder problemen werken, maar er moet een poortuitbreidingsmethode worden gebruikt. Er zijn meerdere opties die makkelijk te vinden zijn op internet, zoals bijvoorbeeld een 74138 decoder.

Hier wordt het eerste prototype in "lokale modus" geprogrammeerd.

Voor het Bluetooth-netwerk wordt de HC-06 gebruikt.

De Android-app die wordt gebruikt voor "externe modus ", is ontwikkeld met behulp van de tool MIT Appinventor2, een krachtig enkelvoudig platform voor dit soort app op basis van Android-apparaten. De app kan gratis worden gedownload in de Google Store:MJRoBot Arduino Robot Arm Control.

De onderstaande video kan u een idee geven van wat het uiteindelijke project met programmeren op afstand zou moeten zijn:

Stap 3:Projectontwikkeling

Robotarmen kunnen worden geclassificeerd op basis van het aantal "gewrichten" of "Degrees Of Freedom" (DOF) dat ze hebben.

  • De "Basis ", of "Taille ", kan de arm meestal 180o of 360o draaien, afhankelijk van het gebruikte servotype (hier in dit project werd een 180o servo gebruikt).
  • De "Schouder ", is de verantwoordelijke voor het "verticaal omhoog of omlaag brengen" van de arm.
  • De "elleboog " zorgt ervoor dat de arm "vooruit of achteruit" gaat.
  • De "klauw " of "Grijper " werkt door te openen of te sluiten om "dingen te pakken".

Stap 4:​Het circuit

Servomotoren zullen worden gebruikt om de gewrichten aan te drijven, rechtstreeks verbonden met de Arduino. Merk op dat dit niet ongebruikelijk is, zie "Stappenmotoren" die aan de basis worden gebruikt voor meer koppel en precisie. De juiste keuze van servo's is erg belangrijk (er zijn goedkope Chinese servo's die erg slecht zijn gebouwd, zoals MG995, die helaas zijn meegeleverd met mijn SanSmart 3DOF AARM). Maar voor het voorstel van dit project werkte het prima.

De gelijkstroom voor de servo's moet worden gescheiden van de Arduino en andere componenten. Een externe voeding van 5 of 6V zou zonder problemen moeten werken (controleer de DataSheet van uw servors om het juiste spanningsbereik te controleren). Een gebruikelijke praktijk is ook het gebruik van 470uF-condensatoren tussen VCC en GND om de ruis die wordt gegenereerd door de DC-motoren in de servors te minimaliseren. Zorg ervoor dat u alle "aarde" aansluit (externe stroombron met de Arduino GND-pin).

Als de servo's problemen hebben en veel trillen, pas dan de "vertragingen" van je code aan. Het is belangrijk dat de servo's de tijd hebben om op een bepaald punt te komen voordat ze een nieuw commando ontvangen. Ook de moeite waard om te controleren of de servo's digitaal of analoog zijn, alsof ze mechanisch vergelijkbaar zijn, de digitale werkt met een frequentie van 300 Hz, terwijl de analoge 50 Hz. De standaard Arduino-bibliotheek "Servo.h " is ontwikkeld voor analoge servo's en kan indien nodig worden aangepast voor een betere werking met digitale servo's.

De bovenstaande tekening toont het volledige circuit.

Stap 5:​De code

Het project is niet ingewikkeld, maar heeft veel variabelen. Het meest voorzichtig is om ze duidelijk te definiëren en de opmerkingen op een uniek bestand achter te laten:

ArmDefine.h

Dit bestand moet ook de minimale, maximale en initiële servo's hoeken instellen. De code in deze tutorial heeft twee sets parameters voor de robotarmen die ik in mijn project heb getest (uiteraard mag alleen een groep constanten worden gebruikt):

// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87#define midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 #define midGrip 100#define midBase 90#define midShou 90#define midElbw 0 */ 

Elk type arm heeft een andere set parameters en het is belangrijk dat u de juiste voor de uwe vindt. Wat ik voorstel is dat in eerste instantie de potentiometers (potten) in het midden blijven en dat de mapping van de PWM-uitgangen wordt ingesteld op de standaardwaarden:Max =255 , Min =0 en Mid =126 ( "#defines " hierboven). Begin dan met het variëren van de potten (één voor één) en volg in de seriële monitor (of LCD) wat de minimum- en maximumwaarden moeten zijn waar de arm goed werkt. Dat zijn de uiteindelijke waarden die worden gebruikt voor de instellingen (wijzig mijn oorspronkelijke waarden op ArmDefine.h) .

Voor het "vastleggen" van de reeksen coördinaten (of stappen) die de robot moet spelen, zal ik gegevensarrays gebruiken:

int gripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // Index die moet worden gebruikt op positie-array die wordt gebruikt voor opgenomen taken 

Merk op dat ik de "opgeslagen" positie niet behoud en dat aan het einde van het "robot"-programma de index weer op nul staat en de robot wacht op de opname van een nieuwe reeks (het programma is verloren). Als alternatief kunt u deze gegevensarrays bijvoorbeeld in de Arduino EEPROM bewaren. Als u dat doet, wordt het programma opnieuw uitgevoerd of u kunt zelfs meer dan één opgeslagen programma hebben.

Stap 6:​De programmalogica

Het hoofdblok ("Loop") is eigenlijk vrij eenvoudig:

Controleer of er een commando is gebruikt om het "programma" (volgorde van stappen) uit te voeren.

  • Zo ja, voer het uit.
  • Anders is het "programma" niet compleet en moet het nog nieuwe stappen schrijven.
  • Als een "nieuwe positie" is gedefinieerd, voeg deze dan toe aan het programma.
  • Controleert eerst of er berichten aankomen bij de seriële buffer vanaf het Android-apparaat.
  • Controleer vervolgens of de besturingsmodus "Lokaal" of "Remote" is (de standaardinstelling is Lokaal).
  • Terug naar het begin en voer stap 1 opnieuw uit.
ongeldige lus (){ checkBTcmd (); definieerLocalRemote (); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| HIGH commando =="runon") { RunProgram (); } else recArmPosition (); command ="";} 

De functie checkBTcmd() assembleert een string met behulp van de individuele karakters die uit de BT-module komen. Deze string wordt doorgegeven aan de variabele "commando ".

De functie defineLocalRemote() houdt rekening met de variabele "commando " controleren of een commando om de modus naar afstandsbediening te wijzigen wordt ontvangen of omgekeerd. Het alarmcommando wordt hier ook geanalyseerd. Voor de programmalogica, als het "Alarm" wordt geactiveerd in het Android-apparaat, moet de arm noodzakelijkerwijs naar de afstandsbediening gaan modus.

De functie RunProgram() voert de voorbereidingen uit, schakelt LED's aan / uit, enz. en roept vooral de functie op:ExecuteTask() . De laatste is de functie die de logica van de uitvoering van de reeks stappen bevat. De functie verhoogt de "positionIndex " de positiegegevens één voor één verzenden met behulp van de tool:armPosition(grip, base, shoulder, elleboog) .

Ten slotte is de functie die de servo's echt aanstuurt en de "stappen" schrijft de recArmPosition() . Afhankelijk van het ontvangen van het Android-commando, bepaalt deze functie de positionering van de servo's die via de potten of via de "sliders" van de Android-app kunnen zijn. Bij elke verandering van positie stuurt deze functie de coördinaten naar de servo's met behulp van de armPosition functie (greep, basis, schouder, elleboog). Het lezen van de werkelijke positie van de potten of schuifregelaars en de bijbehorende activering van servo's vindt plaats tegen de tijd dat het commando "SAVE" of "PROGRAM" wordt geactiveerd. Op dat moment wordt de positie-index van de arrays verhoogd en de stap opgeslagen.

Om het begrip te vereenvoudigen, was alle code gebaseerd op zijn specifieke functies. De "Setup ", "Loop " en de hierboven beschreven functies bevinden zich vrijwel allemaal in het bestand:MJRoBot_Arm_Robot_Task_Prgm.ino

De meer algemene functies zoals lees BT-opdracht:void checkBTcmd() ; geluidsgenerator:void beep (int pin, int freq, long ms) en debouncen:boolean debounce (int pin) ; zijn geregistreerd:General_Functions.ino

Een belangrijk feit:aangezien de Arduino instructies uitvoert op basis van een klok van 16Mhz, wordt verwacht dat de bedieningsknoppen honderden of zelfs duizenden keren per seconde worden gelezen, daarom is het belangrijk om een ​​"debouncing"-knop te maken die de opnamestap instelt .

Het vierde en laatste bestand is:Arm_Ctrl_and_Display.ino

In dit bestand staan ​​de uitleesfuncties van de potentiometer:bool readPotenciometers() ; lezen van Android-schuifregelaars:bool readSliders() ; plaatsing van servo's:void armPosition (int gripp, int basee, int schouder, elleboog int) . De andere functies in het bestand zijn voor gegevensweergave op het LCD-scherm, seriële monitor, alarmen, enz.

De video toont de robotarm 4DOF "meArm" die op afstand wordt geprogrammeerd via de Android-app .

De volledige broncode voor het project is te vinden op GITHUB:

https://github.com/Mjrovai/MJRoBot-Programmed-Arm

of hier:

F49C85FIL8CVX0P.ino FC4OQJNIL8CVX1C.h FBYPQAMIL8CVX1D.ino F2SBAXVIL8CVX1E.ino

Stap 7:Conclusie

Zoals altijd hoop ik dat dit project anderen kan helpen hun weg te vinden in de spannende wereld van elektronica, robotica en IoT! Ga voor meer projecten naar mijn blog:MJRoBot.org

Saludos uit het zuiden van de wereld! Tot ziens bij mijn volgende tutorial!

Dank je

Marcelo

Code

  • Codefragment #1
  • Codefragment #2
  • Codefragment #3
Codefragment #1Arduino
// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87# define midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 #define midGrip 100# definieer midBase 90#define midShou 90#define midElbw 0 */
Codefragment #2Arduino
int gripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // Index die moet worden gebruikt op positie-array die wordt gebruikt voor opgenomen taken
Codefragment #3Arduino
ongeldige lus (){ checkBTcmd (); definieerLocalRemote (); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| HIGH commando =="runon") { RunProgram (); } else recArmPosition (); command ="";}
Github
https://github.com/Mjrovai/MJRoBot-Programmed-Armhttps://github.com/Mjrovai/MJRoBot-Programmed-Arm

Schema's

Robotarm
https://github.com/Mjrovai/MJRoBot-Programmed-Arm/blob/master/Arm_Robot_Task_Program_Man_BT_16_fev_16/Arm%20Robot%20Diagram.png

Productieproces

  1. Universele afstandsbediening met Arduino, 1Sheeld en Android
  2. Roboticawapens in productie en hun voordelen
  3. Verschillen tussen robotmanipulator en robotarm
  4. LCD-animatie en gaming
  5. DIY voltmeter met Arduino en smartphone
  6. Ioed gebruiken om een ​​robotarm op afstand te bedienen
  7. Arduino 3D-geprinte robotarm
  8. Nunchuk-gestuurde robotarm (met Arduino)
  9. DIY voltmeter met Arduino en een Nokia 5110-display
  10. Eenvoudige en slimme robotarm met Arduino
  11. Python3- en Arduino-communicatie