Arduino robotkar

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.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License