Industriële Lijnvolgende Robot voor Materiaaltransport
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerkingen |
|---|---|---|
| SparkFun Arduino Pro Mini 328 - 5V/16MHz | 1 | |
| Custom PCB | 1 | Layout in bijlagen, kan ook zonder PCB gebouwd worden |
| Ultrasone sensor - HC-SR04 | 1 | |
| RFID-module (generiek, MFRC522) | 1 | |
| SparkFun RedBot Sensor - Lijnvolger | 3 | |
| Texas Instruments H-brug Motordriver 1A (L293D compatibel) | 1 | Ik gebruikte L293D |
| Lithium-Ion Batterij - 1000mAh 7.4V | 1 | Moet 7,4V zijn, maar hoeft niet deze specifieke te zijn |
| Hobby Gearmotor - 140 RPM (paar) | 1 | Geen connector voor chassis, maar makkelijk te printen |
| Wiel - 65mm | 1 paar | |
| Jumper-draden (generiek) | 1 set | |
| Wipschakelaar | 1 | |
| RFID-tag (generiek) | 4 | Afhankelijk van hoeveel taken je wilt |
| Buzzer | 1 | |
| Male Header 40 Position 1 Row (0.1") | 1 |
Benodigde tools en machines
- 3D-printer
- Lasersnijder (optioneel, kan ook online besteld worden)
- Solderbout
Apps en online diensten
- Arduino IDE
- Autodesk Fusion 360 (voor 3D-ontwerp)
Over dit project
Heb je je ooit afgevraagd hoe die fancy robots die onderdelen op montagelijnen transporteren werken? Ik zag zulke robots bij de Opel-fabriek hier in Polen, stelde veel vragen en ze lieten me zien hoe het werkt. Ik begreep direct dat dit gewoon een heel geavanceerde lijnvolger is. In plaats van zwart tape is er een magnetische strip, en in plaats van lichtsensoren zijn er magnetische sensoren, plus veel veiligheidsfuncties en andere slimme dingen. Maar op dat moment begon ik te denken: misschin kan ik mijn eigen kleinere, goedkopere, Arduino-gebaseerde en open-source versie bouwen die slim spullen kan transporteren? Klinkt als een grote uitdaging, en dat vind ik leuk!
Ontwerp
Allereerst ontwierp ik het... op papier! Ja, op papier met een potlood in mijn hand :) Waarom op papier ontwerpen als je geweldige CAD-software hebt? Er zijn een paar voordelen die ik van anderen hoorde en zelf bevestigde. Je bent echt vrij, geen beperkingen op papier, geen afleiding, gewoon witruimte en een potlood dat dingen heel makkelijk maakt. Het is ook sneller, je hoeft je geen zorgen te maken over afmetingen en de finale vorm. Als je iets niet leuk vindt dat je getekend hebt, teken je het gewoon opnieuw. En als je al je tekeningen tegelijk ziet, kun je ze combineren en nieuwe ideeën bedenken. Het was heel makkelijk om op papier een algehele vorm te vinden die ik mooi vond en daarna naar CAD te springen om afmetingen toe te voegen. Echt een aanrader voor iedereen! Hier zijn mijn schetsen (de kleurrijke lijntjes aan de rechterkant zijn van mijn neefje).
Natuurlijk zijn mijn tekeningen niet heel mooi, en als je kunt tekenen zou je in 5 minuten iets beters maken, maar ik was vroeger echt slecht in tekenen en het bovenstaande voorbeeld ziet er veelbelovend uit. Daarna maakte ik een CAD-ontwerp op basis van die tekening. Ik wist vanaf het begin dat sommige delen 3D-geprint zouden worden, maar ik wilde het niet 100% 3D-printen en wilde experimenteren en nieuwe dingen proberen. Uiteindelijk besloot ik sommige delen te lasersnijden, maar ik heb er geen en heb nooit voor lasersnijden ontworpen. Ik leerde hoe dat zit en bestelde het online. Als materiaal koos ik 4mm multiplex (je kunt ook plexiglas of iets dergelijks gebruiken). Het voorste deel van de robot is 3D-geprint en houdt alle sensoren, elektronica en batterij. Hier zijn renders van mijn ontwerp die naar mijn mening fantastisch uitzien!
Volgende stap was het bestellen van het lasersnijden van de houten platen. Ik kom uit Polen, dus ik zocht een Pools bedrijf om verzendkosten te besparen. Als je iets in je buurt wilt zoeken, google op "lasersnijden" en de naam van je stad. Onthoud om het bedrijf te vragen of ze de offsets kunnen aanpassen voor die delen zodat de vingerveerpassingen perfect passen (we moeten dat doen vanwege een ding genaamd "kerf", lees er meer over). Gelukkig vond ik een bedrijf dat dat voor me regelde, dankjewel!
Ik was best bang omdat ik nog nooit voor lasersnijden had ontworpen en nog nooit lasersnede onderdelen had gebruikt, maar het werd prachtig :) DXF-bestanden voor lasersnijden zijn in de bijlagen te vinden.
Om het chassis af te maken, moest ik een voordeel op de 3D-printer printen. Dat is het tool die ik heb, dus dat was geen probleem. Als je nog geen 3D-printer hebt, overweeg er een te kopen, ze zijn tegenwoordig goedkoop. Je kunt er misschien een op school of in de bibliotheek vinden, of misschien is een van je vrienden 3D-print-enthousiasteling. STL-bestanden zijn in de bijlagen. Er zijn geen specifieke instellingen voor 3D-printen, ik gebruikte 2 perimeters met 30% infill en 0,2mm laaghogte. Je moet supports gebruiken. Het duurt ongeveer 8 uur, dus wees geduldig.
Als je print klaar is, kun je het opschonen en aan de multiplex-onderdelen schroeven, maar ik besloot er nog meer werk in te steken. Nog iets wat ik nog nooit deed: ik schuurde mijn print en schilderde het, schuurde weer en schilderde weer, gebruikte dan auto-vuller om het oppervlak perfect te maken, nog meer schuren en schilderen. Het kostte veel tijd, maar ik leerde veel, en kijk naar dit glanzende oppervlak! Het is perfect, je kunt niet zien dat het 3D-geprint was! 2 dagen schilderen en schuren,绝对 de moeite waard.
En hier zijn de lasersnede onderdelen en het 3D-geprinte deel klaar voor montage.
Arduino, Sensoren, Motoren, PCB...
Maar dit project is niet alleen over ontwerp. Alles wordt bestuurd door een Arduino Pro Mini die verbonden is met een custom PCB die ik in Fritzing ontwierp (PCB-layout en ontwerpbestanden in bijlagen). Om autonom te werken zonder menselijke input zijn er lijnsensoren en een RFID-module om tags te detecteren die naast de lijn liggen. De H-brug die de goedkope en populaire gearmotoren stuurt is een L293D, klein en makkelijk te gebruiken. Ik besloot ook een buzzer toe te voegen aan de schakeling zodat de robot kan piepen wanneer een bepaalde RFID-tag gedetecteerd wordt. Alles wordt gevoed door een 2-cel LiPo-batterij (7,4V nominaal). Omdat de RFID-module met 3,3V gevoed moet worden, moest ik een spanningsregelaar op de PCB plaatsen die de juiste spanning aan de module levert. Er zit ook een ultrasone sensor voor obstakeldetectie, want veiligheid eerst! Er was één probleem: afstand meten met de HC-SR04 neemt vrij veel tijd in beslag in termen van microcontrollers, dus ik ontwierp een ander project (meer info hier) dat het makkelijk en snel maakt om obstakels met deze sensor te detecteren. Het is niet noodzakelijk, maar maakt dingen zeker een stuk makkelijker.
Om de PCB te bouwen heb je tools en componenten nodig (Arduino, L293D, sommige breakaway headers, batterijconnector, buzzer, 3,3V spanningsregelaar). Je kunt meer lezen over hoe je thuis een PCB maakt en welke tools je nodig hebt.
Aanvankelijk wilde ik mijn PCB op een CNC-freesmachine frezen, maar ik besloot een methode te gebruiken die ik kende: toner transfer. Boven zie je de toner overgebracht op het koperbord. Daarna etste ik mijn PCB en reinigde de toner. Je moet ook gaten boren om THC (Through Hole Components) te plaatsen.
Solderen was ongelooflijk makkelijk voor een DIY-PCB, meestal is het veel moeilijker omdat er geen soldeermasker op zit.
Er zitten 5 jumper-draden op de onderkant van de PCB (in Fritzing's PCB-weergave gelabeld als blauwe kabels), ik hou er niet van jumpers te gebruiken, maar bij complexere schakelingen en eenzijdige PCB's is er gewoon geen manier om ze te vermijden.
Zoals gezegd, om de robot te voeden gebruik ik een 2-cel LiPo-batterij, je kunt elke andere batterij met vergelijkbare spanning gebruiken, je hoeft geen specifieke capaciteit te gebruiken (hoe groter de capaciteit, hoe langer je robot op één lading werkt). Ik soldeerde ook een socket op de PCB zodat ik de batterij er gemakkelijk op kan klikken.
Als alles gesoldeerd is, is het tijd om te testen of het werkt door een batterij aan te sluiten. Arduino LEDs moeten oplichten en er mag geen rook zijn :)
Als alles werkt, kunnen we de laatste solderklus doen met onze PCB: we moeten kabels solderen die we later aan de motoren solderen. Maak ze een beetje langer dan nodig en knip later af, je wilt niet dat ze te kort zijn.
PCB is klaar! Als je geen ervaring hebt met PCB-maken, probeer er eens een, het is niet zo moeilijk. Als je liever met kabels of een protoboard werkt, voel je vrij, maar het kan lastig zijn om dat in het voorste deel van de robot te passen. Met een PCB kan dat prima!
We moeten nog alle sensoren aan de PCB verbinden, maar eerst monteren we het chassis en bevestigen we alle sensoren eraan.
Monteren
Vingerveerpassingen van de lasersnede onderdelen passen perfect, maar om het echt rigide en duurzaam te maken, moeten we lijm gebruiken. Dat is multiplex, dus elke houtlijm doet het. Zorg dat je niet te veel lijm gebruikt en maak lekkages schoon. Het moet een paar uur drogen, dus we kunnen een pauze nemen. Zorg dat alle onderdelen goed zitten, er is geen terugweg meer als de lijm gedroogd is.
Na een paar uur kunnen we doorgaan met het monteren van onze robot. Het is tijd om het 3D-geprinte voordeel aan de multiplex te bevestigen. We gebruiken geen lijm, want tijdens mijn stage bij CIT leerde me: lijm gebruiken is onprofessioneel, vergeet het (maar ik hoop dat het met hout wel kan). We gebruiken schroeven, geplaatst vanaf de onderkant van de robot, zorg dat ze kort zijn (zeg 6mm) zodat ze geen kortsluitingen veroorzaken op de circuits binnenin het 3D-geprinte deel. Het goede aan deze manier van bevestigen is dat je het van bovenaf niet ziet, je moet onder de robot kijken, dat ziet er veel beter uit :) Ik raad je aan om ringetjes te gebruiken om de multiplex te beschermen tegen vervorming.
Zo zou het er tot nu toe uit moeten zien, zo schoon en perfect!
Nu gaan we de motoren en het achterwiel op het chassis monteren. Je hebt enkele M3-schroeven nodig. Ik gebruikte hier ook ringetjes om de multiplex te beschermen.
Het is tijd om terug te gaan naar de sensoren, keer je robot om, pak enkele M3-schroeven en een schroevendraaier.
Montage klaar! Was niet moeilijk, puur plezier. We kunnen de vorm van de robot nu zien met alle sensoren en motoren op hun plek. We zijn heel dichtbij de eindtest, maar voordat we die doen, moeten we alle sensoren aan de PCB verbinden.
Verbinden
Deze stap kan wat tijd kosten, het is niet moeilijk maar best lastig om alle kabels door de kleine ruimte van het 3D-geprinte voordeel te halen. Ik vond dat de beste manier is om kabels aan alle sensoren en modules te verbinden, ze door de gaten in het voordeel te steken, en op het einde aan de PCB te verbinden.
Ik wilde alle elektronica aan de linkerkant van het 3D-geprinte deel plaatsen, maar de batterij bleek iets groter dan geadverteerd, dus ik moest de batterij links en de elektronica rechts plaatsen. Dat was geen groot probleem, alles paste perfect.
Vergeet ook niet de ultrasone sensor op zijn plek te zetten.
Om de robot gemakkelijk in- en uit te schakelen, voegde ik een schakelaar toe op de batterijconnector. Er zit ook een gat in het achterpaneel voor de schakelaar.
Code
Voordat we de achterkant van het voordeel dichtmaken, moeten we de code naar de Arduino Pro Mini uploaden. We moeten de Arduino uit de PCB halen en met een USB-UART-converter aan de computer verbinden. De code voor Arduino is hieronder te vinden. Alles over de code wordt uitgelegd in de commentaren en in de video. Code is ook in de web-editor te vinden.
Er is ook een speciaal programma dat ik in C# schreef om taken voor deze robot te genereren, het heet "Task Planner" (je vindt het .exe-bestand hieronder). Het laat je gemakkelijk taken voor de robot genereren, kopiëren en plakken in de Arduino IDE voordat je naar de Arduino uploadt. Om taken te genereren heb je de ID van de RFID-kaart nodig, die je kunt verkrijgen door een simpel circuit te bouwen (meer info hier).
Bijna klaar...
Nu kunnen we de achterkant van het voordeel dichtmaken met de twee klappen en ze afschroeven. Het kan lastig zijn om alle componenten erin te krijgen, probeer ze te herrangschikken en in andere posities te zetten om de klappen te sluiten.
Om dat af te schroeven kun je enkele korte M3-schroeven gebruiken en je hebt daar geen ringetjes voor nodig. Dat is het laatste wat we hoefden te doen. Onze robot is eindelijk klaar voor de eindtest! Ik heb zoveel tijd aan de bouw besteed, ik ben echt blij dat ik nu kan zien of het werkt zoals ik bedoelde :)
Hier is hoe het eruitziet met alle componenten op hun plek, elektronica verstopt in het voordeel en sensoren gemonteerd op de robot. Het enige nadeel is dat het opladen van de batterij moeilijk kan zijn omdat je de achterklap open moet maken om hem eruit te halen. Een simpele oplossing zou zijn om een gat in het 3D-deel te maken en de balancer-kabel van de batterij door dit gat te steken.
Eindtest!
Ik was niet zeker hoe ik je moest laten zien hoe deze robot werkt, of eigenlijk hoe dat goed moet. Het hoofddoel van dit project is een goedkope open-source robot te bouwen die slim spullen kan transporteren over montagelijnen en fabrieken, dus ik zette een simpele montagelijntje op en vroeg mijn vader en neefje om hulp. Ons doel was om een item in de robot te leggen, het op een ander station uit de robot te halen en het erin te leggen dat al een sticker had, en op het laatste station het item met sticker naar het magazijn te verplaatsen. Een simpele taak die de montagelijntje naboots en je laat testen hoe het werkt.
Ik wilde zwart tape op de vloer plakken, maar dat was niet reflecterend genoeg voor mijn sensoren, dus ik gebruikte karton. En we begonnen met testen, dat zie je in de video (aan het begin van dit project).
Er waren heel veel dingen die mis konden gaan in dit project, maar alles werkte perfect. Het werkt zoals ik bedoelde, elke stap, van het initiële idee door het ontwerp en de montage, verliep soepel en ongelooflijk goed. Toen ik zei dat er veel dingen mis konden gaan, bedoelde ik dat echt. Ik heb veel ervaring met 3D-printen, programmeren en Arduino, maar dit was de eerste keer dat ik mijn project op papier tekende, wat een geweldig idee was en wat ik vaker ga doen. Ik had nog nooit iets voor lasersnijden ontworpen, en ondanks dat ik een C#-programmeercertificaat heb, ben ik er geen meester in. En ik heb al die dingen weten te verbinden om zo'n coole robot te maken :) Ik hoop dat jullie mijn project leuk vonden, zo ja, zeg er dan iets over in de reacties, ik ben echt benieuwd wat jullie ervan vinden. Als je vragen hebt, vraag gerust! Dank voor het lezen.
Happy making!
Code
Industriële Lijnvolger Arduino Code
/* * * C by Nikodem Bartnik * https://NikodemBartnik.pl * https://www.youtube.com/user/nikodembartnik * */
#include <SPI.h>
#include <MFRC522.h>
// Pin definities, als je iets in het schema verandert, moet je de waarden hieronder ook aanpassen
#define LINESENSOR1 6
#define LINESENSOR2 7
#define LINESENSOR3 8
#define BUZZER A0
#define MOTOR1A 2
#define MOTOR1B 3
#define MOTOR2A 4
#define MOTOR2B 5
#define RFID_SDA 10
#define RFID_SCK 13
#define RFID_MOSI 11
#define RFID_MISO 12
#define RFID_RST 9
#define DISTANCESENSOR A1
// Constante waarden
#define STOP_TIME 3000
#define BEEP_LENGTH 200
#define MOTOR_SPEED 110
#define MINIMUM_TIME_BETWEEN_CARDS 2000
MFRC522 mfrc522(10, 9);
long int last_card_read;
// Hier kun je arrays plakken vanuit het programma om plannen voor deze robot te genereren die ik in C# schreef, vind ILFPlanner.exe
#define COMMANDS_LENGTH 4
char* Type[4] = {"Stop", "Beep&stop", "Beep&ignore", "Stop"};
int Value[4] = {3000, 1000, 0, 5000};
char* CardID[4] = {"12 14 B1 2F", "F6 34 F9 25", "ED B9 E0 2B", "83 87 3B 2E"};
void setup() {
// Setup SPI voor RFID-module
SPI.begin();
mfrc522.PCD_Init();
// Setup alle pinnen die we nodig hebben
pinMode(LINESENSOR1, INPUT);
pinMode(LINESENSOR2, INPUT);
pinMode(LINESENSOR3, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(MOTOR1A, OUTPUT);
pinMode(MOTOR1B, OUTPUT);
pinMode(MOTOR2A, OUTPUT);
pinMode(MOTOR2B, OUTPUT);
pinMode(DISTANCESENSOR, INPUT);
}
void loop() {
// Dit deel realiseert de lijnvolgefunctie
if(digitalRead(LINESENSOR1) == LOW && digitalRead(LINESENSOR2) == HIGH && digitalRead(LINESENSOR3) == LOW){
Forward();
}else if(digitalRead(LINESENSOR1) == HIGH && digitalRead(LINESENSOR2) == LOW && digitalRead(LINESENSOR3) == LOW){
Left();
delay(20);
}else if(digitalRead(LINESENSOR1) == LOW && digitalRead(LINESENSOR2) == LOW && digitalRead(LINESENSOR3) == HIGH){
Right();
delay(20);
}
// Als de laatste kaart meer dan MINIMUM_TIME_BETWEEN_CARDS geleden gedetecteerd is, kunnen we checken of er een nieuwe is
if(millis() - last_card_read >= MINIMUM_TIME_BETWEEN_CARDS){
// Wachten op kaart, wanneer hij dichtbij de sensor is
if ( ! mfrc522.PICC_IsNewCardPresent()){
return;
}
// We kunnen de waarde lezen
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
// Kaartwaarde verwerken om leesbaar te maken
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
content = content.substring(1);
// Door alle CardIDs in de array gaan en checken of het matcht met de gescande
for(int a = 0; a < COMMANDS_LENGTH; a++){
last_card_read = millis();
// Als we een match hebben, doen we wat aan deze kaart toegewezen is, bijv. stoppen en piepen
if(content == CardID[a]){
if(Type[a] == "Stop"){
Stop();
delay(Value[a]);
}else if(Type[a] == "Beep&stop"){
digitalWrite(BUZZER, HIGH);
Stop();
delay(Value[a]);
digitalWrite(BUZZER, LOW);
}else if(Type[a] == "Beep&ignore"){
Stop();
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
}else if(Type[a] == "Ignore"){
}
}
}
}
}
// Motor aan voor vooruit
void Forward(){
digitalWrite(MOTOR1A, HIGH);
analogWrite(MOTOR1B, 255 - MOTOR_SPEED);
digitalWrite(MOTOR2A, HIGH);
analogWrite(MOTOR2B, 255 - MOTOR_SPEED);
}
// Motor aan voor achteruit
void Backward(){
digitalWrite(MOTOR1A, LOW);
analogWrite(MOTOR1B, MOTOR_SPEED);
digitalWrite(MOTOR2A, LOW);
analogWrite(MOTOR2B, MOTOR_SPEED);
}
// Motor aan voor linksaf
void Left(){
digitalWrite(MOTOR1A, LOW);
analogWrite(MOTOR1B, MOTOR_SPEED);
digitalWrite(MOTOR2A, HIGH);
analogWrite(MOTOR2B, 255 - MOTOR_SPEED);
}
// Motor aan voor rechtsaf
void Right(){
digitalWrite(MOTOR1A, HIGH);
analogWrite(MOTOR1B, 255 - MOTOR_SPEED);
digitalWrite(MOTOR2A, LOW);
analogWrite(MOTOR2B, MOTOR_SPEED);
}
// Motor stoppen
void Stop(){
digitalWrite(MOTOR1A, LOW);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A, LOW);
digitalWrite(MOTOR2B, LOW);
}
Task Planner (C#)
ZIP met mijn C#-programma om taken voor de robot te genereren, .exe bestand hieronder.
Task planner.exe (C#)
Je kunt het gewoon op je Windows-machine draaien, zonder installatie.
Aangepaste onderdelen en behuizingen
- Voordeel voor het chassis dat alle sensoren en elektronica houdt. Geprint met wit PLA, daarna afgeschuurd en meerdere keren geschilderd om het glanzend te maken. Duurt ~8 uur om te printen, supports vereist.
- Linker afdekkap voor voordeel
- Rechter afdekkap voor voordeel
- DXF-bestanden voor lasersnijden in 4mm materiaal (multiplex, plexiglas): achterplaat, bodemplaat, linkerkant, rechterkant
- Fusion360-bestand voor eventuele aanpassingen
Schema's
- Fritzing-bestand voor aanpassingen
- Schema met alle verbindingen
- PDF-bestand voor PCB-productie (eenzijdig, geen top-laag)
Productieproces
- De Juiste Metaal Kezen voor CNC-bewerking: Sterkte, Duurzaamheid & Kosten
- Premium zandgietoplossingen voor industriële toepassingen
- De juiste industriële ventilator kiezen: Axiaal vs Centrifugaal voor ventilatiesystemen
- Optimale Materialen voor Precisie CNC-gedraaide Onderdelen
- Onderhoudsculturen in de industrie: typen, voordelen en best practices
- Ruimtevaart Revolusioneren met Next-Generation 3D-Print Materialen
- De 10 Sterkste 3D-printmaterialen voor Ultieme Duurzaamheid
- Invar 36 Componenten: Materialen, Eigenschappen en Betrouwbare Inkoop
- 6 Essentiële Tips Om Industriële Kraan Prestaties En Levensduur Te Maximeren
- Industriële materialen begrijpen: typen, toepassingen en voordelen
- Hoe de juiste industriële compressor te kiezen: expert tips