Kategória: Arduino.
Egész jó áron lehet venni robotkart, melynek segítségével apró tárgyakat nem túl nagy pontossággal át lehet helyezni egyik helyről a másikra. Az írás pillanatában az SKU 714931 típust összeszereletlenül 20$ alatt be lehetett szerezni. A csavarokon és műanyag alkatrészeken túl 4 szervó motor biztosítja a következő 4 szabadsági fokot:
- forgás a saját tengely körül
- előre-hátra mozgás
- fel-le mozgás
- összeszorítás - elengedés
Az olcsóbb árfekvésben persze nem számítsunk atombiztos pontosságra; pl. az előre-hátra és a fel-le mozgást együtt célszerű érteni. Az összeszerelési instrukció általában elnagyolt, bár végül is az alapján össze lehet szerelni. Néhány dologra azonban érdemes ügyelni, amibe - segítség híján - belefutottam:
- A szervó motorok intervalluma korlátos: kézzel kb. háromnegyed kört lehet csak megtenni, programozva viszont inkább csak felet. Beszerelés előtt állítsuk úgy be, hogy mindkét irányba maradjon játéktér. Beszerelés előtt célszerű az alábbi programmal középre állítani:
#include <Servo.h> Servo servo; void setup() { servo.attach(9); } void loop() { servo.write(90); }
- Nézzük meg, hogy mozgás során mely alkatrészek maradnak fixen, és hogyan mozdul el a rendszer. Ez utóbbiakat hagyjuk lazán, különben a szervó nem képes elmozdítani, és azt gondolhatjuk, hogy hibás.
- Az utolsó rácsavarozások elég nehézkesek. Mielőtt rácsavarozzuk, győződjünk meg arról, hogy a szervó játéktere megfelelő. Fokról célszerű millire áttérni. Az alábbi program segíthet kalibrálni:
#include <Servo.h> Servo servo; long lowerLimit = 600; long upperLimit = 2350; void setup() { servo.attach(9); } void loop() { for (int i = lowerLimit; i <= upperLimit; i++) { servo.writeMicroseconds(i); delay(1); } for (int i = upperLimit; i >= lowerLimit; i--) { servo.writeMicroseconds(i); delay(1); } }
- Bekötés után is egyesével kalibráljuk mindegyiket oly módon, hogy a határait el tudja érni, de ne legyen olyan intervallum, amelyen nem csinál semmit. Pl. nekem a fogót sikerült először úgy bekötnöm, hogy nem tudtam összecsukni, ugyanakkor a nyitásnál maradt egy nagy felesleges sáv.
- Ez a finomhangolás akár többszöri szétszedést - összecsavarozást, az alsó-felső limitek módosítását kívánja. Szóval türelmesnek kell lennünk.
A bekötéshez az alábbiakat célszerű beszerezni (ill. a lenti programhoz pontosabban fogalmazva: be kell szereznünk):
- Arduino UNO, vagy más, hasonló Arduino termék. (A többivel nem próbáltam, kisebb eltérések lehetnek).
- Bővítőlap: az alap panelen sajnos kevés a táp és a GND, emiatt érdemes használni. Persze nem kötelező; ez utóbbi esetben több kábelre és nagyobb próbapanelre lesz szükség.
- Próbapanel: egy egészen kicsi is megteszi.
- 4 potenciométer: amúgy filléres tétel; érdemes tartalékolni.
- Kábelek: én 6 darab apa-apa és 6 darab anya-anya kábelt használtam fel.
Bekötés: feltételezem, hogy az olvasó be tudja kötni a szervó motort és a potenciométert; arról az Arduino bemenetek és Arduino kimenetek oldalakon olvashatunk. Én az alábbi bekötést alkalmaztam:
- Servo 1 - pin 8; pot 1 - A1: körbe forgó
- Servo 2 - pin 9; pot 2 - A2: előre-hátra mozgó
- Servo 3 - pin 10; pot 3 - A3: fel-le emelő
- Servo 4 - pin 11; pot 4 - A4: fogó
Plusz mindegyik alkatrészt tápra és földre is rá kell kötni, így összesen 8 alkatrész lesz 5V-on, 8 földön.
Az alábbi programot én készítettem a működtetéshez:
#include <Servo.h> struct ServoData { Servo servo; int potPin; long lowerLimit; long upperLimit; }; ServoData servoData[4]; void setup() { servoData[0].servo.attach(8); servoData[1].servo.attach(9); servoData[2].servo.attach(10); servoData[3].servo.attach(11); servoData[0].potPin = A1; servoData[1].potPin = A2; servoData[2].potPin = A3; servoData[3].potPin = A4; servoData[0].lowerLimit = 600; servoData[0].upperLimit = 2350; servoData[1].lowerLimit = 1100; servoData[1].upperLimit = 1900; servoData[2].lowerLimit = 900; servoData[2].upperLimit = 2200; servoData[3].lowerLimit = 600; servoData[3].upperLimit = 1200; } void loop() { for (int i = 0; i < 4; i++) { servoData[i].servo.write(servoData[i].lowerLimit + (1024 - analogRead(servoData[i].potPin)) * (servoData[i].upperLimit - servoData[i].lowerLimit) / 1024); } }
A pin értékeket, és különösen a kalibrálási határokat, mindenkinek magának kell beállítania. Azt tapasztaltam, hogy üresben kb. 550-től kb. 2400-ig lehetett mozgatni a kart; ez gyártófüggő, és ki kell próbálni. Alapból az 1000-2000 intervallumból célszerű indulni.