This is an old revision of the document!


 

Projekt 6 Servomootor UH anduriga

Ühendada Arduino plaadiga vajalikud andurid:

  • Servomootor - D3
  • Potentsiomeeter - A1
  • Ultraheli andur - trigger A3, echo A4

Näide #6.1 Servomootor ja PWM signaal

Servomootori juhtimine toimib ainult PWM signaaliga. Üldjuhul on servomootori liikumisvabadus piiratud 180 kraadi peale, kuid esineb ka püsivalt pöörlevaid (360 kraadi) servosid. Tavapärase servo puhul juhitakse PWM töötsükliga servo hoova positsiooni (nt. 0-180 kraadi). Püsivalt pöörleva servo puhul juhitakse pöörlemise kiirust. Antud näiteprogrammis kasutame mikro-servomootorit, mille liikumisvabadus on 180 kraad.
Programmi töö kujutab endast servomootori juhtimiseks vajalike seadistuste tegemist ja seejärel potentsiomeetri asendi järgi selle hoova liigutamist. Arduino analoogsisendi väärtused on vahemikus 0-1023 aga servo juhtimise funktsioon nõuab väärtusi vahemikus 0-180. Üks võimalus on analoogsisendi tulemus jagada läbi sobiva arvuga, et saada maksimaalne tulemus 180. Praktilisem lahendus on kasutada Arduino funktsiooni map(muutuja, muutuja miinimum, muutuja maksimum, uus miinimum, uus maksimum). Antud funktsioon võtab sisendiks esialgsed miinimum ja maksimum väärtused ning konverteerib selle muutumispiirkonna kasutaja poolt määratud muutumispiirkonnaks. Antud juhul 0-1023 teisendame vahemikuks 0-180.
Arduino map funktsiooni kohta saab lisaks lugeda siit: https://www.arduino.cc/en/Reference/Map

/*
Nimetus: Näide #6.1 Servomootor
Kirjeldus: Servomootori juhtimine PWM signaaliga 
*/
 
// Vajalike teekide kaasamine
#include <Servo.h> 
 
// Servo objekti tekitamine nimega mootor
Servo mootor; 
 
// Seadmete ühendusviikude määramine
const int pote = A1; 
const int servo = 3;
 
void setup()
{
  // Servo objekti sidumine kindla viiguga
  mootor.attach(servo);
}
void loop()
{
 /* Muutuja tekitamine ja map funktsiooni kasutamine,
    et väärtused sobivasse vahemikku teisendada */
  int servoAsend = map(analogRead(pote),0,1023,0,180);
 
 /* Servomootorile positsiooni andmine vahemikus 0-180
    (üldiselt vastab väärtus mootori pöördenurga kraadidele) */
  mootor.write(servoAsend);
}

Näide #6.2 Servomootor ja kaugusandur

Järgnevas näites paneme kokku kaugusanduri mõõtmise ja servo liigutamise. Tulemuseks on algeline radar, mis tuvastab iga 10 kraadise liikumise järel ees oleva objekti kauguse. Mõõtetulemused saadame välja jadapordi monitorile.
Mõõtmiste sooritamisel tuleb jälgida, et mootor ei liiguks samal ajal, kuna siis ei saa õiget tulemust. Servomootor on üsna aeglane ja pärast liigutamise käsu andmist tuleb kasutada viidet, et mootor jõuaks saavutada ette antud positsiooni enne uue mõõtmise alustamist.

 

/*
Nimetus: Näide #6.2 Servomootor
Kirjeldus: Servomootor ja kaugusandur
*/
 
// Kõikide vajalike teekide lisamine
#include <Servo.h>
#include <NewPing.h>
 
// Servo ühendusviikude ja ultrahelianduri määramine
#define MOOTOR 3 
#define TRIG A3
#define ECHO A4
 
// Servo objekti tekitamine nimega sensM
Servo sensM;
 
// Anduri objekti tekitamine nimega sonar 
NewPing sonar(TRIG, ECHO, 200); 
 
void setup() 
{
  // Servo objekti ja ühendusviigu sidumine
  sensM.attach(MOOTOR); 
 
  // Jadaliidese tavakiirusel käivitamine (9600 baudi)
  Serial.begin(9600); 
}
 
void loop() 
{
 
  Serial.print("Kaugus: ");
   // Tsükkel, mis teeb iga 10 kraadise servo liikumise järel kaugusmõõtmise 
  for (int i = 0; i <= 180; i += 10) 
  {
    // Servo hoova positsiooni liigutamine määratud muutujaga i
    sensM.write(i); 
 
   /* Viide, et servo jõuaks saavutada ette antud
      positsiooni enne uue mõõtmise võtmist */
    delay(250); 
 
    // Uue mõõtmise võtmine ja jadapordi kirjutamine
    Serial.print(sonar.ping_cm()); 
    Serial.print(", ");
  }
  // Liiguta servo tagasi algpositsiooni
  sensM.write(0); 
 
  // Viide, et servo jõuaks tagasi algpositsiooni
  delay(1000); 
 
  // Reavahetuse tekitamine jadapordis
  Serial.println(""); 
}

Harjutused

Harjutus 6.1

Modifitseerida näiteprogrammi nii, et servo külge ühendatud lähedusandur üritab olla alati objekti poole suunatud.

Harjutus 6.2

Modifitseerida näiteprogrammi nii, et pärast igat skanneerimistsüklit tagastab programm lähima ja kaugeima objekti kauguse ning nurgad mille juures need leiti. Saadud tulemused saata jadapordi monitorile.

et/arduino/motors/project2.1492419769.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0